今回は、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はなるべく疎結合にしたうえで外部から呼ぶ程度のほうが見やすいかなと考えています。