nAG Fortran コンパイラ 7.2 マニュアル

 
ナビゲーション:前へ   上へ   次へ

11.6 組込み手続きとモジュール

  • [6.2] 組み込みサブルーチンMOVE_ALLOCに、省略可能なSTATおよびERRMSG引数が追加されました。 STAT引数は、整数型で、10進指数範囲が4以上である必要があります(つまり、8ビット整数ではありません)。 サブルーチンが正常に実行された場合は値ゼロが割り当てられ、それ以外の場合はゼロ以外の値が割り当てられます。 ERRMSG引数は、基本種別の文字型である必要があります。 STATが存在し、ゼロ以外の値が割り当てられている場合、 ERRMSGには説明メッセージが割り当てられます(存在する場合)。 それ以外の場合、ERRMSGは以前の値(存在する場合)を保持します。

    例)

        INTEGER,ALLOCATABLE :: x(:),y(:)
        INTEGER istat
        CHARACTER(80) emsg
        ...
        CALL MOVE_ALLOC(x,y,istat,emsg)
        IF (istat/=0) THEN
          PRINT *,'Unexpected error in MOVE_ALLOC: ',TRIM(emsg)
    

    これらの引数の目的は、STAT_STOPPED_IMAGESTAT_FAILED_IMAGEなどの複数の像の共配列の割付け/割付け解除のエラーをキャッチすることです。

  • [7.1] 組込み関数ALLANYFINDLOCIALLIANYIPARITYMAXLOCMAXVALMINLOCMINVALNORM2PARITYPRODUCT、及びSUMDIM引数は実行時に存在する限り、省略可能な仮引数にすることができます。
    例)
      Subroutine sub(x,n)
        Real,Intent(In) :: x(:,:,:)
        Integer,Intent(In),Optional :: n
        If (Present(n)) Then
          Print *,Norm2(x,n) ! Rank two array result.
        Else
          Print *,Norm2(x)   ! Scalar result.
        End If
      End Subroutine
    
  • 整数および論理引数に対する組込み手続きは、以前は基本種別であることが要求されていましたが、 RANDOM_SEEDを除き、その要件はもはやありません。 変更点は以下の通りです:
    • [7.2] 組込みサブルーチンDATE_AND_TIMEVALUES引数は、10進指数範囲が4以上の任意の種別の整数です。つまり、8ビット整数を除く任意の種別です。 例えば、
              Program show_year
                  Use Iso_Fortran_Env
                  Integer(int16) v(8)
                  Call Date_And_Time(Values=v)
                  Print *,'The year is',v(1)
              End Program
      
    • [7.2] 組込みサブルーチンEXECUTE_COMMAND_LINEWAIT引数は、任意の種別の論理型です。 CMDSTATおよびEXITSTAT引数は、10進指数範囲が4以上の任意の種別の整数です。つまり、8ビット整数を除く任意の種別です。 例えば、
              Program ok
                  Use Iso_Fortran_Env
                  Logical(logical8) :: w = .True._logical8
                  Integer(int16) :: cstat
                  Integer(int64) :: estat
                  Call Execute_Command_Line('echo ok',w,estat,cstat)
                  If (estat/=0 .Or. cstat/=0) Print *,'Bad STAT',estat,cstat
              End Program
      
      は、‘echo’がUnixのechoコマンドであると仮定して、
              ok
      
      を表示します。
  • [7.1] 個別組込み関数は廃止されたと見なされます(-f2018オプションでそのように報告されます)。 個別でも総称でもある関数(例えばSQRT)の廃止された使用法は、 実引数として渡すか、手続引用仕様として使用するか、手続きポインタ割付け指示先となるかです。
  • [7.1] 組込照会関数RANKは、引数の次元を返します。 書式は次のとおりです。
    RANK ( A )
    

    A : 任意の型のデータ実体

    結果 : 基本種別のスカラ整数

    結果はAの次元数です。つまりAがスカラの場合はゼロ、Aが1次元配列の場合は1、等々。

    この関数は、Aが次元数引継ぎ変数である場合を除いて、定数式で使用できます。

  • [7.2] 乱数生成器(組込みRANDOM_NUMBER)は現在、像ごとに存在します。 Fortran 2008では、コンパイラがすべての像間で共有される単一の乱数ストリームを使用することが許可されていましたが、 Fortran 2018ではそれを許可せず、代わりに各像が独自の乱数状態を持つことを要求します。
  • [7.2] 新しい組込みサブルーチンRANDOM_INITは、呼び出し像上で乱数生成器を初期化します。 その構文は次のとおりです:
    CALL RANDOM_INIT ( REPEATABLE, IMAGE_DISTINCT )
    

    REPEATABLE : 論理型のスカラ、Intent(In);
    IMAGE_DISTINCT : 論理型のスカラ、Intent(In)

    IMAGE_DISTINCTが真の場合、乱数生成器の初期状態(シード)は、呼び出し像ごとに異なります。そうでない場合、初期状態は像に依存しません。 REPEATABLEが真の場合、プログラムの各実行は同じ初期シード(IMAGE_DISTINCTも真の場合は像依存)を使用します。そうでない場合、プログラムの各実行は異なる初期シードを使用します。

    RANDOM_INITへの呼び出しがない場合のnAG Fortranコンパイラのデフォルトは、REPEATABLE=false およびIMAGE_DISTINCT=trueです。

  • [7.1] 組込み関数REDUCEは、ユーザー定義の配列集約を実行します。 書式は次のとおりです。
    REDUCE ( ARRAY, OPERATION [, MASK, IDENTITY, ORDERED ] ) or REDUCE ( ARRAY, OPERATION DIM [, MASK, IDENTITY, ORDERED ] )
    

    ARRAY:任意の型の配列

    OPERATION:2つの引数を持つ純粋関数。各引数は、ARRAYと同じ宣言型および型パラメータを持つ、スカラ、非割り付け可能、非ポインター、非多態性の非省略可能変数です。 一方の引数にASYNCHRONOUSTARGET、またはVALUE属性がある場合、もう一方にもその属性が必要です。 結果は、ARRAYと同じ型および型パラメーターを持つ非多相スカラ変数である必要があります。

    DIM:1からNの範囲のスカラ整数。ここでNARRAYの次元数です。

    MASK:論理型でARRAYと同じ形状のスカラまたは配列

    IDENTITYARRAYと同じ宣言された型と型パラメタを持つスカラ

    ORDERED:論理型のスカラ

    結果:ARRAYと同じ型および型パラメタ。

    結果は、ユーザー指定のOPERATIONによってARRAYが集約されます。 DIMが存在しない場合、(マスクされた)ARRAY全体がスカラ結果に集約されます。 DIMが存在する場合、結果の次元数はN-1になり、ARRAYの形状は次元DIMが集約されます。 結果の各要素は、その次元のマスクされた要素の集約です。

    正確に1つの要素が結果値に寄与する場合、その値は要素と等しくなります。つまり、OPERATIONは、複数の要素が表示された場合にのみ呼び出されます。

    結果値に寄与する要素がない場合は、IDENTITY引数が存在する必要があり、その値はIDENTITYと同じです。

    例)

    Module triplet_m
      Type triplet
        Integer i,j,k
      End Type
    Contains
      Pure Type(triplet) Function tadd(a,b)
        Type(triplet),Intent(In) :: a,b
        tadd%i = a%i + b%i
        tadd%j = a%j + b%j
        tadd%k = a%k + b%k
      End Function
    End Module
    Program reduce_example
      Use triplet_m
      Type(triplet) a(2,3)
      a = Reshape( [ triplet(1,2,3),triplet(1,2,4), &
                     triplet(2,2,5),triplet(2,2,6), &
                     triplet(3,2,7),triplet(3,2,8) ], [ 2,3 ] )
      Print 1, Reduce(a,tadd)
      Print 1, Reduce(a,tadd,1)
      Print 1, Reduce(a,tadd,a%i/=2)
      Print 1, Reduce(Array=a,Dim=2,Operation=tadd)
      Print 1, Reduce(a, Mask=a%i/=2, Dim=1, Operation=tadd, Identity=triplet(0,0,0))
    1 Format(1x,6('triplet(',I0,',',I0,',',I0,')',:,'; '))
    End Program
    
    上記コードは以下を出力します
     triplet(12,12,33)
     triplet(2,4,7); triplet(4,4,11); triplet(6,4,15)
     triplet(8,8,22)
     triplet(6,6,15); triplet(6,6,18)
     triplet(2,4,7); triplet(0,0,0); triplet(6,4,15)
    
  • [7.0] 組込みのATOMICサブルーチンATOMIC_ADDATOMIC_ANDATOMIC_CASATOMIC_FETCH_ADDATOMIC_FETCH_ANDATOMIC_FETCH_ORATOMIC_FETCH_XORATOMIC_OR、及びATOMIC_XORは、高度な共配列プログラミングで説明されています。

  • [7.1] 個別集約サブルーチンCO_BROADCASTCO_MAXCO_MINCO_REDUCE、およびCO_SUMは、高度な共配列プログラミングで説明されています。
  • [7.0] 組込み関数COSHAPEEVENT_QUERYFAILED_IMAGESGET_TEAMIMAGE_STATUSSTOPPED_IMAGES、およびTEAM_NUMBER、および組み込み関数NUM_IMAGES、及びTHIS_IMAGEは、高度な共配列プログラミングで説明されています。
  • [7.0] 組込み関数 COSHAPE, EVENT_QUERY, FAILED_IMAGES, GET_TEAM, IMAGE_STATUS, STOPPED_IMAGES, そして TEAM_NUMBER。 組込み関数 IMAGE_INDEX, NUM_IMAGES, そして THIS_IMAGE への変更は、高度な共配列プログラミングで説明されています。
  • 要素別処理組込み関数 OUT_OF_RANGE は、変換が範囲外になる場合に限り、真を返します。 その構文は以下の通りです:
    OUT_OF_RANGE ( X, MOLD [ , ROUND ] )
    

    X : 実数型または整数型;

    MOLD : 実数型または整数型のスカラ;

    ROUND (任意) : 論理型のスカラ;

    結果 : 基本種別の論理型。

    結果は、Xの値が、エラーなしにMOLDの型および種別に変換できる値の範囲外の場合に限り真です。 MOLD引数が変数である場合、その型と種別のみが使用され、定義された値を持つ必要はありません。 ROUND引数は、Xが実数型でMOLDが整数型の場合にのみ許可されます。

    実数から整数への変換については、デフォルトのチェックは、 組込み関数 INT (X, KIND (MOLD)) による変換が範囲外かどうかです;これは組込み代入で使用される同じ変換です。 ROUND引数が値 .TRUE. で提供された場合、チェックは代わりに 組込み関数 NINT (X, KIND (MOLD)) による変換が範囲外かどうかです。

    例えば、OUT_OF_RANGE (127.5, 0_int8) は偽ですが、OUT_OF_RANGE (127.5, 0_int8, .TRUE.) は真です。

    Xの値がIEEE無限大の場合、OUT_OF_RANGE は、MOLDの型および種別がIEEE無限大をサポートしていない場合に限り、.TRUE. を返します。 同様に、XがIEEE非数の場合、結果は、MOLD がIEEE非数をサポートしていない場合に限り、真です。

    注意:一方の種別の実数型から別の種別の実数型への変換をチェックする場合(例えば、 REAL(real32) から REAL(real16) へ、または REAL(real64) から REAL(real32) へ)、 有限値が HUGE (KIND (MOLD)) より大きい場合は範囲外とみなされますが、 無限値は範囲外とはみなされません。 つまり、OUT_OF_RANGE (1.0E200_real64, 1.0_real32).TRUE. を返しますが、 OUT_OF_RANGE (IEEE_VALUE (1.0_real64, IEEE_POSITIVE_INF), 1.0_real32).FALSE. を返します。

    この関数は要素別処理であり、定数式で使用できます(Xの値が定数であり、ROUND引数が欠けているか定数である場合)、ただしX引数のみが配列であることが許可されます。 その結果、常にXの階数と形状を持ちます。

  • [mostly 7.2] 標準組込みモジュール IEEE_ARITHMETIC には、IEEE(ISO/IEC 60559)算術をサポートする追加の定数、型、手続があります。 これらはセクション “Updated IEEE arithmetic capabilities” で説明されています。
  • [7.2] Fortran 2018は、F90_KIND のような非標準組込みモジュールの使用を診断することを要求します。 nAG Fortranコンパイラでは、OpenMPモジュール OMP_LIB も組込みモジュールであるため、その使用は拡張機能として診断されます。
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks