PIMDとAENETを使って機械学習分子シミュレーションをやってみよう

# 第一原理分子シミュレーション

経路積分第一原理分子動力学法ソフトウエアのPIMDを使って、機械学習分子シミュレーションをやってみることにします。
https://ccse.jaea.go.jp/software/PIMD/index.jp.html

<!--
https://ccse.jaea.go.jp/software/PIMD/2.3.0/license.jp.html 
-->


PIMDはその名前からわかりますように、経路積分法を用いることで量子効果を取り入れた分子動力学計算ができます。
例えば、水素は軽いために量子振動が大きく、量子効果が大きいことが知られています。
したがって、水素の含まれる物質の計算では、第一原理計算を用いた分子動力学法である第一原理分子動力学では足りず、
実際の物質の振る舞いとシミュレーションがずれることが起きるかもしれません。
というわけで、PIMDは経路積分第一原理分子動力学を行うことができるソフトとして知られているのですが、実は経路積分を使わない通常の第一原理計算ソフトとしても様々なことができます。
その例として、PIMDの最新版において実装された機械学習分子動力学をやってみることにしましょう。
なお、最新の機械学習分子シミュレーション手法である「自己学習ハイブリッドモンテカルロ法」
https://arxiv.org/abs/1909.02255
も実装されていますので、そちらを使うことで、「機械学習ポテンシャルを学習させながら物理量を計算する」ということも可能です。

# 使うソフトウエア
1. PIMD  
オープンソースの経路積分第一原理分子動力学法ソフトウエア。 
https://ccse.jaea.go.jp/software/PIMD/index.jp.html

<!--
https://ccse.jaea.go.jp/software/PIMD/2.3.0/license.jp.html 
-->
2. AENET (The Atomic Energy Network)  
http://ann.atomistic.net
aenetは、原子の配置をインプット、第一原理計算によって計算された系のエネルギーをアウトプットとして、エネルギーを模倣するようなニューラルネットワークを作成するオープンソースソフトウェアです。
3. QuantumESPRESSO
https://www.quantum-espresso.org
第一原理計算ソフトウエア。フリーで利用することができる。
4. MateriApps LIVE! VirtualBox版
「MateriApps LIVE! は、手持ちのノートPC などを用いて、気軽に計算物質科学アプリケーションを試せる環境を提供します。MateriApps アプリケーション、OS (Debian GNU/Linux)、エディタ、可視化ツールなど、チュートリアルを始めるのに必要な環境は全て1 本のUSB メモリに収められています。」


# 環境の整備
今回はMateriApps LIVE!を使ってPIMDとAENETをインストールすることにします。
この利点は、VirtualBoxという仮想環境を使っているために、どんなOSでもこの記事通りにやれば誰でもできるからです。
MateriApps LIVE!を使わなくてもMacやLinux PCがあれば同様にできると思います。Windowsは試していないのでわかりません。

## VirtualBoxのインストール
https://www.oracle.com/virtualization/technologies/vm/downloads/virtualbox-downloads.html
このサイトから、自分のOSにあったものを選び、インストールします。
現時点(2019年1月)の最新バージョン6.1.0を使うことにします。
画面に現れる指示に従ってインストールすれば簡単にできると思います。

## MateriApps LIVE!のダウンロードとインストール
http://cmsi.github.io/MateriAppsLive/
の
Download LIVE! Imageというアイコンをクリックして、最新のバージョンをダウンロードしましょう。
大抵のPCであれば64ビット版で良いはずですので、amd64と書かれている方をダウンロードします。
ダウンロードができたら、そのファイルをダブルクリックするとVirtualBoxが立ち上がりますので、インポートします。この時、メモリやCPUなどはご自分の環境に合わせて適当に設定してください。メモリはデフォルトだと1000MBと少ないので、4000MBあたりにしておけば良いでしょう。ここで設定した分のメモリをVirtualBoxが使いますので、実際に積んでいるメモリより少ない値にしてください。ギリギリにすると他のことができなくなる恐れがあるので、少なめにしても良いと思います。
ログインですが、
https://github.com/cmsi/MateriAppsLive/wiki/GettingStartedOVA
にありますように、loginがuserでpassowordがliveです。

[追記]MateriApps LIVE!のv3.2で動作確認済み。

## 設定
ここで、日本語キーボードを使用している方は、ウィンドウの左下のアイコンをクリックし、「System Tools」のLXTerminalをクリックします。
ここ
https://github.com/cmsi/MateriAppsLive/wiki/FAQ
にありますように、

```
setxkbmap -layout jp
```
とすればキーボードの配列が日本語になります。
また、これを毎回入力する手間を省くために、

```
echo setxkbmap -layout jp >> .bashrc
```
としておきましょう。
これで、MateriApps LIVE!の準備ができました。

## PIMDとQuantumEspressoのインストール
次に、PIMDとAENETをインストールします。
PIMDは
https://ccse.jaea.go.jp/software/PIMD/license.jp.html
からダウンロードができます。

このライセンス規約に同意できる方は、
「System Tools」LXTerminalを起動して、

```
mkdir pimd
cd pimd
wget https://ccse.jaea.go.jp/software/PIMD/download/pimd.2.3.0.tar
```
でダウンロードしましょう。これで、homeのpimdディレクトリにソースファイルが展開されました。
次に、PIMDをMateriApps LIVE!でコンパイルできるように設定を行います。

そして、

```
tar -xvf pimd.2.3.0.tar
```
で展開します。

```
cd ~/pimd/
mkdir compile
cd compile
cp ../source/* ./
```
としてソースファイルをコピーします。次に、

```
emacs makefile &
```
としてemacsを起動し、

```
OPTS   = -g -O4 -Wall -framework Accelerate -fbounds-check \
         -Wuninitialized -ffpe-trap=invalid,zero,overflow -fbacktrace
```
および

```
#     compile PIMD with QE
# QE = -Dqe

#     compile PIMD without QE
QE =

```

```
LIBQE = -L../lib/qe/q-e-qe-6.2.1/qelib -lqe -L. -lfftw3
```
を

```
OPTS   = -g -O4 -Wall -lopenblas -fbounds-check \
         -Wuninitialized -ffpe-trap=invalid,zero,overflow -fbacktrace
```

```
#     compile PIMD with QE
 QE = -Dqe

#     compile PIMD without QE
#QE =
```

```
LIBQE = -L../lib/qe/q-e-qe-6.2.1/qelib -lqe
```

と書き換えます。これを保存しておきます。
次に、QEで使うモジュールを

```
make common_variables.o
```
でコンパイルします。



PIMDではQuantumESPERSSO(QE)を使うことができます。
https://www.quantum-espresso.org
第一原理計算をQEで行い、そこから分子間力を計算して分子動力学を行うということです。
ここで、PIMDにQEをソースレベルで連結することで高速に実行するため
https://ccse.jaea.go.jp/software/PIMD/doc/manual/node94.html
に従いQEのソースをダウンロードしインストールします。この時のQEのバージョンは6.2.1でなければなりません。
そこで、
https://github.com/QEF/q-e/releases/tag/qe-6.2.1
からダウンロードします。ダウンロード先はPIMDのlib/qeディレクトリとします。つまり、

```
cd ~
cd pimd/lib/qe/
wget https://github.com/QEF/q-e/archive/qe-6.2.1.zip
```
としてダウンロードします。
その後、解凍し、パッチを当てます。

```
unzip qe-6.2.1.zip
patch -p0 < qe-6.2.1_to_pimdlib.patch
```
そして、makefileの作成をします。

```
cd ~/pimd/lib/qe/q-e-qe-6.2.1
./configure
```
次に、PIMDとリンクさせるために、先ほどコンパイルしたcommon_variables.modをコピーし、Makefileもコピーします。

```
cp ~/pimd/compile/common_variables.mod ./Modules/
cp ~/pimd/compile/common_variables.mod ./PW/src/
cp -p ../Makefile_libqe_pwsrc ./PW/src/Makefile 
cp -p ../Makefile_libqe_modules ./Modules/Makefile
```

これでPIMDにリンクするようのQEのコンパイルができるようになります。

```
make pw
```
ここで何かエラーが出て止まりますが、気にせず以下を行います。

```
cd ./Modules
make
cd ../PW/src
make
make default
```

これでQEの準備は終わりです。

# PIMDのインストール(QEありAENETなし版)
ここまでやると、もうQE入りのPIMDのインストールが可能です。

```
cd ~/pimd/compile/
make
```
とすれば、pimd.xとpimd.mpi.xが作成されます。pimd.mpi.xはmpi並列版です。

ちゃんとインストールされているか確認するためには、exampleでSiO2をやってみましょう。
最初に、擬ポテンシャルを

```
cp -r /usr/share/espresso/pseudo ~/pimd/lib/qe/
```
として用意しておきます。

次に、exampleのSiO2のqe_mdに移動し

```
cd ~/pimd/examples/SiO2/qe_md/
```

```
mpirun -np 1 ../../../compile/pimd.mpi.x
```
で実行してみましょう。npの1は並列数で2や3など増やせばその分並列化されます。

```
==============================================================================
    step     energy [au]  potential [au]  temp [K]  wall clock time           
------------------------------------------------------------------------------
       0   -123.66575533   -123.72882400    300.00  2020-01-14 Tue 13:10:52.49
       1   -123.67463824   -123.84578400   1061.71  2020-01-14 Tue 13:10:56.29
       2   -123.68464768   -123.98601187    811.56  2020-01-14 Tue 13:10:59.96
       3   -123.69028075   -124.08394454    862.25  2020-01-14 Tue 13:11:03.66
       4   -123.69384164   -124.15675215    650.94  2020-01-14 Tue 13:11:07.38
       5   -123.69603126   -124.21094775    567.21  2020-01-14 Tue 13:11:11.13
       6   -123.69741246   -124.25192767    498.78  2020-01-14 Tue 13:11:14.86
       7   -123.69830591   -124.28376114    465.52  2020-01-14 Tue 13:11:18.53
       8   -123.69887698   -124.30912342    421.06  2020-01-14 Tue 13:11:22.31

```
こんな感じのものが出てくれば、ちゃんとQEが動いています。ちなみに、この計算は体積固定温度固定のNVTアンサンブルでの第一原理分子動力学計算で、温度は300Kです。
ゼロから計算し直したい場合には、

```
rm *.ini
```
とiniファイルを消してください。
50回くらい回していくと、温度が300Kの周りで揺らいでいるのがわかります。
また、ここで中断して、rdf.outというファイルを

```
gnuplot
p[0:10] "rdf.out" u 3:5 w l
```
でgnuplotで可視化してみると、SiとOの動径分布関数が得られます。

# PIMDとAENETのインストール
## AENETのコンパイル
PIMDとAENETのマニュアルはこちらにあります。
https://ccse.jaea.go.jp/software/PIMD/doc/manual/node108.html

まず、機械学習ポテンシャルを使うためにAENETをインストールします。
PIMDが対応しているAENETのバージョンとして2.0.3をダウンロードします。
http://ann.atomistic.net/
から、

```
cd ~/pimd/lib/aenet/
wget http://ann.atomistic.net/files/aenet-2.0.3.tar.bz2
tar xvf aenet-2.0.3.tar.bz2
```
とダウンロードし解凍します。
そして、libディレクトリにソースをコピーします。

```
cp -r aenet-2.0.3/src ./
cp -r aenet-2.0.3/lib ./
```
そして、まずlibディレクトリにあるライブラリをコンパイルし、所定の位置にコピーします。

```
cd lib/
make
cp liblbfgsb.a ../../
```

次にパッチを当てます。

```
cd ~/pimd/lib/aenet/
cp -r src src_modified
patch -u -p1 -d src_modified < src.patch
```
これでPIMD用にパッチが当たりました。
次に、AENETをコンパイルし、ライブラリを所定の位置にコピーします。

```
cd src_modified/
make -f makefiles/Makefile.gfortran_openblas_mpi lib
cp libaenet.a ../../
```

## PIMDのコンパイル
AENETがコンパイルできたので、あとはPIMDです。

```
cd ~/pimd/compile/
```
とコンパイル用のディレクトリに移動します。
そして、makefileを

```
#     compile PIMD with AENET
# AENET = -Daenet

#     compile PIMD without AENET
AENET =
```
から

```
#     compile PIMD with AENET
 AENET = -Daenet

#     compile PIMD without AENET
#AENET =
```
に書き換えましょう。

そして、

```
make clean
make
```
でコンパイルができます。

## 動作確認
PIMDとAENETがちゃんと動いているか動作確認をしてみましょう。

```
cd ~/pimd/example/SiO2/aenet_pimd_nvt/
```
に移動します。ここでは、SiO2の構築済み機械学習ポテンシャルを用いて、300KでのNVTアンサンブルの分子動力学を行います。

```
mpirun -np 1 ../../../compile/pimd.mpi.x
```
先ほどのQEと比べてものすごい速さで計算が流れていくのが見えると思います。


#まとめ
機械学習分子シミュレーションをPIMDでやってみました。PIMDとQuantumEspressoとAENETをインストールしました。
もう少し興味のある方は、PIMDのマニュアルは
https://ccse.jaea.go.jp/software/PIMD/doc/manual/manual.html
にありますので、こちらを見てみてください。
AENETを使った学習の話は
https://ccse.jaea.go.jp/software/PIMD/doc/manual/node107.html
にあります。