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

[dennou-ruby:002446] Re: integrate



堀之内です. 

> 本質的に解決するのはどうすればいいんですかねぇ. 
> 実用的に解決するならば, いろんな重みを用意しておいて
> 好きな重みを使って積分できるようにしておけばいいんでしょうか. 
> 
> たとえば, ガウス格子点の緯度φjに対して 
> 
>   * lat_weight : \int f(φ)dφ を計算するための重み
>   * coslat_weight : \int f(φ)cosφdφ を計算するための重み
> 
> を割り付けてきりかえて使う, というのは今の Gphys のポリシーから
> はずれないでしょうか? 

問題ないです.今,積分重みを表す予約語として 'integ_weight' を作
ろうかという話にしつつありますが,違う名前を使うなら,補助変数枠
は入れ物として好きにつかっていいです(1次元配列限定).ただし,
coslat_weight を適切なタイミングで積分/平均重みとして使うことは,
少なくとも現段階では利用者側の責任になります.つまり,GPhys(と
いうか Axis)はそれを受け入れるが特別な解釈はしません(それが
「予約語にしない」ということの意味です).

ではどうすればいいんだということがちょっと分かりにくいと思うので,
現状(CVS版)ベースで具体例を書きます.

開く:

   gphys = GPhys::IO.open('T.nc','T')  # ["lon","lat","prs"]のグリッド上
                                       # lat はガウス緯度
   weight = GPhys::IO.open('T.nc','lat_weight')  # 変数 lat_weight にはガ
                                               # ウス重みが入ってるとする
   gphys.axis('lat').set_aux('coslat_weight',weight.data)
                                          # .data で本体の VArray を抽出
                                    # axis の引数は 1 (番号指定)でも良い

(こうしておけば,GPhys#[] や GPhys#cut による部分切り出しを行っ
た場合も,ガウス重みの該当部分が正しく切り出された上で,サブセッ
トを表す新オブジェクトに受け継がれます.)

書出す:

  file = NetCDF.create('out.nc')
  GPhys::IO.write(file, gphys)   # これで weight も含めてファイルに出力
                       # (Grid関連の変数はデータ本体に先だって出力される)
  file.close

南北にガウス緯度の重みをつけた平均/積分をする:

  gphys.axis('lat').avg_weight = gphys.axis('lat').get_aux('coslat_weight').val
  gpint = gphys.average('lat')

  gphys.axis('lat').integ_weight = gphys.axis('lat').get_aux('coslat_weight').val
  gpint = gphys.integrate('lat')

平均重みと積分重みは一応わけてあり,それぞれ Axis#avg_weight=,
Axis#integ_weight= で設定しますが,実際には積分重みは平均重みに
流用できるでしょう.なお,Axis#avg_weight= 等で重みを設定しても,
サブセットの切り出しをしたら,受け継がれないはずです.よって,平
均/積分操作をする前に毎回設定すべきです.

今までの話から,ガウス重みを積分重みに指定するのはルール違反では
ありますが,利用者がそれを承知でする分には構いません.ちなみに,
積分にはバグがあって,NArray を掛けることにしてるので単位が正し
く更新されません.(バグフィックスは,現状で GPhys をリリースし
たあとしたいと思います.他にも Grid/Axis 回りを強化したいので,
現状で一旦固めたい.)

さて,ここで竹広さんに注意して欲しいのは,gp* コマンドは GPhys 
パッケージの一部ですから,上のようなことを **組み込んではいけま
せん**.coslat_weight を予約語としないわけなので.

それでは困る? なら抜け道を用意しましょう.ガウス緯度を解釈する
ためのオプションを用意してください.そして,そのオプションを選択
したときだけ,ガウス緯度に関する取り扱いをするというのはOKです.
オプションを陽に指定することで,利用者は変則利用を認識していると
見なしましょう.開発者にもメリットがあって,関係箇所が,オプショ
ンが指定された場合のみに実行される if ブロックに固まりますから,
将来違った枠組みに移行した際に,どこを変えればいいか簡単にわかり
ます.

竹広さん:

現状で GPhys を固めてリリースした上で,上のような話はその次のリ
リースにむけて進めるというのでいいでしょうか.現在の配布版にはそ
もそもかなりの gp* コマンドが入ってませんし.

堀之内 武                      horinout@xxxxxxxxxxxxxxxxxx
京都大学生存圏研究所                    phone:0774-38-3812  
611-0011 宇治市五ヶ庄                     fax:0774-31-8463