0

私が書いている並列プログラムでは、実行中に負の下限allocatableで割り当てられる多くの多次元配列 (実際には 1D、2D、または 3D)を定義しました。私がそれを行った理由は、各プロセスが2Dの例では14 x 14の行列を処理し、隣接する4 つのプロセスと2 つのレイヤーのオーバーラップを共有するため、行列は境界で割り当てられます。行列は 1 から10までのインデックスに対応します。(斜体は選択/入力の依存関係を表します)。 A(-1:12,-1:12)

問題は、これを行う際に、この Fortran2003 機能に依存することが不可能であることを認識していなかったためcall mysub(A(:,i),...)、呼び出し元ユニットで実行できずA、実際の境界 ( -1および12 )A(:,i)は式であり、単なる変数ではないためです。

前のリンクされAた回答で説明されているように、配列全体をサブルーチンに渡すと問題は解決しますが、これにより、「より大きく」普遍性が低いサブルーチンを作成する必要があり、逆に、1つに作用することを意図しています次元の部分配列。

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 に答える