2

我有一个大数组,数组太大了,我必须使用“可分配”并在 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)因为它是“可分配的”。E1(M*N,L)由于内存有限,我不喜欢定义或分配另一个数组。

有没有人有一些方法来实现:Equivalence(E0,E1)

4

1 回答 1

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

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

于 2012-09-14T00:51:15.157 回答