pmd_wrapperについて

nap/nappy/pmd/内でコンパイルすることのできる pmd_wrapper は,pythonからpmdを呼ぶためのラッパーライブラリ.これを f2py を使ってコンパイルしていないと,pythonからpmdをよぶことはできない.このコンパイルは少々厄介なのでここに詳しく記載しておく.

条件および準備

  • f2pyコマンドを使うので,numpyがインストールされている必要がある.
  • おそらく numpyf2py に用いられたコンパイラ系と,pmd のコンパイラ系が整合していなければならない.どちらもGNU系の場合に動作確認が取れているが,Intel系などの他のコンパイラ系では未確認.
  • pmdのコア関数がライブラリ化されていなければならない.これは nap/pmd/内で,
    $ make pmd lib
    のように lib を make しておかなければならない.

makefileの編集

nap/nappy/pmd/内には次のようなmakefileが用意されているが,コンパイルする環境によって設定が異なる場合がある.

.phony: clean veryclean pmd_wrapper
 
all: pmd_wrapper mods
 
obj= pmd_wrapper.F90
pmddir= ${HOME}/src/nap/pmd
 
# In case of macOS (at least in my environment), need to use gfortran with mpi options instead of using mpif90.
# You should modify paths in the following.
mpiopts= -I/usr/local/Cellar/open-mpi/4.1.1_2/include -L/usr/local/opt/libevent/lib -L/usr/local/Cellar/open-mpi/4.1.1_2/lib -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpifh -lmpi
ompopts=  --f90flags="-fopenmp" -lgomp
 
compopts= --f77exec=mpif90 --f90exec=mpif90 --quiet
# compopts= --f90exec=mpif90 --quiet --fcompiler=gnu95
 
pmd_wrapper: ${obj}
	f2py  ${compopts} -m $@ -I${pmddir} -c $^ -L${pmddir} -lpmd   # for linux, use mpif90 directly
#	f2py  ${compopts} -m $@ -I${pmddir} -c $^ -L${pmddir} -lpmd ${mpiopts}       # for mac, use gfortran and mpiopts defined above
#	f2py  ${compopts} -m $@ -I${pmddir} -c $^ -L${pmddir} -lpmd ${ompopts}  # add ompopts if pmd was compiled with -fopenmp
 
clean:
    rm -f *.o *.so *~
 
veryclean: clean
    rm -f out.*
  • pmdを -fopenmp オプション付きでコンパイルした場合,上記の ${ompopts} の付いた f2py コマンドにしなければならない.
  • macOSの場合,mpiopts のようにMPIライブラリを指定して f2py コマンドを実行しなければならないかもしれない.

テスト

nap/examples/pmd_W/に移動して次を行い,エラーとならずにポテンシャルエネルギーが得らればpythonからpmdを呼ぶことに成功したことになる.

$ ipython
In [1]: import nappy
In [2]: from nappy.pmd import PMD
In [3]: nsys = nappy.io.read('pmdini')
In [4]: pmd = PMD(nsys)
In [5]: pmd.load_inpmd()
In [6]: pmd.run(nstp=0)
In [7]: nsys = pmd.get_system()
In [8]: nsys.get_potential_energy()
Out[8]: -463.72014110958054

References