モデル本体編と前処理編に分けました。
米国で現業・研究両用のメソモデルとして開発されている WRF を使ってみた。インストールと、テストデータを使った予報実験、可視化 、そして米国の全球モデルデータから初期条件・境界条件を作成してのテストランをやってみた。
実行環境
環境変数 LD_LIBRARY_PATH=/opt/intel_fc_80/lib を設定しておく。
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 のホームページは 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
とするとデータを読んでくれる。
サンプルデータによる予報ができたところで、次は自分の好きな領域で、実際にリアルタイムデータから初期条件・境界条件を作成して実行してみよう。そのためには 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
初期条件・境界条件のもととなる数値モデルデータを入手する。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
が作成される。これでモデル実行準備が整った。あとはモデル本体実行と同じ(格子サイズや予報時間、初期時刻を編集してから実行)。
長所
短所