2012-09-13 31 views
2

我有一个很大的数组,数组非常大,我必须使用“allocatable”并在fortran中进行分配。例如,Fortran 90:可分配数组不能出现在“EQUIVALENCE”中

complex(8),allocatalbe :: E0(:, :, :) 
allocate(E0(1000,1000,1000)) 

我需要在我们的代码到所述阵列的形式变换从E0(1000,1000,1000)E1(1000*1000,1000),即,变换的三维数组E0(M,N,L)成其相应的二维E1(M*N,L)。 但是,由于其“可分配”,我无法使用语句:Equivalence (E0,E1)。 由于内存有限,我不想定义或分配另一个阵列,例如E1(M*N,L)

有没有人有办法实现:Equivalence(E0,E1)

回答

0

将等级三数组传递给具有明确形状或假定大小等于二的虚拟参数的特定过程。实际参数和伪参数之间的序列关联会给你等价的等价关系。

PROGRAM remap 
    IMPLICIT NONE 
    REAL, ALLOCATABLE :: a(:,:,:) 
    INTEGER :: i 
    !**** 
    ALLOCATE(a(2,3,4)) 
    a = RESHAPE((/ (REAL(i), i=1, PRODUCT(SHAPE(a))) /), SHAPE(a)) 
    CALL remapped(a, SIZE(a,1) * SIZE(a,2), SIZE(a,3)) 
CONTAINS 
    SUBROUTINE remapped(b,n,m) 
    INTEGER, INTENT(IN) :: n, m 
    REAL, INTENT(IN) :: b(n,m) 
    !**** 
    ! Should print the first "page" of the actual argument. 
    PRINT "(99(F6.1,:,' '))", b(:,1) 
    END SUBROUTINE remapped 
END PROGRAM remap 

后来标准具有指针排名重新映射的附加选项。

+0

谢谢!你使用内部函数RESHAPE。看起来有点复杂,特别是它需要动态分配两个数组:E(M,N,L)和E(M * N,L)。整数(4),可分配,维数(:,:,:) :: E01 integer(4),allocatable,dimension(:,:) :: E02 分配(E01(M,N,L)) 分配(E02(M * N,L)) !定义E01(M,N,L) E02 =重塑(E01,(/ M * N,L /)) 但是,我希望E01和E02共享相同的内存。即等同性(E01,E02)。它们在计算机内存中完全一样。你有另一种方法吗? – Micheal

+0

重整内在函数仅用于示例代码中以定义(给出值)示例数组“a”。它不用于改变该数组的形状。您可以将该''a = ...''语句更改为您选择的任何其他语句来定义''a''(例如,如果您想要''a = 0'')。具有不同等级的数组是“重映射”过程的“b”伪参数​​。实际参数'a''具有三级,虚拟参数''b''具有二级。两个参数的存储在大多数Fortran处理器上都是相同的。 – IanH