+---------------------------------Fortran 95---------------------------------+
FORALL 構造体は、サブオブジェクトのグループへの割り当て、特に配列エレメントへの割り当てを実行します。
WHERE 構造体とは異なり、FORALL は、配列エレメント、配列セクションおよびサブストリングの割り当てを実行します。また、FORALL 構造体の中のそれぞれの割り当ては、直前の割り当てと整合していなくても構いません。 FORALL 構造体には、ネストされた FORALL ステートメント、FORALL 構造体、 WHERE ステートメントおよび WHERE 構造体を含むことができます。
+------------------------------Fortran 95 の終り------------------------------+
+----------------------------------IBM 拡張----------------------------------+
INDEPENDENT ディレクティブは、FORALL ステートメントまたは構造体の各演算をどの順序で行ってもプログラムのセマンティクスに影響しないですむようにします。 INDEPENDENT ディレクティブの詳細については、INDEPENDENTを参照してください。
+--------------------------------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 構造体の中のどのステートメントも、分岐ターゲット・ステートメントにできません。
+------------------------------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
+------------------------------Fortran 95 の終り------------------------------+