#!/usr/bin/ruby
# -*- coding: euc-jp -*-
# =begin
# == 概要
# 
# 横軸に自転角速度, 縦軸に熱輸送量 [W] をとった図を作成する
# 水, 大気別, かつ全球, 昼, 夜の合計 9 枚.
#
# == bug
#
# 複数ファイルを生成しようとしているが seqv になる.
# そのため, 現在では 1 枚描くごとに終了している.
# 根気良く複数回実行すること.
# 
# == 更新履歴
# 
# * 2014/12/28  増田 和孝   半径用に改造
# * 2011/08/12  納多 哲史   Omega = 0.799 (0.8 で南北非対称が出た場合) を追加
# * 2011/04/27  納多 哲史   新規作成
# 
# =end

require "numru/ggraph"
require 'fileutils'
include NumRu

#require '../load_config.rb'

# x 軸をログプロットする場合
#axis_x_log = true
axis_x_log = false

#DATA_HOME_LOCAL = DATA_HOME  # config.yml のを使う

#DATA_HOME_ENS = "/home/noda/data/exps_101220_diff-DryAir-Vapor_T21L16_sr_ensemble"
#DIR_HEADER_ENS = "101220_diff-DryAir-Vapor_T21L16_sr_Rplanet"
#DIR_HOOTER_ENS = "E_rndTemp_"
DATA_HOME_LOCAL = '/GFD_Dennou_Work11/masuda/'
rplanets=[0.5,1.0,1.25,1.46,2.0,4.0,6.0,8.0,12.0,16.0]

TMPFILE = "dcl.ps"

nexp = 10

draw_mean = 'yes'

TIME_START = 725
TIME_END = 1095

VAL_MAX =  50
VAL_MIN =    0

WSN = 2
MARK_SIZE = 0.01

LatentHeat = 2.5e6


YNAME = 'Heat Flux'
TITLE = ''

#RPlanet =6.371 * 10.0 ** 6    # [m]

vars = [
        {'name'=>'OLR'},
        {'name'=>'Evap'},
        {'name'=>'Rain'},
        {'name'=>'Sens'},
        {'name'=>'OSR'},
        {'name'=>'SLR'}
       ]

vars_wt_DtoN = vars.dup   # 単なる代入だと参照渡しになるため
vars_wt_DtoN.push({'name'=>'trans_all'})
vars_wt_DtoN.push({'name'=>'trans_sens'})
vars_wt_DtoN.push({'name'=>'trans_lat'})

#1: 点
#2: 十字
#3: アスタリスク
#4: 白抜き丸
#5: バツ
#6: 白抜き正方形
#7: 白抜き上向き三角
#8: 白抜き菱形
#9: 白抜き星
#10: 黒塗り丸
#11: 黒塗り正方形
#12: 黒塗り上向き三角
#13: 黒塗り左向き三角
#14: 黒塗り下向き三角
#15: 黒塗り右向き三角
#16: 黒塗り星
#17: 黒塗り右向き旗


mark_type = Hash.new
mark_type['OLR']  = 4
mark_type['Rain'] = 5
mark_type['Evap'] = 6
mark_type['Sens'] = 7
mark_type['OSR']  = 9
mark_type['SLR']  = 10
mark_type['trans_all']  = 11
mark_type['trans_sens'] = 14
mark_type['trans_lat']  = 16

rplanets.delete(0.0) if axis_x_log
na_rplanets = NArray.to_na(rplanets)
nrplanet = rplanets.size

flux_std = Hash.new
flux_all_std = Hash.new
flux_east_std = Hash.new
flux_west_std = Hash.new

flux_ens = Hash.new
flux_all_ens = Hash.new
flux_east_ens = Hash.new
flux_west_ens = Hash.new


# 描画設定
#p i
#  if i == 0 then
DCL.uzfact(0.6)
#  end

## TOP of standard data handling

# Variable Loop
for v in vars

  p var = v['name']

  all  = NArray.sfloat(nrplanet)
  west = NArray.sfloat(nrplanet)
  east = NArray.sfloat(nrplanet)

  ## Rplanet Loop


  for i in 0..nrplanet-1
### Read STANDARD Data
    rplanet = na_rplanets[i]
    file = var + '.nc'
    dir = 'E_T42L26_sync_R' + rplanet.to_s
    p   dir 
    
    path = File.join(DATA_HOME_LOCAL, dir, file)
    gphys = GPhys::IO.open(path, var)
    
    na_lon = GPhys::IO.open(path, 'lon').val
    na_lat = GPhys::IO.open(path, 'lat').val
    na_lat_weight = GPhys::IO.open(path, 'lat_weight').val
    nlon = na_lon.size
    nlat = na_lat.size
    
# time average
    gphys = gphys.cut('time'=>TIME_START..TIME_END).mean('time')
  
  # Horizontal Mean
    gphys = gphys * na_lat_weight.reshape(1, nlat) / na_lat_weight.sum

  # all, west, east : NArray
    all[i] = gphys.mean('lon').sum('lat').val
    west[i] = gphys.cut('lon'=>na_lon[0]..na_lon[nlon/2 -1]).mean('lon').sum('lat').val
    east[i] = gphys.cut('lon'=>na_lon[nlon/2]..na_lon[nlon-1]).mean('lon').sum('lat').val
    
  end
  ### End of Rplanet loop

  case var
  when 'OLR'
    flux_all_std[var] = all
    flux_east_std[var] = east
    flux_west_std[var] = west
  when 'OSR'
    flux_all_std[var] = -1.0 * all
    flux_east_std[var] = -1.0 * east
    flux_west_std[var] = -1.0 * west
  when 'Evap'
    flux_all_std[var] = -1.0 * all
    flux_east_std[var] = -1.0 * east
    flux_west_std[var] = -1.0 * west
  when 'Rain'
    flux_all_std[var] = LatentHeat * all
    flux_east_std[var] = LatentHeat * east
    flux_west_std[var] = LatentHeat * west
  else
    flux_all_std[var] = all
    flux_east_std[var] = east
    flux_west_std[var] = west
  end

end
# End of variable loop

# 昼から夜への輸送の計算
d2n = Hash.new
d2n['trans_all'] = flux_east_std['OLR']
d2n['trans_lat'] = flux_east_std['Evap'] + flux_east_std['Rain']
d2n['trans_sens'] = d2n['trans_all'] - d2n['trans_lat']
p d2n['trans_sens'] - flux_east_std['OSR'] + flux_east_std['Evap'] + flux_east_std['SLR'] + flux_east_std['Sens']
# 後で図を描くときの便利のため, 全て同一の配列に押し込める
for var in ['trans_all', 'trans_lat', 'trans_sens']
  flux_all_std[var] = d2n[var]
  flux_east_std[var] = d2n[var]
  flux_west_std[var] = -1.0 * d2n[var]
end

flux_std['all'] = flux_all_std
flux_std['east'] = flux_east_std
flux_std['west'] = flux_west_std  

## BOTTOM of std data setting
# trans_sens
threshold_trans_sens = 180.0
#for irplanet in 0..3 do
#  ensemble_mean_trans_sens_small[irplanet] = 999
#  ensemble_mean_trans_sens_large[irplanet] = 999
#end

#for irplanet in 4..nrplanet-1 do


DCL.glpset('lmiss',true)    # handle data missing
DCL::sglset('LCNTL', true)

## Rplanet axis
na_rplanets_4axis = na_rplanets
na_rplanets_4axis = NMath::log10( na_rplanets ) if axis_x_log
# ORIGINAL VER.
tmp_long_name = "Rplanet/RplanetE"
#tmp_long_name = DCL::csgi(151)+'|*"'

tmp_long_name = 'log10(' + tmp_long_name + ')' if axis_x_log

va_rplanet = VArray.new( na_rplanets_4axis,
                       {"long_name"=>tmp_long_name},
                       "rplanet" )
axis_rplanet = Axis.new.set_pos(va_rplanet)


# testing
vars_draw = Hash.new

p  draw_types = ['atmos_heat']
#vars_draw['atmos_heat'] = ['OLR', 'Sens', 'SLR', 'Rain', 'trans_sens']
vars_draw['atmos_heat'] = ['OLR' , 'trans_lat' , 'trans_sens']
vars_draw['atmos_wat'] = ['Rain', 'Evap', 'trans_lat']
vars_draw['surf_heat'] = ['Evap', 'Sens', 'SLR']



#ary = ['all', 'west', 'east']
ary = ['east']

GGraph.set_fig('viewport'=>[0.3,0.6,0.3,0.5])

DCL.sgpset('lfull', true)     # 全画面表示
DCL.sgpset('lcntl', false)

DCL.gropn(WSN)

opt = {
    'max'=>VAL_MAX, 'min'=>VAL_MIN,
    'index'=>5, 'size'=>MARK_SIZE,
    'legend'=>false, 'annotate'=>false,
    'title'=>TITLE
}


# BEGIN region loop
for i in 0..ary.size-1

  area = ary[i]

  ### exp LOOP


  # std
  gp_std = Hash.new
  for v in vars_wt_DtoN
    var = v['name']
    long_name = YNAME
    # ORIGINAL Ver.
#    units = 'W m-2'
    units = 'W m|-2"'

    tmp_std = flux_std[area][var]
    data_std = VArray.new( tmp_std, {"long_name"=>long_name, "units"=>units}, var)
    gp_std[var] = GPhys.new( Grid.new(axis_rplanet), data_std )
  end
  

  for draw_type in draw_types
    name = draw_type + '_' +  area + '_unit-watt'
    name = name + '_xlog' if axis_x_log
    psfn = name + '.ps'
    epsfn = name + '.eps'

    vars_tmp = vars_draw[draw_type]

    if File.exist?(epsfn) then
      puts("MESSAGE: #{epsfn} have already existed. Skipped.")
      next
    end

    # variable loop
    for i in 0..vars_tmp.size-1
      v = vars_tmp[i]
      gp_tmp = gp_std[v]
      opt['type'] = mark_type[v].to_i
      if i == 0 then
        GGraph.mark( gp_tmp, true, opt )
      else
        GGraph.mark( gp_tmp, false, opt )
      end
    end

  
#    DCL::sglset('LCNTL', true)
#    DCL::sgtxv(0.6, 0.6, 'W m|-2"')
#    DCL::sgtxv(0.7, 0.7, DCL::csgi(151)+'_E"')
#    DCL::sgtxv(0.7, 0.7, DCL::csgi(151)+'|*"')

    DCL.grcls

    # remove extra space of ps file
    if WSN == 2 then
      if File.exist?(TMPFILE) then

        FileUtils.mv(TMPFILE, psfn)
        puts("MESSAGE: after processing ... #{epsfn} will be generate.")
        `dclpsrmcm #{psfn} | dclpsrot | dclpsmargin > #{epsfn}`
        File.delete(psfn)

        exit
      end
    end

  end
  # draw_type LOOP

end
# END region LOOP



# debug
#  DCL.grcls

exit(0)

