LoginSignup
0
0
はじめての記事投稿
Qiita Engineer Festa20242024年7月17日まで開催中!

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

Last updated at Posted at 2024-07-10

はじめに

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

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


目次

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

WSLのインストール

まずはWindows11にWSLをインストールしていきます。
Windowsキーを押しながらRキーを押すと「ファイル名を指定して実行」ウインドウが出てきます。
スクリーンショット 2024-04-08 170827.png
名前欄にpowershellと入力をしてからCtrl+Shift+Enterを押すと, powershellが管理者モードで開きます。管理者モードで開いたpowershellのコンソールに

    wsl --install -d Debian

を入力し実行するとLinux(Debian)がインストールされます。-dオプションの後の文字列を変更することでディストリビューションを指定することができます。なお, -dオプションを指定しない場合にはUbuntuがインストールされるようです。スクリーンショット 2024-04-08 172531.png

インストールが終了すると次のようなターミナルが現れ, UNIXのアカウントを作成する画面が出てきます。
スクリーンショット 2024-04-08 172600.png
ユーザー名と使用するパスワードを2回入力することで, Debianにアカウントが作成されました。今回はこの記事用にアカウントを作成しています。
スクリーンショット 2024-04-08 175119.png
今回の名前の元ネタは, 愛用しているアバターのカリンちゃんです。かわいいですね。
アカウントの作成が終わったら最新版にアップデートをしておきます。

    sudo apt update
    sudo apt upgrade

OneAPIのインストール

IntelOneAPIをインストールします。上記のOneAPIのページをスクロールすると各ツールキットのDownloadボタンがあります。
スクリーンショット 2024-04-08 180533.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
画面の指示に従って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の末尾に

~/.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のコンパイル時に画像のようなエラーを吐きだします。
スクリーンショット 2024-04-11 140626.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を参考にしてビルドしていきます。なお, 本記事の執筆時点(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を使います。

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を通しましょう。

~/.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
というように, 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を通します。

~/.bashrc
    ## 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のソースコードがダウンロードできます。
スクリーンショット 2024-04-11 152133.png

JAGURSをコンパイルしてみる

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

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

を実行するとコンパイルが始まります。

2024/07/10 追記
JAGURS-D_V0600ではシリアル版(Makefile.SC_ICE)でコンパイルをする際にコンパイルエラーが発生します。
一時的な解決策としてsrc/Makefile.SC_ICEの266行目

FFLAGS+=-DNFSUPPORT

をコメントアウトすることで動作するようになりますが,NetCDFファイルのNFフォーマットが利用できなくなります。

参考文献

WSL関係

Windows 10でLinuxを使う(WSL2)

コンパイラ関係

WSL2 の Ubuntu 22.04 において NetCDF-Fortran を Intel コンパイラでビルド
インテル® Fortran コンパイラー・クラシック (ifort) の廃止

JAGURS関係

JAGURS - GitHub
JagursをWin10で実行する環境を作る
【メモ】Windows Subsystem for LinuxでJAGURSを実行

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0