WRFDA における背景誤差データ (be.dat) の作成方法

変分法によるデータ同化を行う際には, 背景誤差共分散行列が必要となる. WRFDA で同化を行う場合, 背景誤差データとして WRFDA/var/run/be.da.cv3 というファイルを be.dat としてコピーして使用可能である. しかし, 数km以下の高解像度の同化シミュレーションなどの場合には, それに合わせた背景誤差データを作成して使用したい.

ここでは, WRFDA のツールを使用し, NMC 法 (Parrish and Derber 1992) で背景誤差データを作成する方法について記す. NMC 法は, 同じ時刻を対象とする異なる初期値からの2つの予報のペアを多数用いて背景誤差の統計を計算する方法である. WRFDA で NMC 法による背景誤差の計算を行う場合, WRF で通常のシミュレーションを走らせて得られる wrfout_d01_* のペアを用いることになる.

以降では, 2025/09/01 00UTC ~ 2025/09/31 18UTC までの期間における 00, 06, 12, 18 UTC を対象とした予報データを作成し, 同時刻を対象とする24, 12時間予報のペアから背景誤差の計算を行う手順を説明する. 大まかな手順は次の通りである:

  1. WRF シミュレーションで必要な wrfout ファイルを作る
  2. WRFDA の gen_be_wrapper.ksh を実行して背景誤差ファイル be.dat を作る
  3. gen_be_plot_wrapper.ksh を実行して背景誤差データを描画

上記の手順で得られる be.dat が背景誤差の統計ファイルであり, WRFDA で変分法を行う際に使用する


1. WRF シミュレーションで必要な wrfout ファイルを作る

2025/09/01 00UTC ~ 2025/09/30 18UTC までの期間における 00, 06, 12, 18 UTC を対象とした24, 12時間予報値を計算する. 例えば, 2025/09/01 00UTC については, 2025/08/31 00UTC からの24時間予報と, 2025/08/31 12UTC からの12時間予報データが必要である. 1日あたり4時刻を対象として30日分のデータを作るには, 2025/08/31 00UTC, 2025/08/31 06UTC, … , 2025/09/30 06UTC までの6時間ごとの初期値から24時間予報を計算し, 12, 24時間予報の wrfout ファイルの出力を作成すればよい. 24時間積分の途中で12時間予報を計算しているため, 同じ初期時刻から24, 12時間積分を別々に走らせる必要はない. さらに, 24時間積分の間に, wrfout ファイルの出力を1時間間隔で行う設定にしておけば, 12時間予報と6時間予報から背景誤差を計算するといった変更を後から行うことが容易である. namelist.input の history_interval = 60 としておけば, 1時間ごとの wrfout ファイルが作られる.

WRFシミュレーションの設定に当たって, 以下の点に注意が必要である:

  • それぞれのシミュレーションの解像度や水平・鉛直格子数をそろえる
    特に理由がなければ, 初期時刻のみを変更し, それ以外の設定はすべてそろえる
  • 最終的に得られる背景誤差データ (be.dat) を使った同化シミュレーションの格子数は, be.dat の生成に使用したシミュレーションの格子数と一致しなければならない

特に2つ目について注意が必要である. 多数のシミュレーションを行うため, 解像度を下げたり, 格子数小さくして計算時間を短くしたいと考えることもある. しかし, 得られた be.dat を使用した同化シミュレーションの格子数と be.dat の生成時の格子数が一致しない場合, 同化プログラム (da_wrfvar.exe) の実行時にエラーとなる. その場合, 同化の目的の格子数等の設定に合わせて再度多数のシミュレーションを回さなければならなくなる. そうした失敗を避けるため, 最終的にどのような同化シミュレーションを行いたいのかをよく考え, それに合わせて WRF シミュレーションの設定を行うのが良い.

各WRF シミュレーションは /test/FCST/YYYYMMDDHH (YYYYMMDDHH は初期時刻) の中で行うとする. 初期時刻をディレクトリ名として分けておくと後の作業が楽である. 今回は背景誤差データの作成方法の説明が目的なので, WRF シミュレーションの実行方法の詳細説明は省略する. 通常通り, 以下のような手順でシミュレーションを行えばよい:

  1. ./geogrid.exe —> 地形ファイルを作成
  2. ./ungrib.exe —> 初期・境界値に使うデータのGRIBファイルを処理
  3. ./metgrid.exe —> ungrib.exe で生成したファイルから, 初期・境界値用の中間ファイルを作成
  4. ./real.exe —> 初期・境界値ファイルを作成 (wrfinput_d01, wrfbdy_d01)
  5. ./wrf.exe —> 予報計算を実行

WRF の namelist.input における history_interval を60分に設定したとする. 初期時刻が2025/09/01 00UTC の場合, wrf.exe の計算が終わると, /test/FCST/2025090100 の中に以下のようなファイルができているはずである:

  • wrfout_d01_2025-09-01_00:00:00
  • wrfout_d01_2025-09-01_01:00:00
  • wrfout_d01_2025-09-01_23:00:00
  • wrfout_d01_2025-09-02_00:00:00

すべての初期時刻について上記のような wrfout ファイルの作成を確認したら次の作業に移る.


2. WRFDA の gen_be_wrapper.ksh を実行して背景誤差ファイル be.dat を作る

WRFDA における背景誤差の計算ツールの詳細は, 公式ページを参照されたい. また, 背景誤差の計算ツールの使用に関するチュートリアルは, WRF MODEL USERS’ PAGE 内にあるこちらのページがわかりやすい.

WRFDA 本体のディレクトリを /test/WRFDA とする. 背景誤差の計算には, WRFDA のツール gen_be_wrapper.ksh を使用する. このファイルは, /test/WRFDA/var/scripts/gen_be の中に存在する. これを作業ディレクトリ (/test/gen_be とする)にコピーし, 以下の項目を編集して実行する:

export WRFVAR_DIR=/test/WRFDA
export NL_CV_OPTIONS=5        # 5か7を指定 (制御変数の設定)
export BIN_TYPE=5             # デフォルト値5が推奨されている
export START_DATE=2025090100  # 予報対象時刻の最初
export END_DATE=2025093018    # 予報対象時刻の最後
export NUM_LEVELS=49          # namelist.input で e_vert=50 とした場合
export BE_METHOD=NMC          # 背景誤差の計算スキームを設定
export FC_DIR=/test/FCST      # wrfout ファイルの入っている初期時刻ディレクトリがある場所を指定
export RUN_DIR=`pwd`/gen_be${BIN_TYPE}_cv${NL_CV_OPTIONS} # 背景誤差の計算を行うディレクトリ
export DOMAIN=01              # 今回は01, 多段階ネストの予報を使う場合はそのナンバーを書く
export FCST_RANGE1=24         # 予報時間(長い方)
export FCST_RANGE2=12         # 予報時間(短い方)
export INTERVAL=6            # 初期時刻の刻み幅(00, 06, 12, 24 UTC なら6時間)

各変数の内容は上記コメントを読んでいただきたい. NL_CV_OPTIONS は制御変数の設定に関するパラメータで, 5と7では風の扱いが異なる.

FC_DIR の設定は注意を要する. gen_be_wrapper.ksh を実行すると, START_DATE から END_DATE まで, INTERVAL の時間間隔で, その時刻を対象とする24, 12時間予報値の wrfout ファイルを探索する. 例えば, 2025/09/01 00UTC を対象とした24, 12時間予報値のファイルは以下の場所で探索される:

  • 24時間予報値: ${FC_DIR}/2025083100/ 内の wrfout_d01_2025-09-01_00:00:00 を探す
  • 12時間予報値: ${FC_DIR}/2025083112/ 内の wrfout_d01_2025-09-01_00:00:00 を探す

すなわち, FC_DIR で指定されたディレクトリ内に初期時刻事のディレクトリ(YYYYMMDDHH 形式)が存在し, 各初期時刻ディレクトリ内に24, 12時間予報値の wrfout ファイルが存在しなければならない. 手順1の例では, /test/FCST/YYYYMMDDHH の下に wrfout ファイルがあるので, FC_DIR=/test/FCST とすればよい. 手順1のときに初期時刻別のディレクトリを作成してその中で wrfout を作成したのはこのような背景からである. もし, 異なるディレクトリ構成で作業した場合は, FC_DIR で指定したディレクトリの下に, 初期時刻別のディレクトリを作成してファイルを配置し直す必要がある.

gen_be_wrapper.ksh の変数の設定が完了したら, 後は実行して完了を待つだけである:

# /test/gen_be 内で作業
ksh gen_be_wrapper.ksh
# RUN_DIR で指定した場所 (/test/gen_be/gen_be5_cv5) で計算が進められる

2km解像度, 200×200×50格子で1か月間(00, 06, 12, 18UTC)の wrfout データを対象として計算した場合, gen_be_wrapper.ksh の完了に1時間半程度かかった. 計算が終わると, /test/gen_be/gen_be5_cv5/be.dat ファイルができているはずである. 途中で計算が止まった場合などは, /test/gen_be/gen_be5_cv5 以下にある, gen_be_stage?.log などのログを確認するとよい.


3. gen_be_plot_wrapper.ksh を実行して背景誤差データを描画

手順2で生成された背景誤差データに問題がないかどうかをチェックする方法として, gen_be_plot_wrapper.ksh でグラフを描画して結果を確認するのが簡単である.

引き続き, /test/gen_be 内で作業するものとする. /test/WRFDA/var/scripts/gen_be/gen_be_plot_wrapper.ksh をコピーし, 以下の項目を編集して実行する:

export WRFVAR_DIR=/test/WRFDA
export GEN_BE_PLOT=${WRFVAR_DIR}/var/graphics/ncl/gen_be
export GRAPHIC_WORKS=pdf
export NUM_WE=199         # 東西格子数 - 1
export NUM_SN=199         # 南北格子数 - 1
export NUM_LEVELS=49      # 鉛直格子数 - 1
export RESOLUTION_KM=2.0  # km
export REGION=test        # 出力ファイル名に付け足すラベル (何でもよい)
export BE_DIR=/test/gen_be/gen_be5_cv5/working # 描画に使用するデータのある場所を指定
export BE_NROW=$NUM_LEVELS

NUM_WE, NUM_SN, NUM_LEVELS は各格子数から1を引いた値を指定すること. また, BE_DIR は be.dat ファイルの場所ではなく, 先の gen_be_wrapper.ksh の RUN_DIR で指定したディレクトリ内の working ディレクトリを指定する.

gen_be_plot_wrapper.ksh を実行すると, /test/gen_be 内に 以下の pdf ファイルが生成される:

  • gen_be_corr_ps_test.pdf
  • gen_be_corr_yz_test.pdf
  • gen_be_corr_z_test.pdf
  • gen_be_global_evals_test.pdf
  • gen_be_global_evecs_test.pdf
  • gen_be_lengthscales_test.pdf

各 pdf ファイルには, 背景誤差データに関するグラフが描画されている. 描画内容の例が, 公式チュートリアルに掲載されているので参照されたい.

gen_be_plot_wrapperr.ksh を実行すると, NCL (NCAR Command Language) を呼び出して描画を行う. そのため, あらかじめ NCL を使用できる環境を準備しておかなければならない. もし, NCL をインストールしていない場合には, NCL の公式ページを参照してインストールを先にしておくこと.

筆者も初めは NCL をインストールしていなかったため, インストール作業が必要であった. miniconda で NCL 用の仮想環境を作成しようとしたが少してこずった. その時のメモを残しておく.

conda create -n ncl_env -c conda-forge ncl

上記のようにして仮想環境を作成して ncl をインストールしようとしたが, 以下のようなメッセージが表示され, インストールできなかった:

Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.

公式ページからビルド済みの実行バイナリをダウンロードすることも考えたが, 公式ページからそれと思しきものを見つけられなかった.

そこで, Micromamba の実行ファイルを直接ダウンロードし, それを用いて仮想環境を作成させることにした:

mkdir ~/software
cd ~/software
wget https://micro.mamba.pm/api/micromamba/linux-64/latest
tar -xvjf latest bin/micromamba
./bin/micromamba create -p ~/miniconda3/envs/ncl_env -c conda-forge ncl

micromamba を使用することで NCL を仮想環境にインストールできた. あとは, 以下のように有効化してから gen_be_plot_wrapper.ksh を実行することで背景誤差データの描画に成功した.

conda activate ~/miniconda3/envs/ncl_env

Link