Puff Models
Puff models are for "instantaneous" releases or other time-dependent releases.
GasDispersion.puff
— Functionpuff(scenario::Scenario, model::PuffModel[, equationset::EquationSet])
Runs the puff dispersion model on the given scenario and returns the solution which is callable to give the concentration c(x, y, z, t)
The concentration is in vol fraction, if model
is unspecified, defaults to a simple gaussian puff.
equationset
s are used to specify that an alternative set of correlations should be used for model parameters, if alternatives exist.
All model parameters are assumed to be in SI base units (i.e. distances in m, velocities in m/s, mass in kg, etc.)
Gaussian Puff Models
Simple Gaussial Puffs
GasDispersion.puff
— Methodpuff(::Scenario, GaussianPuff[, ::EquationSet])
Returns the solution to a Gaussian puff dispersion model for the given scenario.
\[c\left(x,y,z,t\right) = m_{i} \Delta t { { \exp \left( -\frac{1}{2} \left( {x - u t } \over \sigma_x \right)^2 \right) } \over { \sqrt{2\pi} \sigma_x } } { { \exp \left( -\frac{1}{2} \left( {y} \over \sigma_y \right)^2 \right) } \over { \sqrt{2\pi} \sigma_y } }\\ \times { { \exp \left( -\frac{1}{2} \left( {z - h} \over \sigma_z \right)^2 \right) + \exp \left( -\frac{1}{2} \left( {z + h} \over \sigma_z \right)^2 \right) } \over { \sqrt{2\pi} \sigma_z } }\]
where the σs are dispersion parameters correlated with the distance x. The EquationSet
defines the set of correlations used to calculate the dispersion parameters and windspeed. The concentration returned is in volume fraction, assuming the puff is a gas at ambient conditions.
References
- AIChE/CCPS. 1999. Guidelines for Consequence Analysis of Chemical Releases. New York: American Institute of Chemical Engineers
A simple gaussian puff model assumes the release is instantaneous, and all mass is concentrated in a single point. The cloud then disperses as it moves downwind with the concentration profile is given by a series of gaussians with dispersions $\sigma_x$, $\sigma_y$, and $\sigma_z$, which are found from correlations tabulated per stability class. Similarly to the plume model, a ground reflection term is included to correct for the fact that material cannot pass through the ground.
\[c_{puff} = { m_i \over { (2 \pi)^{3/2} \sigma_x \sigma_y \sigma_z } } \exp \left( -\frac{1}{2} \left( {x - ut} \over \sigma_x \right)^2 \right) \exp \left( -\frac{1}{2} \left( {y} \over \sigma_y \right)^2 \right) \\ \left[ \exp \left( -\frac{1}{2} \left( {z - h} \over \sigma_z \right)^2 \right) + \exp \left( -\frac{1}{2} \left( {z + h} \over \sigma_z \right)^2 \right)\right]\]
with
- c - concentration, kg/m^3
- $m_i$ - mass of released material, kg
- u - windspeed, m/s
- $\sigma_x$ - downwind dispersion, m
- $\sigma_y$ - crosswind dispersion, m
- $\sigma_z$ - vertical dispersion, m
- h - release elevation, m
The model assumes the initial release is a single point, with no dimensions. Unlike the plume model, this concentration is a function of time. The model converts the final concentration to volume fraction, assuming the puff is a gas at ambient conditions.
Downwind dispersion correlations
The downwind dispersion, $\sigma_{x}$ is a function of downwind distance of the cloud center, $x_c$, as well as stability class
\[\sigma_{x} = \delta {x_c}^{\beta}\]
Where $\delta$ and $\beta$ are identical to those tabulated for the crosswind dispersion.
Crosswind dispersion correlations
The crosswind dispersion, $\sigma_{y}$ is a function of downwind distance of the cloud center, $x_c$, as well as stability class
\[\sigma_{y} = \delta {x_c}^{\beta}\]
Where $\delta$, $\beta$, and $\gamma$ are tabulated based on stability class(AIChE/CCPS 1999):
Stability Class | $\delta$ | $\beta$ |
---|---|---|
A | 0.18 | 0.92 |
B | 0.14 | 0.92 |
C | 0.10 | 0.92 |
D | 0.06 | 0.92 |
E | 0.04 | 0.92 |
F | 0.02 | 0.89 |
Vertical dispersion correlations
The vertical dispersion, $\sigma_{z}$ is a function of downwind distance of the cloud center, $x_c$, as well as stability class
\[ \sigma_{z} = \delta {x_c}^{\beta} \]
Where $\delta$ and $\beta$ are tabulated based on stability class(AIChE/CCPS 1999):
Stability Class | $\delta$ | $\beta$ |
---|---|---|
A | 0.60 | 0.75 |
B | 0.53 | 0.73 |
C | 0.34 | 0.71 |
D | 0.15 | 0.70 |
E | 0.10 | 0.65 |
F | 0.05 | 0.61 |
Example
Suppose we wish to model the dispersion of gaseous propane from a leak from a storage tank, where the leak is from a 10mm hole that is 3.5m above the ground and the propane is at 25°C and 4barg. Assume the discharge coefficient $c_{D} = 0.85$. Assume the leak occurs for 10s. This scenario is adapted from CCPS Guidelines for Consequence Analysis of Chemical Releases(AIChE/CCPS 1999, 47)
First we define the scenario
using GasDispersion
propane = Substance(name="propane",
molar_weight=0.044096, # kg/mol
liquid_density=526.13, # kg/m³
k=1.142,
boiling_temp=231.02, # K
latent_heat=425740, # J/kg
gas_heat_capacity=1678, # J/kg/K
liquid_heat_capacity=2520) # J/kg/K
Patm = 101325 # Pa
P1 = 4e5 + Patm # Pa
T1 = 25 + 273.15 # K
scn = scenario_builder(propane, JetSource;
phase = :gas,
diameter = 0.01, # m
dischargecoef = 0.85,
temperature = T1, # K
pressure = P1, # Pa
height = 3.5, # m, height of hole above the ground
duration = 10) # s, duration of leak
And then pass it to the puff
function
g = puff(scn, GaussianPuff)
Where g
is a callable which returns the concentration (in vol fraction) at any point. For example suppose we are interested in the concentration at some point 100m downwind of the release, along the centerline (y=0) and at a height of 2m, amd 86s after the start of the release.
g(100,0,2,86)
# output
0.003394005492341503
using Plots
plot(g, 86; xlims=(90,110), ylims=(-10,10), aspect_ratio=:equal)
Using the @gif
macro we can animate the arrival of the puff, visualizing how the cloud expands as it moves
t = 86
@gif for t′ in range(0.85*t,1.15*t, length=50)
plot(g, t′; xlims=(85,115), ylims=(-10,10), clims=(0,5e-3), aspect_ratio=:equal)
end

Palazzi Short Duration Puff Model
GasDispersion.puff
— Methodpuff(::Scenario, Palazzi[, ::EquationSet]; kwargs...)
Returns the solution to a short duration Gaussian puff dispersion model for the given scenario, based on the work of Palazzi et al.
\[c\left(x,y,z,t\right) = \chi\left(x,y,z\right) \frac{1}{2} \left( \mathrm{erf} \left( { {x - u (t-\Delta t)} \over \sqrt{2} \sigma_x } \right) - \mathrm{erf} \left( { {x - u t} \over \sqrt{2} \sigma_x } \right) \right)\]
where χ is a Gaussian plume model and the σs are dispersion parameters. The EquationSet
defines the set of correlations used to calculate the dispersion parameters and windspeed. The concentration returned is in volume fraction, assuming the puff is a gas at ambient conditions.
There are multiple variations of the Palazzi short duration model, changing how the downwind dispersion, σx, is calculated:
:default
follows Palazzi and calculates σx at the downwind distance x:intpuff
calculates σx at the downwind distance to the cloud center u t:tno
follows the TNO Yellow Book eqn 4.60b, using the distance x while the plume is still attached and the distance to the cloud center, ut, afterwards
Arguments
disp_method = :default
: the method for calculating the downwind dispersionplume_model::Type{Plume} = GaussianPlume
: the plume model $\chi$- additional keyword arguments are passed to the plume model
References
- Palazzi, E, M De Faveri, Giuseppe Fumarola, and G Ferraiolo. “Diffusion from a Steady Source of Short Duration.” Atmospheric Environment. 16, no. 12 (1982): 2785–90.
The Palazzi
model integrates over the Gaussian puff model for a short duration release (Palazzi 1982), where the dispersion parameters $\sigma$ are assumed to be independent time.
\[c\left(x,y,z,t\right) = \chi\left(x,y,z\right) \frac{1}{2} \left( \mathrm{erf} \left( { {x - u (t-\Delta t)} \over \sqrt{2} \sigma_x } \right) - \mathrm{erf} \left( { {x - u t} \over \sqrt{2} \sigma_x } \right) \right)\]
where $\chi$ is a Gaussian plume model and $\sigma_x$ is the downwind dispersion parameter. The model assumes the initial release is a single point, with no dimensions. Additionally, the model converts the final concentration to volume fraction, assuming the puff is a gas at ambient conditions.
By default the Palazzi model assumes a simple Gaussian plume model, $\chi$, for which this is a "correction", and uses plume dispersion parameters with $\sigma_x \left( x \right) = \sigma_y \left( x \right)$. However the user is free to use any plume model which is a subtype of Plume
, and any equation set that implements downwind dispersion.
There are multiple variations of the Palazzi short duration model, depending on how the downwind dispersion, $\sigma_x$ , is calculated:
:default
follows Palazzi and calculates $\sigma_x$ at the downwind distance x:intpuff
calculates $\sigma_x$ at the downwind distance to the cloud center at the start and end of the cloud, $ut$ and $u \left(t-\Delta t\right)$:tno
follows the TNO Yellow Book eqn 4.60b, using the distance x while the plume is still attached to the release point, and the distance to the cloud center, ut, afterwards
Integrated Gaussian Puff Model
GasDispersion.puff
— Methodpuff(::Scenario, IntPuff[, ::EquationSet]; kwargs...)
Returns the solution to an integrated Gaussian dispersion model, where the release is modeled as a sequence of Gaussian puffs, for the given scenario.
\[c\left(x,y,z,t\right) = \sum_{i}^{n-1} { {Q_{i,j} \Delta t} \over n } { { \exp \left( -\frac{1}{2} \left( {x - u \left( t - i \delta t \right) } \over \sigma_x \right)^2 \right) } \over { \sqrt{2\pi} \sigma_x } } { { \exp \left( -\frac{1}{2} \left( {y} \over \sigma_y \right)^2 \right) } \over { \sqrt{2\pi} \sigma_y } }\\ \times { { \exp \left( -\frac{1}{2} \left( {z - h} \over \sigma_z \right)^2 \right) + \exp \left( -\frac{1}{2} \left( {z + h} \over \sigma_z \right)^2 \right) } \over { \sqrt{2\pi} \sigma_z } }\]
where δt is Δt/n, and the σs are dispersion parameters correlated with the distance x. The EquationSet
defines the set of correlations used to calculate the dispersion parameters and windspeed. The concentration returned is in volume fraction, assuming the puff is a gas at ambient conditions.
Arguments
n::Integer
: the number of discrete gaussian puffs, defaults to infinity
The IntPuff
model treats a release as a sequence of $n$ gaussian puffs, each one corresponding to $\frac{1}{n}$ of the total mass of the release.
\[c\left(x,y,z,t\right) = \sum_{i}^{n-1} { {m_i \Delta t} \over n } { { \exp \left( -\frac{1}{2} \left( {x - u \left( t - i \delta t \right) } \over \sigma_x \right)^2 \right) } \over { \sqrt{2\pi} \sigma_x } } { { \exp \left( -\frac{1}{2} \left( {y} \over \sigma_y \right)^2 \right) } \over { \sqrt{2\pi} \sigma_y } }\\ \times { { \exp \left( -\frac{1}{2} \left( {z - h} \over \sigma_z \right)^2 \right) + \exp \left( -\frac{1}{2} \left( {z + h} \over \sigma_z \right)^2 \right) } \over { \sqrt{2\pi} \sigma_z } }\]
with
- c - concentration, kg/m^3
- $m_i$ - emission rate, kg/s
- $\Delta t$ - total duration, s
- $ \delta t = {\Delta t \over n} $ - puff interval, s
- u - windspeed, m/s
- $\sigma_x$ - downwind dispersion, m
- $\sigma_y$ - crosswind dispersion, m
- $\sigma_z$ - downwind dispersion, m
The model assumes the initial release is a single point, with no dimensions. Additionally, model converts the final concentration to volume fraction, assuming the puff is a gas at ambient conditions. If no number, n, is specified the model defaults to an integral approximation similar to the Palazzi Short Duration Puff Model.
Example
Continuing with the propane leak example from above, we now model the release as a sequence of 100 gaussian puffs. Essentially chopping the 10s over which the release happens into 0.1s intervals and releasing one puff per interval at a time for 10s.
ig = puff(scn, IntPuff; n=100)
At the same point as above the concentration has dropped
ig(100,0,2,86)
# output
0.0002521339225936648
plot(ig, 86; xlims=(90,110), ylims=(-10,10), aspect_ratio=:equal)
For short duration releases the model approximates the integral when $n \to \infty$ this is the default behaviour or when n=Inf
ig_inf = puff(scn, IntPuff)
plot(ig_inf, 86; xlims=(90,110), ylims=(-10,10), aspect_ratio=:equal)
Box Models
Britter-McQuaid Model
GasDispersion.puff
— Methodpuff(scenario::Scenario, BritterMcQuaidPuff[, equationset::EquationSet])
Returns the solution to the Britter-McQuaid instantaneous ground level release model for the given scenario.
The equationset
is used to calculate the windspeed at 10m, all other correlations are as per the Britter-McQuaid model. Unless otherwise specified a default power-law wind profile is used.
References
- Britter, Rex E. and J. McQuaid. 1988. Workbook on the Dispersion of Dense Gases. HSE Contract Research Report No. 17/1988
- AIChE/CCPS. 1999. Guidelines for Consequence Analysis of Chemical Releases. New York: American Institute of Chemical Engineers
The Britter-McQuaid model is an empirical correlation for dense cloud dispersion. The model generates an interpolation function for the average cloud concentration and the cloud is rendered as a cylinder. The only correlations used in the provided equationset are for windspeed.
Integral Models
SLAB Jet Model
GasDispersion.puff
— Methodpuff(::Scenario, SLAB; kwargs...)
Returns the solution to the SLAB horizontal jet dispersion model for the given scenario.
References
- Ermak, Donald L. 1990. User's Manual for SLAB: An Atmospheric Dispersion Model For Denser-Than-Air Releases Lawrence Livermore National Laboratory
Arguments
t_av::Number=10
: averaging time, secondsx_max::Number=2000
: maximum downwind distance, meters, this defines the problem domain
puff(::Scenario{Substance,VerticalJet,Atmosphere}, SLAB; kwargs...)
Returns the solution to the SLAB vertical jet dispersion model for the given scenario.
References
- Ermak, Donald L. 1990. User's Manual for SLAB: An Atmospheric Dispersion Model For Denser-Than-Air Releases Lawrence Livermore National Laboratory
Arguments
t_av::Number=10
: averaging time, secondsx_max::Number=2000
: maximum downwind distance, meters, this defines the problem domain
The SLAB jet model is derived from the SLAB software package developed by Donald L. Ermak at Lawrence Livermore National Laboratory. The model numerically integrates a set of conservation equations for the given domain, automatically transitioning from a steady-state plume model to a transient-state puff model as the release terminates. The result is a set of cloud parameters that are interpolated as a function of downwind distance and time to calculate the final concentration.
The SLAB model uses it's own built in models for atmospheric parameters, such as windspeed and dispersion.