pmd

napパッケージの一部で,Parallel Molecular Dynamics の略.MPIを用いた空間分割並列による大規模分子動力学シミュレーションが可能.

コンパイルや使い方についての英語のマニュアルがあるのでそちらも参照すること.

分子動力学法(MD)の基礎を理解していることを前提としている.

コンパイル

macOSでのコンパイルにおいてはコンパイラの種類に注意が必要なようだ.現在(2022-06-xx),GNUコンパイラでは正常に動作することを確認しているが,macOSにデフォルトで入っているgccなどは「gcc —version」を見るとApple clang LLVMと出てくるもので,それだと原因は不明だがうまくコンパイルできない.また,「gcc —version」と「gfortran —verion」で異なるコンパイラバージョンが表示される場合も問題があるので,HomebrewでちゃんとGCCをインストールして,それが使われる環境をしっかりと構築すること.

nap/ ディレクトリで,

$ ./configure [options]

のようにして,configureを実行することで,nap/pmd/nap/fitpot/ 内に makefile が作成される.gfortranの場合には次のオプションを用いると良いと思われる.

$ ./configure --prefix=$(pwd) FCFLAGS="-O3 -g -fallow-argument-mismatch"

nap/pmd/ のディレクトリ内で,

$ make pmd lib

などとすることでコンパイルする.上のように lib を作成しておくことで,pythonからpmdを呼ぶことができるようになる.pythonからpmdを呼ぶためには他にも,

$ cd nap/nappy/pmd/
$ make pmd_wrapper

としてpmd内のルーティンをpythonからimportするモジュールの準備をしておく必要がある.このコンパイルは少し厄介で,nap/nappy/pmd/makefile を編集して,用いるMPIの include や lib ディレクトリを指定しないといけないかもしれない.

macOSにおいて,gfortran+OpenMPIでコンパイルする際には,マニュアルに書かれているように,「-fallow-argument-mismatch」をconfigureのFCFLAGSオプションに加えないといけないかもしれない.

OpenMP

OpenMPを使いたい場合は,(gfortranの場合) -fopenmp オプションをつける(ただし,-O3オプションとは相性が悪いために遅くなることがあるので注意). つまり,次のようにする.

./configure --prefix=$(pwd) FCFLAGS="-O2 -g -fallow-argument-mismatch -fopenmp"

実行

実行するディレクトリ内に以下のファイルが必要:

  • in.pmd: pmdをコントロールするパラメータを記述するファイル.詳細は マニュアル を参照.
  • pmdini: シミュレーションセルおよび原子の初期配置
  • in.params.XX: 使用する原子間ポテンシャルに必要なパラメータ

あとはそのディレクトリにて,

$ /path/to/nap/pmd/pmd > out.pmd

などとして実行する.ここで /path/to/nap は,各自の環境でnapがインストールされているディレクトリ位置を表しているので,各自の環境に合わせて設定すること.

MPI並列計算

並列数を指定して以下のようなコマンドを実行する.

$ mpirun -np 8 /path/to/pmd/pmd > out.pmd

ただし,in.pmd 内で空間分割数を指定していない場合には自動的に並列数を推測するため,必ずしも並列コア数いっぱいまで使うとは限らない.出力をしっかり確認すること.

OpenMP並列実行

OpenMPを使ってスレッドを使ったプロセス並列も使うことができる.pmdのコンパイルにおいて,configureのFCFLAGSオプションに「-fopenmp」を加えてコンパイルし,次のコマンドでpmd実行する.

$ export NUM_OMP_THREADS=4
$ pmd > out.pmd
or
$ mpirun -np 2 --bind-to none pmd > out.pmd

ここで,OpenMPとMPIの同時並列の際には「—bind-to none」をつけないと逆に遅くなってしまう可能性がある.おそらく同じスレッドを使うようなバカなことが起こるからだろう.

並列実行がなされているかどうかは,標準出力の30行目くらいに次のような出力があるので,そこでMPIとOpenMPの並列数をみることで確認できる.OpenMP並列は経験的に8までに留めるべき.

 Num of MPI processes = 16
 Num of OpenMP processes = 4

出力

  • out.pmd: 標準出力の出力先(ファイル名は決まっていない)
  • out.erg: エネルギーなどの推移
  • pmdfin: 計算後の構造,エネルギー,各原子にかかる力,応力など

解析

エネルギーの推移

out.erg を gnuplot を用いて可視化することで,エネルギーの推移を確認できる. 例えば,以下でトータルエネルギー,運動エネルギー,ポテンシャルエネルギーを一つのグラフに表示することができる.

$ gnuplot
gnuplot> plot 'out.erg' us 1:3 w l, '' us 1:4 w l, '' us 1:5 w l

NVE(原子数,体積,エネルギー一定)シミュレーションの場合,トータルエネルギーが運動・ポテンシャルエネルギーのゆらぎに比べて一定値となるが,この保存性を見ることで,力の計算の正しさやMDの時間刻みの大きさを確認することができる.

原子構造および動きの確認

flag_out_pos を 2 とし,num_out_pos を 1 以上にすると,dump_## のようなファイルが出力される.これを Ovito を用いて可視化することで,セル形状や原子配置を確認することができる.

MDシミュレーションを行ったら,必ずその原子の構造および動きを目で確認する習慣をつけること. そうしないと,予想とは全く異なるシミュレーションをして結果を議論してしまうことになりかねない.