Build FVCOM4.1 (Series) on ITO Subsystem-A using Intel Compilers
2020年10月30日全般的に修正加筆
九州大学のスーパーコンピュータITOサブシステムAにおいて,FVCOM4.1をSeries用にIntelコンパイラを用いてビルド・実行する方法の備忘録です.ソースコードは FVCOM4.1/FVCOM_source
に存在し,実行のテストケースとして,FVCOM4.1/Examples/Estuary
を想定します.
nkfのインストール
配布されたソースファイルの一部のラインフィードがWindows用となっている不具合がありますので,nkfを用いてラインフィードを修正します(問題ないのかもしれませんが). こちらのサイトから nkf をダウンロードし,~/src
にコピーし,解凍,インストールしましょう.
tar xf nkf-2.1.4.tar.gz
cd nkf-2.1.4
make
### ~/local/bin/をあらかじめ作成し,PATHを通しておきます
cp nkf ~/local/bin/
ソースファイルのラインフィードのチェック
この作業は不要かもしれません(2020年10月30日追記)
ソースファイルの一部のラインフィードが CRLF
(これはWindowsのもので,Linuxは LF
です)となっていました.file
コマンドで確認し,nkf
で LF
に変換しておきましょう.
file *.F
ASCII text
と表示されれば LF
です.LFでないものをLFに変換します.
nkf -Lu --overwrite ice_albedo.F
nkf -Lu --overwrite ice_coupling.F
nkf -Lu --overwrite ice_domain.F
nkf -Lu --overwrite ice_fileunits.F
nkf -Lu --overwrite ice_grid.F
nkf -Lu --overwrite ice_kinds_mod.F
nkf -Lu --overwrite ice_model_size.F
nkf -Lu --overwrite ice_scaling.F
nkf -Lu --overwrite ice_state.F
nkf -Lu --overwrite swmod3.F
Intelコンパイラ利用の準備
Intelコンパイラのバージョンは2018,2017,2016から選んで使えます.ここでは最新の2018を利用します.Intelコンパイラでコンパイルし,実行するときは常に module
コマンドによる環境設定が必要です..bashrc
の最後に追記しておくとよいでしょう.
module load intel/2018
ライブラリの準備
FVCOMのコンパイルの前に,必要なライブラリを準備する必要があります../FVCOM_source/libs
の中のライブラリを準備します.netCDFは別途(こちらを参照)インストールしておきます../FVCOM_source
において,make.inc_example
を make.inc
にコピーします.
$ cp make.inc_example make.inc
make.inc
を編集します.最初に,TOPDIR
を設定します.これは必須です.
TOPDIR = /home/usr1/account/FVCOM4.1/FVCOM_source
次に,ライブラリの path を設定します.これも必須です.MEDM ENVIRONMENTの部分をコメントアウトし,LOCAL INSTALLを以下のように設定します.また,DTLIBSとDTINCSもACTIVATEしておきます.
####################### MEDM ENVIRONMENT ##################################### # Use the environmental variables, LIBPATH and INCLUDEPATH, set by MODULE
# to find the packages used by this build.
#colon=:
#empty=
#dashI= $(empty) -I #dashL= $(empty) -L
# ### UNCOMMENT HERE!
# LIBDIR = -L$(subst $(colon),$(dashL),$(LIBPATH))
# INCDIR = -I$(subst $(colon),$(dashI),$(INCLUDEPATH))
###########################################################################
# LOCAL INSTAL LIBDIR = -L$(INSTALLDIR)/lib INCDIR = -I$(INSTALLDIR)/include
#--------------------------------------------------------------------------
# STANDARD LIBRARIES FOR DATA AND TIME IN fVCOM:
# DTLIBS = -ljulian DTINCS =
# DTLIBS = -L/${TOPDIR}/libs
# DTINCS =
次に,series 用の Intel コンパイラの環境変数の設定を行います.最適化はとりあえず,-O3
に留めておきます.
#--------------------------------------------------------------------------
# Intel Compiler Definitions for Series
#--------------------------------------------------------------------------
CPP = /usr/bin/cpp
COMPILER = -DIFORT
FC = ifort
CC = icc
CXX = icpc
CFLAGS = -O3
DEBFLGS = #-check all
OPT = -O3
次に,./FVCOM_source/libs
に移動し,makefile
を開き,
PACKAGES = proj fproj julian
のように,metis
と netcdf
を削除します.これに合わせてその下の,metis
と netcdf
に関係する部分をコメントアウトします.metis
は MPI
実行の際に別途インストールすることとし,netcdf
はあらかじめインストール済です.編集が終わったら make
します.
make
./install
以下のディレクトリにこれらのライブラリがインストールされているはずです.
make.incの編集
./FVCOM_source
ディレクトリに戻り,make.inc
を開き,ライブラリのコンパイルのところで設定した,Intelコンパイラの環境変数と TOPDIR
に FVCOM_source
のフルパスが設定されていることを確認します.さらに,以下のように netcdf
関連の設定をインストールした環境に合わせて行います.
IOLIBS = -L/home/usr1/account/local/netcdf-3.6.3-intel/lib -lnetcdf
IOINCS = -I/home/usr1/account/local/netcdf-3.6.3-intel/include
次に,計算条件に合わせて FLAG
を設定していきます.ここでは例として,./Examples/Estuary
用のビルドを前提に,activateする FLAG
を以下に示します.
FLAG_1 = -DDOUBLE_PRECISION
FLAG_3 = -DWET_DRY
FLAG_8 = -DLIMITED_NO
FLAG_10 = -DGCN
FLAG_14 = -DRIVER_FLOAT
以上で,make.inc
の編集は終わりです.
makefileの修正
mod_esmf_nesting.F
のモジュールはどこからも use
されていませんので,配布版では使用されていないようです.このままですと,Seriesでのリンクに失敗するので,makefile
の中にある mod_esmf_nesting.F
を削除します.
makedependsの再作成
makedepends
を再作成します.makedepf90
を用い(インストールされていなければ,こちらを参照),./FVCOM_source
で,以下のように作成します.
rm makedepneds
touch makedepends
make depend
ソースファイルの微修正
コンパイル時の Warning
を避けるため, wreal.F
の131行目
# endif !!ice_embedding yding
のコメント部分を削除します.# endif
の後にコメントを付けるのは規約違反のようです.
FVCOM4.1のビルド
準備が整ったので,./FVCOM_source
においてFVCOM4.1
をビルドします.
make
実行形式の fvcom
ができていれば成功です.
テストケースEstuaryのインタラクティブ実行
最も基本的なテストケースである,Estuary
をインタラクティブに実行します.Estuary
の tst_run.nml
にはバグがあります.../Examples/Estuary/run
へ移動し,tst_run.nml
をエディタで開き,以下のように河川数を 0
に修正しておきます(元は3になっていました).
&NML_RIVER_TYPE RIVER_NUMBER = 0,
いよいよ実行です.実行形式を ../Examples/Estuary/run
にコピーします(あるいは,linkを張ります).../Examples/Estuary/run
で,以下のように実行します.
./fvcom --casename=tst
スクリーンに計算の進捗状況が表示され,計算が終わると,最後にTADA!
が表示されるはずです.また,計算結果を含むtst_0001.nc
ができているはずです.
バッチジョブでの実行
バッチジョブでSeries実行するには以下のようなスクリプトを用意します.
#!/bin/bash
#PJM -L rscunit=ito-a
#PJM -L rscgrp=ito-ss-dbg
#PJM -L vnode=1
#PJM -L vnode-core=36
#PJM -L elapse=10:00
#PJM -j
#PJM -X
module load intel/2018
NUM_CORES=36
export OMP_NUM_THREADS=$NUM_CORES
./fvcom --casename=tst
パラメータはこちらを参照ください.rscgrp
はリソースの選択,vnode
はノード数,vnode-core
は1ノードあたりのコア数です.このコア数と同じ数を NUM_CORES
に指定します.elapse
は時間制限で,時分秒を HH:MM:SS
の形式で与えます.この例は10分が制限です.-j
は標準エラー出力を標準出力に重ね,-X
はジョブ投入時の環境変数をジョブ実行環境に継承します.このスクリプト名がseries.sh
であるとします. ジョブの投入は以下のようにします.
pjsub series.sh
ジョブの状況を調べるには,pjstat
コマンドを入力します.
$ pjstat
ACCEPT QUEUED STGIN READY RUNING RUNOUT STGOUT HOLD ERROR TOTAL
0 0 0 0 1 0 0 0 0 1
s 0 0 0 0 1 0 0 0 0 1
JOB_ID JOB_NAME MD ST USER START_DATE ELAPSE_LIM NODE_REQUIRE VNODE CORE V_MEM
594176 series.sh NM RUN account 04/29 12:50:29< 0000:10:00 - 1 36 unlimited
見にくいですが,ST
の下が RUN
となっているので,現在実行中です.JOB_ID
が 594176
で,誤ってジョブを投入した場合等にこのジョブを消すには以下のようにします.
pjdel 594176
For mod_esmf_nesting.F of FVCOM4.1, we can replace it with the one in FVCOM4.0, and keep it in the makefile, the compilation can be successful. It is a lack of '# if defined (multiprocessor)' in some places.
'module load intel/2018' seems unnecessary.