#
# ximg01.rb
#
# $Id: ximg01.rb,v 1.2 2000/11/27 01:49:23 keiko Exp $
#

#-----------------------------------------------------------------------
#     TOMS OZONE DISTRIBUTION (MONTHLY MEAN CLIMATOLOGY)
#-----------------------------------------------------------------------

require "narray"
require "numru/dcl"

include NumRu
include Math


KXBK = 12
IXBK = KXBK*2+1
JXBK = 37
IXBG = 73
JXBG = 37
IXGX = 361
JXGX = 181
NCL = 100
NCL1 = NCL+1

bkdata = NArray.sfloat(IXBK*JXBK)
bgdata = NArray.sfloat(IXBG, JXBG)
gxdata = NArray.sfloat(IXGX, JXGX)
tlevn = NArray.sfloat(NCL1)

def fftezb(fc, nx)
  nn = 0
  maxwn = fc.shape[0]

  nmax = 512
  if (nx > nmax)
    cmsg = format("WORKING AREA IS NOT ENOUGH / NX SHOULD BE .LE. %4d.", nmax)
    DCL::msgdmp('E', 'FFTEZB', cmsg)
  end
  if (nx < maxwn*2)
    cmsg = "MAXWN CANNOT BE CALCULATED / NX SOULD BE .GE. MAXWN*2.0"
    DCL::msgdmp('E', 'FFTEZB', cmsg)
  end

  if (nx != nn)
    wsave = DCL::rffti(nx)
    nn=nx
  end
  y = Array.new(nx, 0)
  y[0] = fc[0]
  1.step(maxwn-1, 2) do |i|
    y[i] = fc[i] * 0.5
    y[i+1] = fc[i+1] * -0.5
  end
  y = DCL::rfftb(y, wsave)
end

def bktobg(bkdata, bgdata)
  rmiss = DCL::glrget('RMISS')
#     CALL DTPGET('MAXWN',KX)
  for j in 0..JXBG-1
    if (bkdata[0,j] == rmiss)
      bgdata[true,j] = rmiss
    else
      wk = fftezb(bkdata[true,j], IXBG-1)
      bgdata[0..-2, j] = wk
      bgdata[-1,j]=bgdata[0,j]
    end
  end
end

#-- data ---
ipatn = []
for i in 0..NCL-1
  ipatn[i] = ([11, i+1].max) *1000 + 999
end
tlevn.indgen(203.0, 3.0)

cdsn = 'tomsclm.dat'
file = open(cdsn, "r")

DCL::swlstx('LWAIT', false)
DCL::swlstx('LWAIT0', false)
DCL::swlstx('LDUMP', false)
DCL::swistx('IPOSX', 200)
DCL::swistx('IPOSY', 200)
DCL::swistx('IWIDTH', 800)
DCL::swistx('IHEIGHT', 400)

#-- graph ---
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::gropn iws
DCL::gllset('LMISS', true)
rmiss = DCL::glrget('RMISS')
DCL::sglset('LFULL', true)
DCL::sglset('LSOFTF', false)
DCL::umlset('LGLOBE', true)
DCL::slrat(1.0, 0.5)

for m in 1..12
  mon = file.gets.split(" ")[-1].to_i
  bkdata.reshape(IXBK*JXBK)
  i = 0
  (JXBK*3).times do |j|
    file.gets.split(" ").each do |data|
      bkdata[i] = data.to_f
      i += 1
    end
  end
  bktobg(bkdata.reshape(IXBK, JXBK), bgdata)
  gxdata.fill!(rmiss)
  for j in 0..JXBG-1
    for i in 0..IXBG-1
      gxdata[i*5, j*5] = bgdata[i,j]
    end
    wk = DCL::vrintr(gxdata[true, j*5], IXGX, 1)
    gxdata[true, j*5] = wk
  end
  for i in 0..IXGX-1
    wk = DCL::vrintr(gxdata[i, true], JXGX, 1)
    gxdata[i, true] = wk
  end

  DCL::grfrm
  DCL::grswnd(0.0, 360.0, -90.0, 90.0)
  DCL::grsmpl(180.0, 90.0, 0.0)
  DCL::grstrn(DCL::isgtrc('HMR'))
  DCL::umpfit
  DCL::grstrf

  DCL::slpwwr(1)
  DCL::ueitlv
  DCL::uestln(tlevn, ipatn)
  DCL::uetonf(gxdata)

  DCL::umpgrd
  DCL::umplim
  DCL::umpmap('coast_world')
end
file.close

DCL::grcls



syntax highlighted by Code2HTML, v. 0.9.1