def parse_nusdas_def
dname = File.join(@root, "nusdas_def")
unless File.exist?(dname)
dname = File.join(@root, "NUSDAS_DEF")
end
return nil unless File.exist?(dname)
fname = Dir[File.join(dname,"*def")]
if fname.length > 2
raise "There are multiple nusdas def files"
end
fname = fname[0]
params = Hash.new
File.open(fname){|file|
line = file.gets
while(line)
ary = line.chop.split
if ary[0]
name = ary[0].downcase.to_sym
if params[name]
unless Array === params[name][0]
params[name] = [ params[name] ]
end
params[name].push(val=ary[1..-1])
else
params[name] = val = ary[1..-1]
end
end
line = file.gets
while /^\s/ =~ line
val.push *line.chop.split
line = file.gets
end
end
}
if val = params[:type1]
@type1 = val.join.ljust(8)
@meta[:projection] = @@projection_abbrs[val[1]]
else
raise 'type1 must be exist in nusdas_def'
end
if val = params[:type2]
@type2 = val.join.ljust(4)
else
raise 'type2 must be exist in nusdas_def'
end
if val = params[:type3]
@type3 = val[0].ljust(4)
else
raise 'type3 must be exist in nusdas_def'
end
if val = params[:size]
@meta[:size] = [val[0].to_i, val[1].to_i]
else
raise 'size must be exist in nusdas_def'
end
if val = params[:distance]
@meta[:distance] = [val[0].to_f, val[1].to_f]
else
@meta[:distance] = [0.0, 0.0]
end
if val = params[:basepoint]
@meta[:basepoint] = [val[0].to_f, val[1].to_f]
bp21 = /E$/ =~ val[2] ? val[2][0..-2] : val[2]
bp20 = /E$/ =~ val[3] ? val[3][0..-2] : val[3]
@meta[:basepoint2] = [bp20.to_f, bp21.to_f]
else
@meta[:basepoint] = [0.0, 0.0]
@meta[:basepoint2] = [0.0, 0.0]
end
if val = params[:others]
s1 = /E$/ =~ val[0] ? val[0][0..-2] : val[0]
s0 = /N$/ =~ val[1] ? val[1][0..-2] : val[1]
@meta[:others] = [s0.to_f, s1.to_f]
s1 = /E$/ =~ val[2] ? val[2][0..-2] : val[2]
s0 = /N$/ =~ val[3] ? val[3][0..-2] : val[3]
@meta[:others2] = [s0.to_f, s1.to_f]
else
@meta[:others] = [0.0, 0.0]
@meta[:others2] = [0.0, 0.0]
end
if val = params[:standard]
s1 = /E$/ =~ val[0] ? val[0][0..-2] : val[0]
s0 = /N$/ =~ val[1] ? val[1][0..-2] : val[1]
@meta[:standard] = [s0.to_f, s1.to_f]
s1 = /E$/ =~ val[2] ? val[2][0..-2] : val[2]
s0 = /N$/ =~ val[3] ? val[3][0..-2] : val[3]
@meta[:standard2] = [s0.to_f, s1.to_f]
else
@meta[:standard] = [0.0, 0.0]
@meta[:standard2] = [0.0, 0.0]
end
if val = params[:creator]
@meta[:creator] = val.join(" ")
else
@meta[:creator] = 'Japan Meteorological Agency, http://www.jma.go.jp/'
end
if val = params[:plane]
@meta[:nplane] = val[0].to_i
else
raise 'plane must be exist in nusdas_def'
end
if val = params[:plane1]
@meta[:planes] = val.collect{|s| s.ljust(6)}
else
raise 'plane1 must be exist in nusdas_def'
end
if val = params[:plane2]
@meta[:planes2] = val.collect{|s| s.ljust(6)}
else
@meta[:planes2] = @meta[:plenes]
end
if val = params[:element]
i = val[0].to_i
@meta[:nelement] = i
@meta[:elements] = Array.new
else
raise 'element must be exist in nusdas_def'
end
if val = params[:elementmap]
if Array === val[0]
len = val.length
@meta[:elements] = ary = Array.new(len)
len.times{|n| ary[n] = val[n][0].ljust(6) }
else
@meta[:elements] = [val[0].ljust(6)]
end
else
raise 'elementmap must be exist in nusdas_def'
end
if @meta[:nelement] != @meta[:elements].length
raise "number of elementmap is not same as element in nusdas_def"
end
if val = params[:information]
if Array === val[0]
len = val.length
@meta[:info] = ary = Array.new
len.times{|n| ary[n] = val[n][0] }
else
@meta[:info] = [val[0]]
end
else
@meta[:info] = Array.new
end
@meta[:ninfo] = @meta[:info].length
if val = params[:subcntl]
@meta[:nsubc] = val[0].to_i
else
@meta[:nsubc] = 0
end
if val = params[:member]
@meta[:nmember] = n = val[0].to_i
params[:member_io] = val[1].upcase
val = params[:memberlist]
@meta[:members] = val.collect{|s| s.ljust(4)}
if n != @meta[:members].length
raise "number of memberlist is not same as member in nusdas_def"
end
else
@meta[:nmember] = 1
@meta[:members] = [" "]
end
if val = params[:validtime]
@meta[:nvalidtime] = val[0].to_i
if /(IN|OUT)/ =~ val[1].upcase
params[:validtime_io] = val[1]
@meta[:validtime_unit] = val[2]
elsif /(IN|OUT)/ =~ val[2].upcase
params[:validtime_io] = val[2]
@meta[:validtime_unit] = val[1]
else
raise "validtime is invalid in nusdas_def"
end
else
raise 'validtime must be exist in nusdas_def'
end
if val = params[:validtime1]
case val[0]
when "ARITHMETIC"
@meta[:validtimes] = NArray.int(@meta[:nvalidtime]).indgen(val[1].to_i,val[2].to_i)
when "ALL_LIST"
if @meta[:nvalidtime] != val.length-1
raise "number of validtime1 is not same as validtime in nusdas_def"
end
na = NArray.int(@meta[:nvalidtime])
val[1..-1].each_with_index{|s,i| na[i] = s.to_i}
@meta[:validtimes] = na
else
raise "validtime1 is invalid in nusdas_def"
end
else
raise 'validtime1 must be exist in nusdas_def'
end
if val = params[:validtime2]
na = NArray.int(@meta[:nvalidtime])
ft = val[0].to_i
if ft > 0
if @meta[:nvalidtime] != val.length
raise "number of validtime2 is not same as validtime in nusdas_def"
end
val.each_with_index{|s,i| na[i] = s.to_i}
else
na.fill(-ft)
end
@meta[:validtimes2] = na
else
@meta[:validtimes2] = NArray.int(@meta[:nvalidtime]).fill(1)
end
if val = params[:missing]
@meta[:missing] = val[0]
else
@meta[:missing] = 'NONE'
end
if val = params[:packing]
@meta[:packing] = val[0]
else
@meta[:packing] = '2UPC'
end
if val = params[:value]
@meta[:value] = val[0]
else
@meta[:value] = 'PVAL'
end
if path = params[:path]
case path[0].upcase
when 'NWP_PATH_S'
fpat = File.join(@root,'_3d_name','_validtime')
when 'NWP_PATH_BS'
fpat = File.join(@root,'_3d_name','_basetime')
when 'NWP_PATH_M'
fpat = File.join(@root,'_3d_name','_member','_validtime')
when 'NWP_PATH_VM'
fpat = File.join(@root,'_3d_name','_member')
when 'RELATIVE_PATH'
fname = params[:filename]
rpath = path[1]
fpat = File.join(@root,rpath)
fpat = File.join(fpat,fname[0]) if fname
else
raise "path is invalide in nusdas_def"
end
else
fname = params[:filename]
rpath = "_model/_attribute/_space/_time/_name/_basetime"
rpath = File.join(rpath,"_member") if params[:member_io] == "OUT"
rpath = File.join(rpath,"_validtime") if params[:validtime_io] == "OUT"
fpat = File.join(@root,rpath)
fpat = File.join(fpat,fname[0]) if fname
end
ary = Array.new
fpat.sub!(/_model/,@type1[0,4])
fpat.sub!(/_space/,@type1[-4,4])
fpat.sub!(/_2d/,@type1[4,2])
fpat.sub!(/_3d/,@type1[6,2])
fpat.sub!(/_time/,@type2[0,2])
fpat.sub!(/_time/,@type2[-2,2])
fpat.sub!(/_name/,@type3)
fpat.sub!(/_basetime/,'*')
fpat.sub!(/_validtime/,'*')
if /_member/ =~ fpat
mem = @meta[:members]
len = mem.length
fpats = Array.new(len)
len.times{|n| fpats[n] = fpat.sub(/_member/, mem[n]) }
else
fpats = [fpat]
end
ary = Array.new
fpats.each{|s|
s.gsub!(/\s/,'_')
ary += Dir[s]
}
return ary
end