LAMMPS入門の手引き 0:環境の設定

#分子動力学ソフトウェア LAMMPS

[LAMMPS](https://lammps.sandia.gov/) (Large-scale Atomic/Molecular Massively Parallel Simulator)は、科学技術計算ソフトウェアのひとつで、大規模な古典分子動力学(Molecular Dynamics, MD)計算を行うためのソフトウェアとして誕生しました。
科学技術計算ソフトの一種として、新しいCPUやクラスタマシンのベンチマークとしてもよく見かけます。アメリカのサンディア国立研究所によって開発が行われており、現在でも活発に開発が継続しています。ライセンスはGPLです。

LAMMPSはオープンで汎用的なMDの実行環境としてはデファクトスタンダードとも言える立ち位置に近づいてきており、MDにまつわる様々な手法が日々LAMMPS上で実装されています。

この記事では、いくつかの回に分けて、LAMMPSをはじめて使う人、特にシェル上の操作にそこまで慣れていない人を対象として、LAMMPSを使用した分子動力学計算の第一歩を簡単に紹介しようと思います。

なお、この記事では物理シミュレーションとしての分子動力学法の原理についての解説は行っていませんが、内容は一般的な入門書の範囲に十分収まっていると思います。例えば本記事では「機械・材料設計に生かす 実践分子動力学シミュレーション」を念頭に置いています。
また、この記事で主に扱っている例題は固体材料系のMDですが、LAMMPSは分子系のポテンシャルも扱うことができます。

今回の投稿では、まずLAMMPSの導入手順について簡単に紹介していきます。

#LAMMPSのインストール

###ダウンロードとコンパイル

今回の記事ではフレッシュにインストールしたUbuntu (18.04)を想定してコマンドを書いていますが、自分の環境に応じて読み替えてください。
環境によっては`apt`ではなく`yum`や`brew`を使うことになるでしょう。スパコンのようにroot権限がない環境では(スパコンの場合はLAMMPSの依存しているライブラリは入っていると思いますが)、必要ならライブラリを自前でビルドするなどの対応が必要です。

LAMMPS自体はC++で書かれていますが、一種のスクリプト言語として動作します。LAMMPSのユーザーはコンパイル後の実行ファイルに一連のコマンドを書いたテキストファイルを読ませることで、目的のMD計算を行うことができます。

はじめにビルドのための環境を準備しましょう。とはいえLAMMPSに必要なものはC++のコンパイラとMake、MPIくらいです。以下はOpenMPIを使うことにした場合です。

```
$ sudo apt install build-essential libopenmpi-dev
```

もしMPI環境を導入するのが面倒であったり1コアでしか使わない(PCのVM環境など)場合は、MPIを省略することも可能です。

次はLAMMPSのダウンロードです。公式サイトのダウンロードページにアクセスするか、GutHubから直接持ってきましょう。
[LAMMPS download page](https://lammps.sandia.gov/download.html)

Gitを使うなら適当なディレクトリでgit cloneしましょう。

```
$ sudo apt install git
$ git clone git://github.com/lammps/lammps.git 
```

ソースはsrcディレクトリ以下に入っています。

LAMMPSのビルドは`./configure`でおなじみのAutotoolsを利用したものではなく、同梱のMakefileを使って`make`をするスタイルです。特に、ビルドを行うためには`make`コマンドの後に何らかのオプションをつける必要があります。

オプションなしでmakeコマンドを叩くと丁寧な解説が表示されます。解説が長いので一瞬ビルドが行われたようにも見えますがそんなことはありません。

基本的には`mpi`オプションでいいと思います。前述のようにMPIを使わない場合には`serial`オプションが対応します。

```
$ cd src
$ make mpi
```

このコマンドを叩いたときに呼ばれるMakefileの本体はsrc/MAKEディレクトリ以下に存在しています。(例えばsrc/MAKE/Makefile.mpiなど。)
コンパイラやオプションに拘りがあるなど細かい変更を行いたい場合はこのMakefile内をいじりましょう。

また、makeでエラーが発生した場合はエラーメッセージとエラーが起きたファイルをきちんと覚えておきましょう。メーリングリストなどを検索すると対処法が見つかることが多いです。たいていの場合はmpic++が見つかりません系のエラーのようです。

これとは別にCMakeを使ってLAMMPSをコンパイルする手段も提供されていますが、上記のパッケージの扱いなどのため、現状ではそこまで手間が省けないような気もしています。

###モジュールの導入

LAMMPSは各種機能がモジュール化されており、またそのほとんどすべての機能がデフォルトでオフにされています。このオンオフを切り替えるのもmakeの仕事です。
よく使われる機能もモジュールに入っていることが多く、例えば分子系ポテンシャル、多体ポテンシャル、Ewald法、NEB法などは個別にパッケージとして入っています。
パッケージを導入して全体の挙動が変わることはないので、必要になったときに入れれば大丈夫でしょう。

```
$ make package-status
```

によって現状が把握できます。パッケージHOGEを入れたければ

```
$ make yes-HOGE
$ make mpi
```

とすれば基本的には大丈夫です。
パッケージによってFFTなど外部のライブラリが必要だったり、fortranコンパイラが必要だったりと個別に対応が求められることがあります。

非公式のLAMMPSモジュールも基本的に同じ手順で入れることができます。

###LAMMPSの実行

makeが成功すれば最終的にsrcディレクトリにlmp_mpi (あるいはlmp_serialなど)という実行ファイルが生成されるはずです。
試しにそのまま実行してみても大丈夫です。LAMMPSのバージョンを出力した後に入力受け付け状態になります。Ctrl+Dで終了します。
なお、普通にLAMMPSを実行するとその場所にlog.lammpsというログファイルが作成されます。(実行時に`-log none`オプションをつければ出力されなくなります。)

```
$ ./lmp_mpi
LAMMPS (22 Aug 2018)
(Ctrl+D)
Total wall time: 0:00:03
```

MPI並列化は通常のプログラム通りにできます。`-np`オプションの後に並列化する数を書きます。

```
$ mpirun -np 2 ./lmp_mpi
LAMMPS (22 Aug 2018)
(Ctrl+D)
Total wall time: 0:00:03
```

このlmp_mpiを適当な場所にコピーするなりシンボリックリンクを張るなりしてパスを通すと使いやすくなります。
ただ、自分でLAMMPSに手を加える場合もそうですが、LAMMPSは機能の追加に伴うバージョンの更新が早く、また上記の件で再コンパイルすることもそこそこあるので、更新しても過去の環境が壊れないように複数の実行ファイルを使えるようにしておくと勝手が良いと思います。以下は一例です。

```
$ mkdir ~/my_path
$ mkdir ~/my_path/bin
$ cp lmp_mpi ~/my_path/bin
```

パスの通し方は使っているシェルによるので、わからなければ調べてみてください。典型的には~/.bashrcの末尾に`export PATH=${HOME}/my_path/bin:${PATH}`みたいに書いておくことになります。
この場合、(再ログイン後)適当なディレクトリで`lmp_mpi`と入力してLAMMPSが実行されるようになればOKです。

実際に使う際はLAMMPSのコマンドを手作業で順に入力することはまずなく、適当なテキストファイルに書いておいて実行時に一度に渡します。`-in`オプションに続けてファイル名を書くか、そのまま標準入力に流し込むかすることになります。

```
$ mpirun -np 2 lmp_mpi -in in.script
$ mpirun -np 2 lmp_mpi < in.script
```

なお、LAMMPSをコマンドでなく外部プログラムから使うための手段として、共有ライブラリとしてLAMMPSをコンパイルする方法やPythonから使うための実装などが提供されています。
LAMMPS自体をいじりたいわけではないがLAMMPSの制御を細やかに行いたい、テキストベースではなく内部の生データに直接触りたい、などのモチベーションがあるときに便利です。

また、examplesディレクトリには様々な例題に対応したLAMMPSスクリプトが置いてあります。例題の数が多く、参考になることも多いと思います。
EmacsやVim使いにはLAMMPSスクリプト編集用の設定ファイルが置いてあったりします。

#その他のソフトウェア

以下はLAMMPS以外の話です。LAMMPSはそれ単体で分子動力学計算を行うことのできるソフトウェアですが、プリプロセス(原子の配置など)とポストプロセス(可視化やデータの処理)のために外部のツールを使ったほうが都合が良い場合があります。

プリプロセスは結晶やアモルファスなど固体材料系の構造であればLAMMPS内で直接作ることが多いかと思います。分子の作成は有償・無償含めて様々なソフトがあります。Avogadroなどは導入が簡単かもしれません。

ポストプロセスも数多くありますが、特に計算サーバーなどで回す場合などは手元の環境と実行環境が別になることが多々あるため、サーバー上で実行結果を簡易的に見れるソフトと手元で可視化するソフトを別にすると都合がいいかもしれません。
手元の環境ではOVITO(各種解析ツールがある)やParaview(多様な可視化が可能)などが使われたりします。
サーバー上の可視化では筆者はAtomeyeを使っています。

[Atomeye](http://li.mit.edu/A/Graphics/A/)

Atomeyeのコンパイルはちょっと大変です。手順を追って書いた記事を用意したので、面倒事を避けてAtomeyeを使ってみたい方はぜひご覧ください。

[Atomeyeをビルドする](https://qiita.com/tkmtSo/items/93656c75b60c6728f9eb)

手短に解説しておくと、まずホームディレクトリ直下にCoという名前のディレクトリを作り、その下にBin, Include, Lib, Manというディレクトリを作ります。
また、以下のライブラリをインストールしておきましょう。

```
$ sudo apt install gfortran xterm liblapack-dev libblas-dev libreadline-dev libgsl-dev libx11-dev libxext-dev libxpm-dev libpng-dev libjpeg-dev
```

後はダウンロードしたファイルのReadmeに書いてある順番で各ディレクトリをmakeしていけばいいのですが、コンパイラとコンパイルオプションが手元の環境と合うようにMakefileの中身を修正していく必要があります。

サーバー上でのグラフの描画にはGnuplotを使っています。こちらも各々のお好みに応じてよいものを見つけてもらえればと思います。

次回からはLAMMPSの中身について説明していきます。
→ [LAMMPS入門の手引き 1:静的な計算](https://qiita.com/tkmtSo/items/e43220cd9bbb7634af34)