#! /usr/bin/env ruby
=begin

= title:

  mkmean-nc-5dim.rb  -- netCDF $B%G!<%?$N(B 4, 5 $B<!85L\(B(time $B<4(B, date $B<4(B)$B$K$D$$$F$NJ?6Q$r$H$C$?%G!<%?$r@8@.$9$k%9%/%j%W%H(B.

= usage:

  mkmean-nc-5dim.rb file [file...] ($BNc(B: $ mkmean-nc-5dim.rb ./*.nc)

= description:
* $B0z?t$K$H$C$?(B nc $B%U%!%$%k$=$l$>$l$KBP$7$F(B, 4, 5 $B<!85L\$=$l$>$l$KBP$7$FJ?6Q$r$H$C$?(B nc $B%U%!%$%k$r?7$?$K@8@.$9$k(B.
  * $BF,$K(B daily $B$H$$$&@\F,6g$,$D$$$F$$$k%U%!%$%k$N$_BP>](B
  * $B@8@.$5$l$k%U%!%$%kL>$O(B daily $B$r=|$$$?$b$N$K$J$k(B.
* $B1tD>%G!<%?$+$i7nJ?6Q%G!<%?$r@8@.$9$k$N$K;HMQ(B.
 

= history:

  2003-12-22 created by daktu32@ep.sci.hokudai.ac.jp

=end
require "getopts"
require "numru/netcdf"

## $BDI2C%a%=%C%IDj5A%U%!%$%k(B
require "libgphys-e.rb"
## $BB0@-@_Dj%U%!%$%k(B
require "ERA40-ncattr.conf.rb"


module NumRu
  class NetCDFVar
    def scaled_get(hash=nil)
      sf = att('scale_factor')
      ao = att('add_offset')
      if ( sf == nil && ao == nil ) then
	# no scaling --> just call get
	simple_get(hash)
      else
	if (sf != nil) 
	  csf = sf.get
	       if csf.is_a?(NArray) then  # --> should be a numeric
		 csf = csf[0]
	       elsif csf.is_a?(String)
		 raise NetcdfError, "scale_factor is not a numeric"
	       end
	  if(csf == 0) then; raise NetcdfError, "zero scale_factor"; end
	else
	  csf = 1.0      # assume 1 if not defined
	end
	if (ao != nil) 
	  cao = ao.get
	  if cao.is_a?(NArray) then  # --> should be a numeric
	    cao = cao[0]
	  elsif csf.is_a?(String)
	    raise NetcdfError, "add_offset is not a numeric"
	  end
	    else
	  cao = 0.0      # assume 0 if not defined
	end
	var = simple_get(hash)
	var = var.to_type( NArray::FLOAT )
	csf*var+cao
      end
    end  
    alias put scaled_put
    alias get scaled_get
  end
end

require "numru/ggraph"
include NumRu

# $B%*%W%7%g%s2r@O(B ----------------------------------------------------
unless getopts("hHo", "help", "output:")
  print "#{$0}:illegal options. please exec this program with -h/--help. \n"
  exit 1
end



file = Array.new
ARGV.each do |i| 
  if i =~ /.nc$/ then
    p i
    file << i
  end
end



if ARGV[ARGV.size-1] =~ /.nc$/ then
  var = NetCDF.open(file.last, "r").var_names[-1]
else
  var = ARGV[ARGV.size-1]
end

if file.size == 1 then
  file = file[0].to_s
end


filename = File.basename($0)

p file
p a = Time.now

file.each {|f|

  p gphys = GPhys::NetCDF_IO.open(f, var)
  p mean = gphys.mean(3, 4)
  
  p newfile = File.basename(f).sub("daily_", "")
  p newfile = ($OPT_output) if ($OPT_output)
  
  global_attr = global_attr(f)
  mean.save(newfile, global_attr)
  
  p "make #{newfile}"

}

p Time.now - a


