#!/usr/bin/env ruby
=begin

= gtmask.rb : 地表面圧力より大きい値をもつ格子点に欠損値を挿入したデータを作成.
  
= USAGE :

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

= note

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

* 与えるデータは時間軸平均をかけたものを利用. (eddy は含まれていない.)

* マスクデータを作る際は numru/netcdf_miss.rb 中の一部を編集しなくてはならない.
  詳細は上記ファイルを参照のこと.


=end
#############  以下メインルーチン  ##############
require "getopts"
require "numru/ggraph"

## 追加メソッド定義ファイル
require "libgphys-n"
## 属性設定ファイル
require "NCEP-ncattr.conf"


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

p hnc = ARGV.shift
var = NetCDF.open(hnc, "r").var_names[-1]
p gphys = GPhys::NetCDF_IO.open(hnc.to_s, var)

# 引数に与えた 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 = "gtmask.nc"
end



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

# メインルーチン

if ($OPT_each) # 複数ファイルを同時に扱うとき.
  file.each do |f|
    p_gphys = GPhys::NetCDF_IO.open(f, var)
    output = File.basename(f).sub("PRES_", "MASK_") if ($OPT_each)
    mask = gphys.make_sfc_mask(p_gphys)
    mask.save(output, $global_attr, var, $var_attr)          # nc ファイルに保存
  end
  exit
end

if file.size == 1 then  # 単体の nc ファイルの場合
  p_gphys = GPhys::NetCDF_IO.open(file[0].to_s, var)
elsif ($OPT_c) 
  p_gphys = GPhys::NetCDF_IO.open(file, var)
else         
  vgarray = Array.new
  file.each do |f|
    vgarray << GPhys::NetCDF_IO.open(f.to_s, var)
  end
  vgphys = vgarray[0]
  1.upto(vgarray.length-1) {|n|
    vgphys += vgarray[n]
  }
  p_gphys = vgphys/file.length
end
title = "surface mask"
$global_attr["title"] = title
gphys = (gphys.make_sfc_mask(p_gphys))
gphys.save(output, $global_attr, gphys.name, nil, $history)  # nc ファイルに保存 # 質量流線関数オブジェクト生成
#    nc = NetCDF.create(output)
#    gphys=gphys.make_sfc_mask(p_gphys)
#    GPhys::NetCDF_IO.write(nc, gphys)
#nc.close
