使用 SOURCE= 一次分配多个变量

Allocate multiple variables at once with SOURCE=

我现在正在尝试更新我的旧 Fortran 代码,其中包含像 (*)

这样的行
allocate( a(2), b(2) )
a(:) = 0.0
b(:) = 0.0

最初,我将它们更改为

allocate( a(2), source=0.0 )
allocate( b(2), source=0.0 )

但这显然没那么简单。所以我试着把它们结合起来,这样

allocate( a(2), b(2), source=0.0 )    !! (1)

我没想到它会起作用,但它实际上适用于 gfortran >=4.8 和 Sun fortran 8.7(而不适用于 ifort-14)。所以我浏览了 F2003 and F2008 文档的 ALLOCATE 部分,似乎在 "If SOURCE= appears, allocation-list shall contain only one allocate-object" 的 F2008 中取消了限制。这是否意味着上面的第 1 行在 F2008 中没有问题,而不同的行为仅仅是由于 F2008 的支持程度不同?

(*) 在实际代码中,我试图分配派生类型的几个数组组件,allocate( conf% crd(3,N), conf% vel(3,N), conf% frc(3,N), blah, blah,... ) 同时为每个组件分配零。所以我想知道是否可以稍微简化这些行。

在高层,是的,在 Fortran 2008 中删除了 Fortran 2003 中只有一个对象在来源分配中的限制。

现在,谈谈其他事情。首先,您不显示 ab 的声明。在源分配中,要分配的对象必须与源类型兼容。简单案例

real, allocatable, dimension(:) :: a, b
allocate( a(2), b(2) )
a(:) = 0.0
b(:) = 0.0

具有相同的 Fortran 2008 效果
real, allocatable, dimension(:) :: a, b
allocate( a(2), b(2), source=0.0 )

但是

double precision, allocatable, dimension(:) :: a, b
allocate( a(2), b(2), source=0.0 )

?

之前的第二点是:Fortran 2008 是一个相对较新的东西。我不相信所有编译器都能在源分配中正确实现多个对象的规则。