# -*- coding: euc-jp -*-
#
# * 2011/11/30 Rain に対応させた
# * 2011/10/13 OLR, OSR を OLRA, OSRA に修正
# * 2011/09/30 ulwrftop の変数の扱いを修正
# * 2011/09/27 viewport の綴りを直した
# * 2011/09/22 x, y 軸の値を指定. NCEP のデータも扱えるように編集
# * 2011/09/21 OSR も描画するように編集
#
#
require "numru/ggraph"
include NumRu

######################################

def clim_mean( iyrs, iyre, imon, gphys, data )

  if data == "dcpam" then

     dataNumOfDay = 4
     daysOfMonth  = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

     daysofyear = 0
     daysOfMonth.each do |i|
       daysofyear += i
     end

     time = gphys.coord('time').val

     for iyr in iyrs..iyre
       t = daysofyear*(iyr-1)
       for i in 1..imon-1
         t = t + daysOfMonth[i-1]
       end

       ts = t
       te = t + daysOfMonth[imon-1]

       ts = ts * dataNumOfDay
       te = te * dataNumOfDay - 1

       if iyr == iyrs
         gphystmpD = gphys.cut('time'=>time[ts]..time[te]).mean('time')
       else
         gphystmpD = gphystmpD + gphys.cut('time'=>time[ts]..time[te]).mean('time')
       end
         gphystmpD = gphystmpD / ( iyre - iyrs + 1 )
     end
 
     return gphystmpD

  elsif data == "NCEP" then

    hoursOfDay = 24
    daysofyear = 0

    time = gphys.coord('time').val

    for iyr in iyrs..iyre
 
     t  = (iyr - 1948) * 12
     t  = t + (imon - 1)
     ts = t
 
#      p iyrs, imon, ts

      if iyr == iyrs
        gphystmpN = gphys.cut('time'=>time[ts])
      else
        gphystmpN = gphystmpN + gphys.cut('time'=>time[ts])
      end
    end

     gphystmpN = gphystmpN / ( iyre - iyrs + 1 )

     return gphystmpN

  end

end

######################################

iyrsD = ARGV[4].to_i
iyreD = ARGV[5].to_i
iyrsN = ARGV[6].to_i
iyreN = ARGV[7].to_i

imon = ARGV[8].to_i

title = ARGV[9]

dirD    = ARGV[0]
dirN  = ARGV[1] 

# 変数の設定と gphys の準備

## dcpam 計算結果用

vnameD = ARGV[2]
gphysD = GPhys::NetCDF_IO.open(dirD+'/'+vnameD+".nc", vnameD) 

tmD = gphysD.shape[2] # number of elements for time      dimension
timeD = gphysD.coord('time').val


## NCEP データ用

if vnameD == "OLRA" || vnameD == "OSRA"  # 放射フラックスの場合

   vnameN1 = ARGV[3]
   vnameN1_longname = vnameN1 + "top"

   vnameN2 = 'uswrf'
   vnameN2_longname = vnameN2 + "top"

   gphysN1 = GPhys::NetCDF_IO.open(dirN+'/'+vnameN1_longname + ".mon.mean"+".nc", vnameN1) 
   gphysN2 = GPhys::NetCDF_IO.open(dirN+'/'+vnameN2_longname + ".mon.mean"+".nc", vnameN2) 

   if vnameD ==  "OSRA" 
   
      gphysD = - gphysD
      gphysN = gphysN1 - gphysN2
   else
      gphysD = gphysD
      gphysN = gphysN1
   end

else                                     # 放射フラックス以外の場合

   vnameN = ARGV[3]
   gphysN = GPhys::NetCDF_IO.open(dirN+'/'+vnameN+ ".mon.mean"+".nc", vnameN) 

end

tmN = gphysN.shape[0] # number of elements for time      dimension
timeN = gphysN.coord('time').val

#< DCLのオープンと設定 >
DCL.gropn(2)
#DCL.sldiv('y',2,2)           # 2x2に画面分割, 'y'=yoko: 左上→右上→左下...
DCL.sgpset('lcntl', false)   # 制御文字を解釈しない
DCL.sgpset('lfull',true)     # 全画面表示
DCL.uzfact(0.75)             # 座標軸の文字列サイズを 0.75 倍
DCL.sgpset('lfprop',true)    # プロポーショナルフォントを使う

#< GGraph による 描画 >

GGraph.set_fig 'viewport'=>[0.15,0.7,0.1,0.5] # 描画領域 (xmin, xmax, ymin, ymax)
GGraph.set_axes('xlabelint'=>30) # x 軸に値を打つ間隔

data = "dcpam"
gphystmpD = clim_mean( iyrsD, iyreD, imon, gphysD, data ).mean('lon')

data = "NCEP"
gphystmpN = clim_mean( iyrsN, iyreN, imon, gphysN, data ).mean('lon')


if vnameD == 'SurfTemp'

# first panel
  GGraph.line( gphystmp )
#  GGraph.tone( gphystmp, true, 
#             'lev'=>[210,220,230,240,250,260,270,280,290,300],
#             # レベル＆パターンを陽に指定
#             'pat'=>[20999,30999,40999,45999,50999,55999,60999,70999,80999,85999,90999], 
#             # パタンの方が1つ多→±∞まで
#             'map_axes'=>true )
#  #GGraph.contour( gphystmp, false, 'lev'=>[200,210,220,230,240,250,260,270,280,290,300], 'index'=>3 )      # 参考まで

elsif vnameD == 'Rain'

  # second panel

  GGraph.set_fig('window'=>[-90,90,0,18e-5])     # 軸の最大/最小値を設定. [x 軸最小, x 軸最大, y 軸最小, y 軸最大]

  gphystmpD       = gphystmpD / 2.5e6
  gphystmpD.units = 'kg m-2 s-1'
  GGraph.line(gphystmpD,true,'annot'=>false,'title'=>'Monthly zonal mean Rain')

  GGraph.line( gphystmpN,false,"type"=> 2,"index"=>2 )

#  GGraph.tone( gphystmp, true, 
#             'lev'=>[0,1e-5,2e-5,4e-5,8e-5,12e-5,16e-5,20e-5,24e-5,28e-5,32e-5],
#             # レベル＆パターンを陽に指定
#             'pat'=>[1,20999,30999,35999,40999,50999,60999,65999,70999,75999,80999,85999], 
#             # パタンの方が1つ多→±∞まで
#             'map_axes'=>true )
#  #GGraph.contour( gphystmp, false, 'lev'=>[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150], 'index'=>3 )      # 参考まで

elsif vnameD == 'SoilMoist'


  # third panel
  GGraph.line( gphystmp )
#  GGraph.tone( gphystmp, true, 
#             'lev'=>[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150],
#             # レベル＆パターンを陽に指定
#             'pat'=>[15999,20999,25999,30999,35999,40999,45999,50999,55999,60999,65999,70999,75999,80999,85999,90999,95999],
#             # パタンの方が1つ多→±∞まで
#             'map_axes'=>true )
#  #GGraph.contour( gphystmp, false, 'lev'=>[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150], 'index'=>3 )      # 参考まで

elsif vnameD == 'SurfSnow'

  # forth panel
  GGraph.line( gphystmp )
#  GGraph.tone( gphystmp, true, 
#             'lev'=>[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150],
#             # レベル＆パターンを陽に指定
#             'pat'=>[15999,20999,25999,30999,35999,40999,45999,50999,55999,60999,65999,70999,75999,80999,85999,90999,95999], 
#             # パタンの方が1つ多→±∞まで
#             'map_axes'=>true )
#  #GGraph.contour( gphystmp, false, 'lev'=>[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150], 'index'=>3 )      # 参考まで

elsif vnameD == 'OLRA'

  # forth panel

  GGraph.set_fig('window'=>[-90,90,100,300])     # 軸の最大/最小値を設定. [x 軸最小, x 軸最大, y 軸最小, y 軸最大]
  GGraph.line( gphystmpD,true,'annot'=>false,'title'=>'Monthly zonal mean OLR' )
  GGraph.line( gphystmpN, false, "type"=> 2,"index"=>2 )

#  GGraph.tone( gphystmp, true, 
#             'lev'=>[100,120,140,160,180,200,220,240,260,280,300],
#             # レベル＆パターンを陽に指定
#             'pat'=>[10999,15999,20999,25999,30999,35999,40999,50999,60999,70999,80999,90999],
#             # パタンの方が1つ多→±∞まで
#             'map_axes'=>true )
#  #GGraph.contour( gphystmp, false, 'lev'=>[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150], 'index'=>3 )      # 参考まで

elsif vnameD == 'OSRA'

  # forth panel

   GGraph.set_fig('window'=>[-90,90,0,400])     # 軸の最大/最小値を設定. [x 軸最小, x 軸最大, y 軸最小, y 軸最大]
   GGraph.line( gphystmpD,true,'annot'=>false,'title'=>'Monthly zonal mean OSR' )
   GGraph.line( gphystmpN, false, "type"=> 2,"index"=>2 )

#  GGraph.tone( gphystmp, true, 
#             'lev'=>[100,120,140,160,180,200,220,240,260,280,300],
#             # レベル＆パターンを陽に指定
#             'pat'=>[10999,15999,20999,25999,30999,35999,40999,50999,60999,70999,80999,90999],
#             # パタンの方が1つ多→±∞まで
#             'map_axes'=>true )
#  #GGraph.contour( gphystmp, false, 'lev'=>[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150], 'index'=>3 )      # 参考まで

end

#GGraph.color_bar

DCL::uxmttl('T', ' ', 1.0)
DCL::uxmttl('T', ' ', 1.0)
DCL::uxmttl('T', title, -1.0)

DCL.grcls

