LoginSignup
5
2

More than 5 years have passed since last update.

namelistをなかなか読み込まないときの裏技

Last updated at Posted at 2017-11-07

fortranにはnamelistという、設定値を外部ファイルから読み込む機能がある。しかしなぜかコンパイラによって読み込み方に癖があり、なかなか読み込んでくれずに困ることがある。そんなときの対処法。

別のコードを作って書きだす

namelistは読み込むだけでなく、書きだすこともできる。なので「namelistを作るためのプログラム」を組んで書き出せば、機械的に確実な方法で書き出してくれるので読める。

gen_nml.f90
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でも読んでくれる形のファイルが出てくる。

arrange.py
import f90nml

mylist = f90nml.read('mylist.in')
mylist.write('new_mylist.in')

それでも読めない場合

それでも読めない場合、値が間違っていることがある。
例えば型の誤り(integer型にlogical型を代入している1)が起こっている場合でもnamelistエラーが出るので、値をよくよく確認してみる。


  1. 信じられないことだが、職業プログラマですら「C言語でできるから」とlogical型に0を代入していたりすることがある。 

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2