我有一个很大的数组,这个数组太大了,我不得不在fortran中使用"allocatable“和allocatable。例如,
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)
发布于 2012-09-14 08:51:15
将秩3数组传递给具有显式形状或假定大小为秩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更高版本的标准增加了指针等级重新映射的选项。
https://stackoverflow.com/questions/12405863
复制相似问题