Ertel PV Computation on Sigma Levels

Climate Dynamics, MIT EAPS, 2026

How to correctly compute Ertel Potential Vorticity (PV) for CMIP-class models that do not provide PV as a native output (unlike ERA5 or MPAS-Atmosphere).

Source repository: github.com/yanxingjianken/PV_Ertel_Computation


Motivation

ERA5 and MPAS output Ertel PV directly on model/pressure levels, but most CMIP models (CESM2, IPSL, MIROC, etc.) do not. Computing PV from the standard 3-D output $(u, v, T, p_s)$ seems straightforward, but the naive pressure-level finite-difference approach gives severely degraded PV near the surface and near steep topography.

The fix: compute PV on terrain-following $\sigma = p/p_s$ coordinates, where the lower boundary is a material surface and vertical derivatives are naturally aligned with the flow.

Formula

\[\text{PV}_\sigma = -\frac{g}{p_s}\left[ \frac{\partial v}{\partial\sigma}\frac{\partial\theta}{\partial x} - \frac{\partial u}{\partial\sigma}\frac{\partial\theta}{\partial y} + (f + \zeta)\frac{\partial\theta}{\partial\sigma} \right] \times 10^6 \ \text{PVU}\]

where:

  • $\sigma = p/p_s(x,y)$ — terrain-following vertical coordinate
  • $\theta = T\,(p_0/p)^{R_d/c_p}$ — potential temperature ($p_0 = 1000$ hPa)
  • $\zeta$ — relative vorticity via spherical-harmonic operators
  • $f = 2\Omega\sin\phi$ — Coriolis parameter
  • Horizontal derivatives: spectral (spherical harmonics) — no polar singularity
  • Vertical derivatives: MPAS-style centred interior, one-sided boundaries

ERA5 Validation

We validate against ERA5’s native isobaric PV output. The sigma method dramatically improves near-surface PV:

$\sigma$ levelNominal hPaRMSE (PVU)Correlation
0.8508610.300.92
0.5005070.370.94
0.2502531.120.97

Key result: 850 hPa correlation improves from 0.28 (isobaric finite-difference) to 0.92 (sigma coordinate).

ERA5 PV Sigma Comparison

Figure: Sigma-coordinate PV (left) vs ERA5 native PV (center) and their difference (right) at three representative levels. The sigma method captures the near-surface PV structure that isobaric finite-differences miss.

Usage

Quick start (ERA5)

cd era_sanity_check
micromamba run -n blocking python validate_era5.py

Quick start (CESM2-LENS2)

cd cesm2_compute
micromamba run -n blocking python compute_cesm2_pv.py

Python API

from src.ertel_pv import ertel_pv_sigma, DEFAULT_SIGMA_LEVELS

# sigma PV on 11 levels (primary)
pv_sigma, p_3d = ertel_pv_sigma(u, v, t, plev_Pa, ps, lat, lon)
# pv_sigma: (11, nlat, nlon) in PVU

Required Input Variables

VariableERA5 nameCESM2 nameUnits
Eastward winduUm s⁻¹
Northward windvVm s⁻¹
TemperaturetTK
Surface pressurespPSPa
Pressure levels(coordinate)levPa or hPa
Latitudelatitudelat°N
Longitudelongitudelon°E

References