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

Integrated Gaussian Puffs
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.
Dispersion Parameters
The dispersion parameters are the same as used for the GaussianPlume
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)
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.
SLAB Horizontal 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
The SLAB horizontal 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.