Fortran 90:可分配数组不能出现在“EQUIVALENCE”中

时间:2012-09-13 12:05:47

标签: fortran90

我有一个大型数组,数组太大,我必须使用“allocatable”并在fortran中分配。例如,

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),因为它的'allocatable'。 由于内存有限,我不喜欢定义或分配另一个数组,例如E1(M*N,L)

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

1 个答案:

答案 0 :(得分:0)

将rank three数组传递给具有显式形状或假定大小为2的伪参数的特定过程。实际参数和伪参数之间的序列关联将为您提供等价的等价物。

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

后来的标准还有指针等级重新映射的附加选项。