CPA Weather Lab · Camp Hill PA · May 2026 · 1,676 PA/Mid-Atlantic Stations
An MRI machine does not sense the body at the slice it images — it reconstructs internal structure from a dense field of sensors at the surface. A sufficiently dense mesonet does the same thing for the atmosphere. Every station is a transducer. The network as a whole is a tomographic instrument. The equations below are the reconstruction kernel.
These require only the local observation vector. Every station can compute them independently without knowledge of any neighbor.
The August-Roche-Magnus approximation — accurate to ±0.1% from −40°C to +40°C. This is the absolute ceiling on moisture content at a given temperature: the atmosphere cannot hold more than e_s without condensation.
The actual partial pressure of water vapor in the air. Can be derived from dew point (preferred) or from RH + e_s.
Mass of water vapor per unit mass of dry air. Conserved in adiabatic processes — the fingerprint of an air parcel's origin. You can trace a low-level jet's Gulf moisture signature northward even when the air has cooled 20°C.
The "dryness" of the air — how far the atmosphere is from saturation. VPD drives evaporation, controls cloud formation, and diagnoses the cold dome interior.
The temperature dry air would need to have the same density as moist air. Thermodynamically correct for all buoyancy and pressure calculations. Must be used when computing density-derived quantities.
The temperature a parcel would have if brought adiabatically to 1000 hPa. Conserved in dry adiabatic processes. Plotting θ instead of T removes topographic contamination — this is the fundamental "tissue type" label in the atmospheric MRI.
Adds latent heat to θ — conserved in moist adiabatic processes and through precipitation. Fronts and convective instability are visible in θ_e even when T gradients are obscured by terrain. The θ_e boundary between the cold dome and warm sector defined the Jonas rain/snow line with far greater precision than any temperature threshold.
The mass of air per unit volume — the "tissue density" in the atmospheric MRI analogy. The cold dome is literally heavier air. Mapping ρ from station altimeter readings gives the mass distribution of the atmosphere.
Convert meteorological wind direction (from-direction, clockwise from north) to mathematical Cartesian components for vector operations.
Mechanical energy in the boundary layer. Near-zero KE inside the cold dome core is the "dead zone" diagnostic for cold air damming — the atmosphere has stagnated.
The temperature reached by evaporating water into the air until saturation. T_w = 0°C is the rain/snow/sleet boundary — not T, not T_d. Mapping T_w across the network is the most direct precipitation-type diagnostic available from surface observations.
Require spatial gradients across ≥3 non-collinear stations. The dense network becomes an MRI machine here. Mean 6 km PA spacing resolves mesoscale features 15–20 km and larger.
For any scalar field φ sampled at irregular station locations, the gradient is estimated by fitting a local plane through k nearest neighbors. This is the master operator for all Tier-2 fields.
The spreading or contracting of wind at the surface. By mass continuity, surface convergence implies upward vertical motion (clouds, precipitation, cold dome deepening), and surface divergence implies downward motion (subsidence, dome erosion).
The rotation of the wind field — cyclonic (CCW) or anticyclonic (CW). The leading edge of the Jonas surface low appeared as a positive vorticity maximum sweeping through PA 12–18 hours before peak winds.
The horizontal transport of water vapor — the quantity that determines where moisture is delivered to storm systems. Its divergence gives precipitation potential: convergence = moisture piling up = enhanced precipitation.
The potential temperature gradient tensor encodes the cold dome's strength and geometry. Its eigenvectors reveal the orientation of the cold dome wall and the direction of maximum gradient — analogous to diffusion tensor imaging (DTI) in brain MRI, which reveals white matter fiber tract orientations.
The rate of change of the temperature gradient magnitude — is the cold dome wall sharpening (frontogenesis) or weakening (frontolysis)? This is the single most important diagnostic for cold dome longevity.
The turbulent transport of heat from surface to air (or vice versa). During the day when solar heating raises T_s above cold dome air, H > 0 erodes the dome base from below. The rate is calculable from the station network.
The rate of temperature change due to wind transport. Warm advection (WAA) erodes the cold dome from the south; cold advection (CAA) reinforces it. The classic CAD signature is WAA at the surface being overwhelmed by CAA aloft.
After Barnes interpolation to a regular grid, each grid cell holds a state tensor encoding both the field value AND its spatial gradient — exactly what an MRI diffusion tensor voxel encodes. This is the atomic unit of the atmospheric MRI image.
The standard method for converting irregular station observations to a regular grid. Two-pass scheme: first pass creates a background field, second pass corrects it. The spatial filter analogous to the MRI slice selection pulse.
metpy.interpolate.interpolate_to_grid(lon, lat, data, interp_type='barnes', search_radius=40000)The complete 2×2 Jacobian of the horizontal wind. Decomposed into symmetric (strain) and antisymmetric (rotation) parts, it contains ALL dynamically relevant information: divergence, vorticity, and deformation in a single tensor.
The complete budget for atmospheric water at the surface level. All three terms are partially observable from surface stations — without a sounding. The residual tells whether the column is gaining or losing precipitable water.
Derived from MADIS variables available in the Jonas dataset that go beyond the original equations.md compendium.
MADIS provides pressChange3Hour [Pa] at ASOS/AWOS stations. Converting to a rate gives the real-time storm intensification diagnostic.
Converts the network's precipRate [m/s water equivalent] to snowfall rate using the spatially resolved T_w field. Simultaneously maps crystal type across the storm domain.
| T_w (°C) | Crystal Type | SWE Ratio | Snowfall Efficiency |
|---|---|---|---|
| −1 to 0 | Wet snow / graupel | 5–8:1 | Low |
| −3 to −1 | Dendritic plates | 10–13:1 | Moderate |
| −8 to −3 | Plates / columns | 8–12:1 | Moderate |
| < −8 | Needles / columns | 15–25:1 | High |
MADIS includes totalColumnPWV [cm] and wetSignalDelay [m] from GPS-MET receivers — a direct measurement of total column water vapor with ~1 mm accuracy. Gold standard calibration for surface proxy PW.
Computed from two stations at different elevations — diagnoses whether the cold dome boundary layer is stable, neutral, or convectively unstable.
The physically rigorous evapotranspiration equation. During summer drought periods, stations with solar radiation sensors form a sub-network computing the atmospheric drying rate across the domain.
Uses MADIS multi-period accumulation fields (precip1min, precip3hr, etc.) to diagnose whether precipitation is steady/stratiform or convective/banded — without a radar.
Applied to Blizzard Jonas and all major storm types. Each layer is a separate diagnostic panel — read in sequence like an MRI stack.
Given partial data availability, compute derived fields in this priority order. Each level unlocks the next.
# MADIS Atmospheric MRI Pipeline — Python skeleton import numpy as np import pandas as pd from metpy.interpolate import interpolate_to_grid # 1. Load MADIS subset df = pd.read_parquet('madis_20160123_1200_pa_midatlantic_subset.parquet') # 2. Tier-1: single-station derived fields T_C = df['temperature'] - 273.15 P = df['altimeter'] / 100 # Pa → hPa df['e_s'] = 6.112 * np.exp(17.67 * T_C / (T_C + 243.5)) df['theta'] = (df['temperature']) * (1000 / P)**0.286 df['rho'] = (P * 100) / (287.05 * df['temperature']) df['u'] = -df['windSpeed'] * np.sin(np.radians(df['windDir'])) df['v'] = -df['windSpeed'] * np.cos(np.radians(df['windDir'])) df['KE'] = 0.5 * df['rho'] * df['windSpeed']**2 # 3. Moisture fields (where T_d available) mask = df['dewpoint'].notna() Td_C = df.loc[mask, 'dewpoint'] - 273.15 df.loc[mask, 'e'] = 6.112 * np.exp(17.67 * Td_C / (Td_C + 243.5)) df.loc[mask, 'w'] = 0.622 * df.loc[mask,'e'] / (P[mask] - df.loc[mask,'e']) df.loc[mask, 'T_v'] = df.loc[mask,'temperature'] * (1 + 0.61*df.loc[mask,'w']) df.loc[mask, 'VPD'] = df.loc[mask,'e_s'] - df.loc[mask,'e'] df.loc[mask, 'T_w'] = T_C[mask] - df.loc[mask,'VPD'] / 65 df.loc[mask, 'theta_e'] = df.loc[mask,'theta'] * np.exp( 2.5e6 * df.loc[mask,'w'] / (1004 * df.loc[mask,'temperature'])) # 4. Barnes interpolation to 5km grid lon, lat = df['longitude'].values, df['latitude'].values grid_theta = interpolate_to_grid(lon, lat, df['theta'].fillna(method='nearest'), interp_type='barnes', hres=5000, search_radius=40000)
| Equation | Formula | Units | Requires | Availability |
|---|---|---|---|---|
| e_s | 6.112 exp(17.67 T_C / (T_C+243.5)) | hPa | T | 91% |
| e | 6.112 exp(17.67 T_d / (T_d+243.5)) | hPa | T_d | 58% |
| w | 0.622 e / (P−e) | kg/kg | T_d, P | 58% |
| T_v | T (1 + 0.61w) | K | T, w | 58% |
| θ | T (1000/P)^0.286 | K | T, P | 75% |
| θ_e | θ exp(Lw/c_pT) | K | T, P, w | 58% |
| ρ | P / (R_d T_v) | kg/m³ | P, T_v | 75% |
| u | −|V| sin(φ_wind) | m/s | speed, dir | 87% |
| v | −|V| cos(φ_wind) | m/s | speed, dir | 87% |
| KE | ½ρ|V|² | J/m³ | ρ, V | 85% |
| T_w | T_C − VPD/65 | °C | T, T_d | 58% |
| VPD | e_s − e | hPa | T, T_d | 58% |
| F_q | ρ w V | kg/m²/s | ρ, w, V | ~40% |
| δ (divergence) | ∂u/∂x + ∂v/∂y | s⁻¹ | u, v, spacing | network |
| ζ (vorticity) | ∂v/∂x − ∂u/∂y | s⁻¹ | u, v, spacing | network |
| ADV_T | −u ∂T/∂x − v ∂T/∂y | K/s | T, V, spacing | network |
| H (heat flux) | ρ c_p C_H |V| (T_s−T_a) | W/m² | T, V, T_soil | 1.4% |
| Frontogenesis F | −½|∇θ|(D_s cos2β + D_h sin2β − δ) | K/m/s | θ, V, spacing | network |
| Snow rate | Q_rate × SWE(T_w) | m/s | Q_rate, T_w | ~50% |
| GPS PWV | 10⁴/(6.3+T/16.4) × wetSignalDelay | mm | GPS-MET | sparse |
| Ri_b | g ΔT Δz / (T̄ ΔV²) | — | T, V at 2 levels | pairs |
| ET (P-M) | [Δ(R_n−G) + ρc_p VPD/r_a] / [λ(Δ+γ)] | mm/day | T, RH, I_solar, V | 14% |
| ∂P/∂t | pressChange3hr / 10800 | Pa/s | ASOS press | ASOS only |
| G_θ tensor | [[∂θ/∂x, ∂θ/∂y],[∂θ/∂y, −∂θ/∂x]] | K/m | θ, ≥4 stations | network |
| J_V tensor | [[∂u/∂x, ∂u/∂y],[∂v/∂x, ∂v/∂y]] | s⁻¹ | u, v, ≥6 stations | network |