+---------------------------------Fortran 95---------------------------------+
FORALL 構文は、サブオブジェクトのグループへの割り当て、 特に配列エレメントへの割り当てを実行します。
WHERE 構文とは異なり、FORALL は、配列エレメント、 配列セクションおよびサブストリングの割り当てを実行します。 また、FORALL 構文の中の それぞれの割り当ては、直前の割り当てと整合していなくても構いません。 FORALL 構文には、 ネストされた FORALL ステートメント、FORALL 構文、WHERE ステートメントおよび WHERE 構文を含むことができます。
+-----------------------------End of Fortran 95------------------------------+
+----------------------------------IBM 拡張----------------------------------+
INDEPENDENT ディレクティブは、FORALL ステートメント または構文の各演算をどの順序で行ってもプログラムのセマンティクスに 影響しないですむようにします。 INDEPENDENT ディレクティブの詳細については、INDEPENDENTを参照してください。
+------------------------------End of IBM 拡張-------------------------------+
+---------------------------------Fortran 95---------------------------------+
>>-FORALL_construct_statement---------------------------------->< >>-forall_body------------------------------------------------->< >>-END_FORALL_statement---------------------------------------->< |
forall_body で参照されるプロシージャーはすべて (定義済み 操作または定義済み割り当てによって参照されるものを含む)、純粋でなければなりません。
FORALL ステートメントまたは構文が、FORALL 構文の 中でネストされている場合、内側の FORALL ステートメント または構文は、外側の FORALL 構文で使用されている どの index_name も再定義することはできません。
同じステートメントの中で、複数回、アトミック・オブジェクトを割り当てたり、 関連付け状況を変更したりすることはできませんが、 同じ FORALL 構文の中にある別の割り当てステートメントは、 アトミック・オブジェクトを再定義したり再び関連させたりすることができます。 また、WHERE 構文の中のそれぞれの WHERE ステートメント および割り当てステートメントは、次の制約事項を守らなければなりません。
FORALL_construct_name を指定する場合、FORALL ステートメント および END FORALL ステートメントの両方で指定しなければなりません。 END FORALL ステートメントまたは FORALL 構文の 中のどのステートメントも、分岐ターゲット・ステートメントにできません。
+-----------------------------End of Fortran 95------------------------------+
+---------------------------------Fortran 95---------------------------------+
FORALL (I=1:3,J=4:5)
I および J の組み合わせの集合は次のとおりです。
{(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)}
-1 および -qnozerosize コンパイラー・オプションは、 このステップに影響を与えません。
{(1,4),(2,5),(3,4),(3,5)}
すべてのアクティブな index_name 値の 組み合わせについて、順序に関係なく、 右側の expression のすべての値、および左側の variable の すべての添え字、ストライド、およびサブストリング境界を評価します。
すべてのアクティブな index_name 値の組み合わせについて、 順序に関係なく、計算された expression の値を 対応する variable エンティティーに割り当てます。
INTEGER, DIMENSION(50) :: A,B,C INTEGER :: X,I=2,J=49 FORALL (X=I:J) A(X)=B(X)+C(X) C(X)=B(X)-A(X) ! All these assignments are performed after the ! assignments in the preceding statement END FORALL END
何がポインター割り当てのターゲットになるのかを順序に関係なく評価し、 すべてのアクティブな index_name 値の 組み合わせについて、ポインターのすべての添え字、ストライド、 およびサブストリング境界を評価します。 ターゲットがポインターではない場合、ターゲットの 判別には、その値の評価は含まれません。 ポインター割り当ては、右側の値を判別する必要はありません。
すべてのアクティブな index_name 値の組み合わせに対して、 順序に関係なく、すべてのターゲットを、 対応するポインター・エンティティーに関連させます。
WHERE ステートメント、WHERE 構文ステートメント、 ELSEWHERE ステートメント、 またはマスクされた ELSEWHERE ステートメント (それぞれ アクティブな index_name 値の組み合わせ) ごとに、 順序に関係なく、制御マスクおよび保留制御マスクを評価し、 そのステートメントにとってよりよいアクティブな組み合わせを作ります。 これについては マスクされた配列割り当ての解釈で説明しています。それぞれのアクティブな組み合わせに対し、 コンパイラーは WHERE ステートメント、WHERE 構文ステートメント、 またはマスクされた ELSEWHERE ステートメントの割り当てを実行し、 そのアクティブな組み合わせで真である制御マスクの値を割り当てます。 前に説明したとおり、コンパイラーは、WHERE 構文内の それぞれのステートメントを順に実行します。
INTEGER I(100,10), J(100), X FORALL (X=1:100, J(X)>0) WHERE (I(X,:)<0) I(X,:)=0 ! Assigns 0 to an element of I along row X ! only if element value is less than 0 and value ! of element in corresponding column of J is ELSEWHERE ! greater than 0. I(X,:)=1 END WHERE END FORALL END
外側の FORALL ステートメントまたは構文にあるアクティブな 組み合わせについて、順序に関係なく、forall_triplet_spec_list の中 の subscript 式および stride 式を評価します。 有効な組み合わせは、内側と外側の FORALL 構文の組み合わせの集合のカルテシアン積です。 scalar_mask_expr は、内側の FORALL 構文のアクティブな組み合わせを判別します。 これらのアクティブな組み合わせについて、ステートメントと構造体が実行されます。
! Same as FORALL (I=1:100,J=1:100,I.NE.J) A(I,J)=A(J,I) INTEGER A(100,100) OUTER: FORALL (I=1:100) INNER: FORALL (J=1:100,I.NE.J) A(I,J)=A(J,I) END FORALL INNER END FORALL OUTER END
+-----------------------------End of Fortran 95------------------------------+