XL Fortran for AIX V8.1.1

ランゲージ・リファレンス


FORALL 構造体

+---------------------------------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_construct_statement
構文の詳細については、FORALL (構造体)を参照してください。

END_FORALL_statement
構文の詳細については、END (構造体)を参照してください。

forall_body
次のステートメントまたは構造体の 1 つ以上です。

forall_assignment
WHERE ステートメント (WHEREを参照)
WHERE 構造体 (WHERE 構造体を参照)
FORALL ステートメント (FORALLを参照)
FORALL 構造体

forall_assignment
assignment_statement または pointer_assignment_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 構造体の解釈

  1. FORALL 構造体ステートメントの中の各 forall_triplet_specsubscript および stride 式は、順序に関係なく評価されます。可能な index_name 値のすべての組が、組み合わせの集合を形成します。たとえば、次のようなステートメントを想定します。

    FORALL (I=1:3,J=4:5)
    

    I および J の組み合わせの集合は次のとおりです。

        {(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)}
    

    -1 および -qnozerosize コンパイラー・オプションは、このステップに影響を与えません。

  2. 組み合わせの集合の scalar_mask_expr は順序に関係なく評価され (FORALL 構造体ステートメントにある)、アクティブな組み合わせの集合が作成されます (.TRUE. と評価されたもの)。たとえば、(I+J.NE.6) が上記の集合に適用された場合、アクティブな組み合わせの集合は次のようになります。

        {(1,4),(2,5),(3,4),(3,5)}
    
  3. 出現順で、それぞれの forall_body ステートメントまたは forall_body 構造体を実行します。アクティブな組み合わせの集合に対して、それぞれのステートメントまたは構造体は、次のように完全に実行されます。

    assignment_statement

    すべてのアクティブな 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
    

    pointer_assignment_statement

    何がポインター割り当てのターゲットになるのかを順序に関係なく評価し、すべてのアクティブな index_name 値の組み合わせについて、ポインターのすべての添え字、ストライド、およびサブストリング境界を評価します。ターゲットがポインターではない場合、ターゲットの判別には、その値の評価は含まれません。ポインター割り当ては、右側の値を判別する必要 はありません。

    すべてのアクティブな index_name 値の組み合わせに対して、順序に関係なく、すべてのターゲットを、対応するポインター・エンティティーに関連させます。

    WHERE ステートメントまたは構造体

    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 ステートメントまたは構造体にあるアクティブな組み合わせについて、順序に関係なく、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 の終り------------------------------+


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]