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

  422
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
反転すべきスピンは,次の文で得られる。
FLIPS = RAND (N) <= THRESHOLD
イジング模型を次の状態に遷移させるために残ったのは,FLIPS の真に対応して ISING のスピンを反転させる処理
だけである。
WHERE (FLIPS) ISING = .NOT. ISING
C.12.2.3.3 Fortran サブルーチンの全容
イジング模型の一連の状態遷移を,完結したサブルーチンの形で次に示す。
SUBROUTINE TRANSITION (N, ISING, ITERATIONS, P)
LOGICAL ISING (N, N, N), FLIPS (N, N, N)
INTEGER ONES (N, N, N), COUNT (N, N, N)
REAL THRESHOLD (N, N, N), P (6)
DO I = 1, ITERATIONS
ONES = 0
WHERE (ISING) ONES = 1
COUNT = CSHIFT (ONES, -1, 1) + CSHIFT (ONES, 1, 1) &
& + CSHIFT (ONES, -1, 2) + CSHIFT (ONES, 1, 2) &
& + CSHIFT (ONES, -1, 3) + CSHIFT (ONES, 1, 3)
WHERE (.NOT. ISING) OUNT = 6 - COUNT
THRESHOLD = 1.0
WHERE (COUNT == 4) HRESHOLD = P (4)
WHERE (COUNT == 5) HRESHOLD = P (5)
WHERE (COUNT == 6) HRESHOLD = P (6)
FLIPS = RAND (N) <= THRESHOLD
WHERE (FLIPS) ISING = .NOT. ISING
END DO
CONTAINS
FUNCTION RAND (N)
REAL RAND (N, N, N)
CALL RANDOM_NUMBER (HARVEST = RAND)
RETURN
END FUNCTION RAND
END
C.12.2.3.4 記憶場所の削減
(やや分かりにくくはなるが,
配列 ISING は, )模型を常に ONES で表すことで削除できる。配列 FLIPS は,次に示
すように 2 個の文を結合することで削除できる。
WHERE (RAND (N) <= THRESHOLD) SING = .NOT. ISING
しかし,一時的な配列が余分に必要となるであろう。このように,全体配列の操作では,記憶場所を節約できる範
囲は限られている。N の値が小さい場合は,これは問題にならず,全体配列操作の使用によってよい実行速度を得ら
れると考えられる。N の値が大きい場合は,記憶場所の問題は重要になり,操作を平面ごとに行うことによって,お
そらく十分な効率が得られる。プログラムの美しさは損なわれるが,ISING 以外の配列の大きさは,N3 の程度だった
のを N2 の程度にできる。
C.12.3 数式の翻訳 及び 配列処理
配列処理機能を使うと,多くの数式は,直接 Fortran の式に変換できる。
C.12.3.1C.12.3.9 では,次の配列の宣言がしてあるものとする。

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

                                                                                                  423
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
REAL X (N), A (M,N)
幾つかの数式及び それに対応する Fortran の式の例を,次に示す。
C.12.3.1 積の和

N M
aij
j=1 i=1
は,Fortran では次のとおりに記述できる。
SUM (PRODUCT (A, DIM=1))
B C D
PRODUCT の引数 DIM=1 は,配列 A の各列内で縦に乗算することを指定する。A が配列 であると
E F G
き,SUM(PRODUCT(A,DIM=1)) の結果は,BE + CF + DG になる。
C.12.3.2 和の積

M
N
aij
i=1 j=1
は,Fortran では次のとおりに記述できる。
PRODUCT (SUM (A, DIM = 2))
B C D
SUM の引数 DIM=2 は,配列 A の各行内で横に加算することを指定する。A が配列 であるとき,
E F G
PRODUCT(SUM(A,DIM=2)) の結果は,(B + C + D) * (E + F + G) になる。
C.12.3.3 選択要素の加算

xi
xi >0.0
は,Fortran では次のとおりに記述できる。
SUM (X, MASK = X > 0.0)
MASK は,1 次元配列中の正の要素を選別する。X がベクトル (0.0, −0.1, 0.2, 0.3, 0.2, −0.1, 0.0) であるとき,SUM(X,
MASK=X>0.0) の結果は,0.7 になる。
C.12.4 残差平方和

N
(xi − xmean )2
i=1
は,Fortran では次のとおりに記述できる。
XMEAN = SUM (X) / SIZE (X)
SS = SUM ((X - XMEAN) ** 2)
結果の SS は,残差平方和になる。
C.12.5 ベクトルのノルム(無限大ノルム 及び 1 ノルム)
ベクトル X = (X(1), . . . , X(N)) の無限大ノルム(最大値ノルム)は,ABS(X(1)), . . . , ABS(X(N)) の最大値であ
るので,MAXVAL(ABS(X)) の値になる。
ベクトル X の 1 ノルムは,ABS(X(1)), . . . , ABS(X(N)) の和であるので,SUM(ABS(X)) の値になる。

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

  424
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
C.12.6 行列のノルム(無限大ノルム 及び 1 ノルム)
行列 A = (A(I,J)) の無限大ノルムは,行列 ABS(A(I,J)) の行和の最大値であるので,MAXVAL(SUM(ABS(A),DIM=2))
の値になる。
行列 A = (A(I,J)) の 1 ノルムは,行列 ABS(A(I,J)) の列和の最大値であるので,MAXVAL(SUM(ABS(A),DIM=1))
の値になる。
C.12.7 論理問合せ
論理問合せ組込み関数は,表のデータについてのかなり複雑な質問に対して,ループ 及び 条件構文を使用しない
で答を求める。例として,学生のテスト成績表に対する質問の答を考える。学生数を M,科目数を N,2 次元の成績
表を T(M,N) とする。表 T は整数型行列であって,その要素は 0100 の得点であるとする。
85 76 90 60
例題 : 3 人の学生についての 4 科目の成績表 T = 71
45 50 80 がある。
66 45 21 55
質問 : それぞれの学生の最高得点は?
解答 : MAXVAL(T,DIM=2) になる。例題では,[ 90, 80, 66 ] になる。
質問 : 総得点の平均点は?
解答 : SUM(T)/SIZE(T) になる。例題では,62 になる。
質問 : 表内で得点が平均点以上の件数は?
t t t .
解答 : ABOVE=T > SUM(T)/SIZE(T); N=COUNT(ABOVE) になる。例題では,ABOVE は論理型配列 t . . t
t . . .
(t は真,. は偽)になり,COUNT(ABOVE) は 6 になる。
質問 : 平均点以上の中での最低点は何点か?
解答 : ABOVE が上の論理型配列であるとして,MINVAL(T,MASK=ABOVE) になる。例題では,66 になる。
質問 : すべての得点が平均点以上の学生はいるか?
解答 : ABOVE が上の論理型配列であるとして,ANY(ALL(ABOVE,DIM=2)) の結果が真か偽かによって “はい” か “い
いえ” になる。例題では,“いいえ” になる。
C.12.8 並列計算
最も単純な並列処理は,多数の演算対象に対して同じことを同時にすることである。行列の加算は,並列処理の典
型的な例題である。配列代入文 A=B+C は,同一の形状をもつ配列 B 及び C 中の要素を並列に加算し,その和を配列
A に並列に代入することを指定する。
行列加算の例で並列に行われる処理は,もちろん加算処理である。行列加算を並列処理として実現しているのは,
配列式を要素ごとに評価する機能である。
他の簡単な並列処理アルゴリズムについても,実現する手段として,要素ごとの計算が期待できる。
C.12.9 配列要素ごとの計算の例
同じ次数の多項式が多数あるときに,各式の係数を行列の行に配置し,その列に対してホーナー法を適用して評価
することができる。
次の 3 次多項式を評価する方法を,プログラム部分によって示す。
P (t) = 1 + 2t − 3t2 + 4t3
Q(t) = 2 − 3t + 4t2 − 5t3
R(t) = 3 + 4t − 5t2 + 6t3

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

                                                                                                  425
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
3 式を同時に同じ点 t = X について計算する。結果のベクトル [ P (X), Q(X), R(X) を,実数型配列 RESULT(3) に
代入する。
RESULT を計算するプログラム部分は,次のただ一つの文になる。
RESULT = M(:,1) + X * ( M(:,2) + X * ( M(:,3) + X * M(:,4) ))
1 2 −3 4
ここで,係数行列 M(3,4) の値は 2 −3 4 −5 とする。
3 4 −5 6
C.12.10 ビット操作手続 及び ビット問合せ関数
手続 IOR,IAND,NOT,IEOR,ISHFT,ISHFTC,IBITS 及び IBCLR は,アメリカ陸軍規格 MIL-STD 1753 で,
スカラの引数に対して定義されている。この規格では,配列の引数に対しても配列の結果を返すように拡張した。

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

  426
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
附属書 D
(参考)
構文規則
D.1 全構文規則の抽出
箇条 1
R101 XYZ 並び is XYZ [ , XYZ ] ...
R102 XYZ 名 is 名前
R103 スカラXYZ is XYZ
C101 (R103) スカラ XYZ は,スカラでなければならない。
箇条 2
R201 プログラム is プログラム単位
[ プログラム単位 ] ...
R202 プログラム単位 is 主プログラム
or 外部副プログラム
or モジュール
or 初期値設定プログラム単位
R203 外部副プログラム is 関数副プログラム
or サブルーチン副プログラム
R204 宣言部 is [ USE 文 ] ...
[ IMPORT 文 ] ...
[ 暗黙型宣言部 ]
[ 宣言構文 ] ...
R205 暗黙型宣言部 is [ 暗黙型宣言部文 ] ...
IMPLICIT 文
R206 暗黙型宣言部文 is IMPLICIT 文
or PARAMETER 文
or FORMAT 文
or ENTRY 文
R207 宣言構文 is 派生型定義
or ENTRY 文
or 列挙体定義
or FORMAT 文
or 引用仕様宣言
or PARAMETER 文

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

次のページ PDF 441

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

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

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

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

規格番号
規格名称