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

[dennou-ruby:001875] alias put for GPhys



堀之内様
Cc: dennou-ruby

塚原です. GPhys 内部の put の挙動を alias を用いて変更したいのですが
上手くいきません. 具体的には, signature 下方に記述したプログラム
(testalias.rb) を実行すると, GPhys::IO.write 中で呼んでいる get は
aliasしたメソッドが呼ばれるのですが put についてはなぜか alias が張れ
てない or 別のメソッドを GPhys 内部で上書き alias しているようです(test1).

一方, NetCDF::put を直接呼び出している部分は正しく alias されているよ
うです(test2). お手数ですが, 確認いただけないでしょうか? テストに使用
した nc ファイルは適当なもので大丈夫です. GPhys オブジェクトとして読み
込んで, 1.1 倍したものをファイルに保存するだけ.

ちなみに, 何がしたかったのかというと, NCEP データの欠損値の取り扱いを
サポートするメソッドを put に alias したかったのです.
# pack した値を missing_value として持つように. つまり, 欠損値は
# add}_offset や scale_factor を作用させないようにする.

個人的には上記の目的が果たせればよいので, 何か上手い方法が既に開発され
ておりましたら, おこぼれにあずかりたい, と思っております(;^^)

お忙しいところ申し訳ありません. お手すきになりましたら, 対処いただける
と幸いです. どうぞよろしくお願いいたします.

--------------------------------------
北海道大学院理学研究科 地球惑星科学専攻
地球流体力学研究室  M2  塚原大輔

email::daktu32@xxxxxxxxxxxxxxxxxxxx
--------------------------------------

###################################################################
testalias.rb:
------------------------------------------------------
#!/usr/bin/env ruby

require "getopts"
require "numru/ggraph"
include NumRu


## redef NetCDFVar::put and get

module NumRu
  class NetCDFVar

    def get_with_miss_and_scaling_new(*args)
      p "get_with_miss_and_scaling_new"
      get_with_miss_and_scaling(*args)
    end

    def put_with_miss_and_scaling_new(data, *args)
      p "put_with_miss_and_scaling_new"
      put_with_miss_and_scaling(data, *args)
    end

    alias get get_with_miss_and_scaling_new
    alias put put_with_miss_and_scaling_new
  end
end

## tests

p "test1: save NetCDF with GPhys::IO.write"

  var = "uwnd"
  ifile = "test_uwnd.nc"
  gp = GPhys::IO.open(ifile, var)

  output = "output.nc"
  ofile = NetCDF.create(output)
  GPhys::IO.write(ofile, gp*1.1) # put_with_...scaling_new must be called...
  ofile.close

p "test2: save NetCDF with NetCDF.put"
  output2 = "output2.nc"
  ofile = NetCDF.create(output2)
    ofile.def_dim('x',10)
    ofile.def_dim('y',5)
    x = ofile.def_var("x","sfloat",["x"])
    y = ofile.def_var("y","sfloat",["y"])
    v = ofile.def_var("v1","sfloat",["x","y"])
    v.put_att("long_name","test 1")
    v.put_att("units","1")
  ofile.enddef
    x.put( NArray.float(10).indgen! )
    y.put( NArray.float(5).indgen! )
    v.put(NArray.float(10,5).indgen!*0.1)
  ofile.close

------------------------------------------------------
######################################################
stdout:
------------------------------------------------------
"test1: save NetCDF with GPhys::IO.write"
"get_with_miss_and_scaling_new"
"get_with_miss_and_scaling_new"
"get_with_miss_and_scaling_new"
"get_with_miss_and_scaling_new"
"test2: save NetCDF with NetCDF.put"
"put_with_miss_and_scaling_new"
"put_with_miss_and_scaling_new"
"put_with_miss_and_scaling_new"
------------------------------------------------------