Contents
ファイルの文字数を数えずにopenすむ方法
文字数を多めに宣言して、Fortran 組み込み関数 "trim" を使用すると楽。
program test
implicit none
character (100) :: infile
infile = 'aaa.txt'
open (10,file = trim(infile))
end program
Module 使用時の注意点
Module を使用する際に、使用するModule をコンパイルしておく必要がある。 コンパイルは下記の通り。.mod と.o のファイルが生成される。
$ ifort -c test.f90
module を使用するときには、主プログラムのプログラム名のすぐ後に、使用する module を宣言する。
program test
use module_aaa
use module_bbb
implicit none
==== 宣言、実行文===
end program
コンパイル時に生成されたファイル(.mod と .o)を主プログラムと同じフォルダに入れ、 主プログラムをコンパイルするときに .o ファイルを加える。
$ ifort -o test.x test.f90 module_aaa.o module_bbb.o ....
$ ./test.x
module で binary ファイルをオープンにするときにはbyte 単位に注意。 コンパイル時に"-assume byterecl"を指定するのが楽。
$ ifort -c -assume byterecl module.f90
上記のコンパイルをやっておくと、プログラム本体のコンパイル時に 一々"-assume byterecl" を指定する必要がなくなる。
構文whereの注意点
書き方によっては"Segmentation error"が表示される。 先に全グリッドに欠損値を代入して、whereで挿入するほうが良いようだ。
program test
implicit none
real :: r2nat (100, 100)
real :: r2in (100, 100)
real :: r2tmp (100, 100)
real :: r0val
real :: p0undef !! 欠損値
・・・・・・ 中略 ・・・・・
===== ダメな書き方 =====
where (r2nat (i0x, i0y) == r0val)
r2tmp = r2in
elsewhere
r2tno = p0undef
endwhere
====================
===== OKな書き方 =====
r2tmp = p0undef
where (r2nat (i0x, i0y) == r0val)
r2tmp = r2in
endwhere
====================
end program
追記
where構文は、欠損値を用いた解析と相性が悪いように感じる。 例えば、p0min=-999.0 とすると、まれに-998.9999... というような扱いをしているみたいだ。
Segmentation Errorへの対処方法
- 単純に配列をオーバーした
- allocateされてない
- 配列宣言されてない
NaNへの対処方法
logに負の値など、計算出来ない場合はNaNが出力される。isnan関数を使うと良い。