電脳 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 で見た結果).--
Attachment:
test.nc
Description: Cdf file
Attachment:
calc.rb
Description: Binary data