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

[dennou-ruby:003076] Re: Fw: 電脳Rubyで2次元gribファイル読み込み



栗田さま

> 堀内さんにお送りしたgribファイルは、一ヶ月分まとめた 
> 4次元のGrib
> 形式ファイルだったのですが、実際の作業では、欠損処理があるために
> 4次元データを扱えません。JRAデータは、2008年の 
> 11月後半など、
> たまに欠損日があります。

おおなんと!! 客観解析なのになぜ? upload 漏れ?
処理の遅れ? ...ファイル形式変換プログラムとは
関係ないですが,気になります.(しばらくまったら
jra サイトに upload されるもんでしょうか.)

> その処理を考えますと、毎日の3次元の 
> grib
> 形式データを読み込んで、時間軸を入れて4次元化するとき 
> に、欠損処理
> を行うことになります。

つくるファイルとしては,時間軸を不等間隔に
するのでなく,データのない日に欠損を入れたいんですね.
だから,欠損処理云々があったのか...

> このような作業を入れるとしたら、どこにどのようにいれられます?美し
> いプログラムをみると、そのフォームを壊すようなことができず、たじろ
> いでいます。

あれはまあ,サンプルですので気になさらず.
同じこともいろんなやり方ができるので,
諸条件にあわせていいようにやればいいと思います.
ともかく,そういう話なら確かに時間に関してはループを
まわすのがいいでしょうね.

私のプログラムは,もとのgrib ファイルに時刻が複数あって,
時間軸が陽にとれることを利用してます.そして,
NetCDF の時間軸を無制限次元にとった上で,
最初の書き込みを GPhys::IO.write を使って格子まで
自動で書かれるようにし,次回以降は data 本体と時刻のみを
生のNetCDF IOを使って書き出してます.もし,その
前提(つまり,入力 grib ファイルに時刻が複数ある)
でいいのであれば,次のように時間で分割することが考え
られます:

gphys[false,i..i]  のようにすると,最後の次元を消すこ
となく,長さ1のままのサブセットとなります.
(gphys[false,i] だと,最後の次元が消えるので,
振る舞いが違います.)
これを使って時間に関しループをまわすというのが手です.
上に書いた「最初は GPhys::IO.write で,それ以降は生
NetCDF IO で」というのの分け方は,入力ファイル
単位である必要ありませんので.

でも,実は,入力の girb ファイルは1日ごとにわかれてるん
ですよね?  そうなると GPhys::IO.open で開いたときに
時間軸ができないので,私のプログラムは使えないということに
なります.grib なので cat でつなげればいいんですが,
わざわざしたくないですよね.そうなると対処法はいろいろ
ありそうですが,栗田さんの方針でいいと思います.

この場合,(少なくとも現状では) grib データから
時刻がとれないため,ファイル名に頼らざるを得ないですよね.
ファイル名のルールはまちまちなので,汎用化はあきらめ,
JRA で動きさえすればいいのではないかと思います.
どれくらい整備に時間を使う価値があるかは,どれくらい
汎用に使いうるかで変わりますので.

堀之内