Memo ≫ Fortran

Memo Fortran

主にFortran90に関するまとめ。FortranとC++の対応関係についてはこちら

Contents

組み込み処理まとめ

epsilon(x) 実数xと同じkindの最も小さな値をかえす。1+epsilon(x)>1となる最小の値。
(例) epsilon(1.0) → 出力 1.19209290E-07
epsilon(1.d0)
→ 出力 2.2204460492503131E-016
mod(x,y) x/yのあまり
(例) max(3.d0,2.d0) → 出力 1.0
max(x1,x2,...,xN) x1,...,xNの中の最大値を抽出
(例) max(-1.d0,0.d0,1.d0) → 出力 1.0
min(x1,x2,...,xN) x1,...,xNの中の最小値を抽出
(例) min(-1.d0,0.d0,1.d0) → 出力 -1.0
product(x(:)) 配列xの要素を乗算した値を出力。x(1:5)のように範囲指定可。すべての要素の場合は(:)を省略可。maskを用いて条件を満たす要素のみを扱うこともできる。
(例) x(1:5) = (/1.d0,2.d0,3.d0,4.d0,5.d0/)
· すべて掛け算 product(x) → 出力 120.0
· x(3:5)のみ product(x(3:5)) → 出力 60.0
· 要素の値が奇数のみ product(x,mask=mod(x, 2.d0)==1.d0)
· 要素の値が偶数のみ product(x,mask=mod(x, 2.d0)==0.d0)
· 要素の値が3以上のみ product(x,mask=x>=3.d0)
sum(x(:)) 配列xの要素を加算した値を出力。使い方は上のproductと同様
Back to Top

ポインタ

ポインタの定義には「pointer」属性をつける。e.g.
integer, pointer :: ii
double precision, pointer :: aa(:)
ポインタは(:)などと書くだけでallocatableにできる(e.g. aa(:))。
ポインタbb(:)にポインタaa(:)の指示先を代入する場合、
bb => aa
とする。(:)は付けてはいけない。
Back to Top

characterあれこれ

整数を文字列へ

nA = 1
write(A,'(I1)') nA
とすると、文字列「A」に"1"が入る。

文字列の余分な空白を消す (2016.09.23 update)

文字列A=「(空白)hogehoge(空白)」とあったとして、
trim(adjustl(A))
とすると、hogehogeの前後の空白を消すことが出来ます。
Back to Top

時間計測

経過時間

実際に処理にかかった時間を測るのに使える。
call system_clock(t1)
-- 処理hogehoge --
call system_clock(t2,t3)
で、処理hogehogeの処理時間 (t2-t1)/dble(t3) [s]が得られる。 t1,t2,t3は整数。

CPU使用時間

CPUでの処理時間を測るのに使える。
call cpu_time(t1)
で、実数t1に時間を入力。単位は秒。
call cpu_time(t1)
-- 処理hogehoge --
call cpu_time(t2)
とし、t2-t1を出力すれば、処理hogehogeでのCPU使用時間 [s] を知ることができる。

日付と時刻

現時刻と日付の出力ができる。何年何月何日何時何分何秒を出力し、さらに世界標準時からの時差まで出してくれる。
call date_and_time(date,time,zone,ti)
ここで、
date = 8桁の文字列(character(8))で、4桁の西暦(CCYY)、2桁の月(MM)、2桁の日(DD)から成る「CCYYMMDD」

time = 10桁の文字列(character(10))で、時間hh、分mm、秒ss.sssから成る「hhmmss.sss」(.は小数点)

zone = 5桁の文字列(character(5))で、世界標準時(UTC) からの時差を表す。±時間hh,分mmから成る「±hhmm」

ti(1:8) = 整数配列。ti(1):西暦CCYY、ti(2):月、ti(3):日、ti(4):UTCからの時差[分]、ti(5):時、ti(6):分、ti(7):秒、ti(8):秒の小数点以下

文字列(date,time,zone)と整数(ti(1:8))が用意されているので、使いやすい方を 出力として使えば良い。
Back to Top

実行ファイルについて

実行ファイルの名前を変更

コンパイルするとデフォルトでは実行ファイル「a.out」が生成されるが、コンパイル時にオプションを付け加えることで好きな名前の実行ファイルを生成できる。例えば、
gfortran -o hogehoge aaa.f90
とすると、実行ファイル「hogehoge」ができる。
Back to Top

ファイル入出力

read文のエラーチェック

read文は文字列として定義した文字に数値データを読み込めせたりするとエラーを出す。逆もエラー。 また、データファイルの最後まで行ってもエラーを出す。 エラーを出すとそこで計算が止まってしまう。 そのようなとき、errまたはendで行番号を指定しておくと、それぞれのエラーが出たときに指定先の行に飛ぶように設定することができる。
例えば、
read(11,*,err=990,end=991) a

990 write(*,*) hogehoge

991 write(*,*) hogehoge100
と書いておくと、ファイル11番のデータと文字「a」の型が合わなければ990に飛び、「hogehoge」と出力し、ファイル11番の最後まで言ってしまっていたら991に飛んで「hogehoge2」と出力する。err(end)だけが必要な場合はもう一方は書く必要はない。
Back to Top
Memo Fortran