Abinitビルドの備忘録

## Abinitの概要
[Home | ABINIT](https://www.abinit.org/)
平面波基底を使った第一原理計算コード。密度汎関数理論ベースのSCF計算、バンド計算が出来る。ポストプロセスとしてDensity functional perturbation theoryや多体摂動理論の計算も行える。

## Abinitのbuild
### ABINIT 10.0.5 w/o wannier90 on Ubuntu 24.04 (WSL)
Windowsで実行できるように、WSLにUbuntu 24.04をいれて (参考 [WSL入れてやってみたこと #WSL - Qiita](https://qiita.com/Yasushi-Shinohara/items/5c3509b9e73432e1fb0c) )abinitの2024/6/19での最新版 10.0.5を入れてみた。
開発環境を入れる際に
```console
sudo apt install gfortran
sudo apt install libfftw3-dev #FFTW関係 
sudo apt install liblapack-dev #LAPACK関係と依存するBLAS関係のインストール
sudo apt install libopenmpi-dev
sudo apt install openmpi-*
sudo apt install make
```
で入れた。(最初、`apt install libopenmpi-dev`を入れ忘れていたために、openmpiがうまくリンクされず、configureでコケていた。)

あとは基本的に[Abinit 9.2.2 w/o wannier90 on Kubuntu 20.04](https://qiita.com/Yasushi-Shinohara/items/f2baf0d2c9a91c62a440#abinit-922-wo-wannier90-on-kubuntu-2004)と同じ。
`hostname.ac9`を作って、手元の環境に合わせて編集し、`./configure`。そこで出てくる`${ABINIT_ROOT}/fallbacks/build-abinit-fallbacks.sh`を実行すると、LibxcとNETCDFがビルドされる。端末に表示されるテキストを`hostname.ac9`に追記して、
`./configure`, `make`, `make install`でおしまい。

### Abinit 9.2.2 w/o wannier90 on Kubuntu 20.04
公式ページ[Packages | ABINIT](https://www.abinit.org/packages)を見ると、Abinitの9.0.2はbeta releaseと書いてあるので、ビルドにてこずったのは、それが理由かも。9.2.2はproduction releaseと書いてある。

手始めにプレーンな設定(MPIは使うが、libxc/wannier90とのリンクはしない)でビルドを試みる。9.2.2では`hostname.ac9`を使ったconfigureをやたらと推してくるので、それに従って入れることにした。テンプレートは`${ABINIT_ROOT}/doc/build/config-template.ac9`にある。このファイルは`hostname -s`コマンドで帰ってくるホスト名(hostnameとする)を使って`hostname.ac9`とする必要がある。このファイルをconfigureするディレクトリに作り、テンプレートの中身を流し込んだ後に、中のいくつかの設定を変更する。

```config:hostname.ac9
#prefix="${HOME}/hpc"
prefix="${HOME}/opt/abinit-9.2.2"
```
例えば、prefixならこんな感じで。編集した個所だけ抜粋すると

```config:hostname.ac9
prefix="${HOME}/opt/abinit-9.2.2"
CC="mpicc"
CXX="mpicxx"
FC="mpif90"
with_mpi_flavor="native"
```
というかんじ。MPIはapt-getで入れたOpenMPI。この状態で`./configure`をすると、`hostname.ac9`の中身を読んでconfigureしてくれる。

```console
Abinit feature triggers status
==============================

The following summary table indicates the status of the feature triggers,
whether they are available and working, how they have been initialized
and whether there are fallbacks to substitute broken ones.

  +----------------+--------+--------+--------+--------+
  |Feature         |Enabled |Init    |Working |Fallback|
  +----------------+--------+--------+--------+--------+
  |abinit_common   |no      |def     |unknown |no      |
  |bigdft          |        |        |        |disabled|
  |fft             |yes     |def     |yes     |no      |
  |fftw3           |no      |def     |unknown |no      |
  |gpu             |no      |def     |no      |no      |
  |hdf5            |yes     |dir     |no      |disabled|
  |levmar          |no      |def     |unknown |no      |
  |libpaw          |no      |def     |unknown |no      |
  |libpsml         |no      |def     |unknown |disabled|
  |libxc           |no      |def     |unknown |disabled|
  |libxml2         |no      |def     |unknown |no      |
  |linalg          |yes     |def     |yes     |disabled|
  |mpi             |yes     |env     |yes     |no      |
  |netcdf          |yes     |dir     |yes     |disabled|
  |netcdf_fortran  |yes     |dir     |yes     |disabled|
  |papi            |no      |def     |unknown |no      |
  |pfft            |no      |def     |unknown |no      |
  |triqs           |no      |def     |unknown |no      |
  |wannier90       |no      |def     |unknown |disabled|
  |xmlf90          |no      |def     |unknown |disabled|
  +----------------+--------+--------+--------+--------+


  +------------------------------------------------------------------+
  | WARNING : HDF5 is not WORKING !                                  |
  +------------------------------------------------------------------+
  |                                                                  |
  | Please specify the installation directory of a working HDF5 library  |
  |                                                                  |
  | Note: NetCDF and NetCDF-fortran depend of HDF5. So we cannot test  |
  | whether NetCDF and NetCDF-fortran are properly installed.        |
  +------------------------------------------------------------------+


  +------------------------------------------------------------------+
  | CAUTION : LibXC is MANDATORY !                                   |
  +------------------------------------------------------------------+
  | suggestion: use with_libxc in the ac9 file                       |
  +------------------------------------------------------------------+


  +------------------------------------------------------------------+
  | We can help you !                                                |
  +------------------------------------------------------------------+
  | Your environment does not provide mandatory libraries, but we can build them for you.  |
  | Please issue:                                                    |
  |                                                                  |
  | cd fallbacks                                                     |
  | ./build-abinit-fallbacks.sh                                      |
  |                                                                  |
  | At the end of the process, the options needed to link            |
  | the external libraries will be proposed.                         |
  |                                                                  |
  | Just copy/paste the options in your ac9 file and rerun configure.  |
  +------------------------------------------------------------------+


  +------------------------------------------------------------------+
  | Problems must be solved before continuing                        |
  +------------------------------------------------------------------+

checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating fallbacks/INSTALL
config.status: creating fallbacks/README
config.status: creating fallbacks/build-abinit-fallbacks.sh
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
config.status: executing default commands
checking which fallbacks to look for... none
```
が表示として得られた。どうも、libxcが必須になったよう。関連した不足ライブラリをfallbackとして用意してもらっているようなので、インストラクションに従って`fallbacks/build-abinit-fallbacks.sh`を実行すると色々ダウンロードしたりビルドしてくれて、最終的に`hostname.ac9`に記述すべきテキストを標準出力に表示してくれる親切設計。そのテキストを`hostname.ac9`の末尾(末尾でなくてもよいだろうけども、最後に書いた変数がアクティブになるはずなので、一応末尾に)にコピペしてconfigureをすると、無事ビルド完了。
前後を確認するとwannier90もfallbackでビルドしてくれそうな気もしたけれど、また今度の機会に試すことにした。

### Abinit 9.0.2のbuild with libxc/wannier90 on Kubuntu 19.10
9.0.2では、8.10.1と比べて、configure時のオプションが若干変わった。ここではlibxc-4.3.4とwannier90-3.1.0をリンクすることを考える。

wannier90-3.1.0のインストールは若干癖があるので、他([Wannier90ことはじめ - Qiita](https://qiita.com/Yasushi-Shinohara/items/ca58fba8878d2eed0aa3))にまとめた。libxcは`./configure --prefix=/hoge`, `make`, `make install`で入るはず。

```bash
./configure --prefix=/home/hoge/opt/abinit-9.0.2 FC=mpif90 CC=mpicc CXX=mpic++ --with-libxc=/home/hoge/opt/libxc-4.3.4 --with-wannier90=/home/hoge/opt/wannier90-3.1.0 --with-hdf5 --with-netcdf --with-netcdf-fortran --with-mpi
```
でMakefileが出来るはず。
事前に、`sudo apt install libopenmpi-dev`で、OpenMPI関係はインストールしてあった。あと、最初のconfigure時に、HDF5, netCDF, netCDFFが足りない旨のwarning

```
  +------------------------------------------------------------------+
  | WARNING : HDF5 is not WORKING !                                  |
  +------------------------------------------------------------------+
  |                                                                  |
  | Please point the configuration to a working HDF5 installation    |
  |                                                                  |
  | Note : NetCDF and NetCDFF depend of HDF5. So we can not test     |
  | the functioning of NetCDF and NetCDFF.                           |
  +------------------------------------------------------------------+
```
が出たので、`sudo apt install libnetcdff-*`で関連しそうなライブラリを入れたら、configureが通った。
ちなみに、きちんとconfigure通ると、標準出力の最後は以下のような感じに:

```
Core build parameters
---------------------

  * C compiler       : gnu version 9.2
  * Fortran compiler : gnu version 9.2
  * architecture     : unknown unknown (64 bits)
  * debugging        : basic
  * optimizations    : standard

  * OpenMP enabled   : no (collapse: ignored)
  * MPI    enabled   : yes (flavor: auto)
  * MPI    in-place  : no
  * MPI-IO enabled   : yes
  * GPU    enabled   : no (flavor: none)

  * LibXML2 enabled  : no
  * HDF5 enabled     : yes (MPI support: no)
  * NetCDF enabled   : yes (MPI support: no)
  * NetCDF-F enabled : yes (MPI support: no)

  * FFT flavor       : goedecker (libs: auto-detected)
  * LINALG flavor    : netlib (libs: auto-detected)

  * Build workflow   : monolith

0 deprecated options have been used:.

Configuration complete.
You may now type "make" to build Abinit.
(or "make -j<n>", where <n> is the number of available processors)

```
ここまでくれば、`make`からの`make install`でビルドおしまい。
実行時に、動的ライブラリである`libwannier90.so`にpathが通ってないと、コケるので

```bash
export LD_LIBRARY_PATH=/home/hoge/opt/wannier90-3.1.0/lib:$LD_LIBRARY_PATH
```
を忘れないこと。

### Abinit 8.10.3のbuild
ある環境でのビルド例。libxcとwannier90はfallbackのものを使う設定。

```bash
./configure FC=mpiifort CC=mpiicc CXX=mpicxx --prefix=/dir/to/be/installed/abinit-8.10.3 --with-dft-flavor="libxc+wannier90" --with-linalg-flavor="mkl"
```

### Abinit 8.10.1のbuild
参考になる資料：[INSTALLING ABINIT](https://wiki.abinit.org/lib/exe/fetch.php?media=build:installing_abinit.pdf) (**PDF注意**)

FortranとC, C++のコンパイラの外にBLAS, LAPACKは必須なのでビルドするか、`yum`等のパッケージマネージャーでインストールする。

一先ずビルドを成功させて、前向きな気分を維持したいとき。
ソースコードを展開して出来たディレクトリで、

```bash
./configure --prefix=/opt/place/to/be/installed 
```
少し欲張ってMPI(openMPIを念頭)を使ってビルドしたいとき

```bash
./configure --prefix=/opt/place/to/be/installed FC=mpif90 CC=mpicc CXX=mpic++
```

そして、`make`と`make install`でインストール完了。

#### よく使う`configure`のオプション
```bash
--with-trio-flavor=netcdf #ASCIIの外にNetCDFの出力が得られる
--with-dft-flavor=libxc #libxcを適宜リンクしてくれる
--with-linalg-flavor=mkl #MKLがある場合。intelのコンパイラを使っているときとか
# パッケージ管理で入れた(ビルドしていないもの)fftw3をリンクするとき
--with-fft-flavor="fftw3"
--with-fft-incs="-I/usr/include/"
--with-fft-libs="-L/usr/lib64/ -lfftw3 -lfftw3f"
```

##

## トラブルシューティング
### abinit 8.10.1 & Open MPI 4.0.0 & gcc 4.8.5 on CentOS 7.3.1611 でビルド出来ない
エラーメッセージを見ると、`$(ABINIT_SOURCE)/src/12_hide_mpi/m_xmpi.F90`にある`MPI_Attr_get`がうまく呼べないところでこけていた。
代わりにOpen MPI 3.1.3を使うことでビルド成功。

**コメント**
以下のリンク先にあるとおり、Open MPI 4.0.0ではMPI-2.0での非推奨項目をデフォルトでは提供しないようになった事が問題だったよう。この非推奨項目の一つが`MPI_Attr_get`。この関数はScaLAPAcKで使っているらしくて、それなりに方々で影響がありそう。
[Default Open MPI 4.0.0 does not provide functions deprecated in MPI-2.0 · Issue #6114 · open-mpi/ompi · GitHub](https://github.com/open-mpi/ompi/issues/6114)

### abinit 8.10.1 & Open MPI 3.1.3 & gcc 4.8.5 on CentOS 7.3.1611 でビルドすると実行中でスタックする
直前の項目でも書いたようにabinit 8.10.1はOpen MPI 3.1.3でビルド出来る。しかし、計算を実行している最中に不規則な箇所でスタックし、CPUを占有したまま一切のファイル出力をしなくなる。エラーメッセージも吐かない。確認した範囲ではアプリのバージョンをabinit 8.8.2にしても同様。
同様の問題は、MPIを使わずにシリアル用のバイナリをビルドすると現れない。したがって、何かしらMPIとの相性で問題が表れているよう。
この問題はOpenMPIを使わずにmpich ([MPICH | High-Performance Portable MPI](https://www.mpich.org/))を使う事で(観測している範囲では)解決した。

**コメント**
まずは、スタックするビルドの作り方。
Open MPI 3.1.3とgcc 4.8.5(ディストリビューションのデフォルト)にPATHを通した状態で

```bash
./configure --prefix=/opt/abinit-8.10.1_gcc FC=mpif90 CC=mpicc CXX=mpic++ --with-dft-flavor="libxc" --with-trio-flavor="netcdf" --with-fft-flavor="fftw3" --with-fft-incs="-I/usr/include/" --with-fft-libs="-L/usr/lib64/ -lfftw3 -lfftw3f"
```
MPI絡みだという事は、シリアル版では問題が表れない事で確認したので、試しに`--enable-mpi-io="no"`として問題になりそうなMPIの機能だけオフにしてみたが、やはり解決しなかった。`--with-trio-flavor="netcdf"`のオプションもあんまり関係なさそう。
`ulimit -s unlimited`にしているので、stacksizeの問題でもなさそう。環境変数の`export GFORTRAN_UNBUFFERED_ALL=y`も試したけれど関係なさそう。

かわりにMPICH 3.3とgcc 4.8.5にPATHを通して上記の`configure`を行ってビルドしたところ、(観測している範囲では)まともに動いた。
過去abinit 8.8.2をOpen MPI 3.1.1、インテルコンパイラ(18.0.3) on CentOS 7.5.1804でビルドした時にはこうした問題は現れなかった。他にもOpen MPIとインテルコンパイラでビルドした時には出会ったことが無い問題だった。gccの挙動もある程度関連している気がする。