Fortran ⽂法のまとめ
ver. 2018/04/24
Fortran90 の基本事項
⼤⽂字と⼩⽂字は区別しない
⾃由形式︓⼀⾏ 132 ⽂字まで記述(コンパイルオプションで撤廃できる)(固定形式︓FORTRAN77 では何⽂字⽬から書くかが指定されていた)⼀⾏に⼀⽂を記述;を使うことで⼀⾏に複数⽂を書くことも可能。
a=0; b=0! a にゼロを代入、b にゼロを代入! 以降は⾏末まではコメント⽂としてコンパイル時には無視される。
⼀⾏が⻑くなって複数⾏にまたがる場合は⼀⾏⽬最後に &次の⾏の頭にも&を置いても良い
a = 1.0d0 + 2.0d0 + 3.0d0 + 4.0d0 + && 5.0d0 + 6.0d0 + 7.0d0 + 8.0d0 + && 9.0d0 + 10.0d0○プログラムの基本構造
PROGRAM プログラム名称
宣言文 (IMPLICIT NONE 宣言、変数宣言)
実行文
END PROGRAM プログラム名称

IMPLICIT NONE
は、暗黙の変数型を使⽤せず、全ての変数の型を明確に指定する⽂。(使うことを推奨)
暗黙の型宣⾔とは、IMPLICIT NONE を使わない場合 Fortran では
IMPLICIT REAL*8(a-h, o-z)となり a〜h、o〜z で始まる変数・定数は倍精度実数型、その他の i〜n で始まる変数・定数はデフォルト型の整数型を使う⽅法が過去に広く使われていた(⾮推奨)
型
変数型

記述⽅法

整数型

INTEGER

推奨されない記述⽅法

1

単精度実数型
倍精度実数型
複素数型
倍精度複素数型
論理型
文字型

REAL
REAL(4), REAL*4
DOUBLE PRECISIONREAL(8), REAL*8
COMPLEXCOMPLEX*8
COMPLEX(KIND(0d0))
COMPLEX*16, DOUBLE COMPLEXLOGICAL
CHARACTERREAL*8 と COMPLEX*16 はよく⾒かける。DOUBLE PRECISION は推奨されるがあまり⾒かけない。
変数名︓英数字とアンダーラインが使える。英字から始まる 31 ⽂字までの名前
変数の宣⾔例INTEGER :: a
REAL*8 :: b, c
DOUBLE PRECISION :: d=0.0D0! 初期値入力
COMPLEX(kind(0d0)) :: dt1
COMPLEX(kind(0d0)), PARAMETER :: iunit = (0.0d0, 1.0d0)
値を変更しない変数(定数)にはパラメター属性をつける。

! プログラム中で⽂字型変数の宣⾔例
CHARACTER :: aCHARACTER(LEN=4) :: b
CHARACTER(4) :: cCHARACTER*4 :: d! 長さ１文字の変数! 長さ 4 文字の変数! 長さ 4 文字の変数をこのようにも書ける! 長さ 4 文字の変数をこのようにも書ける

変数型について
整数型：4 バイト(32 ビット), 2 進数でメモリに格納。最大値 231-1 まで
単精度実数型：4 バイト、10-38~1038, 約 7 桁の精度(符号、指数と仮数部に格納)
3.5, 1.0e0, -1.0e5 (-10000)などと表示(e のあとは指数部)
倍精度実数型：8 バイト、10-308~10308 約 16 桁の精度
3.5d0, 1.0d0, 1.0d-5 (0.00001) などと表示(d のあとは指数部)
単精度複素数型：8 バイト、実部と虚部が単精度実数型
倍精度複素数型：16 バイト、実部と虚部が倍精度実数型
論理型： .TRUE. または .FALSE. (T,F でも OK)
実数と複素数型では基本的に倍精度のものを使う。
○四則演算(+, -,*, /)、累乗は**で表す。
2

同じ型の演算は同じ型となる。(整数型/整数型は整数型)
a = 5 / 2！ a は 2 となる。 2.5 にしたい場合は 5.0/2.0 とする
違う形の演算は型変換が⾏われる(整数と実数の演算は実数に、実数と複素数の演算は複素数に)
a=4**3! 4 の三乗、a は 64 となる○代⼊⽂
変数に値を代⼊するには=を使う(数学の等号ではない)
a = 5 / 2.0
i = i + 1! 倍精度実数型の a に 2.5 を代入! i を 1 増やす。(再帰代入)○DO ループ⽂の使い⽅
基本例１（sum（初期値 0）に N 回 1 を⾜す）
sum = 0DO I = 1, N
sum = sum + 1
END DO
基本例２（sum（初期値 0）に i が 1〜N まで増える間、3 回ごとに i を⾜す）
sum = 0DO I = 1, N, 3
sum = sum + i
END DO
補⾜説明︓

インクリメント

DO ループを１つずつ変数が増えながら⾏うのではなく、この場合は 3 つずつ増えて⾏く。つまり、i=1, 4, 7, 10, …の様に増えて⾏く事に注意。

○IF ⽂の使い⽅
基本例１（i の値が 0 の時は 0 を、１以上の時は 1 を、それ以外（つまり負の値）の時は-1を加える）
IF (i .EQ. 0) THENi = i
ELSE IF (i .GE. 1) THENi = i + 1
ELSE
i = i - 13

END IF
補⾜説明︓

関係演算⼦]A .EQ. B
A .NE. B
A .GE. B
A .GT. B
A .LE. B
A .LT. B

基本例２

A==B
A/=B
A>=B
A>B
A<=B
A<B

:A が B と等しい時（A=B）に真:A が B と等くない時（A≠B）に真:A が B 以上の時（A≥B）に真:A が B より大きい時（A>B）に真:A が B 以下の時（A≤B）に真:A が B より小さい時（A<B）に真実⾏する⽂が短い場合は Then も省略して⼀⾏で書くことも可能
delta = 0
IF (i .EQ. j) delta = 1! i=j であれば delta に 1 を代入○IF ⽂による DO ループの制御
基本例 1

DO ⽂で終了条件を書かない (EXIT ⽂でループを抜ける)
x = 0.0d0
DOx = x + 0.10d0
y = x**2
PRINT *, x, yIF( x .GT. 1.0d0) EXIT
END DO! x>1 なら DO ループから出る

条件が満たされないとプログラムは終了しないので端末から Ctrl-C で強制終了する。
基本例 2 特定の条件のときは DO ループを実⾏しない(CYCLE で DO ループの頭に戻る)
DO i = 1, N
IF ( i .EQ. 7 ) CYCLE ! i が 7 のときは戻って i=8 の処理に移る。
!ここに i が 7 以外のときの計算を書く。
END DO
基本例 3 ⼊れ⼦(ネスト)になる場合は DO ループに名前をつける
LOOP1: DO i = 1, N
LOOP2: DO j = 1, N
IF( i .EQ. j ) CYCLE LOOP2END DO LOOP2END DO LOOP1
4

IF-END IF ⽂にも同様に名前をつけることができる。
○標準⼊出⼒(READ/WRITE/PRINT ⽂の使い⽅)
基本例（コマンドラインから hoge を読んで、hoge をディスプレーに出⼒）READ(*,*) hoge
WRITE(*,*) hoge
補⾜説明︓

またはPRINT *, hoge

WRITE ⽂の２つの＊（星印）の意味

１つ⽬の＊は IO（ファイル装置番号）を指定する為に使う（後述）
２つ⽬の＊は FORMAT（データの型）を指定する為に使う
何も考えずにインタラクティブに作業するのであれば、WRITE(*,*)あるいはPRINT *, を使う○ファイル⼊出⼒
基本例（⼊⼒ファイルを装置番号 1 番に、出⼒ファイルを装置番号２番に割り当て、それぞれのファイルに⼊出⼒する）
OPEN(1,FILE=ʼファイル名 1ʼ,STATUS=ʼUNKNOWNʼ)OPEN(2,FILE=ʼファイル名 2ʼ,STATUS=ʼUNKNOWNʼ)READ(1,*) hoge
WRITE(2,*) hoge
CLOSE(1)
CLOSE(2)補⾜説明︓

装置番号を＊としたときは標準⼊出⼒から読み書きをする

READ(*,*)とすると⼊⼒は 5 番のファイル（標準⼊⼒、画⾯上）から読み込む
WRITE(*,*)とすると出⼒は 6 番のファイル（標準出⼒、画⾯上）へ書き出す
WRITE(0,*)とすると出⼒は 0 番のファイル(標準エラー出⼒、画⾯上)へ書き出す
OPEN ⽂は画⾯(標準⼊出⼒)以外のファイルからの⼊出⼒をする為に使う開けたら(OPEN)、閉じる(CLOSE)のを忘れずに
STATUS 指定⼦︓'OLD' : すでにファイルが存在する場合'NEW': ファイルが新しく作られる場合'REPLACE': ファイルが存在する場合は前のファイルが削除される'UNKNOWN': デフォルト値。ファイルが存在する場合も存在しない場合もある。存在しない場合は新しく作成する。
5

ACTION 指定⼦︓'READ'︓読み込み専⽤でファイルを開く'WRITE'︓書き込み専⽤でファイルを開く'READWRITE': デフォルト。読み書き可能。
POSITION 指定⼦︓ 'ASIS' : デフォルトの場所、通常ファイルの先頭位置'REWIND': ファイルの先頭位置'APPEND': ファイルの末尾位置存在するファイルをオープンして出⼒した場合前の内容は削除される。すでに存在するファイルの内容を消さずに⼀番最後に結果を出⼒したい場合はOPEN(1,FILE="ファイル名", STATUS="OLD", POSITION="APPEND")などとしてファイルをオープンする。

○配列（ベクトル）の扱い⽅型宣⾔
基本例
DOUBLE PRECISION :: a(1:5),B(1:4,1:3) ! a は 5 つの要素を持つ配列、B は 4x3の行列
DOUBLE PRECISION :: a(5), B(4,3) !としてもよい
DOUBLE PRECISION, DIMENSION(1:10) :: p,q,r,s ! p,q,r,s は 10 つの要素を持つ配列
DOUBLE PRECISION :: p(1:10), q(1:10), r(1:10), s(1:10)! としてもよい

その他の例
DOUBLE PRECISION :: a(-2:2)
a(-2), a(-1), a(0), a(1), a(2)の 5 つの要素を持つ倍精度実数型配列を定義
初期値設定
DOUBLE PRECISION :: L(1:5)=0.0D0!配列 L の全ての成分が 0

INTEGER :: L2(1:5) = (/1, 2, 3, 4, 5/)!配列 L2 の各要素の初期値を設定

基本例（N 次元配列 a の全要素に 0 を代⼊）i

DO i = 1, Na(i)=0.0D06

END DO
補⾜説明︓当然、0 以外の要素の代⼊・演算も可能
DO ループを使わずにa(1:N) = 0.0D0としてもよい。
また、異なる配列の違う添字を持つ要素の代⼊・演算も可能
DO i = 1, Na(i)=b(i+3)
END DO
この時、b の配列の⼤きさは N+3 より⼤きくないと不可
DO ループを使わずにa(1:N) = b(4:N+3)
としてもよい。
配列関係の組み込み関数
SUM 配列の和を計算
c = SUM(a(1:10))! a(1)から a(10)までの和を c に代入

MAXVAL/MINVAL 配列の要素の最⼤値あるいは最⼩値を返す
c = MAXVAL(a(1:N))
d = MINVAL(a(1:N))! a(1)から a(N)の中での最大値を c に代入!a(1)から a(N)の中での最小値を d に代入

組み込み関数 DOT_PRODUCT
２つの 1 次元配列の内積を計算
c = DOT_PRODUCT(a(1:N),b(1:N))! a と b の内積を c に代入

整 数 型 、 実 数 型 、 複 素 数 型 い ずれ の 場 合も 内 積 を 計 算 す る た め 複 素 数 型の 場 合 は
CONJG(a(1:N))と b(1:N)の積が計算される。
宣⾔時に配列の⼤きさに変数を使いたい場合は PARAMETER 属性あるいはサブルーチン
なら INTENT(IN)属性が必要(プログラム中で値が変更できなくなる)
INTEGER, PARAMETER :: N = 100
DOUBLE PRECISION :: A(1:N), B(1:N), C(1:2*N)
コンパイル時に配列の⼤きさが決まらない場合(実⾏時配列)
7

INTEGER :: N
REAL*8, DIMENSION(:), ALLOCATABLE :: a! サイズを指定せずに宣言

READ(*,*) N! 例えば実行時に配列のサイズとなる整数型を読み込む
ALLOCATE( a(1:N) ) ! a の配列を割り当てる! ここで計算をする
DEALLOCATE (a) ! a の配列をメモリから開放する○⾏列の扱い⽅
基本例（N×N ⾏列 B の全要素に 0 を代⼊）i,j

DO i = 1, N
DO j = 1, N
B(j,i)=0.0D0
END DOEND DO
補⾜説明︓２重ループの構造上、内側のループが優先的に変化する。
Fortran では多次元配列は
B(1,1), B(2,1), B(3,1), ..., B(N,1), B(1,2), B(2,2), ...の順番にメモリに格納される (C ⾔語では逆)。
この順に演算をしたほうがキャッシュミスが少なくなる。
DO ループを使わずにB(1:N,1:N) = 0.0D0としてもよい。
⾏列の組み込み関数
MATMUL ⾏列の積を計算
c(1:N,1:K)= MATMUL(a(1:N,1:M), b(1:M,1:K)) ! a と b の積を c に代入
TRANSPOSE ⾏列の転置を計算
b(1:N,1:N) = TRANSPOSE(a(1:N,1:N))

!

⾏列の出⼒
DO ⽂を使う (5ｘ5 ⾏列 A の場合)
DO i = 1, 5
WRITE(*,*) (A(i,j), j = 1, 5)
END DO8b に a の転置行列を代入

(A(i,j),j=1,5)の j(整数型変数)は展開されて A(i,1), A(i,2), A(i,3), A(i,4), A(i,5)となる。
⾏列のサイズが⼤きい場合は標準出⼒に出しても読めないので、⼀部だけ出⼒したり、ファイルに出⼒して必要な処理をする。
○型変換
整数の実数化、実数の整数化
基本例（i の値を ai と実数化、a の値を ia と整数化）
ai=DBLE(i)! i を倍精度実数型に変換! a を整数型に変換

ia=INT(a)補⾜説明︓数値関数参照
複素数の実部、虚部取り出し
基本例

rez = DBLE(z) ! 複素数 z の実部を(倍精度)実数型 rez に代入
imz = AIMAG(z) ! 複素数 z の虚部を(倍精度)実数型 imz に代入
２つの実数を実部と虚部とする複素数を作る
z = (2.0d0, 1.0d0)! 複素数に特定の数値を代入( z に 2.0+i を代入)

iunit = (0.0d0, 1.0d0)
z = a + b * iunit! 予めプログラムの最初で虚数単位を定義! 複素数 z に a+ bi (a と b は実数型)を代入

あるいは
z = DCMPLX(a,b)! a と b が倍精度実数型の場合○書式指定（I:整数、F:実数）
基本例a）5 桁までの整数を表⽰
WRITE(*,’ (I5)’) ihogeb) 全桁数 15、⼩数点以下 8 桁の実数を 3 つ表⽰
WRITE(*,’ (3F15.8)’) xhoge, yhoge, zhogec) 5 桁までの整数を２つ表⽰後、全桁数 15、⼩数点以下 8 桁の実数を 3 つ表⽰
WRITE(*,’ (2I5,3F15.8)’) ihoge, jhoge, xhoge, yhoge, zhoge
編集記述⼦の種類
9編集記述⼦形式意味IIw

整数値(幅 w)

FFw.d実数(幅 w, ⼩数点以下 d 桁)

E

Ew.d

実数(幅 w,⼩数点以下 d 桁)

AAw

⽂字列（幅 w）

XwX

空⽩(幅 w)//

改⾏

例
WRITE(*,’ (3X,I5)’) 123
WRITE(*,’ (F8.2)’) 123.4567
WRITE(*,’ (E8.2)’) 123.4567
WRITE(*,’ (A8)’) “ABC”_____123__123.45_0.12E+3_ _ _ _ _AB C○組み込み関数
数学関数
FORTRAN式

名称

数学的FORTRAN式

名称

数学的LOG(x)

⾃然対数

log (x)e

LOG10(x)常⽤対数log (x)

EXP(x)指数ex

SQRT(x)

平⽅根√xSIN(x)正弦sin(x)COS(x)

余弦cos(x)TAN(x)

正接tan(x)ASIN(x)逆正弦arcsin(x)ACOS(x)逆余弦

arccos(x)ATAN(x)逆正接

arctan(x)ATAN2(y,x)

逆正接2arctan(y/x)

SINH(x)双曲線正弦sinh(x)COSH(x)双曲線余弦

cosh(x)TANH(x)双曲線正接tanh(x)RAND()[0,1]の乱数

random()

x**i

累乗

x10i

数値関数
FORTRAN式

名称

引数数

FORTRAN式

名称

引数数

INT(x)

整数化

1

REAL(x)

実数化

1

DBLE(x)

倍精度実数化1

DCMPLX(x,y)

MOD(x,y)x/yの余り2MAX(x,y,..)10倍精度複素数化
最⼤値

2≧2

MIN(x,y..)

最⼩値

≧2

ABS(x)

絶対値

1

AIMAG(x)虚部

1

CONJG(x)共役複素数

1

SIGN(x,y)Xの符号替え2nint(x)y/|y| |x|

四捨五⼊後
整数化

1

補⾜説明︓⾓度の単位はラジアン単位なので注意（180°=πラジアン）○論理演算
If ⽂の中で、⽐較演算⼦や論理型の変数と共に⽤いられる。
論理演算⼦

意味 & 意味.NOT.

以外.NOT. a==b.AND.

かつa==b .AND. b==c.OR.

もしくはa==b .OR. b==c.EQV.

論理値が等しい.NEQV.

論理値が等しくない

a<0 .EQV. b<0 （aとbの符号が同じという⽐較例）
a<0 .NEQV. b<0 (aとbの符号が⼀致しないという⽐較例)

例︓
IF(A.EQ.B.AND.B.GT.C) THEN
IF(.NOT.A.EQ.B) THEN
IF(A.EQ.B.EQV.B.GT.C) THEN

：A と B が等しく、B が C より大きい時真：A と B が等し無い時真(A.NE.B と同じ)
：A と B が等しく、B が C より大きい時真、またA と B が等しく無く、B が C 以下の時真○関数副プログラム関数を定義することで組み込み関数と同じように使うことができる。関数がどの型の変数を返すかは関数の中で定義する。(多次元)配列を返すこともできる。
基本例︓ f(x) = 4x3 - 5x を関数副プログラムとして定義、主プログラムの中に関数副プログラムを置く場合(内部副プログラム)
PROGRAM EXAMPLE2IMPLICIT NONEDOUBLE PRECISION :: xx = 0.0d0
DO11PRINT *, x, Func(x)x = x + 0.10d0
IF( x .GT. 5.0d0) EXIT
END DOCONTAINS!CONTAINS 以下に副プログラムを列挙

FUNCTION Func(x)! 関数見出しDOUBLE PRECISION, INTENT(IN) :: x ! 宣言部
DOUBLE PRECISION :: Func ! 関数の型を宣言する
Func = 4.0 * x**3 - 5.0 * x! 実行部

RETURNEND FUNCTION Func
END PROGRAM EXAMPLE2関数に受け渡される引数に INTENT(IN)属性をつけることで関数内でこの値が変更できないようにできる。(推奨)基本例 2: END PROGRAM の後に関数副プログラムを置く場合(外部副プログラム)
PROGRAM EXAMPLE2IMPLICIT NONEDOUBLE PRECISION :: x
DOUBLE PRECISION :: Func
!関数副プログラムの型宣言が必要
x = 0.0d0
DO
PRINT *, x, Func(x)x = x + 0.10d0
IF( x .GT. 5.0d0) EXIT
END DOEND PROGRAM EXAMPLE2FUNCTION Func(x)! 関数見出しDOUBLE PRECISION, INTENT(IN) :: x ! 宣言部
DOUBLE PRECISION :: Func
! 関数の型を宣言する
Func = 4.0 * x**3 - 5.0 * x! 実行部
RETURNEND FUNCTION Func
12

RETURN 文は関数やサブルーチンの処理を中断してその段階での値が関数やサブルーチンを呼び出したプログラムに返される。プログラムの末尾の場合は省略してもよい。

○サブルーチン副プログラム
関数副プログラムとほぼおなじ。違う点は・値を返さない(型がない)・引数として(複数の)値を返すことができる・CALL ⽂で呼び出す
基本例
PROGRAM EXAMPLE2IMPLICIT NONEDOUBLE PRECISION :: x, yx = 0.0d0
DO
CALL Func(x,y)! CALL 文で Func サブルーチンを呼び出し
PRINT *, x, yx = x + 0.10d0
IF( x .GT. 5.0d0) EXIT
END DOCONTAINS!CONTAINS 以下に副プログラムを列挙

SUBROUTINE Func(x,y)! サブルーチン見出し
IMPLCIIT NONEDOUBLE PRECISION, INTENT(IN) :: x ! 宣言部
DOUBLE PRECISION, INTENT(OUT) :: yy = 4.0 * x**3 - 5.0 * x! 実行部

END SUBROUTINE Func
END PROGRAM EXAMPLE2
サブルーチンでは IMPLICIT NONE を改めて宣⾔(推奨)サブルーチンの引数には INTENT 属性をつけることを推奨
INTENT(IN)︓サブルーチンに値が受け渡され、サブルーチン内で値の変更ができない変数(⼊⼒引数)
13

INTENT(OUT): サブルーチンで値がセットされる変数(出⼒引数)
INTENT(INOUT): サブルーチンに値が受け渡され、サブルーチンで値を変更できる変数(⼊出⼒引数)○再帰
関数副プログラムやサブルーチンの中で⾃分⾃⾝(関数副プログラムやサブルーチン)を引⽤することを再帰という。漸化式の計算などに使える。
関数副プログラムを再帰的に呼び出すためには RECURSIVE をつける
基本例(フィボナッチ数列)
RECURSIVE FUNCTION Fibonacci(N) RESULT(fibo)
INTEGER, INTENT(IN) :: N
INTEGER :: fibo !結果を代入する変数
IF(N .LT. 0) THEN
fibo = -1
RETURNEND IF
IF(N .EQ. 0) THEN
fibo = 0
ELSE IF(N .EQ. 1) THEN
fibo = 1
ELSE
fibo = Fibonacci(N-1) + Fibonacci(N-2)
END IF
RETURNEND FUNCTION Fibonacci
関数の実⾏結果は Fibonacci ではなく RESULT 句で指定された変数 fibo に代⼊される
サブルーチンの場合も RECURSIVE キーワードをつければよい。
○関数・サブルーチンでの複数の値・配列の受け渡し
出⼒が(多次元)配列⼀つであれば配列型の関数としてもよいし、出⼒が複数配列、変数にわたる場合はサブルーチンの引数に⼊れる。
14

基本例︓外積を計算(関数を⽤いて)PROGRAM TESTIMPLICIT NONEDOUBLE PRECISION :: a(1:3), b(1:3), c(1:3)a(1) = 6.0d0; a(2) = 3.0d0; a(3) = 4.0d0;b(1) = 3.0d0; b(2) = -2.0d0; b(3) = -4.0d0;c(1:3) = OUTERPRODUCT(a(1:3), b(1:3))
WRITE(*,*) c(1:3)
CONTAINSFUNCTION OUTERPRODUCT(a, b)
DOUBLE PRECISION, INTENT(IN) :: a(1:3), b(1:3)
DOUBLE PRECISION :: OUTERPRODUCT(1:3) !3 つの要素を持つ配列として関数を定義
OUTERPRODUCT(1)=a(2)*b(3)-a(3)*b(2);
OUTERPRODUCT(2)=a(3)*b(1)-a(1)*b(3);OUTERPRODUCT(3)=a(1)*b(2)-a(2)*b(1);
RETURNEND FUNCTION OUTERPRODUCTEND PROGRAM TEST
基本例︓外積を計算(サブルーチンを⽤いて)PROGRAM TESTIMPLICIT NONEDOUBLE PRECISION :: a(1:3), b(1:3), c(1:3)a(1) = 6.0d0; a(2) = 3.0d0; a(3) = 4.0d0;b(1) = 3.0d0; b(2) = -2.0d0; b(3) = -4.0d0;
CALL OUTERPRODUCT(a(1:3), b(1:3), c(1:3)) !入力も出力も引数に入れる
WRITE(*,*) c(1:3)
CONTAINSSUBROUTINE OUTERPRODUCT(a, b, c)
DOUBLE PRECISION, INTENT(IN) :: a(1:3), b(1:3)
DOUBLE PRECISION, INTENT(OUT) :: c(1:3)c(1)=a(2)*b(3)-a(3)*b(2);c(2)=a(3)*b(1)-a(1)*b(3);15c(3)=a(1)*b(2)-a(2)*b(1);
RETURNEND SUBROUTINE OUTERPRODUCTEND PROGRAM TEST
○プログラムの終了(エラー処理)
STOP ⽂でプログラムの実⾏を終了できる。" " で⽂字列をエラー出⼒に出せる。
例︓
IF(n .LT. 0) STOP "n should be zero or positive"
これはIF (n .LT. 0) THEN
WRITE(6,*) "n should be zero or positive"
STOP
END IFと同じ。
○コンパイル$ gfortran プログラムソースファイル.f90-o 実行ファイル名

コンパイルオプション-O0, -O1, -O2, -O3 : 最適化オプション-ffree-line-length-none : デフォルトでは⼀⾏ 132 ⽂字であるがこの制限を撤廃-Wall : 全てのコンパイル時の警告メッセージを出⼒-Wuninitialized : 初期化されていない変数を検出-pedantic : 標準外の機能利⽤を警告-fbounds-check : 配列の領域外参照を検出-ffpe-trap=invalid,zero,overflow 浮動⼩数点例外発⽣時に異常終了-fbacktrace 異常終了時にプログラムソースコードの⾏番号を表⽰○デバッグ
⽂法以前のチェック事項16

① 変数の打ち間違いは無いか︖② 配列の⼤きさが、定義された範囲を超えていないか︖③ DO-END DO、IF THEN ELSE IF-ELSE-END IF などがきちんと閉じているか︖④ emacs では正しくコーディングされているとタブを押したときに各⾏が整列する。
実践的なデバッグの⽅法① ⾊々な所に WRITE(*,*) /PRINT *, ⽂を挿⼊し、途中結果、DO ループの変数の増え⽅等をモニターする。
② !でコメント化することでソースコードの保存や実⾏を⾶ばすことも可能。
③ do ループの変数がちゃんと受け渡されているかどうかチェックする。特に、配列の⼤きさを超える変数が受け渡されると、他のデータを破壊してしまうので要注意。
④ 配列にきちんとデータが読み込まれているかチェック。
⑤ 検索コマンドで、同じ変数がちゃんと検索されるかどうかチェック。
⑥ コンパイル時にデバッグオプションを追加

17