WRF を使ってみた

モデル本体編と前処理編に分けました。

 米国で現業・研究両用のメソモデルとして開発されている WRF を使ってみた。インストールと、テストデータを使った予報実験、可視化 、そして米国の全球モデルデータから初期条件・境界条件を作成してのテストランをやってみた。

実行環境

モデル本体編

netcdf

netcdf がインストールされていなければインストールする

http://www.unidata.ucar.edu/software/netcdf/index.html から netcdf.tar.gz をとってくる。(ここで使ったバージョンは 3.6.0-p1 )

 tar xvfz netcdf-tar.gz
 cd netcdf-3.6.0-p1/src
 ./configure  --prefix=/usr/local
 make
 make install

 configure の際に、checking if "Fortran byte" is C "signed ***" ... yes となっていることを確認すること。この実行環境では "signed char" ... yes となっていることが必要。ifc のバージョンによってはおかしくなる(netcdf のコンパイルはできるがあとで困る)ので注意。

WRF ダウンロード

wrf のホームページは http://www.wrf-model.org/index.php

よくわからないけれども WRF-ARW と WRF-NMM の2つのバージョンが存在する。前者は NCAR が管理している研究バージョンで、後者は NCEP が管理する現業バージョンに相当すると考えられる。力学過程や格子の配置からしてまるで違う。

ここでは前者の WRF-ARW を使ってみる。

http://www.mmm.ucar.edu/wrf/users/download/get_source.html

からユーザー登録する。メールアドレスだけで簡単にできる。wrf-users メーリングリストへの登録も同時にできるが、しなくてもよい。一度登録すると、メールアドレスを入力するだけでダウンロードのページに行くことが出来る。

モデルのプログラム WRFV2.1.1.TAR.gz とテストデータ jan00.tar.gz、Post-Processing Software にある wrf2grads.tar.gz をダウンロードする。

モデルのプログラムを展開し、コンパイル

 環境変数 NETCDF に libnetcdf.a が存在するパスを定義しておく。(NETCDF=/usr/local ; export NETCDF)

tar xvfz WRFV2.1.1.TAR.gz
 cd WRFV2
 ./configure

サポートしているプラットフォームの一覧が表示されるが、Intel Xeon ifort compiler の 7 ( single-threaded, no nesting ) をここでは選ぶ。

 ./compile em_real

各種理想実験、予報実験毎にロードモジュールを作り分ける仕組みになっている。テストデータを使って予報をしてみるので、em_real を選択する。少し時間がかかるがじっと待つ。

main/ndown.exe, main/real.exe, main/wrf.exe が作成されれば正常。

テストデータを展開、カードを編集

以下、cd run として run ディレクトリで作業をする。

 tar xvfz jan00.tar.gz

でテストデータを展開する。展開すると

 wrf_real_input_em_d01.2000-24_12:00:00
 wrf_real_input_em_d01.2000-24_18:00:00
 wrf_real_input_em_d01.2000-25_00:00:00
 wrf_real_input_em_d01.2000-25_06:00:00
 wrf_real_input_em_d01.2000-25_12:00:00
 wrf_real_input_em_d01.2000-25_18:00:00
 wrf_real_input_em_d01.2000-26_00:00:00
 wrf_real_input_em_d02.2000-24_12:00:00

が作成される。米国東部を対象としたモデルの初期条件、境界条件のようである。境界の時刻毎にファイルが作られている。

このテストデータにあわせて入力カード namelist.input を編集する。

 run_hours = 12 (予報時間)
 start_year = 2000 (初期時刻、いちばん左だけでよい)
 start_month = 01
 start_day = 24
 start_hour = 12
 end_year = 2000 (終了時刻、いちばん左だけでよい)
 end_month = 01
 end_day = 25
 end_hour = 12
 interval_second = 21600 (境界値の時間間隔)
 e_we=74 (東西格子数、ネスティング用に3つカラムがあるがいちばん左だけでよい、以下同じ)
 e_sn=61 (南北格子数)
 e_vert=28 (鉛直格子数)
 dx=30000(東西格子間隔)
 dy=30000(南北格子間隔)

まだよく理解していないが、これで動いた。

いよいよ実行

と意気込む前に、まず前処理。

./real.exe

最後に "SUCCESS COMPLETE REAL_EM INIT" と出れば成功

さて、いよいよ予報実行。

./wrf.exe

で予報を開始。タイムステップ毎に標準出力にメッセージが出る。

終了すると、ヒストリーファイル wrfout_d01_2000-01-24_12:00:00 が作成されているはず。

可視化

出力データを見る。ここでは wrf_to_grads をダウンロードしたのでまずこれを使ってみる。

展開しコンパイル。

 tar xvfz wrf2grads.tar.gz
 cd WRF2GrADS

Makefile を編集する。linux flags (INTEL) のコメントをはずす。big_endian 環境で(環境変数 F_UFMTENDIAN=big を設定して)モデルを実行する場合は、CPPFLAGS に -Dbytesw を追加する。

 make

でモジュール wrf_to_grads が作成される。

次にコントロールファイル controle_file を編集する。最低限、最初の方にある年月日時刻、終わりの方の All list of files にあるヒストリーファイル名を入力する。要素名がたくさん並んでいるが、要素名の前に空白がなければ出力され、空白があれば出力されないので、出力したい要素に応じて controle_file を 編集する。そして

 ./wrf_to_grads control_file wrfout_grads

とすると、GrADS用ディスクリプターファイル wrfout_grads.ctl とデータファイル wrfout_grads.dat が作成される。 あとは述べるまでもないが

 grads wrfout_grads.ctl

とするとデータを読んでくれる。


前処理編

WRFSI ダウンロード

サンプルデータによる予報ができたところで、次は自分の好きな領域で、実際にリアルタイムデータから初期条件・境界条件を作成して実行してみよう。そのためには WRF 本体とは別に、 WRFSI (Standard Initialization) という前処理プログラムが必要である。

wrf のホームページ http://www.wrf-model.org/index.php からたどって前処理プログラム wrfsi_v2.1.1.tar.gz をダウンロードする。

前処理のプログラムを展開し、コンパイル

WRFV2 ディレクトリの下に wrfsi_v.2.1.1.tar.gz を展開する。GUI版が楽しそうではあるが、マシンの環境から断念してとりあえず非GUI版を試してみることにする。

環境変数 NETCDF に libnetcdf.a が存在するパスを定義しておく。(NETCDF=/usr/local ; export NETCDF)

ほかにもいくつか、ファイルの置き場所が環境変数として必要となる。コンパイル時にすべては必要はなく、定数データと外部モデルデータだけでよいが、どうせあとの実行で必要となるので、ここですべて決めておこう。

 展開したソース SOURCE_ROOT=WRFV2/wrfsi ; export SOURCE_ROOT
 インストール先 INSTALLROOT=WRFV2/wrfsi ; export INSTALLROOT
 定数データ GEOG_DATAROOT=/data/wrf/GEOG; export GEOG_DATAROOT
 外部モデルデータ EXT_DATAROOT=/data/wrf/external; export EXT_DATAROOT
 内部モデルデータ DATAROOT=/data/wrf/domains ; export DATAROOT
 ひながた(テンプレート) TEMPLATES=/data/wrf/templates ; export TEMPLATES
 事例別データ MOAD_DATAROOT=$DATAROOT/my-case ; export MOAD_DATAROOT

定数データを取得しておこう。http://www.mmm.ucar.edu/wrf/users/download/get_source.html からプログラムと同様、入手できる。これらは圧縮されているので、GEOG_DATAROOT 以下に解凍しておく。

 soiltype_top_30s/
 soiltype_bot_30s/
 landuse_30s/
 topo_30s/
 soiltemp_1deg/
 islope/
 maxsnowalb/
 albedo_ncep/
 greenfrac/

などとディレクトリができる。

ifc の環境(?)ではソースプログラムの修正が必要。

まず wrfsi/src/io_netcdf/wrf_io.F90 の 594 行目付近、m4 の define が通らないのでこれをコメントにし、上の行のプリプロセッサ #define XDEX... をコメントアウトする。

 594c594,595
 < #define XDEX(A,B,C) A-A ## 1+1+(A ## 2-A ## 1+1)*((B-B ## 1)+(C-C ## 1)*(B ## 2-B ## 1+1))
 ---
 > !#define XDEX(A,B,C) A-A ## 1+1+(A ## 2-A ## 1+1)*((B-B ## 1)+(C-C ## 1)*(B ## 2-B ## 1+1))
 > define(`XDEX',($1-``$1''1+1+(``$1''2-``$1''1+1)*(($2-``$2''1)+($3-``$3''1)*(``$2''2-``$2''1+1))))

次に、src/lib/w3lib 以下の3つのファイル w3fi58.f, w3fi59.f, w3fi76.f の冒頭にある "CDIR$ INTEGER=64" を "CDIR$ INTEGER:8" と書き換える。

コンパイルを実行する。

 perl install_wrfsi.pl --machine=pcintel --install_ui=n

コンパイルが終了すると、$INSTALLROOT/bin 以下に

 gridgen_model.exe
 grib_prep.exe
 hinterp.exe
 vinterp.exe
 siscan
 staticpost.exe

が作成される。以下の前処理実行ではこれらのモジュールを実行するのではなく、perl のスクリプトを実行する。

領域決定

インストールした前処理プログラムの標準のひながた(テンプレート)を作業用にコピーする。

 cd $TEMPLATES
 cp -r default my-case
 chmod -R u+w my-case
 cd my-case

my-case ディレクトリにある wrfsi.nl を編集する。米国東部をランベルト座標系で 30km メッシュで覆うとすると、およそ次のようになる。

 &hgridspec
 NUM_DOMAINS = 1
 XDIM = 74
 YDIM = 61
 PARENT_ID = 1,
 RATIO_TO_PARENT = 1,
 DOMAIN_ORIGIN_LLI = 1,
 DOMAIN_ORIGIN_LLJ = 1,
 DOMAIN_ORIGIN_URI = 1,
 DOMAIN_ORIGIN_URJ = 1,
 MAP_PROJ_NAME = 'lambert',
 MOAD_KNOWN_LAT = 34.726,
 MOAD_KNOWN_LON = -81.226,
 MOAD_STAND_LATS = 30.0, 60.0,
 MOAD_STAND_LONS = -98.0
 MOAD_DELTA_X = 30000.
 MOAD_DELTA_Y = 30000.

領域決定プログラムを実行する。スタックサイズを多めに必要するので注意。また日時を利用してログファイル名を決めているので、日本語環境では正常に実行できない。

 ulimit -s unlimited
 LANG=C ; export LANG
 $INSTALLROOT/etc/window_domain_rt.pl -w wrfsi -t $TEMPLATES/my-case -c

GPVデータの取得して解読

初期条件・境界条件のもととなる数値モデルデータを入手する。WRF は標準でいくつかのモデルデータに対応しているが、 当然ならが日本の気象庁のモデルデータには対応していない。米国のシミュレーションばかりではつまらないので、いずれ日本を対象にしようと思うと、(米国の)全球モデルの結果からはじめるのが よいであろう。そこで米国の数値モデルの担当機関である NCEP の全球モデル GFS の結果を使うことにする。

例えば 2006年2月9日00UTC 初期時刻の GFS データを 3時間間隔で 6時間目まで入手しよう。

 wget http://nomads.ncdc.noaa.gov/data/gfs-avn-hi/200602/20060209/gfs_3_20060209_0000_000.grb
 wget http://nomads.ncdc.noaa.gov/data/gfs-avn-hi/200602/20060209/gfs_3_20060209_0000_003.grb
 wget http://nomads.ncdc.noaa.gov/data/gfs-avn-hi/200602/20060209/gfs_3_20060209_0000_006.grb

データ形式は世界標準でよく用いられる grib 形式と呼ばれるものである。これを解読してモデルの変数に合うように対応づける。

まず設定ファイルを外側モデルに会うように編集する。$EXT_DATAROOT/static/grib_prep.nl の SRCPATH の2行目、GFS のデータが存在するディレクトリを指定する。例えば '/data/wrf/gfs'。保存したら解読プログラムを実行する。

 $INSTALLROOT/etc/grib_prep.pl -s 2006020900 -l 6 -t 3 GFS

終了すると $EXT_DATAROOT/extprd に

 GFS:2006-02-09_00
 GFS:2006-02-09_03
 GFS:2006-02-09_06

の3つのファイルが作成される。これで外側モデルのデータが準備できた。

初期条件・境界条件を作成

外側モデルのデータを内側モデルの格子に内挿して初期条件・境界条件とする。要するに、水平内挿と鉛直内挿を行う。

$TEMPLATES/my-case ディレクトリにある wrfsi.nl を再度編集する。

&interp_control
INIT_ROOT = 'GFS',
LBC_ROOT = 'GFS',

保存したら、変換プログラムを実行する。

 $INSTALLROOT/etc/wrfprep.pl -s 2006020900 -f 6

終了すると、$MOAD_DATAROOT/siprd ディレクトリに

 wrf_real_input_em.d01.2006-02-09_00:00:00
 wrf_real_input_em.d01.2006-02-09_03:00:00
 wrf_real_input_em.d01.2006-02-09_06:00:00

が作成される。これでモデル実行準備が整った。あとはモデル本体実行と同じ(格子サイズや予報時間、初期時刻を編集してから実行)。


感想

長所

短所