第一原理パッケージ VASP の 環境構築 

#0.概要
お世話になっております. 橋本です.
表題にあります通り, VASPの環境設定, 及びその周辺の説明を記述いたします.
本記事の構成は以下の通りです.

1.基本設定
・OS：Ubuntu 20.04 LTS のインストール
・OpenSSHのインストール(遠隔,又はクラスタを構築する場合)
・vftpdのインストール(遠隔,又はクラスタを構築する場合)

2.コンパイラの選択
・Intelコンパイラ(Parallel Studio XE)の場合
・Intelコンパイラ(Intel oneAPI Toolkit)の場合
・gFortranの場合
・CUDA Toolkitのインストール(VASPにGPUを使用する場合)

3.VASPのインストール
・VASP.5.4.4の場合
・VASP.4.6の場合(coming soon)
・VASP.6の場合(coming soon)

4.インストール後の起動確認
・VASP.5.4.4の場合
・VASP.4.6の場合(coming soon)
・VASP.6の場合(coming soon)

5.参考記事

__環境構成が任意に選択可能なように記事を羅列しております.__ ぱっと見で理解しづらいかもしれませんが, 柔軟に対応する為の処置でありますことをご理解ください.

推奨の環境構成は以下の通りで, 初見の方はこちらをご参考下さい.

基本設定：
・OS：Ubuntu 20.04 LTS のインストール
・OpenSSHのインストール
・vftpdのインストール
コンパイラの選択：
・Intelコンパイラ(Parallel Studio XE)
・CUDA Toolkit
VASPのインストール：
・VASP.5.4.4
インストール後の起動確認：
・VASP.5.4.4

※追記2021/01/23：
クラスタを構成する場合以下の記事もご参考ください.
https://qiita.com/youkihashimoto3110/items/93a5731b9096a3caf0ee

※追記2021/03/06：
学生版Parallel Studio XEの公開が終了いたしました.
Intelコンパイラを使用する代替として, Intel oneAPI Toolkitsがあります.
https://software.intel.com/content/www/us/en/develop/articles/installing-intel-oneapi-toolkits-via-apt.html
ライセンスについてよく読み込んでおりませんが, 学生ならば使用可能なはずです.


※注意：
☆クラスタの構築は微妙です. 1GbpsのLAN程度では遅くて話になりません.
☆Intel AVXの機能を使用する際はCPUが爆熱となります. AVXはインテルがGPUに対抗するために開発した行列計算ユニットです.
☆GPUを用いる場合, Nvidia製グラフィックボードに限られます. Gforce系を用いる場合, 倍精度演算が制限されており, 倍精度の計算がボトルネックになったり, 収束が遅い等期待された性能を得られない可能性があります. しかし, 大抵の場合, TDPあたりの性能はCPUより非常に高速です.
☆GPUを用いる場合よく冷却しましょう. 計算中もコマンド「nvidia-smi」読みで70℃前半をキープが目安です.

インストールの方針が決まりましたら事項を御覧ください.

#1.基本設定
この項目では
・OS：Ubuntu 20.04 LTS のインストール
・OpenSSHのインストール(遠隔,又はクラスタを構築する場合)
・vftpdのインストール(遠隔,又はクラスタを構築する場合)
について記述いたします. 必須項目はOSのインストールのみで, その他はオプションです.

##・OS：Ubuntu 20.0.4 LTS のインストール
※注意：Cudaやお持ちのParallel Studio XEのバージョンによりインストールできない場合がございます. 記事の項目に移動し確認してください. また,ハードウェアはx86-64環境を想定しております. ARM系のセットアップについて保証しかねます.(おそらくできます.) またIntel SkyLake世代はマザーボードの相性があることを経験しております.
ちなみに,WSLでも動作を確認しております. (おそらく確認しているのは私だけ) なのでWindwos ユーザーの皆様はMicrosoft Storeから「Ubuntu 20.04 LTS」をダウンロードするだけでインストールの手順を省略可能です.しかしながらCPUパワーをフルに使用するため,OSレベルのインストールを推奨します.
また,WSL以外のVMWare等の仮想ソフトはCPUリソースに制限があるためおすすめしません.(動作は可能です)

インストールの手順を説明します.
Ubuntuのダウンロードは, 以下URL先のUbuntu配布ミラーサーバーから可能です.

```
https://www.ubuntulinux.jp/News/ubuntu2004-ja-remix
```
ダウンロードしたISOファイルを空のDVDに焼くか, rufus「https://rufus.ie/ja_JP.html 」などのフリーソフトを使用しUSBに焼く等を行い,起動メディアを作成してください.
※Windowsの起動しているPCにインストールしたい場合は,起動メディアを作成する事なく,ISOファイルをマウントする事で可能となります.

起動ドライブを作成したら,起動メディアをインストールするPCにインジェクトしてPCを起動してください.起動の際はF2又はDelキーを押下しUEFI-BIOSで設定項目にて, ブート先を作成した起動メディアに変更してください. このあたりはお手持ちのマザーボードの説明書をご覧ください. 多くの場合F11キーでUEFI-BIOSで設定せずとも起動メディアを変更可能です.

あとはGUIガイドに従ってインストールを進めるだけです. Ubuntu Serverエディションを使用する際も特に困難な場合はありません. 難しい場合や,Windowsとのデュアルブート等の高度な設定を実施したい方は以下のURLをご参照ください.
九州大学の金子先生のHP「https://www.kkaneko.jp/tools/linux/ubuntudesktop.html 」
茱萸note様 デュアルブートに関する記事「https://guminote.sakura.ne.jp/archives/233 」

OSのインストールが完了したら[Ctrl]＋[ALT]＋[t]キーを同時押ししターミナルを起動し, 以下のコマンドを実行してください.

```
sudo apt-get update
```
これはインストール可能なパッケージ一覧を更新するものです. 実際にパッケージをアップデートするために以下のコマンドも続けて入力してください.

```
sudo apt-get upgrade
```
これで更新は完了です.

##・OpenSSHのインストール(遠隔,又はクラスタを構築する場合)
※注意：多くの環境の場合, クラスタで計算速度を向上させる事は困難です. 「冷却のため離れた部屋においておくから,遠隔操作可能なSSH接続を用いる」事が一般的なように感じます. 故に__SSH接続で遠隔操作可能にする事を推奨環境といたします.__
また,ファイアウォールを開放する都合上__セキュリティが死にます.__ インターネットには接続せず, ローカルネットワークでのご使用をお願いいたします.

まず,「SSHのインストール」について説明し「クラスタノードとして可能な設定」について述べます. 前項のみで遠隔操作は可能です.

「SSHのインストール」
Ubuntuの場合以下のコマンドを実行してください.
ポートの開放

```
sudo ufw disable
```
OpenSSHのインストール

```
sudo apt-get install openssh-server
```
これで接続可能な状態になりました. ipアドレスは固定されておりませんので以下のコマンドを実行しipアドレスを確認してください.

```
ip addre
```
確認したipアドレス, ルートユーザー名とパスワードを使用し同一ローカルネットワーク上でSSH接続が可能となりました.
ちなみに, IPアドレスを固定される場合はzen3様の「https://qiita.com/zen3/items/757f96cbe522a9ad397d 」の記事をご参考ください. 
また, SSHのソフトウェアは「MobaXTerm：https://mobaxterm.mobatek.net/ 」が便利です.
九州大学の金子先生のHP「https://www.kkaneko.jp/tools/server/mobaxterm.html 」に接続方法がありますのでご参考ください.

「クラスタノードとして可能な設定」
以上でユーザーの名前とパスワードを知っていれば遠隔操作可能になりましたが, openMPI(並列演算ソフトウェアパッケージ)を他ノード構築する上でのSSH接続には鍵暗号方式を使用しなければなりません.
以下のコマンドを実行し,鍵を生成します.(rsa暗号でいきます.)

```
ssh-keygen -t rsa
```
おそらく暗号化鍵は「/home/ユーザー名/.ssh/id_rsa.pub」の中に入っています. 
コマンドで行う場合は,そのディレクトリに移動し

```
cd /home/ユーザー名/.ssh
```

```
cat id_rsa.pub > authorized_keys
```
を行う事で,暗号化鍵「id_rsa.pub」を承認された鍵一覧「authorized_keys」に追記します. この作業はテキストエディタで手動で行ってもかまいません.
これで自分の鍵を自分のマシンに登録する事ができました. すなわち,この鍵と、相手(接続先)の鍵を交換(authorized_keysに追記)する事で鍵交換による通信が可能となります.
なので, まず接続先で上と同じ手順を行います. そして,接続先の「id_rsa.pub」をコピーして来て, 自分(接続元)の「authorized_keys」の末尾に追記します. これを接続元でも行えば, お互いの鍵を登録する事ができます.

SSH接続するには, 接続先のIPアドレスを「ip addre」コマンドにて調べておき, ターミナルにて

```
ssh XXX.XXX.XX.XX
↑XXは接続先のIPアドレス
```
と打ち込めばユーザー名、パスワードなしでSSH接続する事ができます。
※もちろん, ファイアウォールが開いている限りユーザー名とパスワードでのSSH接続も可能です.
この鍵交換方式を使用して他ノードでVASPを実行する事ができます. 実行の方法等は後述の「4.インストール後の起動確認」をご参照くださいませ.

##・vftpdのインストール(遠隔,又はクラスタを構築する場合)
FTPと呼ばれる遠隔でファイル操作が可能なソフトウェアをを導入します. 用いるソフトは「vftpd」です. __なお,セキュリティについてはOpenSSHの項同様に甘々で参ります.__
※注意：OpenSSHの項のMobaXTermを使用された方はお気づきかと思いますが, MobaXTermにはSSH機能を使った(?)FTPっぽい機能が含まれており, MobaXTermでSSH接続した段階でファイル操作は可能です. こちらで十分な方はFTPソフト「vftpd」のインストールは必要ございません.

Ubuntuの場合は以下のコマンドを実行してください.

```
sudo apt install vsftpd
```
続いて「vsftpd」の設定を行います. 設定ファイルは「/etc/vsftpd.conf」にあるため, 管理者権限が必要になります. 
※GUIで操作したい場合, ターミナルから管理者権限でデフォルトのテキストエディタを起動「sudo gedit」してファイルを開けば編集可能です.
CUIで編集する場合, ターミナルから以下のコマンドを入力し, 設定ファイル「/etc/vsftpd.conf」をCUIベーステキストエディタ「vi」で編集します.

```
sudo vi /etc/vsftpd.conf
```
開くと, ターミナル上に設定ファイル「/etc/vsftpd.conf」の中身が表示されます. 
viの操作はiキーを押下すればテキストを編集可能(編集モード)となり, Escキーで編集を完了(コマンドモードに)できます. 編集したテキストを保存するにはコマンドモードの時「:w」のコマンドを押下、viを終了するには「:q」を打ち込みます. 
※CUIで操作しなければならない場合もあります故, 使い方を知っている事が重要であります.

設定ファイルで編集するべき単語は以下の通りです.

```
# vsftpdをスタンドアロンモードで起動する。
listen=YES
# IPv4ソケットの代わりにIPv6ソケットをリスンする。
listen_ipv6=NO
# ファイルシステムを変更するFTPコマンドを許可する。
write_enable=YES
# ローカルユーザがディレクトリやファイルを作成する際に使用されるumaskを指定する。
local_umask=022
# ローカルユーザのログインを許可する。
local_enable=YES
#サブフォルダを含む一括アップロード・ダウンロードを出来るようにする。
ls_recurse_enable=YES
```
編集が完了したら, vftpdサービスを再起動します.

```
sudo service vsftpd restart
```
以上でFTPの設定は完了です. 
「ip addre」でIPアドレスを調べ, ユーザー名とパスワードをFTPソフトに入力すれば接続可能となります.
また, SSHのソフトウェアは「FileZilla：https://ja.osdn.net/projects/filezilla/ 」がオススメです. mobaxtermにもFTP機能はございますが, 日本語に対応しておりません.
TechAcademy様のHP「https://techacademy.jp/magazine/2447 」に接続方法がありますのでご参考ください.

#2.コンパイラの選択
__※注意：Intel Parallel Studio XEは新規ダウンロードを廃止しました.__
学生であれば「Intel oneAPI Toolkits」が使用可能です. こちらにVASPに必要なICC及びmkl, mpiが含まれております.

※注意：GPUを用いる場合, バージョンの互換が非常に重要です. 例えば,「Tesla K40」のGPUを使う時,「Cuda Toolkit 10.0」を要求し,Cudaは「Intel C Compiler 18」を要求しており,これは「Intel Parallel Studio XE 2018」に含まれます. 互換性を確認するには,それぞれの環境に合わせてGoogleの検索やCudaのリリースノートを調べる等をし, 地道に実験計画法を手動で行わなければなりません.

ご存知の通り, VASPはソースファイルで提供されており, 各環境に合わせてビルドしなければなりません. 現在, 主にFortranで書かれたVASPをコンパイルするには「Intelコンパイラ(Parallel Studio XE)」か「gFortran」のいずれかが選択可能です.なお, VASPでGPUを使用する際には「CUDA Toolkitのインストール」が必須です.
__結論から申し上げますと「Intelコンパイラ(Parallel Studio XE)」を推奨といたします.__
それぞれの特徴は

「Intelコンパイラ(Parallel Studio XE)」：

+ __新規のダウンロードは打ち切られております. パッケージ版やダウンロードサポートをされておらない方は「Intel oneAPI Toolkits」を御選択ください.__
+ 有料
+ ~~しかしアカデミック版は2017~2020のバージョンが無料で使用可能です. アカデミック版(cluster_edition)を無料で入手する方法はminwinmin様「https://qiita.com/minwinmin/items/afbb0404533fd4b07e72 」が紹介しています. (サイトのレイアウトが異なるため手間取るかもしれません.また, インテルは新しいソフトウェア「oneAPI Toolkits」に切り替える(?)そうで, やたら押されるので注意しましょう.(有料)) __付け加えると, 学生版で取得したライセンスは永久的に使えます.__~~
+ Intel CPUに最適化されている
+ Intel MKLという数値計算アルゴリズムを高速化するライブラリが付属する

「Intelコンパイラ(oneAPI Toolkits)」：

+ Parallel Studio XEの代替品
+ 学生なら無料
+ 特別な登録が必要ない(ライセンス規約を気にされる方はライセンスの熟読をおすすめします. もしかしたら規模によって制限があるかもしれません.)

「gFortran」：

+ 無料
+ オープンソースなため情報が多い
+ インストールが非常に簡単(2コマンド)
+ 非常に軽量(1GBない?)

以上から, 「Intelコンパイラ(Parallel Studio XE)」が選択的優位である事は明らかであります. また, 第一原理計算の特性上, 固有値計算やフーリエ変換が多く含まれます. これらにIntel MKLは非常に有効です. 

##・Intelコンパイラ(Parallel Studio XE)の場合
__※注意：Intel Parallel Studio XEは新規ダウンロードを廃止しました.__
学生であれば「Intel oneAPI Toolkits」が使用可能です. こちらにVASPに必要なICC及びmkl, mpiが含まれております.

※注意：GUI操作の場合,ダウンロードしてきたファイルを解凍し, フォルダの中にある「install_GUI.sh」をクリックして読み進めればインストールができてしまう. 例えば, xlsoft様「http://jp.xlsoft.com/documents/intel/parallel/install_parallel_studio_jp.pdf 」にGUIのインストール方法が記述されています. しかし, WSLやServerエディション等でインストール可能な汎用性を意識し, CUIベースの説明を行う事といたします.

ここでは2つのセクションがあります. 「インストール」と「MKLライブラリのfftw3xfのコンパイル」です. 2つ目はvaspにとって非常に有用です.インストールは必須ではありませんが, 強くオススメします.

「インストール」
公式サイトから任意のバージョンのParallel Studioがダウンロードされている等、手元にソフトウェアがある前提で進めます.
例えばダウンロードの方法はminwinmin様「https://qiita.com/minwinmin/items/afbb0404533fd4b07e72 」

はじめに, FTP等で転送したParallel Studioのあるフォルダに移動します.
そして, 次のコマンドで展開ます.

```
tar xf parallel_studio_xe_の名前.tgz
```
展開したフォルダに移動し

```
cd parallel_studio_xe_の名前
```
インストールする前に,　必要ソフトがあるか確認も含めてインストールを実行します.

```
sudo apt-get install g++ gcc-multilib make
sudo apt-get install libgtk-3-0 libxss1 libnss3 libgtk2.0 libpango-1.0-0 libasound2
```
そして, Parallel Studioをインストールします.

```
./install.sh
```
このとき「sudo」は付けず, ユーザーホームディレクトリ直下にインストールします. これをする事で後の「MKLライブラリのfftw3xfのコンパイル」が簡単になります.
おおまかな流れは「利用規約への同意」→「製品向上のため情報集めるけれど大丈夫？」→「シリアル番号の入力」→「Configuration」です. 
最後の「Configuration」にて,2を選択. 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/d288f5f4-8bf7-9593-db5f-37924c7d3072.png)

「1. [ ]  IA-32」のチェックを外し,
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/f440f967-1713-73be-dbfd-756cc573c412.png)

「Component Costum」を選択,
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/52040308-64a7-ab2d-7196-eed5a75ff252.png)

2~6の製品のチェックを外し,インストールを行います.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/1a8a06b7-67ff-e9ec-a1cd-8db2213f39c5.png)


インストールが完了したら, 環境変数ファイル「/home/ユーザー名/.bashrc」ファイルの末尾にParallele Studioを起動するコマンドを記述します. 以下のようにviを使用してもテキストエディタでも構いませんが隠しファイルになっております.

環境変数ファイルをviで開きます.


```
vi ~/.bashrc
```
viを操作し, 以下を末尾に記述しましょう.

```
source /home/ユーザー名/intel/parallel_studio_xe_バージョン/psxevars.sh intel64
```
viを閉じ,以下のコマンドを実行して環境変数を再読み込みすれば完了です.

```
source ~/.bashrc
```
※テキストエディタを使用せずとも``echo 'source /home/youki/intel/parallel_studio_xe_バージョン/psxevars.sh intel64' >> ~/.bashrc``のコマンド1つで書き込めるが,中身の理解に重きを置きました.


「MKLライブラリのfftw3xfのコンパイル」
ユーザー単位インストールのデフォルトを変更していなければ「/home/ユーザー名/intel/」にインストールされているはずなので,

```
cd /home/ユーザー名/intel/
```
に移動し, 「ls」コマンドを入力. 「compilers_and_libraries_2020.1.217」のような少数点付きのバージョンのついたフォルダを見つけ、その中に入る

```
cd compilers_and_libraries_バージョン/linux/mkl/interfaces/fftw3xf
```
移動できたら次のコマンドを用いてfft3xfをコンパイルします.

```
make libintel64
```

##・Intel oneAPI Toolkitsの場合
※注意：何十万もするコンパイラが登録なしにかんたんに使えてしまいます. 学生は無料で有ることは確認したのですがそれ以外の開発者は存じ上げません. 気にされる方はライセンスを確認してください.

インストールの手順は公式のリファレンスから必要なものだけを抜粋したものです.
installing intel oneAPI Toolkits「https://software.intel.com/content/www/us/en/develop/articles/installing-intel-oneapi-toolkits-via-apt.html 」

まずキットをaptでインストールするキーを取得します.

```
wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
```

登録します.

```
sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
```

intel リポジトリを使用するためaptを構成します.

```
echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
```

コンポーネントをアップグレード

```
sudo apt update
```

ベースツールキットをインストールします.
VASPで必要なC++が入ります. それ以外にもいっぱい入ります.(15GB)
(※Ubuntu20.04の場合, ベースキットのインストールを省略することができるようです. 後述のハイパフォーマンス・コンピューターキットを入れる事で, ベースキット中の依存系が自動的にインストールされるようです.(研究室の後輩の実体験より.))

```
sudo apt install intel-basekit
```

ハイパフォーマンス・コンピューターキットをインストールします.
MKLやFortran等がインストールされます.

```
sudo apt install intel-hpckit
```
最後にoneAPIパッケージを読み込むコマンドを打つ事で使用可能になります.

```
source /opt/intel/oneapi/setvars.sh intel64
```
また, 自動起動する場合は``echo 'source /opt/intel/oneapi/setvars.sh intel64' >> ~/.bashrc``を打ち込みます.

以上.


##・gFortranの場合
VASP wiki「https://www.vasp.at/wiki/index.php/A_Ubuntu_based_installation_of_VASP 」に従いインストールを行います.
ターミナルでgFortranやビルドエッセンシャルを導入します.

```
sudo apt-get install make build-essential g++ gfortran
```
そして, OpenMPIやFFTに関する数値計算ライブリをインストールします.

```
sudo apt-get install libblas-dev liblapack-dev libopenmpi-dev libscalapack-mpi-dev libfftw3-dev
```
以上です.

##・CUDA Toolkitのインストール(VASPにGPUを使用する場合)
※注意：VASPにGPUを使用する場合はParallel Studioのインストールが必要です.

CUDAのインストールは非常に複雑です. それは, それぞれのプラットフォームの上に, 世代ごとに異なるGPUアーキテクチャと様々なCudaバージョンが乗っている様が存在するからです. 故に「Tesla K40」及び, 「GTX 1080」の2つのGPU及び, 「Ubuntu Server」と「WSL」プラットフォーム上のでの紹介をする事で環境構築の手引に変えさせていただきたいと思います.

※注意:基本的にここで書かれているいずれかを参考にすればどんな環境でも適応可能だと思います. 機械学習的に経験に学ぶ事で適応力を向上させる事と同意義です.

###「Tesla K40」+「Ubuntu Server 16.04 LTS」+「Cuda 10.0」
ドライバをNVIDIAドライバダウンロードの詳細検索(過去のドライバー)「https://www.nvidia.co.jp/Download/Find.aspx?lang=jp 」からダウンロードします.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/ce23ca4e-de6a-7338-662f-313cf605002a.png)
画像のように__対応するCUDAバージョン__が存在するためメモしておきましょう.
ドライバーをダウンロードできたら次はインストールです. 次のコマンドを順番に実行します.

```
sudo dpkg -i nvidia-diag-driver-local-repo-ubuntu1604-410.129_1.0-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda-drivers
sudo reboot
```
再起動が完了したらCUDAをダウンロードしましょう. アーカイブ「https://developer.nvidia.com/cuda-toolkit-archive 」の中から対応するバージョンを選択し, CUDAをダウンロードします.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/8ac7930a-51c7-46c6-33e9-366ea48e0b0b.png)
runファイルを選択することがコツ(?)です.
ファイルをダウンロードし, 以下のコマンドを実行してCuda Toolkitをインストールします.

```
sudo sh cuda_10.0.130_410.48_linux.run
```
インストールが完了したら, CUDAが使用できるように環境変数ファイル「/home/ユーザー名/.bashrc」の末尾に以下を追記します. 追記の方法は「・Intelコンパイラ(Parallel Studio XE)の場合」を参照してください.
以下の2行を追記してください.

```
export PATH=/usr/local/cuda-10.0/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH}
```

###「GTX 1080 x2」+ 「Ubuntu 20.04 LTS」+「Cuda 10.0」+「cudnn 7.4.2」
はじめにドライバーをインストールします.

```
sudo apt install nvidia-cuda-toolkit nvidia-driver-440
```
そしてCudaをインストールします.

```
wget "https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64"
mv cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64 cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
sudo apt update
sudo apt install cuda-10-0
```

Deep Learning用のライブラリであるcudnnもついでにインストールしましょう.

```
sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb
tar -zxf cudnn-10.0-linux-x64-v7.4.2.24.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp -R cuda/lib64/* /usr/local/cuda/lib64/
```
最後にCUDAが使用できるよう,環境変数ファイル「/home/ユーザー名/.bashrc」に追記します. Cudaのバージョンが同じなので, 書き込む内容は「「Tesla K40」+「Ubuntu Server 16.04 LTS」+「Cuda 10.0」」と同様です.
ここでは, コマンドを使って書き込む方法を述べます. 以下を順番に実行すれば, 環境変数に書き込まれます.

```
echo 'export PATH=/usr/local/cuda-10.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
```

###「GTX 1080 x2」+ 「WSL on Ubuntu 20.04 LTS」+「wsl on cuda 11」
windows insider buildを使用しなければなりません.非常に不安定でバージョンによって動いたり、動かなかったりすることがあります.
windows insider buildの問題はtattu1902様「https://tattu1902.blog.fc2.com/blog-entry-127.html 」がまとめてくださっており, wsl2 on cudaの動くビルドを見つける事ができます.

私の場合は,公式ページ「https://docs.nvidia.com/cuda/wsl-user-guide/index.html 」のissueも参考しながらすすめ, 

```
2020/11/29現在
Please use newer builds >= 20236
```
と記載がありましたので, windows insider build 20236をインストールしました.

次に, windows上にドライバをインストールします.
「Insider20236」の場合公式サイト「https://developer.nvidia.com/cuda/wsl 」から「465.12_gameready_win10-dch_64bit_international」をダウンロードし, インストールを行いました.

次に, wslを使用できるようにします.
コントロールパネル→windows機能の有効化から「仮想マシンプラットフォーム」,「Linux用Windowsサブシステム」(「Windows Subsystem for Linux」), 「Windowsハイパーバイザープラットフォーム」,「Hyper-V」をインストールします.

wsl on cudaの動作するwsl2へバージョンを変更します.
コマンドプロンプトで```wsl --set-default-version 2```を打ち込み, デフォルトを設定します.

Ubuntu-20.04をストアからインストールします. また,エクスプローラーのパスに```\\wsl$```を入れるとwslのファイルに飛ぶ事ができます.

wsl on Ubuntu 20.04を起動しcudaのインストールして行きます.
以下のコマンドを順番に実行します.

```
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64 /" > /etc/apt/sources.list.d/cuda.list'
sudo apt-get update
sudo apt-get install -y cuda-toolkit-11-0
```
Cudaが入りましたが,ひと手間ございます.
wslでcudaを呼び出す際, 「libcuda.so」シンボリックがないと怒られてしまいます. おそらくバグです. それを防止するため以下の2つを実行します.

```
sudo ln -s /usr/local/cuda-11.0/targets/x86_64-linux/lib/stubs/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so.1
sudo ln -s /usr/local/cuda-11.0/targets/x86_64-linux/lib/stubs/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so
```
これでCudaのインストールが完了しました.
最後にCUDAが使用できるよう,環境変数ファイル「/home/ユーザー名/.bashrc」に追記します.
以下の2つのコマンドを実行してください.

```
echo 'export PATH="/usr/local/cuda/bin:$PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"' >> ~/.bashrc
```

#3.VASPのインストール
##・VASP.5.4.4の場合
VASPのインストールは単純で「ダウンロードしたアーカイブを展開」→「makefile.includファイルを作成」→「make allコマンドでビルド」の3手順です.

##「ダウンロードしたアーカイブを展開」
以下のコマンドでアーカイブを展開します.

```
tar -xzvf vasp.5.4.4.tar.gz
```

展開先のディレクトリに移動しインストールを続行します. 

```
cd vasp.5.4.4
```

##「makefile.includファイルを作成」
「makefile.includ」ファイルとは, 使用環境に合わせてビルドの設定を行う項目群です. 故に,コンパイラや,GPUの世代, CPUの機能等によって異なります.

まず, 「makefile.includ」ファイルを作成します. 中身はただのテキストファイルなので新しく作っても良いのですが, エンコードや改行コードが異なったら事ですので, 安全な方法を取ります.
今,展開先のディレクトリは図のようになっています.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/8269ebeb-8568-b621-02b0-25c5a84e1642.png)
この中の「arch」フォルダから,どれでも大丈夫ですので, 展開先のディレクトリへ1つコピーしてきて,名前を「makefile.includ」に変更しましょう. そのコマンドは以下のようになります.

```
cp arch/makefile.include.linux_intel makefile.includ
```
※gFortranの方は```cp arch/makefile.include.linux_gnu makefile.includ```を使用されたほうが楽です.
コマンドを実行すると図のようになります.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571701/52a657aa-ec84-cfa7-56c0-a37ec22668c8.png)

「makefile.includ」ファイルをviなどのテキストエディタで編集します.
ここでテンプレートがありますので, ご自身の環境にあった方を引用くださいませ.変更するポイントは後ほど説明します.
なお, VASPでGPUを使用されない方は「# GPU Stuff」以下の項目は不要です.

コンパイラが「Intelコンパイラ(Parallel Studio XE)」の場合

```
# Precompiler options
CPP_OPTIONS= -DHOST=\"LinuxIFC\"\
             -DMPI -DMPI_BLOCK=32000 \
             -Duse_collective \
             -DscaLAPACK \
             -DCACHE_SIZE=16000 \
             -Davoidalloc \
             -Duse_bse_te \
             -Dtbdyn \
             -Duse_shmem \
             -Dkind8

CPP        = fpp -f_com=no -free -w0  $*$(FUFFIX) $*$(SUFFIX) $(CPP_OPTIONS)

FC         = mpiifort
FCL        = mpiifort -mkl=sequential -lstdc++

FREE       = -free -names lowercase

FFLAGS     = -assume byterecl -w
OFLAG      = -O3 -xSKYLAKE-AVX512
OFLAG_IN   = $(OFLAG)
DEBUG      = -O0

MKL_PATH   = $(MKLROOT)/lib/intel64
BLAS       =
LAPACK     =
BLACS      = -lmkl_blacs_intelmpi_lp64
SCALAPACK  = $(MKL_PATH)/libmkl_scalapack_lp64.a $(BLACS)

OBJECTS    = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d.o \
             $(MKLROOT)/interfaces/fftw3xf/libfftw3xf_intel.a

INCS       =-I$(MKLROOT)/include/fftw

LLIBS      = $(SCALAPACK) $(LAPACK) $(BLAS)


OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.o
OBJECTS_O2 += fft3dlib.o

# For what used to be vasp.5.lib
CPP_LIB    = $(CPP)
FC_LIB     = $(FC)
CC_LIB     = icc
CFLAGS_LIB = -O
FFLAGS_LIB = -O1
FREE_LIB   = $(FREE)

OBJECTS_LIB= linpack_double.o getshmem.o

# For the parser library
CXX_PARS   = icpc

LIBS       += parser
LLIBS      += -Lparser -lparser -lstdc++

# Normally no need to change this
SRCDIR     = ../../src
BINDIR     = ../../bin

#================================================
# GPU Stuff

CPP_GPU    = -DCUDA_GPU -DRPROMU_CPROJ_OVERLAP -DUSE_PINNED_MEMORY -DCUFFT_MIN=28 -UscaLAPACK

OBJECTS_GPU = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d_gpu.o fftmpiw_gpu.o

CC         = icc
CXX        = icpc
CFLAGS     = -fPIC -DADD_ -Wall -qopenmp -DMAGMA_WITH_MKL -DMAGMA_SETAFFINITY -DGPUSHMEM=300 -DHAVE_CUBLAS

CUDA_ROOT  ?= /usr/local/cuda/
NVCC       := $(CUDA_ROOT)/bin/nvcc -ccbin=icc
CUDA_LIB   := -L$(CUDA_ROOT)/lib64 -lnvToolsExt -lcudart -lcuda -lcufft -lcublas

GENCODE_ARCH    := -gencode=arch=compute_61,code=\"sm_61,compute_61\"

MPI_INC    = $(I_MPI_ROOT)/intel64/include/
```
コンパイラが「gFortran」の場合

```
# Precompiler options
CPP_OPTIONS= -DHOST=\"LinuxGNU\" \
            -DMPI -DMPI_BLOCK=32000 -Duse_collective \
            -DscaLAPACK -DCACHE_SIZE=16000 \
            -Davoidalloc -Duse_bse_te \
            -Dtbdyn\
            -Duse_shmem

CPP        = gcc -E -P -C -w $*$(FUFFIX) >$*$(SUFFIX) $(CPP_OPTIONS)

FC         = mpif90
FCL        = mpif90 

FREE       = -ffree-form -ffree-line-length-none 

FFLAGS     = -w
OFLAG      = -O3 -march=avx2
OFLAG_IN   = $(OFLAG)
DEBUG      = -O0

LIBDIR     = /usr/lib/x86_64-linux-gnu
BLAS       = -L$(LIBDIR) -lblas
LAPACK     = -L$(LIBDIR) -llapack
BLACS      = 
SCALAPACK  = -L/usr/lib -lscalapack-openmpi $(BLACS)

LLIBS      = $(SCALAPACK) $(LAPACK) $(BLAS)

LLIBS      += -lfftw3
INCS       = -I/usr/include

OBJECTS    = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o 

OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.o
OBJECTS_O2 += fft3dlib.o

# For what used to be vasp.5.lib
CPP_LIB    = $(CPP)
FC_LIB     = $(FC)
CC_LIB     = gcc
CFLAGS_LIB = -O
FFLAGS_LIB = -O1
FREE_LIB   = $(FREE)

OBJECTS_LIB= linpack_double.o getshmem.o 

# For the parser library
CXX_PARS   = g++  
LIBS       += parser
LLIBS      += -Lparser -lparser -lstdc++

# Normally no need to change this
SRCDIR     = ../../src
```
非常に多くの項目がございますが,変更する箇所はたったの4つです。上から順番に参ります.
__1つ.「-DMPI_BLOCKと-DCACHE_SIZE」__
こちらはCPUの1コアあたりのL1キャッシュのサイズと,その半分の数字を挿入します.例えば,「i9-9900X」の場合,wiki chip「https://en.wikichip.org/wiki/intel/core_i9/i9-9900x 」を参照すると32kBとわかります.
よって, ```-DMPI_BLOCK=32000```と,```-DCACHE_SIZE```にはその半分の```-DCACHE_SIZE=16000```を入力します.
ちなみに,core-iシリーズでは1コアあたりのL1キャッシュサイズは32kBです.

__2つ.「OFLAG」__
かなり厄介です. 難しい場合,「OFLAG = -O2」だけでもVASPは動きます.
こちらは, CPUの機能を最大限使う最適化のオプションです. このオプションは使うCPUにも,コンパイラによっても異なります.
このオプションは必要以上にこだわる事ができますが, 大切なポイントを押さえれば最大限のパフォーマンスが得られます.
「Intelコンパイラ(Parallel Studio XE)の場合」
例えば,Intel Fortran 19ではクイック・リファレンス・ガイド「https://jp.xlsoft.com/documents/intel/compiler/19/Quick-Reference-Guide-Intel-Compilers-v19.pdf 」に示す全てのオプションを使用でき,ここから最適なものを選択します.
膨大なので, ピックアップします. 
まず「-O2」もしくは「-O3」は必須です. これは最適化の度合いを表し, 最近の2013年以降のプロセッサでは基本「-O3」を使用します.
次に「-x」と「-arch」です.これはプロセッサに最適化されたコードを生成できます.インテル製CPUの場合「-x」を,AMD製等は「-arch」を選択します. 例えば,「i9-9900X」の場合,wiki chip「https://en.wikichip.org/wiki/intel/core_i9/i9-9900x 」を参照するとAVX-512と呼ばれる高速なベクトル計算が利用できます.この機能を使用するには「-xSKYLAKE-AVX512」と,リファレンスに載っているコマンドを選択します.

「gFortranの場合」
やはり「-O2」もしくは「-O3」は同様に選択します.しかし「gFortran」の場合,プロセッサ固有オプションは「-march=」で指定します. 詳しいリファレンスはgntoolinux「https://wiki.gentoo.org/wiki/GCC_optimization/ja 」をご参照ください.どの引数を与えればよいかわからない場合「-march=native」の手段が有効です.

__3つ.「OBJECTS」__※Intelコンパイラのみ
Parallel Studioをインストールした際, fftw3xfをビルドしなかった方は```$(MKLROOT)/interfaces/fftw3xf/libfftw3xf_intel.a```の記述を削除してください.

__4つ.「GENCODE_ARCH」__※GPUを利用する場合のみ
GPUアーキテクチャ固有のオプションです.各環境に合わせた数値を使用します.数値はCuda Toolkit Documentation「https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-feature-list 」の5.2項にあります.例えば, 「GTX 1080」はPascal世代なので,60,61,62を使用します.すなわち

```
GENCODE_ARCH    := -gencode=arch=compute_60,code=\"sm_60,compute_60\"\
                   -gencode=arch=compute_61,code=\"sm_61,compute_61\"\
                   -gencode=arch=compute_62,code=\"sm_62,compute_62\"\
```
と指定します.また,異なる世代の数値も入力可能です.

##「make allコマンドでビルド」
コマンド

```
make all
```
を使用することで使用可能な全てのVASPビルドを生成することができます. 生成されるものは「build」フォルダーに入っており,それぞれ,「std」「gam」「ncl」「gpu」です. ただし,「gpu」は「include.makefile」で「# GPU Stuff」以下を記述した際にのみ生成されます.
たいていの研究には「std」と「gpu」で事足りると思います故,```make std gpu```の実行でもよろしいかと思われます.ビルドには多くの時間を費やします故.

正常にビルドが完了したら, それぞれのフォルダーの中に「vasp」という名前のファイルがございます.それがVASPの本体です.

・VASP.4.6の場合(coming soon)
・VASP.6の場合(coming soon)

#4.インストール後の起動確認
大きな系で計算する際にスタックメモリが足りないと言われる可能性がありますので, 上限を開放します.以下のコマンドを実行してください.

```
ulimit -sunlimited
```
また、毎回実行するのが面倒であれば, 「.bashrc」の末尾に追記しておきましょう.
##・VASP.5.4.4の場合
H2O-VASP「https://www.vasp.at/wiki/index.php/H2O 」を使用します.ファイルをダウンロードし,展開しておいてください.
###シングルノードでの実行
展開したH2OのフォルダにビルドしたVASP本体をコピーします.例えばcpuで実行する時は,

```
cp /VASPのインストールディレクトリ/vasp.5.4.4/build/std/vasp /H2Oのフォルダ/vasp
```
となります. H2Oのフォルダへ移動し,以下のコマンドを実行します.

```
./vasp
```
計算が実行できたら, 並列化計算も実施してみましょう.例えば4コアのCPUの場合,以下のコマンドで実行可能です.

```
mpirun -np 4 ./vasp
```

###多ノードでの実行
クラスターで計算する場合, 準備が必要です.
1. 計算実行を指示するホストとそれぞれの子ノードとSSH接続可能な状態にしておく(OpenSSHの項目を参照)
2. それぞれのIPアドレスと,cpuのコア数の入ったホストファイル「hosts」を作成する
3. それぞれのPCにVASPがビルドされている
4. それぞれのPCに計算に必要な「INCAR」「POSCAR」「KPOINTS」「POTCAR」及びそれぞれでビルドしたVASP本体、そしてホストファイル「hosts」が__ルートから見て同じディレクトリ__に配置されている
ホストファイル「hosts」は以下のようなテキストファイルです.(日本語で記述されている箇所は消してください.)

```
192.168.0.1 cpu=8   ホストのIPとコア、スレッド数
192.168.0.2 cpu=4   子1のIPとコア、スレッド数
192.168.0.2 cpu=4   子2のIPとコア、スレッド数
・
・
・
```
そしてホストPCで計算を実行します. この場合ではcpuが8+4+4の16コアあるので,

```
mpirun -hostfile hosts -np 16 ./vasp
```
とコマンドを押下すれば計算が実行されます. 
###SSH接続の場合
SSH接続を切っても, コンピュータ上で計算が続行されるようにしましょう. そのためには

```
nohup mpirun -np 4 ./vasp &
```
のように実行し続けたいコマンドを```nohup XXX &```でくくります.

・VASP.4.6の場合(coming soon)
・VASP.6の場合(coming soon)

#5.参考記事
VASP Wiki 「https://www.vasp.at/wiki/index.php/The_VASP_Manual」
Intel Vasp build「https://software.intel.com/content/www/us/en/develop/articles/building-vasp-with-intel-mkl-and-intel-compilers.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+ISNMain+%28Intel+Developer+Zone+Articles+Feed%29 」
Cuda VASP 「https://www.nvidia.com/en-us/data-center/gpu-accelerated-applications/vasp/ 」