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"]
のような形でデータを取り出せます。