IT memo IT memo/CDO memo

NCL memo

Vertical interpolation of CCSM3.0 hybrid output

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
;************************************************
begin
;************************************************
; file handling
;************************************************
  dec = "198"
  yr = "5"
  year = dec+yr
  fnps = "fromesg/tmpPS"+dec+"0s_00"+yr+".nc"
  fn  = "fromesg/b30.030e.cam2.h3.U."+year+"-01-01_cat_"+year+"-12-31.nc" ; define filename
  inU  = addfile(fn,"r")                         ; open netcdf file
  inPS  = addfile(fnps,"r")                         ; open netcdf file
  fnout = "fromesg/b30.030e.cam2.h3.UPRS."+year+"-01-01_cat_"+year+"-12-31.nc"
  system("/bin/rm -f "+fnout)
  fout = addfile(fnout,"c")
;************************************************
; read needed variables from file
;************************************************
  U = inU->U                                    ; select variable
  P0mb =1000.
  hyam = inU->hyam                             ; get a coefficients
  hybm = inU->hybm                              ; get b coefficients
  PS   = inPS->PS                                ; get sfc pressure
;************************************************
; define other arguments required by vinth2p
;************************************************
; type of interpolation: 1 = linear, 2 = log, 3 = loglog
  interp = 2
; is extrapolation desired if data is outside the range of PS
  extrap = False
; create an array of desired pressure levels:
  pnew = (/1000.0,925,850.0,700.0,600,500.0,400,300.,250,200.0,150,100,70,50,30,20,10 /)
;************************************************
; calculate T on pressure levels
;************************************************
; note, the 7th argument is not used, and so is set to 1.
;************************************************
  uprs = vinth2p(U,hyam,hybm,pnew,PS,interp,P0mb,1,extrap)
  filedimdef(fout,"time",-1,True)
  uprs!0 = "time"
  uprs!1 = "lev"
  uprs!2 = "lat"
  uprs!3 = "lon"
  pnew@units = "hPa" ; required for grads compatible
  uprs&lev = pnew
  fout->uprs = uprs
end

Other tips

  • file status (e.g. addfile)
    "r": read only, "w": writable, "c": create
  • Creating GrADS-readable netCDF file
    x,y,z variables (i.e., "lon", "lat", "lev") should have attribution of their units. Usually, lon and lat will be ok. For lev, you need to do something like this below. (pnew is vertical pressure level and ugrd is a 4D variable)
      uprs!0 = "time"
      uprs!1 = "lev"
      uprs!2 = "lat"
      uprs!3 = "lon"
      pnew@units = "hPa" 
      uprs&lev = pnew
      fout->uprs = uprs