🖥️

Fortranのnamelistの使い方

2022/08/08に公開

下記のリライトです。

https://bluepost69.hatenablog.com/entry/2016/09/12/022007

Fortranが標準でサポートしている唯一の構造化言語であるnamelistの使い方をまとめます。

namelistとは

大規模計算プログラムには大量の設定すべきパラメータがあります。物理定数のように内部で与えておけばよいものもありますが、頻繁に変えて実行するものもあり、内部で与えるとその都度コンパイルしなければならず効率が悪いです。

簡単に思いつくのは、「平文のまま設定値を順番に書き下してread文で読ませる」という方法です。しかしこれだと設定ファイルが数値(時々文字列や論理値)の羅列になってしまい、可読性に欠けます。

そこでfortranにはnamelistという機能があります。これはソースファイルとは別の設定ファイルに決まった書き方で書いた設定値を読み書きできる機能で、これを使えば比較的わかりやすい書き方で設定値を与えることができます。

(jsonやymlを使いたいところですが、そんな高級な構造化言語をパースする機能はFortran標準にはありません。外部パッケージを使えばいけるようですが。)

namelistの使い方

まずは実行コード側でnamelistを定義します。これにはnamelist文を使って次のように定義します。

namelist/hoge/ xx,yy,zz

ただしこの文の前で変数xx、yy、zzがそれぞれ定義されている必要があります(implicit noneの場合)。設定ファイルとはいえ別ファイルなのでopenで開いてreadで読む必要があり、writeで書き出すこともできます。そのためread、writeにはnmlというパラメータが準備されています。

設定ファイルに書くときは次のように記述する。

&hoge
xx=1d0,
yy=2,
zz='hoge',
/
!

注意しなければならないのは「最後のスラッシュのあとに改行が必要」ということです。どういうわけかgfortranではこれがないと「End of file」というエラーが出るようです。

ここではhogeというリストひとつしか記述してませんが、ひとつの設定ファイルに複数個のリストを書くこともできます。この場合リスト単位で読み書きができます。

サンプルプログラム

まとめて上記の設定ファイルを「params.in」としてそれを読みとって「out.in」という名前で保存するプログラムは次のようになります。

program main
  implicit none
  double precision :: xx
  integer :: yy
  character :: zz
  namelist/hoge/xx, yy, zz

  open(10,file='params.in')
  read(10,nml=hoge)

  open(11,file='out.in')
  write(11,nml=hoge)

  close(10)
  close(11)
end program main

Discussion