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

Integrated Gaussian Puffs

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.

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

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.

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

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.