Edited at
FortranDay 20

fortranのnamelistをPythonでも読む


はじめに

「プログラマは静的コンパイラ言語と動的スクリプト言語を1つずつ使えるとよい」と言われますが、前者であるfortranに対して後者としてPythonは相性が良い言語です。Pythonは単体でも強いですが、「fortranで書き出したファイルをNumPyで加工しmatplotlibで可視化する」といった使い方をするととても便利です。

fortranでは設定値を記述するフォーマットとしてnamelistというものがあります。「namelistの設定値をpythonでも共有したい」と思うこともありますが、さすがかゆいところに手が届くPythonなので、ライブラリが用意されています。それがf90nmlです。


webサイト

https://pypi.org/project/f90nml/


インストール

もちろんpythonなのでpipでできます。

pip install f90nml


使い方

f90nmlはnamelistをdict型と相互に変換します。読み込むにはreadメソッドを使います。writeメソッドを使うと逆にnamelist形式で書き込むことができます。

# mysetting.nmlを読み込む

mysetting = f90nml.read("mysetting.nml")

# new_setting.nmlに書き込む
f90nml.write(mydict,"new_setting.nml")


小技

みなさんもこんな経験ありますよね?

せっかく精魂込めて作ったnamelistをfortranコードが読んでくれない!

他のコンパイラで使えたベンチマークのnamelistを読み込まない!設定値50個くらいあるしいちいち書き直すのもだるい!

namelistの流儀は実はめちゃくちゃで、いろんな書き方があります。なのでifortで通ったnamelistがcray ftnだと読めないとかそういうことはよくあります。

でも大丈夫!そう、f90nmlがあればね。


remake.py

import f90nml

myset = f90nml.read("myset.nml")
f90nml.write(myset,"new_set.nml")

f90nmlは多少のブレはちゃんと読んで標準に則った形で書いてくれるので、f90nmlを経由すればちゃんと読んでもらえる形式で出してくれます。

これで読めなかったら設定値の型がまちがっている(logical型の設定値に0を入れるとか 1)こともあるので設定値をチェックしましょう。


参考





  1. intelのifortはめっちゃ優しいのでlogicalに0や1を入れても読んでくれたり、他にもいろんなバグを黙って自動で直してコンパイルしてくれます。ですがcrayのftnや富士通のfccは厳しいのでinvalid value errorとだけ返して読んでくれません。優しさは時に人をダメにするということは、優しさを失って初めて気づくのですね :(。