#!/usr/bin/env ruby
=begin

= gtdiv.rb : 2 つのデータの商を作成する. (未使用)
  
= USAGE :

  $ gtdiv.rb -[hHo] <--output=[outputname]> [ncfile1] [ncfile2]

= note

* 同じ格子構造をもっているファイルでなくてはならない.

* 変数は一致しなくても演算は可能. その場合出力される変数名は
  2 番目に与えた変数が適用される.
  
* 動作未保証.

=end


require "getopts"
require "numru/netcdf"
module NumRu
  class NetCDFVar
    alias put scaled_put
    alias get scaled_get
  end
end

require "numru/ggraph"
include NumRu

 $: << '/work31/daktu32/ecmwf/bin'
$: << '~/work/ecmwf/eva/bin'


class GPhys
  def save(output)
    nc = NetCDF.create(output)
    GPhys::NetCDF_IO.write(nc, self)
    nc.close
    return "saved as #{output}"
  end
end


def gtdiv(file)
  var1 = NetCDF.open(file[0], "r").var_names[-1]
  gphys1 = GPhys::NetCDF_IO.open(file[0], var1)   

  var2 = NetCDF.open(file[1], "r").var_names[-1]
  gphys2 = GPhys::NetCDF_IO.open(file[1], var2)   
  
  gphys = gphys1 / gphys2
  return gphys
end


def print_help

  print <<HELP

====================================================
                #{File.basename($0)} ver.0.1
====================================================

Describe:

  任意数のデータの和を作成する.

  * データフォーマットは netCDF に限る. 

  * 出力は, 与えられたデータと同様の格子構造をもつ netCDF フ
    ァイルである.

  * 格子構造が異なると エラー を返す.

USAGE: #{File.basename($0)} <opt> [ncfile [ncfile ..] ] [var]
  
  * 引数解説

    [ncfile] : 対象とする netCDF ファイル名を指定. 
               (ex. mean-V_2001_01.nc)
               複数指定可能. その場合, 変数値を各格子毎に平均
               したものを出力する.

    [var]    : 足したい変数名.

  * オプション

    -h, -H, --help : このメッセージを表示.
    -o, --output   : 出力する netCDF ファイル名を指定. 
                     デフォルトは, "gtadd.nc"

HISTORY:

  2003/12/06  created  by daktu32@ep.sci.hokudai.ac.jp

====================================================

HELP
exit
end

def ask_overwrite(output)

  if File.exist?(output) then

    print "\n"
    print %Q{the file name "#{output}" is already exists current directory.\n}
    print "Do you sure over write? (y/n)    "

    loop{
      flag = STDIN.gets.chomp

      if flag == "y" then
	break
      elsif flag == "n" then
	p "Bye."
	exit
      else
	print "please answer yes or no. (y/n)     "
      end

    }

  end

end


# オプション解析 ----------------------------------------------------
unless getopts("hH", "help", "o:", "output:")
  print "#{$0}:illegal options. please exec this program with -h/--help. \n"
  exit 1
end


if ($OPT_h) || ($OPT_H) || ($OPT_help) || ARGV.size == 0 then
print_help
exit 1
end

# 引数に与えた nc ファイルを格納する 配列.
file = Array.new

# 引数中の nc ファイルのみ格納
ARGV.each do |i| 
  if i =~ /.nc$/ then
    p i
    file << i
    raise ArgumentError, "Number of files must be less than 2." if file.size > 2 
  end
end


# 変数 : デフォルトはヘッダ の一番最後の変数を自動的に選択
#if ARGV[ARGV.size-1] =~ /.nc$/ then
#  var = NetCDF.open(file[0], "r").var_names[-1]
#else # 陽に指定も可能. その場合, 一番最後に与える.
#  var = ARGV[ARGV.size-1]
#end

# 保存ファイル名が与えられたら, その名前で保存. デフォルトは "gtstrm.nc".
if ($OPT_o) then
  output = ($OPT_o).to_s
elsif ($OPT_output) then
  output = ($OPT_output).to_s
else 
  output = "gtdiv.nc"
end


# オプション解析 終了----------------------------------------------------


# メインルーチン

p file

ask_overwrite(output)

p gphys = gtdiv(file)
gphys.save(output)          # nc ファイルに保存

