ASE (Atomic Simulation Environment) 導入記録#2

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


:::note warn
ハミルトニアン行列の厳密対角化は行列の次元がある程度大きくなるとMKLの問題で止まってしまうことも分かっています。OpenAPIの最新版を使うことで回避できるようですが、ohtakaで使用できるoneapi_mkl/2022.1.2ではエラーが発生するようです（OpenAPIとGPAW 22.8.0の組み合わせはまだうまくコンパイルできていません。）。
:::

## 環境
以下のモジュールを使用しています。
```
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_2020.4.304
```
今の場合、以下のようにして次に環境を有効にしました。
```
source ./ase_2020.4.304/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
contourpy       1.0.6
cycler          0.11.0
cymem           2.0.7
Cython          0.29.32
decorator       5.1.1
exceptiongroup  1.0.4
fonttools       4.38.0
iniconfig       1.1.1
kiwisolver      1.4.4
matplotlib      3.6.2
mpi4py          3.1.4
numpy           1.23.5
packaging       21.3
Pillow          9.3.0
pip             22.3.1
pluggy          1.0.0
pyparsing       3.0.9
pytest          7.2.0
python-dateutil 2.8.2
scipy           1.9.3
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のソースを入手します。

```
wget https://pypi.org/packages/source/g/gpaw/gpaw-22.8.0.tar.gz
```
GPAWを展開、ディレクトリに移動します。
```
tar xf gpaw-22.8.0.tar.gz
```
```
cd gpaw-22.8.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/k0227/k022700/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/k0227/k022700/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_2020.4.304/bin/activate

srun gpaw info
```
出力結果は以下です。
```
 ------------------------------------------------------------------------------------------------------------------------------------------------------------
| python-3.8.12     /home/k0227/k022700/ASE/ase_2022.1.2/bin/python                                                                                          |
| gpaw-22.8.0       /home/k0227/k022700/ASE/ase_2022.1.2/lib/python3.8/site-packages/gpaw-22.8.0-py3.8-linux-x86_64.egg/gpaw/                                |
| ase-3.22.1        /home/k0227/k022700/ASE/ase_2022.1.2/lib/python3.8/site-packages/ase/                                                                    |
| numpy-1.23.5      /home/k0227/k022700/ASE/ase_2022.1.2/lib/python3.8/site-packages/numpy/                                                                  |
| scipy-1.9.3       /home/k0227/k022700/ASE/ase_2022.1.2/lib/python3.8/site-packages/scipy/                                                                  |
| libxc-5.2.3       yes                                                                                                                                      |
| _gpaw             /home/k0227/k022700/ASE/ase_2022.1.2/lib/python3.8/site-packages/gpaw-22.8.0-py3.8-linux-x86_64.egg/_gpaw.cpython-38-x86_64-linux-gnu.so |
| MPI enabled       yes                                                                                                                                      |
| OpenMP enabled    yes                                                                                                                                      |
| scalapack         no                                                                                                                                       |
| Elpa              no                                                                                                                                       |
| FFTW              yes                                                                                                                                      |
| libvdwxc          no                                                                                                                                       |
| PAW-datasets (1)  /home/k0227/k022700/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 F1cpu
#SBATCH -N 1
#SBATCH -n 8
#SBATCH -c 1

module load intel_mpi/2020.4.304 intel_compiler/2020.4.304 intel_mkl/2020.4.304  
source ${HOME}/ASE/ase_2020.4.304/bin/activate

srun pytest --pyargs gpaw -v
```

OpenAPIを使ってビルドしたとき、ここではうまく行かず、終了してしまいました。エラーメッセージは以下です。
```
srun: error: c15u03n3: task 0: Exited with exit code 2
srun: launch/slurm: _step_signal: Terminating StepId=1107423.0
```

それでもあきらめずに水素分子のテストをしたところ、以下のようなエラーが出力されました。
```
INTEL MKL ERROR: /opt/intel/oneapi/mkl/2022.0.2/lib/intel64/libmkl_def.so.2: undefined symbol: mkl_sparse_optimize_bsr_trsm_i8.
Intel MKL FATAL ERROR: Cannot load libmkl_def.so.2.
srun: error: c15u05n4: task 0: Exited with exit code 2
srun: launch/slurm: _step_signal: Terminating StepId=1107508.0
```
ググってみたところ、以下を試すと良い、との情報がありました。
```
export LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_def.so:/opt/intel/mkl/lib/intel64/libmkl_avx2.so:/opt/intel/mkl/lib/intel64/libmkl_core.so:/opt/intel/mkl/lib/intel64/libmkl_intel_lp64.so:/opt/intel/mkl/lib/intel64/libmkl_intel_thread.so:/opt/intel/lib/intel64_lin/libiomp5.so
```
これを実行すると水素分子のテストはうまく走るようになりました。