Build FVCOM4.1 (Series) on ITO Subsystem-A using Intel Compilers

Table of Contents

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 コマンドで確認し,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コンパイラの環境変数と TOPDIRFVCOM_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 をインタラクティブに実行します.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コンパイラ専用の情報は こちら にあります.

Build FVCOM4.1 (Series) on ITO Subsystem-A using Intel Compilers” に対して2件のコメントがあります。

  1. 劉非 より:

    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.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください