[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [jmadata-users33] software to read GPV (and to convert intoNetCDF)



鈴木様:
(B(jmadata-users の皆様)
(B
(B出張が続いたため返事が遅くなりました。
(Bご指摘およびプログラムの改善提案をありがとうございます。
(B
(B> > MSM及びRSMのデータ(in「国内2進形式」)を読むためのソフトを作り
(B> > ました。気象庁の豊田さんにアドバイスを頂きましたので、記して感謝
(B> > 致します。
(B> 
(B> これを利用して、msm のデータを netcdf へ変換してみました。
(B> 私は GrADS ユーザなので、GrADS で直接読めると大変便利なのですが、
(B> このソフトで変換したものを GrADS 上で開くと
(B> ga-> sdfopen MSM00PLM018_1.nc 
(B> Scanning self-describing file:  MSM00PLM018_1.nc
(B> SDF file has no discernable X coordinate.
(B> のようになってしまい、うまく読めません。
(B
(B確か GrADS は COARDS 形式に対応するのですよね。
(B
(B確かにご指摘のように、座標変数に units や long_name 等の属性を定
(B義するのをサボっているようです。やはり COARDS 準拠にするべきです
(Bね。先週来こちらのファイルサーバーに故障が発生して修復が長引いて
(Bいますので、今すぐは対応できない状態で申し訳ありません。
(B
(B> ここをなんとかすればいいのかな、と思い、ソフトのソースの
(B> gpv2nc.rb というファイルを変更してみました。
(B> まず、鉛直方向の関数が p になっているのを level に変えてみました。
(B
(BCOARDS では圧力の座標名は level でなくてもいいのではないでしょう
(Bか。以下、
(Bhttp://ferret.wrc.noaa.gov/noaa_coop/coop_cdf_profile.html より
(B引用します。
(B
(B|| Coordinate variable names: The names of coordinate variables are
(B|| not standardized by these conventions (since data sets may in
(B|| general contain multiple coordinate variables of the same
(B|| orientation). Coordinate variable names should follow the same
(B|| general naming rules (above) as other netCDF variables.
(B
(Blevel という表記は確か NOAA 提供の NCEP データ netcdf ファイルに
(B使われていたと思いますが、個人的には圧力をこの名前で表すのは好き
(Bじゃないです。圧力ということが分かりにくいので。問題は名前でなく、 
(Bunits 等の属性がついてないことだと思います。
(B
(B> また、
(B> --------------------------------------------------------------ここから
(B>     output.def_var('lon', "sfloat", [dimx])
(B>     output.def_var('lat', "sfloat", [dimy])
(B>     output.def_var('level', "sfloat", [dimz])  if not plane.first.nil?
(B>     output.def_var('time', "sfloat", [dimt])
(B> --------------------------------------------------------------ここまで
(B> となっている部分を
(B> --------------------------------------------------------------ここから
(B>     output.def_var('lon', "sfloat", [dimx])
(B>     output.var('lon').put_att('units', 'degrees_east')
(B>     output.var('lon').put_att('long_name', 'Longitude')
(B>     output.def_var('lat', "sfloat", [dimy])
(B>     output.var('lat').put_att('units', 'degrees_north')
(B>     output.var('lat').put_att('long_name', 'Latitude')
(B>     output.def_var('level', "sfloat", [dimz])  if not plane.first.nil?
(B>     output.var('level').put_att('units', 'millibar') if not plane.first.nil?
(B>     output.var('level').put_att('long_name', 'Level') if not plane.first.nil?
(B>     output.var('level').put_att('positive', 'down')  if not plane.first.nil?
(B>     output.def_var('time', "sfloat", [dimt])
(B>     output.var('time').put_att('units', 'hours')
(B>     output.var('time').put_att('long_name', 'Time')
(B> --------------------------------------------------------------ここまで
(B> と書き加えて変更しました。
(B> すると、とりあえず GrADS で表示できるようになりました。
(B
(Bこれで結構です。今後、他の部分との整合性を考えて、機能的には同等
(Bの変更を行うつもりです。
(B
(B> が、まだ改善したいことがあります。
(B> 
(B> lon, lat, level に関してはどのファイルもほぼ同じでしょうから
(B> このままでもいいのですが、時間に関してはファイル毎に違います。
(B> 今の状態ではどうしたものかわからないので、とりあえず設定はせず、
(B> 結果として1年1月1日00Z から3時間おき、という内容になっています。
(B> おそらく、もとの msm のデータファイルから時間の値を読んで netcdf 
(B> ファイルに書きこめるのではないかと思っているのですが、
(B> 今の私には手が余りそうです。
(B
(B時間はちゃんと書き出されるけど、その内容が「1年1月1日00Z から3時
(B間おき」なのですね(1年1月1日からでなく各年の1月1日から?)。そ
(Bの場合の単位は、"days since 2002-01-01 00:00+00" などとして 
(Bsince 以下でオフセットを表すことになります
(B(http://www.unidata.ucar.edu/packages/udunits/)。単位はもしかし
(Bて hours でしょうか。1年の始めからとなると、days に変えた方が分
(Bかりやすいですね。
(B
(B> また、私は ruby は全くいじったことはなく、netcdf ファイルの編集も
(B> 自分でプログラムは書いたことがないので、ちゃんとしたことをやっているのか
(B> 不安です。特に 'level' の項周辺など。どなたか見ていただけないでしょうか。
(B> 
(B> 大変申し訳ないですが、「こういう関数でプログラム中で扱っている」など、
(B> どなたかアドバイスをいただけないでしょうか。
(B> # もちろん、直接改良してくれればありがたいですが……
(B
(Bそのつもりですが、少し時間がかかりますので、もしこれまでのご変更
(Bで不都合がなければしばらくそれをお使い下さい。
(B
(B堀之内 武                    horinout@xxxxxx
(B京都大学宙空電波科学研究センター     611-0011 宇治市五ヶ庄