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

Table of Content

九州大学のスーパーコンピュータITOサブシステムAにおいて,FVCOM4.1をSeries用にIntelコンパイラを用いてビルド・実行する方法の備忘録です.ソースコードは[cci]FVCOM4.1/FVCOM_source[/cci]に存在し,実行のテストケースとして,[cci]FVCOM4.1/Examples/Estuary[/cci]を想定します.

nkfのインストール

配布されたソースファイルの一部のラインフィードがWindows用となっている不具合がありますので,nkfを用いてラインフィードを修正します.
こちらのサイトから[cci]nkf[/cci]をダウンロードし,[cci]~/src[/cci]にコピーし,解凍,インストールしましょう.
[cc lang='bash']
$ tar xf nkf-2.1.4.tar.gz
$ cd nkf-2.1.4
$ make
### ~/local/bin/をあらかじめ作成し,PATHを通しておきます
$ cp nkf ~/local/bin/
[/cc]

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

ソースファイルの一部のラインフィードが[cci]CRLF[/cci](これはWindowsのもので,LinuxはLFです)となっていました.[cci]file[/cci]コマンドで確認し,[cci]nkf[/cci]で[cci]LF[/cci]に変換しておきましょう.
[cc lang='bash']
$ file *.F
[/cc]
[cci]ASCII text[/cci]と表示されれば[cci]LF[/cci]です.LFでないものをLFに変換します.
[cc lang='bash']
$ 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
[/cc]

Intelコンパイラ利用の準備

Intelコンパイラのバージョンは2018,2017,2016から選んで使えます.ここでは最新の2018を利用します.Intelコンパイラでコンパイルし,実行するときは常に[cci]module[/cci]コマンドによる環境設定が必要です.[cci].bashrc[/cci]の最後に追記しておくとよいでしょう.
[cc lang='bash']
$ module load intel/2018
[/cc]

ライブラリの準備

FVCOMのコンパイルの前に,必要なライブラリを準備する必要があります.[cci]./FVCOM_source/libs[/cci]の中のライブラリを準備します.netCDFは別途(こちらを参照)インストールしておきます.[cci]./FVCOM_source[/cci]において,[cci]make.inc_example[/cci]を[cci]make.inc[/cci]にコピーします.
[cc lang='bash']
$ cp make.inc_example make.inc
[/cc]
[cci]make.inc[/cci]を編集します.最初に,[cci]TOPDIR[/cci]を設定します.これは必須です.
[cc]
TOPDIR = /home/usr1/account/FVCOM4.1/FVCOM_source
[/cc]
次に,ライブラリのpathを設定します.これも必須です.MEDM ENVIRONMENTの部分をコメントアウトし,LOCAL INSTALLを以下のように設定します.また,DTLIBSとDTINCSもACTIVATEしておきます.
[cc lang='bash']
####################### 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 =
[/cc]
次に,series用のIntelコンパイラの環境変数の設定を行います.最適化はとりあえず,-O3に留めておきます.
[cc]
#--------------------------------------------------------------------------
# Intel Compiler Definitions for Series
#--------------------------------------------------------------------------
CPP = /usr/bin/cpp
COMPILER = -DIFORT
FC = ifort
CC = icc
CXX = icpc
CFLAGS = -O3
DEBFLGS = #-check all
OPT = -O3
[/cc]
次に,[cci]./FVCOM_source/libs[/cci]に移動し,[cci]makefile[/cci]を開き,
[cc]
PACKAGES = proj fproj julian
[/cc]
のように,[cci]metis[/cci]と[cci]netcdf[/cci]を削除します.これに合わせてその下の,[cci]metis[/cci]と[cci]netcdf[/cci]に関係する部分をコメントアウトします.[cci]metis[/cci]は[cci]MPI[/cci]実行の際に別途インストールすることとし,[cci]netcdf[/cci]はあらかじめインストール済です.編集が終わったら[cci]make[/cci]します.
[cc lang='bash']
$ make
[/cc]
[cci]./install[/cci]以下のディレクトリにこれらのライブラリがインストールされているはずです.

make.incの編集

[cci]./FVCOM_source[/cci]ディレクトリに戻り,[cci]make.inc[/cci]を開き,ライブラリのコンパイルのところで設定した,Intelコンパイラの環境変数と[cci]TOPDIR[/cci]にFVCOM_sourceのフルパスが設定されていることを確認します.さらに,以下のように[cci]netcdf[/cci]関連の設定をインストールした環境に合わせて行います.
[cc]
### 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
[/cc]
次に,計算条件に合わせて[cci]FLAG[/cci]を設定していきます.ここでは例として,[cci]./Examples/Estuary[/cci]用のビルドを前提に,activateする[cci]FLAG[/cci]を以下に示します.
[cc]
FLAG_1 = -DDOUBLE_PRECISION
FLAG_3 = -DWET_DRY
FLAG_8 = -DLIMITED_NO
FLAG_10 = -DGCN
FLAG_14 = -DRIVER_FLOAT
[/cc]
以上で,[cci]make.inc[/cci]の編集は終わりです.

makefileの修正

[cci]mod_esmf_nesting.F[/cci]のモジュールはどこからも[cci]use[/cci]されていませんので,配布版では使用されていないようです.このままですと,Seriesでのリンクに失敗するので,[cci]makefile[/cci]の中にある[cci]mod_esmf_nesting.F[/cci]を削除します.

makedependsの再作成

[cci]makedepends[/cci]を再作成します.[cci]makedepf90[/cci]を用い(インストールされていなければ,こちらを参照),[cci]./FVCOM_source[/cci]で,以下のように作成します.
[cc lang='bash']
$ rm makedepneds
$ touch makedepends
$ make depend
[/cc]

ソースファイルの微修正

コンパイル時の[cci]Warning[/cci]を避けるため,[cci]wreal.F[/cci]の131行目
[cc]
# endif !!ice_embedding yding
[/cc]
のコメント部分を削除します.[cci]# endif[/cci]の後にコメントを付けるのは規約違反のようです.

FVCOM4.1のビルド

準備が整ったので,[cci]./FVCOM_source[/cci]において[cci]FVCOM4.1[/cci]をビルドします.
[cc lang='bash']
$ make
[/cc]
実行形式の[cci]fvcom[/cci]ができていれば成功です.

テストケースEstuaryのインタラクティブ実行

最も基本的なテストケースである,[cci]Estuary[/cci]をインタラクティブに実行します.[cci]Estuary[/cci]の[cci]tst_run.nml[/cci]にはバグがあります.[cci]../Examples/Estuary/run[/cci]へ移動し,[cci]tst_run.nml[/cci]をエディタで開き,以下のように河川数を[cci]0[/cci]に修正しておきます(元は3になっていました).
[cc]
&NML_RIVER_TYPE
RIVER_NUMBER = 0,
[/cc]
いよいよ実行です.実行形式を[cci]../Examples/Estuary/run[/cci]にコピーします(あるいは,linkを張ります).[cci]../Examples/Estuary/run[/cci]で,以下のように実行します.
[cc lang='bash']
$ ./fvcom --casename=tst
[/cc]
スクリーンに計算の進捗状況が表示され,計算が終わると,最後に[cci]TADA![/cci]が表示されるはずです.また,計算結果を含む[cci]tst_0001.nc[/cci]ができているはずです.

バッチジョブでの実行

バッチジョブでSeries実行するには以下のようなスクリプトを用意します.
[cc lang='bash']
#!/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
[/cc]
パラメータはこちらを参照ください.[cci]rscgrp[/cci]はリソースの選択,[cci]vnode[/cci]はノード数,[cci]vnode-core[/cci]は1ノードあたりのコア数です.このコア数と同じ数を[cci]NUM_CORES[/cci]に指定します.[cci]elapse[/cci]は時間制限で,時分秒を[cci]HH:MM:SS[/cci]の形式で与えます.この例は10分が制限です.[cci]-j[/cci]は標準エラー出力を標準出力に重ね,[cci]-X[/cci]はジョブ投入時の環境変数をジョブ実行環境に継承します.このスクリプト名が[cci]series.sh[/cci]であるとします.
ジョブの投入は以下のようにします.
[cc lang='bash']
$ pjsub series.sh
[/cc]
ジョブの状況を調べるには,[cci]pjstat[/cci]コマンドを入力します.
[cc lang='bash']
$ 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
[/cc]
見にくいですが,[cci]ST[/cci]の下が[cci]RUN[/cci]となっているので,現在実行中です.[cci]JOB_ID[/cci]が[cci]594176[/cci]で,誤ってジョブを投入した場合等にこのジョブを消すには以下のようにします.
[cc lang='bash']
$ pjdel 594176
[/cc]
バッチジョブに関連するコマンドはこちらで調べられます.また,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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください