メモリ不足の場合に対応するため、モデル全領域でなく小さい領域を指定して、ライブラリの各機能を使うことができます。 ただし、以下のような様々な指定が必要です。
NAMELIST.MXE の nml_anl_region ブロックで解析領域(グリッド範囲)を指定します。
&nml_anl_region anl_region%ifirst =, anl_region%ilast = , anl_region%jfirst = , anl_region%jlast = , /
これにより、ライブラリで作成される2次元、3次元配列は全て解析領域だけ(厳密には2グリッド外側まで)をメモリに記憶するようになります。
ファイル入力、出力とも、anl_regionではなくモデル全領域のサイズ(imut,jmut)の配列が使われるので対応は不要です。
ただし、既に同名の出力ファイルがある場合は、解析領域に結果を注入してファイルを書き換えます。 (ない場合は解析領域以外は欠損値が入ったファイルが出力されます。)
nml_anl_region オプションを使うには、解析プログラムで以下のように対応する必要があります。 詳細は、例えば anl/mixed_layer/src/mixed_layer_depth.F90 を参照して下さい。
プログラム冒頭でlibmxe_para__set_anl_region_enableをcallします。
call libmxe_para__set_anl_region_enable !-- registerの前でanl_regionオプションをオン call libmxe_para__register( para ) call libmxe_io__register( io, para ) ...
これがないと nml_anl_region は無視され、通常どおり全領域が解析対象になります。 オンにすれば以下の2つの構造体が作成されます。
デフォルトではどちらもモデル全領域に対応します。
real(4),allocatable :: t(:,:,:) ifirst = para%input_region%ifirst ilast = para%input_region%ilast jfirst = para%input_region%jfirst jlast = para%input_region%jlast allocate( t(ifirst:ilast,jfirst:jlast,para%km) ) !!! para%input_region のサイズで読み込み用配列を割当 call libmxe_io__read_hst( para, io, trim(file_base_in), nrec, para%km, t ) !!! 読み込みには libmxe_io__read_hst を使用
real(4),allocatable :: r(:,:) allocate( r(ifirst:ilast,jfirst:jlast) ) !!! 書き出し用配列もpara%input_region のサイズ do j = para%anl_region%jfirst, para%anl_region%jlast !!! 解析は anl_region でよい do i = para%anl_region%ifirst, para%anl_region%ilast r(i,j) = ... enddo enddo call libmxe_io__write_hst( para, io, trim(file_base_out), nrec, 1, r ) !!!ファイル出力には libmxe_io__write_hst を使用