Windows11＋WSL2で津波数値計算コードJAGRUSを使うための環境を1から構築する

# はじめに
線形/非線形, 長波/分散波, 球面/平面座標系の切り替えが簡単にできて, ネスティングや並列計算が可能という津波の数値シミュレーションをする人間には至れり尽くせりな津波計算コードJAGURS(Baba et al., [2015](https://link.springer.com/article/10.1007/s00024-015-1049-2); [2017](https://www.sciencedirect.com/science/article/pii/S1463500317300082))が公開されています。これを用いた津波数値シミュレーションの環境を構築するうえで, 参考になる情報が複数ページに分散していたり数年前の情報だったりしたので, 現時点(2024年4月)でのWSLのインストールからJAGURSのコンパイルまでの一連の作業を記していきたいと思います。

なおOS環境はWindows 11 Pro for Workstations 23H2(22631.3374)を使っています。本記事で用いるLinuxディストリビューションはDebian12 (bookworm)を想定しています。

***
目次
1. WSLのインストール
1. OneAPIのインストール
1. JAGURSの準備
    1. 必要なコンポーネントの用意
    1. JAGURSを入手する
    1. JAGURSをコンパイルしてみる


# WSLのインストール
まずはWindows11にWSLをインストールしていきます。
Windowsキーを押しながらRキーを押すと「ファイル名を指定して実行」ウインドウが出てきます。
![スクリーンショット 2024-04-08 170827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/46285eca-0955-1cc3-946e-55999abd32df.png)
名前欄に`powershell`と入力をしてからCtrl＋Shift＋Enterを押すと, powershellが管理者モードで開きます。管理者モードで開いたpowershellのコンソールに
```
    wsl --install -d Debian
```
を入力し実行するとLinux(Debian)がインストールされます。-dオプションの後の文字列を変更することでディストリビューションを指定することができます。なお, -dオプションを指定しない場合にはUbuntuがインストールされるようです。![スクリーンショット 2024-04-08 172531.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/6948a699-acc9-64aa-4a56-f0780413aab6.png)

インストールが終了すると次のようなターミナルが現れ, UNIXのアカウントを作成する画面が出てきます。
![スクリーンショット 2024-04-08 172600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/35b1f573-0a31-2260-cad8-dce6085b8dd0.png)
ユーザー名と使用するパスワードを2回入力することで, Debianにアカウントが作成されました。今回はこの記事用にアカウントを作成しています。
![スクリーンショット 2024-04-08 175119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/d475d300-fe49-40ed-b032-b238f44a8db2.png)
今回の名前の元ネタは, 愛用しているアバターの[カリン](https://booth.pm/ja/items/3470989)です。かわいいですね。
アカウントの作成が終わったら最新版にアップデートをしておきます。

```
    sudo apt update
    sudo apt upgrade
```

# OneAPIのインストール
[IntelOneAPI](https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html)をインストールします。上記のOneAPIのページをスクロールすると各ツールキットのDownloadボタンがあります。
![スクリーンショット 2024-04-08 180533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/659bac08-a81c-bd35-4aa6-6acc65342aff.png)

FortranコンパイラはHPC Toolkitに入っているため, 
- Intel® oneAPI Base Toolkit
- Intel® HPC Toolkit

の2つをインストールする必要があります。

### Base ToolkitとHPC Toolkitのインストール
Base Toolkitのインストールボタンを押すとOSごとのインストール選択画面が出てくるので, Linux - Apt Package Managerを選択します。
![スクリーンショット 2024-04-08 182103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/b813e784-9253-d4ba-f44c-d0466dcf878a.png)
画面の指示に従ってGPGの公開鍵をダウンロードしたのち, OneAPIのリポジトリをAPTに登録します。

```
    wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
    echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list
```
筆者の環境では発生しませんでしたが, もしwgetかgpgが入っていないと怒られたらそれをインストールしてから再度試してください。
```
    sudo apt install gpg-agent wget
```

リポジトリの登録が終わったら`sudo apt update`で一度パッケージのリストを更新します。これによってリストを更新することでaptがOneAPIのパッケージをインストールすることができるようになります。

```
    sudo apt update
    sudo apt install intel-basekit
    sudo apt install intel-hpckit
```

を実行すると, Intel Fortranを含むOneAPIのインストールができます。Basekitだけでも14GB以上ありインストールには少し時間がかかるため, コーヒーでも入れて気長に待ちましょう。

さて, インストールが完了したらDebianのコンソールに`ifort`と打ってみましょう。おそらく

    -bash: ifort: command not found
となるとおもいます。次に, `. /opt/intel/oneapi/setvars.sh`を実行してからもう一度`ifort`を実行してみましょう。今度は

    ifort: remark #10448: Intel(R) Fortran Compiler Classic (ifort) is now deprecated and will be discontinued late 2024. Intel recommends that customers transition now to using the LLVM-based Intel(R) Fortran Compiler (ifx) for continued Windows* and Linux* support, new language support, new language features, and optimizations. Use '-diag-disable=10448' to disable this message.
    ifort: command line error: no files specified; for help type "ifort -help"
と返ってきましたね。setvars.shを実行することで, コンパイラまでのPathが通ります。
「もうすぐレガシーなifortが廃止されるからモダンなIntel Fortranであるifxに移行してね！」というメッセージの後で、ソースファイルが指定されていないというifortからのエラーが出力されています。これでIntel-Fortranのインストールが完了です。
毎回コンソールを立ち上げるたびに`. /opt/intel/oneapi/setvars.sh`を実行するのがめんどくさい人は, ~/.bashrcの末尾に
```bash:~/.bashrc
    ## intel OneAPI settings
      . /opt/intel/oneapi/setvars.sh
```
を追加しましょう。

# JAGURSの準備
さて, 本題のJAGURSの準備に入ります。
JAGURSをコンパイルするためには
- [NetCDF4](https://www.unidata.ucar.edu/software/netcdf/)
    - NetCDF-CをインストールするためにHDF5
    - NetCDF-Fortranをビルドするためにmake
- [PORJ4](https://proj.org/en/9.4/)
- [FFTW3](https://www.fftw.org/)
が必要なようです。FFTW3はOneAPIに付属しているMKLで代用できるため, このページでは扱いません。
また, これらをビルドするためにmakeを使用するので今の段階でインストールしておきましょう。

```
    sudo apt install make
```

### NetCDFのインストール
<details><summary>[Optional]HDF5とNetCDF-Cを自前でビルドする
</summary>
後日執筆予定
</details>

<details open><summary> HDF5とNetCDF-Cをaptでインストールする
</summary>

HDF5とNetCDF-Cはaptからインストールすることができます。

```
    sudo apt install hdf5-tools libnetcdf-dev netcdf-bin
```

HDF-5をaptからインストールした場合はそのままだとJAGURSのコンパイル時に画像のようなエラーを吐きだします。
![スクリーンショット 2024-04-11 140626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/8e717985-2d82-6178-0905-35217531ec7e.png)
これを回避するために以下の手順でシンボリックリンクを作成します。

```
    cd /usr/lib/x86_64-linux-gnu
    sudo ln -s libhdf5_serial.so libhdf5.so
    sudo ln -s libhdf5_serial_hl.so libhdf5_hl.so
```


NetCDF-Fortranは[jsasaki氏のHP](https://estuarine.jp/2020/05/ubuntu-intel-netcdf/)を参考にしてビルドしていきます。なお, 本記事の執筆時点(2024/04/10)でのバージョンを確認したところ, NetCDF-Cは4.9.2, NetCDF-Fortranは4.6.1でした。

```
    mkdir ~/Downloads
    cd ~/Downloads
    wget https://downloads.unidata.ucar.edu/netcdf-fortran/4.6.1/netcdf-fortran-4.6.1.tar.gz
    tar xf netcdf-fortran-4.6.1.tar.gz
    cd netcdf-fortran-4.6.1/
```

環境設定とconfig実行用のシェル config-OneAPI.sh を作成します。最新のOneAPIではiccはすでに削除され, ifortも2024年末に削除される予定であるため, コンパイラはifx, icxを使います。

 ```shell:config-OneAPI.sh
    export CDFROOT="/usr"
    export LD_LIBRARY_PATH="${CDFROOT}/lib:${LD_LIBRARY_PATH}"
    export LDFLAGS="-L${CDFROOT}/lib -I${CDFROOT}/include":
    export OPTIM="-O3 -mcmodel=large -fPIC ${LDFLAGS}"
    #
    export CC=icx
    export CXX=icpx
    export FC=ifx
    export F77=ifx
    export F90=ifx
    export CPP='icx -E -mcmodel=large'
    export CXXCPP='icpx -E -mcmodel=large'
    export CPPFLAGS="-DNDEBUG -DpgiFortran ${LDFLAGS}"
    #
    export CFLAGS=" ${OPTIM}"
    export CXXFLAGS=" ${OPTIM}"
    export FCFLAGS=" ${OPTIM}"
    export F77FLAGS=" ${OPTIM}"
    export F90FLAGS=" ${OPTIM}"
    #
    ./configure --prefix=/usr/local/netcdf-ifort --enable-large-file-tests --with-pic
```
実行権限を付与してconfig-OneAPI.shを実行します。
```
    chmod +x config-OneAPI.sh
    ./config-OneAPI.sh
```
ビルドする準備ができたので早速makeでビルドをして, make checkで確認をしてみましょう
```
    make
    make check
```
コンソールに長々とcheckの結果が出ますが、赤文字でERRORが出ていなければOKなので, installしましょう。
```
    sudo make install
```
インストールが終わったら以下を~/.bashrcに追記してPATHとLD_LIBRARY_PATHを通しましょう。
```bash:~/.bashrc
    ## netCDF-fortran settings
      PATH=/usr/local/netcdf-ifort/bin:$PATH
      LD_LIBRARY_PATH=/usr/local/netcdf-ifort/lib:$LD_LIBRARY_PATH
```
追記したら`source ~/.bashrc`を実行してから`nf-config --all`を実行してみると
![スクリーンショット 2024-04-10 185245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/4037dcb5-b87d-37d7-ce1c-1f0af8eca200.png)
というように, Cコンパイラにicx, Fortranコンパイラにはifxが指定された状態でNetCDF-Fortranがインストールできたことを確認できます。
以上でNetCDFのインストールは完了です。
</details>

### PROJ.4のインストール
[PROJ.4](https://trac.osgeo.org/proj/)をインストールしていきます。JAGURS公式のドキュメントを読むと
>Currently, only proj-4.9.1 is confirmed.

と書かれており, PROJは最新版の9.X.Xではなく4.9.1をインストールしないといけないようです。(ただし[iowanmanさんの記事](https://qiita.com/iowanman/items/53ca2ba94d3561702721)だと5.2.0を入れているので, 少し新しいものでも問題はなさそうですが。。。)
先ほど作成した`~/Downloads`内で作業をしていきます。

    cd ~/Downloads
    wget http://download.osgeo.org/proj/proj-4.9.1.tar.gz
    tar xf proj-4.9.1.tar.gz
    cd proj-4.9.1
    export CC=icx
    export CPP='icx -E -mcmodel=large'
    ./configure --prefix=/usr/local/proj4
    make
    make check
`make check`でエラーが出なければインストールをします。

    sudo make install
インストールが完了したらLD_LIBRARY_PATHを通します。
```bash:~/.bashrc
    ## proj4 settings for JAGURS
      LD_LIBRARY_PATH=/usr/local/proj4/lib:$LD_LIBRARY_PATH
```
最後に`source ~/.bashrc`を実行してPATHを読み込めば, JAGURSをコンパイルする準備が整いました。


## JAGURSを入手する
<details><summary>Gitを使う場合
</summary>

<details><summary>Git環境を構築する
</summary>

後日執筆予定
</details>

後日執筆予定

</details>

<details open><summary>ブラウザでダウンロードする場合
</summary>

[JAGURSのGitHubページ](https://github.com/jagurs-admin/jagurs)にアクセスし, 緑色のボタンからDownloadZIPを選択するとZip形式で圧縮されたJAGURSのソースコードがダウンロードできます。
![スクリーンショット 2024-04-11 152133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1722756/f78ec720-da66-8481-7c17-8806151f7001.png)
        
</details>

## JAGURSをコンパイルしてみる
Makefile.SC_ICEのファイル先頭の環境設定を各自の設定に合わせて編集します。本記事と同じようにセッティングした場合は以下のようになります。

```makefile:src/Makefile.SC_ICE
    # FC: Specify Fortran90 compiler command.
    FC=ifx
    
    # Added for displacement.
    # PRJ4_DIR: Specify PROJ.4 install directory.
    # CC&CFLAGS: Specify C compiler command and flags.
    PROJ4_DIR=/usr/local/proj4
    CC=icx
    CFLAGS=-g -O2 -traceback -I$(PROJ4_DIR)/include
    
    # BASE: Specify basic compiler options.
    BASE=-fpp -assume byterecl
    
    # FFTW3_INCLUDE_DIR: Specify FFTW3 include directory.
    FFTW3_INCLUDE_DIR=$(MKLROOT)/include/fftw
    
    # FFTW3_LIB: Specify linker options to link FFTW3.
    FFTW3_LIB=-qmkl=sequential
    
    # OPT: Specify compiler options about optimization level.
    OPT=-O2 -qopenmp -qopt-report2 -I$(FFTW3_INCLUDE_DIR)
    
    # NETCDF: Specify the path to NetCDF library.
    NETCDF=/usr/local/netcdf-ifort/
    
    # LIBS: Specify linker options.
    LIBS=-shared-intel  -L$(NETCDF)/lib -lnetcdff -lnetcdf -L/opt/atlocal/supplibs/lib -lhdf5_hl -lhdf5 -lcurl -lsz -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) # for NetCDF4!
    
    # EXEC: Specify the name of executable.
    EXEC=jagurs
```
次に, 環境設定欄の下の「Set parameters here!」以下の部分で計算の設定を行います。

Makefileの編集が終わったらsrcディレクトリ内で
```
    make -f Makefile.SC_ICE
```
を実行するとコンパイルが始まります。

# 参考文献
### WSL関係
[Windows 10でLinuxを使う(WSL2)](https://qiita.com/whim0321/items/ed76b490daaec152dc69)

### コンパイラ関係
[WSL2 の Ubuntu 22.04 において NetCDF-Fortran を Intel コンパイラでビルド](https://estuarine.jp/2020/05/ubuntu-intel-netcdf/)
[インテル® Fortran コンパイラー・クラシック (ifort) の廃止](https://www.xlsoft.com/jp/blog/intel/2023/12/19/deprecation-of-the-intel-fortran-compiler-classic-ifort/)

### JAGURS関係
[JAGURS - GitHub](https://github.com/jagurs-admin/jagurs)
[JagursをWin10で実行する環境を作る](https://qiita.com/iowanman/items/53ca2ba94d3561702721)
[【メモ】Windows Subsystem for LinuxでJAGURSを実行](https://sfuno.hatenablog.com/entry/2020/05/04/091518)