ALAMODE Installation
 
 
  - install anaconda Anaconda (Miniconda)
 % cd $HOME
 インストール用シェルスクリプトをダウンロード
 % wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh
 % chmod u+x Anaconda3-2023.09-0-Linux-x86_64.sh
 % ./Anaconda3-2023.09-0-Linux-x86_64.sh
 conda init を ~/.bashrc 
    に書き込みますか?という以下のメッセージに yesと答える
 You can undo this by running `conda init --reverse $SHELL`? [yes|no]
 [no] >>> yes
 
 インストールが完了すると、~/.bashrcにcondaコマンドを実行できるようになる関数などが追加されます。
 以下は less コマンドを使って .bashrc ファイルの中身を確認しています。閲覧を終了するときは、qボタンを押してください。
 % less ~/.bashrc
 
 ###==================== less command display ====================###
 # >>> conda initialize >>>
 # !! Contents within this block are managed by 'conda init' !!
 __conda_setup="$('/home/rhiguchi/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
 if [ $? -eq 0 ]; then
 eval "$__conda_setup"
 else
 if [ -f "/home/rhiguchi/anaconda3/etc/profile.d/conda.sh" ]; then
 . "/home/rhiguchi/anaconda3/etc/profile.d/conda.sh"
 else
 export PATH="/home/rhiguchi/anaconda3/bin:$PATH"
 fi
 fi
 unset __conda_setup
 # <<< conda initialize <<<
 ###===================== enter q to finish ======================###
 
- exitコマンドでセッションを終了し、新しいセッションを開始、.bashrcを読みこむ
 % exit
 (base)%
- 新しくシェルセッションを開始したときに、自動で conda-base 環境に入るように設定されてしまっているので、 conda config コマンドを使って自動起動設定を解除します。
 (base)% conda deactivate
 % conda config --set auto_activate_base false
 % exit
 
 以下のコマンドは、conda-base環境を一度起動して、すぐに元に戻す操作です。仮想環境に入ると、プロンプトが仮想環境の名前になります。
 % conda activate base
 (base)% conda deactivate
 
- alamode専用の仮想環境を作成します。(alamode公式サイト参考 
    https://alamode.readthedocs.io/en/develop/install.html)
 create conda environment for alamode
 (optional) phonopyとpymatgenもインストールします。
 また仮想環境を作り終えた段階で、この後のビルド作業に関わるので、すでにloadされているモジュールといくつかのPATHを確認しておきます。
 % conda create --name alamode python=3
 % conda activate alamode
 (alamode)% conda install -c conda-forge compilers openmpi boost eigen cmake spglib fftw scipy numpy h5py ipython
 (alamode)% conda install -c conda-forge phonopy
 (alamode)% conda install pymatgen
 (alamode)% echo $PATH | tr ":" "\n"
 
 print your PATH ...
 
 (alamode)% echo $PYTHONPATH | tr ":" "\n"
 
 print your PYTHONPATH ...
 
 (alamode)% echo $LD_LIBRARY_PATH | tr ":" "\n"
 
 print your LD_LIBRARY_PATH ...
 
 (alamode)% echo $CONDA_PREFIX
 print your anaconda alamode environment path.
 (alamode)% conda deactivate
 % module list
 print already loaded module....
 Download alamode source and Build "alm" & "anphon"
 初めにgitからalamodeのレポジトリをローカル環境に複製します。 複製を作成するディレクトリを your/path/ として、alamodeのディレクトリが your/path/alamode となっているとします。
 
 Warning :
 神谷・片瀬研究室のサーバーcsrvでは神谷先生の計算支援プログラムDoVASP実行のために、すでに.bashrcファイルを通していくつかのモジュールがロードされており $LD_LIBRARY_PATH と $PYTHONPATH が設定されています。
 実際、module list や echo コマンドで変数を確認すると、空白ではなく何かが返ってきていると思います。
 しかし、この後のビルドのための操作で使用したいcondaに存在しているモジュールやライブラリが、これらのすでに設定されているライブラリと競合することを避ける必要があります。
 また、alamodeレポジトリにある便利なツールを簡単に使用するために、your/path/alamode の中のいくつかのディレクトリを $PYTHONPATH へ追加します。
 注意して設定してください。
 
- git コマンドで alamodeをダウンロードします。その後、ブランチをdevelopブランチへ切り替えます。
 (公式サイトがなぜかdevelopを指定している)
 % pwd
 your/path/
 % git clone https://github.com/ttadano/alamode.git
 % cd alamode
 % git checkout develop
 alamodeレポジトリの構成は以下の通りです。$CONDA_PREFIX は今使用しているcondaの仮想環境へのpath変数です。
 
 your/path/
 ├── alamode
 │   ├── CMakeLists.txt
 │   ├── alm
 │   │   └── CMakeLists.txt
 │   ├── anphon
 │   │   └── CMakeLists.txt
 │   ├── docs
 │   ├── example
 │   ├── external
 │   ├── include
 │   └── tools
 │       └── CMakeLists.txt
 │
 ├── $CONDA_PREFIX/include
 ├── $CONDA_PREFIX/include/eigen3
 ├── $CONDA_PREFIX/lib
 ├── ...
 
- alamode直下に、コンパイルしたバイナリファイルを作成する_buildフォルダを作成し、そのフォルダへ移動します。
 
 % mkdir _build ; cd _build
 Warning : ここから本当に重要な設定です。細心の注意を払って設定してください。
 
 先ほど作成したalamodeの仮想環境を起動するときに、自動で読み込まれるshellスクリプトを作成して、規定のフォルダに配置します。
 規定のフォルダの場所は $CONDA_PREFIX/etc/conda/ にある activate.d と deactivate.d です。
 vimなどのエディターを使って、alamode_act.sh, alamode_deact.sh という名前のシェルスクリプトを作成して、それぞれ配置してください。 スクリプトの中の内容は以下の通りです。
 
 % conda activate alamode
 (alamode)% less $CONDA_PREFIX/etc/conda/activate.d/alamode_act.sh
 
 ###==================== less command display ====================###
 #!/bin/sh
 
 # save the current PATH
 cleaned_path=$(echo "$PATH" | awk -v RS=: -v ORS=: '$0 != "'"$CONDA_PREFIX"'/bin" {print $0}' | sed 's/:$//')
 export OLD_PATH="$cleaned_path"
 # add new PATHs to PATH
 export PATH=$PATH:${HOME}/apps/alamode/_build/alm/
 export PATH=$PATH:${HOME}/apps/alamode/_build/anphon/
 export PATH=$PATH:${HOME}/apps/alamode/_build/tools/
 
 
 # save the default PYTHONPATH
 export OLD_PYTHONPATH="$PYTHONPATH"
 # set a new PYTHONPATH
 export PYTHONPATH="${HOME}/apps/alamode/tools/"
 
 
 # save the current LD_LIBRARY_PATH
 export OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
 # add new PATHs to LD_LIBRARY_PATH
 export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$CONDA_PREFIX/lib64:$LD_LIBRARY_PATH
 ###===================== enter q to finish ======================###
 
 (alamode)% less $CONDA_PREFIX/etc/conda/deactivate.d/alamode_deact.sh
 
 ###==================== less command display ====================###
 #!/bin/sh
 
 #restore PATH
 if [ ! -z "$OLD_PATH" ]; then
 export PATH="$OLD_PATH"
 unset OLD_PATH
 fi
 
 #restore PYTHONPATH
 if [ ! -z "$OLD_PYTHONPATH" ]; then
 export PYTHONPATH="$OLD_PYTHONPATH"
 unset OLD_PYTHONPATH
 fi
 
 #restore LD_LIBRARY_PATH
 if [ ! -z "$OLD_LD_LIBRARY_PATH" ]; then
 export LD_LIBRARY_PATH="$OLD_LD_LIBRARY_PATH"
 unset OLD_LD_LIBRARY_PATH
 fi
 ###===================== enter q to finish ======================###
 
 (alamode)% conda deactivate
 再びalamode仮想環境に入り、これから使用する cmake コマンドがalamode環境下にあることを確認してください。
 
 % conda activate alamode
 (alamode)% which cmake
 print your cmake bin path
 alamode環境下にあることを確認出来たら、cmake, make でビルドを行っていきます。
 まず事前にロードされていたモジュールたちを全てunloadします。
 cmakeコマンドのオプションでコンパイラを指定しようが、これらのロードされているモジュールたちがどうも邪魔をしているらしく、unloadしてコンパイルしないと、anphon実行時にsegmentationエラーが発生していました。
 全てのモジュールをunloadできたらcmakeコマンドを打ちます。使用するライブラリをconda仮想環境のものにしたいので、cmakeコマンドのオプションを使って指定します。
 最後にmakeコマンドでビルドします。
 
 (alamode)% module list
 print already loaded module
 (alamode)% module unload module_name
 print deleting message....
 (alamode)% module list
 No Modulefiles Currently Loaded.
 (alamode)% pwd
 your/path/alamode/_build
 (alamode)% cmake -DUSE_MKL_FFT=no -DLAPACK_LIBRARIES=$CONDA_PREFIX/lib/liblapack.so -DBLAS_LIBRARIES=$CONDA_PREFIX/lib/libblas.so -DSPGLIB_ROOT=$CONDA_PREFIX -DWITH_HDF5_SUPPORT=yes ..
 (alamode)% make -j
 ビルドが完了したら、ldd コマンドを使って、_build/anphon, _build/alm にリンクされているライブラリがalamode環境のものになっているか確認します。
 下は僕がコンパイル完了後に確認した結果です。lib64/ に関してはcondaにそもそも存在していないので、サーバーにあるものをそのまま借用しました。
 カッコ内はメモリアドレスの番号なので実行ごとに変わります。
 
 (alamode)% ldd $(which anphon)
 linux-vdso.so.1 (0x00007ffca59cd000)
 libopenblas.so.0 => /home/rhiguchi/anaconda3/envs/alamode/lib/libopenblas.so.0 (0x0000148020b0c000)
 libmpi.so.40 => /home/rhiguchi/anaconda3/envs/alamode/lib/libmpi.so.40 (0x00001480209ea000)
 libfftw3.so.3 => /home/rhiguchi/anaconda3/envs/alamode/lib/libfftw3.so.3 (0x00001480207cb000)
 libgomp.so.1 => /home/rhiguchi/anaconda3/envs/alamode/lib/libgomp.so.1 (0x0000148022cff000)
 libstdc++.so.6 => /home/rhiguchi/anaconda3/envs/alamode/lib/libstdc++.so.6 (0x00001480205e8000)
 libm.so.6 => /lib64/libm.so.6 (0x000014802024b000)
 libgcc_s.so.1 => /home/rhiguchi/anaconda3/envs/alamode/lib/libgcc_s.so.1 (0x0000148020230000)
 libc.so.6 => /lib64/libc.so.6 (0x000014801fe6d000)
 libpthread.so.0 => /lib64/libpthread.so.0 (0x000014801fc4d000)
 libgfortran.so.5 => /home/rhiguchi/anaconda3/envs/alamode/lib/./libgfortran.so.5 (0x000014801faa2000)
 /lib64/ld-linux-x86-64.so.2 (0x0000148022cd2000)
 libopen-rte.so.40 => /home/rhiguchi/anaconda3/envs/alamode/lib/./libopen-rte.so.40 (0x000014801f9e8000)
 libopen-pal.so.40 => /home/rhiguchi/anaconda3/envs/alamode/lib/./libopen-pal.so.40 (0x000014801f8e8000)
 librt.so.1 => /lib64/librt.so.1 (0x000014801f6e0000)
 libdl.so.2 => /lib64/libdl.so.2 (0x000014801f4dc000)
 libquadmath.so.0 => /home/rhiguchi/anaconda3/envs/alamode/lib/././libquadmath.so.0 (0x000014801f4a3000)
 libz.so.1 => /home/rhiguchi/anaconda3/envs/alamode/lib/././libz.so.1 (0x000014801f488000)
 libutil.so.1 => /lib64/libutil.so.1 (0x000014801f284000)
 alamodeレポジトリにあるtestディレクトリに移動して、テストを行います。
 
 (alamode)% cd your/path/alamode/test
 (alamode)% python test_si.py
 Silicon ALM --> pass
 Silicon ANPHON --> pass
 このときに、次のような警告メッセージが表示された人は、OMPI_MCA_btl という変数を新しく設定してください。
 これはOpenMPIの古いバージョン(4.0/4.1リリース)のibverbsコンポーネントから警告メッセージが発生しているという問題のようで、このサイトを参考にしています。
 先ほど作成した alamode の activate.d/alamode_act.sh, deactivate.d/alamode_deact.sh に、この変数についての設定を入力すると便利です。
 
 --------------------------------------------------------------------------
 WARNING: There was an error initializing an OpenFabrics device.
 
 Local host:   csrv12
 Local device: mlx5_0
 --------------------------------------------------------------------------
 (alamode)% export OMPI_MCA_btl=^openib
 (alamode)% python test_si.py
 Silicon ALM --> pass
 Silicon ANPHON --> pass
 (alamode)% exit
 Build in TSUBAME environment
 基本的には上述のやり方で問題ないのですが、TSUBAME上で環境を構築するときにいくつかの注意点があります。
 ラボサーバーcsrvではanacondaをインストールしました。
 しかしanacondaは容量が大きいため、TSUBAME上でのストレージ制限にかかりやすくなってしまいます。
 そこでMinicondaを使って最小構成で環境を構築しました。
 また個人のディスク容量は25GBと少なく、すぐに足りなくなってしまうので、環境は tga-kklab のディスク上に作成しました。
 個人・グループのディスク容量を確認するには t3-user-info コマンドを使用します。
 
 % t3-user-info disk group
 % t3-user-info disk home
 また、ログインノードでは10分以上のジョブに関しては強制的に停止させられてしまいます。
 conda の仮想環境を作成するために conda install を行うのですが、
 
 (alamode)% conda install numpy scipy matplotlib ....
 このように一気にレポジトリを追加してしまうと、依存関係を解くために非常に時間がかかり、ジョブがタイムアウトしてしまいます。
 
 (alamode)% conda install numpy
 (alamode)% conda install scipy
 ...
 ホームページで必要と記載されているレポジトリだけでも一つずつインストールすることで、タイムアウトから逃れていました。
 conda の仮想環境を作成し終えたら /gs/hs0/tga-kklab/usr/rhiguchi/apps/ に alamode のgitレポジトリを複製して、ビルドします。
 cmakeコマンドは大してリソースを使わないので、ログインノードでそのまま実行しました。
 一方でmakeコマンドは非常にリソースを使ってしまうため計算ノードにジョブを投げました。
 
 #!/bin/bash
 #$ -cwd
 #$ -l q_node=1
 #$ -l h_rt=00:10:00
 #$ -N alamode_make
 #$ -o alamode_make.log
 #$ -j y
 
 # . /etc/profile.d/modules.sh
 # module load
 
 source ~/.bashrc
 conda activate alamode
 make -j
 #python test_si.py
 上記のようなジョブスクリプト job を作成しました。#$ となっている箇所は、qsubコマンドによってオプションの解析が行われるところです。
 .bashrcに書き込まれている conda 環境のアクティベートコマンドを打つために、sourceで読み込み
 alamodeの仮想環境を起動します。オプション -cwd によってqsubを実行したコマンドの場所で処理が行われます。
 実際には /alamode/_build/ で qsub -g tga-kklab job または、無料のお試し qsub job 実行でビルドしました。
 ビルド後のテスト実行のためにも、上記のようなジョブスクリプトを生成して、 python test_si.py を実行しました。
 
 When you failed to build, or some errors occured...
 何かのエラーが発生しているとき、絶対にこれをすればよい、という方法はないのですが、これまで書いてきた方法の中ではこまめにPATH変数を確認してきました。
 
 (alamode)% echo $PATH
 (alamode)% echo $LD_LIBRARY_PATH
 (alamode)% echo $PYTHONPATH
 (alamode)% echo $MODULEPATH
 特に、$PATH, $LD_LIBRARY_PATH, $PYTHONPATH は $CONDA_PREFIX/etc/conda/activate.d/alamode_act.sh などで設定しなおしています。
 正直、これらの変数がどこまで重要かはっきりしていないのですが、確認することは重要だと思います。また、それ以外にも
 
 (alamode)% which cmake
 (alamode)% which anphon
 (alamode)% which alm
 (alamode)% ldd $(which anphon)
 (alamode)% ldd $(which alm)
 (alamode)% module list
 (alamode)% echo ${CC}
 (alamode)% echo ${CXX}
 によって、キチンと PATH が設定できているか、狙ったライブラリを利用できているか、すでにモジュールをロードしていないか、などを確認してください。
 僕は初めに、ライブラリの指定ができていなかったこと、意図していないモジュールをロードしていたことによって、Segmentationエラー(不正なメモリアクセス)を引き起こしていました。
 (C言語だとお馴染み、セグっているときのエラーです)
 
 [csrv12:2963289] *** Process received signal ***
 [csrv12:2963289] Signal: Segmentation fault (11)
 [csrv12:2963289] Signal code: Address not mapped (1)
 [csrv12:2963289] Failing at address: 0x440000e8
 [csrv12:2963289] [ 0] /lib64/libc.so.6(+0x378d0)[0x149f232b38d0]
 [csrv12:2963289] [ 1] /home/rhiguchi/anaconda3/envs/alamode/lib/libmpi.so.40(PMPI_Comm_rank+0x37)[0x149f260f4b17]
 [csrv12:2963289] [ 2] anphon(_ZN7PHON_NS5MyMPIC1EPNS_4PHONEi+0x10f)[0x55ae70a81ebf]
 [csrv12:2963289] [ 3] anphon(_ZN7PHON_NS4PHONC1EiPPci+0x7d)[0x55ae70a9f7ad]
 [csrv12:2963289] [ 4] anphon(main+0x40)[0x55ae709f56d0]
 [csrv12:2963289] [ 5] /lib64/libc.so.6(__libc_start_main+0xf3)[0x149f2329f803]
 [csrv12:2963289] [ 6] anphon(+0x319b5)[0x55ae709f59b5]
 [csrv12:2963289] *** End of error message ***
 Segmentation fault (core dumped)
 だいぶ荒業ですが僕の場合、~/.bashrc ファイルをセッション開始時に読み込まないように、.bashrcのバックアップを取ったうえで別の名前のファイルにしてセッションを再開して、環境設定を変更することで原因を特定しました。
 また、chatGPT もヒントをたくさんくれました。便利なので使ってみ