Before any dispersion model, you need three things that every tier shares: meteorological forcing (winds, turbulence, PBL), static surface fields (orography, roughness, land-use), and the observation-side glue (L1/L2 ingest, averaging kernels). These are not models — they are the data interfaces all tiers read from. Getting them right early pays off because all four tiers will read from the same APIs; getting them wrong forces parallel ports of every tier later.
The page is grouped into:
- Forcing — meteorology (dynamic 3D fields)
- Static surface fields (orography, land-use, roughness)
- Geometry (coordinate frames and time)
- Inversion priors (background emission inventory)
- Observation side (L1/L2 ingest + averaging kernel)
The fixed forward interface is the contract that ties them together.
1 · Forcing — meteorology¶
Reanalysis-agnostic met reader¶
Met forcing has a many-to-one interface. WRF is the highest-fidelity option (you control resolution, microphysics, nesting) and is the industry baseline, but ERA5 / MERRA-2 / HRRR / GEOS-FP are all valid forcing sources. The MetField PyTree is the abstraction; the WRF reader is one concrete loader.
- Sources (priority order):
- WRF-ARW NetCDF (
wrfout_d0X_*.nc) — primary. - ERA5 (Copernicus CDS) — fallback for global / climatological work.
- HRRR / GEOS-FP — operational near-real-time.
- WRF-ARW NetCDF (
- Output: a
MetFieldPyTree with consistent units, time stamping, and grid metadata (schema in Fixed forward interface). - Interpolation: bilinear in horizontal, log-pressure or geometric height vertical.
- Caching: pre-resampled grids cached to disk (zarr) so notebooks don’t re-interpolate WRF on every run. Cache key is
(source, native_grid_hash, target_grid_hash, time_window).
Planetary boundary layer (PBL) height¶
PBL height is not optional — Tier I plume rise, Tier II trajectory reflection, and Tier IV column partitioning all depend on it. WRF emits it as a diagnostic (PBLH); ERA5 has blh. Carry it as a first-class field on MetField, not buried inside a derived helper.
Pasquill–Gifford stability classifier¶
Maps surface observations (wind speed, cloud cover, time-of-day, solar elevation) to PG stability class A–F. Used by Gaussian-tier , parameterizations.
- Reference: Turner, 1970, with Briggs, 1973 updates.
- Output: per-grid-cell stability class as int (0–5) or one-hot.
- Status: partially implemented in
gauss_plume/dispersion.py.
Monin–Obukhov similarity¶
Surface-layer wind and turbulence profiles. Provides and as functions of downwind distance, friction velocity , Obukhov length , and surface roughness .
- Reference: Monin & Obukhov, 1954, Stull, 1988 (ch. 9).
- Used by: Tier I Gaussian σ functions; Tier II particle-trajectory turbulence; Tier III sub-grid eddy diffusivity .
2 · Static surface fields¶
These are time-invariant geophysical fields. Distinct enough from dynamic met to deserve their own loader, but they live alongside MetField (typically broadcast against the time axis).
Surface roughness and land-use¶
- Source: MODIS IGBP land-use (500 m global) or WRF static (
LU_INDEX+ table lookup). - Used by: MO similarity ( directly), Tier II reflection (different reflection coefficients over water vs. land), Tier IV viewing-geometry corrections.
- Status: ☐ not started.
Orography / terrain¶
- Source: SRTM 90 m or GMTED2010; resampled to analysis grid.
- Used by: Tier I AERMOD-style (Cimorelli et al., 2005) plume rise corrections; Tier II trajectory reflection off topography; Tier III boundary conditions and pressure-coordinate transforms.
- Status: ☐ not started — currently only mentioned in the Tier I AERMOD aside.
3 · Geometry¶
Coordinate transforms¶
lat/lon ↔ local Cartesian(UTM or local tangent plane). Usepyprojfor the heavy lifting; wrap in a JAX-compatibleLocalFramePyTree so frame metadata travels with the data.pressure ↔ geometric heightvia hydrostatic balance + WRF temperature profile.timenormalized to UTC throughout; never mix in local time downstream.
Time and calendar¶
UTC throughout — but enforce it. A small Timestamp PyTree (epoch_seconds: int64, tz: Literal["UTC"]) makes the invariant load-bearing instead of aspirational. Document leap-year / leap-second handling at the boundary (most projects botch this once and never again).
4 · Inversion priors¶
Background emission inventory ¶
Every Bayesian inversion (Tiers I–IV, Step 2) uses a prior over the source field. Naming a single source matters because results are sensitive to it.
- Sources: EDGAR v8 (Crippa et al., 2023, global anthropogenic, ~0.1°), GFEI (Scarpelli et al., 2022, oil & gas, ~0.1°), gridded EPA GHGI (Maasakkers et al., 2023U.S. Environmental Protection Agency, 2024, US gridded), Scarpelli et al. (Scarpelli et al., 2020, sectoral CH₄).
- Output: spatial source field on the analysis grid + sectoral metadata + uncertainty estimate (typically lognormal ).
- Used by: all (background covariance) constructions in Tier II/III inversion; the prior on for Tier I MAP/MCMC.
- Status: ☐ not started.
5 · Observation side¶
L1 / L2 ingest¶
Symmetric to the met reader. Parses raw satellite products into the shared Observations PyTree.
- Inputs: TROPOMI (Veefkind et al., 2012, NetCDF), GHGSat (GHGSat Inc., 2016Jervis et al., 2021, HDF5), EMIT (Green & others, 2022, NetCDF), Tanager (Carbon Mapper, 2024, TIFF + sidecar JSON), Sentinel-2 (Drusch et al., 2012) / Landsat (NASA / USGS, 2013, TIFF). One sub-loader per instrument, dispatched by file extension + product header.
- Output:
ObservationsPyTree (radiance or column XCH₄ + lat/lon footprint + time + per-pixel uncertainty + quality mask + AK). - Status: ☐ not started — the satellite catalog at
satellites.mddescribes the targets; the ingest layer is the missing implementation.
Averaging-kernel operator¶
Applies the satellite averaging kernel to a model column:
where is the model state (CH₄ mixing-ratio profile), is the prior used in the L2 retrieval, is the column-averaging weighting, and is the satellite-product averaging kernel matrix. The construction follows the optimal-estimation framework of Rodgers, 2000. Needed by Tiers II–IV when comparing to L2 XCH₄ products instead of L1 radiances.
- Status: scaffold in
assimilation/obs_operator.py. - Provider design: one
Instrumentregistry that returns keyed on instrument name. Single hook avoids per-tier branching.
Fixed forward interface¶
All four tiers implement the same shape:
def forward(params: Params, met: MetField) -> Observations:
"""Map source/state parameters + met forcing → simulated observations.
Each tier provides its own concrete `Params` PyTree, but the call
signature, return type, and JAX traceability are identical, so any
inference loop (NumPyro, vardaX, filterax) takes any tier as a drop-in.
"""MetField schema¶
The single most-shared object in plumax. Concrete fields, units, and conventions:
```{list-table} MetField PyTree fields, shapes, units, and provenance.
:label: tbl-metfield-schema
:header-rows: 1
- Field
- Shape
- dtype
- Units
- Source
- Notes
u,v,w(T, Z, Y, X)- f32
- m/s
- dynamic
- wind components, cell-centred
T(T, Z, Y, X)- f32
- K
- dynamic
- temperature
p(T, Z, Y, X)- f32
- Pa
- dynamic
- pressure
q(T, Z, Y, X)- f32
- kg/kg
- dynamic
- water vapour mixing ratio
tke(T, Z, Y, X)- f32
- m²/s²
- dynamic
- turbulent KE (optional; some loaders provide)
pblh(T, Y, X)- f32
- m
- dynamic
- PBL height
z0(Y, X)- f32
- m
- static
- surface roughness
lu(Y, X)- i8
- —
- static
- land-use class (IGBP)
hgt(Y, X)- f32
- m
- static
- terrain elevation
frame- —
- static metadata
- —
- static
LocalFrame(pyproj-built, non-traced)
time(T,)- i64
- UTC seconds
- static metadata
TimestampPyTree
ensemble_dim- scalar
- int
- —
- static metadata
0for deterministic;>0carries an outer ensemble axis on dynamic fields
**Conventions:**
- Coordinate axes ordered `(time, vertical, y, x)` always — never reordered downstream. `coordax` is the natural representation; the loader returns a `coordax.Dataset` with these names.
- Units enforced at load time; downstream code may assume them.
- Time alignment: dynamic fields are time-stamped at their native cadence (typically hourly). The forward interface accepts a *temporal interpolation policy* (snapshot / piecewise-linear / nearest) — see open questions.
### `Params` and `Observations`
- `Params`: tier-specific PyTree (e.g. $(Q, x_0, H)$ for Tier I, $S(x,t)$ field for Tier III).
- `Observations`: per-instrument PyTree from the L1/L2 ingest layer — radiances or column XCH₄ + footprint + mask + uncertainty + AK. Same shape as the L1/L2 product the satellite returned.
This contract is what makes Step 6 ("upgrade any component") tractable: replace `forward` with an emulator, the inference loop doesn't notice.
---
(prereqs-modules)=
## Module layout
```{list-table} Module-level breakdown — concern, target module, status, downstream blockers.
:label: tbl-prereqs-modules
:header-rows: 1
* - Concern
- Module
- Status
- Blocks
* - Met loader (WRF)
- `plume_simulation.met.wrf`
- ☐
- Tier II, III
* - Met loader (ERA5)
- `plume_simulation.met.era5`
- ☐
- global Tier II/III
* - PBL diagnostics
- `plume_simulation.met.pbl`
- ☐
- Tier II reflection, Tier IV partitioning
* - Static fields ($z_0$, LU, terrain)
- `plume_simulation.met.static`
- ☐
- MO similarity, Tier III BCs
* - PG stability
- `plume_simulation.gauss_plume.dispersion`
- 🚧 partial
- Tier I (only)
* - MO similarity
- `plume_simulation.met.surface_layer`
- ☐
- Tier II turbulence, Tier III diffusivity
* - Coord transforms
- `plume_simulation.met.frames`
- ☐
- all tiers
* - Time / Timestamp
- `plume_simulation.met.time`
- ☐
- all tiers
* - Emission inventory loader
- `plume_simulation.priors.inventory`
- ☐
- Tier I–IV inversion priors
* - L1/L2 ingest
- `plume_simulation.obs.ingest`
- ☐
- Tier IV (and any real-data work)
* - AK operator
- `plume_simulation.assimilation.obs_operator`
- 🚧 scaffold
- Tier IV column-space comparisonA plume_simulation.met subpackage doesn’t exist yet — proposed home for the prerequisites that aren’t tied to any particular tier. Same for plume_simulation.priors and plume_simulation.obs.
Validation strategy¶
- Met reader: round-trip — read a WRF file, re-grid to the analysis grid, integrate column mass, compare to direct WRF column integration. Should agree to floating-point precision. CI fixture: pin a small synthetic
wrfout(~1 MB, 5×5×10×3) undertests/fixtures/met/so the test runs without external downloads. - Reanalysis parity: load the same time window from WRF and ERA5, regrid both to a coarse common grid, compare column-mean wind speed. Should agree to within climatological variability — confirms the loaders share conventions.
- PG classifier: reproduce the textbook table from Turner (1970) for canonical (wind, cloud, hour) inputs.
- MO similarity: cross-check against
metpy.calc.surface_layer_*for a handful of sounding inputs. - Coordinate transforms: round-trip lat/lon → UTM → lat/lon, max error < 1 mm.
- Inventory loader: integrate EDGAR (Crippa et al., 2023) over a known basin (Permian) and compare to the published basin total in the EDGAR documentation.
- AK operator: apply identity AK and confirm (column average); apply published TROPOMI AK (Veefkind et al., 2012) to a known profile and compare to the official L2 product.
Open questions¶
- Turner, D. B. (1970). Workbook of Atmospheric Dispersion Estimates. U.S. Department of Health, Education,.
- Briggs, G. A. (1973). Diffusion Estimation for Small Emissions (Techreport ATDL-106). Atmospheric Turbulence.
- Monin, A. S., & Obukhov, A. M. (1954). Basic laws of turbulent mixing in the surface layer of the atmosphere. Tr. Akad. Nauk SSSR Geophiz. Inst., 24(151), 163–187.
- Stull, R. B. (1988). An Introduction to Boundary Layer Meteorology. Kluwer Academic. 10.1007/978-94-009-3027-8
- Cimorelli, A. J., Perry, S. G., Venkatram, A., Weil, J. C., Paine, R. J., Wilson, R. B., Lee, R. F., Peters, W. D., & Brode, R. W. (2005). AERMOD: A dispersion model for industrial source applications. Part I: General model formulation and boundary layer characterization. Journal of Applied Meteorology, 44(5), 682–693. 10.1175/JAM2227.1
- Crippa, M., Guizzardi, D., Pagani, F., Banja, M., Muntean, M., Schaaf, E., & others. (2023). High resolution temporal profiles in the Emissions Database for Global Atmospheric Research (EDGAR). Scientific Data, 10, 636. 10.1038/s41597-023-02489-1
- Scarpelli, T. R., Jacob, D. J., Grossman, S., Lu, X., Qu, Z., Sulprizio, M. P., Zhang, Y., Reuland, F., Gordon, D., & Worden, J. R. (2022). Updated Global Fuel Exploitation Inventory (GFEI) for methane emissions from the oil, gas, and coal sectors: Evaluation with inversions of atmospheric methane observations. Atmospheric Chemistry and Physics, 22(5), 3235–3249. 10.5194/acp-22-3235-2022
- Maasakkers, J. D., Mcduffie, E. E., Sulprizio, M. P., Chen, C., Schultz, M., Brunelle, L., Thrush, R., Steller, J., Sherry, C., Jacob, D. J., & others. (2023). A gridded inventory of annual 2012-2018 U.S. anthropogenic methane emissions. Environmental Science & Technology, 57(43), 16276–16288. 10.1021/acs.est.3c05138
- U.S. Environmental Protection Agency. (2024). Inventory of U.S. Greenhouse Gas Emissions and Sinks: 1990–2022. EPA 430-R-24-004. https://www.epa.gov/ghgemissions/inventory-us-greenhouse-gas-emissions-and-sinks
- Scarpelli, T. R., Jacob, D. J., Maasakkers, J. D., Sulprizio, M. P., Sheng, J.-X., Rose, K., Romeo, L., Worden, J. R., & Janssens-Maenhout, G. (2020). A global gridded (0.1° × 0.1°) inventory of methane emissions from oil, gas, and coal exploitation based on national reports to the United Nations Framework Convention on Climate Change. Earth System Science Data, 12(1), 563–575. 10.5194/essd-12-563-2020
- Veefkind, J. P., Aben, I., McMullan, K., Förster, H., de Vries, J., Otter, G., Claas, J., Eskes, H. J., de Haan, J. F., Kleipool, Q., & others. (2012). TROPOMI on the ESA Sentinel-5 Precursor: a GMES mission for global observations of the atmospheric composition for climate, air quality and ozone layer applications. Remote Sensing of Environment, 120, 70–83.
- GHGSat Inc. (2016). GHGSat WAF-P imaging spectrometer constellation. https://www.ghgsat.com/
- Jervis, D., McKeever, J., Durak, B. O. A., Sloan, J. J., Gains, D., Varon, D. J., Ramier, A., Strupler, M., & Tarrant, E. (2021). The GHGSat-D imaging spectrometer. Atmospheric Measurement Techniques, 14(3), 2127–2140. 10.5194/amt-14-2127-2021
- Green, R. O., & others. (2022). EMIT: Earth Surface Mineral Dust Source Investigation. https://earth.jpl.nasa.gov/emit/
- Carbon Mapper. (2024). Carbon Mapper: airborne and satellite imaging spectroscopy for greenhouse gas monitoring. https://carbonmapper.org/