Arrays 将可分配数组的子数组传递给子例程(具有右边界)

Arrays 将可分配数组的子数组传递给子例程(具有右边界),arrays,fortran,subroutine,sub-array,allocatable-array,Arrays,Fortran,Subroutine,Sub Array,Allocatable Array,在我正在编写的并行程序中,我定义了许多多维可分配的数组(实际上只有1D、2D或3D),这些数组在执行过程中分配了负下限。 我这样做的原因是,在一个2D示例中,每个进程处理一个14×14的a矩阵,并与四个相邻进程共享一个2层的重叠,因此矩阵被分配边界(-1:12,-1:12),其中矩阵的“内部”部分对应于1到10的索引。(斜体表示选择/输入依赖项) 问题是,在这样做的过程中,我没有意识到它是不可能依赖的,因此不可能调用调用方单元中的mysub(A(:,I),…),并在子例程中使用实际边界(-1和1

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

问题是,在这样做的过程中,我没有意识到它是不可能依赖的,因此不可能
调用调用方单元中的mysub(A(:,I),…)
,并在子例程中使用实际边界(-1和12)引用
A
的虚拟对应项,因为
A(:,I)
是一个表达式,而不仅仅是一个变量

如中所述,如果我将整个数组
A
传递给子例程,问题就解决了,但这将迫使我编写一个“更大”且通用性更低的子例程,相反,它将作用于一维子数组


是否可以将
可分配的
数组的子数组(例如
a(:,1)
)传递给子例程,使子例程知道实际变量的边界?

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

请注意,通常情况下,您不希望关心子例程中数组的实际下限。如果有一个子例程对数组或类似对象求和,则只需从1循环到数组的大小。您希望能够将任何数组传递给这样的子例程

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

一,。 将下限声明为神奇常数

real, intent(inout) :: array(-1:,-1:,-1:)
也许不太好,但我在我的主要产品代码中使用了它,因为我几年前就这样开始了

二,。 在模块中将下限声明为常量并使用

 use contants

 real, intent(inout) :: array(lb:,lb:,lb:)
三,。 将下限作为伪参数传递

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

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

请注意,通常情况下,您不希望关心子例程中数组的实际下限。如果有一个子例程对数组或类似对象求和,则只需从1循环到数组的大小。您希望能够将任何数组传递给这样的子例程

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

一,。 将下限声明为神奇常数

real, intent(inout) :: array(-1:,-1:,-1:)
也许不太好,但我在我的主要产品代码中使用了它,因为我几年前就这样开始了

二,。 在模块中将下限声明为常量并使用

 use contants

 real, intent(inout) :: array(lb:,lb:,lb:)
三,。 将下限作为伪参数传递

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

本质上:是的,有一些方法(例如也传递边界和使虚拟对象显式成形)。然而,在这里合适的方法可能需要更多的细节。本质上:是的,有一些方法(例如也传递边界和使假人显式成形)。然而,在这里哪一个是合适的,可能需要更多的细节。很抱歉,我没有及时回复。我还没有使用你的解决方案,但我可以接受,因为我认为第2点。这是一个很好的答案!谢谢,很抱歉我没有及时回复。我还没有使用你的解决方案,但我可以接受,因为我认为第2点。这是一个很好的答案!非常感谢。