0

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

问题是在这样做时我没有意识到不可能依赖这个 Fortran2003 功能,因此不可能call mysub(A(:,i),...)在调用者单元A中使用实际边界(-112 ),因为A(:,i)它是一个表达式,而不仅仅是一个变量。

如果我将整个数组传递A给子程序,问题就解决了,正如前面链接的答案中所解释的那样,但这将迫使我编写一个“更大”且不那么通用的子程序,相反,它意味着对一个维子数组。

是否可以通过子程序知道实际变量边界的方式将数组的子allocatable数组(例如)传递给子程序?A(:,1)

4

1 回答 1

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:)
于 2016-11-08T10:56:35.220 回答