Puff Models

Puff models are for "instantaneous" releases or other time-dependent releases.

GasDispersion.puffFunction
puff(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.

equationsets 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.)

source

Gaussian Puff Models

Simple Gaussial Puffs

GasDispersion.puffMethod
puff(::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
source

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$
A0.180.92
B0.140.92
C0.100.92
D0.060.92
E0.040.92
F0.020.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$
A0.600.75
B0.530.73
C0.340.71
D0.150.70
E0.100.65
F0.050.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)
Example block output

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
Example block output

Palazzi Short Duration Puff Model

GasDispersion.puffMethod
puff(::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 dispersion
  • plume_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.
source

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.puffMethod
puff(::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
source

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)
Example block output

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)
Example block output

Box Models

Britter-McQuaid Model

GasDispersion.puffMethod
puff(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
source

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.puffMethod
puff(::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, seconds
  • x_max::Number=2000: maximum downwind distance, meters, this defines the problem domain
source
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, seconds
  • x_max::Number=2000: maximum downwind distance, meters, this defines the problem domain
source

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.