在Fortran例程中,我有3个可分配的1D数组VX(:), VY(:), VZ(:),它们的大小相同。
我需要将它们聚合成一个名为VARXYZ的2D数组,并发送给修改“矩阵”的例程。下面的代码可以工作,但会强制将内存大小加倍。
SUBROUTINE TEST(VX,VY,VZ)
REAL(8), INTENT(INOUT), DIMENSION(:) :: VX,VY,VZ ! They've been allocated with size N in the main
REAL(8), ALLOCATABLE, DIMENSION(:,:) :: VARXYZ ! The 'matrix'
ALLOCATE(VARXYZ(3,N))
VARXYZ(1,:)=VX(:)
VARXYZ(2,:)=VY(:)
VARXYZ(3,:)=VZ(:)
CALL CHANGE_MATRIX(VARXYZ)
VX(:)=VARXYZ(1,:)
VY(:)=VARXYZ(2,:)
VZ(:)=VARXYZ(3,:)
...
为了避免“双重分配”,我的第一种错误想法是使用一维数组和矩阵中的3个“列”之间的等价关系,但显然这是不允许的。
经过一些阅读,我看到有人建议使用指针和TRANSFER内部函数,但我不知道如何在这里使用它们。
请给出一个示例,说明如何模仿我需要的这个等价机制。
change_matrix
的工作方式。你能解释一下那个子程序是做什么的,以及是否可以更改它吗? - francescalustransfer
是一种复制机制,因此如果目标是不使用额外的内存,则无法使用。 - francescalusVARXYZ(1,:)
代替VX(:)
呢?当你实际上有三个1D数组时,很难假装你有一个2D数组,但是当你实际上有一个2D数组时,很容易假装你有三个1D数组。 - veryreverieassociate(VX => VARXYZ(1,:))
来最小化代码更改。 - veryreverie