今回は、LAMMPSのデータの入出力と制御文について紹介します。
シミュレーション結果の保存とリスタート
LAMMPSはwrite_restartコマンドで現在の状態を保存することができます。ここでは保存したものをリスタートファイルと呼びましょう。
また、restartコマンドを呼んでおくとその後run中に一定ステップおきにリスタートファイルを保存することができます。指定したファイル名に"*"が入っていればステップ数に置換してくれます。
restart 1000 hoge.*.restart
run 100000
write_restart hoge.restart
これはwrite_dumpコマンドとdumpコマンドの関係と同じです。なお、リスタートファイルはバイナリ形式なのでテキストエディタで開いても読めません。
リスタートファイルに何が保存されて何が無視されるかは結構複雑なので、詳しくはread_restartコマンドのマニュアルを見ることをおすすめします。
特にfixの条件がややこしく、保存と再開の繰り返しで状態依存しすぎると脳みそがついていかなくなるので、fixはrunのたびになるべく解放しておくほうが見通しが良い気がしています。
一方、読み込みについては3種類のコマンドがあります。read_restart, read_dump, read_dataです。
read_restartはリスタートファイルを読むもの、read_dumpは実行中にdumpコマンドでファイルに書き出した原子の位置情報を読み込むもの、read_dataは(ケースによっては分子のボンドの情報なども含めて)原子の配置を特定の形式で書いたファイルを読むものという位置づけでよいと思います。
系の原子が持つ情報はポテンシャルに依存しています。
固体材料系でよく使われるポテンシャル(EAMやStillinger-Weber、Tersoffなど)や化学反応を扱うポテンシャル(ReaxFFなど)であれば初期条件は基本的に原子の位置のみですが、固定電荷ポテンシャルの場合は原子ごとの電荷なども入力になります。分子系ポテンシャルでは原子の結合状態も入力の一部になります。
そのため、read_dumpやread_dataを使って読み書きをする際には、ポテンシャルに応じてそれらの情報も必要になります。
より正確に記すと、原子が持つべき情報をatom_styleコマンドで指定します。そして、データの入出力はこのatom_styleで指定した形式に依存するという形になります。
スクリプトの制御
何らかのシミュレーションが終わった後、一度今までの実行結果をすべて破棄するのにはclearコマンドを使います。LAMMPSを一旦終了させて再起動したようなイメージです。
create_boxやread_restartなどシミュレーション格子を作成するコマンドは本来一度しか呼べませんが、clearコマンドをまたげば使えます。
clear
他のスクリプトファイルを読み込むにはincludeコマンドを使います。
include in.hoge
名前空間のような扱いはなく、variableなどを保持したままそこから指定先のスクリプトを上から順に読んでいきます。
引数の受け渡しみたいなことをしたければ、異なるスクリプト間で同じ名前の変数でやりとりしましょう。
ifコマンドによる条件分岐や、ループも存在しています。ループはvariableとlabelとgotoを使った素朴なものです。
スクリプト中でシェルを呼ぶことができます。Pythonとの結合は力を入れているようで、LAMMPS側からデータの入出力も含めてPythonを呼ぶこともできます。
ただし、Pythonモジュールを入れてLAMMPSをコンパイルする必要があります(デフォルトではオフになっています)。
shell mkdir hoge
python p1 file hoge.py
python p1 invoke
LAMMPSスクリプト内で複雑なフローを書くこともできますが、個人的にはそういった制御は外部のスクリプト(シェルやPythonなど)にまかせてしまって、LAMMPSはなるべく疎結合にしたうえで外部から呼ぶ程度のほうが見やすいかなと考えています。