Calculates pressure at the hybrid levels.
function pres_hybrid_ccm ( ps : numeric, p0  : numeric, hya [*] : numeric, hyb [*] : numeric ) return_val : numeric
An array of at least 2 dimensions equal to surface pressure data in Pa or hPa (mb). The rightmost dimensions must be latitude and longitude.p0
Single scalar numeric value equal to the surface reference pressure. Must have the same units as ps.hya
A one-dimensional array equal to the hybrid A coefficients. Must be unitless.hyb
A one-dimensional array equal to the hybrid B coefficients. Must be unitless.
If ps is two-dimensional [e.g. (lat,lon)] or three-dimensional [e.g. (time,lat,lon)] then the return array will have an additional level dimension: (lev,lat,lon) or (time,lev,lat,lon). The size of the lev dimension is the same as the size of hya. The returned type will be double if ps is double, float otherwise.
Calculates pressure at the hybrid levels using the formula p = a(k)*p0 + b(k)*ps.
Some models output a hybrid component, ap(k) [=a(k)*p0], which has units of pressure. This must be made dimensionless prior to use.
hyam and hybm are one-dimensional arrays of length nlev and ps is a three-dimensional array of size (ntim,nlat,mlon) in units of pascals. pm will be returned as a four-dimensional array of size (ntim,nlev,nlat,nlon).
hyam = f->hyam ; read from a file the mid-layer coef hybm = f->hybm ; read from a file ps = f->PS ; surface pressure [Pa] p0 = 100000. ; since ps is in Pa or [ f->P0] pm = pres_hybrid_ccm(ps,p0,hyam,hybm)
A sample printout of two grid points (one over the ocean, the other over the Rocky Mountains) at a particular time step follows. Sample temperature values are printed adjacent to the pressure values (Pa). sprintf allows format control of the output:
print( sprintf("%8.1f",pm(0,:,46,64))+" " \ + sprintf("%7.2f", T(0,:,46,64))+" " \ + sprintf("%8.1f",pm(0,:,46,90))+" " \ + sprintf("%7.2f", T(0,:,46,90))) -----ocean------ ----mountain---- pm T pm T (0) 364.3 236.12 364.3 237.13 [top level] (1) 759.5 231.25 759.5 231.92 (2) 1435.7 229.49 1435.7 228.98 (3) 2461.2 227.34 2461.2 225.49 (4) 3826.8 222.29 3826.8 218.21 (5) 5459.5 218.09 5459.5 213.41 (6) 7201.2 213.01 7201.2 210.53 (7) 8782.1 210.24 8782.1 208.60 (8) 10331.7 207.58 10331.7 207.89 . . . (26) 95769.6 288.61 75612.6 286.83 (27) 97958.9 290.18 77233.2 288.69 (28) 99896.6 291.21 78667.4 290.15 (29) 101562.0 292.29 79935.8 290.50 [bottom (near surface) level]Example 2
Similar to example 1, but calculates the interface pressure levels at each grid point. Let nlevi represent the number of interface levels:
hyai = f->hyai ; read from a file the interface coef hybi = f->hybi ; read from a file ps = f->PS ; surface pressure [Pa] p0 = 100000. ; since ps is in Pa or [ f->P0 ] pi = pres_hybrid_ccm(ps,p0,hyai,hybi)Variable pm is dimensioned (ntim , nlev , nlat , nlon)
Similar to example 1, but the first hybrid component is has units of pressure.
p0 = 100000. ; since ps is in Pa or [ f->P0] ap = f->ap ; read from a file the pressure component hya = ap/p0 ; make dimensionless hyb = f->hyb ; read from a file ps = f->PS ; surface pressure [Pa] pm = pres_hybrid_ccm(ps,p0,hya,hyb)