nAG Fortran Compiler 7.2 リリースノート

 

1 概要

nAG Fortran コンパイラのリリース 7.2 は、主要なアップデートです。

以前のリリースからアップグレードするお客様は、このリリース用の新しいライセンスキーが必要です。

Kusari ライセンス管理についての詳細は、KLICENCE.txt を参照してください。

2 リリース概要

リリース 7.2 は Fortran 2018 の全てをサポートしているため、デフォルトの言語レベルは現在 -f2018 になっています。

OpenMP 4.0 と 4.5 の部分的なサポートが 7.2 の初期リリースに含まれています。 2024年初頭には、これを完全サポートにアップグレードするアップデートが行われます。

3 互換性

3.1 リリース 7.1 との互換性

リリース 7.2 はリリース 7.1 と完全に互換性があります。

3.2 リリース 7.0 との互換性

リリース 7.2 はリリース 7.0 と互換性がありますが、-C=calls オプションでコンパイルされたファイルは、 手続きポインタ引数を持つ手続きが含まれている場合、またはそのような手続きへの参照が含まれている場合に再コンパイルが必要です。

3.3 リリース 6.2 との互換性

MacOSでは、-abi=32 を通じてアクセス可能だった 32 ビット ABI モードが削除されました。その結果、 64 ビットコンパイルのみがサポートされ、-abi= スイッチが完全に削除されました。

この点を除けば、リリース 7.2 は共配列が使用されている場合や -C=calls オプションが 代替戻り値を持つサブルーチンに使用されている場合を除き、リリース 6.2 と完全に互換性があります。 これらの機能を使用しているプログラムは再コンパイルが必要です。

3.4 リリース 6.1 との互換性

HPF(High Performance Fortran)からの機能を使用するプログラム、例えば ILEN 組み込み関数や HPF_LIBRARY モジュールは、 もはやサポートされません。

Linux x86-64 上で非推奨とされていた -abi=64 オプションが撤回されました。 このオプションは、64ビットポインタを持つが、32ビットのオブジェクトサイズと添字算術を提供し、リリース 5.1 以前との互換性のために存在していました。

HPF サポートと非推奨オプションの撤回を除けば、nAG Fortran コンパイラのリリース 7.2 はリリース 6.1 と完全に互換性があります。

3.5 リリース 6.0 との互換性

HPF サポートと非推奨オプションの撤回を除けば、リリース 7.2 の nAG Fortran コンパイラはリリース 6.0 と互換性がありますが、 パラメタ化派生型 の割り当て可能配列を使用するプログラムは再コンパイルが必要です(これはモジュール変数と仮引数にのみ影響します)。

3.6 リリース 5.3.1, 5.3 および 5.2 との互換性

HPF サポートと非推奨オプションの撤回を除けば、リリース 7.2 の nAG Fortran コンパイラはリリース 5.3.1 と完全に互換性があります。 Windows 上では、名前がドル記号 ($) で始まるモジュールや手続きは再コンパイルが必要です。

新しい パラメタ化派生型 機能を使用するプログラムでは、パラメタ化された派生型の多相変数を割り当て、解放、初期化、 またはコピーするプログラムのすべての部分がリリース 7.1 以降でコンパイルされることを強く推奨します。

3.7 リリース 5.1 との互換性

nAG Fortran コンパイラのリリース 7.2 は nAGWare f95 リリース 5.1 と互換性がありますが、次の例外があります:
  • HPF からの機能を使用するプログラムはサポートされません;
  • CLASS キーワードを使用するプログラムやライブラリ、または拡張される型を含むものは再コンパイルが必要です;
  • Linux x86-64 でリリース 5.1 でコンパイルされた 64 ビットのプログラムとライブラリはバイナリ互換性がなく、再コンパイルが必要です。

4 新しい Fortran 2018 の機能

  • GENERIC 文は、総称引用仕様を宣言するための簡潔な方法を提供します。 その構文は以下の通りです:

    GENERIC [ , access-spec ] :: generic-spec => procedure-name-list

    ここで、オプションの access-specPUBLIC または PRIVATEgeneric-spec は総称識別子(名前、ASSIGNMENT(=)OPERATOR(op)、または {READ|WRITE}({FORMATTED|UNFORMATTED}))、 そして procedure-name-list は名前付き手続きのコンマ区切りリストです。

    access-spec は、GENERIC 文がモジュールの仕様部分にある場合にのみ許可されます。 リスト内の各名前付き手続きは、明示的な引用仕様を持たなければなりません;つまり、内部手続き、モジュール手続きであるか、またはインターフェイスブロックまたは手続き宣言文で明示的なインターフェイスを指定して宣言されている必要があります。 手続きは、全てが関数または全てがサブルーチンであり、かつ明確であるという通常の総称規則を満たさなければなりません。

    オプションの access-spec を除いて、GENERIC 文は

            INTERFACE generic-spec
                PROCEDURE procedure-name-list
            END INTERFACE
    
    と同じ効果があります。 唯一の利点は、数行短く、同じ行でアクセシビリティを宣言できることです。 この構文は派生型定義の generic-binding と同じですが、名前のリストは型に結び付けられた手続きではなく通常の名前付き手続きです。

    例えば、プログラム

         Module print_sqrt
             Private
             Generic,Public :: g => s1, s2
         Contains
             Subroutine s1(x)
                 Print '(F10.6)',Sqrt(x)
             End Subroutine
             Subroutine s2(n)
                 Print '(I10)',Nint(Sqrt(Real(n)))
             End Subroutine
         End Module
         Program test
             Use print_sqrt
             Call g(2.0)
             Call g(127)
         End Program
    
      1.414214
            11
    
    を出力します。
  • E0 指数幅指定子は、指数幅を指定できるすべての編集記述子(つまり EEN など、ただし D は除く)で使用できます。 これは指数の最小幅の書式設定を指定します。 例えば、
           Print '(7X,3ES10.2E0)', 1.23, 4.56E24, 7.89D101
    
    は以下を出力します
              1.23E+0  4.56E+24 7.89E+101
    
  • EDEN および ES 編集記述子は出力で幅ゼロを持つことができます。 これは I およびその他の編集記述子と同様に、最小幅編集を提供します。つまり、 処理系はフィールドがアスタリスクで埋められることなく幅 w の最小値を選択します。 これは、先頭の空白が抑止され、E および D については、スケール ファクターがゼロ以下の場合、小数記号の前のオプションのゼロが抑止されることを意味します。

    例えば、以下に示す書式で 12.3 を印刷すると、先頭および末尾の空白なしで以下の結果が表示されます。

    E0.4 .1230E+02
    E0.4E3 .1230E+002
    1PE0.4 1.2300E+00
    EN0.4 12.3000E+00
    ES0.4 1.2300E+01
    E0.4E0 .1230E+2

    フィールド幅は指数の形式に影響しません。つまり、数字を最小幅で印刷するには、指数幅ゼロも使用する必要があります(上記の最後の例で示されているように)。

    これらの編集記述子の仮数部分の末尾のゼロを除去する手段はありません(新しい EX 編集記述子では可能です)。

  • G0.d 編集記述子は、整数、論理、および文字型で許可されます。 Fortran 2008 ではこれは入出力エラーでした。 Fortran 2018 では、整数の場合は I0、論理の場合は L1、文字の場合は A と同じ効果があります。 例えば、
           Print '(7X,"start:",3G0.17,":end")', 123, .True., 'ok'
    
           start:123Tok:end
    
    を印刷します。
  • 新しい編集記述子 EXw.d および EXw.dEe は、 16進仮数部を持つ浮動小数点数の出力に使用することができます。 書式は

    [ s ] 0X x0 . x1x2exponent

    ここで、s はオプションのプラスまたはマイナス符号(+ または −)、 各 xi は16進数(09 または AF)、 そして exponent は10進数で表された2のべき乗(二進指数)で、書式は P s z1zn です。オプションの Ee が現れる場合、ne と等しく、そうでない場合は指数を表すのに必要な最小の桁数です。 指数がゼロに等しい場合、符号 s はプラス符号です。

    数字 d の桁数がゼロの場合、生成される仮数桁 xi の数は内部値を正確に表す最小の数です。 内部値の基数が2のべき乗でない場合、d はゼロであってはなりません。

    入力において、EX 編集記述子の効果は F 編集記述子と同一です。

    最初の16進数桁の値はゼロでないことを除いて標準化されていません。 したがって、コンパイラ によっては、EX0.1 で 1.0 の値を書くと 0X1.0P+00X2.0P-10X4.0P-2、または 0X8.0P-3 を生成するかもしれません。 nAG Fortran コンパイラは常に最上位ビットをセットするように仮数をシフトするため、 この場合は 0X8.0P-3 を出力します。

  • 並び、変数群、および明示的書式設定(例:F 編集記述子)を使用した浮動小数点数の入力は、16進数仮数部形式の入力値を受け入れます。 これは、EX 編集記述子によって生成される形式です。 16進数仮数部値は常にオプションの符号に続いて数字のゼロと文字 X で始まります。 つまり、+0X-0X、または 0X であり、明確な曖昧さはありません。

    例えば、‘-0XA.P-3’ を読み取ると値 -1.25 を生成します。

    数値入力の通常の規則として、小文字入力は大文字と同様に扱われます。したがって -0xa.p-3-0XA.P-3 と同じ値を生成します。

  • 要素的組み込み関数 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 NaN である場合、結果は MOLD が IEEE NaN をサポートしていない場合にのみ真です。

    ある種別の実数型から別の種別の実数型への変換をチェックする場合(例えば、 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 のランクと形状を持ちます。

  • 組み込みサブルーチン DATE_AND_TIMEVALUES 引数は、少なくとも 4 の 10 進指数範囲を持つ任意の種別の整数であることができます。つまり、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
    
  • 組み込みサブルーチン EXECUTE_COMMAND_LINEWAIT 引数は、任意の種別の論理型であることができます。 CMDSTAT および EXITSTAT 引数は、少なくとも 4 の 10 進指数範囲を持つ任意の種別の整数であることができます。つまり、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
    
    を表示します。
  • 組み込みサブルーチン GET_COMMANDGET_COMMAND_ARGUMENT、および GET_ENVIRONMENT_VARIABLE には、引数リストの最後にオプションの ERRMSG 引数があります。 エラーが発生すると(つまり、STATUS 引数に正の値が割り当てられる場合)、 ERRMSG 引数に説明メッセージが割り当てられます。 エラーが発生しない場合(STATUS 引数にゼロまたは負の値が割り当てられる場合)、 ERRMSG 引数は変更されません。 STATUS 引数が省略されても、ERRMSG 引数に対する効果は(または発生しません)発生します。 しかし、エラーが発生しない場合には変更されないため、エラーを検出するための STATUS 引数の代わりにはなりません。

    例えば、このプログラムを実行すると、

           Program test
             Character(200) msg,value
             Integer status
             Call Get_Environment_Variable('Does Not Exist',value,status,Errmsg=msg)
             If (status>0) Print *,Trim(msg)
           End Program
    
    は、‘Does Not Exist’ という環境変数が存在しない限り、以下を出力します
            Environment variable does not exist
    
  • 組み込み関数 IMAGE_INDEX には2つの追加形式があります:
    IMAGE_INDEX( COARRAY, SUB, TEAM )
    IMAGE_INDEX( COARRAY, SUB, TEAM_NUMBER )
    

    TEAM : TEAM_TYPE 型のスカラー、Intent(In);
    TEAM_NUMBER : 整数型のスカラー、Intent(In)

    COARRAYSUB 引数の意味は変わりませんが、サブスクリプトは指定されたチーム用として解釈されます。 返り値も同様に指定されたチームの像番号です。
  • 乱数生成器(組み込み RANDOM_NUMBER)は現在、像ごとになりました。 Fortran 2008 ではコンパイラがすべての像間で共有される単一の乱数ストリームを使用することを許可していましたが、 Fortran 2018 ではそれを許可せず、代わりに各像が独自の乱数状態を持つことを要求します。

  • 新しい組み込みサブルーチン 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=偽 および IMAGE_DISTINCT=真です。

  • 標準組み込みモジュール IEEE_ARITHMETIC には、IEEE (ISO/IEC 60559) 算術の追加サポートを提供する追加の定数、型、および手続きがあります。 既存の手続きの3つには、追加のオプション引数があります。
    • 名前付き定数 IEEE_AWAYIEEE_ROUND_TYPE 型で、ゼロから離れる方向への丸めモードを表します。 IEEE 標準はこの丸めモードを十進数でのみ要求し、二進数ハードウェアはこれをサポートしていないため、使用できません。
    • 要素関数 IEEE_FMA は、融合乗算加算演算を実行します。 その構文は以下の通りです:

      IEEE_FMA (A, B, C)
      

      A : 実数型;
      B : A と同じ型および種;
      C : A と同じ型および種。

      結果 : A と同じ型および種。

      この関数の結果は、(A×B)+C の値が1回の丸めでのみ行われることです。 つまり、全体の操作が数学的に計算され、最後に A の形式に丸められます。 例えば、A×B がオーバーフローしても IEEE_OVERFLOW はシグナルされませんが、最終結果が範囲外である場合のみシグナルされます。

      制限: A の種別が IEEE 形式でない場合、この関数を呼び出してはなりません。つまり、 IEEE_SUPPORT_DATATYPE (A) が偽を返す場合です。

    • 純粋なサブルーチン IEEE_GET_MODES は、停止モード、丸めモード、およびアンダーフローモードを単一のオブジェクトで取得します。 その構文は以下の通りです:
      IEEE_GET_MODES (MODES)
      

      MODES : IEEE_MODES_TYPE 型のスカラー、Intent(Out)

      取得されたモードは IEEE_SET_MODES によってモードを復元するために使用することができます。

    • 現在の丸めモードを取得する純粋なサブルーチン IEEE_GET_ROUNDING_MODE には、基数を指定するオプションの引数が追加されました。 その構文は現在以下の通りです:
      IEEE_GET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
      

      ROUND_VALUE : IEEE_ROUND_TYPE 型、Intent(Out);
      RADIX (オプション) : 整数、Intent(In)、2または10と等しくなければなりません。

      ROUND_VALUE 引数には指定された基数の現在の丸めモードが割り当てられます。 RADIX が現れない場合、二進丸めモードが割り当てられます。

    • 要素別処理関数 IEEE_INT は、IEEE 実数値を特定の丸めモードで整数に変換します。 その構文は以下の通りです:
      IEEE_INT (A, ROUND [, KIND ])
      

      A : 型 実数;
      ROUND : 型 IEEE_ROUND_TYPE;
      KIND (任意) : スカラ 整数 定数式;
      結果 : 型 整数, KIND が指定されている場合は KIND の種別、それ以外の場合は基本種別。

      A の値は、ROUND によって指定された丸めモードを使用して整数に丸められます。 その値が結果の種別で表現可能な場合、結果はその値を持ちます; そうでない場合、結果は処理系依存で、IEEE_INVALID が通知されます。

      この操作は、IEEE 標準によって指定された convertToInteger{round} または convertToIntegerExact{round} 操作のいずれかです。 後者の場合、IEEE_INVALID が通知されず、A が既に整数でなかった場合、IEEE_INEXACT が通知されます。

      制限: この関数は、A の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、 IEEE_SUPPORT_DATATYPE (A) が false を返す場合です。

    • 要素別処理関数 IEEE_MAX_NUM, IEEE_MAX_NUM_MAG, IEEE_MIN_NUM, IEEE_MIN_NUM_MAG は、NaN 値を無視して最大/最小操作を実行します。 引数が signalling NaN の場合、IEEE_INVALID が発生します。 引数の一方だけが NaN の場合、結果はもう一方の引数です; 両方の引数が NaN の場合のみ、結果は NaN です。 IEEE_MAX_NUM の構文は以下の通りです:
      IEEE_MAX_NUM (X, Y)
      

      X : 型 実数;
      Y : X と同じ型及び種別;
      結果 : X と同じ型及び種別。

      結果の値は、XY の最大値で、NaN を無視します。

      制限: この関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、 IEEE_SUPPORT_DATATYPE (X) が false を返す場合です。

      IEEE_MAX_NUM_MAG は構文が同じです(名前を除く), そして結果は XY のうち大きさが大きい方です。 同じ制限が適用されます。

      IEEE_MIN_NUM は構文が同じです(名前を除く), そして結果は XY の最小値で、NaN を無視します。 同じ制限が適用されます。

      IEEE_MIN_NUM_MAG は構文が同じです(名前を除く), そして結果は XY のうち小ささが小さい方です。 同じ制限が適用されます。

    • 派生型 IEEE_MODES_TYPE には、すべての浮動小数点モードが含まれています: 停止モード、丸めモード、およびアンダーフローモード。 これは、IEEE_GET_MODES および IEEE_SET_MODES サブルーチンによって使用されます。

    • 要素別処理関数 IEEE_QUIET_{EQ|NE|LT|LE|GT|GE} は、オペランドが quiet NaN であっても、信号を発生させずに二つの IEEE 形式数を比較します。 オペランドが signalling NaN の場合、IEEE_INVALID 例外が発生します。 IEEE_QUIET_EQIEEE_QUIET_NE は、IEEE 形式の数値にのみ使用可能な点を除いて、==/= と全く同じです。 IEEE_QUIET_EQ 関数の構文は以下の通りです:
      IEEE_QUIET_EQ (A, B)
      

      A : 型 実数 (任意の IEEE 種別);
      B : A と同じ型及び種別;

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

      IEEE_QUIET_NE などの構文は、関数の名前を除いて同じです。

      制限: これらの関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、 IEEE_SUPPORT_DATATYPE (X) が false を返す場合です。

    • 要素別処理関数 IEEE_REAL は、整数またはIEEE形式の実数値を指定されたIEEE形式の実数値に変換します。 その構文は以下の通りです:
      IEEE_REAL (A, [, KIND ])
      

      A : 型 実数 または 整数;
      KIND (任意) : スカラ 整数 定数式;
      結果 : 型 実数, KIND が指定されている場合は KIND の種別、それ以外の場合はデフォルトの種別。

      A の値が結果の種別で表現可能な場合、その値が結果です。 そうでない場合、A の値は現在の丸めモードを使用して結果の種別に丸められます。

      制限: この関数は、A の種別または結果の種別がIEEE形式でない場合には呼び出してはなりません。 つまり、IEEE_SUPPORT_DATATYPE (A) または IEEE_SUPPORT_DATATYPE(REAL(0,KIND)) が false を返す場合です。

    • 純粋サブルーチン IEEE_SET_MODES は、以前に IEEE_GET_MODES が呼び出されたときの状態に停止モード、丸めモード、およびアンダーフローモードを設定します。 その構文は以下の通りです:
      IEEE_SET_MODES (MODES)
      

      MODES : 型 IEEE_MODES_TYPE のスカラ、Intent(In)

      MODES の値は、IEEE_GET_MODES を介して取得されたものでなければなりません。
    • 純粋サブルーチン IEEE_SET_ROUNDING_MODE は、丸めモードを設定しますが、 基数を指定するオプションの引数が追加されました。 その構文は現在以下の通りです:
      IEEE_SET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
      

      ROUND_VALUE : 型 IEEE_ROUND_TYPE, Intent(In);
      RADIX (任意) : 整数, Intent(In), 2 または 10 でなければなりません。

      指定された基数の丸めモードは ROUND_VALUE に設定されます。 RADIX が指定されていない場合、二進の丸めモードが設定されます。

      制限: このサブルーチンは、いくつかの X (それが存在する場合は基数 RADIX で) に対して IEEE_SUPPORT_DATATYPE(X)IEEE_SUPPORT_ROUNDING(ROUND_VALUE,X) の両方が true である場合にのみ呼び出されるべきです。

    • 要素別処理関数 IEEE_SIGNALING_{EQ|NE|LT|LE|GT|GE} は、二つのIEEE形式の数を比較し、 オペランドがNaN(静かなNaNでも信号を発するNaNでも)である場合には IEEE_INVALID 例外を発生させます。 IEEE_SIGNALING_LT, IEEE_SIGNALING_LE, IEEE_SIGNALING_GT, IEEE_SIGNALING_GE は、 IEEE形式の数値にのみ使用可能な点を除いて、<, <=, >, >= と完全に同じです。 IEEE_SIGNALING_EQ 関数の構文は以下の通りです:
      IEEE_SIGNALING_EQ (A, B)
      

      A : 型 実数 (任意の IEEE 種別);
      B : A と同じ型及び種別;

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

      IEEE_SIGNALING_NE などの構文は、関数の名前を除いて同じです。

      制限: これらの関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、 IEEE_SUPPORT_DATATYPE (X) が false を返す場合です。

    • 要素別処理関数 IEEE_SIGNBIT は、IEEE 形式の数値の符号ビットを問い合わせます。 その構文は以下の通りです:

      IEEE_SIGNBIT (X)
      

      X : 型 実数 (任意の IEEE 種別);

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

      結果は符号ビットがセットされている(NaNでない任意の値に対して負を示す)場合、かつその場合に限り、真です。

      制限: この関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、 IEEE_SUPPORT_DATATYPE (X) が false を返す場合です。

    • 要素別処理関数 IEEE_RINT は、現在必要とされる丸めを指定するオプションの引数を持つようになりました。 その構文は現在以下の通りです:

      IEEE_RINT (X [, ROUND ])
      

      X : 型 実数;
      ROUND (任意) : 型 IEEE_ROUND_TYPE

      結果 : X と同じ型及び種別。

      ROUND が存在する場合、結果は ROUND によって指定されたモードに従って整数に丸められた X の値です。これはIEEE標準で roundToIntegral{rounding} と呼ばれる操作です。 ROUND が存在しない場合、結果は現在の丸めモードに従って整数に丸められた X の値です。これはIEEE標準で roundToIntegralExact と呼ばれる操作です。

      制限: この関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、 IEEE_SUPPORT_DATATYPE (X) が false を返す場合です。

  • 組込みモジュール ISO_C_BINDING に名前付き定数 C_PTRDIFF_T が追加されました。 これは C の型 ptrdiff_t、つまり二つのポインタ間の差を保持するのに十分な大きさの整数に対応する整数の種別です。 例えば、引用仕様
            Interface
              Function diff_cptr(a,b) Bind(C)
                Use Iso_C_Binding
                Type(C_ptr),Value :: a, b
                Integer(C_ptrdiff_t) diff_cptr
              End Function
            End Interface
    
    は C の関数
            ptrdiff_t diff_cptr(void *a,void *b) {
                return a - b;
            }
    
    と相互運用します。
  • 組込みモジュール ISO_C_BINDING では、手続き C_LOCC_FUNLOC は 純粋手続きとみなされ、C_F_POINTERC_F_PROCPOINTER は 非純粋手続きとみなされます。 純粋手続き内で使用される場合、C_FUNLOC の引数もまた 純粋手続きでなければなりません。

    組込みモジュール ISO_C_BINDING では、手続き C_LOCC_FUNLOC は 純粋手続と考えられ、C_F_POINTERC_F_PROCPOINTER は 非純粋手続と考えられます。 純粋手続内で使用される場合、C_FUNLOC の引数もまた 純粋手続でなければなりません。

  • 別のモジュールからアクセスされる実体のモジュール内のデフォルトのアクセシビリティ(USE 文を通じて) は、PUBLIC または PRIVATE 文でそのモジュール名を指定することにより制御でき、 インポートするモジュール内の他の実体のデフォルトのアクセシビリティを上書きできます。 例えば、
            Module mymod
              Use Iso_Fortran_Env
              Real(real32) x
              Integer(int64) y
              Private Iso_Fortran_Env
            End Module
    
    ISO_FORTRAN_ENV のすべての実体は、個別にリストする必要なく、モジュール mymod ではデフォルトで PRIVATE です。

    この新しいデフォルトのアクセシビリティは、明示的な PUBLIC または PRIVATE 宣言によって上書きすることができます。 また、遠隔モジュール(2つ以上の USE 文がある)の実体に複数の介在モジュールを介してアクセスされる場合、その実体へのすべての経路がデフォルトで PRIVATE の場合にのみデフォルトで PRIVATE となり、任意の経路がデフォルトで PUBLIC である場合はデフォルトで PUBLIC となります。 例えば、

            Module remote
                Real a,b
            End Module
            Module route_one
                Use remote
                Private remote
            End Module
            Module route_two
                Use remote
            End Module
            Module my_module
                Use route_one
                Use route_two
                Private route_one
            End Module
    

    モジュール REMOTE の変数 AB は、モジュール MY_MODULEPUBLIC です、 なぜならそれらはデフォルトで PUBLIC のモジュール ROUTE_TWO 経由でアクセス可能だからです。

  • IMPLICIT NONE 文は現在、TYPE および EXTERNAL 仕様を持つことができます。 その完全な構文は次のとおりです:

    IMPLICIT NONE [ ( [ implicit-none-specifier-list ] ) ]

    ここで、implicit-none-specifier-list は、キーワード EXTERNALTYPE のコンマ区切りリストです。 リスト内にキーワードが複数回出現することはありません。 リストが表示されない場合、またはリストに TYPE が表示される場合、そのスコーピングユニットに他の IMPLICIT 文が表示されることはありません。

    IMPLICIT NONE ()

    IMPLICIT NONE (TYPE)

    のセマンティクスは

    IMPLICIT NONE

    のそれと同一です

    キーワード EXTERNAL が出現し、キーワード TYPE が出現しない場合、暗黙の型付けは 無効化されません、 そして他の IMPLICIT 文がそのスコーピングユニットに出現することができます。 キーワード TYPEEXTERNAL の両方が出現する場合、 暗黙の型付けは無効化され、暗黙の引用仕様を持つ手続きには EXTERNAL 属性が必要です。 たとえば、

            Subroutine sub(x)
                Implicit None (External)
                Integer f
                Print *,f(x)
            End Subroutine
    
    は、関数 FEXTERNAL 属性がないため、エラーを生成します。

    キーワード EXTERNAL が出現し、キーワード TYPE が出現しない場合、暗黙の型付けは 無効化されません、 そしてそのスコーピングユニットに他の IMPLICIT 文が出現することができます。 キーワード TYPEEXTERNAL の両方が出現する場合、 暗黙の型付けは無効化され、暗黙の引用仕様を持つ手続きには EXTERNAL 属性が必要です。

  • IMPORT 文は、BLOCK 構造体とネストされたサブプログラム内に出現することができます。 デフォルトでは、そのようなスコーピングユニットは親スコープ内のすべての実体に対して親子結合によってアクセスできるため、 これ自体は(コンパイラがチェックした)ドキュメントとしてのみ有用です。 例えば、
            Subroutine outer(x,y)
                Real,Intent(InOut) :: x, y(:)
                …
            Contains
                Subroutine inner
                    Import :: x, y
                    …
    
  • 親子結合に対する制御は、IMPORT,NONEIMPORT,ALL、および IMPORT,ONLY 文によって提供されます。 他の IMPORT 文と同様に、それらは引用仕様本体、BLOCK 構造体、および 含まれるサブプログラム内にのみ出現し、 USE 文と他の仕様文の間に出現します。

    IMPORT,NONE 文は、親スコープ内の実体が親子結合によってアクセス不可能であることを指定します。 これは分離したモジュール手続き引用仕様以外の引用仕様本体のデフォルトです。 スコーピングユニット内に IMPORT,NONE 文が出現する場合、他の IMPORT 文は出現できません。 例えば、

            Subroutine outer(x,y)
                Real,Intent(InOut) :: x, y(:)
                …
            Contains
                Subroutine inner
                    Import,None
                    Implicit Integer (a-z)
                    Read *,x
                    Print *,x
                End Subroutine
            End Subroutine
    
    サブルーチン INNER の中の X は、その親 OUTERX への参照ではなく、 INNER にローカルな暗黙の型付けされた(Integer)変数です。

    IMPORT,ALL 文は、すべての親実体にアクセスされることを指定します。 つまり、そうでなければ親実体をアクセス不可能にする宣言(いわゆる「シャドウイング」)は無効です。 例えば、

            Subroutine outer(x,y)
                Real,Intent(InOut) :: x, y(:)
                …
            Contains
                Subroutine inner
                    Import,All
                    Integer,External :: y
                    …
    
    INNER 内の Y の宣言は無効であり、コンパイルエラーを生成します。 スコーピングユニット内に IMPORT,ALL 文が出現する場合、他の IMPORT 文は出現できません。

    IMPORT,ONLY 文は、IMPORT,ONLY 文で名前が指定された親実体のみが 親子結合によってアクセス可能であることを指定します。 スコーピングユニット内に IMPORT,ONLY 文が出現する場合、他のすべての IMPORT 文は ONLY キーワードを持たなければなりません。 例えば、

            Subroutine outer(x,y,z)
                Real,Intent(InOut) :: x, y(:),z
                …
            Contains
                Subroutine inner
                    Import,Only:x,y
                    z = x + y
    
    INNERXY への参照は親(OUTER)の実体への参照ですが、 INNERZ への参照は暗黙の型付けされたローカル変数への参照です。

  • 配列構成子または DATA 文の中の暗示的な DO ループは、ループ制御の前に整数型の型指定を持つことができるようになりました。 配列構成子内のそのようなループの構文は

    ( ac-value-list , integer-type-spec :: ac-do-variable = from, to [, step ] )

    であり、DATA 文内のそのようなループの構文は

    ( data-i-do-object-list , integer-type-spec :: data-i-do-variable = from, to [, step ] )

    です。ここで、integer-type-spec はキーワード INTEGER で始まる任意の型指定です。

    その効果は、ループ内部で、暗示的-DO 変数(ac-do-variable または data-i-do-variable)が、ループの外部で持つかもしれない型や種別にかかわらず、integer-type-spec によって指定された型と種別を持つことです。

    ループを含むスコープ内に同じ名前の実体がある場合、それはスカラ変数でなければならないことに注意してください。 たとえば、手続き名や型名であってはなりません。

    例えば、

            Real x
            Print *, [ (x, Integer :: x = 1, 10) ]
    
    は有効であり、整数値 1 から 10 までの出力を生成します。 同様に、
            Real x, y(10)
            Data (y(x),Integer::x=1,10,2) / 5*0 /
    
    は有効で、Y の奇数番目の要素をゼロで初期化します。

    これは、サブスクリプトが基本整数種別の範囲を超える可能性がある場合に特に有用です。 例えば、

            Real,Pointer :: a(:)
            ...
            Print *, [ (f(a(i)), Integer(int64) :: i = Lbound(a,1,int64), Ubound(a,1,int64)) ]
    
    は、例えば境界が 20000000000:20000000005 であっても、A の各要素に関数 F を適用します。

  • DO CONCURRENT 構造体には、局所性指定子 LOCALLOCAL_INIT、および SHARED を持つことができます。 これらの局所性指定子は、ループ内外で変数がどのように使用されるかを決定し、ループインデックス変数には適用されません。これらは常に実質的に LOCAL です。 DEFAULT(NONE) 局所性指定子もあり、DO CONCURRENT 内で使用されるすべての変数に明示的な局所性を指定する必要があります。 DO CONCURRENT 文の改訂された構文は、文番号と構造体名を無視して、次のようになります:

    DO CONCURRENT concurrent-header [ locality-spec ]...

    ここで、concurrent-header は以前と同じで、各 locality-spec は以下のいずれかです:

    LOCAL ( variable-name-list )
    LOCAL_INIT ( variable-name-list )
    SHARED ( variable-name-list )
    DEFAULT (NONE)

    LOCAL または LOCAL_INIT 指定子に出現する変数は、比較的普通の変数でなければなりません: ALLOCATABLEOPTIONAL 属性を持ってはならず、割付け可能な最終コンポーネントを持ってはならず、共配列や想定サイズ配列であってはなりません。 多相的である場合、POINTER 属性を持っていなければなりません。 最後に、変数定義コンテキストに出現することが許可されていなければなりません:例えば、INTENT(IN) であってはなりません。 LOCALLOCAL_INIT の効果は、構造体内の変数が構造体外のものと完全に別であることです。LOCAL の場合、各反復は未定義で始まり、LOCAL_INIT の場合、外部変数の値で各反復が始まります。 これにより、LOCALLOCAL_INIT 変数が反復間の依存関係を引き起こすことがないようにします。

    SHARED である変数は、構造体内外で同じ変数です。 ある反復によって値が与えられた場合、他の反復によって参照されたり値が与えられたりしてはなりません。 割付け可能であるかポインタである場合、同様に単一の反復によってのみ割り当てられたり、解放されたり、ポインタ割り当てされたりしてはなりません。 不連続配列が SHARED である場合、連続仮引数に実引数として渡されてはなりません(つまり、 仮引数は想定形状であるかポインタでなければならず、CONTIGUOUS 属性を持ってはなりません)。

    DO CONCURRENT 構造体内の変数に局所性指定子を提供することは、コードの可読性を向上させるだけでなく、 適切なコンパイラオプションを使用して、コンパイラがループを並列化しやすくします。 (リリース7.2時点で、nAG Fortran コンパイラにはそのようなオプションはありません。)

  • 算術IF文は削除された機能として扱われます。 (これは、式がIEEE非数の場合の挙動が未定義であり、良い定義を持つことができないためです。) 例えば、ファイルdel.f90に以下が含まれている場合
            Subroutine sub(x)
                Real,Intent(In) :: x
                If (x) 1,2,3
            1   Stop 1
            2   Stop 2
            3   Stop 3
            End Subroutine
    
    この警告メッセージが生成されます:
            Deleted feature used: del.f90, line 3: Arithmetic IF statement
    
    -Error=Deletedオプションが使用された場合、これはエラーとして扱われます。
  • 文番号付きのDO構文は廃止予定と見なされます (これは、END DO文と構築文番号によって効果的に置き換えられます)。 さらに、非ブロックDO構文は削除された機能として扱われます。 非ブロックのDOは、共有DO終了文番号を持つ2つ以上のネストしたDOループ、 またはEND DOまたはCONTINUE以外の終了文を持つDOループのいずれかです。 (これは、これらが理解しにくく、エラーが発生しやすく、Fortran 90以降はブロックDO構文を介してより良い機能が利用可能であるためです。) 例えば、ファイルobsdel.f90に以下が含まれている場合

          Subroutine sub(w,x,y)
              Real,Intent(InOut) :: w(:),x(:,:), y(:)
              Integer i,j
              Do 100 i=1,Size(w)
                  w(i) = w(i)**2 + 4*w(i) - 4
          100 Continue
              Do 200 j=1,Size(x,2)
                  Do 200 i=1,Size(x,1)
                      If (x(i,j)<0) Go To 200
                      x(i,j) = Sqrt(x(i,j)+1)
          200 Continue
              Do 300 i=1,Size(y)
                  If (y(i)<0) Go To 300
                  y(i) = Log(y(i))
              300 Print *,y(i)
          End Subroutine
    
    これらの警告メッセージが生成されます:
          Obsolescent: obsdel.f90, line 4: DO statement with label (100)
          Obsolescent: obsdel.f90, line 7: DO statement with label (200)
          Obsolescent: obsdel.f90, line 8: DO statement with label (200)
          Deleted feature used: obsdel.f90, line 11: 200 is a shared DO termination label
          Obsolescent: obsdel.f90, line 12: DO statement with label (300)
          Deleted feature used: obsdel.f90, line 15: DO 300 ends neither with CONTINUE nor ENDDO
    
  • FORALL文と構造は廃止予定と見なされます。 これは、通常、通常のDOまたはDO CONCURRENTよりもパフォーマンスが悪いためです。 例えば、ファイルobs.f90に以下が含まれている場合
            Subroutine sub(a,b,c)
                Real,Intent(InOut) :: a(:)
                Real,Intent(In) :: b(:),c
                Integer i
                Forall(i=1:Size(a))
                    a(i) = b(i)**2 - c
                End Forall
            End Subroutine
    
    この警告メッセージが生成されます:
            Obsolescent: obs.f90, line 5: FORALL construct
    
  • Fortran言語レベルが2018以上(デフォルト)の場合、F90_KINDOMP_LIBなどの非標準の組込みモジュールの使用に対して拡張メッセージが生成されます。

5 Fortran 2023 サポート

nAG Fortran コンパイラは、最近改訂され公開された Fortran 2023 標準の以下にリストされている機能をサポートしています。

  • フリー形式のソースコードの行は最大 10000 文字までとなります。 -f2023 オプションが使用されていない場合、132 文字を超える任意の行に対して拡張メッセージが生成されます。 (nAG Fortran コンパイラは任意の長さの行を受け入れますが、10000 文字を超える行は Fortran 2023 の拡張として報告されます。)
  • 組み込み問合せ関数 SELECTED_LOGICAL_KIND は、指定されたサイズの論理型の種別番号を返します。 この関数の構文は以下の通りです:

    SELECTED_LOGICAL_KIND ( BITS )
    

    BITS : スカラー整数;

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

    結果は、BITS ビット以上のサイズを指定する論理型の種別タイプパラメタ値です。BITS が論理型の最大の種別のストレージサイズを超える場合、結果は −1 になります。 従って、BITS が 8 以下であれば、すべての既知のコンパイラがサポートしている単一バイトの論理型の種別を返します。 nAG Fortran コンパイラでは、BITS が 64 を超える場合、結果は −1 になります。これは、サポートされている最大の論理型が 64 ビットであるためです。

  • 標準組み込みモジュール ISO_FORTRAN_ENV には、指定されたビットサイズの論理型の種別型パラメタ値を提供する追加の名前付き定数が含まれています:LOGICAL8LOGICAL16LOGICAL32、および LOGICAL64。 指定されたサイズの論理型が存在しない場合、その定数は −1 の値を持ちます。

  • AT 編集記述子は文字データの出力に使用できます。 文字データは、出力項目の各要素が組み込み関数 TRIM の呼び出しで囲まれているかのように、後続の空白が省略されて出力されます。

    例えば、以下のコードは

            Character(100) :: a(3)
            a(1) = 'o'
            a(2) = 'ka'
            a(3) = 'y'
            Print '(8X,3AT)', a
    
    以下を出力します。
            okay
    
    ここで、後続の空白はありません。

    AT 編集記述子は入力(READ 文)には使用できません。

6 追加の OpenMP サポート

現時点で OpenMP 4.0 および 4.5 は部分的にのみサポートされています。 これには SIMD および TARGET 構造体が含まれ、DO SIMD および TARGET DATA、 および LINEAR 節などの節が含まれます。 OpenMP 4.0 および 4.5 のサポートを完了するための更新が近日中に行われます。

7 追加のエラーチェック

  • FORMAT 文または定数文字列として使用される書式の編集記述子のフィールド幅が、 一部の値の出力に対して小さすぎる可能性がある場合、警告メッセージが発行されます。 例えば、プログラム
        Program na
            Read *,x
            Print 100,x
        100 Format('X has the value ',E9.3)
        End Program
    
    は警告メッセージを生成します
        Warning: na.f90, line 4: In E9.3 the width 9 may be too small for output of some numbers
    
    フィールド幅が有限数の出力に対して小さすぎる場合(IEEE NaN は 3 の幅が必要です)、メッセージはそれを指摘します。例えば、例の E9.3E9.7 に変更すると、警告が生成されます
        Warning: na.f90, line 4: Field width too small for output of finite numbers - the E9.7
            edit descriptor will produce all asterisks
    
    フィールド幅が 3 より小さい場合、メッセージは再び変更されます。例えば、E2.1 の場合、警告は以下のようになります。
        Warning: na.f90, line 4: Field width of 2 for the E edit descriptor will inevitably
            produce all asterisks as output
    
  • デフォルト装置、例えば UNIT=*REC=POS= 指定子が現れるのをコンパイル時にエラーとして検出します。 デフォルト装置はシーケンシャルな書式付きユニットであり、それらの指定子はシーケンシャル入出力と共に使用できません。 例えば、以下のコードをコンパイルすると
            Program badio
                Write(*,'(A)',Rec=999) 'Oops'
            End Program
    
    以下のようなエラーが発生します
            Error: badio.f90, line 2: REC= and UNIT=* are not compatible
    
  • ファイル内の他の場所で要素的であると表示されている手続きを、暗黙のインターフェイスで呼び出すことがコンパイル時にエラーとして検出されます。 例えば、以下をコンパイルすると
            Program c
                Real a(10)
                Call d(a,1.0)
                Print *,a
            End Program
            Elemental Subroutine d(x,y)
                Real,Intent(Out) :: x
                Real,Intent(In) :: y
                x = y
            End Subroutine
    
    以下のようなエラーが発生します
            Error: c.f90: Explicit interface required for ELEMENTAL procedure D referenced from C
    
  • CHANGE TEAM 構造体内で活動状態のチーム変数を変更する最も明白なケースがコンパイル時にエラーとして検出されます。 Fortran 標準は、コンパイラが構造体全体を通じて活動状態のチーム変数を使用できるようにするために、そのような変更を禁止しています。 例えば、以下をコンパイルすると
         Subroutine teamswap(team1,team2)
           Use Iso_Fortran_Env
           Type(team_type),Intent(InOut) :: team1,team2
           Type(team_type) tmp
           Change Team (team2)
             tmp = team1     ! Okay.
             team1 = team2   ! Okay.
             team2 = tmp     ! BAD
           End Team
         End Subroutine
    
    以下のような、エラーメッセージが生成されます
         Error: teamswap.f90, line 8: Variable TEAM2 on left-hand side of assignment statement
                is the active team value for the CHANGE TEAM statement at line 5 of teamswap.f90
    

8 その他の拡張

  • 倍精度および 4 倍精度 RANDOM_NUMBER の低位ビットに完全なエントロピーがあります。 以前のリリースでは、数列に完全なエントロピーがありましたが、低位ビット(倍精度では 21 ビット、4 倍精度では 53 ビット)はランダムではありませんでした。 (これは、各個別の倍精度値に 32 ビット以上のランダム性が必要なシミュレーションにのみ影響します。)

    新しい方法は以前よりもかなり長い時間を要しますが、パフォーマンスは他のコンパイラと競合しています。 古い、より高速な方法は -random=5.3 オプションで選択でき、新しい方法は -random=7.2 オプションで確認できます。 これらのオプションはコンパイルされるファイル内の RANDOM_NUMBER の使用にのみ影響し、異なるオプションでコンパイルされた別々のファイルは結果のプログラムで組み合わされることができます。

  • -gline オプションは、-coarray=cosmp オプションまたは -openmp オプションと共に使用することができます。 CoSMP モードでは、エラー終了を引き起こした像の番号(初期チーム内)が報告されます。例えば、
            ERROR STOP: failatend
            pco391.f90, line 20: Error occurred in PCO391:SUB
            pco391.f90, line 18: Called by PCO391:SUB
            pco391.f90, line 11: Called by PCO391:TEST
            pco391.f90, line 7: Called by PCO391
            Error termination initiated by image 2
    
    OpenMP モードでは、PARALLEL 構造体によって作成されたスレッド番号が報告されます。例えば、
            ERROR STOP: failatend
            suy008.f90, line 19: Error occurred in SUY008:SUB
            suy008.f90, line 17: Called by SUY008:SUB
            suy008.f90, line 10: Thread 8 created by OpenMP PARALLEL construct
            suy008.f90, line 8: Called by SUY008:TEST
            suy008.f90, line 2: Called by SUY008
    
  • 標準行長を超えて延長されたコメントは、標準行長を超えて延長されたステートメントテキストとは別に報告されます。
  • -xldarg オプションは、コマンドライン上の次の引数をリンカフェーズにその位置で渡し、 -Wl, オプションとは異なり、翻訳せずに渡します(-Wl, オプションはカンマ区切りのオプションリストとなります)。

    例えば、

            nagfor a.o -xldarg -pathlist=abc,xyz b.lib
    
    はリンクフェーズで以下のように展開されます。
            gcc a.o -pathlist=abc,xyz b.lib nAG-rts-specifications
    
    しかし以下のように指定した場合は
            nagfor a.o -Wl,-pathlist=abc,xyz b.lib
    
    リンクフェーズで以下のように展開されます。
            gcc a.o b.lib nAG-rts-specifications -pathlist=abc xyz
    
  • -fpplonglines オプションは、fpp プリプロセッサに対して、自由形式で 132 文字を超える出力行を折り返さないように指示します。 これは、fpp の出力を別のツール(例えば fpp プリプロセッサ自体)に渡す場合に便利です。そのツールはトークンが行を超えて続く中で #line ディレクティブを期待していません。
  • -w=longlines オプションは、自由形式の行が Fortran 標準によって許可されている長さを超えている場合の警告を抑止します。これは Fortran 2018 までの 132 文字、および Fortran 2023 の 10000 文字です。

    nAG Fortran コンパイラは任意の長さの自由形式の行を受け入れます。

  • -u=all オプションは、すべての -u= サブオプションがアクティブであることを指定します。 このリリースでは、これは -u=external-u=locality-u=sharing、および -u=type を含みます。
  • -u=external オプションは、IMPLICIT NONE (EXTERNAL) が有効であることを指定します。 これにより、外部および仮手続きは、明示的な引用仕様を持つか、明示的に EXTERNAL 属性を与えられる必要があります。

    例えば、ファイル bad.f90

            Program bad
                Call oops
            End Program
    
    を含んでいる場合、-u=external オプションでコンパイルするとエラーが発生します。
            Error: bad.f90, line 3: External procedure OOPS does not have the EXTERNAL attribute
    
  • -u=locality は、すべての DO CONCURRENT 構造が DEFAULT (NONE) を指定したかのように扱われることを指定します。その局所性指定子は、DO CONCURRENT 構造内で参照されるすべての変数に明示的な局所性を与えることを要求します。

    例えば、ファイル b.f90

        Program b
            Real x(100)
            Do Concurrent(i=1:100)
                x(i) = i**2.0
            End Do
            Print *,x
        End Program
    
    を含んでいる場合、-u=locality オプションでコンパイルするとエラーが発生します
        Error: b.f90, line 4: Locality not specified for X in DO CONCURRENT with DEFAULT(NONE)
    
  • -Warn=double_real_literal オプションは、プログラム内の基本倍精度実数定数表現の存在を報告します。 これらは、D指数文字を持つ実数定数表現です(したがって、種別型パラメタはありません)。 報告は注釈として行われますが、10進数を基本倍精度に変換する際の不正確さが検出された場合は、警告として行われます。 例えば、以下のプログラムでは
        Program dlits
            Print *,123d0
            Print *,0.123d0
        End Program
    
    報告される警告は以下の通りです:
        Note: dlits.f90, line 2: Default double precision literal constant 123D0
        Warning: dlits.f90, line 3: Inexact default double precision literal constant 0.123D0
    

    このオプションは、特定の種別型パラメタを持つことを意図したプログラムで基本倍精度実数定数表現の存在を検出するのに役立つかもしれません。

  • -Warn=unkind_real_literal オプションは、プログラム内で種別指定子がない基本実数定数表現を報告します。 報告は注釈として行われますが、10進数をデフォルトの実数に変換する際の不正確さが検出された場合は、警告として行われます。 例えば、以下のプログラムでは
        Program lits
            Print *,123.0
            Print *,0.123
        End Program
    
    報告される警告は以下の通りです:
        Note: lits.f90, line 2: Real literal constant 123.0 has no kind specifier
        Warning: lits.f90, line 3: Inexact real literal constant 0.123 has no kind specifier
    

    このオプションは、倍精度であること、または特定の種別型パラメタを持つことを意図したプログラムでデフォルト(単精度)の実数定数表現の存在を検出するのに役立つかもしれません。

  • -Error=class オプションは、class の警告メッセージをエラーとして扱うように指定します。 class の値は以下のいずれかでなければなりません(大文字小文字は区別されません):

    Ancient FORTRAN 77の廃止予定で非標準の拡張機能の使用
    Deleted Fortran標準から削除された機能の使用
    Extension Fortran標準への廃止予定の使用
    Obsolescent Fortran標準が廃止予定であると述べている機能の使用
    Questionable プログラミングエラーを示している可能性のある有効だが疑問のある使用法
    Warning 上記以外の警告クラスのメッセージ
    Any_Warning 上記のいずれか。

    -Error=Obsolescent-Error=Deleted を含むことに注意してください、 なぜならすべての削除された機能は以前は廃止予定でした。 また、-Error=Extension-Error=Ancient を含むことに注意してください、 なぜなら古い廃止予定の拡張は拡張です。 また、-Error=Extension-Error=Ancientを含みます。 過去の廃止予定の拡張機能は、現在も拡張機能だからです。

    また、メッセージの接頭辞が変更されないことに注意してください、例えば警告メッセージは依然として ‘Warning:’ で始まりますが、-colour オプションが使用される場合、メッセージの色はエラーとして色付けされます。

  • -strict95 オプションは、‘CHARACTER*’ 構文の使用に対する廃止予定の(警告)メッセージを生成していましたが、現在はデフォルトで有効になっており、無視されます。 代わりに、-nonstrict という新しいオプションがあり、それはこれらのメッセージを抑止し、多相的割付可能成分の成分の宣言された型の拡張である値の宣言された型に関する拡張メッセージも抑止します(これは常に許可されることが意図されていましたが、Fortran 2003の語句の誤りがFortran 2018まで修正されませんでした)。
  • LinuxとWindowsで利用可能な追加の-target=machine オプションがあります。machinenehalem, westmere, sandybridge, ivybridge, haswell, broadwell, skylake, cannonlake, icelake, zen, または native(現在のマシンをターゲットにします)である可能性があります。

  • ポリッシュ(ソース整形)オプション -elcase=X は、指数文字(E または D)に使用するケースを設定します: XAsis, lowercase, UPPERCASE、またはそれらの略語のいずれかでなければなりません; デフォルトは -elcase=UPPERCASE です。 X の解釈は大文字小文字を区別しません(例えば、-elcase=u-elcase=U と同じです)。 -elcase=Asis は基本的なポリッシュ(=polish)でのみ利用可能であり、Enhanced Polish(=epolish)やその他のツール(例:=unifyprecision)では利用できないことに注意してください。

  • ポリッシュ(ソース整形)オプション -canonicalise_floating_literals は、浮動小数点定数表現の正規化を指定します。 浮動小数点リテラルの正規形は常に小数点を持ち、それより前とそれより後に少なくとも1桁があります。 指数文字が E の場合、指数は常に非ゼロです。 指数がある場合、指数文字の後には常に符号が続き、指数値に先行するゼロはありません。 例えば、
            Print *, .1, 1e0, 3d0, 2d-04
    
    は(-elcase=U を使用して)次のように再フォーマットされます:
            Print *, 0.1, 1.0, 3.0D+0, 2.0D-4
    
  • -openmp オプションが使用されると、PolishはOpenMP DO 構造を自動的に終了させ、その本体をインデントします。 例えば、以下をポリッシュ(整形)すると
            !$OMP do
            do i=1,10
            a(i) = i
            end do
    
    以前は以下のように整形されましたが
            !$Omp Do
            Do i=1,10
              a(i) = i
            End Do
    
    現在以下のようになります。
            !$Omp Do
              Do i=1,10
                a(i) = i
              End Do
            !$Omp End Do
    
  • 拡張ポリッシュ(拡張整形)は、引数なしの SUBROUTINE 文とCALL 文に括弧を追加できます。 デフォルトでは、括弧は省略されます(BIND(C) 句を持つ SUBROUTINE 文を除く)。 -subroutine_parens オプションは、括弧を生成します。

    例えば、拡張ポリッシュを -subroutine_parens(他のオプションなしで)とすると

        CALL mysub
    
    整形後は
        Call mysub()
    
    となります。
  • Makefileの依存関係を生成する際、-odir dir オプションは、オブジェクトファイルが異なるディレクトリ(現在の作業ディレクトリではない)に配置されることを指定します。 例えば、“file.f90” に依存するオブジェクトファイルは、単に “file.o” ではなく “dir/file.o” とみなされます。
© 日本ニューメリカルアルゴリズムズグループ株式会社 2024
Privacy Policy  /  Trademarks