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

[dennou-ruby:003936] Re: [dennou-ruby:003935] Re: 気圧軸が int での不具合



堀之内さま,みなさま: 松葉です.

ご回答ありがとうございました.
返信が遅くなりまして申し訳ありません.

>> Numeric に合わせて NArray を upcast する演算は行われない
これは意図的にそういう仕様にしてあるのでしょうか.

Ruby-NuSDaS の場合,nusdas.rb の 1793 行目
   1793:   return NArray.to_na(@meta[:planes].collect{|pl| pl.to_i})
の to_i を to_f に変更することで,気圧軸を実数で読み込むことができることが確認できました.
これで対処していこうと思います.

>> そういえばテスト用データも用意してないかも
用意されていないみたいですね.

2016年3月11日 15:26 Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>:
松葉さま:

報告ありがとうございます。NArray と Numeric の2項演算では,
Numeric に合わせて NArray を upcast する演算
(整数と浮動小数点の演算なら,整数を浮動小数点に変換した
上で演算すること) は行われないというのは,知らない(orあまり
気にしてない)方も多いのではないかと思います。
なので,こうしてたまに話題になるのは良いことだと思います
(いつもメールありがとうございます)。

ということで,座標軸の値とか物理量データが整数なのは
地雷です。で,たしかに,GRIB や NuSDaS だと
時々そういうことが起こりそうですね。
たしか以前,GRIB は気圧軸が整数なら倍精度実数に変換して
読み込むように変えたような気がしますが,どうも記憶が
定かでないです(ソースをちらっとみてもよくわからなかった。
やってないかも...?)。
ともかく NuSDaS は利用者が少ないですし,そういう対応はまだでしょ
うね。

対応したいとは思いますが,NuSDaS は使ってないので,
どうもモチベーションが上がらないです(そういえばテスト用データも
用意してないかも... そもそも NaSDaS 対応の作者は私でない)。

よければご自分で見てもらえると幸いです。NuSDaSは書き出しはあきらめて
ますので,座標値を読み込むところで結果が整数なら to_f してから
格納する。NArray レベルでやるといいです。

堀之内

> 電脳 Ruby のみなさま: 京大 M1 の松葉です.
>
> 気圧軸が int の GPhys オブジェクトを扱っているときに,たとえば,GAnalysis::Met::temp2theta メソッドを
> 使うと,内部における prs/P00 という演算でうまく処理されないという事案に遭遇しました.
> ここで,prs は Axis#to_gphys により生成された気圧軸の GPhys オブジェクト,P00 = UNumeric[1e5, 'Pa']
> です.
> サンプルのスクリプトとデータを付しておきます.
>
> この問題の本質的な部分は,NArray のレイヤーでキャストがうまく行なわれていないことにあります.
> 気圧軸が int のままのもの (prs1) と,sfloat に変換したもの (prs2) とで比較してみました.
>
>   p prs1
>   -> <NumRu::GPhys grid=<1D grid <axis pos=<'pressure' in 'test.nc'
> int[29]>>>
>    data="" int[29] val=[1000,975,950,925,...]>>
>
>   p prs2
>   -> <NumRu::GPhys grid=<1D grid <axis pos=<'pressure' int[29]
> val=[1000,975,950,925,...]>>>
>    data="" sfloat[29] val=[1000.0,975.0,950.0,925.0,...]>>
>
>   p prs1.val/1e5
>   -> NArray.int(29):
> [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
> ... ]
>
>   p prs2.val/1e5
>   -> NArray.sfloat(29):
> [ 0.01, 0.00975, 0.0095, 0.00925, 0.009, 0.00875, 0.0085, 0.00825, 0.008,
> ... ]
>
> 同様の症状が GAnalysis::LogP::p2z メソッドでも起きます.ここでも内部に p/P00 という演算が含まれて
> いるためです.LogP のほぼすべてのメソッドで p2z が呼ばれているので,これは響きます.
>
> 今回このような事案に遭遇したのは,Ruby-NuSDaS を通じて読み込んだ NuSDaS 形式のデータを取り扱って
> いるときに起きたものです.
> # サンプルで付したデータは NetCDF に変換していますが.
>
> どうやら気圧軸は int で読むようになっているようです.モデルの output や再解析データを GPhys で読むという
> ことが普通かと思いますが,そのときに気圧軸をどの型で処理しているのかまではわたしはよく知りません.
> # 印象ですが,気圧軸が int というのはマイナ?
>
> 対処の仕方としてはいろんなやり方があって,たとえば Axis#to_gphys のあとに GPhys#to_f を作用させて実数化
> してしまうとか,そもそもデータを読むときに気圧軸を実数化しておく,などが考えられます.
>
> どのレイヤーで修正するのが適当なのかちょっとわかりませんが,とりあえずご報告しておきます.
> 対応よろしくお願いいたします.
>
> 一応バージョンのことを申しておきますと,GPhys のバージョンは 1.4.3,Ruby のバージョンは 1.8.7,ruby-narray は
> 0.6.0.1-1 です (dpkg -s で見た結果).
>
>
> --
> 松葉 史剛 (Fumitaka MATSUBA)
> 京都大学大学院 理学研究科 地球惑星科学専攻
> 地球物理学教室 気象学研究室 M1
> E-mail: matsuba@xxxxxxxxxxxxxxxxxx

堀之内 武
北海道大学 地球環境科学研究院 地球圏科学部門
〒060-0810 札幌市北区北10条西5丁目





--
松葉 史剛 (Fumitaka MATSUBA)
京都大学大学院 理学研究科 地球惑星科学専攻
地球物理学教室 気象学研究室 M1