九州大学情報基盤センターのスパコンITO-AでDeflt3Dのビルドを行った備忘録です.ITO-AのOSはRedhat Enterprise Linux 7.3で,インテルコンパイラを用い,ホームディレクトリ直下にDelft3D/ディレクトリを作成し,その中でビルドしました.NetCDFはセンターで用意されているものを利用します.

ソースコードの入手

Delft3Dのユーザー登録を済ませ,こちらのサイトDelft3Dをクリックして,trunkのrevision番号を確認しましょう.2019年6月22日時点では64186でした.次のようにsubversionで入手します.

svn checkout https://svn.oss.deltares.nl/repos/delft3d/trunk/ 64186
これで,64186ディレクトリにソースコードがダウンロードされます. なお,revision 59659を以下のように入手し,全く同様にビルドできることを確認しています.

svn checkout https://svn.oss.deltares.nl/repos/delft3d/tags/delft3d4/59659 59659

環境変数の設定

インテルコンパイラの利用のため,環境変数を設定します.最後の2つは見落としがちです.

export CC=icc
export CXX=icpc
export CFLAGS="-O3 -no-prec-div -fp-model fast=2 -xHost"
export CXXFLAGS="-O3 -no-prec-div -fp-model fast=2 -xHost"
export F77=ifort
export FC=ifort
export F90=ifort
export FFLAGS="-O3 -no-prec-div -fp-model fast=2 -xHost"
export CPP="icc -E"
export CXXCPP="icpc -E"
export MPIF77=mpiifort
export MPICXX=mpiicpc

NetCDFおよびインテルコンパイラの利用準備

インテルコンパイラから利用できるNetCDFがセンターで準備されています.こちらを参照し,NetCDFのインストールディレクトリを以下のように把握しておきます.

/home/app/a/NetCDF-4.4.1.1
また,インテルコンパイラを利用するため,こちらを参照し,以下のように環境を設定します.

module load intel/2018.3
さらに,which ifortでインテルコンパイラがインストールされているディレクトリを把握しておきましょう.後のbuild.shの設定で必要になります.

build.shの編集

64186/src/に存在するbuild.shを以下のように編集します.

## 50行目付近 echo "    -intel16 (-intel16.0.3)"の下に以下を追記
    echo "    -ito (-intel18 on ITO-A)"

## 122行目付近 -m|-make) の前行に以下を追記
        -ito)
            compiler='ito'
            ;;

## 169行目付近 intel16) の前行に以下を追記
    ito)
        echo "Using Intel 18.3 Fortran ($platform) compiler"
        ;;

## 253行目から256行目を以下の様にコメントアウト
#addpath PATH \
#    /opt/automake/bin \
#    /opt/autoconf/bin \
#    /opt/libtool/bin

## 272行目から274行目を以下の様にコメントアウト
    #addpath PATH /opt/mpich2-1.0.8-intel64/bin
    #export MPI_INCLUDE=/opt/mpich2-1.0.8-intel64-PIC/include
    #export MPILIBS_ADDITIONAL="-L/opt/mpich2-1.0.8-intel64-PIC/lib -lfmpich -lmpich"

## 276行目のexport MPIFC=を以下のように変更
        export MPIFC=/home/app/intel/intel2018_up3/compilers_and_libraries_2018.3.222/linux/mpi/intel64/bin/mpiifort

## 283行目から288行目を以下の様にコメントアウト
#if [ "$compiler" = 'gnu' ]; then
#    fflags=''
#else
#    # Intel compilers
#    fflags='-threads'
#fi

## 293行目から298行目を以下の様にコメントアウト
#if [ "$compiler" = 'gnu' ]; then
#    export LDFLAGSMT_ADDITIONAL=" "
#else
#    # Intel compilers
#    export LDFLAGSMT_ADDITIONAL="-lifcoremt"
#fi

## 302行目の export NETCDFROOT= を以下のように変更
export NETCDFROOT=/home/app/a/NetCDF-4.4.1.1

## 369行目のflags='-O2' を以下のように変更
    #flags='-O2'
    flags=''

ビルド

準備ができたので,以下のように64186/src/ディレクトリでビルドしましょう.かなり時間がかかります.

./build -ito
しかし,ITO-Aのログインノードの制限時間内にコンパイルが終わらない場合は(64186は終わりませんでした),バッチジョブとしてコンパイルします.適当なディレクトリで以下のバッチ処理スクリプトbuild_batch.sh を作成します.-Xはジョブを投入したときのコンソールの環境変数を引き継ぐという意味で,上述の環境変数が設定されている必要があります.その他詳細はこちらを参照ください.

#!/bin/bash
#PJM -L "rscunit=ito-a"          
#PJM -L "rscgrp=ito-ss"
#PJM -L "vnode=1"
#PJM -L "vnode-core=36"
#PJM -L "elapse=2:00:00"
#PJM -j
#PJM -X
cd /home/usr*/your_account/Delft3D/64186/src
./build.sh -ito
やり直す場合はmake cleanできれいにしてから,以下のようにジョブを投入します.

pjsub build_batch.sh
pjstatコマンドで投入したジョブの状態を確認できます.ジョブが終了すると,build_batch.sh.o*******というファイルが生成され,この中に標準出力と標準エラー出力の両者が書き込まれています.最後がBuild finishedとなっていれば成功です.

examplesの実行

ビルドが成功したら,examples/ディレクトリにあるテストケースを実行してみましょう(parallelでの実行は未確認です).最初のテストは,01_standard/ディレクトリに移動し,以下のように実行します.

./run.sh
同様に他のテストケースも実行してみましょう.なお,例05では,05_mormerge/merge/に移動し,同様に./run.shで実行しますが,以下のエラーが出ました.

ERROR: Environment parameter "ARCH" not defined
この場合は環境変数ARCHを以下のように設定し,やり直します.

export ARCH=$(uname -m)
./run.sh
ITO-AではARCH=x86_64となりました.