将可分配数组的子数组传递给子程序,具有右边界

时间:2016-11-08 10:48:10

标签: arrays fortran subroutine sub-array allocatable-array

在我编写的并行程序中,我定义了许多多维allocatable数组(实际上只有1D,2D或3D),这些数组在负下限期间分配执行。 我这样做的原因是每个进程在 2D 示例中处理 14 x 14 A矩阵并共享 2的重叠 四个相邻进程的图层,因此矩阵分配了边界 (-1:12,-1:12) ,其中"内部"矩阵的一部分对应于从1到 10 的索引。 (斜体代表选择/输入依赖)。

问题是,在这样做的过程中,我没有意识到依靠this Fortran2003 feature是不可能的,因此无法在调用者单元中call mysub(A(:,i),...)进行操作并参考虚拟对象使用实际边界( -1 12 )在子例程中A的对应部分,因为A(:,i)是一个表达式,而不仅仅是一个变量

如果我将整个数组A传递给子程序,问题就解决了,正如previous linked answer中所解释的那样,但这会迫使我写一个更大的"更大的"而不那么通用的子程序,恰恰相反,它意味着对一维子阵列起作用。

是否有可能将allocatable数组的子数组(例如A(:,1))传递给子程序,使子程序知道实际变量的界限?

1 个答案:

答案 0 :(得分:2)

据我所知:不,这是不可能的。

请注意,很多时候,想要关心子程序中数组的实际下限。如果你有一个对一个数组或类似的数组求和的子程序,你只想从1循环到数组的大小。并且您希望能够将任何数组传递给此类子例程。

如果您需要从子程序中的特定索引开始,您始终可以

1。 将下限声明为魔术常量

real, intent(inout) :: array(-1:,-1:,-1:)

也许不太好,但我在主要的生产代码中使用它,因为我几年前就这样开始了。

2。 将下限声明为模块中的常量并使用

 use contants

 real, intent(inout) :: array(lb:,lb:,lb:)

3。 将下限作为伪参数传递

integer, intent(in) :: lb
real, intent(inout) :: array(lb:,lb:,lb:)