我有一个大型数组,数组太大,我必须使用“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)
?
答案 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
后来的标准还有指针等级重新映射的附加选项。