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; 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 this page derives them from it in turn. On a synthetic plume from plumax, each derivation checks out against exact integrals and 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. That 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), not like x\sqrt{x} as the note’s constant-diffusivity formula says.

The page also finds that an IME calibration is tied to its length definition. 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(x,t)c(\mathbf{x}, t) of a trace gas obeys

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

with u\mathbf{u} the wind [m/s], K\mathbf{K} the turbulent diffusivity [m²/s], λ\lambda a first-order loss rate [1/s] and SS the source. For incompressible flow, ∇⋅u=0\nabla \cdot \mathbf{u} = 0, the advection term is u⋅∇c\mathbf{u} \cdot \nabla c.

Methane. With a lifetime of about nine years, λ≈0\lambda \approx 0 on a plume’s timescale of minutes to hours. Align xx with a mean wind (U,0,0)(U, 0, 0), keep a diagonal K\mathbf{K}, and drop along-wind diffusion when the Péclet number Pe=UL/Kx\text{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 Ω(x,y,t)=∫0∞c dz\Omega(x, y, t) = \int_0^\infty c\, dz. 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):

∂Ω∂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 the wind does not vary with height; stage 2 measures what that costs. Each method below comes 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) and the IME (an area integral, then a residence time).

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 (τ=x/U\tau = x / U) and (2) is a two-dimensional heat equation in (y,z)(y, z), ∂τc=Ky∂yyc+Kz∂zzc\partial_\tau c = K_y \partial_{yy} c + K_z \partial_{zz} c. Integrating (2) across x=0x = 0 turns the source into its initial condition, U c(0+,y,z)=Q δ(y) δ(z−H)U\, c(0^+, y, z) = Q\, \delta(y)\, \delta(z - H): the source injects Q/UQ / U per metre of travel. With a reflecting ground,

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] ,

and the column of (4) is

Ω(x,y)=Q2π U σy(x) e−y2/2σy2(x),Q=2π U σy(x) Ω(x,0).\Omega(x, y) = \frac{Q}{\sqrt{2\pi}\, U\, \sigma_y(x)}\, e^{-y^2 / 2\sigma_y^2(x)} , \qquad 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σz2 dz=2π σz\int_{-\infty}^{\infty} e^{-(z-H)^2/2\sigma_z^2}\,dz = \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. And the flux through every cross-section, U∬c dy dzU \iint c\, dy\, dz, is QQ: 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(x,0)=M δ(x) δ(y) δ(z−H)c(\mathbf{x}, 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}, and with σi2=2Kit\sigma_i^2 = 2 K_i t and an image at z=−Hz = -H for a reflecting ground,

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. 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 the superposition Ω=∫0tQ Ω1(x,y,t−t′) dt′\Omega = \int_0^t Q\, \Omega_1(x, y, t - t')\, dt' of unit puffs, each (7) 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 differ by 4 % at 5, where along-wind diffusion, which the plume drops, matters. 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. 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 to Q δ(x)Q\, \delta(x):

ddx[U∫−∞∞Ω dy]=Q δ(x)⇒U∫−∞∞Ω dy=Q Θ(x),\frac{d}{dx} \left[ U \int_{-\infty}^{\infty} \Omega\, dy \right] = Q\, \delta(x) \quad \Rightarrow \quad U \int_{-\infty}^{\infty} \Omega\, dy = Q\, \Theta(x) ,

with Θ\Theta the step function in (8) and nothing upwind. So the flux is constant downwind and equals QQ:

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

When the wind varies with height, the flux through a transect is ∬u(z) c dy dz\iint u(z)\, c\, dy\, dz, 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)\, dz}{\int c(x, 0, z)\, dz} .
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 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 (9) says (Figure 2). 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: a plume hugging the ground moves slower than the 10 m wind (2.55 against 3 m/s at 100 m), and a deeper one 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. Write the column equation in flux form with F=∫uH c dz≈uH Ω\mathbf{F} = \int \mathbf{u}_H\, c\, dz \approx \mathbf{u}_H\, \Omega and integrate it over a region A\mathcal{A} holding the source. Gauss’s theorem turns both divergences into boundary integrals:

Q=∮∂AF⋅n^ dl−∮∂AK ∇HΩ⋅n^ dl.Q = \oint_{\partial \mathcal{A}} \mathbf{F} \cdot \hat{\mathbf{n}}\, dl - \oint_{\partial \mathcal{A}} K\, \nabla_H \Omega \cdot \hat{\mathbf{n}}\, dl .

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

qˉ(x,y)=∇H⋅F‾,QA=∬Aqˉ dA=∮∂AF‾⋅n^ dl.\bar q(x, y) = \nabla_H \cdot \overline{\mathbf{F}} , \qquad Q_{\mathcal{A}} = \iint_{\mathcal{A}} \bar q \, dA = \oint_{\partial \mathcal{A}} \overline{\mathbf{F}} \cdot \hat{\mathbf{n}}\, dl .
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. A box narrower than the plume returns 0.81 kg/s. The rest is the diffusive term of (11), which the method drops: plumax’s Briggs column solves the column equation with an effective diffusivity Keff(x)=U2 dσy2/dxK_{\text{eff}}(x) = \tfrac{U}{2}\, d\sigma_y^2 / dx, and with it the diffusive flux through the narrow box’s side edges is 1.18 kg/s. Advective (0.82 exactly, 0.81 on the grid) plus diffusive is QQ to 10-6. Dropping diffusion is safe only for a boundary that 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. That 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 (12) on a model grid; 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 Ω>t\Omega > t. On its boundary Ω=t\Omega = t, so the advective boundary integral is

∮∂AU Ω nx dl=U t∮∂Anx dl=0,\oint_{\partial\mathcal{A}} U\, \Omega\, n_x\, dl = U\, t \oint_{\partial\mathcal{A}} n_x\, dl = 0 ,

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

Q=−∮∂AKy ∂Ω∂y ny dl.Q = -\oint_{\partial\mathcal{A}} K_y\, \frac{\partial \Omega}{\partial y}\, n_y\, dl .

The IME sidesteps the boundary with a residence time, τ=IME/Q\tau = \text{IME} / Q, parameterised as τ=L/Ueff\tau = 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\text{IME} \sim \Omega A, gives Q∼U IME/LQ \sim U\, \text{IME} / L. Balancing it against what really leaves, crosswind diffusion out of a plume of width WW and length LL, gives Q∼Ky IME/W2Q \sim K_y\, \text{IME} / W^2, and diffusive growth, W2∼KyL/UW^2 \sim K_y L / U, turns that into the same U IME/LU\, \text{IME} / L. The order-one factor the scaling leaves out is what the calibration fixes:

IME=∑j∈AΩjAj,Q=Ueff IMEL.\text{IME} = \sum_{j \in \mathcal{A}} \Omega_j A_j , \qquad Q = \frac{U_{\text{eff}}\, \text{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 t [f(x_end) − f(0)]  → 0         user
# −∮ K_y ∂Ω/∂y n_y dl = 2 K_y t ∫ f/σ² dx  → 2.000 = Q  user
# IME = Σ Ω_j A_j over Ω > 2 g/m², plumax: 796 kg; τ = 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, (13) and (14), 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. It replaces the one boundary term that carries the whole source, diffusion across the plume’s edge, with a calibrated wind. That 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 (15), offers three length methods (max_axis by default, convex_hull, skeleton), none of them 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 dy on transectssteady state, full transectswind speed and direction, shear50 m to 1 kmgeotoolz plume.CrossSectionalFlux
Divergence∇H⋅F‾\nabla_H \cdot \overline{\mathbf{F}} or ∮\ointtime average, no diffusiongridded wind, many overpasses10 to 100 kmxrtoolz budgets (generic)
IME∬dA\iint dA, then τ\tausteady 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 integral form. The IME is the cross-sectional flux’s area analogue: it trades the wind direction for a calibration. plumax also carries forward models 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 use only the column equation, 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 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: 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 Varon et al. made with WRF; 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.