FortranでできることをJuliaでやってみる

namelist

Fortranではnamelistという機能があり、こちらにありますように、インプットファイルを一行で読み込めてしまいます。 例えば、このソフトウェアでも使われています。 使用方法は

program main
    implicit none
    integer::nx,ny,nz,n
    real(8)::qx,qy,qz
    character(100) :: filename1,filename2

    namelist /dim/nx,ny,nz,filename1
    namelist /dimq/n,qx,qy,qz,filename2
    

    open(11,file="testinput.txt",status='old',action='read')
    read(11,nml=dim)
    write(*,nml=dim)
    read(11,nml=dimq)
    write(*,nml=dimq)
    close(11)

end program main

とします。そして、インプットファイルは

&dim
nx = 3,
ny = 3,
nz = 9,
filename1 = "filename1dayo",
&end

&dimq
n = 10,
qx = 3d0,
qy = 3d0,
qz = 9d0,
filename2 = "filename2dayo",
&end
/

です。一行でパラメータを読み込めるので便利ですね。このインプットファイルをJuliaでも読み込んでみることをやってみます。

PyCall経由でのPythonライブラリの使用

まず、Fortranのnamelistをいい感じに取り扱うパッケージがJuliaにないかを探してみましたが、現時点(2021年8月)の時点で見つかりませんでした。しかし、Pythonのライブラリのf90nmlを見つけました。JuliaではPyCallを使えばPythonのライブラリを簡単に使うことができます。 PyCallのインストールは

julia -e 'using Pkg;Pkg.add("PyCall")'

です。その後、f90nmlを入れるために、

using PyCall
@pyimport pip
pip.main(["install","f90nml"])

を実行します。これでf90nmlがJuliaで使えるようになりました。インストールが終わりましたので、使う時には

using PyCall
f90nml = pyimport("f90nml")

でOKです。あとは

testdata = f90nml.read("testinput.txt")

とすると、辞書型としてファイルを読み込むことができます。つまり、

nx = testdata["dim"]["nx"]

のような形でデータを取り出せます。