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_IMAGEやSTAT_FAILED_IMAGEなどの複数の像の共配列の割付け/割付け解除のエラーをキャッチすることです。 -
[7.1]
組込み関数
ALL、ANY、FINDLOC、IALL、IANY、IPARITY、MAXLOC、MAXVAL、MINLOC、MINVAL、NORM2、PARITY、PRODUCT、及びSUMのDIM引数は実行時に存在する限り、省略可能な仮引数にすることができます。
例)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_TIMEのVALUES引数は、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_LINEのWAIT引数は、任意の種別の論理型です。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.2]
組込みサブルーチン
-
[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と同じ宣言型および型パラメータを持つ、スカラ、非割り付け可能、非ポインター、非多態性の非省略可能変数です。 一方の引数にASYNCHRONOUS、TARGET、またはVALUE属性がある場合、もう一方にもその属性が必要です。 結果は、ARRAYと同じ型および型パラメーターを持つ非多相スカラ変数である必要があります。DIM:1からNの範囲のスカラ整数。ここでNはARRAYの次元数です。MASK:論理型でARRAYと同じ形状のスカラまたは配列IDENTITY:ARRAYと同じ宣言された型と型パラメタを持つスカラ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_ADD、ATOMIC_AND、ATOMIC_CAS、ATOMIC_FETCH_ADD、ATOMIC_FETCH_AND、ATOMIC_FETCH_OR、ATOMIC_FETCH_XOR、ATOMIC_OR、及びATOMIC_XORは、高度な共配列プログラミングで説明されています。 -
[7.1]
個別集約サブルーチン
CO_BROADCAST、CO_MAX、CO_MIN、CO_REDUCE、およびCO_SUMは、高度な共配列プログラミングで説明されています。 -
[7.0]
組込み関数
COSHAPE、EVENT_QUERY、FAILED_IMAGES、GET_TEAM、IMAGE_STATUS、STOPPED_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も組込みモジュールであるため、その使用は拡張機能として診断されます。
