Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Emission rate from first principles

plumax · 1 · The Gaussian plume, the Gaussian puff, the cross-sectional flux, the divergence method and the IME as integrals of one advection–diffusion equation

Abstract

A satellite sees a methane plume as a map of column enhancement, whereas what the operator of a site needs is the emission rate QQ. The five methods in use (the Gaussian plume, the Gaussian puff, the cross-sectional flux, the divergence method and the integrated mass enhancement, IME) are all integrals of one advection–diffusion equation, and in this page we derive each of them from it in turn. On a synthetic plume from plumax, every derivation checks out against exact integrals and against geotoolz’s operators, with three corrections to the source note:

  • The IME’s boundary terms are not small. On a contour of constant column, the advective flux vanishes exactly and crosswind diffusion carries all of QQ out, which is why the IME’s effective wind absorbs diffusion.

  • The cross-sectional flux needs an effective wind because of shear, not diffusion. Here the concentration-weighted wind runs from 2.55 to 3.62 m/s for a 3 m/s wind at 10 m.

  • plumax’s dispersion grows like xx near the source (Briggs), and not like x\sqrt{x} as the note’s constant-diffusivity formula says.

We also find that an IME calibration is tied to its definition of length. The same plume needs Ueff=1.17U_\text{eff} = 1.17 m/s with L=AL = \sqrt{A}, and 4.37 m/s with geotoolz’s default chord length.

Keywords:plumaxemission rateGaussian plumeGaussian puffcross-sectional fluxdivergence methodintegrated mass enhancement

The advection–diffusion equation

The concentration c(s,t)c(\vect{s}, t) of a trace gas obeys

∂c∂t+∇⋅(uc)=∇⋅(K∇c)−λc+S(s,t),\frac{\partial c}{\partial t} + \nabla \cdot (\vect{u} c) = \nabla \cdot (\mat{K} \nabla c) - \lambda c + S(\vect{s}, t) ,

where s=(x,y,z)∈R3\vect{s} = (x, y, z) \in \mathbb{R}^3 is the position (along-wind, crosswind and height), u∈R3\vect{u} \in \mathbb{R}^3 is the wind [m/s], K∈R3×3\mat{K} \in \mathbb{R}^{3 \times 3} is the turbulent diffusivity [m²/s], λ\lambda is a first-order loss rate [1/s] and SS is the source. Every other symbol on this page is a scalar in R\mathbb{R}, apart from the column flux F\vect{F} and the normal n\vect{n} of the divergence method. For incompressible flow (∇⋅u=0\nabla \cdot \vect{u} = 0), the advection term is u⋅∇c\vect{u} \cdot \nabla c.

Methane. Methane has a lifetime of about nine years, so λ≈0\lambda \approx 0 on a plume’s timescale of minutes to hours. We align xx with a mean wind (U,0,0)(U, 0, 0), keep a diagonal K\mat{K} with entries Kx,Ky,KzK_x, K_y, K_z, and drop the along-wind diffusion when the Péclet number Pe=UL/Kx\mathrm{Pe} = U L / K_x is large:

∂c∂t+U∂c∂x=Ky∂2c∂y2+Kz∂2c∂z2+S.\frac{\partial c}{\partial t} + U \frac{\partial c}{\partial x} = K_y \frac{\partial^2 c}{\partial y^2} + K_z \frac{\partial^2 c}{\partial z^2} + S .

The column. A satellite measures the column Ω(x,y,t)=∫0∞cdz\Omega(x, y, t) = \int_0^\infty c \mathrm{d}z. With no flux through the ground and c→0c \to 0 aloft, the vertical diffusion integrates to zero, and for a point source q=Qδ(x)δ(y)q = Q \delta(x) \delta(y) we get

∂Ω∂t+U∂Ω∂x=Ky∂2Ω∂y2+Qδ(x)δ(y).\frac{\partial \Omega}{\partial t} + U \frac{\partial \Omega}{\partial x} = K_y \frac{\partial^2 \Omega}{\partial y^2} + Q \delta(x) \delta(y) .

Pulling UU out of the zz integral assumes that the wind does not vary with height, and stage 2 measures what that costs. Each method below comes either from (2) or from this column equation (Figure 1).

The advection-diffusion equation at the top. The Gaussian plume (steady, solved) and the Gaussian puff (Green's function) come from it directly. Its column integral, the column equation, gives the cross-sectional flux (an integral over y), the divergence method (the horizontal divergence of the column flux, ∇_h · F) and the IME (an area integral, then a residence time τ_res).

Figure 1:The five methods and the equation each comes from.

The Gaussian plume (plumax)

TL;DR. Solve (2) at steady state, integrate it over height, and invert the column for QQ.

Problem. At steady state, xx plays the role of time (the travel time τx=x/U\tau_x = x / U), and (2) is a two-dimensional heat equation in (y,z)(y, z), ∂τxc=Ky∂yyc+Kz∂zzc\partial_{\tau_x} c = K_y \partial_{yy} c + K_z \partial_{zz} c. Integrating (2) across x=0x = 0 turns the source into its initial condition, Uc(0+,y,z)=Qδ(y)δ(z−H)U c(0^+, y, z) = Q \delta(y) \delta(z - H), so the source injects Q/UQ / U per metre of travel. With a reflecting ground and a release height HH,

c(x,y,z)=Q2πUσyσze−y2/2σy2[e−(z−H)2/2σz2+e−(z+H)2/2σz2],c(x, y, z) = \frac{Q}{2\pi U \sigma_y \sigma_z} e^{-y^2 / 2\sigma_y^2} \left[ e^{-(z-H)^2 / 2\sigma_z^2} + e^{-(z+H)^2 / 2\sigma_z^2} \right] ,

where σy(x)\sigma_y(x) and σz(x)\sigma_z(x) are the crosswind and vertical dispersion widths. The column of (4) is

Ω(x,y)=Q2πUσy(x)e−y2/2σy2(x),\Omega(x, y) = \frac{Q}{\sqrt{2\pi} U \sigma_y(x)} e^{-y^2 / 2\sigma_y^2(x)} ,

which we invert for the emission rate on the plume’s axis:

Q=2πUσy(x)Ω(x,0).Q = \sqrt{2\pi} U \sigma_y(x) \Omega(x, 0) .
1
2
3
4
5
6
7
8
9
10
11
# Shapes: Q = 2 kg/s, U = 3 m/s, class D; x = 500, 1500 m
# σ = a x (1 + b x)^c, Briggs, for y and z
D = get_dispersion_params("D")                         # today
# c(x, y, z) by (er1-eq-plume3d), with the image source
c = plume_concentration(x, y, z, 0, 0, H, U, 0, Q, D)  # today
# Ω = ∫₀^∞ c dz, quadrature, H = 0 and 30 m          (·) → ()
# → Q / (√(2π) U σ_y) e^{−y²/2σ_y²} to 10⁻⁶         user
# σ_y: 39.0 m at 500 m, 146.1 m at 2 km
# d ln σ_y / d ln x = 0.99 between 100 and 400 m
# U ∬ c dy dz on a 1 m grid, H = 30 m              (Y, Z) → ()
# → Q to 10⁻³ at 500 m and 1.5 km                   user

plumax’s 3D plume, integrated over height, against the column formula, from a real run.

The column formula (5) holds for any release height. The two image terms together integrate to ∫−∞∞e−(z−H)2/2σz2dz=2πσz\int_{-\infty}^{\infty} e^{-(z-H)^2/2\sigma_z^2} \mathrm{d}z = \sqrt{2\pi} \sigma_z whatever HH is, so plumax’s plume released at 30 m has the same column as one released at the ground, to quadrature accuracy. In addition, the flux through every cross-section, U∬cdydzU \iint c \mathrm{d}y \mathrm{d}z, is QQ, which is simply the initial condition carried downwind (and the cross-sectional flux in three dimensions).

The Gaussian puff (plumax)

TL;DR. Release mass in puffs, keep along-wind diffusion, and recover the plume by superposition.

Problem. An instantaneous release of mass MM at (0,0,H)(0, 0, H) and t=0t = 0 is the initial condition c(s,0)=Mδ(x)δ(y)δ(z−H)c(\vect{s}, 0) = M \delta(x) \delta(y) \delta(z - H) of (1), with S=0S = 0 afterwards. In the frame moving with the wind, x′=x−Utx' = x - U t, the chain rule cancels the advection term and leaves the heat equation ∂tc=Kx∂x′x′c+Ky∂yyc+Kz∂zzc\partial_t c = K_x \partial_{x'x'} c + K_y \partial_{yy} c + K_z \partial_{zz} c. Its Green’s function is the product of three one-dimensional heat kernels, (4πKit)−1/2e−xi2/4Kit(4\pi K_i t)^{-1/2} e^{-x_i^2 / 4 K_i t} (with xix_i the ii-th coordinate of the moving frame), and with σi2=2Kit\sigma_i^2 = 2 K_i t and an image at z=−Hz = -H for a reflecting ground, we get

c(x,y,z,t)=M(2π)3/2σxσyσze−(x−Ut)2/2σx2−y2/2σy2[e−(z−H)2/2σz2+e−(z+H)2/2σz2],c(x, y, z, t) = \frac{M}{(2\pi)^{3/2} \sigma_x \sigma_y \sigma_z} e^{-(x - U t)^2 / 2\sigma_x^2 - y^2 / 2\sigma_y^2} \left[ e^{-(z-H)^2 / 2\sigma_z^2} + e^{-(z+H)^2 / 2\sigma_z^2} \right] ,

which is plumax’s puff_concentration, and its column is

Ω(x,y,t)=M2πσx(t)σy(t)exp⁡(−(x−Ut)22σx2−y22σy2),\Omega(x, y, t) = \frac{M}{2\pi \sigma_x(t) \sigma_y(t)} \exp\left( -\frac{(x - U t)^2}{2\sigma_x^2} - \frac{y^2}{2\sigma_y^2} \right) ,

again for any release height. A steady release is then the superposition Ω=∫0tQΩ1(x,y,t−t′)dt′\Omega = \int_0^t Q \Omega_1(x, y, t - t') \mathrm{d}t' of unit puffs, where each Ω1\Omega_1 is (8) with M=1M = 1.

1
2
3
4
5
6
7
8
9
10
11
12
# Shapes: release ages a ∈ (0, 3600 s], 20,000 of them
# Ω(x, 0) = ∫₀^T Q Ω₁(x, 0; a) da                    (a,) → ()
# against Q / (√(2π) U σ_y), σ_y² = 2 K x / U
superposed(500, u=5) / kplume(500, u=5)  # Pe 250 → 0.999  user
superposed(50, u=5) / kplume(50, u=5)    # Pe 25  → 0.990  user
superposed(500, u=1) / kplume(500, u=1)  # Pe 50  → 0.995  user
superposed(50, u=1) / kplume(50, u=1)    # Pe 5   → 0.958  user
# plumax's puff, σ² = 2 K t, t = 100 s, H = 30 m, 2 m grid
c = puff_concentration(x - U*t, y, z, 0, 0, H, σ, σ, σ, M)   # today
# ∭_{z ≥ 0} c dV = M to 10⁻⁶                  (301, 301, 201) → ()
# ∫ c dz = (er1-eq-puffcol) to 10⁻⁶      (301, 301, 201) → (301, 301)
# ∂c/∂t + U ∂c/∂x − K ∇²c = 0 to 10⁻⁴, central differences   user

Puffs superposed against the steady plume, K = 10 m²/s, from a real run.

The puff sum and the plume agree to 0.1 % at a Péclet number of 250, and they differ by 4 % at 5, where the along-wind diffusion (which the plume drops) matters. So this is the note’s point about low winds made quantitative: the plume formula is the high-Péclet limit of the puff sum, not its exact steady state.

The cross-sectional flux (geotoolz)

TL;DR. Integrate the column across the plume at several downwind distances and multiply by the wind.

Problem. We integrate (3) at steady state over all yy. The diffusion term integrates to Ky[∂yΩ]−∞∞=0K_y [\partial_y \Omega]_{-\infty}^{\infty} = 0, because the plume and its gradient vanish far to the sides, and the source term integrates to Qδ(x)Q \delta(x):

ddx[U∫−∞∞Ωdy]=Qδ(x),\frac{\mathrm{d}}{\mathrm{d}x} \left[ U \int_{-\infty}^{\infty} \Omega \mathrm{d}y \right] = Q \delta(x) ,

which, with nothing upwind, integrates to

U∫−∞∞Ωdy=QΘ(x),U \int_{-\infty}^{\infty} \Omega \mathrm{d}y = Q \Theta(x) ,

where Θ\Theta is the step function. So the flux is constant downwind and equals QQ:

Q=U∫−∞∞Ω(x,y)dy for every x>0.Q = U \int_{-\infty}^{\infty} \Omega(x, y) \mathrm{d}y \text{ for every } x > 0 .

When the wind u(z)u(z) varies with height, the flux through a transect is ∬u(z)cdydz\iint u(z) c \mathrm{d}y \mathrm{d}z, so the wind that multiplies the column is the concentration-weighted one,

Ueff(x)=∫u(z)c(x,0,z)dz∫c(x,0,z)dz.U_\text{eff}(x) = \frac{\int u(z) c(x, 0, z) \mathrm{d}z}{\int c(x, 0, z) \mathrm{d}z} .
1
2
3
4
5
6
7
8
9
10
# Shapes: 100 × 160 pixels at 20 m; transects every 400 m
csf = gz.plume.CrossSectionalFlux(
    source=(0, 0), wind_u=3.0, wind_v=0.0,
    n_transects=5, transect_spacing_m=400)             # today
# Q_k = U Σ_j Ω_kj Δy                          (100, 160) → (5,)
csf(column, x > 0)["flux_kg_s"]           # → 2.000 ×5  today
csf(column, column > 0.002)["flux_kg_s"]  # thresholded today
# → 1.90, 1.62, 1.25, 0.77, 0
# u(z) = 3 (z / 10 m)^0.15;  U_eff = ∫ u c dz / ∫ c dz    user
# → 2.55 m/s at 100 m, 3.38 at 1 km, 3.62 at 2 km

geotoolz’s cross-sectional flux on the synthetic column, from a real run.

Left, the column Ω of the synthetic plume with a 2 grams per square metre threshold contour and dotted transects every 400 metres. Right, the cross-sectional flux estimate of Q against transect distance: the full transects give 2 kilograms per second at every distance; the thresholded ones fall from 1.9 to 0 by 2 kilometres.

Figure 2:The cross-sectional flux on full and on thresholded transects.

On full transects the flux is QQ at every distance, as (11) says (Figure 2). However, a detection threshold removes the plume’s flanks, and the far transects lose more: 5 % at 400 m, 61 % at 1.6 km, and everything at 2 km, where the whole transect is below 2 g/m². Shear changes the wind that applies, so a plume hugging the ground moves slower than the 10 m wind (2.55 against 3 m/s at 100 m) whereas a deeper one moves faster (3.62 at 2 km).

The divergence method (xrtoolz budgets)

TL;DR. Map the source as the divergence of the column flux, and check Gauss’s theorem on a box.

Problem. We write the column equation in flux form with the column flux F=∫uhcdz≈uhΩ\vect{F} = \int \vect{u}_\text{h} c \mathrm{d}z \approx \vect{u}_\text{h} \Omega, where uh,F∈R2\vect{u}_\text{h}, \vect{F} \in \mathbb{R}^2 are the horizontal wind and flux, and integrate it over a region A\mathcal{A} which holds the source. Gauss’s theorem turns both divergences into boundary integrals, with n∈R2\vect{n} \in \mathbb{R}^2 the outward unit normal and ll the arc length along ∂A\partial \mathcal{A}:

Q=∮∂AF⋅ndl−∮∂AK∇hΩ⋅ndl.Q = \oint_{\partial \mathcal{A}} \vect{F} \cdot \vect{n} \mathrm{d}l - \oint_{\partial \mathcal{A}} K \nabla_\text{h} \Omega \cdot \vect{n} \mathrm{d}l .

Averaged over a long period, and dropping the diffusive term, the source density is

qˉ(x,y)=∇h⋅Fˉ,\bar{q}(x, y) = \nabla_\text{h} \cdot \bar{\vect{F}} ,

and the emission rate of the region is

QA=∬AqˉdA=∮∂AFˉ⋅ndl.Q_{\mathcal{A}} = \iint_{\mathcal{A}} \bar{q} \mathrm{d}A = \oint_{\partial \mathcal{A}} \bar{\vect{F}} \cdot \vect{n} \mathrm{d}l .
1
2
3
4
5
6
7
8
9
10
# Shapes: F_x = U Ω (100, 160); boxes x ∈ [−100, 1500] m
# q = ∂F_x/∂x, central differences       (100, 160) → (100, 160)
div = np.gradient(U * column, 20.0, axis=1)            # user
# Q_A = ∬_A q dA = ∮ F·n dl                      (100, 160) → ()
area_sum(box(-100, 1500, half=600))  # → 2.000 kg/s    user
area_sum(box(-100, 1500, half=60))   # → 0.81, too narrow
# the dropped term on that box, K_eff = (U/2) dσ_y²/dx (Briggs)
# 2 ∫₀^{x₁} K_eff Ω(x, h) h / σ_y² dx → 1.18; + 0.82 = Q   user
# one overpass, σ_Ω = 0.003 kg/m²: sd = U σ_Ω Δx √n_rows
# → 1.39 kg/s (2,000 draws: 1.39; this draw 1.51); 49 for a 10 % sd

The divergence of the column flux on the grid, from a real run.

The area sum and the boundary flux agree to 10-6, as Gauss’s theorem requires, and a box wide enough to hold the plume returns QQ. However, a box narrower than the plume returns 0.81 kg/s. The rest is the diffusive term of (13), which the method drops: plumax’s Briggs column solves the column equation with an effective diffusivity Keff(x)=U2dσy2/dxK_\text{eff}(x) = \frac{U}{2} \mathrm{d}\sigma_y^2 / \mathrm{d}x, and with it the diffusive flux through the narrow box’s side edges is 1.18 kg/s. The advective part (0.82 exactly, 0.81 on the grid) plus the diffusive part is QQ to 10-6. So dropping diffusion is only safe for a boundary which crosses the plume where advection carries it (at the downwind edge) and lies outside it everywhere else. With noise, the area sum of a central difference telescopes to four edge columns, each weighted ½, so its uncertainty is theirs: 1.39 kg/s for one overpass at 0.003 kg/m² of noise (70 % of the signal), and 49 overpasses for a 10 % uncertainty. This is why the method averages many overpasses, as the note says it does at TROPOMI’s scale. xrtoolz’s budgets (control_volume_integral, boundary_flux) computes both sides of (15) on a model grid, but nothing in the stack applies them to methane columns yet.

The integrated mass enhancement (geotoolz)

TL;DR. Sum the mass above a detection threshold, divide by a residence time, and see what the boundary terms really are.

Problem. Let A\mathcal{A} be the region where Ω>Ωthr\Omega > \Omega_\text{thr}, for a detection threshold Ωthr\Omega_\text{thr}. On its boundary Ω=Ωthr\Omega = \Omega_\text{thr}, so the advective boundary integral is

∮∂AUΩnxdl=UΩthr∮∂Anxdl=0,\oint_{\partial\mathcal{A}} U \Omega n_x \mathrm{d}l = U \Omega_\text{thr} \oint_{\partial\mathcal{A}} n_x \mathrm{d}l = 0 ,

because the outward normal of a closed curve integrates to zero. Away from the source, the total flux balance of A\mathcal{A} then leaves only diffusion, which means everything the source puts in leaves across the contour by crosswind diffusion,

Q=−∮∂AKy∂Ω∂ynydl.Q = -\oint_{\partial\mathcal{A}} K_y \frac{\partial \Omega}{\partial y} n_y \mathrm{d}l .

The IME sidesteps the boundary with a residence time, τres=IME/Q\tau_\text{res} = \mathrm{IME} / Q, which is parameterised as τres=L/Ueff\tau_\text{res} = L / U_\text{eff}. A scaling argument gives the same form from either balance. Balancing the source against advection, UΩ/L∼Q/AU \Omega / L \sim Q / A with IME∼ΩA\mathrm{IME} \sim \Omega A, gives Q∼UIME/LQ \sim U \mathrm{IME} / L. Balancing it against what really leaves (the crosswind diffusion out of a plume of width WW and length LL) gives Q∼KyIME/W2Q \sim K_y \mathrm{IME} / W^2, and the diffusive growth W2∼KyL/UW^2 \sim K_y L / U turns that into the same UIME/LU \mathrm{IME} / L. The order-one factor which the scaling leaves out is what the calibration fixes. So, with Ωj\Omega_j and AjA_j the column and the area of pixel jj,

IME=∑j∈AΩjAj,\mathrm{IME} = \sum_{j \in \mathcal{A}} \Omega_j A_j ,

and the emission rate is

Q=UeffIMEL.Q = \frac{U_\text{eff} \mathrm{IME}}{L} .
1
2
3
4
5
6
7
8
9
10
11
12
# Shapes: K plume, K_y = 10 m²/s; contour Ω = 4 g/m², 663 m
# ∮ U Ω n_x dl = −2 U Ω_thr [f(x_end) − f(0)]  → 0     user
# −∮ K_y ∂Ω/∂y n_y dl = 2 K_y Ω_thr ∫ f/σ² dx  → 2.000 = Q  user
# IME = Σ Ω_j A_j over Ω > 2 g/m², plumax: 796 kg; τ_res = 398 s
# L, chord of the mask                          (100, 160) → ()
L = plume_length(mask, transform, method="max_axis")   # today
# → 1,740 m; √A = 465 m
# U_eff = Q L / IME: 1.17 m/s (√A), 4.37 m/s (chord)    user
# Q = U L⁻¹ IME, raw wind and chord             (100, 160) → ()
ime = gz.plume.IMEEstimate(wind_speed=3.0,
                           length_method="max_axis")   # today
ime(column, mask)                         # → 1.37 kg/s

The contour fluxes, and the IME with each plume length, from a real run.

Both contour integrals, (16) and (17), are exact: the advective flux through the contour is zero, and the diffusive flux is QQ to 10-9. So the residence-time argument is not a way around small boundary terms. Instead, it replaces the one boundary term that carries the whole source (diffusion across the plume’s edge) with a calibrated wind, which is also why UeffU_\text{eff} depends on the threshold, the noise and the turbulence, as the note says. The calibration is tied to the length scale it was fitted with: the same noise-free plume needs Ueff=1.17U_\text{eff} = 1.17 m/s with L=AL = \sqrt{A} and 4.37 m/s with the chord, a factor of 3.7. geotoolz’s IMEEstimate, which computes (18) and (19), offers three length methods (max_axis by default, convex_hull and skeleton), and none of them is A\sqrt{A}.

The five methods side by side

Table 1:The five methods, what each integrates and what each needs, with where it lives in the stack.

MethodIntegral of the equationAssumesNeedsScaleIn the stack today
Gaussian plumenone: solve (2)steady state, constant UU, high Pewind speed and direction, stabilitypoint sourceplumax gauss_plume (Briggs, NumPyro inference)
Gaussian puffsuperposition over release timesconstant KK per puffwind time series, KKpoint sourceplumax gauss_puff (Pasquill–Gifford or Briggs, time-varying wind)
Cross-sectional flux∫dy\int \mathrm{d}y on transectssteady state, full transectswind speed and direction, shear50 m to 1 kmgeotoolz plume.CrossSectionalFlux
Divergence∇h⋅Fˉ\nabla_\text{h} \cdot \bar{\vect{F}} or ∮\ointtime average, no diffusiongridded wind, many overpasses10 to 100 kmxrtoolz budgets (generic)
IME∬dA\iint \mathrm{d}A, then τres\tau_\text{res}steady state, calibrated UeffU_\text{eff}wind speed, plume mask, the calibration’s LL50 m to 1 kmgeotoolz plume.IMEEstimate

The divergence method and the cross-sectional flux (Table 1) are the same statement in differential and in integral form. The IME is the area analogue of the cross-sectional flux, which trades the wind direction for a calibration. plumax also carries forward models that the note does not cover (a Lagrangian particle model and an Eulerian large-eddy model on finitevolx), which can generate the synthetic plumes an IME calibration is fitted on. The cross-sectional flux, the divergence method and the IME only use the column equation and not the Gaussian solution, so they hold for any plume shape.

Open questions

  1. Which length does the stack’s IME calibration use? geotoolz takes UeffU_\text{eff} as an input. The calibration and the length method should travel together as one object, so that a A\sqrt{A} coefficient cannot meet a chord length.

  2. Where should the divergence method live? It is a budget over a methane column on a grid, so xrtoolz’s budgets compute it, plumax owns the physics, and a TROPOMI pipeline owns the averaging.

  3. Can plumax calibrate UeffU_\text{eff} itself? Its large-eddy model can generate the synthetic plumes which Varon et al. made with WRF, and a calibration workflow would make the coefficients reproducible per instrument.

Upcoming work

Table 2 lists the follow-ups.

Table 2:Follow-ups from checking the source note.

Follow-upWhereWhy
Add length_method="sqrt_area"geotoolz plume_length (plumax after the move)the note’s and Varon et al.'s length is A\sqrt{A}, which the operator cannot compute
Bundle UeffU_\text{eff} with its length methodIMEEstimatestage 5: a factor of 3.7 between two lengths on one plume
Report UeffU_\text{eff} under shear in the cross-sectional fluxCrossSectionalFluxstage 2: the effective wind is 15 % below the 10 m wind at 100 m and 21 % above it at 2 km
Add a methane divergence-method recipe on xrtoolz budgetsxrtoolz or plumaxnothing in the stack applies the method to columns

References

References
  1. Johnson, J. E. (2026). Emission Rate Estimation from First Principles: the plume, the puff, the cross-sectional flux, the divergence method and the IME. Unpublished design note.
  2. Varon, D. J., Jacob, D. J., McKeever, J., Jervis, D., Durak, B. O. A., Xia, Y., & Huang, Y. (2018). Quantifying methane point sources from fine-scale satellite observations of atmospheric methane plumes. Atmospheric Measurement Techniques, 11(10), 5673–5686. 10.5194/amt-11-5673-2018
  3. Varon, D. J., Jervis, D., McKeever, J., Spence, I., Gains, D., & Jacob, D. J. (2021). High-frequency monitoring of anomalous methane point sources with multispectral Sentinel-2 satellite observations. Atmospheric Measurement Techniques, 14(4), 2771–2785. 10.5194/amt-14-2771-2021
  4. Frankenberg, C., & others. (2016). Airborne methane remote measurements reveal heavy-tail flux distribution in Four Corners region. Proceedings of the National Academy of Sciences, 113(35), 9734–9739. 10.1073/pnas.1605617113
  5. Krings, T., & others. (2011). MAMAP – a new spectrometer system for column-averaged methane and carbon dioxide observations from aircraft. Atmospheric Measurement Techniques, 4, 215–243. 10.5194/amt-4-215-2011
  6. Beirle, S., & others. (2019). Pinpointing nitrogen oxide emissions from space. Science Advances, 5, eaax9800. 10.1126/sciadv.aax9800
  7. Liu, M., & others. (2021). A new divergence method to quantify methane emissions using observations of Sentinel-5P TROPOMI. Geophysical Research Letters, 48, e2021GL094151. 10.1029/2021GL094151
  8. Koene, E., & others. (2024). On the theory of the divergence method for quantifying source emissions from satellite observations. Journal of Geophysical Research: Atmospheres, 129, e2023JD039904. 10.1029/2023JD039904
  9. Jacob, D. J., & others. (2022). Quantifying methane emissions from the global scale down to point sources using satellite observations of atmospheric methane. Atmospheric Chemistry and Physics, 22, 9617–9646. 10.5194/acp-22-9617-2022
  10. Jia, M., Daniels, W., & Sprinkle, B. (2025). Comparison of the Gaussian plume and puff atmospheric dispersion models for methane modeling on oil and gas sites. Scientific Reports, 15.