Pressure Levels and Layers

Provides detail on CLIMCAPS profile representation and its standard pressure grid. Provides information on pressure levels vs. layers and adjusting profiles to surface pressure. Psuedocode for adjusting boundary layer values is provided.


Satellite soundings as profiles of temperature, T(p), water vapor (H2O) and trace gases along a pressure grid [hPa], from the Earth surface to top of atmosphere. CLIMCAPS reports its retrieved soundings on the standard 100 level pressure grid also used in SARTA (Strow et al., 2003), which spans 1100 hPa to 0.016 hPa.

CLIMCAPS retrieves T(p) as the temperature at each pressure level, while it retrieves H2O, O3, CO, CH4, HNO3, N2O and SO2 (i.e., all gases except CO2) as column densities [molec/cm2] on pressure layers (Section 1).

A pressure layer is the vertical area between two pressure levels. CLIMCAPS retrieves CO2 as pressure layer mixing ratio [ppb], although CO2 is reported in the product files as volume mixing ratio on pressure levels, which is the mole of CO2 per mole of dry air [mol/mol].

In this document we discuss issues that can significantly affect data application and understanding as they relate to CLIMCAPS retrieval levels and layers. These are:

  1. Levels versus Layers, and converting from one to the other.
  2. Adjusting retrieved profiles to scene surface pressure

1. Levels versus Layers

CLIMCAPS requires all state variables to be on the standard 100 pressure levels used in SARTA (Strow et al., 2003) for accurate calculations of top of atmosphere infrared radiance in narrow spectral intervals. This is a fixed 100-level pressure grid (Plev) and available in the CLIMCAPS product file as air_pres, which is the same at all scenes across the globe irrespective of variations in Earth surface pressure. Plev(1) = 0.016 hPa, and Plev(100) = 1100.0 hPa.

CLIMCAPS does not retrieve surface pressure but instead uses MERRA-2 surface pressure as state variable and write it to the product files as: aux/prior_surf_pres [Pa]. The MERRA-2 surface pressure values written to aux/prior_surf_pres [Pa] have been spatially and temporally interpolated to CLIMCAPS.

Over the ocean, surface pressure is typically 1013.25 hPa. High terrain surface pressure is often less than 800 hPa, such as over the Tibetan Plateau in Asia, the Rocky Mountains in North America, and the Andes Mountains in South America. Most of the time Plev(100) is well below Earth surface pressure, which means that one needs to truncate the retrieved profiles according to the true Earth surface pressure at the target scene.

The CLIMCAPS product field, air_pres_lay_nsurf, contains the index where the standard air_pres array intersects Earth surface pressure (aux/prior_surf_pres) at a target retrieval scene. In each CLIMCAPS product file there is air_pres with dimension [air_pres] where air_pres = 100, and air_pres_lay_nsurf with dimension [atrack x xtrack], where atrack = 30 to indicate the number of retrieval footprints along each scanline and xtrack = 45 to indicate the number of scanlines per file.

Similarly, for the pressure layer array, air_pres_lay, there is a corresponding air_pres_lay_nsurf field. One should truncate temperature retrieval at position atrack = i and xtrack = j with Pbot = air_pres_lay_nsurf(i, j) such that T(p) = air_temp(ij, 1:Pbot).

Stated differently, CLIMCAPS profile retrievals are valid from the top of atmosphere, air_pres(1), to the Earth surface as defined by MERRA-2 surface pressure (aux/prior_surf_pres) and indicated by air_pres_lay_nsurf for each retrieval scene

CLIMCAPS retrieves trace gas quantities on a standard pressure layer grid (air_pres_lay), which is a 100 layer grid derived from air_pres. Figure 1 gives a graphic representation of pressire levels versus layers

Diagram showing difference of a pressure level vs pressure layer

Figure 1: An illustration showing the differences between CLIMCAPS pressure levels (Plev) [air_pres] and pressure layers (Play) [air_pres_nsurf] for an index n, where . Temperature is retrieved on levels while trace gasses are retrieved on pressure layers. The mathematical conversion from levels to layers is shown in Eq. 1.

We derive the pressure layer ( \( P_{lay} \) ) grid from pressure levels (\( P_{lev} \)) as follows:

Eq. 1          \( P_{lay} (n) = \frac{ P_{lev} (n) - P_{lev} (n-1) }{\log_{10}\big(P_{lev}(n)/P_{lev}(n-1)\big) } \)

where \(n \in \{2,...,100\} \), \(P_{lay}(1) = 0.00284 \) hPa, and \(P_{lay}(100) = 1085.36 \) hPa. All trace gas quantities in the mol_lay group, as well as aux/co2_vmr are retrieved and reported on this pressure layer grid. It is thus important that you associate the CLIMCAPS trace gas retrieval profiles with pressure layers (air_pres_lay) not levels (air_pres).

Converting Levels to Layers

Some applications may require you to evaluate CLIMCAPS temperature retrieval levels alongside H2O density layers. In such cases, convert air_temp from its native definition on air_pres levels to air_pres_lay layers as follows:

Assume that the top of atmosphere temperature is isothermal (Eq. 2), while all other layers are calculated as two-point running means (Eq. 3).

Eq. 2          \( T_{lay}(n) = T_{lay}(n), n=1 \)

Eq. 3          \( T_{lay}(n) = 0.5 \times ( T_{lev}(n) + T_{lev}(n-1) ), n \in \{2,...,100\} \)

Converting Layers to Levels

If you wish to represent CLIMCAPS column density trace gas retrievals[molecules/cm2] on pressure levels, we recommend the procedure below. ­­Note that with this conversion from pressure layers to levels we will use water vapor column density (h2o_vap_mol_lay) as example in the pseudocode below.

# (1) Extract relevant fields from the netCDF file
Play = file[“air_pres_lay”]
Plev = file[“air_pres”]
h2o_lay = file[“mol_lay/h2o_vap_mol_lay”]

# (2) Calculate mid-point between two pressure layers
h2o_mid(1) = h2o_lay(1)
h2o_mid(n) = 0.5*[h2o_lay(n-1) + h2o_lay(n)], where n=2,100

# (3) Interpolate to pressure level grid using the natural logarithmic form of the profiles to linearize the calculation
log_h2o_lev = INTERPOLATE(log10(h2o_mid), log10(Play), log10(Plev))
h2o_lev = 10^(log_h2o_lev)

2. Adjusting retrieved profiles to surface pressure at a target scene

CLIMCAPS retrieves atmospheric variables along a standard pressure grid that does not account for variation in surface pressure, Ps. The CLIMCAPS product file records the standard pressure level (air_pres) and pressure layer (air_pres_lay) array index closest to surface pressure Ps, as air_pres_lay_nsurf.

When the standard 100-level air_pres array intersects with Earth surface pressure at a target scene, one of two scenarios occur, which we demonstrate in Figure 2.

Diagram of two types of boundary layer conditions

Figure 2: An illustration of the two types of boundary layer conditions that result when retrieving atmospheric variables on a standard pressure grid, Pobs, which for CLIMCAPS is the pressure levels profile, air_pres. CLIMCAPS uses surface pressure, Ps, from MERRA-2. Here the subscript n denotes ranges from 1 to 100, and represents the index at which the CLIMCAPS retrieval is reported at. Unless the retrieval is performed over ocean Pobs(n) is always less than Pobs(plev) with n < plev, plev = 100, and Pobs(plev) = 1100 mb. Scenario 1 requires a narrowing of the boundary layer with interpolation of the retrieved value from Pobs(n-1) to Ps. Scenario 2 requires a broadening of the boundary layer with extrapolation of the retrieved value from Pobs(n-1) to Ps. The brown dotted line indicates the width of the adjusted boundary layer, which always exceeds 5 mb and varies horizontally with surface topography.

We define surface air temperature (Tsurf) as the atmospheric temperature at surface pressure (Psurf; aux/prior_surf_pres). We can derive Tsurf from the retrieved temperature profile (air_temp) as follows:

Eq. 4          \( T_{surf} = T(P_{bot}-1) + BL_{mult} \times [ T(P_{bot}) - T(P_{bot}-1) ] \)

Where \(BL_{mult}\) is the boundary layer multiplier that quantifies the degree to which the bottom profile level needs to be adjusted so that the bottom temperature value represents the temperature at surface pressure, not the standard level closest to surface pressure. \(P_{bot}\) (air_pres_lay_nsurf) is the index of the pressure level that is closest to Psurf while always satisfying the condition:

Eq. 5          \( [ P_{surf}-P_{lev}(P_{bot}-1)] \geq 5 hPa \)

This condition ensures that Plev(Pbot) is always less than Psurf by at least 5 hPa. BLmult is given by:

Eq. 6          \( BL_{mult} = \frac{P_{surf} - P_{lev}(P_{bot}-1)}{P_{lev}(P_{bot})-P_{lev}(P_{bot}-1)} \)

Figure 2 Scenario 1 demonstrates a case where BLmult < 1.0, and Scenario 2 a case where BLmult ≥ 1.0.

Eq. 3 convert temperature from level to a layer for any layer in the temperature profile. In context of surface layer, Eq. 4 can be used to calculate the bottom layer with:

Eq. 7          \( T_{lay}(P_{bot}) = 0.5 \times ( T(P_{bot}-1) + T_{surf} ) \)

For traces gases, the values are retrieved as layer column density, so the boundary layer column density should be adjusted for surface pressure Psurf differently than for air_temp on pressure levels. The boundary layer for trace gases is indicated by the Pbot (air_pres_lay_nsurf) of air_pres_lay. This bottom layer needs to be either narrowed (Figure 2, Scenario 1) or broadened (Figure 2, Scenario 2) with Bmult as follows:

Eq. 8          \( CD_{surf} = BL_{mult} \times T_{gas}(P_{bot}) \)

Where \(T_{gas} \) depicts any of the CLIMCAPS trace gas retrieval species, including CO2.

The CLIMCAPS temperature retrieval product, air_temp, already has this correction applied, which means that air_temp(i,j,Pbot) is the temperature at surface pressure. 

The CLIMCAPS trace gas column densities, e.g., wat_vap_mol_lay, does NOT have this correction applied and you have to follow the instructions in Section 3 below to make the adjustment. 

All CLIMCAPS derived values, such as relative humidity and mixing ratio, has this correction applied, so you can use those fields as is. 

3. Pseudocode for adjusting boundary layer values

Calculating BLmult 

Below, we show some example pseudocode to calculate BLmult from Eq. 6. Three variables are required from the CLIMCAPS netCDF file: air pressure (air_pres), Lbot (air_pres_nsurf), and Psurf (aux/prior_surf_pres). Psurf is a two-dimensional variable (y (atrack), x (xtrack)). We simplify our discussion by only calculating BLmult and Tsurf at the first footprint (atrack = xtrack = 0).

# Extract relevant fields from the netCDF file
pres = file[“air_pres”]
Pbot = file[“air_pres_nsurf”]
psurf = file[“aux/prior_surf_pres”]

# Psurf for the first footprint
psurf0 = psurf[0, 0]

# Calculate the boundary layer multiplier
numerator = psurf0 - pres[Pbot - 1]
denominator = pres[Pbot] - pres[Pbot - 1]
BLmult = numerator / denominator

Calculating Tsurf

Below we show an example pseudocode to calculate Tsurf, for a single footprint, which we showed in Eq. 4. We first import the T(p) variable (air_temp) from the netCDF file. T(p) is a three-dimensional variable (y (atrack), x (xtrack), and z (air_pres)), so like psurf in our BLmult pseudocode above, we keep only the value from the first footprint (atrack = xtrack = 0). The variable t_diff is the difference between the temperature from the level above the bottom level and the temperature from the level at Pbot. Surface temperature (t_surf) is then calculated on the last line.

# Extract relevant fields from the netCDF file
temp[:,:,:] = file[“air_temp”]

t_diff = temp[0, 0, Pbot] - temp[0, 0, Pbot - 1])
t_surf = temp[0, 0, Pbot - 1] + BLmult * t_diff

The above code will map a single value to t_surf. To calculate Tsurf over the entire swath, surface temperature can be defined as a two-dimensional vector. Instead of using the first footprint (atrack = xtrack = 0), the user can write a loop and iterate over atrack and xtrack to calculate the Tsurf for all footprints in the file(s).

Calculating Total Water Vapor

Water vapor is often integrated to show column total H2O. In our example pseudocode below, we import the H2O column density (h2o_liq_mol_lay), and extract the column values for the first footprint (iobs = 0). Then, we compute total H2O for all layers except the bottom layer, from 1 to Pbot-1. We adjust the bottom layer (Pbot) with BLmult and add it to the total, as shown in Eq. 8. Like T(p), users can incorporate the procedure from the pseudocode below in a loop to process the whole swath.

# Read water vapor column density values from the netCDF file
h2o = file[“h2o_liq_mol_lay”]

# Compute total water for all pressure layers up to the layer above the surface layer
total_h2o = sum(h2o[0, 0, i:Pbot-1])

# Then add in the adjusted surface layer quantity
total_h2o = total_h2o + BLmult * h2o [0, 0, Pbot]