我创建了一个派生类型来访问多维数组。对于每个数组,我将数组中的名称与nm相关联。
我的问题在于如何在分配内存后填充数组值。
最初的想法是使用多维数组作为输入。但是,如果我存储两个副本,因为数组可能很大,我可能会遇到内存问题。更好的想法可能是传递一维数组,其中包含沿第一维的数据,以及关于数据应该驻留的第二维和第三维的位置的规范。
如果有人有使用大数据集的经验,我会重视一些关于将数组填充到派生类型的更好方法的建议。
Type :: Multia
Character (Len=65) :: nm(3)
Real, Allocatable :: ma(:,:,:)
Real, Allocatable :: mb(:,:,:)
Real, Allocatable :: mc(:,:,:)
Contains
Procedure :: set
End Type Multia
Subroutine set (m, nm, u, i, j)
Class (Multia), Intent (InOut) :: m
Character (Len=65) :: nm
Real, Intent (In) :: u(:)
Integer, Intent (In) :: i, j
If (nm .e. (m% nm(1))) Then
m% ma(:,i,j) = u
Else If (nm .e. (m% nm(2))) Then
m% mb(:,i,j) = u
Else If (nm .e. (m% nm(3))) Then
m% mc(:,i,j) = u
End If
End Subroutine set
答案 0 :(得分:1)
如果您关心的是数组的重复,例如
m%ma = [...] ! Humongous array
然后Fortran 2003提供了move_alloc
内在函数,它将分配(包括值)从一个变量移动到另一个变量。
Subroutine set (m, u, v, w)
Class (Multia), Intent (InOut) :: m
Real, Intent (InOut), allocatable, dimension(:,:,:) :: u, v, w
call move_alloc(u, m%ma)
call move_alloc(v, m%mb)
call move_alloc(w, m%mc)
End Subroutine set
称之为
type(Multia) m
real, dimension(:,:,:), allocatable :: u, v, w
! ... allocating and setting u, v, w
call m%set(u, v, w)
! Components of m now allocated, u, v, w, not allocated
来自该内在的笔记(在Fortran 2008中):
预计可分配对象的实现通常涉及描述符以定位分配的存储;然后可以通过传送描述符的内容来实现MOVE ALLOC for FROM到TO的描述符并清除FROM的描述符。
也就是说,期望不会复制数据或阵列临时数据。
当然,这假定您不能只分配m
的组件并直接分配到那里。