はじめに
線形/非線形, 長波/分散波, 球面/平面座標系の切り替えが簡単にできて, ネスティングや並列計算が可能という津波の数値シミュレーションをする人間には至れり尽くせりな津波計算コードJAGURS(Baba et al., 2015; 2017)が公開されています。これを用いた津波数値シミュレーションの環境を構築するうえで, 参考になる情報が複数ページに分散していたり数年前の情報だったりしたので, 現時点(2024年4月)でのWSLのインストールからJAGURSのコンパイルまでの一連の作業を記していきたいと思います。
なおOS環境はWindows 11 Pro for Workstations 23H2(22631.3374)を使っています。本記事で用いるLinuxディストリビューションはDebian12 (bookworm)を想定しています。
目次
- WSLのインストール
- OneAPIのインストール
- JAGURSの準備
- 必要なコンポーネントの用意
- JAGURSを入手する
- JAGURSをコンパイルしてみる
WSLのインストール
まずはWindows11にWSLをインストールしていきます。
Windowsキーを押しながらRキーを押すと「ファイル名を指定して実行」ウインドウが出てきます。
名前欄にpowershell
と入力をしてからCtrl+Shift+Enterを押すと, powershellが管理者モードで開きます。管理者モードで開いたpowershellのコンソールに
wsl --install -d Debian
を入力し実行するとLinux(Debian)がインストールされます。-dオプションの後の文字列を変更することでディストリビューションを指定することができます。なお, -dオプションを指定しない場合にはUbuntuがインストールされるようです。
インストールが終了すると次のようなターミナルが現れ, UNIXのアカウントを作成する画面が出てきます。
ユーザー名と使用するパスワードを2回入力することで, Debianにアカウントが作成されました。今回はこの記事用にアカウントを作成しています。
今回の名前の元ネタは, 愛用しているアバターのカリンです。かわいいですね。
アカウントの作成が終わったら最新版にアップデートをしておきます。
sudo apt update
sudo apt upgrade
OneAPIのインストール
IntelOneAPIをインストールします。上記のOneAPIのページをスクロールすると各ツールキットのDownloadボタンがあります。
FortranコンパイラはHPC Toolkitに入っているため,
- Intel® oneAPI Base Toolkit
- Intel® HPC Toolkit
の2つをインストールする必要があります。
Base ToolkitとHPC Toolkitのインストール
Base Toolkitのインストールボタンを押すとOSごとのインストール選択画面が出てくるので, Linux - Apt Package Managerを選択します。
画面の指示に従って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の末尾に
## intel OneAPI settings
. /opt/intel/oneapi/setvars.sh
を追加しましょう。
JAGURSの準備
さて, 本題のJAGURSの準備に入ります。
JAGURSをコンパイルするためには
-
NetCDF4
- NetCDF-CをインストールするためにHDF5
- NetCDF-Fortranをビルドするためにmake
- PORJ4
-
FFTW3
が必要なようです。FFTW3はOneAPIに付属しているMKLで代用できるため, このページでは扱いません。
また, これらをビルドするためにmakeを使用するので今の段階でインストールしておきましょう。
sudo apt install make
NetCDFのインストール
[Optional]HDF5とNetCDF-Cを自前でビルドする
後日執筆予定HDF5とNetCDF-Cをaptでインストールする
HDF5とNetCDF-Cはaptからインストールすることができます。
sudo apt install hdf5-tools libnetcdf-dev netcdf-bin
HDF-5をaptからインストールした場合はそのままだとJAGURSのコンパイル時に画像のようなエラーを吐きだします。
これを回避するために以下の手順でシンボリックリンクを作成します。
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を参考にしてビルドしていきます。なお, 本記事の執筆時点(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を使います。
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を通しましょう。
## 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
を実行してみると
というように, Cコンパイラにicx, Fortranコンパイラにはifxが指定された状態でNetCDF-Fortranがインストールできたことを確認できます。
以上でNetCDFのインストールは完了です。
PROJ.4のインストール
PROJ.4をインストールしていきます。JAGURS公式のドキュメントを読むと
Currently, only proj-4.9.1 is confirmed.
と書かれており, PROJは最新版の9.X.Xではなく4.9.1をインストールしないといけないようです。(ただしiowanmanさんの記事だと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を通します。
## proj4 settings for JAGURS
LD_LIBRARY_PATH=/usr/local/proj4/lib:$LD_LIBRARY_PATH
最後にsource ~/.bashrc
を実行してPATHを読み込めば, JAGURSをコンパイルする準備が整いました。
JAGURSを入手する
Gitを使う場合
Git環境を構築する
後日執筆予定
後日執筆予定
ブラウザでダウンロードする場合
JAGURSのGitHubページにアクセスし, 緑色のボタンからDownloadZIPを選択するとZip形式で圧縮されたJAGURSのソースコードがダウンロードできます。
JAGURSをコンパイルしてみる
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関係
コンパイラ関係
WSL2 の Ubuntu 22.04 において NetCDF-Fortran を Intel コンパイラでビルド
インテル® Fortran コンパイラー・クラシック (ifort) の廃止
JAGURS関係
JAGURS - GitHub
JagursをWin10で実行する環境を作る
【メモ】Windows Subsystem for LinuxでJAGURSを実行