填充多维数组

时间:2015-06-14 22:36:35

标签: fortran derived-types

我创建了一个派生类型来访问多维数组。对于每个数组,我将数组中的名称与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

1 个答案:

答案 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的组件并直接分配到那里。