九州大学のスーパーコンピュータ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/

ソースファイルのラインフィードのチェック

ソースファイルの一部のラインフィードがCRLF(これはWindowsのもので,LinuxはLFです)となっていました.fileコマンドで確認し,nkfLFに変換しておきましょう.

$ 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_examplemake.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

のように,metisnetcdfを削除します.これに合わせてその下の,metisnetcdfに関係する部分をコメントアウトします.metisMPI実行の際に別途インストールすることとし,netcdfはあらかじめインストール済です.編集が終わったらmakeします.

$ make

./install以下のディレクトリにこれらのライブラリがインストールされているはずです.

make.incの編集

./FVCOM_sourceディレクトリに戻り,make.incを開き,ライブラリのコンパイルのところで設定した,Intelコンパイラの環境変数とTOPDIRにFVCOM_sourceのフルパスが設定されていることを確認します.さらに,以下のようにnetcdf関連の設定をインストールした環境に合わせて行います.

### 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をインタラクティブに実行します.Estuarytst_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_ID594176で,誤ってジョブを投入した場合等にこのジョブを消すには以下のようにします.

$ pjdel 594176

バッチジョブに関連するコマンドはこちらで調べられます.また,Intelコンパイラ専用の情報はこちらにあります.