sb Parallel Ocean Model (sbPOM) を使う
ここでは、Linux上で並列計算を行う場合について、手順を記します。並列計算ツールのインストールは、多くの方がインストール方法を書かれていますので、ここでは省略します。
前処理の実行 (Matlab ユーザー向け)
prepディレクトリに入っているスクリプトファイル
実行用のスクリプトファイル | 概要 (関連するスクリプトファイル) | 生成される入力ファイル |
make_grid_ll.m |
格子点の生成を行う。(pom_masks.m, pom_horizontal_coord.m, pom_vertical_coods.m, pom_write_grid_ll.m) |
runid.grid.nc |
make_ic.m |
初期条件の設定を行う (pom_ts_initial.m, pom_ts_clim.m*) |
runid.ts_initial.nc runid.ts_clim.nc* |
make_bc.m* |
水平境界条件の設定を行う (pom_write_bc.m*) |
runid.bc.0000.nc* |
make_wind.m* |
風応力データの作成を行う (pom_write_wind.m*) |
runid.wind.0000.nc* |
make_restore_interior.m* |
内部復元データの生成を行う (pom_write_restore_interior.m*, pom_write_restore_s_interior.m*, pom_write_resore_tau_interior.m* ) |
runid.restore_s_interior.0000.nc* runid.restore_t_interior.0000.nc* runid.restore_tau_interior.0000.nc* |
* US East Coast ケースのみ
最低限必要な前処理は、計算格子設定 make_grids_ll.m と初期条件(温度・塩分濃度分布)make_ic.m の2つです。US East Coast (アメリカ東海岸)のケースでは、この他に、make_bc.m, make_wind.m, make_restore_interior.m の 3つを実行して、入力ファイルを作成する必要があります。入力ファイルは、in ディレクトリの下に保存されます。
前処理の実行:(非Matlabユーザー向け)
Matlab を所持していない場合に可能な前処理(入力データ作成)の方法として、
- Octave に NetCDF インターフェイス (OctCDF)をインストールしてスクリプトの実行
- Fortranで NetCDF 形式で保存するためのプログラムを作成する。
- その他 (統計解析ツール R のncdfパッケージの利用など)
などが挙げられます。
このうち、グリッド生成処理・初期条件(温度・塩分濃度分布)作成を行うためのFortran90 用のソースファイルを作成しました。
グリッド生成:pom_write_grid_ll.f90
温度・塩分濃度: pom_write_ts_initial.f90
これらのファイルをprep ディレクトリに置いて、適宜編集してください。
コンパイルするときには、
ifort -o pom_write_grid_ll.exe pom_write_grid_ll.f90 ${NETCDF}/lib/libnetcdf.a -I${NETCDF}/include
(pom_write_ts_initial.f90 も同様)
と入力してください。ライブラリファイル: libnetcdf.a と NetCDFの下の include ディレクトリの呼び出しを付け加えます。
namelist ファイル (pom.nml)とヘッダファイル (pom.h) の編集
前処理が終わったら、一つ上のメインディレクトリに移り、プログラムのコンパイルを行います。
namelist ファイル (pom.nml)
&pom_nml
title = 'sbPOM test case: seamount'
netcdf_file = 'seamount'
mode = 3
nadv = 2
nitera = 2
sw = 1.0
dte = 6.
isplit = 30
time_start = '2000-01-01 00:00:00 +00:00'
nread_rst = 0
read_rst_file = 'restart.0001.nc'
write_rst = 2.
write_rst_file = 'restart'
days = 2.
prtd1 = 0.5
prtd2 = 0.5
swtch = 9999.
/
パラメータの内容は、POM08のスクリプトファイル (runpom08) と同様です。
ヘッダファイル (pom.h) では、格子点数とプロセッサ数を変更します。
parameter(
$ im_global=182 ,
$ jm_global=122 ,
$ kb=31 ,
$ im_local=47 ,
$ jm_local=122 ,
$ n_proc=4 )
im_global, jm_global : 全領域の格子点数
kb : 鉛直方向の格子点数
im_local, jm_local : 1プロセッサあたりの格子点数
n_proc : プロセッサの数
計算を実行するプロセッサ数に応じて、im_local, jm_local の値を適切に与える必要があり、以下の関係式を満たすように与えなければなりません。
n_proc=((im_global-2)/(im_local-2))*((jm_global-2)/(jm_local-2))
あるプロセッサに割り当てられたサブ領域のうち、4辺の境界が別のプロセッサのサブ領域と重なるように格子点を割り当てます。
AMD Phenon II などの6コアCPUの場合は、im_local = 32, jm_local =122 または、im_local = 62, jm_local=62 とすると良いでしょう。
コンパイルと実行
プログラムのコンパイルは、make コマンドで行います。コンパイルが無事に終わると、実行ファイルpom.exeが生成されます。
pom.exe の実行は、
mpiexec -n 4 pom.exe (mpich2 の場合)
mpirun -np 4 pom.exe (openmpi の場合)
と入力します。-n 4, -np 4 は計算に実行するプロセッサの数で、pom.h で設定した n_proc の値と同じにする必要があります。
出力ファイル
出力ファイルは out ディレクトリに作成されます。seamount.0001.nc など、1ファイル1スナップ分が収録されています。クイックビューには、ncview を使うと良いでしょう。
現在、POM08に組み込まれている Wet and Drying ルーチンを sbPOM の並列化コードに組み込む作業を行っています。