JIS X 3001-1:2009 プログラム言語Fortran―第1部:基底言語 | ページ 87

                                                                                                  417
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
INTERFACE GOOD7
SUBROUTINE S7A(X,Y,Z)
CLASS(PEAR) :: X,Y,Z
END SUBROUTINE S7A
SUBROUTINE S7B(X,Z,W)
CLASS(FRUIT) :: X
CLASS(BOSC) :: Z
CLASS(APPLE),OPTIONAL :: W
END SUBROUTINE S7B
END INTERFACE GOOD7
最も一般的な型を見ると,S7A は最少 かつ 最多で三つの FRUIT 型の引数をもっている。同じく,S7B は最少で二
つ,最多で三つの引数をもっている。最も個別の型を見ると,S7A は最少でゼロ,最多で三つの BOSC 型の引数をもっ
ている。同じく,S7B は最少で一つ,最多で二つの引数をもっている。しかし,中間の型を見ると,S7A は最少 かつ
最多で三つの PEAR 型の引数をもっている。同じく,S7B は最少で一つ,最多で二つの引数をもっている。S7A の最少
は S7B の最多を超しているので,これらは区別できる。
特定の性質をもつ最少数の引数を識別するのに,省略可能な引数を除外し,TKR 適合性を調べる。このために,対
応する実引数は,それらの性質をもつ必要がある。特定の性質をもつ最多数の引数を識別するのに,省略可能な引数
をもち,区別できないことを調べる。このため,もつ必要のないそれらの性質をもつ実引数を含める。
これらの規則は,それらに一致する手続の引用が明白であることを保証するのに十分である。しかし,明白である
ことを示すことができるにもかかわらず,これらの規則が適用できない例もある。
INTERFACE BAD8 ! この引用仕様は正しくない。
! あいまいではないという事実があるにもかかわらず。
SUBROUTINE S8A(X,Y,Z)
REAL,OPTIONAL :: X
INTEGER :: Y
REAL :: Z
END SUBROUTINE S8A
SUBROUTINE S8B(X,Z,Y)
INTEGER,OPTIONAL :: X
INTEGER :: Z
REAL :: Y
END SUBROUTINE S8B
END INTERFACE BAD8
この引用仕様は,規則 (3) に適合しない。なぜならば,位置の対応によって区別できる必要な引数がないからであ
る。しかし,省略可能な引数の不一致を無関係にするために,後ろの引数は,引数キーワードで指定しなければなら
ず,名前による区別は,うまく機能する。この引用仕様は正しくないにもかかわらず,規格合致 Fortran 処理系は,そ
のような理由付けをすることを要求されない。すべての場合に対応する規則は,利用するには複雑すぎる。
BAD8 の第 1 の引数のような区別可能な形式を認識しないのに加えて,規則では,型,種別型パラメタ 及び 次元数
以外のどんな性質に基づく区別もしない。
INTERFACE BAD9 ! この引用仕様は正しくない。
! あいまいではないという事実があるにもかかわらず。
SUBROUTINE S9A(X)
REAL :: X
END SUBROUTINE S9A
SUBROUTINE S9B(X)
INTERFACE
FUNCTION X(A)
REAL :: X,A

――――― [JIS X 3001-1 pdf 431] ―――――

  418
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
END FUNCTION X
END INTERFACE
END SUBROUTINE S9B
SUBROUTINE S9C(X)
INTERFACE
FUNCTION X(A)
REAL :: X
INTEGER :: A
END FUNCTION X
END INTERFACE
END SUBROUTINE S9C
END INTERFACE BAD9
S9A の正しい引数である実数のデータ実体は,S9B 及び S9C の正しい引数である手続とは完全に分離している。ま
た,S9B の正しい引数である手続は,S9C の正しい引数である手続とも分離している。なぜならば,前者は実数の引数
を,後者は整数の引数を必要としているからである。繰返しになるが,この引用仕様は正しくなく,規格合致 Fortran
処理系は,総称の集合が正しいかどうかを決めるときに,このような性質を検査する必要はない。重ねて,すべての
場合に対応する規則は,利用するには複雑すぎる。
C.12 配列機能の注記
C.12.1 機能のまとめ
ここでは,主要な配列機能をまとめる。
C.12.1.1 全体配列の式 及び 代入(7.4.1.2 及び 7.4.1.3 参照)
新しい重要な機能は,全体配列の式及び 代入が許されるようになったことである。例えば,A,B,C 及び D が同
じ形状の配列であるとき,
A = B + C * SIN (D)
という文を書くことができる。この解釈は要素ごとに行われる。すなわち,D の各要素に対して正弦関数が適用され,
それぞれの結果は対応する C の要素と掛け合わされ,対応する B の要素に加えられて,対応する A の要素に代入さ
れる。関数(利用者が書いた関数を含む。)は,配列値であってよい。更に,スカラの版と総称的であってよい。すべ
ての配列は,式中で 又は 代入文の左右で形状適合しなければならない。すなわち,厳密に同じ形状(次元数 及び 各
次元の寸法)でなければならない。ただし,スカラはどこに含んでもよい。スカラは,形状適合する配列に配布され
たものとして解釈される。式の評価は,代入に先立って行われる。
C.12.1.2 部分配列(2.4.5 及び 6.2.2.3 参照)
全体配列が使用できるときはいつでも,部分配列も使用できる。例えば,
A (:, 1:N, 2, 3:1:-1)
という部分配列は,第 1 次元のすべての位置,第 2 次元の 1 から N までの位置,第 3 次元の 2 の位置,及び 第 4 次
元の 1 から 3 までの位置を逆順に含む。この例は,いろいろな形を説明するための作為的なものである。普通は,次
の例のように配列の行 又は 列を選ぶために使う。
A (:, J)
C.12.1.3 WHERE 文(7.4.3 参照)
WHERE 文は,形状適合する論理配列を使って,式中 及び 代入の個々の演算を選別するのに用いる。例えば,
WHERE (A > 0) = LOG (A)
は,A の正の成分だけの対数を求め,正の成分の位置においてだけ代入を行う。WHERE 文には,ブロックの形(WHERE
構文)もある。

――――― [JIS X 3001-1 pdf 432] ―――――

                                                                                                  419
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
C.12.1.4 自動割付け配列 及び 割付け変数(5.1 及び 5.1.2.5.3 参照)
ソフトウェアのモジュール化に寄与する二つの有用な機能は,自動割付け配列 及び 割付け配列を含む割付け変数
ができたことである。自動割付け配列は,サブルーチンの入口で生成し,戻る時に消去する。割付け配列は,次元数
が固定される。しかし,実際の大きさ及び 生存期間は,明示的な ALLOCATE 文 及び DEALLOCATE 文によって
プログラマが完全に制御できる。
SUBROUTINE X (N, A, B)
REAL WORK (N, N); REAL, ALLOCATABLE :: HEAP (:, :)
という宣言は,自動割付け配列 WORK 及び 割付け配列 HEAP を定義する。
注記 自動割付け配列の実現に適する記憶域の仕組みは,スタックであろう。割付け変数のためには,ヒープ
が必要となるであろう。
C.12.1.5 配列構成子(4.7 参照)
配列(特に配列定数)は,次の例に示すような配列構成子によって構成できる。
(/ 1.0, 3.0, 7.2 /)
これは,大きさが 3 の 1 次元配列となる。
(/ (1.3, 2.7, L = 1, 10), 7.1 /)
これは,大きさが 21 の 1 次元配列になり,実定数 1.3 と 2.7 との組を 10 回繰り返した列に 7.1 を付け加えたも
のになる。
(/ (I, I = 1, N) /)
は,整数 1, 2, . . . , N になる。この方法は,1 次元配列だけを構成できる。2 次元以上の配列は,組込み関数 RESHAPE
を用いて構成することができる。
C.12.2 例
配列機能によって,配列を使用するプログラムのほとんどは,考えたり書いたりするのが簡単になった。今や配列
を含んでいるアルゴリズムの多くは,全体配列の一連の計算として便利に書くことができる。
C.12.2.1 無条件の配列計算
最も簡単な例として,
A = B + C
S = SUM (A)
などの文は DO ループ全体の代わりができる。今までは,配列の加算,配列要素の合計などをするのにループが必要
になっていた。
更に,簡単に書ける無条件の配列演算の例を示す。
行列積 P = MATMUL (Q, R)
配列要素の最大値 L = MAXVAL (P)
N の階乗 F = PRODUCT ((/ (K, K = 2, N) /))
N
フーリエ級数 F = i=1ai × cos xi も,配列式が要素ごとに計算されるという性質(箇条 7 参照)を用いれば,DO
ループを書かずに計算することができる。つまり,次のように書くことができる。
F = SUM (A * COS (X))
このとき,F の計算における各段階は,次の配列になっている。
A = (/ A(1), ..., A(N) /)
X = (/ X(1), ..., X(N) /)
COS(X) = (/ COS(X(1)), ..., COS(X(N)) /)
A * COS(X) = (/ A(1) * COS(X(1)), ..., A(N) * COS(X(N)) /)

――――― [JIS X 3001-1 pdf 433] ―――――

  420
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
最後のスカラの結果は,この最後の段階の配列要素を合計して簡単に得られる。このように,処理系は計算の各段
階で配列を処理している。
C.12.2.2 条件付き配列計算
上の例のフーリエ級数において,ここでは,係数 ai の絶対値が 0.01 より小さいという条件を満たす項 ai cos xi だ
けの総和を計算したいとする。正確には,次の条件付きフーリエ級数を計算する。
CF = ai × cos xi
|ai |<0.01
ここで,i は,前例と同じく 1N の範囲を動く。
この式の値は,組込み関数 SUM の引数 MASK を使って計算できる。引数 MASK で,配列 A*COS(X) の要素のうち選
別式が真となる要素だけに限定する。正確には,選別式として論理配列式 ABS(A)
< 0.01 を指定する。この式の評
価の段階を次に示す。
A = (/ A(1), ..., A(N) /)
ABS(A) = (/ ABS(A(1)), ..., ABS(A(N)) /)
ABS(A) < 0.01 = (/ ABS(A(1)) < 0.01, ..., ABS(A(N)) < 0.01 /)
したがって,求める条件付きフーリエ級数は,次のように書ける。
CF = SUM (A * COS (X), MASK = ABS (A) < 0.01)
選別式がすべて偽のときは,CF の値はゼロになる。
配列の部分集合を定義する選別式は,WHERE 文の動作においても重要である。例えば,配列全体にゼロを代入す
るには,単に A= 0 と記述すればよいが,値が負の要素に対してだけゼロを代入するには,次の条件付き代入文を書
かなければならない。
WHERE (A .LT. 0) A = 0
WHERE 文を使うと,通常の配列代入文を補って,論理式によって限定しうるような配列の任意の部分集合への代
入が可能となる。
C.12.2.3 に示すイジング模型で,WHERE 文が通常の配列代入文より優れていることを示す。
C.12.2.3 簡単なプログラム(イジング模型)
イジング模型 (Ising model) は,3 次元ユークリッド空間内のモンテカルロシミュレーションとして知られていて,
ある種の物理学の研究に役立つ。これがどのようなプログラムになるか考えてみる。この模型は,形状が (N, N, N) の
論理型配列として記述できる。それぞれの格子点の状態を一つの論理変数で表し,真を上向きスピン,偽を下向きス
ピンとみなす。
イジング模型は,状態が次々に遷移することによって働く。次の状態への遷移は,局所的な確率過程に従う。1 回
の遷移で,すべての格子点の状態が同時に遷移する。ある格子点のスピン状態は,それを取り囲む 6 個の隣接格子点
の状態だけに依存するある規則に従って,反転するか否かが決まる。立方体の模型の境界面上の格子点では,隣接格
子点は,3 次元の周期性を仮定して定義される。その結果,格子は,すべての方向に周期的に複製され,空間全体に
拡張される。
状態遷移の規則は,次のとおりである。6 個の隣接格子点のうち,その格子点と同じスピンをもつものの個数が 3
個以下である場合は,その格子点のスピンは反転する。同じスピンをもつものの個数が 4 個,5 個 又は 6 個である場
(この規則は,長く動作させると隣接する格子点
合は,それぞれ P(4),P(5) 又は P(6) の確率でスピンが反転する。
の状態が均等になるように働く。)
C.12.2.3.1 解くべき問題
イジング模型を,全体配列を使った Fortran の文に翻訳するために解決すべき問題を次に示す。
(1) 同じスピンをもつ隣接格子点を数える。

――――― [JIS X 3001-1 pdf 434] ―――――

                                                                                                  421
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
(2) 乱数の配列を返す配列関数を用意する。
(3) どの格子点を反転すべきかを決定する。
C.12.2.3.2 Fortran による解
計算に必要な配列を次に示す。
LOGICAL ISING (N, N, N), FLIPS (N, N, N)
INTEGER ONES (N, N, N), COUNT (N, N, N)
REAL THRESHOLD (N, N, N)
計算に必要な配列関数を次に示す。
FUNCTION RAND (N)
REAL RAND (N, N, N)
状態遷移の確率は,配列で次のように指定する。
REAL P (6)
まず,それぞれの格子点 g に対して,g と同じスピンをもつ隣接格子点の個数を求める。
配列 ISING が与えられたと仮定すると,次の文
ONES = 0
WHERE (ISING) ONES = 1
によって,ISING をそっくりそのまま反映し,上向きスピンは 1,下向きスピンは 0 とした配列 ONES を求めること
ができる。
次に,ISING のすべての格子点に対して,6 個の隣接格子点のスピンの計数を配列 COUNT に求める。COUNT は,隣
接格子点の相対位置を表現した 6 個の配列の和で計算する。6 個の配列は,それぞれ配列 ONES をある次元に沿って 1
要素分だけ循環移動することで得られる。
COUNT = CSHIFT (ONES, SHIFT = -1, DIM = 1) &
& + CSHIFT (ONES, SHIFT = 1, DIM = 1) &
& + CSHIFT (ONES, SHIFT = -1, DIM = 2) &
& + CSHIFT (ONES, SHIFT = 1, DIM = 2) &
& + CSHIFT (ONES, SHIFT = -1, DIM = 3) &
& + CSHIFT (ONES, SHIFT = 1, DIM = 3)
このとき COUNT は,イジング模型の格子点が下向きスピンをもつ場合でも,上向きスピンをもつ隣接格子点の個数
を求めたことになる。しかし,下向きスピンをもつ格子点に対しては,下向きスピンをもつ隣接格子点の個数を求め
なければならないので,次の文で COUNT を修正する。
WHERE (.NOT. ISING) OUNT = 6 - COUNT
これらの “同じ状態の隣接格子点” の個数を使って,どの格子点を反転すべきかを決定する。この決定は,配列 FLIPS
の要素を真にすることで表す。反転は,区間 0 p < 1 の一様乱数に基づいて決定する。それぞれの格子点に対して,
乱数を配列関数 RAND で与える。格子点の状態は,与えられたしきい値より乱数の値が小さいときに反転する。格子
点の同傾向隣接格子点が 3 個以下である場合は,しきい値を 1 にして,その格子点を必ず反転させる(乱数 p は常に
1 より小さい。)。格子点の同傾向隣接格子点が 4 個,5 個 又は 6 個である場合は,しきい値をそれぞれ P(4),P(5)
又は P(6) にして,その格子点を望みの確率で反転させる( P(4),P(5) 及び P(6) は,01 の範囲の値をもつ引数
とする。)。
しきい値の計算は,次の文で得られる。
THRESHOLD = 1.0
WHERE (COUNT == 4) HRESHOLD = P (4)
WHERE (COUNT == 5) HRESHOLD = P (5)
WHERE (COUNT == 6) HRESHOLD = P (6)

――――― [JIS X 3001-1 pdf 435] ―――――

次のページ PDF 436

JIS X 3001-1:2009の引用国際規格 ISO 一覧

  • ISO/IEC 1539-1:2004(IDT)

JIS X 3001-1:2009の国際規格 ICS 分類一覧

JIS X 3001-1:2009の関連規格と引用規格一覧

規格番号
規格名称