=begin
=Status
* only reading
=end
require "numru/gphys/grib"
require "numru/gphys/varray"
module NumRu
=begin
=NumRu::VArrayGrib < VArray
==Class Methods
---new(GribVar)
==Methods
=end
class VArrayGrib < VArray
def initialize(aGribVar)
if !GribVar===aGribVar && !GribDim===aGribVar
raise ArgumentError,"Not a GribVar or GribDim"
end
@name = aGribVar.name
@mapping = nil
@varray = nil
@ary = aGribVar
@attr = Attribute.new
aGribVar.att_names.each{|name|
@attr[name] = aGribVar.att(name)
}
if GribDim===@ary
class << @ary
def rank
return 1
end
def shape
return [@length]
end
end
end
end
def inspect
if GribVar===@ary
"<'#{@name}' in '#{@ary.file.path}' [#{@ary.shape.join(", ")}]>"
elsif GribDim===@ary
"<'#{@name}' in '#{@ary.var.name}' #{@ary.length}>"
end
end
class << self
## < redefined class methods > ##
def new2(file, name, dims, vary)
v = file.def_var(name)
dims.length.times{|n|
d = dims[n]
if GribDim===d
gd = v.def_dim(d.name,n)
gd.put(d.get)
d.att_names.each{|name| gd.put_att(name,d.att(name)) }
elsif VArray===d
gd = v.def_dim(d.name,n)
gd.put(d.val)
d.att_names.each{|name| gd.put_att(name,d.get_att(name)) }
elsif String===d
gd = v.def_dim(d,n)
gd.put(NArray.sfloat(vary.shape_ul0[n]).indgen)
else
raise "type is not correct"
end
}
va = new(v)
vary.att_names.each{|name| va.put_att(name,vary.get_att(name)) }
return va
end
alias def_var new2
## < additional class methods > ##
def write(file,vary,dims=nil)
Grib===file || raise(ArgumentError,"1st arg: not a Grib")
VArray===vary || raise(ArgumentError,"2st arg: not a VArray")
rank = vary.rank
if !dims
dims = vary.dim_names
if VArrayGrib===vary
class << vary
def dim(dn)
@ary.dim(dn)
end
end
dims = dims.collect{|dim| vary.dim(dim) }
end
end
newvary = new2(file,vary.name,dims,vary)
newvary.val = vary.val
file.write
return newvary
end
end
## < redefined instance methods > ##
def val
return @ary.val
end
def val=(narray)
shape==narray.shape || raise("not same shape")
@ary.put(narray)
end
def shape
@ary.shape
end
def total
@ary.total
end
alias length total
def rank
@ary.rank
end
undef reshape!
## < additional instance methods > ##
def dim_names
@ary.dim_names
end
def shape_ul0
@ary.shape
end
def shape_current
@ary.shape
end
def file
@ary.file
end
def put_att(name,val)
@ary.put_att(name,val)
end
end # class VArrayGrib
end # module NumRu
###########################################################
### < test >
if $0 == __FILE__
$DEBUG = true
include NumRu
grib = Grib.open("../../../testdata/T.jan.grib")
gv = grib.var("TMP")
va = VArrayGrib.new(gv)
p va.dim_names
p va.shape_ul0
va.att_names.each{|key|
p [key, va.get_att(key)]
}
p va.val
va2 = va[3..9,5..15,0]
p va2.shape
p va2.val
end
syntax highlighted by Code2HTML, v. 0.9.1