PIMD+Quantum-ESPRESSO+AENETのコンパイル

#はじめに
[PIMD](https://ccse.jaea.go.jp/software/PIMD/index.jp.html)は高度に並列化された分子動力学シミュレーションプログラムで、経路積分分子動力学をはじめとした高度な分子動力学シミュレーションを実行することが可能です。またDFTB++などの半経験的計算プログラムやQuantum-ESPRESSO、CP2K、VASPなどの密度汎関数プログラムとのカップリングにより様々なレベルの精度での分子動力学シミュレーションが可能です。さらに人工ニューラルネットワークに基づいたポテンシャルをAENETを用いて生成することも可能です。
ここでは以下の環境でQuantum-ESPRESSO（QE）とAENETの使用を可能としたPIMD（2.4.0）のコンパイルの手順を記述しま。
- システム：Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz
- コンパイラ：ifort version 19.1.2.254
#準備
`~/.bashrc`に以下を追加し必要なモジュールをログイン時に読み込むように設定します。

```Bash
module load intel/2020.2.254
module load intelmpi/2020.2.254
module load python/3.8
```
PIMDプログラムのビルドは以下で行うことにします。

```Bash
~/PIMD/src
```

##PIMDのダウンロード
``~/PIMD/src``以下でPIMD 2.4.0用ディレクトリを作成します（ディレクトリ名は好みでつけて下さい）。ここでは``pimd-2.4.0``とします。``~/PIMD/src/pimd-2.4.0``で以下を実行しpimd-2.4.0のソースコードをダウンロード、解凍します。

```Bash
wget https://ccse.jaea.go.jp/software/PIMD/download/pimd.2.4.0.tar
```

```Bash
tar xvf pimd.2.4.0.tar
```

コンパイル用のディレクトリを作成します。

```Bash
mkdir compile
```

``compile``ディレクトリに移動して``source``ディレクトリにあるファイルをコピーします。

```Bash
cd compile
````

```Bash
cp ../source/* .
```

``compile``ディレクトリに移動しmakefileを編集します。

```Bash
cd compile
```

``makefile``のコンパイラとコンパイラオプションをシステムにあわせて変更します。これらは以下で記述するQEと矛盾しないようにしておく必要があります（QEのコンパイルの経験が無い場合には先にスタンドアローンのQEのコンパイルを行ってオプションを確定しておくと良いでしょう）。

- コンパイラ

```bash
FCMP = mpiifort
```

- コンパイラオプション

```bash
OPTS   =  -O2 -g -traceback -w \
          -xSSE4.2 -axCOMMON-AVX512,CORE-AVX512,CORE-AVX2,CORE-AVX-I,AVX \
          -static-intel -qopenmp \
          -I ${MKLROOT}/include/fftw
```
ここで二行目の

```bash
          -xSSE4.2 -axCOMMON-AVX512,CORE-AVX512,CORE-AVX2,CORE-AVX-I,AVX \
```
というオプションは、我々が使用しているクラスタシステムに複数の異なるマシンが存在するために指定しているものです。また``-static-intel``というオプションは不要かもしれません。また古いintelコンパイラでは問題ありませんでしたが、最近のバージョンでは``-O3``オプションを指定するとコンパイラの内部エラーのためうまくいきませんでした。この問題は``-O2``を指定することで解消されました。

- QE用オプション

```bash
QE = -Dqe
```

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

```bash
LIBMKL = -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64 \
         -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core
```

- AENET用オプション

```
AENET = -Daenet
```

```
LIBAENET    = -I../lib/aenet/aenet-2.0.3/src \
              ../lib/aenet/aenet-2.0.3/src/libaenet.a \
              ../lib/aenet/aenet-2.0.3/lib/liblbfgsb.a
```

##モジュールの準備
``compile``ディレクトリで以下を実行します。

```bash
make common_variables.o
```

##QEのダウンロード
``compile``からライブラリ用ディレクトリに移動します。

```bash
cd ../lib/qe
```

以下を実行しQE 6.2.1をダウンロードし解凍します。

```bash
wget https://github.com/QEF/q-e/archive/qe-6.2.1.zip
```

```bash
unzip qe-6.2.1.zip
```

次にパッチをあてます。

```bash
patch -p0 < qe-6.2.1_to_pimdlib.patch
```

##QEのコンパイル

``qe-qe-6.2.1``に移動し、以下を実行します。

```bash
MPIF90=mpiifort DFLAGS='-D__OPENMP -D__FFTW3 -D__MPI -D__SCALAPACK' SCALAPACK_LIBS='-lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64' ./configure --enable-openmp
```
生成された``make.inc``を手動で編集します。

```
FFLAGS         = -O2 -assume byterecl -g -traceback -qopenmp -xSSE4.2 -axCOMMON-AVX512,CORE-AVX512,CORE-AVX2,CORE-AVX-I,AVX
```

```
FFLAGS_NOMAIN   = -nofor_main -xSSE4.2 -axCOMMON-AVX512,CORE-AVX512,CORE-AVX2,CORE-AVX-I,AVX
```

さらに``make.inc``中の``IFLAG``に以下を追加します。

```
-I$(MKLROOT)/include/fftw -I../../../compile
```
これで準備ができましたのでpw.x（libqepw.a）をビルドします。

```
make pw
```

##AENETのダウンロード

``q-q-qe-6.2.1``からAENET用ディレクトリに移動します。

```bash
cd ../../aenet
```
以下を実行しAENET 2.0.3をダウンロードし解凍します。

```
wget http://ann.atomistic.net/files/aenet-2.0.3.tar.bz2
```

```
tar jxvf aenet-2.0.3.tar.bz2
```
AENETのディレクトリに移動しパッチを当てます。

```bash
cd aenet-2.0.3
```

```bash
patch -u -p1 -d src < ../src.patch
```

ライブラリのディレクトリに移動し``Makefile``のコンパイラとコンパイラオプションを変更します。

```
FC = ifort -c
```

```
FCFLAGS = -O2 -xSSE4.2 -axCOMMON-AVX512,CORE-AVX512,CORE-AVX2,CORE-AVX-I,AVX
```

コンパイルを実行します。

```bash
make
```

次にソースディレクトリに移動します。

```bash
cd ../src
```

``makefiles``というディレクトリ以下にプラットフォーム毎のmakefileが用意されていますので、``makefiles/Makefile.ifort_intelmpi``を編集します。``FCLFAGS``に以下のオプションを追加します。

```
-O2 -xSSE4.2 -axCOMMON-AVX512,CORE-AVX512,CORE-AVX2,CORE-AVX-I,AVX
```

最後にmakeを実行します。

```bash
make -f makefiles/Makefile.ifort_intelmpi lib
```

##PIMDのコンパイル

QEのディレクトリの``PW/src/``に``libqepw.a``ができていることを確認し、PIMDのコンパイルを行います。

```bash
cd ../../../compile
```

```bash
make
```

#参考
- [PIMDとAENETを使って機械学習分子シミュレーションをやってみよう](https://qiita.com/cometscome_phys/items/660a84119b5d4acce903)