NCL Home > Documentation > Functions > Meteorology

wgt_vertical_n

Calculates a weighted vertical average and/or sum (integral).

Available in version 6.4.0 and later.

Prototype

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"  ; This library is automatically loaded
                                                             ; from NCL V6.2.0 onward.
                                                             ; No need for user to explicitly load.

	function wgt_vertical_n (
		x       : numeric,  
		dp      : numeric,  
		iopt    : integer,  
		dim [1] : integer   
	)

	return_val [dimsizes(x)] :  float or double

Arguments

x

Array to be integrated or averaged. No missing data allowed.

dp

Pressure thicknesses computed by dpres_hybrid_ccm or dpres_plevel. These are the 'weights' associated with each level. This should have the same dimensionality as x.

iopt

  • iopt=0 weighted vertical average
  • iopt=1 weighted vertical sum
  • iopt=2 return a variable of type 'list' containing the weighted vertical sum, vertical average and the weights used.
The dimension(s) of x on which to calculate the vertical sum or average.

Return value

If opt=0 or 1, an array of of one less rank than the input x. If opt=2, a of type 'list' containing the weighted vertical sum and vertical average. The output will be double if x or dp is of type double. Appropriate metadata are also returned.

Description

Calculate the weighted vertical average and/or sum along a specific dimension.

             vertical_average__X = SUM[x*dp]/SUM[dp]      ; iopt=0
             vertical_integral_X = SUM[x*dp]              ; iopt=1   
NOTE: This function is documented as weighted vertical sum/average but it can be used for any weighted quantity along any coordinate. It was developed to isolate vertical sum/average so it is documented as such.

See Also

dim_sum_wgt_n, dim_avg_wgt_n,conform

Examples

Example 1: A sounding with specific humidity at standard pressure levels.


    ptop = 0            ; integrate ptop==>psfc at each grid point
                        ; user could specify (say) 525 hPa. 
    psfc = 1008.0
    plev = (/1000.,950.,900.,850.,800.,750.,700.,650.,600.  \
            , 550.,500.,450.,400.,350.,300.,250.,200.       \
            , 175.,150.,125.,100., 80., 70., 60., 50.       \
            ,  40., 30., 25., 20. /)
    plev@units = "hPa"

    q    =(/ 19.03,16.14,13.71,11.56,9.80,8.33,6.75,6.06,5.07 \
           ,  3.88, 3.29, 2.39, 1.70,1.00,0.60,0.20,0.00,0.00 \
           ,  0.00, 0.00, 0.00, 0.00,0.00,0.00,0.00,0.00,0.00 \
           ,  0.00, 0.00 /)
    q@units = "g/kg"

; layer thickness

    dp   = dpres_plevel(plev, psfc, ptop, 0)

;Integrate:

    vopt  = 0     ; vertically weighted average
    vavg  = wgt_vertical_n(q, dp, vopt, 0)
   ;print("vavg="+vavg)
   ;print("========")

 ;or
    vopt  = 1     ; vertically weighted sum (integral)
    vsum  = wgt_vertical_n(q, dp, vopt, 0)
   ;print("vsum="+vsum)
   ;print("========")

 ;or
    vopt  = 2     ; vertically weighted sum (integral) and average
    vAvgSumWgt = wgt_vertical_n(q, dp, vopt, 0)
                  ; extract from list variable [convenience only]
    vAvg  = vAvgSumWgt[0]
    vSum  = vAvgSumWgt[1]
    vWgt  = vAvgSumWgt[2]

Example 2: Similar to Example 1 but q(time,lev,lat,lon) and, psfc(time,lat,lon). Note the psfc could also be constant. Here, set ptop to the highest level (lowest pressure).

     f    = addfile("...", "r")
     psfc = f->PSFC                                      ; psfc(time,lat,lon)
     q    = f->Q                                         ; q(time,plev,lat,lon) ; dimension (0,1,2,3)
     plev = f->plev                                      ; q&plev                
     

     ptop = min(plev)    ; 300==>psfc at each grid point
                        
                         ; layer thicknesses
     dp   = dpres_plevel_Wrap(plev, psfc, ptop, 0)  ; dp(time,plev,lat,lon)

     vopt = 0     ; vertically weighted average over the level (1-th dimension)
     vavg = wgt_vertical_n(q, dp, vopt, 1)  ; (time,lat,lon)
     vavg@long_name = "Q: vertically weighted average"
     vavg@long_name = q@units

     vopt = 1     ; vertically weighted sum
     vavg = wgt_vertical_n(q, dp, vopt, 1)  ; (time,lat,lon)
     vavg@long_name = "Q*DP: vertically weighted sum"
     vavg@long_name = "("+q@units" - "+psfc@units+")"

Example 3: Let q(time,lev,lat,lon) and the data be on constant pressure levels.

  f    = addfile("...", "r")

  ptop= 300
  pbot= 1000
  x   = f->q(:,{pbot:ptop},:,:)    

  dp   = dpres_plevel_Wrap(q&level,psfc,pbot,0)   ; dp[*]

  vopt = 0
  DP   = conform(x,dp,1)                         ; dp(time,plev,lat,lon) 
  xint = wgt_vertical_n(x,DP,vopt,1)
  xint@long_name = "x wgt sum: vopt="+vopt)
  xint@units     = "..."
  copy_VarCoords(x(:,0,:,:),xint)