MRI.COM

目次

メモリ節約のための解析領域の指定

メモリ不足の場合に対応するため、モデル全領域でなく小さい領域を指定して、ライブラリの各機能を使うことができます。 ただし、以下のような様々な指定が必要です。

NAMELIST.MXE の設定

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 を使用