Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@bluepost59

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

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を代入していたりすることがある。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?