WRF4.3.3をubuntu 20.04.3/intel-mpi (oneapi)にてコンパイル

## 領域気象ソフトWRFのコンパイルメモ

intel-mpiを使うのが初めてだったので、戸惑った箇所を中心にメモ (2022.04版)
※Intel oneAPI HPC Toolkit (Intel-MPI)の使用を前提としています。

### 環境
<dd>wrf4.3.3 (openmp/intel-mpi)</dd>
<dd>ubuntu 20.04.3</dd>
<dd>intel compiler/mpi (oneAPI 2022.1)</dd>
<dd>AMD Threadripper Pro (第三世代)</dd>

### 方針
ライブラリは/usr/local/intelにまとめる (gcc由来のものと混在を避ける)

### 注意点
1. zlib: -fPICが必要(hdf5作成)
2. hdf5: configure後に作成されるlibtoolを一部修正
         (sudo時のicc/ifort対応)
3. WPS: configure.wps修正 (WRF_LIB, DM_FC, DM_CC, 後の2つはIntel-MPI対応)

### setintel.sh
intelコンパイラ環境設定スクリプト (~/binに置く)

```bash:setintel.sh
export CC=icc
export CXX=icpc
export FC=ifort
export F77=ifort
export F90=ifort
export CFLAGS='-O3 -ip'
export CXXFLAGS='-O3 -ip'
export FFLAGS='-O3 -ip'
export CPP="icc -E"
export CXXCPP="icpc -E"
source /opt/intel/oneapi/setvars.sh
export LD_LIBRARY_PATH=/usr/local/intel/lib:${LD_LIBRARY_PATH#/usr/local/intel/lib:}
export LD_RUN_PATH=/usr/local/intel/lib:${LD_RUN_PATH#/usr/local/intel/lib:}
export LDFLAGS='-L/usr/local/intel/lib -I/usr/local/intel/include'
export CPPFLAGS='-I/usr/local/intel/include'
export PATH=/usr/local/intel/bin:${PATH#/usr/local/intel/bin:}
export NETCDF=/usr/local/intel
export MANPATH=/usr/local/intel/man:${MANPATH#/usr/local/intel/man:}
export PKG_CONFIG_PATH=/usr/local/intel/lib/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig:${PKG_CONFIG_PATH}
```

実行するには

```shell
$ source ~/bin/setintel.sh
```

:::note info
スクリプト前の"source"を忘れると機能しない。
ifortと入力して "ifort: ... no files specified ... -help"と出れば成功。
コンパイラ使用前やwrf.exe実行前などにログイン後一度だけ行なう。
:::

### 関連ライブラリの準備

基本は

```shell
$ ./configure --prefix=/usr/local/intel
$ make
$ make check
$ sudo make install
```
**zlib 1.2.11**: configureのオプションに `CFLAGS='-O3 -ip -fPIC'`追加
**szip 2.1.1**
**jasper 1.900.1**
**libpng 1.6.37**
**hdf5 1.12.1**: configureオプション追加、libtool修正

```shell
$ ./configure --prefix=/usr/local/intel  \
--enable-fortran --enable-cxx --enable-hl  \
--with-szlib=/usr/local/intel --with-zlib=/usr/local/intel
```

configure実行後に作成されるファイル`libtool`冒頭に一行追加

```bash:libtool (line30)
# along with this program.  If not, see ...
source /opt/intel/oneapi/setvars.sh
```

:::note warn
この操作をしないとsudo make install実行時に、コンパイラ関連のpathがsuに引き継がれず、エラー(ifort not found)になる。
:::

**netcdf c 4.8.1, fortran 4.5.4** (m4が必要): configureのオプション追加

```
$ ./configure CPPFLAGS="-I/usr/local/intel/include" --prefix=/usr/local/intel
```

**ncl 6.6.2** 　aptを利用

```
$ sudo apt install ncl-ncarg
$ export NCARG_ROOT=/usr/share/ncarg
```
→ nclの塗りつぶしがうまく働かない時は(WPS/util/plotgrids_new.nclなど)
  minicondaを使ってインストール（下記参照）

https://qiita.com/hal360/items/d358402013b2c8949d38

## WRF/WPSコンパイル
ダウンロード

```shell
$ git clone https://github.com/wrf-model/WRF
$ git clone https://github.com/wrf-model/WPS
```
※カレントディレクトリの下にWRF, WPSが作成される

**WRF** (cshが必要) 　　 コンパイルには数十分かかる

```shell
$ cd WRF
$ ./configure    # 16: intel compiler (dm+sm) を選択
$ ./compile em_real 2>&1 | tee log.compile
```
:::note info
wrf.exe, real.exe, ndown.exeができていれば成功
導入したWRFのバージョンは、log.compileの7行目に記載 ("V4.3.3")
:::

**WPS**
(1) `configure`を実行

```shell
cd ../WPS
export JASPERLIB=/usr/local/intel/lib
export JASPERINC=/usr/local/intel/include
export WRF_DIR=../WRF
./configure  # 19: intel compiler (dmpar)を選択
```

(2) 新たにできる`configure.wps`を手で修正

```shell:configure.wps
WRF_LIB= ... -qopenmp   # 最後(-lnetcdfの後)に追加
  ...
DM_FC=mpiifort   # mpif90から変更。'mpiif90'は存在しないので注意
DM_CC=mpiicc     # mpiccから変更。  FC,CCは変更不要
```
:::note info
DM_FC, DM_CCの変更は、Intel-MPIを使用する場合のみ
使わない時は、変更不要(mpif90, mpiccのまま)
:::
:::note warn
修正をしないとそれぞれ次のエラーが出る
WRF_LIB 　   　　undefined reference to kmpc...
DM_FC,DM_CC 　undefined reference to mpi_init ...
:::

(3) コンパイル  (WRFほどはかからない）

```shell
$ ./compile 2>&1 | tee log.compile
```

:::note info
geogrid.exe, metgrid.exe, ungrib.exeができていれば成功
導入したWPSのバージョンは、log.compileの3行目に記載 ("Version 4.3.1")
:::

:::note warn
他にデータファイルを下記からダウンロードして、WPS_GEOGに置く必要あり
(詳細はリンク先参照）
https://www2.mmm.ucar.edu/wrf/users/download/get_sources_wps_geog.html
:::

### 関連リンク

https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php

https://zlib.net/

https://support.hdfgroup.org/doc_resource/SZIP/

https://www.ece.uvic.ca/~frodo/jasper/

http://www.libpng.org/pub/png/libpng.html

https://www.hdfgroup.org/downloads/hdf5/source-code/

https://www.unidata.ucar.edu/downloads/netcdf/

https://github.com/wrf-model/WRF/releases

https://qiita.com/hal360/items/d358402013b2c8949d38