ASE (Atomic Simulation Environment) 導入記録

この文書は[Atomic simulation environment (ASE)](https://wiki.fysik.dtu.dk/ase)を東京大学物性研究所システムB (ohtaka) へ導入する/した際の導入手順です（随時更新）。ドキュメントに書いてある通り何も考えずに``pip``を実行するとうまくいかないことが分かったので、後のために記録することにしました。

:::note info
このページは随時更新中です。
:::

## 環境
以下のモジュールを使用しています。
```
module list
```
の出力
```
 1) intel_mpi/2020.4.304   2) intel_compiler/2020.4.304   3) intel_mkl/2020.4.304  
```
## ASEのインストール

Webpageに書いてあるように（pipをpip3に変更）以下を実行するとうまくいかないことが分かりました。
```
pip3 install --upgrade --user ase
```
そこでホームに``ASE``というディレクトリを作成し、そこで以下の仮想環境（ase）を作成しました（ディレクトリ名等は適宜変更して下さい）。GPAWのビルドにpython 3.8が必要なので、明示的にpython3.8を指定しました。
```
python3.8 -m venv ase
```
今の場合、以下のようにして次に環境を有効にしました。
```
source ./ase/bin/activate
```
先ずはこの仮想環境においてpipをアップグレードします。
```
pip install -U pip
```
次にASEと関連するモジュールを以下のようにインストールしました
```
pip install numpy scipy ase cymem cython decorator mpi4py pytest
```
インストールされたパッケージは以下の通りです（``pip list``）。
```
Package         Version
--------------- -------
ase             3.22.1
attrs           22.1.0
cycler          0.11.0
cymem           2.0.6
Cython          0.29.32
decorator       5.1.1
fonttools       4.34.4
iniconfig       1.1.1
kiwisolver      1.4.4
matplotlib      3.5.2
mpi4py          3.1.3
numpy           1.23.1
packaging       21.3
Pillow          9.2.0
pip             22.2.2
pluggy          1.0.0
py              1.11.0
pyparsing       3.0.9
pytest          7.1.2
python-dateutil 2.8.2
scipy           1.9.0
setuptools      41.6.0
six             1.16.0
tomli           2.0.1
```
## GPAWのインストール
次にGPAWのインストールを行います。幾つかのライブラリが必要なので、以下ではそれらも含めてインストールの手順を記録しています。

### libxcのインストール

交換相関汎関数のライブラリ[libxc](https://www.tddft.org/programs/libxc/)の、インストール時の最新版 (5.2.3) を入手しました。適当な作業ディレクトリで以下を実行します。
```
wget http://www.tddft.org/programs/libxc/down.php?file=5.2.3/libxc-5.2.3.tar.gz -O libxc-5.2.3.tar.gz
```
次にアーカイブの展開します。
```
tar xf libxc-5.2.3.tar.gz
```
展開したディレクトリに移動します。
```
cd libxc-5.2.3
```
以下のようにconfigureを実行します。
```
./configure CC=icc CFLAGS="-O2 -fPIC" --enable-shared --prefix=${HOME}/local
```
makeを実行します。ここではホームディレクトリの``local/lib``以下にライブラリをインストールするものとしています。
```
make
```
問題無くビルドできれば、インストールを実行します
```
make install
```
念のため、指定したディレクトリに（``--prefix``以降）に``libxc.a``などのライブラリがインストールされているかどうかを確認しておきます。

### libvdwxcのインストール

効率的vdW-DF計算を可能にする[libvdwxc](http://libvdwxc.org)のインストールも行いました。GPAWにも実装されている筈なので無くても困らないとは思います。ウェブページの記載通りにはインストールできないので、こちらも記録しておくことにしました。


:::note warn
libvdwxcとは独立でGPAWのビルドで問題があったので、libvdwxcの導入は保留したため、動作確認ができていません。
:::

libvdwxの入手
```
git clone https://gitlab.com/libvdwxc/libvdwxc.git
```
ソースディレクトリへの移動と``configure``の生成を行います。クローンした時点では``configure``は生成されていないようです。
```
cd libvdwxc
```
```
./autogen.sh
```
作業ディレクトリを生成し、移動します。
```
mkdir build
```
```
cd build
```
以下のようにConfigureを実行します。
```
../configure --prefix="$HOME/local" CC=icc FC=ifort CFLAGS="-O3" FCFLAGS="-O2" FFTW3_LIBS="-L$MKLROOT -mkl=parallel" FFTW3_INCLUDES="-I$MKLROOT/include/fftw"
```
問題無くconfigureできたことが確認できたら、ビルドしてインストールします。
```
make
```
```
make install
```

## GPAWのインストール

GPAWのソースを入手します。

:::note warn
最新版（22.1.0）はpytestの途中で失敗することが分かりました。以下では21.1.0を使用します。
:::

```
wget https://pypi.org/packages/source/g/gpaw/gpaw-21.1.0.tar.gz
```
GPAWを展開、ディレクトリに移動します。
```
tar xf gpaw-21.1.0.tar.gz
```
```
cd gpaw-21.1.0
```
``siteconfig.py``を編集します。今回は以下のようになりました。
```siteconfig.py
# openmp
extra_compile_args += ['-fopenmp']
extra_link_args += ['-fopenmp']
extra_link_args += ['-fPIC', '-O2']
extra_link_args += ['-mkl=sequential']

# compiler

compiler = 'icc'
mpicompiler = 'mpiicc'
mpilinker = 'mpiicc'
# platform_id = ''

# FFTW3:
fftw = True
if fftw:
    include_dirs += ['/home/local/intel/compilers_and_libraries_2020.4.304/linux/mkl/include/fftw']

# ScaLAPACK (version 2.0.1+ required):
scalapack = True
if scalapack:
    libraries += ['mkl_def', 'mkl_scalapack_lp64', 'mkl_blacs_intelmpi_lp64']

# LibXC:
# In order to link libxc installed in a non-standard location
# (e.g.: configure --prefix=/home/user/libxc-2.0.1-1), use:

# - static linking:
if True:
    xc = '/home/k0472/k047203/local/'
    include_dirs += [xc + 'include']
    extra_link_args += [xc + 'lib/libxc.a']
    if 'xc' in libraries:
        libraries.remove('xc')

# - dynamic linking (requires rpath or setting LD_LIBRARY_PATH at runtime):
if 0:
    xc = '/home/k0472/k047203/local/'
    include_dirs += [xc + 'include']
    library_dirs += [xc + 'lib']
    # You can use rpath to avoid changing LD_LIBRARY_PATH:
    extra_link_args += ['-Wl,-rpath={xc}/lib'.format(xc=xc)]
    if 'xc' not in libraries:
        libraries.append('xc')
```
ここでは``libvdwxc``を使用していませんが、vdW-DFを使用したい場合は含める必要があります（今後導入予定）。
``siteconfig.py``の用意ができたらビルドを実行します。
```
python setup.py build
```
ビルドが問題無く実行できたらインストールを実行します。
```
python setup.py install
```
次にテストを行います。``srun``を使用して``gpaw info``を実行します。以下がジョブスクリプトの例です。
```run_gpaw_info
#!/bin/sh
#SBATCH -J gpaw_info
#SBATCH -p i8cpu
#SBATCH -N 1
#SBATCH -n 1

module load intel_mpi/2020.4.304 intel_compiler/2020.4.304 intel_mkl/2020.4.304  
source ${HOME}/ASE/ase/bin/activate

srun gpaw info
```
出力結果は以下です。
```
| python-3.8.12     /home/k0472/k047203/ASE/ase/bin/python                                                                                            |
| gpaw-21.1.0       /home/k0472/k047203/local/src/gpaw-22.1.0/gpaw/                                                                                   |
| ase-3.22.1        /home/k0472/k047203/ASE/ase/lib64/python3.8/site-packages/ase/                                                                    |
| numpy-1.23.1      /home/k0472/k047203/ASE/ase/lib64/python3.8/site-packages/numpy/                                                                  |
| scipy-1.9.0       /home/k0472/k047203/ASE/ase/lib64/python3.8/site-packages/scipy/                                                                  |
| libxc-5.2.3       yes                                                                                                                               |
| _gpaw             /home/k0472/k047203/ASE/ase/lib64/python3.8/site-packages/gpaw-21.1.0-py3.8-linux-x86_64.egg/_gpaw.cpython-38-x86_64-linux-gnu.so |
| MPI enabled       yes                                                                                                                               |
| OpenMP enabled    no                                                                                                                                |
| scalapack         yes                                                                                                                               |
| Elpa              no                                                                                                                                |
| FFTW              yes                                                                                                                               |
| libvdwxc          no                                                                                                                                |
| PAW-datasets (1)  /home/k0472/k047203/ASE/gpaw-setups-0.9.20000                                                                                     |
```

テストを実行する前にPAWポテンシャルの準備をしておきましょう。ここでは最新版のgpaw setupsを使用し、``$HOME/ASE``にファイルを置くものとします。``$HOME/ASE``で以下を実行します。
```
wget https://wiki.fysik.dtu.dk/gpaw-files/gpaw-setups-0.9.20000.tar.gz
```
展開します。
```
tar xf gpaw-setups-0.9.20000.tar.gz
```
そして``bash``を使用している場合は``.bashrc``に以下のようにGPAW setupへのパスを記述します。
```
export GPAW_SETUP_PATH=${HOME}/ASE/gpaw-setups-0.9.20000
```

``pytest``によるテストを実行します。ジョブスクリプトは以下です。
```run_pytest.sh
#!/bin/sh
#SBATCH -J gpaw_pytest
#SBATCH -p i8cpu
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 1

module load intel_mpi/2020.4.304 intel_compiler/2020.4.304 intel_mkl/2020.4.304  
source ${HOME}/ASE/ase/bin/activate

srun ${HOME}/ASE/ase/bin/pytest -v > pytest.log
```
いくつかのテストはスキップするようですが、これは並列計算に関係しているためで、``GPAW``自体の問題ではないと思います。

念のため``GPAW``ページに記載されている計算例が実行できるのか試してみます。
ジョブスクリプトは以下のようなものを作成しました。
```run.sh
#!/bin/sh
#SBATCH -J gpaw_test
#SBATCH -p i8cpu
#SBATCH -N 1
#SBATCH -n 1

module load intel_mpi/2020.4.304 intel_compiler/2020.4.304 intel_mkl/2020.4.304  

source ${HOME}/ASE/gpaw-21.1.0/bin/activate

srun python ./h2.py
```
``python``スクリプトは以下です。
```h2.py
import numpy as np
from ase import Atoms
from gpaw import GPAW, PW

h2 = Atoms('H2', [(0, 0, 0), (0, 0, 0.74)])
h2.center(vacuum=2.5)

h2.calc = GPAW(xc='PBE',mode=PW(300), txt='h2.txt')

energy = h2.get_potential_energy()
print(f'Energy: {energy:.3f} eV')

forces = h2.get_forces()
print(f'Forces: {forces[0,2]:.3f} eV/Angstrom')
```
サブミットします。
```
sbatch run.sh
```
``slurm``の出力ファイルには
```
Energy: -6.631 eV
Forces: -0.639 eV/Angstrom
```
という結果が書き出されており、``GPAW``ウェブページと同じ結果が得られることが分かりました。