fortranにはnamelistという、設定値を外部ファイルから読み込む機能がある。しかしなぜかコンパイラによって読み込み方に癖があり、なかなか読み込んでくれずに困ることがある。そんなときの対処法。
別のコードを作って書きだす
namelistは読み込むだけでなく、書きだすこともできる。なので「namelistを作るためのプログラム」を組んで書き出せば、機械的に確実な方法で書き出してくれるので読める。
program main
implicit none
double precision :: xx = 1d0
double precision :: yy = 2d0
double precision :: zz = 3d0
namelist/mylist/ xx,yy,zz
open(221,file = 'mylist.in')
write(221,nml=mylist)
close(221)
end program main
ただし、この方法では既存の大規模コードに投入するnamelistを作るとき、いちいち既存のコードを読んで、設定値を書かないといけないという面倒くさいところがある。しかもfortranなので当然コンパイルしてから実行しないといけない。
pythonのライブラリ「f90nml」で変換する
「すでにmylist.inというファイルを作っていてそれを読ませたいけど読んでくれない」ということはよくある。このときいちいち別のfortranコードを書くのはあまりに面倒くさすぎる。
そこで裏技だが、pythonのnamalistを読むライブラリ「f90nml」を使う。pipでもインストールできるライブラリで、fortranのnamelist形式のファイルを読んでdict型変数に格納する機能、書き出す機能がある。f90nmlの読み込み機能は結構優秀で、素直に読んでくれる。
なので、f90nmlを使って読み込んで書き出せば、大体fortranでも読んでくれる形のファイルが出てくる。
import f90nml
mylist = f90nml.read('mylist.in')
mylist.write('new_mylist.in')
それでも読めない場合
それでも読めない場合、値が間違っていることがある。
例えば型の誤り(integer型にlogical型を代入している1)が起こっている場合でもnamelistエラーが出るので、値をよくよく確認してみる。
-
信じられないことだが、職業プログラマですら「C言語でできるから」とlogical型に0を代入していたりすることがある。 ↩