分配单个形状的多个阵列

时间:2018-06-05 23:01:12

标签: fortran

我将几个rank-3数组分配为完全相同的形状,我想知道是否可以只指定一次形状。例如,我目前正在做:

program main
   implicit none
   integer :: long_name_dimension_1 = 3
   integer :: long_name_dimension_2 = 5
   integer :: long_name_dimension_3 = 8

   real, allocatable, dimension(:,:,:) :: A, B, C

   allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3), &
            B(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3), &
            C(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))

end program main

输入很烦人,很难立即看到这些阵列具有相同的形状。在分配第一个数组后,我可以使用模具或源,例如:

allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
allocate(B, source=A)
allocate(C, mold=A)

但我也不喜欢这样 - 也许是因为,在我看来,它应该是一个allocate陈述。

我正在寻找语法,例如:

allocate( SHAPE :: (long_name_dimension_1,long_name_dimension_2,long_name_dimension_3), &
   A, B, C)

我一直无法找到。这样的语法(或类似的东西)是否存在?

2 个答案:

答案 0 :(得分:3)

Fortran不支持按照您的意愿分配多个数组。您只是坚持使用mold语句的sourceallocate选项。你可以写

allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
allocate(B,C,mold=A)

可以节省一些按键。您可以通过编写

来节省更多
allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
A = 1
B = A
C = A

虽然这会设置BC元素的值以及它们的形状。

我编辑了代码来处理评论中提出的@evets问题。

答案 1 :(得分:3)

嗯,最后一个(2015)Fortran标准中有allocate语句的语法:

allocate statement in Fortran 2015

形状必须遵循 allocation-list 中的每个分配术语,因此除了为所有变量声明一个常见形状之外,没有任何语法结构,除了使用SOURCEMOLD选项。

  

我可以在分配第一个数组后使用模具或源,但是我   也不是真的喜欢这样 - 也许是因为,在我看来,它应该   是一个分配声明。

实际上,您无法定义数组的形状并在同一语句中引用它。在同一章的后面,它说:

  

source-expr 不得在ALLOCATE语句中分配   它出现了;也不取决于价值,界限,推迟   类型参数,分配状态或任何关联状态   该声明中的 allocate-object

所以总结一下,最接近你想要的就是你不喜欢的东西:

allocate(A(long_name_dimension_1,long_name_dimension_2,long_name_dimension_3))
allocate(B, C, mold=A)

或者source = A,如果您希望复制A的内容。

修改

这个怎么样:

allocate(A, B, C, mold=reshape([integer ::], &
[long_name_dimension_1,long_name_dimension_2,long_name_dimension_3])

我刚刚检查了英特尔Fortran并确认它有效。零大小的数组可以具有任何形状,这似乎很奇怪。但我坚信它不是标准的。