Comments
Description
Transcript
こちら
非静力学モデル JMA-NHM の使い方 沢田雅洋 2007 年 1 月 3 目次 第 1 章 はじめに 5 第 2 章 モデルの使用方法 1 全体の流れ・シェルの実行順序 . . . . . . . . . . . . . . . . . . . . 2 モデルのコンパイル . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 第 3 章 地形の作成 1 地形作成ツールのコンパイル・使い方 . . . . . . . . . . 2 SRTM から地形を作成するツールのコンパイル・使い方 3 地形の読み込み・描画・チェック . . . . . . . . . . . . . 4 地形・土地利用データの変換 optional . . . . . . . . . . . 5 SiB 用の土地利用データの作成 optional . . . . . . . . . . 6 平らな地形の作成 -理想化実験用- . . . . . . . . . . . . . 7 プログラム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 4 章 初期値・境界値の作成 1 初期値・境界値に必要なデータの準備 . . . . . . . . . . . . . . . 2 初期値・境界値の作り方−統一版 (mkinit) new . . . . . . . . . . . 3 MSM-GPV での初期値・境界値の作り方 やや new . . . . . . . . . 4 MANAL での初期値・境界値の作り方 やや new . . . . . . . . . . 5 JRA での初期値・境界値の作り方 . . . . . . . . . . . . . . . . . . 5.1 プログラム . . . . . . . . . . . . . . . . . . . . . . . . . . 6 中間ファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . 7 初期値・境界値の作成 . . . . . . . . . . . . . . . . . . . . . . . . 8 2 重 (セルフ) ネストの仕方・NHM の出力とのつなげ方 (self-nesting, or downscaling) new . . . . . . . . . . . . . . . . . . . . . . . . . 8.1 プログラム . . . . . . . . . . . . . . . . . . . . . . . . . . 9 雲物理量を境界に与えるには . . . . . . . . . . . . . . . . . . . . 10 理想化実験の初期値・境界値 . . . . . . . . . . . . . . . . . . . . 11 初期値・境界値を読みたい、絵を書きたい . . . . . . . . . . . . . . . . . . . . 13 13 18 19 20 22 24 25 . . . . . . . . 27 27 28 34 39 41 45 45 47 . . . . . 49 52 52 55 57 12 リスタート(再計算)のやり方 . . . . . . . . . . . . . . . . . . . . 58 第 5 章 モデルの実行 1 モデルの実行 . . . . . . . . . . . . . . . . . . . . . . 2 パラメータカード . . . . . . . . . . . . . . . . . . . . 3 実行条件(初期値、解像度、パラメータ)を変えたい 4 鉛直層の切り方 . . . . . . . . . . . . . . . . . . . . . . . . . 61 61 65 67 67 . . . . . . . . . . 69 69 71 73 77 79 82 85 89 89 94 第 7 章 そのほか 1 シェル入門(ではない) . . . . . . . . . . . . . . . . . . . . . . . . 2 バイナリファイルの種類と読み書き . . . . . . . . . . . . . . . . . . 3 netcdf データの読み書き . . . . . . . . . . . . . . . . . . . . . . . . 99 99 102 106 第 6 章 出力の変換と作図 1 データの変換の仕方 (nhm2grads) . . 2 プログラム (nhm2grads) . . . . . . . 3 データ変換 (nhm2nc) . . . . . . . . . 4 プログラム (nhm2nc) . . . . . . . . . 5 任意の鉛直断面への内挿 (nhm2ver) . 6 鉛直方向の内挿(z*→ p-level, z-level, 7 p 面、z 面直接内挿 . . . . . . . . . . 8 データの可視化 . . . . . . . . . . . . 8.1 vis5d . . . . . . . . . . . . . . 8.2 plotps 書き中. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pt-level) . . . . . . . . . . . . . . . . . . . . . . . . 第 8 章 物理過程 1 雲微物理過程 . . . . . . . . . . . . . . 2 積雲対流パラメタリゼーション(CP) 3 地表面・植生過程 . . . . . . . . . . . . 4 乱流混合過程 . . . . . . . . . . . . . . 5 放射過程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 9 章 JMANHM の使用例・今後の課題? 1 講座内での使用例 . . . . . . . . . . . . . . . . . . . . . . 2 今後の (個人的) 課題 . . . . . . . . . . . . . . . . . . . . 2.1 検証ツールの作成 (アメダス、衛星などとの比較) 2.2 モデル出力の調整 (検証用データの出力) . . . . . 2.3 モデルで使用するパラメータ・物理過程の最適化 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 . 111 . 114 . 115 . 117 . 118 . . . . . 119 . 119 . 119 . 120 . 121 . 121 5 第 1 章 はじめに 2009/11/20 加筆・修正 このマニュアル(?)は非静力モデルの使い方、及びモデルに関するメモを記述し たものです。ただし、場所によってオリジナルのものとは違う設定や使い方をして いるところがありますのでご注意を。 (ds3 用のマニュアルではないです! ! !)かつ、 一応自分用なので、説明不足なところがあります。jmanhm20091031.tgz が講座 でダウンロード (cvs) したもので最新。実際は日々更新されています。jmanhmrel-02-00 を基本とする。下記参照。jmanhm-rel-01-15 とオプションが違う部分 もあるので、古いバージョンを使っている方は要注意。 始めに大まかな流れを示すと、 1. 第 1 章:モデルセットアップ&テストラン 2. 第 2 章:地形の作成 3. 第 3 章:初期値・境界値の作成 4. 第 4 章:モデルの実行 5. 第 5 章:出力の変換&作図 6. 第 6 章:その他 7. 第 7 章:物理過程 という感じです。最低限必要と思われる作業は、 1. 第 1 章:モデルのコンパイル 2. 第 2 章:gtopo30 を使った地形作成 3. 第 3 章:初期値・境界値の作成 4. 第 4 章:モデルの実行 5. 第 5 章:grads 形式に変換 です。 2009/05/12 初期値の作成の仕方を、使用するデータに依らず統一するように しました。初期値・境界値の作成を参照。 pdf 版はこちら ※ 2007 年 6 月 22 日に jmanhm-rel-02-00 が公開されました。かなりのオプショ ンの追加がなされたようです。いずれ非静力の HP 上に情報がアップされますが、 知っている範囲について簡単に紹介。 • 乱流:Improved Mellor-Yamada Lavel3 の追加 • 放射:部分凝結スキームにより雲量 (雲水・雲氷量) を求め直接放射計算 • 雲物理:4-ice バルクモデル (雲氷、雪、あられ、ひょう) の実装予定 というところでしょうか。詳しくはパラメータカード参照 。英語版 (english version, not full): parameter card EN . ■ 古いメモ 以下の記述は、現在のツールの内容と一致しない部分があります。 一応、jmanhm-rel-01-15 を基本とする。初期値・境界値の作成において、こ こでは JRA などの全球データから作成することを念頭においています。DS3 では GPV-RSM(日本域) なので、もちろん異なるプログラム・シェルを使用します。な ので、RSM から初期値・境界値を作成する際は DS3 に関する記述を参考にして下 さい。もちろん、どのデータを使おうと手順はほとんど一緒です。 6 7 第 2 章 モデルの使用方法 1 全体の流れ・シェルの実行順序 2009/11/20 加筆・修正 1. モデルセットアップ&テストラン • tar zxvf jmanhm-rel-01-15.tgz • make libfakempi.a • sh configure -c config/pc/config.fujitsu Makefile の作成 • make fcst nfx モデル本体のコンパイル • make step1 1 テストラン用の地形作成ツール • sh set nhmdir.sh テストランのシェルのセットアップ • sh orbel32.sh テストランの地形作成 • sh glmwv nfx.sh 線形山岳波のテストラン • sh orbel snow.sh テストランの地形作成 • sh gsnow nfx.sh 地形性降水のテストラン 2. 地形の作成 • step3.sh (step2.sh は旧版) 3. 初期値・境界値の作成 • mkinit/script/sample jra.sh (JRA データはあるものとする) 4. モデルの実行 • fcst.sh (4cast 72dx24.sh: ds3 のみ) 2. モデルのコンパイル 5. 出力の変換&作図 • sh n2gr.sh 全体の流れと主要なシェルを記述した。ディレクトリの移動などは書いていな いので注意。シェル、ディレクトリなどの名前は大体はオリジナルに沿っている。 ただし地形作成以降の手順については講座のツールに基づく。 Following processes are minimum needs for using JMANHM. 1. model setup • make libfakempi.a • sh configure -c config/pc/config.ifort generate Makefile • make fcst nfx compile JMANHM 2. make orography: step3.sh 3. make initial & boundary data • mkinit/script/sample jra.sh generate initial & boundary data for NHM 4. model run: fcst sample.sh 5. convert nhm-output to grads format: n2gr new.sh 2 モデルのコンパイル まずモデルの準備・コンパイル・テストラン(線形山岳波・地形性降水)まで。 1つのシェル(/mnt/disk1/Tools/script/nhm setup.sh)とモデル本体(jmanhm20090610.tgz) を適当なディレクトリ(例えば tmp)にコピーして、 $ mkdir ./tmp/ $ cp ./nhm_setup.sh ./jmanhm20090610.tgz ./tmp/ $ sh nhm_setup.sh で出来上がり。細かい手順はシェルの中参照。講座内ならうちの HP から”JMANHM の並列実行の仕方”で検索。やや丁寧な並列実行の手順があります。 コンパイルの前の”configure”実行時の注意点は、 ■ mpi の有無 mpi を使用するなら configure に使用するファイル(Module/Mk/config/pc/config.fujitsu など)を適切に変更。 8 第 2. モデルの使用方法 FC=frt ←モデルに使用するコンパイラ LD=frt ←コンパイルした.o たちをまとめるリンカ(やや表現が正しくない) INC_MPI=${NHMDIR}/Module/Src/fakempi LIB_MPI="-L${NHMDIR}/Module/Bin -lfakempi" を以下のように変更。もちろん mpi を使用しないならそのままで OK。 FC=mpif90 LD=mpif90 INC_MPI=/usr/local/include ← mpi をインストールしたパス LIB_MPI="-L${NHMDIR}/Module/Bin -L/usr/local/lib" ※ LIB_MPI="-L${NHMDIR}/Module/Bin -L/usr/local/lib -Vaxlib"← ifc 用 mpi 関連でエラーが出た場合 $ulimit -s 40960 (適切なメモリサイズ) $ulimit -s unlimited など試す。ジョブが残っていたら”kill”で処理。 あるいは、$ export P4 GLOBMEMSIZE=134217728 という環境変数を設定する。メモリサイズは適切に。 ■ 使用するデータフォーマット 現在、並列版 NHM では Nusdas 形式が基本だが、以前のフォーマットである mri 形式も使用できる。うちの講座では mri 形式が基本。なので、configure の前に、 # NuSDaS (pnusdas | system | fnusdas | other) NUSDAS=pnusdas を以下のように変更。 # NuSDaS (pnusdas | system | fnusdas | other) NUSDAS=fnusdas configure に使用する設定ファイルは Nhm/Module/Mk/config/ に様々なものが用意されている。適切なものを選ぶこと、あるいは修正すること。 基本的に ifort, ifc, frt, pgf90, sxf90 に対応。 参考 HP 並列版 NHM:http://pfi.kishou.go.jp/nhm frm/nhm inf.htm 逐次版 NHM:http://www.mri-jma.go.jp/Project/mrinpd/INDEXJ.htm ■ ifort でのコンパイル 基本的に、$ sh configure -c config/pc/config.ifort 9 2. モデルのコンパイル で Makefile の作成は OK。これでコンパイルもできるはず。テストランも OK。た だし、ネストなど外部から初期値を与えて計算をする場合 (jra,manal など)、計算 が落ちることがあるかも(segmentation fault になる)。その場合、コンパイルオ プションを付けるか (-heap-arrays)、以下のようにプログラムの修正が必要。 例えば、cadvuvw.f90 など。 real(r_size) :: vvl(nx,ny,nz), wwl(nx,ny,nz) ↓これを以下のように動的に配列を取ること。 real(r_size), allocatable :: vvl(:,:,:), wwl(:,:,:) ... allocate( vvl(nx,ny,nz), wwl(nx,ny,nz) ) subroutine の中で”intent”属性のものは勿論そのままで良い(real(4),intent(in) :: data(nx,ny) など)。変数が多次元配列で動的でない場合に引っかかることがある。 何故かは不明。frt(富士通コンパイラ)ならどちらでも問題なし。ただし、ifort の方が 2∼3 割早い&フリーのコンパイラ。 ※ ifort で実行したいけど結局どうするの? 以下のディレクトリからファイルをコピーしてコンパイル&実行してみて下さい。 /mnt/sky1/sawada/Nhm-v15/Module/Src/JMANHM/ jmanhm-rel-02-00 を使いたい場合は以下から。 /mnt/sky1/sawada/Nhm-v2-00/Module/Src/JMANHM/ もちろん、使用する際は自己責任でお願いします。v15 の方はいろいろいじってあ るかもしれないのでご注意ください。 ■ 実行時のメモリサイズを小さくしたいけど… 格子サイズを小さくして下さい。自分で何とかして下さい。というのが正論です。 正しいか分かりませんが、”vardef.f90”の中の integer(4), parameter :: r_size=kind(0.0d0) ←倍精度 ↓ integer(4), parameter :: r_size=kind(0.0e0) ←単精度 として下さい。使用メモリは半分くらいになるはずです。 結果に影響するかどうかは自分で判断。 ■ sx9(サイバーサイエンスセンター) でのコンパイル ソースファイルは jmanhm-rel-02-00.tgz を使用して下さい。僕のディレクトリ からコピーしたものを super で使用すると実行時エラーがでます。基本的に、WS 10 第 2. モデルの使用方法 上での作業手順は同じ。 $ sh configure -c config/mri/config.sx9 (/mnt/disk1/Nhm-v2-00/Module/Mk/config/mri/config.sx9) を使用して下さい。 mpi を使って、並列実行するときは config.sx9 mpi を使用。$ sh configure -c config/mri/config.sx9 mpi (/mnt/disk1/Nhm-v2-00/Module/Mk/config/mri/config.sx9 mpi) を使用して下さい。”config.sx9”は”config/mri/config.sx6 cross auto”と基本的にほ ぼ同じ。なので、 $ sh configure -c config/mri/config.sx6 cross auto でも Makefile の作成は OK のはず。上手くいかなかったら、この後、”Nhm/Module/Src/fakempi/mpif.h” を”Nhm/Module/Src/JMANHM/”の中にコピーする。(libfakempi.a を使う場合を 前提としている。mpi を使用するときはダメ) これをしないと、リンクするときに mpicomm.o に関連するエラーが出るかも知れません。ファイルをコピーしたら、 もう一度 make libfakempi.a, make fcst nfx を行って下さい。 以下、”config.sx9”の中身。 # compiler FC=sxf90 ← sxf90、mpi 使用時は sxmpif90 FFLAGS= CPP=cpp CPPFLAGS="-P -C" CC=sxc++ ← sxc++、mpi 使用時は sxmpicc CFLAGS= LD=sxf90 ← sxf90、mpi 使用時は sxmpif90 LDFLAGS= AR=sxar ARFLAGS=rv # optimization option OPT_C="-copp hmulti" OPT_F="-dW -Cvopt -Pauto -Wf,-init heap=zero stack=zero,-pvctl fullmsg,-pvctl vwork=s ちょっと変更 OPT_C_PARA=${OPT_C} OPT_F_PARA=${OPT_F} OPT_C_PARA_FAST=${OPT_C} OPT_F_PARA_FAST=${OPT_F} 11 2. モデルのコンパイル OPT_LD= OPT_LD_PARA="-dW -Pauto" # MPI INC_MPI=/SX/usr/include LIB_MPI=${LIB_MPI:-"-L${NHMDIR}/Module/Bin -lfakempi"} ← fakempi 用 に変更 ■ 実行時の注意点 出力されるバイナリの書式を、バイト単位にすること。基本はワード単位になっ ているので。 F RECLUNIT=BYTE; export F RECLUNIT ■ 実行時のエラー ログファイルに必ずエラーメッセージが出ます。それを参考に対処。対処方法は、 エラーの出た箇所のみを最適化の仕方 (ベクトル化、並列化、ループの入れ替えな ど) を変えるなど。以下、コンパイル指示行の例 !cdir vector/novector ←ループの自動ベクトル化の対象とする/しない !cdir concur/noconcur ←ループの自動並列化の対象とする/しない スパコンについては こちら。 おまけとして、配列数 (x,y の格子数) は奇数の方がいいかもしれません。経験上。 ”Nhm/Module/Mk”の中にあるファイル configure : Makefile を作るためのシェルスクリプトと思ってください。ディレク トリ”config/”の中に configure 用のパラメータファイルがあります。 Makefile : モデルをコンパイルする際に必要なリンク、ソースファイルの位置な どの関係付けを記述しているファイル。 include.mk: 使用するコンパイラ、Makefile の拡張子 (.f90, .f とか) の関係付け。 fcst nfx.mk : Makefile で使用される。むしろこれの方が Makefile の本体と思っ た方が正解かな?コンパイルオプション、ライブラリのリンクはここ。 libfakempi.a: mpi を使わないときに使用。mpi のごまかし。 step1 1.mk : テストラン用の地形作成。実際の地形作成には使えない。 fcst 1.mk : 逐次版 NHM。もちろんプログラムは更新されていません。 12 13 第 3 章 地形の作成 2009/11/20 加筆・修正 1 地形作成ツールのコンパイル・使い方 地形作成のためのシェルと設定ファイル、ソースファイルは以下にあります。 /mnt/disk1/Tools/topo_make/step3_lmn72dx6_sample.sh /mnt/disk1/Tools/topo_make/src/ まず、コンパイルは、 $ cp -r /mnt/disk1/Tools/topo\_make/ ./ $ cd ./topo\_make/src/ $ make でコンパイルは OK。本研究室では ifort を使用 (Makefile 参照)。オプションなど (-assume byterecl) に注意すること。作成される実行ファイルは”step2, step3, makeps”。 他のコンパイラ (f90, frt, gfortran など) を使用する場合は、オプションや実行時の パラメータに注意。step2(旧), step3(新) は地形作成用、makeps は地形描画用。 使用方法は、 $ sh step3 lmn72dx6 sample.sh 以下、step3 を使用した場合の namelist の設定例(step3 lmn72dx6 sample.sh)。 -----------------------------------------------------------------------&namdir filedir_topo=’/mnt/tree2000/land-data/gtopo30/’ ← gtopo30 のディレク トリ filedir_sl=’/mnt/tree2000/land-data/glcc/’ ← glcc のディレクトリ 1. 地形作成ツールのコンパイル・使い方 &end &namdom NX = 72, NY = 72, ←格子数 (number of grid) NPROJC=’LMN ’, ←メルカトル、ランベルト、ポーラーステレオなど (map projection) DX = 5000.0, DY = 5000.0, ←格子サイズ (length of grid [unit:m]) SLAT = 30.00, SLON = 140.00, ←基準となる緯度経度 (standard lat/lon) FLATC = 38.80, FLONC = 139.97 ←作成する地形の緯度経度の中心 (center of map) &end -----------------------------------------------------------------------PSN: 北半球ポーラーステレオ (polar stereo projection in north hemisphere) PSS: 南半球ポーラーステレオ (polar stereo projection in south hemisphere) MER: メルカトル図法 (mercator projection) LMN: 北半球ランベルト (lambert projection in north hemisphere) LMS: 南半球ランベルト (lambert projection in south hemisphere) LL : 緯度経度 step3.dx30.sh (step3.dx10.sh) などは地形作成の後、作成した地形ファイルを読 み込んで描画します。描画には”plotps”(描画ライブラリ、非静力に付属) を使用し ています。出力ファイル名は、この場合”fort.20”をリネームして”topo.ps”として いる。作成した地形が期待通りかどうかすぐにチェックが可能。わざわざ grads を 開く必要がない。色のセンスはあまり良くない(上手く出来ん . . .)。 ■ grads での表示の仕方 地形ファイル (org) や地表面パラメータファイル (ptgrd) を grads で表示させるに は、ctl に設定 (fileheader 20) を加える必要があります。地形ファイルを読む場合、 下記に例。 ------------------------------------------------------------------dset ^org_91dx5 undef 9.999e+20 options big_endian fileheader 20 xdef 91 linear 0 1 ydef 91 linear 0 1 zdef 1 levels 1013 tdef 1 linear 00z01jan2006 1hr vars 6 14 第 3. 地形の作成 Surface height [m] 37.00 36.00 35.00 34.00 1450 33.00 1250 128.00 1050 32.00 129.00 130.00 131.00 132.00 31.00 133.00 134.00 135.00 136.00 137.00 138.00 750 30.00 450 29.00 250 50 28.00 図 3.1: plotps を用いて作成した地形。 zs 0 99 ** zs sl 0 99 ** sl fcor3 0 99 ** fcor3 roughl 0 99 ** roughl clat 0 99 ** latitude clon 0 99 ** longitude endvars ------------------------------------------------------------------fileheader 20 はデータの最初 20byte をスキップするという意味。緯度経度は適 当に書いています。 地表面パラメータファイルを読む場合。 ------------------------------------------------------------------dset ^ptgrd_91dx5_z60 undef 9.999e+20 options big_endian fileheader 24 15 1. 地形作成ツールのコンパイル・使い方 xdef 91 linear 0 1 ydef 91 linear 0 1 zdef 1 levels 1013 tdef 1 linear 00z01jan2006 1hr vars 4 wet 0 99 ** wet fktg 0 99 ** fktg roctg 0 99 ** roctg albed 0 99 ** albed endvars ------------------------------------------------------------------fileheader 24 はデータの最初 24byte をスキップするという意味。 ■ 地形作成に関する細かい設定 (advance setting) gtopo30 の地形 (約 1km 格子) を粗い格子でそのまま使うと、現実とは異なる地形 になることがあります (表現が変ですが)。そこで、たいていの場合は平均化して 使っています。それを決めているのは、step2-5.f90 の中の imethod という変数 です。 imethod = 1: 地形のスムージング (周囲 0.5 格子の範囲)。 imethod = 2: 内挿した値を直接使用。 imethod = 0(1 と 2 以外): スムージングするか内挿値を使うか適当に決める。 ※追記 (2007.04.26) 近年、SRTM(http://www2.jpl.nasa.gov/srtm/) という標高データが公開されて いる。これは”3 arc-seconds, which is 1/1200th of a degree of latitude and longitude, or about 90 meters.”ということで約 90m 間隔のデータで、gtopo30 の 10 分の 1 の 解像度。日本国内なら国土地理院の数値地図(50m 格子、講座で保有)の方が細 かいが、全世界となるとこちらの方が有利。まぁ、そんな解像度、しばらく必要 ないかもしれませんが。 ※追記 (2007.12.04) 上記の SRTM を使って地形を作るツールを準備しました。次のセクションを参照で。 ■ 旧式バージョンの一応メモ 新しく使い始めたユーザは、とくに必要ないです。旧式バージョンは、 /mnt/raid1200/land-data/tool_ver2/step2.dx10.sh /mnt/raid1200/land-data/tool_ver2/domain.card.LMN102.dx10 /mnt/raid1200/land-data/tool_ver2/src/ 16 第 3. 地形の作成 ※追記(2007.04.26) ifort でも問題なく動作するようでした。ただし、オプションなど (-assume byterecl) に注意すること。また、これらをそのままコピーした場合、コンパイルする際は 一度”make clean”を行い、以前生成したオブジェクトファイル (*.o) を消しましょ う。大抵引っかかります。 あと、エンディアンも間違えないように (export F UFMTENDIAN=big)。 $ sh step2.dx10.sh 使い方は同じですが step2 の場合、”domain.card.LMN102.dx10”で”filedir topo”の 文字数を数える必要あり。step3 の場合は”&namchara”という項目を無い (自動)。 以下、step2 を使用した場合の namelist の設定例(step2.dx10.sh)。 \&namchara ←"step3"を使用する場合、この項目は必要ない。\\ n\_ch\_filedir\_topo=32 ← filedir\_topo の文字数\\ n\_ch\_filedir\_sl=29 ← filedir\_sl の文字数\\ \&end\\ \&namdir\\ filedir\_topo=’/mnt/raid1200/land-data/gtopo30/’ ← gtopo30 のディレ クトリ\\ filedir\_sl=’/mnt/raid1200/land-data/glcc/’ ← glcc のディレクト リ\\ \&end\\ \&namdom\\ NX = 102, NY = 102, ←格子数 (number of grid)\\ NPROJC=’LMN ’, ←緯度経度、ランベルト、ポーラーステレオなど\\ DX = 10000.0, DY = 10000.0, ←格子サイズ (length of grid [unit:m])\\ SLAT = 32.50, SLON = 140.0, ←基準となる緯度経度 (standard lat/lon)\\ FLATC = 32.5, FLONC = 130.5, ←作成する地形の緯度経度の中心 (center of map)\\ XI = 61.0, XJ = 165.0, ←多分使わない (no need)\\ XLAT = 30.0, XLON = 140.0 ←多分使わない (no need)\\ \&end 17 2. SRTM から地形を作成するツールのコンパイル・使 い方 2 SRTM から地形を作成するツールのコンパイル・使 い方 SRTM = ”Shuttle Radar Topography Mission” だそうです。 1km 以下 (100m まで OK のはず) の地形を作成したい時に使用して下さい。 使い方は”topo make/step2”などとほぼ同様。 最低限必要なツールは、 /mnt/disk1/Tools/SRTM/step4.dx1.sh ←実行シェル /mnt/disk1/Tools/SRTM/src/ ←ソースプログラム データの整備に必要なものは、 /mnt/disk1/Tools/SRTM/wget_strm.sh ← SRTM データをダウンロード /mnt/disk1/Tools/SRTM/melt.sh ← ZIP を解凍 /mnt/disk1/Tools/SRTM/make_sea_link.sh ←海面のみの場合はリンクを張る です。北緯 34-46 度, 東経 132-144 度くらいまでのデータは準備してある。まず、 コンパイルは、 $ cp -r /mnt/disk1/Tools/SRTM/ ./ $ cd ./SRTM/src/ $ make でコンパイルは OK。作成される実行ファイルは”step4, makeps”。以下、step4 を 使用した場合の namelist の設定例(step4.dx1.sh)。 (シェルの中で直接パラメータを設定するので、domaincard は必要ない) --------------------------------------------------------export bindir="../bin" ${bindir}/step4 <<EOF &namdir filedir_topo=’/mnt/disk1/Tools/SRTM/data/’ &end &namdom NX =102, NY =102, NPROJC=’LMN ’, DX = 1000.0, DY = 1000.0, SLAT = 32.5, SLON = 140.0, 18 FLATC = 38.16, FLONC = 140.72 &end EOF --------------------------------------------------------gtopo30 を使って 1km の地形を作った場合と SRTM を使って 1km の地形を作った 場合ではやや地形が異なります。どちらが正しいかは各自でご判断を。 gtopo30 SRTM (m) 図 3.2: SRTM(左図) と gtopo30(右図) による地形。 3 地形の読み込み・描画・チェック さて、作った地形が正しいかどうかチェックしたい場合はどうするか?当たり前 ですが、作った地形データを読んで確かめればいいです。あるいは、grads で表示 させることも可能です。形作成ツールのコンパイル・使い方を参照。地形や初期 値・境界値のフォーマットは”Nhm/Doc/Jp/fileformat/inputfile format.html” を 見ましょう。あるいは以下で確認。 http://wind.geophys.tohoku.ac.jp/ sawada/Nhm manual/inputfile format.html#mfhm 地形ファイルは標準的な grads 形式ではありません。ご注意を。 おまけに org(地形) + ptgrd(土地利用, 出力はしていない) を読むツールは /mnt/disk1/Tools/topo edit/script/read.sh /mnt/disk1/Tools/topo edit/src/read topo2.f90 地形を読んで grads 形式のファイルを出力。ctl は自分で作る。ちなみに”read.sh” はファイルをリンクするだけで良い。格子数はプログラムで地形ファイル(org) から読み込む。 入力ファイルと装置番号。 19 4. 地形・土地利用データの変換 OPTIONAL fort.25: ptgrd fort.29: org 出力ファイルは以下の通り。 zs_check.grd: zs, sl, lat, lon のみ grads 形式で出力。 そのほかは必要に応じて出力すること。 check.ctl: zs, sl, lat, lon のみの grads 用 ctl ファイル。 ctl ファイルは作成されるが変数に応じて編集すること。緯度経度は適当で(どうせ 座標系が緯度経度に合わないので)。”gs/topo.gs”で標高は一応描けます。以下、例。 図 3.3: 作成した地形。 4 地形・土地利用データの変換 optional この作業は詳細な土地利用を使用したいときのみ必要です!! かつ、初期値・境界値 (org, ptgrd) を作成してから実行すること!! 初期値・境界値の作成をすると、地形ファイルも修正される(境界付近でスムー ジング)。これを読み込んで、土地利用データを利用する場合に以下のシェル・プ 20 ログラムを使用。 /mnt/disk1/Tools/topo edit/script/topo edit.sh /mnt/disk1/Tools/topo edit/src/topo edit.f90 これは”初期値・境界値の作成”を行って後で行うこと。 入力ファイルは org, ptgrd の 2 つ、それぞれ装置番号 29, 25 にリンクすること。 fort.25: ptgrd (土地利用データ:蒸発効率、熱拡散係数、地表面熱容量、アル ベド、地表面識別、都市熱、熱粗度長、1 層目の熱拡散係数:io_flag=1 のみ含む)。 fort.29: org (地形データ:標高、粗度、緯度経度など)。 tohoku_veg.grd: 国土地理院で配布されている土地利用データ (3 次メッシュ∼ 100m) を 1byte の grads 形式に変換したもの。 出力されるファイルは、 fort.35: ptgrd_new (ptgrd を修正したもの) fort.39: org_new (org を修正したもの) で、上記のようにリンクしている。必要に応じて適当に名前を変更。 ○ 使用される値について 修正される変数は粗度 (roughl)、蒸発効率 (wet)、熱拡散係数 (fktg)、地表面熱 容量 (roctg)、アルベド (albed) の 5 つです。これらの値は topo edit.f90 の中の subroutine (veg interp) で決められます。国土地理院の土地利用分布は 16 種類に 分かれているが、実質使用されているのは 11 種類 (海も含む)。それぞれの土壌に 応じて適当に値を決めています (参考にしたのは近藤純正先生の教科書、地表面に 近い大気&水環境の気象学、及び講座の修論など)。もし、自分好みの地形・土地 利用ファイルを作成したいなら”veg interp”の数字を変更すればいいだけです。見 ればすぐ分かるはず。 ○ 使用の際の注意事項 ・日本域限定 (境くんがデータ作成) ・元データは 100m に対し、作成するデータが 1000m の場合、適切な補間 (平均) が必 要です。理由は考えると分かりますよね、きっと。現在は 1500m 格子用に代表的な 地形の値を使用しています。これを変更するにはソースプログラム中の”dx=1500” を”dx=1000”などと変更して下さい。 #!/bin/sh ### data directory (初期値・境界値データのあるディレクトリ) 21 5. SIB 用の土地利用データの作成 OPTIONAL datadir=/mnt/sky1/sawada/initdata_102dx1.5_00UTC_20061204 export F_UFMTENDIAN=big ←バイナリの形式、要注意。 ### compile & run (プログラムのコンパイル、ifort の場合"-assume byterecl" は必要) cd ./src/ if [ ! -f topo_edit ]; then ifort -check -traceback -assume byterecl -o topo_edit topo_edit.f90 fi ##### links if [ -f fort.25 ]; then rm fort.25 fort.29 ; fi #### original topo & ptgrd file ln -s $datadir/org.20040829 fort.29 ←地形、粗度データ ln -s $datadir/ptgrd.20040829 fort.25 ←土地利用 (アルベド、wetness な ど) データ ## land-use data (vegetation data) (国土地理院の土地利用データ) ln -s /mnt/raid1200/topo_data/iveg_all.grd fort.60 ./topo_edit ←変換ツールの実行 #### rename ## fort.35: new ptgrd file (land-use) ## fort.39: new topography file mv fort.35 ptgrd_new ←モデルに使用する新しい土地利用データ mv fort.39 org_new ←モデルに使用する新しい地形データ ## clean rm -f topo_edit fort.25 fort.29 fort.60 ←不要なファイルの消去 5 SiB 用の土地利用データの作成 optional この作業は SiB を使用したいときのみ必要です!! はじめに、”/Nhm/Module/Src/PREPOST/nhmcst sib.f90”の 284 行目を以下のよ 22 うに修正。まあ、好みの問題ですが。 !filein(1:19) = ’gtopo/land_sea_1km_’ filein(1:19) = ’ls1km/land_sea_1km_’ で、次はツールのコンパイル。 $ cd Nhm/Module/Mk $ make nhmcst_sib_n01 ← SiB 用の入力ファイルを作成するツール&地形作成 正常に nhmcst sib n01 ができたら、以下のようなスクリプトを実行。 ----- 以下、script ----------------------------------------------------------### bindir=Nhm/Module/Bin ### make link ln -s /mnt/tree2000/land-data/gtopo30/ gtopo ln -s /mnt/tree2000/land-data/glcc/ ls1km ←ファイルの修正が必要 ln -s /mnt/tree2000/land-data/sib/gsib2_0ll.img glcc ← SiB 用のデー タ #--- make topography data for NHM inpt ---------export F_UFMTENDIAN=big ${bindir}/nhmcst_sib_n01 <<EOF &namdom NX = 102, NY = 102 NPROJC=’LMN ’, DX = 5000.0, DY = 5000.0, SLAT = 32.50, SLON = 140.00, FLATC = 38.16, FLONC = 140.72, &end &namgrmax grmax = 0.15, mode_zs_smooth = ’2.0 average’ &end &namgrdi dxi=5000.0, dx1i=5000.0, dx2i=5000.0, ix1i=10, ix2i=20, 23 6. 平らな地形の作成 -理想化実験用dyi=5000.0, dy1i=5000.0, dy2i=5000.0, iy1i=10, iy2i=20 &end EOF ----- ここまで ----------------------------------------------------------これを実行すると、GLCC SiB というファイルが作成される。必要なファイルは これで出来上がり。 以下、パラメータカードの節をそのまま。 mswsys(1) が地表面過程のパラメータ。一の位が”9”の時、SiB を使用。 SiB を使用するには以下の 2 つのファイルが必要。 fort.32: SiB に必要なデータ (GLCC SiB)、imt glcc sib(default:32) fort.XX: SiB に必要なデータ (gsm.veg.v12.d)、imt gsm9603 veg=XX などを設定する必要があります。gsm.veg.v12.d は GSM-MJ98 で使用する SiB 用 の入力ファイル(小玉くんより)。 NHM の実行シェルの中に以下のようにリンクを追加、 ln -s XXXX/GLCC-SiB fort.32 ln -s /mnt/tree2000/land-data/sib/gsm.veg.v12.d fort.42 及びパラメータカード (namelist) を設定すること。 &NAMFIL IMT_MRI=62,ISTR_MRI=180,IMT_MRI_SIB=72,ISTR_MRI_SIB=180, .... IMT_GLCC_SIB=32, ←追加 IMT_GSM9603_VEG=42 ←追加 &END 6 平らな地形の作成 -理想化実験用- 理想的な環境場で実験を行いたいとき、例えば海上とか、地形なしとか。その ような時のための地形作成ツール。基本的に、jmanhm に付属しているテストケー ス (線形山岳波、地形性降水) で使用される地形ファイルと同じ。 必要なファイルは、 /mnt/disk1/Tools/topo make/src/make topo.f90 /mnt/disk1/Tools/topo make/script/topo ideal.sh の 2 つ。以下にシェルの一部を示す。 24 ----- 以下、script ----------------------------------------------------------cd $srcdir ifort -assume byterecl -convert big_endian -o make_topo make_topo.f90 ←コンパイル if [ ! -f make_topo ]; then echo ’compile failed !!!’ exit fi cp make_topo $bindir/ cd $topodir #--- make topography data for NHM inpt ---------${bindir}/make_topo <<EOF &NAMGRD nx=102,ny=102, ←計算領域 (地形) の格子数 dx=10000.0,dy=10000.0, ←格子サイズ slon=140.0,slat=15.0, ←計算領域 (地形) の中心位置 itype=0 ← f 平面 (0) か b 平面 (1) の選択 &END EOF ----- ここまで ----------------------------------------------------------自分で理想化した地形を作成したいときに参考にして下さい。地形ファイルのフォー マットは非常に簡単であることが分かるはずです。プログラムは 100 行も無いです。 7 プログラム 地形作成に使うプログラム。 step2-5.f90 : 本体、データ (gtopo30, glcc) の読み込み interph2.f90: gtopo30 の内挿計算 latlon.f : 格子での緯度経度の計算 latlon2.f : 格子での緯度経度の計算(半格子ずれ) 地形データの読み込みと PS ファイル作成に使うプログラム。 read topo make ps.f90 : 地形データ(topo or org みたいな名前)の読み込み 25 7. プログラム plotpswk.f : postscript を fortran で作成するためのライブラリ。気象研究所技術 報告 第 44 号参照 このプログラムのみ置いているディレクトリが違います(srcplt)。 26 27 第 4 章 初期値・境界値の作成 NHM で nesting simulation(downscaling simulation)を行うためには、初期値 と境界値が必要。いろいろバージョンがあるので(ganal, ranal, manal, ncep, era, fnl, gpv)、何を使用しているか把握しておくこと。 初期値作成 (mkinit) が最新。今後はこちらを主にメンテナンスします。(2009/05/07) ———————————————————— To run nesting (downscaling) simulation using NHM, initial and boundary data are required. We can make initial and boundary data from various kind of data (ganal, ranal, manal, ncep, era, jra, fnl, gpv), and then we can perform nesting run with these data. Please see here Of course, we can use output of nhm as an initial and boundary data. This simulation is called self-nesting. 1 初期値・境界値に必要なデータの準備 以下の 3 種類のデータを揃える。 • 3 次元の大気データ(MSM/RSM/GSM-GPV などの予報値, MANAL,GANAL などの客観解析、JRA,ERA,NCEP など再解析) • sst データ(OISST、MSST、MGDSST) • 作成した地形データ ■ 大気の 3 次元データ GPV データは、筑波大のサーバ(http://gpvjma.ccs.hpcc.jp/ gpvjma/archive.html) あるいは、京都大のサーバ(http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original) から MSM/RSM/GSM の予報値をダウンロードできる。 RSM-GPV は(確か)Nusdus 形式のためそのままでは使えない。ここでは Nusdas → netcdf 形式→ grads 形式 2. 初期値・境界値の作り方−統一版 (MKINIT) NEW と変換して中間ファイルにつなげる。 近年の MSM/GSM は grib2 形式なので wgrib2 が必要。 JRA, ERA, NCEP の再解析データは講座内にアーカイブされている。 MANAL もある程度アーカイブされている。 ■ SST データ OISST は http://podaac.jpl.nasa.gov/products/product119.html からダウンロー ド可。 講座内なら /mnt/raid2000/global data/oisst/ にアーカイブされている。 ちなみに ds3 では木∼土以降はその前の週の水曜日の日付」のデータをダウンロー ドしている。 MSST は http://www.ocean.caos.tohoku.ac.jp/%7Emerge/sstbinary/actvalbm.cgi MSST に関しては「2 日前」のデータをダウンロードするようにしています。JMASST は http://goos.kishou.go.jp/rrtdb/database.html ただし、ユーザ登録が必要。 ■ 地形データ (3 章の) 地形の作成を参照。地形ファイルは MSM-GPV や JRA などのデータに使 用された地形と滑らかにつながる様、境界付近で処理します。 ■ ダウンロード用のシェル MSM-GPV をダウンロードするスクリプトのサンプル。 ”/mnt/disk1/Tools/dl GPV/script/download gpv msm.sh” 基本的にはコマンド”wget”をループで回しているだけ。 ds3 用のスクリプト。 sh dl GPV/wget gpv past.sh 00UTC 20061012 20061011 10 12 10 11 20061011 20061011 とすれば OK. 2 初期値・境界値の作り方−統一版 (mkinit) new ■ 概要 (2009/05/07) NHM 用の初期値・境界値ファイルを作成するツール。 ○ 以前の初期値作成から、手順を簡略化。 旧手順:MSM (MANAL/JRA/ERA) →中間ファイル→初期値 (uvptq ファイル) 新手順:MSM (MANAL/JRA/ERA) →初期値 (uvptq ファイル) と、中間ファイルの作成を省略。 ○ これ 1 つでいくつかのデータ (MANAL, MSM, JRA, ERA) を変換可能。 28 第 4. 初期値・境界値の作成 かつ、namelist(fin type:実行時に与えるパラメータ) によって、使用する大気デー タを MANAL, MSM, JRA, ERA-interim の 4 つから選択できる。ツールを使い分 ける必要がない。 ■ ツールを動かすのに必要なファイル ・地形ファイル (topo make 参照) (fort.51) ・大気の 3 次元データファイル (MANAL, MSM-GPV, JRA, ERA) (プログラムの 中で指定されている) ・SST ファイル (oisst, msst, jmasst) (fort.200 以降) の 3 つ。MANAL は有料 (講座内に一部アーカイブ)。MSM は一部アーカイブ、JRA は一応フリー (講座内なら 1979 年から最近 3 日前くらいまでアーカイブ)、ERAinterim は一応フリー (講座内なら 1989 年から 2007/12/31 までアーカイブ)。 各データに対する地形ファイルも必要(実質、役に立っているかやや不明)、これ は用意済。 ■ 必要なツール ”/mnt/disk1/Tools/mkinit/” 下にソースプログラム、シェル一式がある。stream, breeze からのみアクセス可。 以下、各ディレクトリについて。 ctl/ script/ src/ topo/ : : : : MSM-GPV 用の ctl ファイル (grads で可視化するのに使用) データ変換を実行するシェル データ変換に使用するプログラム MANAL, MSM, JRA, ERA の地形ファイルと ctl ファイル ■ 出力されるファイル 1. 初期値 (+境界値) ファイル (fort.23) (uvptq:風、気温、水蒸気 etc) 2. 地表面パラメータファイル (fort.25) (ptgrd:アルベド, wetness, 熱容量 etc) 3. 地形ファイル (fort.52) (org:標高、海陸、緯度経度、粗度) それぞれのフォーマットの詳細は http://wind.geophys.tohoku.ac.jp/ sawada/Nhm manual/inputfile form から。 ここではそれぞれ、 uvptq:mtuv の 1000 位の値が”2” のフォーマットを使用。 ptgrd:第 1 レコードのみ。 org:第 2 レコードまで。 その他、いくつか確認用にファイルや一時的なファイルが出力される。 29 2. 初期値・境界値の作り方−統一版 (MKINIT) NEW ■ 手順 以下の手順の中で、該当する部分を実行するだけで OK. 講座内なら使用するデータが揃っているので、シェルのパス (ディレクトリの位置) やパラメータ (予報時間や解像度) を変更するだけで初期値を作成できるはず。 ○ MANAL を使用する場合 1. grib を grads 形式に変換 :sh grib2grads manal.sh 2. 初期値・境界値の作成 :sh sample manal.sh ○ MSM-GPV を使用する場合 (再現実験用∼hindcast) 1. msm から初期値の取り出し:sh cnv grads hind.sh 2008081012 2. 初期値・境界値の作成 :sh sample msm.sh ○ JRA を使用する場合 1. 初期値・境界値の作成 :sh sample jra.sh ○ ERA を使用する場合 1. 初期値・境界値の作成 :sh sample era.sh 違う部分は、データ下準備の作業 (grib2grads manal.sh, cnv grads hind.sh など) のみ。後半は同じ。無事できたら、モデル実行に。 ■ 各処理の補足 上記のシェルの補足説明です。必要な部分を参照して下さい。中身については、実 際にシェルを見た方が早いかと。 ○ grib2grads manal.sh: grib 形式の MANAL を grads 形式に変換。ランベルト図法。指定した日付の範囲 を自動で変換する。 sdate: 変換を始める日付を 10 桁で表記 (YYYYMMDDHH) edate: 変換を終える日付を 10 桁で表記 (YYYYMMDDHH) ・シェルでの設定の仕方の例 sdate=2004070100 edate=2004070212 というように日付を書く。この場合 2004 年 7 月 1 日 00UTC から 2004 年 7 月 2 日 12UTC の 36 時間分 (13 個のファイル) を変換。講座内 (/mnt/tree2000/manal data) にデータがあれば即変換できる。データの時間間隔 (3 or 6 時間) に注意。 30 第 4. 初期値・境界値の作成 date=‘date -d "${ymd} ${hr}:00 6 hour" +%Y%m%d%H‘ の”6 hour”を必要に応じて”3 hour”に変更。 ○ cnv grads hind.sh: grib2 形式の MSM-GPV を grads 形式に変換。msm-gpv の解析値ならある程度用 意済み@講座内。なので、即使えるはず。 ○ cnv grads fcst.sh: grib2 形式の MSM-GPV を grads 形式に変換。上記の”hind”との違いは使用する データに予報地を含むこと。msm-gpv の解析値・予報値ならある程度用意済み@ 講座内。なので、即使えるはず。 ○ sample manal.sh: grads 形式に変換された manal データを読み込んで、初期値・境界値 (uvptq) を作 成。その他、地表面パラメータファイル (ptgrd), 地形ファイル (org) も作成し、合 計 3 つのファイルを作成。地形ファイルは側面で親 (MANAL, MSM, JRA, ERA) の地形とつながる様に処理されたもの。uvptq には初期値の後に境界値 (初期値と しても使用可) が同様の形式で含まれる。やっている事は、入力データから計算領 域の切り出し (水平内挿+鉛直内挿)、鉛直はモデル座標に合わせて変換。相対湿 度は水蒸気混合比に変換。tin(地面温度+海面水温), ptgrd(地表面温位) なども含 まれる。 ○ sample msm.sh: grads 形式に変換された msm-gpv データを読み込んで、初期値・境界値 (uvptq) を作成。その他 sample manal.sh と同様。 ○ sample jra.sh: grads 形式に変換された jra データを読み込んで、初期値・境界値 (uvptq) を作成。 その他 sample manal.sh と同様。jra データは用意済み@講座内。 ○ sample era.sh: grads 形式に変換された era データを読み込んで、初期値・境界値 (uvptq) を作成。 その他 sample manal.sh と同様。era-interim データは用意済み@講座内。 ■ プログラム 何らかの修正・改良をしたい方向き。 vardef.f90 : 実数の定義 cons12.f90 : 定数宣言 grd parm.f90 : nflutlty3 c.f90 : 入出力や補間のサブルーチン mapproj.f90 : 座標変換 (緯度経度⇔格子点) などのサブルーチン grdsub c.f90 : 31 2. 初期値・境界値の作り方−統一版 (MKINIT) NEW nfl uvptq.f90 : 本体、中間ファイルを読み込み、初期値境界値の出力 read data.f90 : 入力データ (MANAL, JRA など) の IO 処理 sst io tool.f90 : msst や OISST, JMA-SST を読む maxmin3sl.f90 : 最大値・最小値の出力 サブルーチンの殆どは”Module/Src/PREPOST/”にあるプログラム群を使用。 一部変更。中間ファイルは作成しない。read data.f90 で対応する処理をしてい る。対応していないデータ (NCEP など) を初期値として使いたい場合、主にこの プログラムに追加すれば OK. ■ namelist の説明 !----- ここから ------------------------------------------------./nflmsm2008 <<EOF &namnhmi nx=100, ny=100, nz=38, ←格子数 sloni=140.84, slati=38.26, ←基準緯度経度 (地形ファイルと同じものを使 用) iwdth=5, imerg=5, grmax=0.2 ←地形の処理の仕方 &end &namgrdi dxi=5000.0, dx1i=5000.0, dx2i=5000.0, ix1i=10, ix2i=20, ← x 方向の 格子間隔 dyi=5000.0, dy1i=5000.0, dy2i=5000.0, iy1i=10, iy2i=20, ← y 方向の 格子間隔 dzi= 760.0, dz1i= 40.0, dz2i= 760.0, iz1i=38, iz2i=38 ← z 方向の 格子間隔 &end &namnest ktst=0, kten=15, ktdel=3, ←計算開始時間、終了時間、データ間隔 (固定) &end &namfile ← namelist の名前を変更した!注意 fin_type=’manal’ ←使用するデータ (manal, msm, jra, era) &end &namsst isw_sst=0, type=’FIX’ ← sst の種類、固定か時間変化するか &end 32 第 4. 初期値・境界値の作成 EOF !----- ここまで ------------------------------------------------・ファイルのリンクの仕方。 ln -s topo msm.grd fort.12 (MSM の地形ファイル) ln -s org 100dx5 fort.51 (作成した地形ファイル) ln -s oisst.20070704 fort.200 (sst ファイル) ・SST ファイルは必要分にリンクすること。下記は書き方の例。msst の例。 ln -s msst2007070412.raw fort.200 ln -s msst2007070512.raw fort.201 ln -s msst2007070612.raw fort.202 ・mgdsst(jmasst) へのリンク例。 ln -s mgdsst.Sep04 fort.200 ln -s mgdsst.Sep05 fort.201 ln -s mgdsst.Sep05 fort.202 ln -s mgdsst.Sep05 fort.203 ln -s mgdsst.Sep05 fort.204 ・isw sst の設定。 isw sst=0: msst を使用 isw sst=1: oisst を使用 isw sst=2: mgdsst(jmasst) を使用 isw sst=3: mwir-sst を使用 (対応がやや怪しい) ■ エラー、変換ミス関係 ・エンディアン (endian) の設定ミス (little/big)。地形ファイル、入力ファイル、SST ファイルそれぞれ endian が異なったりします。ファイルが読めない、というエラー の場合にありがち。 ・コンパイラのオプション設定ミス (ifort の場合, -assume byterecl が必要) ・文字コード (euc, jis, sjis, utf8) や改行コード (CR, LF) のミス。nkf, iconv ・計算領域が使用するデータのカバー域をはみ出ている。メッセージが出力され るはず。 ・ファイルのリンク先が間違っている。エラーメッセージに装置番号が出力され るはず。 ・シェルが止まらない (無限ループする) → grmax の値を大きくする (0.4-0.5) 33 3. MSM-GPV での初期値・境界値の作り方 やや NEW 3 MSM-GPV での初期値・境界値の作り方 やや new ■ 手順 ・msm-gpv から初期値作成の手順。複数のデータから初期値 (解析値) のみ取り出 す。再現実験用。 1. msm-gpv のダウンロード : dl GPV/download gpv msm.sh 2. msm から初期値の取り出し : dl GPV/cut anl.sh 3. 気圧面と地表面データの結合: dl GPV/combine p s.sh 4. 中間ファイルの作成 : mkmedi msm/script/readmsm anl.sh 5. 初期値・境界値の作成 : mkinit msm/script/mkinit.sh ・初期値+予報値を取り出す。予報実験用。 1. msm-gpv のダウンロード : dl GPV/download gpv msm.sh 2. msm から初期値の取り出し : dl GPV/grib2grads.sh 3. 気圧面と地表面データの結合: dl GPV/combine p s.sh 4. 中間ファイルの作成 : mkmedi msm/script/readmsm anl.sh 5. 初期値・境界値の作成 : mkinit msm/script/mkinit.sh 違う部分は、使用するデータ、つまり msm-gpv からの切り出し方のみ。後半は同 じ。ファイルのフォーマットは全く同じ。 ○ 各処理の補足 download gpv msm.sh: MSM-GPV データのダウンロード。指定した日付の範囲を自動でダウンロードす る。 sdate: ダウンロードを始める日付を 10 桁で表記 (YYYYMMDDHH) edate: ダウンロードを終える日付を 10 桁で表記 (YYYYMMDDHH) ・シェルでの設定の仕方の例 sdate=2007070100 edate=2007070212 というように日付を書く。この場合 2007 年 7 月 1 日 00UTC から 2007 年 7 月 2 日 12UTC の 36 時間分 (13 個のファイル) をダウンロード。 34 cut anl.sh: シェルの日付設定の仕方は download gpv msm.sh と同じ。 combine p s.sh: msm の気圧面と地表面データの格子数と格子サイズは異なるので、合わせる必要 がある。それぞれの格子数は 気圧面:241x253 (0.125 x0.100), 16 層, 3 時間おきの予報値 地表面:481x505 (0.0625x0.050), 1 層, 1 時間おきの予報値 なので、気圧面に合わせて地表面データを間引く。 出力されるファイルは、u(東西風), v(南北風), t(気温), r(相対湿度), z(高度), p(地 表面気圧) の 6 つ。 readmsm anl.sh: 切り出した 6 つの MSM データを 1 つのファイル (medi) にまとめる。その際に時 刻の設定などをする。作成される中間ファイルには全領域データが 3 時間おきに 含まれる。 ツールをまとめるのが面倒だったため、古い形式を引き継いでいる部分。 ”grads 形式→初期値・境界値”とすればすっきり&分かり易くなるのですが… いずれ削除予定。が、grib2 → nuadas 形式にできるなら (ので)、”nhmgrd n01”を 使えばできるんですがね。これらのツールの存在意義が問われます。namelist は 前節参照。 mkinit.sh: 中間ファイル (medi) を読み込んで初期値・境界値データ (uvptq) を作成。その他、 地表面パラメータファイル (ptgrd), 地形ファイル (org) の計、3 つのファイルが できる。 やっている事は、msm データから計算領域の切り出し (水平内挿+鉛直内挿)、鉛 直はモデル座標に合わせて変換。相対湿度は水蒸気の比湿に変換。tin(地面温度+ 海面水温), ptgrd(地表面温位) なども含まれる。 uvptq には初期値の後に境界値 (初期値としても使用可) が同様の形式で含まれる。 ■ 必要なファイル 1. msm-gpv ファイル(気圧面と地表面) 2. sst ファイル 3. 作成した地形と msm の地形ファイル ○ MSM-GPV の気圧面と地表面データ:以下のようなファイル 気圧面: Z C RJTD 20080722090000 MSM GPV Rjp L-pall FH00-15 grib2.bin 35 3. MSM-GPV での初期値・境界値の作り方 やや NEW 地表面: Z C RJTD 20080722090000 MSM GPV Rjp Lsurf FH00-15 grib2.bin 筑波大のサーバ: http://gpvjma.ccs.hpcc.jp/ gpvjma/archive.html 京都大のサーバ: http://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/original ○ SST データ:以下の sst データに対応、しているかも。 namelist(namsst: isw sst) で選択可。作成期間分のデータを準備すること。 oisst: 1 度格子、1 週間おき、全球。対応済み。 merged-sst: 0.05 度格子、1 日おき、日本域。対応済み。 mgt-sst(jma-sst): 0.25 度格子、1 日おき、全球。おそらく対応済み。 mwir-sst: 約 10km、1 日おき、全球。おそらく対応済み。 ○地形データ:以下の 2 つのファイル MSM-GPV で使用される地形ファイル (TOPO.MSM 5K を編集したもの) 作成した地形ファイル (org) (3 章の) 地形の作成を参照。 ■ 出力されるファイル 1. 初期値 (+境界値) ファイル (uvptq:風、気温、水蒸気 etc) 2. 地表面パラメータファイル (ptgrd:アルベド, wetness, 熱容量 etc) 3. 地形ファイル (org:標高、海陸、緯度経度、粗度) それぞれのフォーマットの詳細は http://www.mri-jma.go.jp/Project/Kashinhi seasia/nhminfo/nh から。 ここではそれぞれ、 uvptq:mtuv の 1000 位の値が”2” のフォーマットを使用。 ptgrd:第 1 レコードのみ。 org:第 2 レコードまで。 その他、いくつか確認用にファイルや一時的なファイルが出力される。 ■ プログラム readmsm2007.f90: grads 形式のファイルを読み込み、中間ファイルを出力 vardef.f90 : 実数の定義 cons12.f90 : 定数宣言 grd parm.f90 : nflutlty3 c.f90 : 入出力や補間のサブルーチン mapproj.f90 : 座標変換 (緯度経度⇔格子点) などのサブルーチン grdsub c.f90 : 36 nflmsm2008 sst.f90 : 本体、中間ファイルを読み込み、初期値境界値の出力 sst io tool.f90 : msst や OISST, JMA-SST を読む maxmin3sl.f90 : 最大値・最小値の出力 以前のバージョン (2007 年) から変更。サブルーチンの殆どは”Module/Src/PREPOST/” にあるプログラム群を使用。一部変更。 ■ mkinit の namelist の説明 !----- ここから ------------------------------------------------./nflmsm2008 <<EOF &namnhmi nx=100, ny=100, nz=38, ←格子数:作成した地形ファイルに合わせる sloni=140.84, slati=38.26, ←基準緯度経度:作成した地形ファイルに合わ せる iwdth=5, imerg=5, grmax=0.2 ←地形の処理の仕方 &end &namgrdi dxi=5000.0, dx1i=5000.0, dx2i=5000.0, ix1i=10, ix2i=20, ← x 方向の 格子間隔 dyi=5000.0, dy1i=5000.0, dy2i=5000.0, iy1i=10, iy2i=20, ← y 方向の 格子間隔 dzi= 760.0, dz1i= 40.0, dz2i= 760.0, iz1i=38, iz2i=38 ← z 方向の 格子間隔 &end &namnest ktst=0, kten=15, ktdel=3, ←計算開始時間、終了時間、データ間隔 (固定) &end &namrom nproo=’LL ’ ←変更必要なし (MSM-GPV は緯度経度データ) &end &namsst isw_sst=0, type=’FIX’ ← sst の種類、固定か時間変化するか &end EOF 37 3. MSM-GPV での初期値・境界値の作り方 やや NEW !----- ここまで ------------------------------------------------・ファイルのリンクの仕方。 ln -s msm medi fort.11 (中間ファイル) ln -s zs ls2.dat fort.12 (MSM の地形ファイル) ln -s org 100dx5 fort.51 (作成した地形ファイル) ln -s oisst.20070704 fort.200 (sst ファイル) ・SST ファイルは必要分にリンクすること。下記は書き方の例。msst の例。 ln -s msst2007070412.raw fort.200 ln -s msst2007070512.raw fort.201 ln -s msst2007070612.raw fort.202 ・mgdsst(jmasst) へのリンク例。 ln -s mgdsst.Sep04 fort.200 ln -s mgdsst.Sep05 fort.201 ln -s mgdsst.Sep05 fort.202 ln -s mgdsst.Sep05 fort.203 ln -s mgdsst.Sep05 fort.204 ・isw sst の設定。 isw sst=0: msst を使用 isw sst=1: oisst を使用 isw sst=2: mgdsst(jmasst) を使用 isw sst=3: mwir-sst を使用 ・namnest の設定。 ktst:中間ファイルの初期値に対して、予報を開始する時間。通常は中間ファイル 作成時と合わせる。 kten:中間ファイルの初期値に対して、予報を終了する時間。通常は中間ファイル 作成時と合わせる。 ktdel:MSM のデータ間隔。”3”時間おき。古い場合は”6”時間おき。 ■ エラー関係 ・エンディアン (endian) の設定ミス (little/big) ・コンパイラのオプション設定ミス (ifort の場合, -assume byterecl が必要) ・文字コード (euc, jis, sjis, utf8) や改行コード (CR, LF) のミス。nkf, iconv など で変換。 ・計算領域が MSM のカバー域をはみ出ている。メッセージが出力されるはず。 ・ファイルのリンク先が間違っている。エラーメッセージに装置番号が出力され るはず。 38 ・シェルが止まらない (無限ループする) → grmax の値を大きくする (0.4-0.5) 4 MANAL での初期値・境界値の作り方 やや new 2008/12/01 に更新。 前節の MSM-GPV を用いた初期値・境界値作成とほぼ同様のツールを使用。MANAL を利用して初期値・境界値を作成。 ”/mnt/disk1/Tools/mkinit manal/”に必要なシェル、ソースプログラムがある。 1. sh script/grib2grads manal.sh ← grib を grads 形式に変換 2. sh script/readmanal2007.sh ←中間ファイルの作成 3. sh script/manal2nhm 2008.sh ←初期値・境界値の作成 ソースファイルは /mnt/sky1/sawada/Nhm-v15/Tools/mkinit manal/src manal/*.f90 をコピーすれば良い(.f90 のファイルのみ)。 ■ grib2grads manal.sh 以前のように、各変数ごとに分けずに、日付ごとに分ける。つまり、wgrib ですべ ての変数をそのまま変換するだけ。変換したファイルは必ず以下のような名前に すること(シェルをそのまま使えばよい)。 m2003070100 ←年、月、日、時をそのまま名前につける。 プログラムで直接ファイルを読むため、ファイル形式&名前は上記形式で。 ■ readmanal2007.sh 以前のように各ファイルにリンクは張らない。 export idir=$hmdir/manaldata/ のように grib を grads に変換したファイルの場所 を指定するだけ。後は namelist の日付で勝手にファイルを拾う。 ■ manal2nhm 2008.sh 以下に、シェル(manal2nhm 2008.sh)の概要。 必要なファイルは前節の mkinit msm と同様。 !----- ここから ------------------------------------------------#------------------- compile ------------------------cd ./src_manal/ ifort -O0 -assume byterecl sst_io_tool.f90 maxmin3sl.f90 grd_parm.f90 vardef.f90 cons 39 4. MANAL での初期値・境界値の作り方 やや NEW ### big_endian export odir=/mnt/sky1/msst ln -s ${odir}/msst2003070112.raw ln -s ${odir}/msst2003070212.raw ln -s ${odir}/msst2003070312.raw ln -s ${odir}/msst2003070412.raw ln -s ${odir}/msst2003070512.raw ln -s ${odir}/msst2003070612.raw fort.200 fort.201 fort.202 fort.203 fort.204 fort.205 export F_UFMTENDIAN="big:11,23,25,51,52,53,200,201,202,203,204,205,210,211" ./nflmanal2008 <<EOF &namnhmi nx=122, ny=122, nz=38, sloni=140.00, slati=30.0, iwdth=0, imerg=5, grmax=0.2 &end &namgrdi dxi=4000.0, dx1i=4000.0, dx2i=4000.0, ix1i=10, ix2i=20, dyi=4000.0, dy1i=4000.0, dy2i=4000.0, iy1i=10, iy2i=20, dzi= 760.0, dz1i= 40.0, dz2i= 760.0, iz1i=38, iz2i=38 &end &namnest ktst=0, kten=72, ktdel=6, &end &namrom nproo=’LMN ’ ← MANAL はランベルト図法 &end &namsst isw_sst=0, type=’’ &end 40 EOF !----- ここまで ------------------------------------------------namelist は mkinit msm とほぼ同様。 また、以前のバージョンでは地表面の風 (us,vs@10m) がスカラー変数扱いになって いるため、正しくありません。風成分は半格子ずらさないといけないので(staggard 格子 or Arakawa-C grid)。もちろん、大きな問題ではありませんが。 ■ manal の概要 メリット:日本域なら、10km 格子の解析値を 2001 年 3 月∼現在まで利用可。6 or 3 時間おき。 デメリット:当然日本以外は不可、年数が限られている。 ■ manal2nhm.sh の修正個所(JRA,GANAL や GPV と比べ て) MANAL は緯度経度座標ではなく、ランベルト図法のデータのため、プログラム の中で緯度経度を適切に計算する必要がある。具体的には、 DELSM=10.e3 : MANAL の格子サイズ(m) ⇔ 度ではない! SLONM=140.0 : ランベルト図法の基準経度 ⇔ DELSM と同じではない! XLONM=140.0 : MANAL の基準経度 ⇔ 格子(1,1)の座標ではない XLATM=30.0 : MANAL の基準緯度 ⇔ 格子(1,1)の座標ではない XIM=245.0 : MANAL の基準経度の格子番号 XJM=204.0 : MANAL の基準緯度の格子番号 これらの値を使って latlon というサブルーチンでランベルト図法での各格子での 緯度経度を計算してくれる。 5 JRA での初期値・境界値の作り方 This tool is used for nesting simulation with JRA-25. JRA25 or JCDAS を利用して初期値・境界値を作成。 メリット:日本以外の全球どこでも、1979 年∼現在まで利用可。 デメリット:格子が粗い(1.25 度 ×1.25 度 ×23 層+地表面)数 km までダウンス ケールするには 2,3 重ネストは必要。 解像度が同じ全球データ(ganal くらいかな?)なら使用可能。”/mnt/sky1/sawada/Nhmv15/Tools/mkinit jra/”に必要なシェル、ソースプログラムがある。 JRA-25 再解析 (+JCDAS) のデータは”/mnt/raid2000/JRA125/”の中にある。 41 5. JRA での初期値・境界値の作り方 JRA を用いた初期値作成の大まかな手順(2007/09/06) (how to make initial data using JRA-grads format data at our labs.) 1. sh script/read jra 2007.sh ←中間ファイルの作成 2. sh script/jra2nhm sst.sh ←初期値の作成 月や年をまたがっても OK のはずです。問題あったら連絡下さい。 ※古いバージョンの場合の JRA を用いた初期値作成の大まかな手順。 (how to make initial data using original JRA (grib format) data) 1. sh script/grib2grads jra.sh ←いずれ変更予定(grads 形式で整備する予定) 2. sh script/readjra2006.sh ←中間ファイルの作成 3. sh script/jra2nhm sst.sh ←初期値の作成 (上記と同じ) 必要なデータはもちろん、JRA 再解析 orJCDAS と SST データ。 ■ read jra 2007.sh の実行に必要なこと 以下、シェルの説明。最低限必要な部分だけ記述。 !----- ここから ------------------------------------------------#!/bin/sh export export export export export export hmdir="/mnt/sky1/sawada/Nhm-v15/Tools/mkinit_jra" date=20070714 ←適当な日付 (名前に使うだけ) srcdir=${hmdir}/src_jra ←ソースファイルの場所 ifile=${hmdir}/jradata/jra.20070714 ←中間ファイルの名前 odir=${hmdir}/data/jra ←中間ファイルの出力ディレクトリ名 F_UFMTENDIAN="big:18" cd ${srcdir} ifort -assume byterecl read_jra_2007.f90 check_endian.f90 -o read_jra_2007 cp read_jra_2007 $odir/ cd $odir ./read_jra_2007 <<EOF &namstdate ←初期値の開始時刻 42 istdate(1)=2007,istdate(2)=7,istdate(3)=14,istdate(4)=0,istdate(5)=6 &end &namendate ←初期値の終了時刻 iendate(1)=2007,iendate(2)=7,iendate(3)=15,iendate(4)=0,iendate(5)=6 &end &namnest ←作成する中間ファイルの時間 ktst=0,kten=24,ktdel=6 &end EOF mv fort.18 ${odir}/jra_medi.$date ←出力される中間ファイルの名前 !----- ここまで ------------------------------------------------変更点は以下の 2 点 ・入力ファイルにリンクを張る必要がなくなったこと ・namelist から、データの読み込み時間 (namnndate) がなくなったこと ■ readjra2006.sh の実行に必要なこと (旧) when you want to make initial data using original JRA data (grib format), this script will be useful. 古いバージョン。入力ファイルの設定が必要。上記の新しいバージョンなら必要 ない。必要な入力ファイルとその装置番号。各ファイルからこれらにリンクを張 ること。ファイルは grads 形式(直接探査形式)で、各変数ごとに準備。気圧面は 23 層。比湿は 12 層のみ。 ○入力データ ln -s ${ifile}.T_PRS fort.28 ln -s ${ifile}.U_PRS fort.40 ln -s ${ifile}.V_PRS fort.52 ln -s ${ifile}.Z fort.64 ln -s ${ifile}.RH_PRS fort.76 ln -s ${ifile}.P fort.88 ln -s ${ifile}.T_2m fort.34 ln -s ${ifile}.U_10m fort.46 ln -s ${ifile}.V_10m fort.58 ln -s ${ifile}.RH_2m fort.82 気圧面の温度 気圧面の東西風 気圧面の南北風 気圧面のジオポテンシャル高度 気圧面の比湿 (12 層のみ, 相対湿度ではない!) 海面気圧 地表面(高度 2m)温度 地表面(高度 10m)東西風 地表面(高度 10m)南北風 地表面(高度 2m)比湿 ■ jra2nhm sst.sh の実行に必要なこと。 必要な入力ファイルとプログラムで読み込むときの装置番号。各ファイルからこ 43 5. JRA での初期値・境界値の作り方 れらの装置番号にリンクを張ること。入力ファイルは基本的に”big endian”形式。 fort.11: JRA を使って作成された中間ファイル fort.12: 親 (JRA) モデルの地形、海陸分布 fort.14: 親 (JRA) モデルの地形、使用していないので必要なし fort.51: 子 (inner) モデルの地形 fort.200: OISST の入力(装置番号 200 以降、以下使い方の例) ln -s oisst.20060726 fort.200 ln -s oisst.20060802 fort.201 ln -s oisst.20060809 fort.202 ln -s oisst.20060816 fort.203 ※ OISST データの読み込みのバグを修正 OISST を読み込むとき、以前だと年をまたぐ場合 (e.x. 2004 → 2005) に処理が上 手くいきませんでした (by Taku-chan)。それを適当に対処しました (2007/08/24)。 修正したファイルは”ssmi sst.f”(ssmi の SST を読むために作りましたが、現状は 使用していません)。 ○実行時に渡すパラメータ(namelist)の意味 &NAMMAPO ←たぶんマップの設定、実質的に初期値の作成に関係ないはず SCALE=200.,FLSTP=30.,XSW=10.,YSW=10. &END &NAMROM ← map projection, LLN は緯度経度座標の意味 NPROM=’LLN ’ &END &NAMMAPI ← inner モデルの地形ファイルの図法の設定 FLATSI=5.7, FLATNI=50.7, FLONWI=129.7, FLONEI=159.7, SCALEI=2000., SLONI=135.0, SLATI=32.5, FLSTPI=5., XSWI=20., YSWI=20., IFILEI=51, NPROJC=’LMN’ ←ランベルト図法 &END &NAMORGI ← inner モデルの地形ファイルの設定 FLATC=32.5, FLONC=135.0, DX=30000., DY=30000., THI=0.,NXIN=72, NYIN=72, IWDTH=$IWIDTH &END &NAMGRDI ← inner モデルの格子の設定 DXI=30000., DX1I=30000., DX2I=30000., IX1I=10,IX2I=20, ← X 方向の格子 DYI=30000., DY1I=30000., DY2I=30000., IY1I=10,IY2I=20, ← Y 方向の格子 DZI=1120., DZ1I= 40., DZ2I=1120., IZ1I=38,IZ2I=38 ← Z 方向の格子 44 &END &NAMNEST ←時間の設定 KTST=0, 中間ファイルを使い始める時間 KTEN=66, 中間ファイルを使い終わる時間 KTDEL=6, 中間ファイルの時間間隔(h) &END &namend1st ←中間ファイルの終了時刻(ここでは 2006 年 8 月 1 日 24 時) idate2(1)=2006,idate2(2)=8,idate2(3)=1,idate2(4)=24,idate2(5)=5 &end 5.1 プログラム ”/mnt/sky1/sawada/Nhm-v15/Tools/mkinit jra/”以下のファイルについて。 readjra2006.f90: 本体。grads 形式のファイルを読み込み、中間ファイルの出力 (旧) read jra 2007.f90: 本体。JRA のファイルを読み込み、中間ファイルの出力 (真) nfljra2006 sst.f: 本体。地形、中間ファイルを読み込み、初期値を出力。 nflutlty2+2.f: 2 次元内挿、鉛直方向の内挿、地形のスムージングなど。 nflutnpd3.f: 座標系の変換(緯度経度⇔格子)など。 ”read jra 2007.f90”は”readjra2006.f90”を少し整理。 ”readjra2006.f90”は無駄に f90 に書き換えてみる。自分が読みやすいように。いず れ中間ファイルを作らず、直接初期値を作成できるよう変更した方が楽かも。 6 中間ファイルの作成 以下は、ds3 用の msm-gpv を用いた場合について簡単に記述。情報古いです。 やることは 3 つ。 1. ファイルの準備(rsm-gpv): dl GPV/wget gpv past.sh 2. 中間ファイルの作成 : mkmedi/script/readrsm.sh 3. 初期値・境界値の作成 : mkinit/script/r2n 72dx24.sh ds3 の中にあるスクリプトを適切に書き換えれば、 sh 4cast past pre.sh 00UTC 20061012 20061011 10 12 10 11 20061011 20061011 で上の 3 つの作業&実行まで出来るっぽい。過去(2007/10/19)の ds3 は msm-gpv ではなく、rsm-gpv を使用していた。 45 6. 中間ファイルの作成 シェルの使い方は以下の通り、 sh $PREPRODIR/mkmedi/script/readrsm past.sh $SUFFIX $DATE t $DATE n $mn t $dy t $mn n $dy n $DATE msst $DATE oisst シェルの namelist の意味は、 INIDATE: 用意したデータ (grads 形式の各変数) 開始時間 (UTC): 基準の日付とな る ISTDATE: 中間ファイルの開始時間 (UTC) IENDATE: 中間ファイルの終了時間 (UTC) 時間の設定は UTC(協定世界時) であり、JST(日本標準時) ではないことに注意。 例えば、2006 年 10 月 10 日 00UTC の GPV-RSM をもとにして計算開始時間: 2006 年 10 月 10 日 12UTC⇒ 計算終了時間:2006 年 10 月 11 日 12UTC &NAMNNDATE INIDATE(1)=2006,INIDATE(2)=10,INIDATE(3)=10, INIDATE(4)=00,INIDATE(5)=1 &END &NAMSTDATE ISTDATE(1)=2006,ISTDATE(2)=10,ISTDATE(3)=10, ISTDATE(4)=12,ISTDATE(5)=1 &END &NAMENDATE IENDATE(1)=2006,IENDATE(2)=10,IENDATE(3)=11, IENDATE(4)=12,IENDATE(5)=2 &END &NAMNEST KTST=0, KTEN=24, KTDEL=3, &END namelist:NAMNEST は以下の通り。 KTST=0, ←用意した中間ファイルの開始時間からの時間。 KTEN=24, ←作成する中間ファイルの時間 (初期値からの予報時間)。 KTDEL=3 ←用意したデータの時間間隔。 ISTDATE と IENDATE で設定された日付が KTST, KTEN, KTDEL と合わない 場合、readrsm2007.f90 でエラーとなるように変更。 プログラム readmsm2007.f90: 本体、grads 形式のファイルを読み込み、中間ファイルの出力 46 (msm 用) readrsm2005.f(旧): 本体、grads 形式のファイルを読み込み、中間ファイルの出力 subfile.f: 使用していない 中間ファイルのフォーマット ソースファイルを見れば分かりますが…。 readmsm2007.f90: subroutine readwrite を参照 integer :: ndate(5) ! 日付:年、月、日、時、曜日 (用意したデータの開始 時間) integer :: kt ! 初期値からの予報時間: time from initial date [hour] integer :: nelm ! 要素数 (1): number of element character(len=4) :: elm ! 要素名: element name integer :: mdout ! 装置番号: device number of fortran real(4) :: data(nx,ny) ! 出力変数 write(mdout) ndate,kt,nelm,elm,data 7 初期値・境界値の作成 シェルの使い方は以下の通り、 sh $PREPRODIR/mkinit/script/r2n 72dx24 past.sh $SUFFIX $DATE t $DATE n $mn t $dy t $mn n $dy n $DATE msst $DATE oisst 情報が古いです。次節参照。を参照。 namelist の設定の一部について(全部は面倒) &NAMMAPI FLATSI=0, FLATNI=0, FLONWI=0, FLONEI=0, SCALEI=2000., SLONI=140., SLATI=32.5, FLSTPI=5., XSWI=20., YSWI=20., IFILEI=51, NPROJC=’LMN’ &END &NAMORGI FLATC=38.0, FLONC=138.0, DX=24000., DY=24000., THI=0.,NXIN=72, NYIN=72, IWDTH=$IWIDTH &END &NAMNEST KTST=0, KTEN=24, KTDEL=3, &END &namend1st 47 7. 初期値・境界値の作成 idate2(1)=2006,idate2(2)=10,idate2(3)=11,idate2(4)=12,idate2(5)=2 &end SLON1, SLAT1 は基準緯度。地形ファイル作成時の値を使用。 FLATC, FLONC は地形の中心位置。地形ファイル作成時の値を使用。 KTST, KTEN, KTDEL は中間ファイル作成の時と同様で OK。 namend1st は中間ファイルの終了時刻(あるいはそれ以降の時間ならとりあえず 良し)。中間ファイルが 2 つある場合に使用(よって、うちの講座では間違いなく 使わない)。 初期値・境界値ファイルのフォーマット (uvptq) 最低限のフォーマットです。雲物理量をネストする場合は、ヘッダーにもう少し 書き込まれます。もちろん、雲水なども書き込まれます。 nflutlty3.f90: subroutine storuv を参照。 integer,intent(in) :: nx, ny, nz real(4),intent(in) :: u(nx,ny,nz),v(nx,ny,nz),w(nx,ny,nz), & & pt(nx,ny,nz),qv(nx,ny,nz), & & ptgrd(nx,ny),ptgrdt(nx,ny),ptsea(nx,ny),pai(nx,ny) real(4),intent(in) :: tin(nx,ny,4) real(4),intent(in) :: pseam,pgrdm,ptopm integer,intent(in) :: mtuv, kt integer,intent(in) :: idate(5) write( mtuv ) kt,mtuv,pseam,ptopm,idate,pgrdm write( mtuv ) (((u(i,j,k),i=1,nx),j=1,ny),k=1,nz) write( mtuv ) (((v(i,j,k),i=1,nx),j=1,ny),k=1,nz), & & (((w(i,j,k),i=1,nx),j=1,ny),k=1,nz) write( mtuv ) (((pt(i,j,k),i=1,nx),j=1,ny),k=1,nz) write( mtuv ) (((qv(i,j,k),i=1,nx),j=1,ny),k=1,nz) write( mtuv ) ptgrd,ptgrdt,ptsea,pai,tin JMA-NHM での初期値の読み込み方(日付) pre.f90: subroutine nesting_initiation call loaduv2(...kt,...idate,...) call loaduvread1(ikt, mtuv, pseam, ptopm, idate, flgq, flgqn, flgv) ios.f90: subroutine loaduv2(...kt,...idate,...) 48 kt: 引数, idate: loaduvread1 から入力 ios.f90: subroutine loaduvread1(ikt, mtuv, pseam, ptopm, idate, flgq, flgqn, flgv) read(mtuv) ikt, mtuvi, pseamd, ptopmd, idate ikt: 初期値から読み込み, idate: 初期値から読み込み ikt と kt(ktsto) が一致したところを初期値とする。 pre.f90: subroutine preparebd: 境界値の作成のため、必要な分の読み込み call loaduv2() ○使用するファイルについて PSDATA (fort.99) : 描画用 (A4 サイズ、装置番号 20 番を使用するという 意味) MAPJPN (fort.43) : 描画用 (日本の海岸線など、gnuplot で描けば分かる) zs\_ls2.dat (fort.51) : RSM の標高データと海陸分布データ、要必要。 msst${DATE_dby}12.raw : msst データ (海面温度)、要必要。 oisst.20070221 : oisst データ (海面温度)、要必要。 PSDATA, MAPJPN は初期値・境界値を作成するのには必要ではない (但し、プロ グラムで読み込むのでリンクを貼らないとエラーが起きますが)。msst, oisst デー タについては調べて下さいませ。 ○出力されるファイルについて mv fort.23 uvptq ←初期値・境界値データ mv fort.25 ptgrd ←地表面パラメータデータ(wetness, fktg, albed...) mv fort.52 org ←地形ファイル(側面付近でスムージング) mv fort.53 sst ← SST データ(使用していない) #mv fort.60 nfl.ps ←初期値・境界値の図(多分引っかかる) mv fort.36 ganal_average_p.txt ←入力(RSM)の平均気圧のモニタ mv fort.620 sst_default ←??? mv fort.630 sst_oiv2 ←??? 8 2 重 (セルフ) ネストの仕方・NHM の出力とのつなげ 方 (self-nesting, or downscaling) new 2009/1/28 renew. This is a guidance for nesting with nhm-output (we call this self-nesting, or downscaling simulation). 49 8. 2 重 (セルフ) ネストの仕方・NHM の出力とのつなげ 方 (SELF-NESTING, OR DOWNSCALING) NEW ■ 手順 $ sh nest.sh シェルを適切に設定後、実行するだけ。 シェルの中身は下記に。 moving domain 用のシェル。 $ sh nest moving test.sh シェルを適切に設定後、実行するだけ。 ”imd sw=2” の時は専用プログラム (可変の移動速度用) が必要。 試したい方は僕まで。テスト版なので。地形があると駄目。海上のみ。 シェル、ソースプログラムは以下のディレクトリにある。 /mnt/disk1/Tools/nest/ あるいは、/mnt/disk1/Tools/nest/ (stream からのみ) ■ 必要なファイル 必要な入力ファイルは 2 つ。各ファイルから適切な装置番号にリンクを張ること。 fort.12: fort.51: fort.49: fort.50: 親 (parent or outer) モデルの出力 子 (child or inner) モデルの地形(nesting するための地形) 親モデルの SST (現在は特に使用していない, 修正すべき?) 親モデルの地形 (出力から地形を拾うので特に使用しないでも OK) リンクの張り方の例。 ln -s strmts2 fort.12 ln -s org 102dx5 など。 ■ 出力ファイル fort.23: uvptq 初期値の本体 fort.25: ptgrd 土地利用ファイル fort.52: org 地形ファイル(側面で親モデルの地形とつながるようスムージン グ処理) fort.300: 気圧のモニタ check.grd: 作成した初期値の一部を grads 形式で出力したもの。確認用。 シェルの中の変数(namelist に与える値、つまり格子数や解像度、緯度経度、予 報時間など)を変えることで自分の好きなようにネストできるはず。 50 &NAMGRDO ←親 (outer) モデルの格子設定 NXO=72, NYO=72, NZO=38, ←親モデルの格子数 DXO=30000.0, ← x 方向の解像度 (m) DYO=30000.0, ← y 方向の解像度 (m) DZO= 1120.0, DZ1O= 40.0, DZ2O= 1120.0, IZ1O=38, IZ2O=38, ← z 方向の 解像度 &END &NAMGRDI ←子 (inner) モデルの格子設定。水平・鉛直格子間隔を決める NXI=102, NYI=102, NZI=38, ←子モデルの格子数 DXI=10000.0, ← x 方向の解像度 (m) DYI=10000.0, ← y 方向の解像度 (m) DZI=1120.0, DZ1I= 40., DZ2I=1120.0, IZ1I=38, IZ2I=38, ← z 方向の解 像度 &END &NAMPROJ ←地形ファイルの設定 NPROJC=’LMN ’, SLAT=32.5, SLON=135.0, ←地形ファイルの基準緯度経度 IWDTH=5, IMERG=5, GRMAX=0.20 ←側面、勾配のスムージングの設定 &END &NAMNEST ←予報時間、入力時刻の設定 KTSTJ=1, KTENJ=18, KTSTRJ=1, ←予報開始、終了、刻み間隔 KTUNIT=3600.0, ←作成する初期値に対する、1 つの刻み幅 (1KTSTRJ) の時 間 (sec) KTUNIT0=3600.0, ←親モデルの出力間隔 (sec) &END &NAMKDD ←ネストする物理量、出力していない変数は勿論使えない。 KDD( 1)=1, KDD( 2)=1, KDD( 3)=1, KDD( 4)=2, KDD( 5)=1, ←"1"が入力 KDD( 6)=0, KDD( 7)=0, KDD( 8)=0, KDD( 9)=0, KDD(10)=1, KDD(11)=0, KDD(12)=0, KDD(13)=0, KDD(14)=0, KDD(15)=0, KDD(16)=0, KDD(17)=1, KDD(18)=0, KDD(19)=0, KDD(20)=0, KDD(21)=0, KDD(22)=0, KDD(23)=0, KDD(24)=0, KDD(25)=0, KDD(26)=1 &END ※注意事項 ・2008 年 12 月以前:KTSTJ=0(ITSTO=0) だと上手くいかない時があるかも。そ の際は KTSTJ > 0 (ITSTO > 0) とすること。 ・2009 年 1 月:修正されているはず。 51 9. 雲物理量を境界に与えるには ・jmanhm-rel-01-15.tgz で使用すると、初期値・境界値の読み込みに失敗する ことがあります。雲物理の変数名が違うため (qh(ひょう),qg(あられ) など)。 ・jmanhm-rel-02-00.tgz をお使い下さい。 ・描画処理を除きました。本来ならチェックすべきですが、プログラムをすっきり させるため。 ・入力変数を減らしました。楽するため。 8.1 プログラム ”/mnt/sky1/sawada/Nhm-v15/Tools/n2n/”以下のファイルについて。f90 に書 き換え済み。2009/1/28. nflnn_2008.f90: 本体 nflnn_2009_test.f90: 本体, moving domain 用 (計算領域の移動に対応)。テス ト版。 nflutlty3_c.f90: mkinit や mkinit_jra の nflutlty2+(2).f と同じ nflutlqj3.f90: 内挿計算 sub.inter_pre: 内挿計算に必要な補間係数の準備 sub.interp: 内挿計算 sub.interpt: 温位の内挿計算 sub.inter2d: 2 次元内挿 sub.read_header: 親モデルの結果から日付、地形情報の読み込み sub.loadmt5: 親モデルの結果からデータの読み込み sub.unpack: データの読み込み、(2Byte 圧縮から) 物理量に変換 %Tools/mkinit/srcplt/nflutplt2.f: 描画 (使用せず) %Tools/mkinit/srcplt/plotpswk2.f: 描画ツール本体 (使用せず) 9 雲物理量を境界に与えるには この項目は既に古くなりました。前節の”nesting”に統合しました。 ただし、パラメータカードの設定は要参考。 2 重ネストした時に、雲物理量(雲水、雨水、雲氷、雪、あられ)を初期値・境 界で引き継ぐための方法。test 版。ほとんど前節の 2 重ネストと使い方も、必要な ファイル、中身も同じ。いづれまとめる予定(今のところ、バグがあったら嫌な のでソースファイル、シェルを別にしています)。 52 ※注意事項 jmanhm-rel-02-00.tgz で使用すると、初期値・境界値の読み込みに失敗します。 これは雲物理の変数が増えたため (雲水、雨水、雲氷、雪、あられ+ひょう)。かつ、 あられの変数名が変更されているので (QH → QG)、修正が必要。2007/7/27(by Sakai-kun) ※捕捉事項 jmanhm-rel-02-00.tgz に対応させました。その際、n2n の古いバージョンでや や不具合があったので修正しました。2007/7/28 ■シェルの使い方 $ sh ./script/n2n30-10 cld.sh $SPEC OUTER $SPEC INNER $DATE で、実行時に与える変数は以下の通り。 jmanhm-rel-02-00.tgz の場合、 $ sh ./script/n2n5-1 cld v2.sh $SPEC OUTER $SPEC INNER $DATE です。 シェル(n2n30-10 cld.sh)の中で設定する namelist の意味は全く 2 重ネストと 同じ。書き方は同じだが NAMKDD の雲物理量のみ意味が異なる。つまり、 &NAMKDD ←ネストする物理量、出力していない変数は勿論使えない。 KDD( 1)=1, KDD( 2)=1, KDD( 3)=1, KDD( 4)=2, KDD( 5)=1, KDD( 6)=1, KDD( 7)=1, KDD( 8)=0, KDD( 9)=0, KDD(10)=1, KDD(11)=0, KDD(12)=0, KDD(13)=1, KDD(14)=1, KDD(15)=1, KDD(16)=0, KDD(17)=1, KDD(18)=0, KDD(19)=0, KDD(20)=0, KDD(21)=0, KDD(22)=0, KDD(23)=0, KDD(24)=0, KDD(25)=0, KDD(26)=1 &END ここで、KDD(6), KDD(7), KDD(13), KDD(14), KDD(15) はそれぞれ雲水、雨水、 雲氷、雪、あられ(qc, qr, qci, qs, qh)で、KDD(XX)=1 の場合、これらを初 期値・境界値として準備する。 (元々の nflnn sst.f90 では例え”1”にしても雲は引き 継がれない)初期値・境界値の作成はこれで OK。 ※注意事項 jmanhm-rel-02-00.tgz では KDD(15) = QG(あられ)、KDD(20) = QH(氷) です。 ■ parametercard の namelist の設定 &NAMNST ←ネストに関するパラメータの設定 53 9. 雲物理量を境界に与えるには KTSTO=0, KTENO=54, KTDTO=6, DTRATIO=3600., io_init_qc=1, ←雲水が初期値に含まれている場合 io_init_qci=1, ←雲氷が初期値に含まれている場合 io_init_qr=1, ←雨水が初期値に含まれている場合 io_init_qs=1, ←雪が初期値に含まれている場合 io_init_qh=1, ←あられが初期値に含まれている場合 io_bndry_qc=1, ←雲水が境界値に含まれている場合 io_bndry_qci=1, ←雲氷が境界値に含まれている場合 io_bndry_qr=1, ←雨水が境界値に含まれている場合 io_bndry_qs=1, ←雪が境界値に含まれている場合 io_bndry_qh=1, ←あられが境界値に含まれている場合 &END このように io init qc, io bndry qr などを加えれば、初期値・境界値に雲物理量を 使用できる(見ての通り、初期値と境界値で namelist の設定が個別にある)。この他、 凝結物の数密度(qnc, qnr, qnci, qns, qnh)、乱流エネルギーなどについても同様に して初期値・境界値に与えられるが、プログラム(nflutlty2+4.f, nflnn sst cld.f90) の修正が必要。namelist については詳細は parametercard を参照。 以下、使用するプログラム概要。 nflnn_sst_cld.f90: 本体、subroutine の引数を変更したためこれを修正 nflutlty2+4.f: mkinit や mkinit_jra の nflutlty2+(2).f をやや修正 nflutlqj.f: 内挿計算、やや修正, 2007/7/28 sub.interp2: XSFT,YSFT で内挿位置をずらして内挿計算 sub.interpt2: 温位の内挿計算 sub.inter2d: 2 次元内挿 sub.inter3d: 3 次元内挿、使用しないと思う sub.loadmt3: データの読み込みの制御 sub.loadmt4: データの読み込みの制御 sub.storuv: データの書き出し、雲物理量を出力するためここを修正 sub.unpack: データの読み込み、(2Byte 圧縮から) 物理量に変換 Tools/mkinit/srcplt/nflutplt2.f: 描画 Tools/mkinit/srcplt/plotpswk2.f: 描画ツール本体 以下、最新版の場合(n2n5-1\_cld\_v2.sh) nflnn_sst_cld_v2.f90: 本体, jmanhm-rel-02-00 用に修正 nflutlty2+5.f: jmanhm-rel-02-00 用に修正 (nflnn_sst_cld_v2.f90 用) sub.storuv: データの書き出しの修正 54 初期値に雲水などを引き継いで計算した例を紹介。この図だけを見る限り初期 の雲分布 (T=0h) は大きく違うが、T=6,12h ではほとんど違いが見られない。気 圧分布も同様。 初期値・境界値の作られ方 -プログラムの流れプログラムを自分で修正したい方のためのメモ(つまり、自分用)。 nflnn_sst_cld_v2.f90: 本体, jmanhm-rel-02-00 用に修正 |-- namelist の読み込み |-- パラメータの設定、日付の計算 |-- outer, inner の地形ファイルなどの読み込み |-- call stortg: ptgrd ファイルの作成 |-- call loadmt4: (outer の)NHM の出力の読み込み |-- call inter2d, interp2: 内挿計算 |-- call storuv: uvptq ファイルの作成 (初期値・境界値データ) |-- データフォーマットの診断 (flgq,flgqn,flgv) 10 理想化実験の初期値・境界値 ある地形に、一様な環境場を与えて計算する方法。やり方は 2 通り。 1. パラメータカードで環境場の鉛直プロファイルを与える方法 2. 初期値・境界値を自分で適当に作って与える方法 1. は簡単。2. は面倒だけど、少し凝った環境場 (水平シアを与えたり、時間変化さ せたり、など) を与えられる。 ここでは、1. のみ記述。原理は山岳波や地形性降水のテストランと同じ。 以下に、パラメータカードの記述の仕方を示す。必要な部分のみ。 !----- ここから ------------------------------------------------... &NAMMSW MSWSYS( 1)=204, MSWSYS( 2)=1, MSWSYS( 3)=2, MSWSYS( 4)=2, MSWSYS( 5)=2, MSWSYS( 6)=-2,MSWSYS( 7)=1, MSWSYS( 8)=11, MSWSYS( 9)=3, MSWSYS(10)=0, MSWSYS(11)=0, MSWSYS(12)=2, MSWSYS(13)=10, MSWSYS(14)=0, MSWSYS(15)=2, MSWSYS(16)=0, MSWSYS(17)=5, MSWSYS(18)=-40, MSWSYS(19)=31001, MSWSYS(20)=2, MSWSYS(21)=1, MSWSYS(22)=20, MSWSYS(23)=2, MSWSYS(24)=0, 55 10. 理想化実験の初期値・境界値 MSWSYS(25)=1, MSWSYS(26)=0, MSWSYS(27)=0, MSWSYS(28)=40, MSWSYS(29)=1, MSWSYS(30)=2 &END ... &NAMVAL RATIOI=1.0,RATIOO=1.0,RATIO2=1.0,RUVNI=1.0,RUVNO=1.0, RUVN2=1.0, FNLTR=0.0,IDIFX=11,DIFNL=-2400.0,DIF2D=-2400.0, DIFTG=-600.0,ASTFC=0.2, STDLON=140.0,STDLAT=15.0, KZDST=29,KZDEN=36, RLDMPX=-2400.0,RLDMPZ=-2400.0,RLDMPO=0.0, PTGRDS=302.15,PTGRDR=0.0,PTGRDL=0.0, ITGROW=0,UBIAS=0.0,VBIAS=0.0,ITSST=0,EOVER=0.5 &END ... IN Z(M) U(M/S) V(M/S) PT(K) RH(%) QC(G/KG) 1 0.0 0.0 0.0 301.1 95.0 0.0 2 20.0 0.0 0.0 301.1 95.0 0.0 3 60.0 0.0 0.0 300.8 95.0 0.0 4 130.0 0.0 0.0 300.8 95.0 0.0 5 230.0 0.0 0.0 301.0 95.0 0.0 6 360.0 0.0 0.0 301.2 95.0 0.0 7 710.0 0.0 0.0 301.9 95.0 0.0 8 1180.0 0.0 0.0 304.5 95.0 0.0 9 2480.0 0.0 0.0 311.3 90.0 0.0 10 4260.0 0.0 0.0 320.5 90.0 0.0 11 5330.0 0.0 0.0 326.0 90.0 0.0 12 6520.0 0.0 0.0 331.8 80.0 0.0 13 7160.0 0.0 0.0 334.9 70.0 0.0 14 7830.0 0.0 0.0 337.5 60.0 0.0 15 8530.0 0.0 0.0 340.2 50.0 0.0 16 10810.0 0.0 0.0 347.6 40.0 0.0 17 11630.0 0.0 0.0 349.7 20.0 0.0 18 12480.0 0.0 0.0 352.1 5.0 0.0 19 15210.0 0.0 0.0 367.7 0.0 0.0 20 19270.0 0.0 0.0 451.3 0.0 0.0 21 24000.0 0.0 0.0 512.8 0.0 0.0 56 QR(G/KG) 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22 26600.0 0.0 0.0 607.4 0.0 0.0 0.0 99 ... !----- ここまで ------------------------------------------------&NAMMSW で側面境界にかかわる番号を適切に変更。MSWSYS(4), MSWSYS(5), MSWSYS(7), MSWSYS(26) など。さらに、MSWSYS(12)=2 とする。 &NAMVAL で ptgrds=300 (海面温位), ptgrdl=1 (陸面温位の偏差) などを与え る。standalone initiation の場合、これらの設定が有効になる。 以下、参照。 !----- ここから ------------------------------------------------tgf.f90: subroutine tgf__tg_set_first do jy = 1, ny do ix = 1, nx if (skind(ix, jy) == kind_sea) then ! sea ptgrd(ix, jy) = ptgrds - ptrf else ! land, snow, ice ptgrd(ix, jy) = pt(ix, jy, 1, kto) + ptgrdl end if end do end do !----- ここまで ------------------------------------------------IN Z(M) ... 以下の部分で、東西風、南北風、温位、相対湿度 (または比湿 [g/kg])、 雲水、雨水の鉛直プロファイルを記述。これらが水平一様に与えられる。最下層は 0m とすること。あとはテストランと同じように実行するだけ。地形ファイルのみ準備 すれば良い。放射スキームに必要なファイル (BANDCNX, band.dat, band2004.dat, ozn t42l68 clm.dat) があればリンクを忘れずに。 11 初期値・境界値を読みたい、絵を書きたい 一言、頑張ってプログラムを作って読んで下さい。 と言いたいのですが、サンプルのシェル、ソースプログラムを以下に置いておき ます。 57 12. リスタート(再計算)のやり方 /mnt/sky1/sawada/Nhm-v15/Tools/read uvptq/src/read uvptq.f90 /mnt/sky1/sawada/Nhm-v15/Tools/read uvptq/script/read.sh 使い方はシェル (read.sh) の中を見れば分かると思います。 出力ファイル uvptq.grd: 初期値・境界値ファイルの一部を grads 形式に変換したもの uvptq.ctl: 出力ファイル用の ctl ファイル。緯度経度は全く持って適当 12 リスタート(再計算)のやり方 ある意味、最低限の技術。 パラメータカードをちょっと設定するだけでよい。 &NAMFIL IMT_RS_OUT=72, ←リスタートファイルの装置番号 (使っていない番号) ISTR_RS_OUT=1080, ←リスタートファイルの出力ステップ間隔 ... &END work ディレクトリの中に”rest-000-001”というファイルが作られます。これがリス タートする際に入力するファイルとなります。 リスタートするには、パラメータカードを以下のように設定。 &NAMPAR ITST=1080,... ←リスタートの開始ステップ (出力したステップ) &END &NAMFIL IMT_RS_IN=82,... ←リスタートファイルの装置番号 (使っていない番号) &END MSWSYS は基本的に変えないこと。データの読み込みがずれることがあります。 (特に MSWSYS(1), MSWSYS(13), MSWSYS(18), MSWSYS(19) など) これでリ スタートできるはずです。 ※但し、MSWSYS(18)=-2,-3,-4 はうまくいきませんでした。再計算は出来るも のの、結果が一致しません。原因はまだ調べ中。 58 図 4.1: 初期値に親モデルから雲水、雨水、雲氷を引き継いだときのインパクト。 color が鉛直積算雲水量、contour が海面更正気圧。左図が与えていない場合、右 図が与えた場合。上から T=0,6,12h。 59 61 第 5 章 モデルの実行 1 モデルの実行 オリジナルなら”Nhm/Ss/Pf/GRSM”にあるシェルを参考に書き換えて実行でき る。つまり、 $ cd Nhm/Ss/Pf/GRSM/ $ emacs grsm10238 nfx.sh $ sh grsm10238 nfx.sh で OK。”grsm10238 nfx.sh”はパス(ディレクトリ名)や初期値・境界値の名前を 適切に変更すること。 うちの講座では(ds3)では、 4cast-cron/execution/script/4cast 72dx24.sh 4cast-cron/execution/script/4cast 72dx24 past.sh が実行シェルです。こちらを利用するならこれを変更。 日付などを簡単に入力できる気がするので、便利かも。 自分用は /mnt/disk1/Nhm-v15/Ss/Pf/FCST/fcst sample.sh モデルの実行に必要なファイルなどの簡単な説明。各装置番号にリンクを張るこ と (リンクの張り方はシェルの中を参照)。 ○自分で準備するもの fort.23: 初期値 (uvptq)、namelist の imt_ini で装置番号を決められる fort.25: 土地利用データ (ptgrd)、imt_ptgrd fort.50: 地形データ (org)、imt_hm(default は 29 番らしい) fort.53: 海面水温データ (sst)、imt_sst(default は 53 番), 不要。 fort.32: SiB に必要なデータ (GLCC_SiB)、imt_glcc_sib(default:32)、mswsys(13)=9 の場合のみ必要。 parm_72dx30(名前は適当): 実行時に与えるパラメータファイル ○用意されているもの。web 上からダウンロード。あるいは、"/mnt/disk1/Nhm-v2-00/Const" 1. モデルの実行 からコピー。 fort.30: 放射に必要なデータ (BANDCNX)、imt_band、mswsys(13)=6∼9 の場合 fort.31: 放射に必要なデータ (band.dat)、imt_band_gsm0103、mswsys(13)=10,11 の場合 fort.XX: SiB に必要なデータ (GSM9603.VEG or gsm.veg.v12.d)、imt_gsm9603_veg、 mswsys(1)=9 の場合 imt XXX はパラメータカードの中の namelist の変数名。 モデルの実行時に出力されるファイルの説明。独自仕様で出力されるファイルに ついてはプログラムの中をチェックしましょう。 fort.21: ワークファイル (主に境界値) の出力、imt_bd fort.62: モデルの結果の出力 (MRI 形式)、imt_mri fort.90: 各プロセスに要した計算時間の出力、imt_time fort.90(大抵 ctime nfx.txt とリネームされる) を見ればモデルの計算時間が分かる。 長期積分や大きな計算をするような場合はこれを目安に実験の計画を立てましょ う。 ○ パラメータカードに関する注意点 ネストして計算する際、水平解像度、時間ステップを変えるだけでは不十分な場 合があります。例えば、 mswsys(16):風の成分の初期値、境界値の取り扱い(風?運動量?) mswsys(19):乱流クロージャーモデル(MYNN?Deardorff?) mswsys(22):対流パラメタリゼーション(必要 or not) など。 他にも、 NAMCLD(Kain-Fritsch 対流パラメタリゼーションに与えるパラメータ) cu lifetime min:深い対流のライフタイム(水平風が 1 格子を横切る時間)の最 小値。単位は秒(例:900 秒:5km) shallow lifetime:浅い対流のライフタイム(水平風が 1 格子を横切る時間)。単位 は秒(例:600 秒:5km) NAMRAD(放射スキーム MSWSYS(13)=¿10 のときに与えるパラメータ:例外 あり) CLD RD:雲量の診断の仕方。”0”: 相対湿度から診断、”1”: 予報した雲水、雲氷 から診断、”3”: 部分凝結を考慮 NAMVAL(その他の制御変数) ratioi, ratioo, ratio2, ruvni, ruvno, ruvn2:外部の値の重み など。 62 第 5. モデルの実行 ■ 実行エラー for ”Team Segmentation fault” 出力されたログを見ましょう。大抵、 ${BINDIR}/fcst nfx ${PARMDIR}/parm 72dx24 mpi > log.fcst mpi などと”log.”というファイルにモニタされているはず(この後、”/log/XXX/”みた いなディレクトリに移動させているかも、あるいは消しているかも)。これを見てど こまで動いたかチェック。入力で落ちたのか、パラメータカード(parm 72dx24 mpi など)の読み込みで失敗したのか、日付が間違っていないか、計算が始まっている か . . . など。また、入力ファイル (org,uvptq... などの初期値ファイル) のエンディ アンの設定が正しくない場合も有り得ます。 ○ 入力ファイルが途中で終わっている、読み込みでエラーが出ている リンクのミス、入力ファイルの作成期間(何日分があるか)とパラメータカード との不整合など。ありがち。エンディアンの設定ミス (big or little) も有り得ます。 ログの出力結果がおかしい時など、要注意。使用したコンパイラによって実行時 オプションが異なるので要注意 (富士通コンパイラ frt など)。 ○ timecard の日付のミス 初期値・境界値に日付が入っており、それと timecard の日付を比べています。間 違っていたら必ず出力に出ます。ちなみに timecard を用いない場合、日付のチェッ クはスキップされます。つまり、日付がたとえ想定しているものとずれていても モデルは動く。 ちなみに、日付が正しく表示されない場合はエンディアンの設定ミスの可能性大。 あるいは、コンパイラの違いに注意 (ifort と frt で実行時オプションが異なる! 環境変数が異なることもある!)。 ○ segmentation fault 良く出力を見るしかないです。気長に。 場合によってはメモリサイズが大き過ぎることがあります。 $ ulimit -s unlimited (bash の場合) と再度実行してみましょう。 また、ネストする際、古いバージョンの”n2n”を使用して jmanhm-rel-02-00 以 降を使うとフォーマットが異なるため、計算が落ちます。新しい”n2n”を使用し て下さい。 ifort を使用している場合、PC(OS) 環境によって大きなメモリサイズを使用する計 算をすると落ちることがあります。この場合、”ulimit”では解決できない。ifort の バージョン 10 以降なら、オプション”-heap-array”を付けて再コンパイル。バー ジョン 9 以前なら、プログラムの書き換え(配列を動的に宣言する)が必要かも。 詳しくは 1 章の ifort でのコンパイル参照。 63 1. モデルの実行 ○ mpi 関連でエラーが出た場合 $ulimit -s 40960 (適切なメモリサイズ、値は場合に応じて) など試す。ジョブが残っていたら”kill”で処理。 経験上、smp(cpu が 2 つ以上) の WS で大きなメモリサイズでモデルを実行すると 落ちるらしい (mpich version1)。 mpicomm.f90 の一部を修正すれば上記の問題は解決(配列を allocate すれば良い)。 mpi で大きなメモリサイズを実行しても OK。mpi の通信関連?で使用するメモリ サイズが引っ掛かっていることもあります。その際はエラーメッセージに出るは ず。 export P4 GLOBMEMSIZE=134217728 などを実行シェルの中に書けば OK。メモリサイズの最大値は mpich をインストー ルしたときで決まる。基本は 256MB だったはず。 ○ CFL 条件 it= 11 estimated dtuv= 540.66458460212 at 2 71 29 estimated dtw = 124.74612572233 at 22 60 2 estimated dtg = 35.73517748443 at 32 69 2 it= 12 estimated dtuv= 530.00000000000 at 58 45 2 estimated dtw = 0.00000000000 at 59 45 2 estimated dtg = 34.04271616602 at 67 46 2 格子位置 ( x, y, z) it= it= it= 11 ←水平風の CFL 11 ←鉛直風の CFL 11 ←重力波の CFL it= it= it= 12 12 12 となった時は大抵 CFL で引っかかったと思って下さい。”DT”を適切に変更。ち なみに上の数字は適当。 ○ パラメータカード関連 経験談。番号変えるだけで動くかも。できればちゃんと理由が知りたい。 mswsys(2, 4, 5):側面境界の計算法。放射条件の時うまくないと不安定に。他 のパラメータとの兼ね合い。 mswsys(13):放射仮定。地面傾斜を考慮した 9, 11, 13 でよく引っかかることが。 10 番もたまに。 mswsys(16):風の成分の初期値、境界値の取り扱い。運動量に密度をかけて値が 小さくなり過ぎる。 mswsys(17):重力波のスプリット。高解像度実験 (1km 以下) で使用しないのが基 本。 64 mswsys(18):雲物理。マイナーな設定で引っかかることが。 mswsys(19):乱流クロージャーモデル。まれに引っかかることが。 mswsys(20):HIVI か HEVI か。mpi 使用時に特に注意。2 次元分割時は HIVI は駄 目。 mswsys(23):気圧の境界条件。SBC は 2 次元分割未対応。と、IO エラーがたまに。 2 パラメータカード とても書き切れないです。なので以下のパラメータカードの詳細を参照。 http://wind.geophys.tohoku.ac.jp/ sawada/Nhm manual/namelists/fcst namelist.html 大まかに設定している内容は、 モデルの水平・鉛直解像度、格子数、積分時間など 使用するパラメタリゼーションの選択 各パラメタリゼーションの詳細な値の設定 出力する物理量の選択 という感じ。 ○ mpi 使用時の注意点 1 次元分割(y 方向のみ)は特に気にせずに。2 次元分割する際は mswsys(20)=2 (HE-VI)とすること。かつ& NUMGRD の x num y num, z num を適切に変更す ること。num はプログラムの中で宣言されている (ios.f90) ため、プログラムを修 正後に再コンパイル(make fcst nfx など)すること。沢田仕様の場合、num も namelist から入力できるようにしている。(パラメータカードをそのまま使うとへ ちょります) ○ 放射計算 mswsys(13) が放射スキームの種類。10,11 は”band.dat”が必要。 ln -s band.dat fort.31 ←特に番号を指定しない場合(デフォルト) とすること。12,13 は”band2004.dat”が必要。NAMRAD のパラメータ”OZON=1” を使う時は”ozn t42l68 clm.dat” これらのファイルは、 front:/home/u tohoku/Nhm/Const/ /mnt/sky1/sawada/Nhm-v15/Const/ のどちらかからコピーして下さい。 ○ 境界条件 (SBC) について パラメータカードのモードスイッチ、mswsys(23)=2 (気圧の境界条件) を使用 65 2. パラメータカード すると、上部、側面にレイリーダンピングを使用。 これを mswsys(23)=12 などと設定すると、Spectral Boundary Coupling (SBC) を使用することができる。この場合、気圧ではなく u, v, pt に波数の小さ い成分 (波長の大きい成分、大規模スケールの構造) を親モデルから引き継ぐよう にしますつまり、物理空間だけで境界条件を与えるのではなく、波数空間でもネ スティングを行う (= SBC)。これによって現象の再現性を向上できる、らしい。 式で書くと、 uout = uLout + uSout uin = unew in = uLout uLout + + uSout uSin に分離 に分離 out は親モデル (outer model or coarse mesh model), in は子モデル (inner model or fine mesh model), L は large scale 成分 (計算領域に対する波数 6 まで)、S は small scale 成分を表す。NHM にも SBC が組み込まれていましたが、現在の公開 版 (jmanhm-rel-02-00.tgz) では正常に動作しませんでした。で、このバグを修正し たソースファイルを以下に置いておく。 ※ mpi を使用して 2 次元分割して計算しても, 結果は一致。 /mnt/sky1/sawada/nhm v2 ds3 == SBC のみ使用したい場合 == fft.f90, sbc.f90 は上書き、nhmvar.f90, pre.f90, main.f90 は適宜編集 (diff を使えば 分かるかも) して下さい。SBC が必要かどうかは積分時間と計算領域のサイズ次 第。長期積分用 (1 日以上?) &大きいスケール用 (100km 以上?) とか。狭い領域 での高解像度の計算や数時間程度の積分ならあまり有り難味はないかと。 == SBC の設定に関するパラメータ == SBC をかける波数 (6 = mm & nn, nhmvar.f90)、時間間隔 (50step = itbdSBC, nhmvar.f90)、高度 (5000m : kms, pre.f90) はソースコード内で定義されてます。変 更したい場合はソースコードを修正&再コンパイルして下さい。 ○ 地表面過程:SiB(SImple Biosphere) を使用する場合 mswsys(1) が地表面過程のパラメータ。一の位が”9”の時、SiB を使用。 SiB を使用するには以下の 2 つのファイルが必要。 fort.32: SiB に必要なデータ (GLCC SiB)、imt glcc sib(default:32) fort.XX: SiB に必要なデータ (gsm.veg.v12.d)、imt gsm9603 veg=XX などを設定する必要があります。GLCC SiB は地形作成と似たような作業で出来 る。gsm.veg.v12.d は GSM-MJ98 で使用する SiB 用の入力ファイル(小玉くんよ り)。 GSM9603.VEG は気象庁 (?) で使用されている SiB 用の入力ファイル(長澤さん 66 より)。若干、中身が違うようです。 ○ ネストする場合 前節を参照。 3 実行条件(初期値、解像度、パラメータ)を変えたい テストランは動いたから、実行のさせ方(初期値・解像度・パラメータ)を変 えたい時は、それぞれ変更すればよい。 ○ パラメータの変更 一番これが単純だが、何が起きているか一番分かり辛いかも。前の節にも書いた ようにパラメータカードの数字を変えれば良い。MSWSYS を変更すれば使用し たいパラメタリゼーションを選択できる。より細かいパラメータを変更したい場 合は、 &NAMVAL: 側面境界条件、ダンピング、非線形拡散などの強さ &NAMCLD: 微物理過程、KF、Grell、湿潤対流調節 &NAMRAD: 放射計算 をそれぞれ変更すれば良い。 前節も参照。 ○ 初期値の変更 パラメータカードの変更も必要だが、初期値そのものの作り直しが必要。日付の 変更を忘れずに。既に作成した初期値の中に予報時間が含まれているなら計算の 開始時間(&NAMMST の中の KTSTO)をずらすだけで良い。 ○ 解像度の変更 パラメータカードの DX, DY, DXL, DXR, DYL, DYR, DZ, DZL, DZR などの変 更が必要。また、初期値の作り直しも必要。Z 方向の格子間隔の決め方だが、まず DZ の増分は (DZR-DZL)/(NZ-2) で最下層の格子間隔が DZR。つまり標準設定の ままならば、DZL=40m, DZR=1120m, NZ=38 なので、 (DZR-DZL)/(NZ-2) = 30m なので, DZ = 40, 70, 100,. . .1060, 1090, 1120m となる。その際、初期値を作るのに必要なパラメータ(水平・鉛直格子)の変更 を忘れずに。地形も作り直す。 4 鉛直層の切り方 鉛直層がどのように設定されるかをチェックするツール。 /mnt/sky1/sawada/Nhm-v15/Tools/ver levels/script/check v2.sh 67 4. 鉛直層の切り方 /mnt/sky1/sawada/Nhm-v15/Tools/ver levels/src/ 使い方は、 $ script/check v2.sh で OK。中を見れば変数の設定はなんとなく分かるかと。と言いつつ、以下に概略。 !----- ここから ------------------------------------------------### compile cd $srcdir ifort func.f90 ver_levels_v2.f90 ←コンパイル cp a.out $wkdir cd $wkdir ### run ./a.out <<EOF ←実行 &numgrid nz=61, ←鉛直層の数 dz=100, ← iz1 と iz2 の間の鉛直層の厚さ (m) dzl=20.0, ←最下層の鉛直層の厚さ (m) dzr=1000.0, ←最上層の鉛直層の厚さ (m) iz1=18, ← 1 層目から iz1 まで dzl から dz まで線形に増加 iz2=45 ← iz2 から nz まで dz から dzr まで線形に増加 &end EOF mv fort.20 dz.txt ←出力結果 !----- ここまで ------------------------------------------------出力中の各変数はプログラム参照。 68 69 第 6 章 出力の変換と作図 1 データの変換の仕方 (nhm2grads) ここでは NHM の出力が MRI フォーマットであるとします(講座標準)。Nusdas 形式の場合、”Tools/pandah”などを使うこと。こちらなら直接データを読んで作 図することが出来る。 ※ nhm2nc に以降予定。よって、 MRI 形式→ grads 形式の変換を実行するシェルは ds3:/home/test/4cast-cron/postprocess/script/n2gr 72dx24.sh /mnt/sky1/sawada/Nhm-v15/Tools/nhm2grads/n2gr new.sh (自分用) など参考。使い方は、 $ n2gr new.sh 72dx24 00UTC (自分用) 一応、側面に見られた不具合(変な値)は修正済み。原因は側面の内挿の不具合 による。(2006/12/15) ※地形と 2,3 次元物理量の格子位置がずれていたので修正 (2007/02/07) Thanks. chen-san. ※ z*系の平面図は意味分からないのでなるべく p 面, z 面に変換した方が好ましい かと。鉛直方向の内挿か p 面、z 面直接内挿を参照。 ※ nhm2grads の更新 (2007.07.16) 2 次元物理モニタの変換を追加しました。具体的には、 U10 : 高度 10m の東西風 V10 : 高度 10m の南北風 TS : 地表面温度? SOLAR: 日射(dswb-uswb) DLWB : 全下向き長波放射@地表 DSWB : 全下向き短波放射@地表 ULWT : 全上向き長波放射@大気上端(OLR に相当) TSOLA : 積算した日射 TDLWB : 積算した全下向き長波放射@地表 1. データの変換の仕方 (NHM2GRADS) CLL : 下層雲量? CLM : 中層雲量? CLH : 上層雲量? 変換シェルの使い方は今まで通り。DSWB, ULWT はモデルの出力を追加して いる場合に使用可能。”/mnt/sky1/sawada/Nhm-v2-00/Module/Src/JMANHM/” を使用すれば出力できる。個人的に追加したい場合は”rad3 uni both.f90, ios.f90, main.f90”などを修正して下さい。また、新しい NHM を使用した場合、QH =ひょ う、QG =あられとなります。勘違いしないように。まぁ、あまり見ないですか ね? namelist の設定はシェルを見ての通り。格子数、日付、中心位置などを適切に修 正すること。これらはモデル実行時に使用したパラメータカードで分かるはず。 NHM で出力されたファイルを”fort.62(mri フォーマットの output)”にリンクを張 る。例えば ln -s output 72dx24 00UTC 20061011 fort.62 以下、namelist の例。(古いバージョンより変数が一部増えているので注意) ----- 以下、script --------------------------------------------------------./nhm2grads <<EOF &namgrd nx0=72,ny0=72,nz0=38, ←実行したモデルの格子数 itst=0,iten=3,itdt=60 ←変換を始めるステップ, 終了するステップ, ISTR_MRI と同じ(ステップ数) &end &namswitch igoption1=2, itf=0 &end ←鉛直不等間隔なら"2" &namctl goption1=’options big_endian’, ← ctl ファイルのオプション goption2=’no’, ← gtime0="18z${DATE_yD}${MONTH}${DATE_yY}" ← ctl ファイルの日付 &end &namgrads cfile3d=’grads3d.ctl’,dfile3d=’grads3d.grd’ 70 ← 3 次元データの grads 形式のファイル名 cfile2d=’grads2d.ctl’,dfile2d=’grads2d.grd’ 形式のファイル名 cfilezs=’gradszs.ctl’,dfilezs=’gradszs.grd’ 式のファイル名 &end ← 2 次元データの grads ←地形データの grads 形 &nammproj mpsw=2, ←マップファクターのタイプ(MER,LMN,PSN) xlat=38.0,xlon=138.0, ←計算領域の中心位置 slato=38.3,slono=141.0 ←基準位置 &end &namelm ival3d=1,2,3,4,5,6,7,16,17,18, ival2d=1,2,3,4,5,6,7,10,11,12, ivalzs=1,2,3,4 &end EOF ※注意点、追加事項。 slato: 元々は"slono"しかなかったが mercator に対応するため追加。 mpsw=0: model 格子でそのまま出力、つまり水平内挿をしない。 =1: mercator 図法を考慮して内挿。 =2: lambert 図法を考慮して内挿。 2 プログラム (nhm2grads) 以下のディレクトリの中のプログラムについて /mnt/sky1/sawada/Nhm-v15/Tools/nhm2grads/ nhm2grads_new.f90: プログラム本体 parm.f90 : 定数の宣言 common.f90 : 共通の変数の宣言(dt, dx など) congrid.f90 : 格子数などの宣言(nx, nx2 など) chk.f90 : 最大値・最小値、undef のチェックなど 71 2. プログラム (NHM2GRADS) grads.f90 : ctl ファイルの作成 utility.f90 : NWP のツール。各緯度経度の格子、2 次元内挿の計算。 makval.f90 : MRI 形式の読み込み、物理量に変換、z^{*}→ z(実地形) の変換 (未使用) 注意点 風 3 成分(u, v, w)は元々は staggard grid 上の値。つまり、スカラー量(気温や 湿度、雲水など)と格子点位置が違います。出力する際に内挿して格子点位置を 合わせています。 出力される格子数は元の格子数より少なくなります。というのは、緯度経度座標 に切り直すためです。図参照。もし、計算格子点そのまま出力したい場合は古い ソースプログラム(nhm2grads new.f)を使用すること。 図 6.1: 地形と緯度経度。 鉛直方向には仮想の座標系(z*:地形に沿った座標系、terrain following)を使 用しています。なので、実際の地形(z)と高さが異なります。地形に沿った座標 系は、 H(z − zs ) (6.1) z∗ = H − zs 72 これを実際の高度に直すには z = zs + 3 H − zs ∗ z H (6.2) データ変換 (nhm2nc) ■ ツールの概要 nhm の出力を grads 形式か netcdf 形式に変換するツール (nhm2grads の拡張版と 思ってもらえば OK)。最近、実験のサイズが大きくなってきたようなので、デー タを圧縮する 1 つの方法として netcdf なら grads で開けるので、使えるかな、と (ただし、3 次元データのみ netcdf 形式に対応)。model 面 (zstar) 出力ではなく、p 面、z 面出力も直接出来ます。出力できる変数をモデルに含まれるものは全て可能 にしました。(一部意味の分からない変数もありますが) ちなみに、前より動作が ちょっと速いかもしれません。ついでに、バグも多いかもしれません。 ○ このツールで出来る事 MRI 形式の出力結果を grads 形式 (バイナリ直接探査形式)、netcdf 形式に変換 格子座標 (ランベルト、ポーラーステレオなど) を緯度経度座標に変換(水平内挿) 任意の緯度経度座標に変換(水平内挿) モデル面 (z*面) を p 面、z 面に変換(鉛直内挿) 出力間隔の自動認識(実は itst, itdt とかを設定しないでも良いかも) ○ このツールで出来ない事 NUSDAS 形式の変換 温位面への変換 ■ 必要なファイル ソースファイルとスクリプトは以下にあります。stream からのみアクセス可。 /mnt/disk1/Tools/nhm2nc/src /mnt/disk1/Tools/nhm2nc/script/ 以下のファイルは古いので要注意。 /mnt/sky1/sawada/Nhm-v15/Tools/nhm2nc/src /mnt/sky1/sawada/Nhm-v15/Tools/nhm2nc/script/ 以下、簡単な作業手順 (使い方: How to use nhm2nc)。 $ $ $ $ cd nhm2nc/src/ make cd ../ sh script/sample.sh 73 3. データ変換 (NHM2NC) ■ シェルの具体例 簡単にシェル (sample.sh) に関するコメント。出力変数の一覧 はシェルに付いています。 -------------------------------------------------------------------------### link ln -s output_122x1.5 fort.62 ← NHM の出力ファイルにリンク ### compile ← netcdf ライブラリを使用してるのに注意 cd ${SRCDIR} make nzvi=13 ← p 面 or z 面に内挿する際の層数。 ↓各気圧面 or 各高度 zref="1000.0, 975.0, 950.0, 925.0, 900.0, 850.0, 800.0, 750.0, 700.0, 650.0, 600 ### run ./nhm2nc <<EOF &namgrd ←格子数、時間ステップの設定 nx=122,ny=122,nz=38, itst=0,iten=24,itdt=600 &end &nammap ←モデルに入力した地図投影法、緯度経度 mprojc=’LMN’, ←地図投影法 clat=38.35, clon=140.55, ←中心緯度経度 slat=38.26, slon=140.84 ←基準緯度経度 &end &namintp ←出力 (変換) 形式 sw_mp=’LL’, ← lon-lat 座標 sw_vc=’p’, ←鉛直座標系 (p 面, z 面, model(zstar) 面) nzvi=$nzvi, ← p 面か z 面の場合の鉛直格子数 zref=$zref, ← p 面か z 面の場合の各鉛直層レベル sw_fmt=’nc’ ← netcdf 形式、grads 形式 (gr) &end &namctl ← grads 形式用のオプション設定 74 goption1=’options goption2=’no’, &end big_endian’, &namgrads ← grads 形式用のファイル名 cfile3d=’grads3d.ctl’,dfile3d=’grads3d.grd’ cfile2d=’grads2d.ctl’,dfile2d=’grads2d.grd’ cfilezs=’gradszs.ctl’,dfilezs=’gradszs.grd’ &end &namelm ←出力する 3, 2 変数 ival3d=1, 2, 3, 4, 5, 6, 10, 11, 12, ival2d=1, 2, 3, 8, 9, 10, 23, 24, ivalzs=1, 2, 3, 4, ivalad=4, 5, 6, ivalvi=1, 2, 3, 5 end EOF -------------------------------------------------------------------------■ namelist についての補足 &namgrd nx,ny,nz : NHM で使用した格子数。 itst,iten : データ変換の開始時間、終了時間、時間ステップ数を指定 (例:ITEND=1440,ISTR_MRI=180 ならば iten=8)。省略可。 itdt : モニター出力のステップ間隔 (ISTR_MRI に相当)。省略可。 itst,iten,itdt を省略すると 999step(+初期値) までの全ての時間を変換する。 ctl ファイルの時間数は 1000 となる。 &nammap mprojc : モデルで使用した地図投影法 ’LMN’=ランベルト, ’MER’=メルカトル, ’PSN’=ポーラーステレオ, ’GRID’=グリッド : テストラン用 (線形山岳波や地形性降水など) clat,clon : 計算領域の中心緯度経度 slat,slon : 基準緯度経度、ランベルト図法で使用。 75 3. データ変換 (NHM2NC) &namintp ←出力 (変換) 形式の詳細な設定 sw_mp : 変換したい (水平) 座標系の指定. ’LL’=lon-lat 座標 (デフォルト), 水平内挿する。 ’OR’ or ’GR’=モデルの座標 (格子) そのまま. 水平内挿なし。 sw_vc : 変換したい鉛直座標系の指定. ’p’=気圧面, ’z’=高度面, にそれぞれ鉛直内挿。 ’m’=モデル (zstar) 面 (地形に沿っているので高度ではない!), 鉛直内挿 なし。 sw_vc=’p’ の時、第 1 層にモデル面の 1 層目を出力する。 よって、出力される鉛直層数は"nzvi+1"となる。確認用。 nzvi : p 面か z 面の場合の鉛直格子数 (任意に設定) zref : p 面か z 面の場合の各鉛直層レベル (任意に設定) sw_fmt : 変換したデータの形式 ’nc’=netcdf 形式, ’gr’=grads 形式 ※以下の 6 つの変数は sw_mp=’LL’ の時のみ有効。省略可。 lonst, latst : 変換する領域を任意に指定。領域の南西 (左下) の緯度経度を 指定。 lonen, laten : 変換する領域を任意に指定。領域の北東 (右上) の緯度経度を 指定。 dlon, dlat : 緯度経度の間隔を任意に指定。 例:緯度 [37.6-39.0], 経度 [139.6-141.4] の範囲を 0.01 度で間隔で出力。 lonst=139.6, latst=37.6, lonen=141.4, laten=39.0, dlon=0.01, dlat=0.01 &namctl ← grads 形式用のオプション設定 goption1=’options big_endian’, goption2=’no’, time_unit : ’UTC’=UTC で初期時刻を出力、’JST’=JST で初期時刻を出力 (grads 的には正しくない)。 &namgrads ← grads 形式用のファイル名. 省略可。 cfile3d=’grads3d.ctl’, dfile3d=’grads3d.grd’(デフォルト) cfile2d=’grads2d.ctl’, dfile2d=’grads2d.grd’(デフォルト) cfilezs=’gradszs.ctl’, dfilezs=’gradszs.grd’(デフォルト) nc3d=’nc3d.nc’ (デフォルト) 76 &namelm ival3d: ival2d: ivalzs: ivalad: ivalvi: ←出力 (変換) したい変数の指定 3 次元変数, モデルに格納されている 3 次元変数 2 次元変数, モデルに格納されている 2 次元変数 2 次元変数, 地形関係 3 次元変数, 相対湿度、相当温位など計算値 2 次元変数, 鉛直積算した各水物質量 シェルのサンプル。 sample.sh sample_ds3_1.5.sh lmwv_for_testrun.sh gsnow_for_testrun.sh sample_mochi.sh check_nc.sh イルチェック。 : : : : : : 適当なサンプル DS3 の 1.5km 予報値の変換用サンプル 線形山岳波の計算結果の変換用サンプル 地形性降水の計算結果の変換用サンプル mochi 用サンプル netcdf ライブラリのパスが正しいかチェック。コンパ ■ メモ 今後、nhm2nc を中心に使う予定なので、nhm2grads はメンテナンスはほぼ行い ません。 2008/6/3 4 プログラム (nhm2nc) nhm2nc のディレクトリの中のプログラムについて /mnt/sky1/sawada/Nhm-v15/Tools/nhm2nc/src/ nhm2nc.f90 : プログラム本体 nhmvar.f90 : 変数の宣言、動的メモリの確保、grads の ctl ファイル作成。 subroutine var_alloc(nx,ny,nz) subroutine var_alloc_int(nxi,nyi,nz,nzvi) subroutine init_parameter(numzs,num2d,num3d,numad,numvi,nvar,mprojc) subroutine set_output_size(nx,ny,nz,nxi,nyi,nzvi, & & nxen,nyen,nzst,nzen) subroutine gr_init(numzs,num2d,num3d,numad,numvi,nxen,nyen,nzst,nzen, & & goption1,goption2,time_unit,itst,iten,itdt,dt,idate, & & cname_all,io_flag,cfilezs,cfile2d,cfile3d,dfilezs,dfile2d,dfile3d, & & omt1,omt2,omt3,sw_fmt) 77 4. プログラム (NHM2NC) subroutine makectl(cname_all,io_flag,cfile,dfile,goption1,goption2, & & time_unit,itst,iten,itdt,dt,idate,octl) subroutine outputzs(cname_all,numzs,num2d,num3d,numad,numvi, & & nxen,nyen,nnz,omt) parm.f90 : 定数の宣言 utility.f90 : NWP のツール。各緯度経度の格子、水平、鉛直方向の内挿の計算。 subroutine rltln(gi,gj,rlat,rlon,nprojc,dels,slat,slon,xi,xj,xlat,xlon ) subroutine ntransg2 (u,v,flatu,flonu,flatv,flonv, & & nxi,nyi,nzi,slon,sloni,mprojc,mprom) function cck(npro) subroutine intpl2d(nx,ny,nxi,nyi,fi,fj,mask,wk,wki) subroutine intpl3d(nx,ny,nz,nxi,nyi,fi,fj,mask,wk,wki) subroutine zstar2z(nx,ny,nz,nzr,zr,zref,zs,cvar,wk,wkz) subroutine sfc_val(nz,wk,zr,zref,zsfc,cvar,wkz) subroutine zstar2prs(nx,ny,nz,nzp,prs,plev,psea,wk,wkp) subroutine ver_int(nx,ny,nz,wk,wk2d) io.f90 : MRI 形式の読み込み、物理量に変換、z^{*}→ z(実地形) の変換 (未使 用) subroutine readwrite_nhm(itst,iten,itdt,imt,omt2,omt3,orec2,orec3, & & nx,ny,nz,nxi,nyi,nzvi,nxen,nyen,nzst,nzen,nvar, & & cname,io_flag) subroutine read_header_nhm(imt,nx,ny,nz,nxi,nyi,nzvi,idate) subroutine read_nhm(wk,io_flag_2d,io_flag_3d,io_flag_vi,cvar, & & imt,nx,ny,nzo,it) subroutine read_nhm_2d(imt,nx,ny,it) subroutine read_nhm_prs(imt,nx,ny,nz,wk,prs) subroutine convert_and_output_3d(wk,nx,ny,nz,nxi,nyi,nzvi, & & nxen,nyen,nnz,nzst,nzen,nvar,iv,it,itst, & & cvar,omt,orec) subroutine convert_and_output_2d(wk,nx,ny,nz,nxi,nyi, & & nxen,nyen,nnz,nzst,nzen,nvar,iv,it,itst, & & cvar,omt,orec) subroutine unpack(wk,mt,nx,ny,nz) subroutine output(nxen,nyen,nz,orec,omt,wko) subroutine cvar_io_check(nz,imt,io_flag,cname_all,itst,iten,itdt) 78 subroutine copy_output_array(nx,ny,nz,nxen,nyen,nnz,nzst,nzen,wki,wko) subroutine copy_wk_array(cname,nx,ny,nz,div,vor,epv,rh,ept,temp,wk) subroutine copy_wk2d_vi(io_vi,nx,ny,wk2d) subroutine date_cal(idate,ktsto) subroutine skip_reading(imt,nzo) tools.f90 : 変数の変換、マップファクターの計算 subroutine conv_dns(wk,dns,nx,ny,nzo) subroutine conv_mom_v(wk,dns,u,nx,ny,nzo,isw) subroutine conv_prs(prs,pairf,wk,nx,ny,nzo) subroutine makemoist(pt,qv,prs,rh,ept,temp,nx,ny,nz) subroutine cfmap ( nx, ny, mprojc ) subroutine cfmap_core ( nx, ny, mprojc, projection. & & slat1, slat2, flat, fmap ) nc_tools.f90 : netcdf 関連の処理。 subroutine nc_init(ncid,nc3d,nx,ny,nzst,nzen,itst,iten,itdt, & & num2d,num3d,numad,numvi,nvar, idate,cvar,io_flag) subroutine writetime(ncid,time_id,nt,time) subroutine output_nc(ncid,var_id,nx,ny,nz,it,iwk) subroutine conv_r4_to_i2(sw_vc,nx,ny,nz,vmin,vmax,wko,iwk) subroutine nc_file_close(ncid) subroutine check_err(iret) ■ メモ 自分用メモ。 モジュールを折角使っているのに、サブルーチンの引数多過ぎ。ガッカリなプロ グラムです。作者 (swd) のセンスが問われます。 5 任意の鉛直断面への内挿 (nhm2ver) NHM の出力 (MRI フォーマット) から直接、任意の鉛直断面を切り出すツール (nhm2ver)。grads 形式で出力。必要なプログラム、シェルは、 /mnt/sky1/sawada/Nhm-v15/Tools/nhm2ver/ にある。 使い方は、はじめにプログラムをコンパイル。コンパイルが正常に出来たらシェ ル (nhm2ver.sh) を参照。以下、具体的な手順。 79 5. 任意の鉛直断面への内挿 (NHM2VER) $ $ $ $ cd nhm2ver/src/ make cd ../ sh script/nhm2ver.sh シェルの変数の意味は nhm2grads や nhm2nc と大体同じ。以下にシェルの簡単 な説明を記述。 --------------------------------------------------------------#!/bin/sh #### variable setting & directory export date=20080112 export NHMDIR=/mnt/sky1/sawada/Nhm-v15 export VERDIR=${NHMDIR}/Tools/nhm2ver export GPVDIR=/mnt/raid2000/ds3_data/output/${date}_18JST export WKDIR=${VERDIR}/work_ds3_${date}\1,5km export SRCDIR=${VERDIR}/src #### if [ ! -d ${WKDIR} ]; then mkdir -p ${WKDIR} fi cp ${SRCDIR}/nhm2ver ${WKDIR}/ cd ${WKDIR}/ #### link ln -s ${GPVDIR}/output_122dx1.5 fort.62 lon_st=140.20 lon_en=140.92 lat_st=38.45 lat_en=38.05 nxi=200 nzvi=30 zref="10.0, 20.0, 40.0, 70.0, 100.0, 130.0, 160.0, 190.0, 220.0, 250.0, 300.0, 3 80 #----- run ---------time ./nhm2ver <<EOF &namgrd nx=122,ny=122,nz=38, itst=0,iten=16,itdt=400 &end &nammap mprojc=’LMN’, clat=38.38, clon=140.99, slat=38.38, slon=140.00 &end &namintp ←※下記に変数の設定補足 sw_vc=’z’, ←鉛直座標の指定: "z" or "p" nxi=$nxi, ←断面に沿った水平方向の格子数 nzvi=$nzvi, ←鉛直方向の格子数 zref=$zref, ←鉛直層のレベル, 単位: "m" or "hPa" lon_cen=${lon_cen}, lat_cen=${lat_cen}, ←断面の中心位置 distance=${distance}, angle=${angle} ←中心からの距離 (km), 角度 &end &namgrads cfile3d=’grads3d.ctl’,dfile3d=’grads3d.grd’ goption1=’options big_endian’, goption2=’no’ &end &namelm ←出力したい変数: ival3d は出力に含まれるもの,ivalad は計算す るもの ival3d( 1)=1, ival3d( 2)=2, ival3d( 3)=3, ival3d( 4)=4, ival3d( 5)=5, ival3d( 6)=0, ival3d( 7)=0, ival3d( 8)=0, ival3d( 9)=0, ival3d(10)=0, ivalad( 1)=1, ivalad( 2)=2, ivalad( 3)=3, ivalad( 4)=4, ivalad( 5)=5, ivalad( 6)=6, ivalad( 7)=0, ivalad( 8)=0, ivalad( 9)=0, ivalad(10)=0 &end 81 6. 鉛直方向の内挿(Z*→ P-LEVEL, Z-LEVEL, PT-LEVEL) EOF --------------------------------------------------------------- ■断面位置の設定の仕方 (2 通り) どちらかの設定をすればよい。 ○中心位置を決めて、そこからの距離と角度を指定する方法 lat cen, lon cen: 断面の中心緯度経度 distance: 中心からの距離 (単位:km) angle: 断面の角度 (単位:度)。東が 0 度、北が 90 度、西が 180 度 (-180 度)、南が-90 度。 ○断面の始点と終点の緯度経度を指定する方法 lat st, lon st: 断面の始点の緯度経度 (x=1) lat en, lon en: 断面の終点の緯度経度 (x=nxi) 6 鉛直方向の内挿(z*→ p-level, z-level, pt-level) 鉛直座標は z*なので、地形がある場合、水平断面を描くと異なる高度を表示す ることになる。つまり、grads で”set z 10”とした場合、たとえ z=1460m でも地点 によって実際の高度は異なる。そこで、同じ高度、あるいは同じ気圧面で水平面 を表示したい場合は鉛直方向に内挿しなければならない。 変換ツールは、 /mnt/sky1/sawada/Nhm-v15/Tools/zstar2prs/ の中の”src/”,”script/”をコピーして使えば OK。 鉛直座標変換シェルは主に以下のことを実行、設定します。 1. grads の ctl ファイルから格子数、緯度経度、変数を読み取る。 2. 気圧面内挿 (cver=p) or 高度面内挿 (cver=z) or 温位面内挿 (cver=t) が可能。 3. 鉛直座標面 plev=”950.0 900.0 850.0 700.0...”のように設定。 鉛直座標変換のシェルの使い方 ”zstar2prs.sh”の中の概要を説明(一部省略)。 ----- 以下、script --------------------------------------------------------#!/bin/sh 82 ### variable definition : 変数の設定 export LANG=EN export GRADSDIR=grads_72dx30_20050620 export HMDIR=/mnt/sky1/sawada/Nhm-v15/Tools/zstar2prs export SRCDIR=${HMDIR}/src export WKDIR=$HMDIR/work if [ ! -d $WKDIR ]; then mkdir -p $WKDIR fi ### compile : プログラムのコンパイル cd $SRCDIR ifort -assume byterecl -o read_grads_prs read_grads_prs.f90 interp.f90 if [ ! -f read_grads_prs ]; then echo ’compile failed!!!’ exit fi cp read_grads_prs $WKDIR ### link: grads data <=> fort.XX : リンクを貼る cd $WKDIR echo ${GRADSDIR} if [ -f fort.13 ]; then rm -f fort.11 fort.12 fort.13 fort.20 fort.51 fi ln -s ${GRADSDIR}/grads3d.ctl fort.20 ← 3 次元データの ctl ファイルへ リンク ln -s ${GRADSDIR}/grads3d.grd fort.13 ← 3 次元データの grads ファイル へリンク ln -s ${GRADSDIR}/gradszs.grd fort.11 ←地形データの grads ファイルへ リンク 83 6. 鉛直方向の内挿(Z*→ P-LEVEL, Z-LEVEL, PT-LEVEL) ### grid number setting (don’t edit) : ここは編集しない! nx=‘grep -i "xdef" fort.20 | gawk ’{print $2}’‘ ny=‘grep -i "ydef" fort.20 | gawk ’{print $2}’‘ nz=‘grep -i "zdef" fort.20 | gawk ’{print $2}’‘ nt=‘grep -i "tdef" fort.20 | gawk ’{print $2}’‘ nv=‘grep -i "vars" fort.20 |grep -v "endvars" | gawk ’{print $2}’‘ zlev=‘grep -i "zdef" fort.20 | gawk ’{print $2}’‘ ctl_line=‘wc -l fort.20|gawk ’{print $1}’‘ export F_UFMTENDIAN=big ### p-level or height-level (edit properly) # number of vertical level nzp=10 ←鉛直内挿する鉛直層の数 # type of vertical coordinate cver=p ←鉛直座標の種類 p:気圧座標, z:高度座標, t:温位座標 #### each levels ## pressure [hPa] ↓内挿したい各等圧面 plev="950.0, 900.0, 850.0, 800.0, 700.0, 600.0, 500.0, 400.0, 300.0, 200.0" ## height [m] ↓内挿したい各高度面 #plev="100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 800.0, 1000.0, 1200.0, 1500.0, 00.0, 4000.0, 5000.0, 6000.0" ## isentropic [K] ↓内挿したい各温位面 #plev="300.0, 305.0, 310.0, 315.0, 320.0, 325.0, 330.0, 335.0, 340.0, 345.0, 350 ### run ./read_grads_prs <<EOF >& log_zstar2prs ←内挿プログラムの実行 &namgrd ←変換したい 3 次元データの格子数など。編集しないこと! nx=$nx, ny=$ny, nz=$nz, nt=$nt, nv3=$nv, nzp=${nzp}, ctl_l=$ctl_line &end &namver ←鉛直座標の種類、各鉛直面を指定。編集しないこと! cver=$cver, 84 plev=$plev &end EOF ## move vertically interporated file mv -f ./fort.51 ./grads_${cver}.grd ## create ctl_file ←鉛直内挿したファイルに対する ctl ファイル。 cd $WKDIR undef_line=‘grep -ni "undef" fort.20|cut -c 1‘ undef_new="undef -9999.0" zdef_line=‘grep -ni "zdef" fort.20|cut -c 1‘ zdef_new="zdef $nzp levels $plev" sed sed sed sed s/grads3d/grads_${cver}/g < fort.20 > tmp1.txt "${zdef_line}c ${zdef_new}" < tmp1.txt > tmp2.txt "${undef_line}c ${undef_new}" < tmp2.txt > tmp3.txt ’s/’$nz’/’$nzp’/g’ < tmp3.txt > grads_${cver}.ctl ### end 7 p 面、z 面直接内挿 やっていることは nhm2grads と鉛直方向の内挿を同時にしています。要する に、NHM の出力を直接 p 面あるいは z 面に変換します。変換ツールは、 /mnt/sky1/sawada/Nhm-v15/Tools/nhm p int/ の中の”src/”,”script/”をコピーして使えば OK。ほとんど nhm2grads と同じ。ctl ファイルは nhm2grads 同様、作成される。 (ちなみに僕はあまり必要ないので、や や大雑把です、バグ報告歓迎、修正大歓迎) ----- 以下、script ----------------------------------------------------------#!/bin/bash #---- for Intel compiler --export F_UFMTENDIAN=big export LANG=EN 85 7. P 面、Z 面直接内挿 export SPEC=72dx6 export SUFFIX=00UTC export export export export export DATE_yY=2007 DATE_yM=03 DATE_yD=07 MONTH=MAR DATE_y=${DATE_yY}${DATE_yM}${DATE_yD} export export export export export export export LANG=EN NHMDIR=/mnt/sky1/sawada/Nhm-v15 NtoGR=${NHMDIR}/Tools/nhm_p_int GPVDIR=/mnt/raid2000/ds3/4cast-cron/execution/output/72dx6/00UTC/output_$ GRADSDIR=${NtoGR}/${SPEC}_${SUFFIX}_${DATE_y} SRCDIR=${NtoGR}/src MODDIR=${NtoGR}/module #--- link --if [ ! -d $GRADSDIR ]; then mkdir $GRADSDIR fi echo ${GRADSDIR} cd ${GRADSDIR} if [ -f fort.62 ]; then rm fort.* fi ln -s ${GPVDIR}/output_4cast_${SPEC}_${SUFFIX}_${DATE_y} fort.62 #--- compile --cd ${SRCDIR} ifort -o nhm_p_int -check all -traceback -assume byterecl parm.f90 common.f90 co cp nhm_p_int ${GRADSDIR} 86 cd ${GRADSDIR} #----- run ---------#exit nzp=20 ←内挿する層数 #pref="100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0, 800.0, 900.0, 1000.0" ← z 面の例 pref="980.0, 960.0, 940.0, 920.0, 900.0, 880.0, 860.0, 840.0, 820.0, 800.0, 750.0, 70 ← p 面の例 #time ./nhm_p_int -Wl,-T <<EOF > log_nhm_p_int time ./nhm_p_int <<EOF > log_nhm_p_int &namgrd nx=72,ny=72,nz=38, itst=0,iten=20,itdt=150 &end &namver ←新しく追加した namelist。鉛直方向の設定。上記で設定。 iver=2,nzp=$nzp, ← p 面か、z 面の選択、内挿する層数。 pref=$pref ←内挿する各 level の設定。 &end &namswitch igoption1=2, itf=0 &end &namctl goption1=’options big_endian’, goption2=’no’, gtime0="18z${DATE_yD}${MONTH}${DATE_yY}" &end 87 7. P 面、Z 面直接内挿 &namgrads cfile3d=’grads3d.ctl’,dfile3d=’grads3d.grd’ cfile2d=’grads2d.ctl’,dfile2d=’grads2d.grd’ cfilezs=’gradszs.ctl’,dfilezs=’gradszs.grd’ &end &nammproj mpsw=2, xlat=38.3,xlon=140.5, slato=38.3, slono=141.0 &end &namelm ival3d( 1)=1, ival3d( 6)=7, ival3d(11)=5, ival3d(16)=0, ival3d(21)=0, ival3d(26)=0, ival3d( 2)=2, ival3d( 7)=8, ival3d(12)=0, ival3d(17)=0, ival3d(22)=0, ival3d( 3)=3, ival3d( 8)=9, ival3d(13)=0, ival3d(18)=0, ival3d(23)=0, ival3d( 4)=4, ival3d( 5)=6, ival3d( 9)=10, ival3d(10)=18, ival3d(14)=0, ival3d(15)=0, ival3d(19)=0, ival3d(20)=0, ival3d(24)=0, ival3d(25)=0, ival2d( 1)=1, ival2d( 2)=2, ival2d( 3)=3, ival2d( 4)=11, ival2d( 5)=12, ival2d( 6)=13, ival2d( 7)=16, ival2d( 8)=0, ival2d( 9)=0, ival2d(10)=0, ival2d(11)=0, ival2d(12)=0, ival2d(13)=0, ival2d(14)=0, ival2d(15)=0, ivalzs( 1)=1, ivalzs( 2)=2, ivalzs( 3)=3, ivalzs( 4)=4, ivalzs( 5)=0, ivalzs( 6)=0, ivalzs( 7)=0, &end EOF ○気になるところ • 下層の扱いが不十分。最下層(通常 20m かな)以下では undef になる(下層 10m を出力したければ要修正)。 • 気圧面の場合、地形の下でも外挿した方が RSM,MSM と比べやすい? • プログラムが汚くなった。バグ取りがややしづらい。 88 データの可視化 8 始めに mri 形式→ grads 形式の説明をしましたが、可視化ソフトは grads 以外に も沢山あります。講座内で使用される(された)フリーのツールの例として、 • grads: 気象用の描画ツール • gnuplot: 線が基本、等値線、3 次元なども描ける • ngraph: 線が基本、等値線は描ける、国産、日本語 OK • GMT: 地形などを描くのに優れている。等値線なども OK • pgplot: fortran, c などのライブラリ • dcl: 地球電脳ライブラリの可視化ツール、国産 • plotps: 非静力で使われる ps 作成ライブラリ、簡単そう。 • ncarg: MM5 などで使用、ライブラリ? • vis5d: 3 次元の等値面が描ける、プレゼン用の絵に良いかも • IDV: 3 次元の等値面が描ける、vis5d より高機能かも • R: 基本は統計処理ソフト、超強力らしい grads, gnuplot はドキュメントが web 上にかなりあるので、そちらを参考。GMT もそこそこあります。pgplot はライブラリのため、使い慣れるまでやや面倒かも。 慣れれば何でも出来そう。dcl も pgplot と同様だが、国産なのでマニュアルが日本 語でやや敷居が低いかも。ncarg は謎。R は統計処理に関して非常に優れている。 日本語のマニュアル(メモ)も web 上にある。vis5d, plotps についてのみ簡単な 解説をします。vis5d は個人的好み。上記のツールの中では等値面を描けるのはこ れだけ。plotps は日本語の正規のマニュアル「気象研究所技術報告 第 44 号」を見 るのが一番良い。非常に分かり易い。 8.1 vis5d 1. grads 形式のデータを準備 2. grads 形式 → vis5d 形式 (v5dimport) 89 8. データの可視化 3. vis5d で描画し、絵を調整 4. script (tcl) で適当に保存(手動で保存でも良い) ■インストール 使用環境は”Vine Linux 3.2”、”vis5d+1.2.1”での話。ちなみに”vis5d+”に必要なラ イブラリとして”mesa”や”OpenGL”などの 3 次元描画用ライブラリを準備。”vis5d5.2.tgz”とかならば”Mesa”が含まれているのでそれを利用してもいいかも。但し 古いので、コンパイルが失敗するかも (gcc3 系になったため) vine linux の場合で すが、OpenGL で代用できた気が。と、glut を入れておけばうまくいった気がし ます。 # apt-get install XOrg-libs XOrg-devel XOrg-gl-devel # apt-get install glut glut-devel このあとは、 # # # # tar zxvf vis5d+-1.2.1.tar.gz sh configure ← Makefile の作成 make ←ソースコンパイル make install ←出来た実行ファイルのインストール で OK(vis5d+の場合)。 Centos 4.4? でのインストール 始めに、”sh configure” としたときに、”checking for X ... no”というメッセージが 出て、Makefike が作れない場合は、”/usr/X11R6/include/X11/Intrinsic.h” とい うファイルがないというエラーログ(config.log の中)があるはず。そもそも”xorgx11-devel”がないと/usr/X11R6/include/が空っぽですが。そこで、 # yum install xorg-x11-Mesa-libGL glut glut-devel xorg-x11-devel で X 関係で必要なパッケージをインストール (パッケージの確認は”rpm -qa—grep xorg-x11” などで)。この後は同じ作業、 # sh configure ← Makefile の作成 # make ←ソースコンパイル # make install ←出来た実行ファイルのインストール で良し→ stream にインストールしておきました。 ■データの作成 まずサンプルを以下のリンクに置いておきます。始めに使い勝手を知りたい人の 90 ため。vis5d は基本的に vis5d 専用のフォーマットにしなければならない。しかし、 grads 形式のデータを変換するツール(v5dimport)があるのでそれで簡単に変換 可能。もちろん、任意のデータを読み込んで変換するためのライブラリ&サンプ ルプログラムがあります。 $ v5dimport -path と入力し、”Read file...”をクリックし grads の ctl ファイルを読み込む(ctl を選 んで OK をクリック。ダブルクリックは出来ない)。Rows:, Columns: Max Levels: が正しいことを確認したら、”File name”の入力スペース上にマウスを合わせ、適 当なファイル名を入力し、Make をクリック。これで grads 形式→ vis5d 形式の変 換が行われる。 ※変換ができない時、エラーが出た時。 大抵、変換が上手くいかないのは ctl ファイルが不適切なときです(grads を使用 する上では問題ない場合でも)。以下、ctl ファイルの修正の仕方について。 options template yrev と”options”の項目を書くと引っかかります。以下のように分けて書きます。 options template options yrev 鉛直座標が気圧面だったら基本的に問題ないですが(小数点が入ると失敗するか も)、Z 座標、つまり不等間隔の高度が入っていると異常と見なされて変換が正常 に出来ません。非静力の場合、たいてい鉛直不等間隔でしょうから、引っかかる はず。そこで、 ZDEF 36 LEVELS 0.02 0.06 0.13 0.23 0.36 0.52 0.71 0.93 1.18 1.46 1.77 2.11 2.48 2.88 3.31 3.77 4.26 4.78 5.33 5.91 6.52 7.16 7.83 8.53 9.26 10.02 10.81 11.63 12.48 13.36 14.27 15.21 16.18 17.18 18.21 19.27 などの場合、とりあえずうその高度に書き換えて変換してしまい、それから高度 を修正します。 ZDEF 36 linear 0.0 1.0 などとします。次に高度データを修正するには v5dedit を使います。 $ v5dedit hoge.v5d とすると、”5. Vertical coordinate system”とあるので、”5”を入力して enter. Current vertical coordinate system: 0. Linear, equally spaced km 1. Bottom Bound = 0 km 2. Level Increment = 0.1 km 91 8. データの可視化 とでるので、”0”を入力して鉛直座標系の変更をします。 Vertical coordinate systems: 1. Generic linear, equally spaced 2. Linear, equally spaced km 3. Linear, unequally spaced km 4. Pressure, unequally spaced mb と出るので、”3”を選択し鉛直に不等間隔格子(km 単位)を選びます。この後、”q” を 2 回押して ”Save changes made (y/n)?” と聞かれたら”y”と入力すれば保存 されます。ここまでは鉛直座標系を修正しただけ。次に高度の値を修正する。ほ とんど同様の手順。 $ v5dedit hoge.v5d と入力して、”5”を入力すると、鉛直層数の分だけ選択肢があるのが分かるはず。 これを 1 つ 1 つ選択して直せば OK。つまり、”5”→”1”→”0.02(1 層目の高度)” →”2”→”0.06(2 層目の高度)”. . . →”36”→”19.27(36 層目の高度)”→”q”→”q” →”y” という感じになる。正直面倒です。なので、シェルスクリプトで一度フォーマット を作ってしまいましょう。以下、シェルの例。 http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/v5d z convert.sh を参照。 ----- 以下、script ----------------------------------------------------------#!/bin/sh v5dedit test.v5d <<EOF 5 ←鉛直座標系の修正 0 ←座標系の選択 3 ←不等間隔格子の選択 1 ← 1 層目の変更を選択 0.02 ← 1 層目の正しい高度の入力 2 ← 2 層目の変更を選択 0.06 ← 2 層目の正しい高度の入力 3 ← 3 層目の変更を選択 0.13 ← 3 層目の正しい高度の入力 ... ... ... 32 ← 32 層目の変更を選択 92 15.21 33 16.18 q q y ← 33 層目の正しい高度の入力 ← 33 層目の変更を選択 ← 33 層目の正しい高度の入力 ←座標系の修正モードを exit ←ファイルの修正モードを exit ←変更した結果を保存 EOF ■使い方 コマンドは、 $ vis5d hoge.v5d だけ。オプションをいろいろつけるなら、 $ vis5d hoge.v5d -hirestopo -projection spherical -mbs 300 -hirestopo: 高解像度の地形を使用、やや動作が重い。 -projection spherical: 球面上に図を投影する。他は lambert, stereo など -mbs 300: 使用するメモリサイズが 300MB という意味。データ量の 3 倍が目安 メモリが足りないと、使用中に絵が表示されなくなることが多々あります。 以下、こんな絵が描けます。 Vis5d を起動するとウィンドウが 3 つくらい(2 つは操作用、1 つは表示用)開 きます。適当にボタンを押す”Contour Horiz”,”Colored Vert”など。そのあと”ANIMATE”を押せばアニメーションが見られます。雲のモクモクは”Isosurf”(等値面 の描画) の変数名を押して新たな”Vis5d Control Panel”が出るので、それでしきい 値を調整して”OK”を押す。色は”Isosurf”の変数名を右クリックして RGB および 透過を調整します。 ■ vis5d のスクリプト(tcl) ある決まった動作をさせたい、例えばある角度で見たい、ある拡大率で見たい、連 続して図を保存したい(アニメーションの作成)などをしたい時は tcl というスク リプト言語を用います。正直良く分かっていないので、元々あったサンプルを少 し修正したものを紹介。 以下 grads, ctl, v5d, tcl などのサンプル。一部すでにないかも。 1. 台風の理想化実験の結果:凝結物の等値面 24MB http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/cloud.gif 2. JRA 再解析:温度の等値面 (200K、195K) 1.8MB http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/temp global.gif 93 8. データの可視化 図 6.2: vis5d で全凝結物量の等値面を描画。0.5g/kg(灰色、やや透過), 1.0g/kg(水色) 台風の理想化実験の結果:grads の ctl ファイル、data ファイル、それを vis5d 形 式に変換したファイル。 http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/qt samp.ctl http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/qt samp.grd 103MB http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/qt samp.v5d 25MB JRA の気温を変換したもの。1 年分 http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/t.v5d 85MB vis5d の鉛直座標を書き換えるためのスクリプトの例 (MM5 なら多分必要なし) http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/v5d z convert.sh vis5d のスクリプト (tcl) のサンプル http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/movie.tcl http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/movie rot.tcl http://wind.geophys.tohoku.ac.jp/ sawada/vis5d/iso anim.ctl 8.2 plotps 書き中. . . 使う理由は、 94 • データを読み込めばどんな形式でも描画可能。わざわざ grads を開く必要が 無い。ctl ファイルもいらない • 鉛直座標に Z*, σ 座標系をそのまま使える。 • マニュアルが日本語。日本語の入力も可能らしい。 欠点は、 • 関数を call して全て自分で書かなければならない。面倒。 • 違う水平・鉛直断面を描くにはいちいちデータを読み込まなければならない。 grads で”set x, set y”にあたる作業が面倒。 で、これは非静力に付属している描画ツール。fortran のライブラリ。postscript を 直接出力。あちこち(kplot, pandah, mridraw...)で使用されているみたい。基本 的に必要なものは”Nhm/Module/Src/PREPOST/plotpswk.f”だけ。サブルーチン そのものの解説はしません。マニュアルがあるのでそちらを参照。ここでは、実 際にこの描画ツールを使用している部分を抜き出してどう使われているかをメモ するだけ。 ○ 水平面(contour, shade, hatch など)を書きたい ”topo make/script/step3.dx30.sh”で使用される”read topo make ps.f90” の描画部 分について説明、以下の通り。 ! --- plot postscript image call spsa4v(20) ←装置番号 20 番で ps ファイルを出力 call setdrw(x0,y0,xfct/real(nx-1),yfct/real(ny-1)) (↑図の位置、大きさ。(x0,y0) が図の左下の位置、(xfct,yfct) が図 の大きさで、それを 1 格子辺りの大きさに直している) call setbar(1,x0+xfct*1.02,y0,x0+xfct*1.07,y0+yfct*0.7,yfct*0.03) (↑カラーバーの設定。x0∼y0+yfct*0.7 はカラーバーの左下の (x,y) と右上の (x,y)、yfct*0.03 は文字の大きさ) call ashade(zs,nx,nx,ny,50.0,1500.0,100.0, 0,786,0) (↑塗りつぶし。zs が配列データ、nx,ny は配列の大きさ、50∼1500 ま でを 100 間隔で描画、0,786,0 は色の設定) call penx(10107) ! line type, thick, color ←コンターやラインの線種 の設定。線のタイプ、太さ、色 call contr(zs,nx,nx,ny,100.0,1500.0,100.0) 95 8. データの可視化 (↑コンターの描画。nx,ny は配列の大きさ、100∼1500 までを 100 間隔 で描画) call penx(10507) ←コンターやラインの線種の設定。線のタイプ、太さ、色 call contr(sl,nx,nx,ny,0.5,0.5,1.0) (↑コンターの描画) call penx(10107) ←コンターやラインの線種の設定 call setval(-3, 1.0, 0.0, -1.0, yfct*0.7, 3.0, 4.0) ←コンターのラ ベルの設定 call contr(flatit,nx,nx,ny,stlat,lat_max,dlat) ←経度のコンター、stlat から lat_max まで dlat 間隔のコンターを描画 call contr(flongi,nx,nx,ny,stlon,lon_max,dlon) ←緯度のコンター、stlon から lon_max まで dlat 間隔のコンターを描画 name = "Surface height [m]" ! input caption ←文字を変数に入力 clen = len(trim(name)); print*,’clen:’,clen ! number of character ←文字数のカウント call symbol(x0,y0+yfct*1.01,yfct*0.03,name,0.0,clen) ←文字を描画、 文字の位置、文字数、角度など ! call showpage ! = plot(0.0,0.0,5) ←次のページに移る call endofps ← ps ファイルの書き込みを終了 ! --- plot postscript image end ここでは (x0,y0) が図の左下の位置、(xfct,yfct) が図の大きさ。これらを基本にそ れぞれの位置を適当に決める。”contr”,”ashade”の”nx,nx,ny”の始めの”nx”が配列 の大きさ、2 個目の”nx”は使用する領域の大きさ。線種や色はマニュアル参照。 ○ 鉛直断面を書きたい ”/mnt/sky1/sawada/Nhm-v15/Tools/vertical/”の中の”read grads3d.f90” の描画 部分参照。 ! --- plot with postscript min_val = minval(wkzs(:,:,6)) ←コンターや塗りつぶしの最小値 max_val = maxval(wkzs(:,:,6)) ←コンターや塗りつぶしの最大値 dval = max_val - min_val beki = int(log10(dval)) cint = nint(dval/10.0**beki) ←コンター間隔、小さい桁を適当に四捨五入 st_val = int( (min_val + 0.5*cint)/10.0**beki )*10.0**beki print*,’dval,beki,cint:’,dval,beki,cint 96 ! --call factor(1.0) ←拡大率 call penx(10307) ←線種 write( it_char, ’(I10)’ ) it name = "Time="//trim(adjustl(it_char)) ←描き込む文字 print*,’time:’,name clen = len(trim(name)); print*,’clen:’,clen ←描き込む文字数 call symbol( x0,y0+yfct*1.01,4.0,name,0.0,clen ) ←文字の描画 call setdrw( x0,y0,xfct/real(nxi2-1),yfct/real(nz-1) ) ←図の設定 call setdxdy(-3,1.0,z_km,zsfc_i*0.001,nxi2,nz,horg*0.001,0.0,9) ! [km] call setbar(1,x0+xfct*1.02,y0,x0+xfct*1.05,y0+yfct*0.9,xfct*0.02) ←カラーバー call ashade(wkzs(:,:,6),nxi2,nxi2,nz,st_val,max_val,cint,1,1,-1) ← 塗りつぶし ! --- x-axis --- ← x 軸の描画、軸の刻み線&ラベルを自分で設定 do i = 0,8 dx = xfct * real(i)/real(8) call plot(x0+dx,y0,3) ←ペンを上げて (x0+dx,y0) に移動 call plot(x0+dx,y0-yfct*0.03,2) ←ペンを下げて (x0+dx,y0-yfct*0.03) に移動 write(name,’(I5)’) (i-4)*10 clen = len(trim(name)) call symbol(x0+dx-xfct*0.04,y0-yfct*0.13,3.3,name,0.0,clen) ←軸 のラベル enddo ! --- y-axis --- ← y 軸の描画、軸の刻み線&ラベルを自分で設定 yaxis = aint(yfct/2/2) iy = int(yaxis) do i = 0,iy dy = 4.0 * yaxis * real(i)/real(iy) call plot(x0,y0+dy,3) ←ペンを上げて (x0,y0+dy) に移動 call plot(x0-yfct*0.03,y0+dy,2) ←ペンを下げて (x0-yfct*0.03,y0+dy) に移動 write(name,’(I5)’) int(i)*2 clen = len(trim(name)) 97 8. データの可視化 call symbol(x0-xfct*0.07,y0+dy-yfct*0.02,3.3,name,0.0,clen) ←軸 のラベル enddo 図 6.3: 風の経度-高度断面。灰色の部分が地形。 98 99 第 7 章 そのほか 1. シェル入門 2. バイナリファイルの種類と読み書き 1 シェル入門(ではない) 要するに、コマンドの羅列です。自分的にはそれ以上表現の仕様がない。入門 と言いつつ、面倒なので実践編。NHM の実行 shell をサンプルに。”#”はコメン トを意味します(つまり、実行されない)。例えば、 $ sh fcst test.sh 72dx24 00UTC と実行した場合、 ----- 以下、script ----------------------------------------------------------#!/bin/sh -evx set -e -v -x ←"-v"コマンドを 1 行ごとに表示、 "-x"コマンド名と引数を"+"に続いて表示 ### date & variable definition SPEC=$1 ←シェル実行時の引数の 1 個目(72dx24 がはいる) SUFFIX=$2 ←シェル実行時の引数の 2 個目(00UTC がはいる) DATE=‘date -d ’today’ +\%Y\%m\%d‘ NAME=${SPEC}_${SUFFIX}_${DATE} ←変数 DATE に値を入力 FORT=fort. ←変数 FORT に値を入力 NHMDIR=/mnt/sky1/sawada/Nhm-v15 ←変数の入力 CSTDIR=${NHMDIR}/Const ←${NHMDIR}は入力された値を使用するという意味。 LOGDIR=${NHMDIR}/Log/Pf/FCST BINDIR=${NHMDIR}/Module/Bin PARMDIR=${NHMDIR}/Parm/Pf/FCST BCDDIR=/mnt/sky1/sawada/initdata_${NAME} WKDIR=${NHMDIR}/Data/Pf/FCST/work_${SPEC} 1. シェル入門(ではない) ### mkdir if [ ! -d ${WKDIR} ]; then mkdir -p ${WKDIR} ; fi if [ ! -d ${LOGDIR} ]; then mkdir -p ${LOGDIR} ; fi ↑ディレクトリがなかったらそのディレクトリを作る。 "if∼fi"は条件分岐、"!"は否定系、"-d"はディレクトリの有無。 ################################################################### # file link cd $WKDIR ←ディレクトリの移動 rm -f ${FORT}* ← fort.*の削除 ln -s $BCDDIR/uvptq$NAME ${FORT}23 ←初期値に fort.23 をリンク。 ln -s $BCDDIR/ptgrd$NAME ${FORT}25 ln -s $BCDDIR/org$NAME ${FORT}50 ln -s $CSTDIR/BANDCNX ${FORT}30 ln -s $CSTDIR/band.dat ${FORT}31 ↑ fort.*にリンクを張るのは fortran での入力ファイル名が "fort. 装置番号"となるから。 ################################################################### echo ’#### Time integration started ####’ ################################################################### echo "2006 08 01 00 01" > timecard ←"echo"で出力、それを">"で"timecard" に保存。 export F_UFMTENDIAN="big" ←環境変数の設定 "export"を使用して変数を宣言すると子プロセスに引き継がれる。 ただし、ここでは特に意味は無いかと。 ${BINDIR}/fcst_nfx < ${PARMDIR}/parm_${SPEC} > log.fcst_mpi.$$ ↑モデルの実行、parm_72dx24 というファイルを与えている。 log.fcst.mpi.$$というファイルに端末に出力されるモニタを保存。 "$$"はシェルを実行した時のプロセス番号。 ################################################################### ##### POST PROCESS ################################################################### mv ${FORT}62 $WKDIR/output.$NAME ←ファイルの移動 mv log.* $LOGDIR 100 第 7. そのほか rm -f ${FORT}* ← fort.*を削除 cd $HOME # JOB END 一部、記述を省いています。あんまり説明になっていないかも。 変数の頭に”$”が付くと、変数に入力した値が使える。ちなみに”${}”も基本的に は意味は同じ。 ‘date‘ と ’date’ では全く意味が違います。良く使われるし、間違いやすいので要 注意。よく使うコマンド、シェルのみ簡単に列挙。 echo "hoge":"hoge"と出力する export YEAR=2007:変数の宣言、子シェル (シェルの中で起動したシェル) の中 でも有効。 ln -s AAA BBB:AAA というファイル (ディレクトリ) に BBB という名前でリンク を張る。ショートカットみたいなもの。 cd :ディレクトリの移動 rm -f:ファイルの強制削除 mv :ファイルの移動、名前の変更 if []; then:条件分岐 ! :否定系、[] 内の条件が成り立たない場合に真 -d:ディレクトリの有無、有なら真 -f:ファイルの有無、有なら真 ./hoge.exe << EOF :EOF でくくられたパラメータを hoge.exe に渡す。 hoge1 hoge2 hoge3 EOF 使い方、意味の分からないシェルコマンドは以下の HP などを参照 日経 linux コマンド集 日経 linux コマンド逆引き集 linux コマンド集 ITpro シェルスクリプト (Bash) Bash(これが分かれば何でも出来る?) これらにない場合は google で調べてみましょう。 101 2. バイナリファイルの種類と読み書き 2 バイナリファイルの種類と読み書き バイナリ形式とはテキストとして読めない形式のファイル全般。要するに”0” と”1”で表記されたもの(というのは変ですが)。再解析、客観解析、モデルの出 力、grads 形式、netcdf 形式、どれにしてもバイナリファイルです(これもちょっ と表現が変ですが)。ここで注意したいのは、バイナリの中にも何種類か形式が あるということ。1つはエンディアン(big/little-endian)、もう1つは直接探 査(direct)、順番探査(sequential)です。(正しくは同列に扱うべきではない ですが・ ・ ・) ■ エンディアン(endian) :バイトオーダ(byte order) バイナリは”0”と”1”の羅列。その並び方(byte order)によって big-endian か little-endian が決まる。具体的には、”1234ABCD”という 16 進数の 4byte データ の扱いがどう違うかと言うと、 12 34 AB CD : big endian CD AB 34 12 : little endian という方式の違いのことです。”12”や”CD”でそれぞれ 1byte。ちなみに、 12(16 進数)=0001 0010(2 進数) です。 byte order は使用する PC で決まる。もちろんどの機種でも変換は出来る。 little-endian: Intel(うちの講座の WS), DEC Alpha など。 big-endian: NEC-SX, Sun SPARC, Mac?など。 という感じ。 で、具体的にどう変換するかですが主に、 • 環境変数で endian(byte order)を決める。 • コンパイラで決める。 • fortran で 1byte づつ読んで、自分で変換する。 という方法があります。いちばん簡単なのは環境変数。ただし、f77 は使用できな いかも。ifort(ifc), frt, pgf, gfortran, g95(?) は使用可能。 $ export F_UFMTENDIAN=big ← big endian $ export F_UFMTENDIAN=little ← little endian $ export F_UFMTENDIAN="big;little 10,20" ←基本は big, 装置番号 10,20 は little で扱う。セミコロンを絶対に付けること。 102 装置番号とは fortran でいう、open(10,file=”hoge”,form=”unformatted”) の”10” のことです。 コンパイラでの変換の仕方ですが、コンパイルオプションに以下のように加え ます。 $ ifort -convert big endian ← big endian $ ifort -convert little endian ← little endian gfortran の場合、$ gfortran -fconvert=big endian ← big endian $ gfortran -fconvert=little endian ← little endian frt(f90) ではコンパイルはいつも通りに行い、実行時にオプションを付けます。 $ ./a.out -Wl,-T (講座の WS で付けると big endian 扱いになる) $ ./a.out -Wl,-T10,20 ←装置番号 10,20 のみ big endian pgf90(pgf77) ではコンパイルオプションを加える。 $ pgf90 -byteswapio ←講座内の WS ならば big endian の扱いになる。 こんなところでしょうか。 ■ プログラムでの変換の仕方の例 以下、無保証で。文法違反 (引数を渡す際、型を変換) なので、コンパイラによっ てエラーが出るかと。 program read implicit none integer(4) :: header, ist, ien ! open(10,file=’hoge.bin’,form=’unformatted’,access=’direct’,recl=1*4) read(10,rec=1) header read(10,rec=2) ist read(10,rec=3) ien print*,’original : ’,header, ist, ien call change(header) call change(ist) call change(ien) print*,’changed : ’,header, ist, ien end program read subroutine change(c) implicit none character(len=1) :: c(1:4), c_tmp(1:4) 103 2. バイナリファイルの種類と読み書き integer :: i do i = 1,4 c_tmp(5-i) = c(i) enddo do i = 1,4 c(i) = c_tmp(i) enddo return end subroutine change ■ sequential/direct access fortran の参考書のデータ入出力の項を参照。簡単に sequential access(順番探査): ファイルを先頭から順番に読む。JMA-NHM の入出力するファイルはこの形式が多い。 direct access(直接探査): ファイルのレコード (record) の番号を指定して どの位置のデータでも直接読める。grads はこの形式を利用 (オプションで変更可 能”options sequential”)。 具体的な違いは、5 個の実数(5×4byte=20byte)をそれぞれ出力すると、 sequential: HHHH 1111 2222 3333 4444 5555 FFFF ← (5+2)×4byte direct: 1111 2222 3333 4444 5555 ← 5×4byte 上記はイメージです。HHHH, FFFF はそれぞれヘッダーとフッダー、合わせて 8byte。1111, . . . 5555 はそれぞれ 4byte のデータ(1 文字 1byte というイメージ)。 つまり、sequential は必ず 8byte 増える。ちなみにヘッダーとフッダーにはデー タ数が記録されている(はず)ので、この場合は整数型で”5”があるはず。 で、fortran で読み書きするには、 sequential なら、 open(10,file="hoge.bin",form="unformatted",access="sequential") read(10) hogehoge direct なら、 open(10,file="hoge.bin",form="unformatted",access="direct",recl=10*4) read(10,rec=1) hogehoge 104 とファイルを開く(読む場合も書き込む場合も)。見ての通り、access=”sequential/direct” でアクセス方式を決める。direct access の場合、もう 1 つ余計な recl=10*4 とい うのが付いている。これは 1record のデータの大きさ(record length)を表わし ている。*4 は 4byte の意味。2byte, 1byte データを扱いたければ”*2”,”*1”とすれ ばよい。例えば、4byte づつデータを読みたければ”recl=1*4”、72×72 格子のデー タを一度に読みたければ、”recl=72*72*4”と書けばよい。 コンパイル、実行は endian と違って特に気にしないで良いが、ifort を使用する ときのみ要注意。基本的に以下のようにコンパイルすること。 $ ifort -assume byterecl hoge.f90 こうしないと、”recl”が byte 単位ではなく、word 単位になってしまう. ちなみに、sequential のファイルは direct access でも読むことは出来るので、間 違えないよう要注意。 ■ CFL 条件の計算 ios.f90: sub.set ns で計算。dtuv, dtw, dtg のそれぞれの計算の仕方。プログラ ムの中での大雑把な計算順序を示しています。 rdxdy2ix,jy = (fmap1ix,jy × vrdx)2 + (fmap2ix,jy × vrdy)2 dtwrk = (udiag sc2ix,jy + vdiag sc2ix,jy ) × rdxdyix,jy √ dtuv = 1/ max(dtwrk) (7.1) (7.2) (7.3) dtwrk = abs(wdiag scix,jy ) × vrdz2kz × g2invwix,jy,kz √ dtw = 1/ max(dtwrk) (7.4) dptdz = (ptix,jy,kz+1 − ptix,jy,kz ) × vrdz2 × g2invw (7.6) bn = g/(ptrf + ptix,jy,kz ) × dptdz udiag_sc: スカラー量の位置での東西風速の値 vdiag_sc: スカラー量の位置での南北風速の値 wdiag_sc: スカラー量の位置での鉛直風速の値 pt: 温位 ptrf: 温位の基本場の値(300K) fmap: マップファクター g2inv, g2invw: terrain following の変換に伴う因子 vrdx, vrdy, vrdz2: 格子幅の逆数 g: 重力加速度 105 (7.5) (7.7) 3. NETCDF データの読み書き ■ エラー関係? ifort: error: could not find directory in which g++ resides 環境変数 GXX ROOT を設定すること。 $ gcc –print-search-dirs $ export GXX ROOT=/usr/lib/gcc/x86 64-redhat-linux/3.4.6/ 3 netcdf データの読み書き grads で読める netcdf は COARDS 形式に準拠するもの。なので、書き出しはこ れに従うとする。ncgen, ncdump を使用して netcdf ファイルの内容表示、プログ ラム作成も可能。netcdf の利点・欠点は(僕個人で思うこと)、 • (利点) 1 つのファイルに緯度経度、格子数などの情報とデータそのものを 一緒に記述できる。 • (利点) データを圧縮できる。scale, offset などももちろん設定できる。 • (利点) grads で読める。 • (欠点) 読み書きがやや面倒(netcdf がインストールされている必要がある)。 • (欠点) grib の方が圧縮効率が良い。 • (欠点) template を使いたい時、やや面倒。 そんな訳でこの項目の存在意義が疑わしいですが、データ量が多過ぎて困ってい る方、netcdf を使えば grads 形式(4byte)の約半分のサイズに圧縮可能です。 (本 音は grads でも 2byte 整数使えますが・ ・ ・、NHM の出力は 2byte 整数ですが・ ・ ・) 以下に grads 形式のファイルを netcdf 形式に変換するツールの使い方を紹介。 grads の ctl ファイルからフォーマットはある程度自動で読み込みます (詳細は下記 参照)。template を使っている場合、shell でループさせて下さい。そういう仕様で す。標準的な ctl ファイルなら問題ないはず(nhm2grads で作成したものは OK)。 (ctl ファイルを読み込むのに namelist で値を渡すのはあほっぽいが気にせずに) 必要なツールは以下の 2 つのみ。 /mnt/sky1/sawada/Nhm-v15/Tools/netcdf/src/grads2nc.f90 /mnt/sky1/sawada/Nhm-v15/Tools/netcdf/script/g2nc.sh 106 プログラムとシェル。 fort.10: grads データへのリンク fort.20: ctl ファイルへのリンク output.nc: netcdf 形式に変換したファイル もし、”segmentation fault”が出たら。。。 たいていの場合、メモリの stack サイズ不足。 $ ulimit -s unlimited と入力してから再実行する (bash の場合、ログインした端末で一度しか使えません)。 以下、シェル(g2nc.sh)のサンプル。 ----- 以下、script ----------------------------------------------------------#!/bin/sh export F_UFMTENDIAN=big:10 ### data directory datadir=/mnt/sky1/sawada/Nhm-v15/Tools/nhm2grads/72dx6_00UTC_20070307/ wkdir=$datadir/nc if [ ! -f $wkdir ]; then mkdir -p $wkdir/ fi ### grads control file ctl="${datadir}/grads3d.ctl" cd ./src rm -f grads2nc ### compile ifort -check -traceback -assume byterecl -o grads2nc grads2nc.f90 -lnetcdf -L/usr/loc ## check if [ ! -f grads2nc ]; then echo ’compile failed!!!’ exit fi cp grads2nc $wkdir/ 107 3. NETCDF データの読み書き cd $wkdir/ ### link grads control file rm fort.20 ln -s $ctl fort.20 ← ctl ファイルに fort.20 のリンクを張る ### link rm fort.10 file=${datadir}/grads3d.grd ln -s $file fort.10 ← grads データに fort.10 のリンクを張る ### existance and size check for grads data file: dont edit below section if [ ! -s $file ]; then echo ’file not found or zero !!!’ elif [ -s $file ]; then echo ’file exist’ ### control file of grads nx=‘grep -i "xdef" $ctl |gawk ’{print $2}’‘ ny=‘grep -i "ydef" $ctl |gawk ’{print $2}’‘ nz=‘grep -i "zdef" $ctl |gawk ’{print $2}’‘ nt=‘grep -i "tdef" $ctl |gawk ’{print $2}’‘ nvar=‘grep -i "vars" $ctl |grep -vi "end"|gawk ’{print $2}’‘ echo $nx $ny $nz $nt $nvar ### run ./grads2nc <<EOF &namctl nx=${nx}, ny=${ny}, nz=${nz}, nt=${nt}, nvar=${nvar} num=${num} &end EOF ### rename: edit if you want to use another file name. mv output.nc grads3d.nc ### file exist check 108 fi ○ ctl ファイルの読み込みについて 緯度、経度は”linear”のみ対応。 鉛直格子は”levels”のみ対応。単位が km になっているが気にせずに。 日付は初期時、時間間隔 (日, 時, 分まで対応。月単位の間隔は未対応) を読み込め る。 変数は全て読み込み変換する。変数によって鉛直格子数が違う場合は未対応。 template を使用している場合、各ファイルは 1step のみのデータと仮定。 で、netcdf → grads の変換は・ ・ ・各個人でお願いします。grads でも出来るし。 109 111 第 8 章 物理過程 モデルに含まれる物理過程の概要、プログラム、計算の流れなど。もちろん、全 部書ける訳がない。 • 雲微物理過程 • 積雲対流パラメタリゼーション(いちおう雲微物理と分けました) • 地表面・植生過程 • 乱流混合過程 • 放射過程 という感じです。 1 雲微物理過程 cloud physics, microphysics のこと。積雲対流パラメタリゼーションはまた別。 ここでは雲の直接計算する過程(バルク法)についてのみ。Lin et al 1983; Ikawa et al 1989; Murakami 1990, 1994 などが基になっているはず。細かいところでい ろいろ修正されている。最新版 (jmanhm-rel-01-15: 2006/9/15) は 2moment(混合 比と数密度を予報)の 5 カテゴリ(雲水、雨水、雲氷、雪、あられ)を考慮してい る。3class(雲氷、雪、あられ)と言ったりもする。 warm rain 名前の通り、暖かい雨、氷が生成・消滅する過程を含まない過程のこと。 プログラム main.f90 call cptqvn(cpt.f90) ! ----- cloud physics call cldphn call cdtv2 1. 雲微物理過程 call koenig2 2moment(1moment) slope parameter of qc & qr + fall velocity call clcwr1 : accretion (call clcwr2 : accretion for warm rain) slope parameter of qs (pn0s) slope parameter of qs (pn0h) fall velocity of qs & qh fall velocity of qns & qnh fall velocity of qnr ventilation coefficient for qs & qh call clrshn accretion (p_g__ac_r_i & p_ng__ac_i_r) p_g__ac_r_s & p_ng__ac_r_s or p_g_frz_r & p_ng_frz_r call clvshn : p_s__dep_v & p_g__dep_v sw_rat_g_s_racs & sw_g_dep p_i__nud_v call cpice2 pqcw & pqci & pqs & pqh & pqv & ppt & pqns & pqnh & pqncw & pqnr call cvrsh1 : warm rain fall velocity : tv_i call ctrvf2_2 : eular scheme -- fall velocity (call ctrvfa : analytical scheme -- fall velocity) (call ctrvd2_2 : box-lagrangian -- fall velocity) call ltrbc call adj2d1 call datmdfy call monit_store_2d ! ----- data check call chkmn30 call datmdfy_a2b_x call datmdfy_a2b_y ! ----- compute qv(qc...qh...qnh) : adv, diff... call cqs2(cqs.f90) call cadve3m, cadve1m, cadvqn, cadvup call chkmn3 call rldamp3 112 第 8. 物理過程 call dampcn call trb__calc_hdif call kakusa (call cdifet) call damptg : targeted diffusion for moisture call osaveh2 call chkmnqc call extrx2,extry2 call qs_modify call adj2d1 call datmdfy call tsmoth2 call cqs3(cqs.f90) call adjnum_2 ! ----call cpt5 ! ----call tsmoth2 ! ----- cumulus parametarization call adjust call asjust call grell_main call kf_eta_cps ! ----call monit_store_2d ! ----call tsmoth2 ! ----- saturation adjustment call adjqvh_3 長過ぎる・ ・ ・でもフォローし切れていない。 プログラム cldprm.f90: 雲物理関係の定数 cld.f90: 雲物理の計算、本体 ice.f90: 氷過程の計算 cqs.f90: 移流、拡散の計算 ctrv.f90: 落下速度 113 2. 積雲対流パラメタリゼーション(CP) 2 積雲対流パラメタリゼーション(CP) 自分用メモ。「気象研究ノート 台風-解析と予報-」より。 必要性として、格子点値としては飽和していなくても格子間隔以下のスケール で積雲対流により熱や水蒸気などの鉛直輸送や降水が生じている、ことが挙げら れる(Molinari and Dudek 1992)。CP を考慮しないと、モデルの格子間隔スケー ルで不安定が増大し、少数の格子点に降水が集中する grid point storm が生じる ことが指摘されている。 5∼40km 程度のメソモデルで微物理過程を使用すると、降水の立ち上がりが遅 くなる、最終的な降水を過大評価する傾向がある(Kato and Saito 1995; Weisman et al. 1997)。原因として、格子点値として飽和するまで降水が生じないことが直 接的な原因。また、格子間隔以下の熱力学効果がモデル大気に反映されないと対 流システムの時間発展が遅れること、非静力学効果や降水粒子の蒸発が適正に評 価されないことも原因の可能性。 CP が不要となる水平解像度は 0.1km とか 1km などと言われるが、根拠はない。 (1km だと deep convection などの熱帯の対流は表現できるかもしれないが、貿易 風帯にできる層積雲などは水平スケールが小さいため、1km では不十分→「部分 凝結の必要性」という個人的な印象、) CP の必要性に関連して、加熱率 Q1 (apparent heat source)、乾燥率 Q2 (apparent moisture sink)の鉛直分布が似ていれば加熱は局所的な凝結で生じており CP は必要ないが、Q1 と Q2 の分布が異なるようだと必要(Molinari and Dudek 1986)。 ( ) ∂ θ̄ ∂ θ̄ Q1 = π̄ + V̄ · ∇θ̄ + w̄ (8.1) ∂t ∂z ( ) ∂ q̄ ∂ q̄ Q2 = π̄ + V̄ · ∇q̄ + w̄ (8.2) ∂t ∂z あるいは Pielke 2001 より、 ′′ ∂ θ̄ w̄ ≫ w′′ ∂θ ∂z ∂z and ′′ ∂ q̄ w̄ ≫ w′′ ∂q ∂z ∂z (8.3) つまり、熱と水蒸気の鉛直輸送がサブグリッドスケールより解像スケールが支配 的である場合は、CP を無視しても (使用しなくても) 妥当かもしれない。そのよ うな状況は飽和したハリケーン環境場で見られる。 改善の方向性、CP の評価方法として、物理的初期値化を用いる(Kasahara et al. 1996 )。物理的初期値化では水蒸気はモデルで使用する CP が観測された降水 強度を実現するように修正されるが、修正された水蒸気場は用いる CP によって かなり異なる。降水強度と水蒸気場の詳細な観測があればスキームの評価が可能。 114 ちなみに水蒸気や熱の輸送と違って、運動量の輸送をパラメータ化している CP は少ない運動量輸送は台風の強度や上層の渦構造に大きな影響を与える(Challa and Preffer 1990; Dengler and Reeder 1997)。 3 地表面・植生過程 地表面(あるいは植生や海洋)と大気との相互作用を表現する過程。基本的にバ ルク法で計算されている。講座ではたいてい MSWSYS(1)=204:陸は Louis(1 桁 目の数字)、海は Kondo(1974)(2 桁目の数字) が使われる。 最近 (2007 年後半) では、MSWSYS(1)=1255 1 桁目の数字: 陸上の地表面 flux の bulk 係数の計算方法:Beljaars and Holtslag 2 桁目の数字: 海上の地表面 flux の bulk 係数の計算方法:Beljaars and Holtslag 3 桁目の数字: 気孔抵抗、wetness の時間変化を使用する 4 桁目の数字: 海面粗度の決め方:Beljaars バルク法は大まかには、 FM = −Cm |V10m |(Vb − Vs ) (8.4) Fθ = −Ch |V10m |(θb − θs ) (8.5) Fqv = −Cq |V10m |(Qvb − Qvs ) (8.6) という式。FM , Fθ , Fqv は運動量、温位、水蒸気フラックス。Cm , Cθ , Cq はバル ク係数、V10m は高度 10m の水平風速、b はモデル最下層の物理量、s は地表面の 物理量。各スキームの違いは大抵、バルク係数の見積もり方の違いとなる。 プログラム、離散式 surface_flux3.f90 sub.calc_surface_flux sf_pt_w(ix, jy) = - c_h(ix, jy) & & * v_abs_a(ix, jy) * (pt(ix, jy, kz_a, kt) - ptgrd(ix, jy)) sf_qv_w(ix, jy) = - c_q(ix, jy) & & * v_abs_a(ix, jy) * (qv(ix, jy, kz_a, kt) - qvgrd(ix, jy)) ! vw(wv) point sf_v_w(ix, jy) = - ((c_m(ix, jy) + c_m(ix, jy_m)) * 0.5d0) & & * v_abs_a_v(ix, jy) * (vdiag_vc(ix, jy, kz_a, kt) + v_s) ! wu(uw) point sf_w_u(ix, jy) = - ((c_m(ix, jy) + c_m(ix - 1, jy)) * 0.5d0) & 115 3. 地表面・植生過程 & * v_abs_a_u(ix, jy) * (udiag_vc(ix, jy, kz_a, kt) + u_s) Kondo (1975) に従うと抵抗係数は例えば、 Cm = 0.52 + 0.073U10m U10m < 25ms−1 (8.7) という感じで計算される。ただし、モデルではより場合分けがなされています(風 速の強さ、大気の不安定度に依存)。 wetness の時間変化(降水の後の潜熱増加とか、晴天時に逆に潜熱減少)を考慮 するとより現実的?(モデル自体は対応可)(非静力 WS2005, p35)雪面はうちの 講座で使用する場合、全く考慮していない(モデル自体は対応可)。都市の排熱も 考慮していない(モデル自体は対応可)、与える熱量の適切なデータが必要。植生 キャノピー、都市キャノピーみたいなものは含まれていない。 jmanhm-rel-01-15 では SiB(Simple Biosphere model)が導入されているので、 陸上ではこちらがメインになる?まだテスト段階?長期積分しないとあまり効い てこない気がしたけど、1 日未満の積分でも状況によっては大きく差が出るかも。 海面では、波齢、波形などで粗度が大きく変わるはず(wave model とカップル が必要?)。Sea spray の効果は? 参考文献 J. F. Louis, M. Tiedtke and J. F. Geleyn, 1982 : Workshop on Planetary Boundary Layer Parameterization, 59 - 79. J. Kondo, 1975 : Boundary-Layer Met., 9, 91 - 112. 116 4 乱流混合過程 3 Ce E 2 ∂E gKh ∂θ ′ ′ ∂ui − = −adv.E + − ΣΣui ui + dif.E ∂t θ ∂z ∂xj l ( ) ∂ui ∂uj 2 ′ ′ ui uj = K m + + δij E ∂xj ∂xi 3 1 Km = Cm lE 2 運動量の拡散係数 Ke = 2Km 乱流エネルギーの拡散係数 Km Kh = 熱・水蒸気・雲の拡散係数 Pr 1 1 1 = + 混合長の逆数 l κ(z − zs ) l∞ l∞ = ∆s f or Nl ≤ 0 0.76E 1/2 l∞ = min(∆s, ) f or Nl > 0 Nl l Ce = 0.19 + 0.74 ∆s 1 l = 1+2 プラントル数の逆数 Pr ∆s Cm = 0.1 (8.8) (8.9) (8.10) (8.11) (8.12) (8.13) (8.14) (8.15) (8.16) (8.17) (8.18) (8.19) 水平格子と鉛直格子の比(アスペクト比)が大きいとき(鉛直層が薄いとき)、 解像できる渦は非等方、平べったい渦しか扱えない(あまり表現は正しくない)。 つまり、水平方向で表現しなければならないサブグリッドスケールの効果は鉛直方 向に比べて大きい渦が含まれる、要するに混合長が必然的に長くならないといけ ないはず。そこで、水平方向と鉛直方向の混合長の定義は以下のようにしている。 lz = lz lx = ly = √ (8.20) ∆x2 + ∆y 2 (8.21) 但し、これをこのまま使うと境界層内では鉛直方向で表現する渦(混合距離)が 小さ過ぎて乱流拡散による鉛直輸送が弱くなる傾向がある。そこで境界層内では Sun and Chang 1986 に従って鉛直方向の混合距離を見積もる。 ) ( )) ( ( 8z 4z − 0.0003exp (8.22) lz = 0.25 × 1.8hpbl 1 − exp − hpbl hpbl 117 5. 放射過程 これはワンガラでの観測に基づいて得られた経験式。境界層の高さ hpbl が高けれ ば渦の大きさ(混合長)がそれに応じて大きくなる。 (本来はここで使用されている乱流モデルは等方性を仮定していた気がするの で、上記の表現は正しくないかもしれない) W. Y. Sun and C. Z. Chang, 1986 : J. Climate Appl. Meteor., 25, 1445 - 1453. 5 放射過程 118 119 第 9 章 JMANHM の使用例・今後の 課題? 1 講座内での使用例 • ヤマセ・下層雲・カリフォルニア沖 (DYCOMS2?) • 宮城県での高解像度予報 • (宮城県での) 領域モデルによる長期解析 • 宮城県の降雪 • フロリダでの海陸風 • 都市域での集中豪雨 • チベット高原での降水現象 • 清川だし • 山岳波、蔵王おろし • 台風 (事例&理想化) 2 今後の (個人的) 課題 • 検証ツールの作成 (アメダス、衛星などとの比較) • モデル出力の調整 (検証用データの出力) • モデルで使用するパラメータ・物理過程の最適化 2. 今後の (個人的) 課題 2.1 検証ツールの作成 (アメダス、衛星などとの比較) ■アメダスとの比較 データの場所:/mnt/tree2000/AMEDAS (小玉くん作成) データ概要:各地点での風向・風速・気温・降水量・日照時間・湿度・気圧 比較:各地点、時間別、日別での統計的傾向(RMSE、相関係数、偏差) ○アメダス地点への内挿ツール (com amedas) 必要なファイルは、 /mnt/sky1/sawada/Nhm-v15/Tools/com amedas/src /mnt/sky1/sawada/Nhm-v15/Tools/com amedas/script で良いはず。使い方の手順は、 $ sh script/interp_amedas.sh 102dx5 20080301 18JST ←内挿計算 $ sh script/com_amedas.sh ←アメダスとの比較 (平均誤差、RMSE など) $ sh script/check_zero_com_file.sh ←データの無いファイルを削除 interp amedas.sh: fort.15 にリンクしたアメダス地点リストを読み込んで、NHM の計算結果から直 接内挿計算する。内挿する値は高度 1.5m の気温、降水量、ある範囲の降水量、高 度 10m の風、下向き短波放射、下向き長波放射、下、中、上層雲量の 10 変数を、 各地点についてテキストファイルで出力。その際、領域外は自動的に除外する (は ず)。出力される内挿値の日付は計算結果のファイルから読み取られる。もし、計 算する際の設定が正しくない場合は日付もずれる。 com amedas.sh: interp amedas.sh で作成した内挿値とアメダス観測値を読み込み、各時間、各日で 比較。気温と風速、風向のみ。 ■レーダーアメダスとの比較 レーダーアメダスのデータや変換 (デコード) ツールは以下に貯められている。 /mnt/tree2000/gpv/radar/data/ /mnt/tree2000/gpv/radar/script/ など。降水量は 1km メッシュ、エコー頂は 2.5km メッシュでどちらも 10 分間隔で ある。 ■衛星データとの比較 データの場所;/mnt/raid1200/未定 データ概要:MTSAT-1 の可視、赤外、水蒸気の輝度温度 比較:空間分布の統計的傾向(RMSE、相関分布) 120 第 9. JMANHM の使用例・今後の課題? 2.2 モデル出力の調整 (検証用データの出力) jmanhm-rel-02-00 では物理モニタ(出力できる変数)が増加したので、それ に合わせてパラメータカードを変更、及び nhm2grads ( nhm2grads ) を修正す る必要がある。 例えば、solar(下向き短波放射)、dlwb(下向き長波放射)、CLL、CLM、CLH(雲 量)などが追加。 2.3 モデルで使用するパラメータ・物理過程の最適化 モデルの更新に伴い物理過程が強化されたので、解像度に合わせて適切な物理 過程の選択、及びパラメータの最適化が必要。 乱流:Deardorff(1973) スキームで乱流エネルギーを診断 ⇒ Improved Mellor-Yamada Lavel3 (MYNN) 混合層の発達の仕方、風速の鉛直プロファイルから適切かどうか評価できるとい いな 放射:CLD RD=0 (相対湿度から雲量を診断) ⇒ CLD RD=3 (部分凝結スキーム によって雲量、雲水・雲氷量を求め直接放射計算) 地表面温度の時間変化、長波+短波放射、OLR の比較から適切かどうか評価でき るといいな 他にも細かい部分がいろいろあると思いますが。 121