電脳 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