Fortran 90

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関数を使うと良い。