#!/usr/bin/env ruby
=begin

= gtstrm.rb : 温度から温位のデータを作成する.
  
= USAGE :

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

= note

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

* 変数は一致しなくても演算は可能. 

* 結果として得られる変数は "theta".

=end
# 設定部分
## 変数名
$new_vname = "theta"
## RUBYLIB に追加
$: << '/GFD_Dennou_Club/dc-arch/dcchart/daktu32/ERA40'
$: << '/GFD_Dennou_Club/dc-arch/dcchart/daktu32/ERA40/bin'
$: << '/work31/daktu32/ERA40'
$: << '/work31/daktu32/ERA40/bin'
## 追加メソッド定義ファイル
require "libgphys-e.rb"
## 属性設定ファイル
require "ERA40-ncattr.conf.rb"

#############  以下メインルーチン  ##############

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

require "numru/ggraph"
include NumRu

# オプション解析 ----------------------------------------------------
unless getopts("hH", "help", "each", "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 <<EOF

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

Describe:

  大気の温度(t) から温位を求める.

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

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

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

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

    [var]    : 温度の変数名. できれば t であることが望ましい. 

  * オプション

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

  以下, コード中で与えているパラメータ.

  * R  :: 気体定数 => 8.314472   (J/K/mol)
  * CP :: 大気の定圧比熱 => 
  * Kappa :: R/CP => 0.288

HISTORY:

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

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

EOF
exit 1
end



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

# 引数中の nc ファイルのみ格納
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[0], "r").var_names[-1]
else # 陽に指定も可能. その場合, 一番最後に与える.
  var = ARGV[ARGV.size-1]
end



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



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

ask_overwrite(output)# 保存するファイルの上書きに関して問う. y or n で答える.

# メインルーチン

if ($OPT_each)
  file.each do |f|
p    output = File.basename(f.sub("T_", "Theta_")) if ($OPT_each)
p    gphys = GPhys::NetCDF_IO.open(f, var)
    the = gphys.theta($new_vname)
    the.save(output, $global_attr, $new_vname, $var_attr, $history)          # nc ファイルに保存
  end
  exit
end

if file.size == 1 then  # 単体の nc ファイルの場合
  gphys = GPhys::NetCDF_IO.open(file[0].to_s, var)
else                    # 複数ある場合, それらの平均値たるオブジェクト生成
  gphys = mean_gphys(file, var)
end

p the = gphys.theta($new_vname) # 質量流線関数オブジェクト生成
p the.save(output, $global_attr, $new_vname, $var_attr, $history)          # nc ファイルに保存 & 属性付加
