在我编写的并行程序中,我定义了许多多维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)
)传递给子程序,使子程序知道实际变量的界限?
答案 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:)