Gaussian 16 Rev. C02のソースからのコンパイルとインストール

Gaussian 16をソースコードからインストールするためにはPGIコンパイラが必要です。PGIコンパイラの開発は20.4で終了し、現在**NVIDIA HPC SDK**として開発が継続されているようです。以前のPGIコンパイラは有償でしたが、現在はライセンスに同意すれば無償で利用できます。

## NVIDIA HPC SDKの入手方法

[NVIDIA HPC SDK](https://developer.nvidia.com/nvidia-hpc-sdk-downloads)のページにアクセスし、I accept the license agreementにチェックを入れると最新のPGIコンパイラを含むNVIDIA HPC SDKをダウンロードすることができます。CentOSの場合はLinux x86_64 CentOS/RHEL RPMのところをクリックするとyumでダウンロードするためのコマンドが現れます。Ubuntuの人はLinux x86_64 DEBのところをクリックしてコマンドを表示させましょう。

……ですが、Gaussian 16 Rev.C02の場合はコンパイル可能なバージョンが決まっていて、**直近のバージョンでは21.3のみとなっています**（執筆時点では22.11が最新です）。したがって、そのバージョンを指定してダウンロード＆インストールする必要があります。

CentOS 7の場合は以下のようなコマンドでした。

```shell
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/hpc-sdk/rhel/nvhpc.repo
$ sudo yum install --nogpgcheck -y nvhpc-21.3

......
......

Running transaction
  Installing : nvhpc-21-11-21.11-1.x86_64                                                             1/4
  Installing : nvhpc-2021-21.11-1.x86_64                                                              2/4
  Installing : nvhpc-21-3-21.3-1.x86_64                                                               3/4
  Installing : nvhpc-21.3-1.x86_64                                                                    4/4
  Verifying  : nvhpc-21.3-1.x86_64                                                                    1/4
  Verifying  : nvhpc-2021-21.11-1.x86_64                                                              2/4
  Verifying  : nvhpc-21-11-21.11-1.x86_64                                                             3/4
  Verifying  : nvhpc-21-3-21.3-1.x86_64                                                               4/4

Installed:
  nvhpc.x86_64 0:21.3-1

Dependency Installed:
  nvhpc-2021.x86_64 0:21.11-1                      nvhpc-21-11.x86_64 0:21.11-1                      nvhpc-21-3.x86_64 0:21.3-1

Complete!
```

インストールが終わったら、tcshを起動して環境変数の設定に進みます。tcshをインストールしていない場合は`yum -y install tcsh` (CentOS)なり`apt -y install tcsh` (Ubuntu)なりで入れておいてください。

```shell
tcsh #tcshシェルの起動
# 環境変数の設定
setenv PGI /opt/nvidia/hpc_sdk
setenv PATH $PGI/Linux_x86_64/21.3/compilers/bin:$PATH
setenv MANPATH ${MANPATH}:$PGI/Linux_x86_64/21.3/compilers/man
```

こののち、`which pgc++`とでも打ってみて、コンパイラへのPATHが通っていることを確認します。

```shell
$ which pgc++
/opt/nvidia/hpc_sdk/Linux_x86_64/21.3/compilers/bin/pgc++`
```

## Gaussian 16のソースコードからのビルド＆インストール

PGIコンパイラの設定とPATHを確認したら、続いてソースコードからのビルド＆インストールを行います。以下ではGaussian 16 rev C.02を`/home/apps/g16.C02`にインストールすると仮定します。
注意点としては`tcsh`を使って環境変数を設定していく必要があるということ、`$g16root`のユーザー＆グループ設定を変えておくこと、中身のパーミッション設定は変更しないことの3つです。

```shell
#### Installation of Gaussian 16 rev C.02 ####
mkdir -p /home/apps/g16.C02
cd /home/apps/g16.C02
# ここに解凍したGaussian 16のg16ディレクトリを置く
# tar jxvf wkssrc.tbz 

# tcshの起動
tcsh
# PGI compilerの設定
setenv PGI /opt/nvidia/hpc_sdk
setenv PATH $PGI/Linux_x86_64/21.3/compilers/bin:$PATH
setenv MANPATH ${MANPATH}:$PGI/Linux_x86_64/21.3/compilers/man

# which pgc++でPATHが通っていることを確認する

# 環境変数g16rootの設定
# g16ディレクトリが置かれている場所を指定する
setenv g16root /home/apps/g16.C02
cd $g16root
# The $g16root directory must be set to your username and usergroup
# DON'T CHANGE the permissions (all files must be set to 750 or 770.)
chown -R root:g16 $g16root

cd $g16root/g16
./bsd/install
# > install completed successfully と表示されることを確認する
# これはまだg16のインストールの本丸ではない

# g16.loginの設定読み込み。blasやPYTHONPATHのenvironment variable
source $g16root/g16/bsd/g16.login
```

ここまでが準備段階です。次のコマンドでGaussian 16のコンパイルとインストールを行いますが、先に実際に計算させる計算ノードのCPUとGPUのアーキテクチャを知っておく必要があります。

まずGPUアーキテクチャの一覧ですが、お使いのNVIDIA GPUに応じて`pascal`, `volta`, `ampere`を選ぶことができます。ただたぶん`turing`は選べないみたいです。対応表は https://qiita.com/k_ikasumipowder/items/1142dadba01b42ac6012 の記事などを呼んでください。RTX3090やA100は`ampere`になります。

次に利用可能なCPUアーキテクチャの一覧は以下の通りです。CPUの種類に合わせて適切なものを選んでください。

```shell
                    Select target processor
    px              Generic Linux/Windows x86_64 Processor.
    bulldozer       AMD Bulldozer processor
    piledriver      AMD Piledriver processor
    zen             AMD Zen architecture (Epyc, Ryzen)
    zen2            AMD Zen 2 architecture (Ryzen 2)
    zen3            AMD Zen 3 architecture (Ryzen 3)
    sandybridge     Intel SandyBridge processor
    haswell         Intel Haswell processor
    skylake         Intel Skylake Xeon processor
    host            Link native version of HPC SDK cpu math library
    native          Alias for -tp host
```

例えば計算マシンのCPUがRyzen 9 5900Xはzen3アーキテクチャに該当しますので、`zen3`となります。
そしてこのことを踏まえて以下のコマンドでコンパイルを開始します。

```shell
$ bsd/bldg16 <buildoption> <GPU arch> <CPU arch> | & tee make.log
```

`<buildoption>`のところは通常`all`を指定します。`<GPU arch>`と`<CPU arch>`は先程メモしておいたアーキテクチャに応じて文字を入力します。`ampere`と`zen3`ならば以下のようになります。

```shell
bsd/bldg16 all ampere zen3 | & tee make.log # may take 45-90 minutes or more

# Check the end of make.log for successful completion. Confirm that the executables have been built. There should be 85 files:
ls *.exe | wc -l  # make sure 85 files
```

これを行うとおよそ45分以上はインストールに時間がかかるはずです。もしすぐに終了しているようでしたらきっとPGIコンパイラに設定が通っていなかったりsourceを忘れているせいだと思います。その他わからなかったら`make.log`のログを参照してエラー落ちしているかどうか確認してみましょう。

インストールが無事終了していれば、g16ディレクトリ上に85個の`.exe`ファイルが生成されているはずです。最後のコマンドを入れてみて85個あるかどうか確認しましょう。これで完了です。

コンパイル後は`g16`ディレクトリをまるごと移動させても問題ないと思います。またGPU付きでコンパイルしてもCPUオンリーで計算させることは可能です。

Note: `<buildoption>`のところでは他に`nolink`, `utilonly`, `linkrest`, `utilrest`を選ぶことができるようです。