1 概要
nAG Fortranコンパイラ リリース 6.1は小幅なアップデートです。
本リリースの利用にはこのリリースようのライセンスキーが必要です。 (以前のリリースのライセンスキーは使えません)
Kusariライセンス管理についての詳細はKLICENCE.txtをご参照下さい。
1.1 リリース 6.0との互換性について
nAG Fortranコンパイラ リリース 6.1はリリース 6.0と完全互換です。1.2 リリース 5.3.1, 5.3, 5.2との互換性について
nAG Fortranコンパイラ リリース 6.1は“パラメタ化構造型”を使うプログラムを除きリリース 5.3.1と完全に互換性があります。 また、リリース 5.3と5.2とも完全に互換性があります。 (例外としてWindows版でドル記号($)を含むモジュールもしくは手続きは再コンパイルが必要です。)“パラメタ化構造型”を使うプログラムで、 動的な型がパラメタ化構造型になりうる多相変数の割付け、解放、初期化、 複製を行うプログラム部分についてはリリース 6.1で再コンパイルする事が強く推奨されています。
1.3 リリース 5.1との互換性について
nAG Fortranコンパイラ リリース 6.1は以下の点を除きnAGWare f95 リリース 5.1と互換性があります。- プログラムもしくはライブラリでキーワードCLASSを使う場合もしくは型が拡張される場合は再コンパイルが必要です。
- 64-bit環境で-abi=64オプションが指定された場合でNPL6A51NAもしくはNPMI651NAをご利用の場合、 バイナリ非互換となるので再コンパイルが必要です。
1.4 それより前のリリースとの互換性について
以下に示される以外の場合はnAG Fortranコンパイラ リリース 6.1はnAGWare f90 リリース 2.1、2.1及びnAGWare f95 リリース from 1.0 から 5.0と互換性があります。リリース 5.1より以下の非互換性が存在します。
- ALLOCATE文もしくはDEALLOCATE文のcode{STAT=}から戻される値が5.1より前のリリースと異なる場合があります。 これについてのより詳しい情報はF90_STATモジュールのドキュメントをご参照下さい。
- 5.0で型拡張(EXTENDS属性)を用いるプログラムは再コンパイルが必要です。
- IEEEの無限及び非数の書式付き出力が変更されてFortran 2003に準拠するようになりました。
- 浮動小数点ゼロの並び出力がE書式からFortran 2003に準拠するようF書式に変更されました。
- 変数郡名(NAMELIST)の入力でi/oエラーもしくは書式エラーが発生した場合、 エラーが発生したレコードをスキップするようになりました。 この振る舞いは並び入力を含む全ての書式付き入力と同じです。
2 新機能の概要
リリース 6.1はFortran 2003、2008、及び一般的なその他の拡張に含まれるいくつかの新しい機能を含みます。
またこのリリースでは小幅なパフォーマンス改善とその他改善が含まれます。
3 新しいFortran 2003の機能
-
書式指定(FORMAT文及び文字列による書式指定)の丸めモード編集記述子がサポートされました。
この指定によりREAD文もしくはWRITE文が実行される際の入出力丸めモードが変更されます。
文の実行の最後で丸めモードは当該装置のデフォルトに戻されます。
(READ文もしくはWRITE文のROUND=指定子でも同様な事が起こります)
丸めモード編集記述子は以下のとおりです。
- RC
- Round='Compatible'と同等。最も近い値に丸められます — 2つの値が同じ近さの場合にはゼロより遠い値に丸められます。
- RD
- Round='Down'と同等。−∞に近い値に丸められます。
- RN
- Round='Nearest'と同等。最も近い値に丸められます — 2つの値が同じ近さの場合には偶数の方に丸められます。
- RP
- Round='Processor_Dependent'と同等。この丸めモードの振る舞いは標準化されていません。
- RU
- Round='Up'と同等。+∞に近い値に丸められます。
- RZ
- Round='Zero'と同等。よりゼロに近い値に丸められます。
- 入出力丸めモードは入力にも影響するようになりました。
-
構造型の長さ型パラメタがサポートされました。
長さ型パラメタが構造型を使って文字長や配列上下限を得ることができるようになりました。
(成分の種別は得られません)
これらは文字長と同じように振る舞います。つまり
- 長さ型パラメタの値は非定数宣言式であっても良い。
- 仮引数が長さ引継ぎ型パラメタ(‘*’)を持っていても良い。
- 割付け変数及びポインタ変数が無指定長型パラメタ(‘:’)を含んでいても良い。
このリリースではいくつかの制限があります。例えばネストされた構造型両方が長さ型パラメタを持つことはできず、 どちらか一つのみが長さ型パラメタに依存する寸法を持つことができます。 今後これらの制限は取り払われて行く予定です。
4 新しいFortran 2008の機能
-
次元数再割当てポインタ代入は指示先の次元数が2以上で“単純連続”(コンパイル時に容易に判別可能な連続)の場合に許可されます。
例)
Real, Target :: x(100,100) Real, Pointer :: p(:) p(1:Size(x,1)*11) => x(:,20:30) ! A contiguous slice of a contiguous array
-
COMPLEX実体の実数部と虚数部は特定子squote{%RE}及び‘%IM’でそれぞれ参照できます。
例えば
COMPLEX,PARAMETER :: c = (1,2), ca(2) = [ (3,4),(5,6) ]
code{c%re}とc%imはそれぞれ1と2の値を持ちます。 ca%reとca%imはそれぞれ配列で[ 3,5 ]と[ 4,6 ]です。 変数の場合は実数部と複素数部に直接代入する事ができます。 例えばCOMPLEX :: v, va(10)
という変数でva%im = 0
とするとvaのすべての成分の虚数部がゼロになります。(実数部は影響を受けない) -
ISO_C_BINDING組込みモジュール内のC_LOC関数の引数は形状引継ぎ配列、配列ポインタであっても良く、
また文字長が1よりも大きくても問題ありません。
例えば以下の例で
Subroutine s(a) Character(*),Target :: array(:) Type(C_ptr) cp cp = C_loc(array)C_LOCへの参照はarrayが実行時に連続であれば問題ありません。 -
FORALL構文は最初の文で省略可能な型指定子が指定可能です。これにより指標変数の型(INTEGERでなければならない)と種別が指定可能です。
この指定が行われた場合有効範囲外に存在する(あるいは存在しない)同じ名前を持つ要素は指標変数の影響を全く受けなくなります。
例)
Complex i(100) Real x(200) ... Forall (Integer :: i=1:Size(x)) x(i) = i
-
DO CONCURRENT構文は制限付きのDOループであり効率的な実行を可能とします。
DO CONCURRENT構文の反復はどのような順序で実行されても良いものです。(並列に行われても良い)
ループ指標変数は構文内の局所的なものです。
DO CONCURRENTのヘッダ部分はFORALLと似ています。 (明示的に反復指標変数の型や種別やスカラ制御配列を指定できる点等)
DO CONCURRENT構文の制限は以下のとおりです。
- 構文内から構文外への分岐は許されません。 これにはRETURN文とSTOP文が含まれますがERROR STOP文は含まれません。
- EXIT文でループを終了させる事はできません。
- CYCLE文は外側ループを参照できません。
- ループ反復間で依存関係があってはなりません。 もしも変数への代入が反復で行われる場合、他の反復でこの変数を参照できません (他の反復でこの変数の参照前に代入を行う場合はこの限りではありません)
- 構文内で参照されるすべての手続きは純粋でなければなりません。
- IEEE_GET_FLAGもしくはIEEE_SET_HALTING_MODEの参照は許されません。
例)
Integer vsub(n) ... Do Concurrent (i=1:n) ! Safe because vsub has no duplicate values. x(vsub(i)) = i End Do - 要素別組込み関数 BESSEL_J0, BESSEL_Y0, BESSEL_J1 及び BESSEL_Y1 はベッセル関数 J0, Y0, J1 及び Y1 をそれぞれ計算します。 これらの関数はベッセルの微分方程式です。 J関数は第一種、Y関数は第二種をそれぞれ示しそれに続く添字は(0もしくは1)はオーダーを表します。 引数Xは実数型でなければならず、関数の結果はそれと同じ型及び種別となります。 第二種の関数(BESSEL_Y0 及び BESSEL_Y1)では引数Xは正でなければなりません。 例) BESSEL_J0(1.5) は大凡 0.5118276, BESSEL_Y0(1.5) は大凡 0.3824489, BESSEL_J1(1.5) は大凡 0.5579365, BESSEL_Y1(1.5) は大凡 -0.4123086
-
組込み関数BESSEL_JN 及び BESSEL_YN
はベッセル関数Jn 及び Yn をそれぞれ計算します。
これらの関数は要素別と変形の2つの形式を持ちます。
要素別の形式である場合、2つの引数を持ちます。Nは計算する関数のオーダーを指定し、 X, はベッセル関数の引数を指定します。 BESSEL_JN(0,X) は BESSEL_J0(X)等と同等です。
変形の形式である場合、N1, N2 及び X の3つの引数を持ちます。 結果は大きさMAX(N2-N1+1,0)でオーダーN1からN2が適用されたベッセル関数 X のベクトルとなります。
例) BESSEL_JN(5,7.5) は大凡 0.283474, BESSEL_YN(5,7.5) は大凡 0.175418, BESSEL_JN(3,5,7.5) は大凡 [ -0.258061, 0.023825, 0.283474 ], BESSEL_YN(3,5,7.5) は大凡 [ 0.159708, 0.314180, 0.175418 ]
-
標準組込みモジュールISO_FORTRAN_ENVは以下の関数を含みます。
COMPILER_VERSION.
この関数は純粋で引数を持ちません。
結果としてソース・ファイルをコンパイルする際に用いられたコンパイラのバージョンを識別するスカラ基本文字列を返します。
この関数は変数や名前付き定数の初期化等を含む定数式で用いる事が可能です。
例)
Module version_info Use Iso_Fortran_Env Character(Len(Compiler_Version())) :: compiler = Compiler_Version() End Module Program show_version_info Use version_info Print *,compiler End ProgramnAG Fortran Compiler 6.1では以下の様な出力がなされます。nAG Fortran Compiler Release 6.1(Tozai) Build 6105
-
標準組込みモジュールISO_FORTRAN_ENVは関数COMPILER_OPTIONSを含みます。
この関数は純粋で引数を持ちません。
結果としてソース・ファイルをコンパイルする際に指定したコンパイルオプションを識別するスカラ基本文字列を返します。
この関数は変数や名前付き定数の初期化等を含む定数式で用いる事が可能です。
例)
Module options_info Use Iso_Fortran_Env Character(Len(Compiler_Options())) :: compiler = Compiler_Options() End Module Program show_options_info Use options_info Print *,compiler End Programコンパイルオプション-C=array -C=pointer -Oでコンパイルされた場合、 例えば以下の様な出力をします。-C=array -C=pointer -O
5 その他の拡張
- -dustyオプションはFORMAT文で必須なカンマが指定されていない事に対して 警告メッセージを発するようになりました。(以前までは文法エラー) 例として文字列に引き続いてカンマ無しで編集記述子が指定された場合があります。
-
ATAN, ATAN2, DIM, MOD,及びMODULO
組込み関数で異なる種別のREAL引数が利用可能です。
(異なる種別のINTEGER引数に対するATAN及びATAN2は除く)
同じ組込み関数の参照でINTEGERとREAL引数の混在は許されていません。
結果の種別は種別混合算術と同様となります。(INTEGERの場合は最も広い範囲を表現可能な種別、
REALの場合は最も精度の高い種別となります)
例)
Subroutine s(a,b) Use Iso_Fortran_Env Real(Real32) a Real(Real64) b Print *,Mod(a,b) End Subroutineこの例は、すべてをReal(Real64)へ変換した後にa及びbの剰余を出力します。 つまりMod(Real(a,Real64),b)と同じ値を出力します。 -
SIGN組込み関数は異なる種別のINTEGERもしくはREAL引数に利用可能です。
本機能はFortran 2015標準の草案に含まれます。
同じ組込み関数の参照でINTEGERとREAL引数の混在は許されていません。 結果の種別は第一引数(結果の大きさを指定)と同じです。 第二引数(結果の符号のみを指定)の種別は結果の種別に影響を及ぼしません。
例)
Subroutine s(a,b) Use Iso_Fortran_Env Real(Real32) a Real(Real64) b Print *,Sign(a,b) End Subroutineこのコードは大きさがaで符号がbのReal(Real32)の値を出力します。 これはSign(a,Real(Sign(1.0_Real64,b),Real32))と同じ値です。 -
ERROR STOP文が純粋副プログラムでも許されるようになりました。
この機能はFortran 2015標準の草案に含まれます。
このようにERROR STOPを使えることは純粋手続きから賢明なエラーメッセージを出力できることにつながります。
以下に例を示します。
Pure Integer Function f(n) Integer,Intent(In) :: n If (n==0) Error Stop 'n is equal to zero' f = Huge(f)/n End Function
6 追加された診断機能
- 明示的な引用仕様がある場合、実引数が文字関数でその長さが仮引数のものと異なる場合にエラーとして検出されるようになりました。 (引継ぎ文字長仮引数はどの長さであってもエラーとはならないが、 可変文字長文字関数の場合は実引数と仮引数が共に可変文字長でなければならない)
- 組込みモジュールISO_C_BINDINGのC_LOC関数に大きさゼロの配列を引数として渡した場合、 コンパイル時と実行時(-C=arrayオプションを指定した場合)にエラーとして検出されるようになりました。
- NOPASS属性を持つ型束縛手続を配列実体経由で参照した場合にエラーとして検出されるようになりました。 これはFortran 2003の訂正1(解釈要請 F03/0016)で追加され、Fortran 2008の制約(C1230)です。
- SIGN組込み関数の整数オーバーフローがコンパイル時と実行時(-C=intovfオプションを指定した場合)に検出されるようになりました。 整数オーバーフローはSIGNの第一引数が当該種別の整数で最も小さい負の数(-1_kind-HUGE(0_kind))で、 第二引数が負の数ではない場合に発生します。
- -C=arrayオプションで行われる要素別処理サブルーチン呼び出し時の形状診断で、引数の幾つかが変数ではなく式である場合に、 診断の信頼性が高まりました。特にこの機能は要素別利用者定義代入において有効となりました。
7 その他の改善
- コメントの折り返しについての設定が行えるように、 ソース整形ツール(“nagfor =polish”におり実行される)に以下の2つのオプションが追加されました。 -nowrap_commentsオプションは、コメントをインデントする際に最大行幅を超えてしまう場合でも折り返しません。 本オプションは例えばコメントがアスキーアートであるような場合等に有効です。 -wrap_commentsオプションはデフォルトの動作です。 このオプションによりコメントは以前までのリリースと同様に折り返されます。
-
ソース整形ツールに新たに-align_right_continuationオプションが追加され、
継続行末の継続文字(アンパサンド)の右整列が行えるようになりました。(インラインコメントがない行のみ)
デフォルトの動作ではこの整列は行いません。
またこの確認のために-noalign_right_continuationオプションを指定することも可能です。
行末の継続文字(アンパサンド)にトークン間のスペース配置に関する取り決め以外の特殊な処理は適用されません。
以下に -align_right_continuation -width=50) を指定した場合の例を示します。
Program align_example Real :: square_root_of_two = sqrt(2.0) Print *, 'The difference is', & square_root_of_two*square_root_of_two - & 2.0000 End Program align_example -
新たにソース整形ツールオプション-character_decl=styleが追加され、文字宣言のスタイルを指定できるようになりました。
style引数は以下のいずれかでなければなりません。
- Asis
- スタイルの変更を行いません。これがデフォルトの動作です。 例外として-kind_keyword=オプションが指定された場合は、そのオプションに従います。
- Keywords
- 長さが出現する場合にその宣言にLEN=を使い、 種別が出現する場合にその宣言をKIND=を使って行います。
- Kind_Keyword_Only
- 種別が出現する場合にその宣言をKIND=を使って行いますが、長さについてLEN=を省略します。
- No_Keywords
- キーワードを用いた長さ及び種別の宣言を行いません。
例えば以下の入力が与えられた場合
Character*7 seven Character(Kind=iso_10646,Len=:),Allocatable :: name出力は以下のようになります。-character_decl=Asisの場合:
Character *7 seven Character (Kind=iso_10646, Len=:), Allocatable :: name-character_decl=Keywordsの場合:Character (Len=7) seven Character (Len=:, Kind=iso_10646), Allocatable :: name-character_decl=Kind_Keyword_Onlyの場合:Character (7) seven Character (:, Kind=iso_10646), Allocatable :: name-character_decl=No_Keywordsの場合:Character (7) seven Character (:, iso_10646), Allocatable :: name -
新たにソース整形オプション-commas_in_formats=Xが追加されて、
FORMAT文内の省略可能なカンマの指定が行えるようになりました。
Xは以下のいずれかである必要があります。
- Asis
- 入力FORMAT文は省略可能なカンマについて変更されません。
- Insert
- FORMAT文の挿入可能な箇所すべてにカンマを挿入します。 これがデフォルトの動作です。
- Remove
- すべての省略可能なカンマはFORMAT文から削除されます。
100 Format (1P1F2.1, 1X/, :1P, E2.1)
出力は以下のようになります。-commas_in_formats=Asisの場合:
100 Format (1P1F2.1, 1X/, :1P, E2.1)
-commas_in_formats=Insertもしくは -commas_in_formatsオプションが指定されなかった場合:100 Format (1P, 1F2.1, 1X, /, :, 1P, E2.1)
-commas_in_formats=Removeの場合:100 Format (1P1F2.1, 1X/:1PE2.1)
- 四倍精度精度版の組込み関数ATANH及びTANHの精度が改善されました。
- 四倍精度精度版の組込み関数EXP及びLOGのパフォーマンスが改善されました。
-
引用仕様生成ツール(“nagfor =interfaces”)で副プログラムの入口名の引用仕様宣言が生成できるようになりました。
また、本ツールは不必要な(しかしながら無害な)引用仕様宣言を出力しないようになりました。
例えば以下のコードに対して
Subroutine sub(a) Real, Intent (In) :: a, b Print *, a Return Entry entry(b) Print *, b**2 Return End Subroutine
以下のような形式の引用仕様モジュールが生成されます。Module interfaces ! Interface module generated on ... Interface Subroutine entry(b) Real, Intent (In) :: b End Subroutine Subroutine sub(a) Real, Intent (In) :: a End Subroutine End Interface End Module -
トレース可能なメモリ割付けの仕組みを利用している場合には、
環境変数nAGFORTRAN_MTRACE_OPTIONSで割り付けられるトータルメモリ量を制限することが可能です。
‘limit=N’オプションは割り付けられる最大メモリ量をN MiB (メビバイト)に制限します。
この際プログラムはトレースオプションを指定して(最低限の指定は-mtrace=off)コンパイルされている必要があります。
メモリ制限を超えた場合には通常の“メモリ不足”と同じ状況になります。この状況は
ALLOCATE分で発生する可能性があり、STAT=節で捕捉可能です。
メモリ制限は自動変数及びコンパイラが一時的に生成する配列などを含んだトータルメモリ量に対して適用される事に注意して下さい。
例えば以下のプログラムで
Program big Real,Pointer :: x(:,:,:) Allocate(x(100,1024,1024)) x = 1 Print *,Sum(x) End Program環境変数nAGFORTRAN_MTRACE_OPTIONSに‘size,limit=50’と指定した場合、 以下の様な出力が得られます。[Allocated item 1 (size 65537) = Z'2430010'] [Allocated item 2 (size 65537) = Z'2440030'] [Allocated item 3 (size 65537) = Z'2450050'] [Allocation (size 419430384) at line 3 of big.f90 failed - memory limit (50 MiB) exceeded] Runtime Error: bigalloc.f90, line 3: ALLOCATE failed: Out of memory Program terminated by fatal error [Deallocated item 2 (size 65537, at Z'2440030')] [Deallocated item 3 (size 65537, at Z'2450050')] [Deallocated item 1 (size 65537, at Z'2430010')]
- 精度一元化ツールが新たに追加されました。 本ツールはFortranソース・ファイルの浮動小数点及び複素数の要素を一元化します。 本ツールは“nagfor =unifyprecision”を指定することにより利用可能です。
- fppのFortranファイルのプリプロセスを行う場合、 マクロ__nAG_COMPILER_RELEASEがコンパイラのリリース番号を表す整数として定義されます。 例えばリリース 6.1 (Tozai)の場合61が定義されます。 同様に、マクロ__nAG_COMPILER_BUILDにはビルド番号が定義されます。 リリース 6.1では6100よりも大きな値が定義されます。
