Gaussian puff — derivation from the 3-D advection-diffusion equation
Derivation of the Gaussian puff solution¶
This note derives the Gaussian-puff solution used by the forward model in plume_simulation.gauss_puff.puff.puff_concentration. The setup mirrors the steady Gaussian plume derivation in 00diffrax in wind.py.
1. Governing equation¶
As in the plume case, mass conservation for a single contaminant [kg/m³] at position [m] and time [s] reads (Stockie 2.2)
with wind [m/s], eddy diffusivity [m²/s], and volumetric source [kg/m³·s].
2. Assumptions for the puff model¶
We impose a subset of Stockie’s A1-A7 — different from those chosen for the plume.
- (P1) The source is instantaneous: a single burst of mass [kg] released at time at position . Formally, . A continuous source at rate [kg/s] is then a superposition of instantaneous puffs of mass released every seconds.
- (P2) The wind is uniform in space but may vary in time: . Vertical wind is neglected.
- (P3) The eddy diffusivities are constant and isotropic horizontally: , possibly different. They may be functions of (or equivalently, of the puff age ).
- (P4) Ground reflection (same as plume A7): no penetration of the contaminant through , closed by a zero-flux Neumann BC, .
- (P5) No decay or chemistry.
Crucially, we keep (unlike A3 in the plume) and we keep the along-wind diffusion term (unlike A5). A puff released from a point source has non-zero spread in every direction, not just crosswind; dropping would force an unphysical zero-width along-wind profile at all times.
Applying (P1)-(P3) to equation gives (ignoring the ground reflection for now — we’ll add it by method of images in §5)
on , with as and .
3. Galilean transformation into the puff-centred frame¶
The advection term can be absorbed by moving into a frame that follows the puff centre. Define the puff-centre trajectory
i.e. the trajectory of a passive tracer at under the wind . In the moving coordinates , , , , the chain rule gives
and since and by construction, equation becomes
the 3-D heat equation with a delta source at . The Galilean transform has removed the advection completely — this is the same trick that makes plume theory tractable under A2.
4. Fundamental solution (unbounded domain)¶
Equation moving on admits the separable fundamental solution
where
is the 1-D normal PDF with variance . Direct substitution confirms this. The identification
is the Fickian-diffusion scaling: variances grow linearly in puff age.
5. Ground reflection (method of images)¶
The Neumann boundary can be enforced by superposing the free-space solution with an image source at (reflected about ). The full solution on is then
which is the expression implemented in puff_concentration. The image source has the same mass as the real source, so the total contaminant mass in the half-space is preserved: by construction.
6. The σ-parameterisation (Pasquill-Gifford)¶
As in the plume case, the linear-in- scaling σ² is a consequence of constant eddy diffusivity — an idealisation. In practice the dispersion is driven by turbulent eddies whose statistics depend on atmospheric stability, surface roughness, and the scale of the eddy relative to the puff age. Empirical fits (Pasquill, 1961; Gifford, 1961) to field data give σ as functions of puff travel distance rather than age , because correlates more directly with the turbulent spectrum encountered by the puff.
The classic PG correlations are tabulated curves per stability class A (very unstable) through F (very stable). Convenient log-quadratic fits (Beychok 2005; used in plume_simulation.gauss_puff.dispersion.calculate_pg_dispersion) are
with stability-class-specific coefficients . Horizontal spread is taken isotropic: .
Using σ² we could define an effective time-dependent diffusivity , but this is a fit, not a first-principles quantity — exactly the eddy-diffusivity / σ-parameterisation inconsistency discussed in Stockie §3.4. The σ-form is more robust empirically, so we adopt it, with the understanding that the “diffusion equation” interpretation is a useful fiction.
plume_simulation.gauss_puff.dispersion also exposes the Briggs power-law parameterisation (calculate_briggs_dispersion_xyz) shared with the plume model, so the puff and plume can be run with the same curves when a consistent comparison is needed.
7. Time-varying wind via cumulative integrals¶
The wind-dependent part of the solution lives entirely in the puff-centre trajectory centre: once we know and the travel distance
we have everything needed to evaluate puff solution with σ from PG. The three integrals , , satisfy the trivial ODE system
which is solved once with diffrax.diffeqsolve in plume_simulation.gauss_puff.wind.cumulative_wind_integrals, evaluating at all release times and the current evaluation time in a single adaptive sweep. Puff- positions are then elementwise differences: , and likewise for . This avoids any Python-level per-puff loop and keeps the forward model differentiable for NUTS.
8. Continuous source as a superposition of puffs¶
A continuous source at rate [kg/s] releases every seconds, starting at . By linearity of equation, the total concentration is the superposition
simulate_puff_field implements this sum via jax.vmap. In the limit at fixed , and the sum becomes an integral — this is the formal link to the steady plume. Stockie asks the reader to verify this in his Exercise 8: integrating his puff formula (Stockie Eq. 3.20) over recovers the plume expression (Stockie Eq. 3.8). For finite , the puff sum has a jittery structure near the source that the steady plume lacks; smooth-looking fields require small compared with the transit time from source to receptor.
Comparison with Stockie’s sub-interval approach (§§4.3-4.4)¶
For time-varying wind, Stockie §4.3 divides the total window into sub-intervals min, assumes the wind is steady within each sub-interval, and applies the steady plume solution in a rotated coordinate frame aligned with each sub-interval’s wind vector. His §4.4 then sums deposition contributions over the sub-intervals. This is a quasi-steady plume treatment — fast and accurate for slowly-varying winds, but fundamentally limited to timescales long enough for each sub-interval plume to reach steady state.
The puff formulation in this note sidesteps that limitation: because we keep the time derivative in equation, we can handle winds that vary on timescales shorter than the plume transit time — a buffeting wind, a gust, a sudden directional shift. The price is computational: instead of one plume per sub-interval we carry an -particle ensemble and integrate wind ODE through it. diffrax makes this ensemble evolution a single jittable pass.
9. Operational pitfalls¶
Three recurring gotchas in implementing the puff model:
- Release cadence vs. receptor distance. The field within the first few puff-widths of the source is dominated by a small number of individual puffs and does not look Gaussian — it looks bumpy. If you are evaluating close to the source, pick small enough that several puffs overlap within one . A rule of thumb: for the shortest relevant .
- σ evaluation at . PG gives at the moment of release, so a freshly-released puff has infinite centreline concentration.
calculate_pg_dispersionclamps to 1 m to avoid this — physically the puff has a nonzero initial size set by the source geometry, which is ignored by PG but rarely matters at receptor distances tens of metres. - Calm winds. When , the puff trajectory freezes and puffs pile up at the source. The model in this limit is unphysical — a buoyant source should transition to a puff-rise regime, not a static pile. The puff forward model does not clamp calm winds (unlike the steady plume, where
MIN_WIND_SPEEDkeeps theC ∝ 1/unormalization finite); for inference under a puff forward model, calms should be filtered out upstream or handled via a stability-specific prior on the wind schedule.
These are not bugs in the PG puff model — they are the edges of its domain of validity, inherited from the same idealisations that make it tractable.
Stockie, J. M. (2011). The Mathematics of Atmospheric Dispersion Modelling. SIAM Review, 53(2), 349-372. https://
www .sfu .ca / ~jstockie /atmos /paper .pdf. Puff solution and its plume-superposition relation: §3.5.6 (Eqs. 3.19-3.20 and Exercise 8). Time-varying wind via sub-interval quasi-steady plumes: §§4.3-4.4.