首页 文章

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

提问于
浏览
0

在我写的并行程序中,我定义了很多多维 allocatable 数组(实际上只有1D,2D或3D),它们在执行期间分配了 negative lower bounds . 我这样做的原因是每个进程在一个2D示例中处理一个14×14 A 矩阵并与四个相邻进程共享2层的重叠,因此矩阵分配有边界 (-1:12,-1:12) ,其中"internal"部分矩阵对应于1到10的索引 . (斜体表示选择/输入依赖性) .

问题是,在这样做时我没有意识到依靠this Fortran2003 feature是不可能的,因此在调用单元中不可能 call mysub(A(:,i),...) 并且在子程序中使用实际边界引用 A 的虚拟对应物(-1)和12),因为 A(:,i) 是一个表达式,而不仅仅是一个变量 .

如果我将整个数组 A 传递给子程序,问题就解决了,正如previous linked answer中所解释的那样,但是这会迫使我写一个"bigger"而不那么通用的子程序,相反,它是用于一维子阵列的 .

是否有可能以子程序知道实际变量边界的方式将 allocatable 数组的子数组(例如 A(:,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:)
    

相关问题