Plume Models
Plume models are models of continuous, steady-state, releases and are time independent, this includes, for example, emissions from elevated stacks.
GasDispersion.plume
— Functionplume(scenario::Scenario, model::PlumeModel[, equationset::EquationSet])
Runs the plume 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 plume model.
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 Plume Models
Simple Gaussian Plume
GasDispersion.plume
— Methodplume(::Scenario, ::GaussianPlume[, ::EquationSet]; kwargs...)
Returns the solution to a Gaussian plume dispersion model for the given scenario.
\[c\left(x,y,z\right) = {m_{i} \over { 2 \pi \sigma_{y} \sigma_{z} u } } \exp \left[ -\frac{1}{2} \left( y \over \sigma_{y} \right)^2 \right] \\ \times \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\}\]
where the σs are dispersion parameters correlated with the distance x. The EquationSet
defines the set of correlations used to calculate the dispersion parameters. The concentration returned is in volume fraction, assuming the plume is a gas at ambient conditions.
References
- AIChE/CCPS. 1999. Guidelines for Consequence Analysis of Chemical Releases. New York: American Institute of Chemical Engineers
plume(::Scenario{Substance,VerticalJet,Atmosphere}, ::GaussianPlume[, ::EquationSet]; kwargs...)
Returns the solution to a Gaussian plume dispersion model for a vertical jet. By default the Briggs plume rise model is used.
\[c\left(x,y,z\right) = {m_{i} \over { 2 \pi \sigma_{y} \sigma_{z} u } } \exp \left[ -\frac{1}{2} \left( y \over \sigma_{y} \right)^2 \right] \\ \times \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\}\]
where the σs are dispersion parameters correlated with the distance x. The EquationSet
defines the set of correlations used to calculate the dispersion parameters. The concentration returned is in volume fraction, assuming the plume is a gas at ambient conditions.
Arguments
downwash::Bool=false
: when true, includes stack-downwash effectsplumerise::Bool=true
: when true, includes plume-rise effects using Briggs' model
References
- AIChE/CCPS. 1999. Guidelines for Consequence Analysis of Chemical Releases. New York: American Institute of Chemical Engineers
- Briggs, Gary A. 1969. Plume Rise Oak Ridge: U.S. Atomic Energy Commission
The simple gaussian plume model assumes that concentration profile in the crosswind (y) and vertical (z) directions follow gaussian distributions with dispersions $\sigma_y$ and $\sigma_z$, respectively. This model can be derived from an advection-diffusion equation, or simply taken as a given.
The basic gaussian would have the plume expand downward beyond the ground, to correct for this an additional term for ground reflection is added. This is equivalent to adding a mirror image source reflected across the x-z plane, and causes mass to accumulate along the ground instead of simply disappearing (as would happen in the naive case).
The concentration is then given by:
\[ c = {m_i \over 2 \pi u \sigma_{y} \sigma_{z} } \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 emission rate of the species, kg/s
- u - windspeed, m/s
- $\sigma_y$ - crosswind dispersion, m
- $\sigma_z$ - vertical dispersion, m
- h - release elevation, m
Three important parameters are determined from correlations, which are functions of the atmospheric stability: the windspeed at the release point, the crosswind dispersion, and the vertical dispersion. The model converts the final concentration to volume fraction, assuming the plume is a gas at ambient conditions.
Crosswind dispersion correlations
The crosswind dispersion, $\sigma_{y}$ is a function of downwind distance, $x$ as well as stability class
\[ \sigma_{y} = \delta x^{\beta} \]
Where $\delta$, $\beta$, and $\gamma$ are tabulated based on stability class (Spicer and Havens 1988, 112):
Stability Class | $\delta$ | $\beta$ |
---|---|---|
A | 0.423 | 0.9 |
B | 0.313 | 0.9 |
C | 0.210 | 0.9 |
D | 0.136 | 0.9 |
E | 0.102 | 0.9 |
F | 0.0674 | 0.9 |
Vertical dispersion correlations
The vertical dispersion, $\sigma_{z}$ is a function of downwind distance, $x$ as well as stability class
\[ \sigma_{z} = \delta x^{\beta} \exp \left( \gamma \left( \ln x \right)^2 \right) \]
Where $\delta$ and $\beta$ are tabulated based on stability class (Seinfeld 1986)
Stability Class | $\delta$ | $\beta$ | $\gamma$ |
---|---|---|---|
A | 107.7 | -1.7172 | 0.2770 |
B | 0.1355 | 0.8752 | 0.0136 |
C | 0.09623 | 0.9477 | -0.0020 |
D | 0.04134 | 1.1737 | -0.0316 |
E | 0.02275 | 1.3010 | -0.0450 |
F | 0.01122 | 1.4024 | -0.0540 |
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$. 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
And then pass it to the plume
function
g = plume(scn, GaussianPlume())
g(100,0,2)
Where g
is a callable which returns the concentration (in vol fraction) at any point. For example at 100m downwind and at a height of 2m the result is ~612ppm (vol). Beyond simply having a number, we may want a plan-view of the plume at a given height, say 2m.
using Plots
plot(g, xlims=(0,100), ylims=(-10,10), height=2)
We might want instead to look at the concentration at the release height: 3.5 m, zoom in, and look at concentrations in the vicinity of the LEL.
LEL = 0.021 # v/v, LEL from CAMEO Chemicals
UEL = 0.095 # v/v, UEL from CAMEO Chemicals
plot(g, xlims=(0,100), ylims=(-5,5), height=3.5, clims=(0,LEL))
These plan views stretch out the crosswind distance, but we can change the aspect ratio, to give a sense of how skinny the plume actually is
plot(g, xlims=(0,50), ylims=(-10,10), height=3.5, clims=(0,LEL),
aspect_ratio=:equal)
Gaussian Plume within a Mixing Layer
GasDispersion.plume
— Methodplume(::Scenario, ::GaussianMixingLayer[, ::EquationSet]; kwargs...)
Returns the solution to a Gaussian plume dispersion model with a simple reflective mixing layer.
\[c(x, y, z) = \frac{m_i}{u} \frac{1}{ \sqrt{2\pi} \sigma_y} \exp\left(-\frac{1}{2}\left(\frac{y}{\sigma_y}\right)^2\right) F_z\]
where $ F_z $ is the vertical dispersion term, a function of the mixing height $ h_m $, and other symbols are as defined for a Gaussian plume model.
There are two methods for the mixing layer:
:simplemixinglayer
uses a simple method of images, a series of reflections off of the mixing height:periodicmixinglayer
uses an infinite series of cosine terms to calculate the vertical dispersion, which is more accurate for large mixing heights
Keyword Arguments
h_min=1.0
: Minimum height for windspeed calculations.method=:simplemixinglayer
: The method used for the mixing layer.n_terms=10
: Number terms in the series calculation of $ F_z $.mixing_limit=10_000.0
: Limit for the mixing height, in meters. Mixing heights above this are treated as infinite.
References
- AIChE/CCPS. 1999. Guidelines for Consequence Analysis of Chemical Releases. New York: American Institute of Chemical Engineers
- US EPA. 1995. User's Guide for the Industrial Source Complex (ISC3) Dispersion Models EPA-454/B-95-003b, vol 2. Research Triangle Park, NC: Office of Air Quality Planning and Standards
- Seinfeld, John H. and Spyros N. Pandis. 2006. Atmospheric Chemistry and Physics 2nd Ed. New York: John Wiley and Sons.
plume(::Scenario{Substance,VerticalJet,Atmosphere}, ::GaussianMixingLayer[, ::EquationSet]; kwargs...)
Returns the solution to a Gaussian plume dispersion model with a simple reflective mixing layer.
\[c(x, y, z) = \frac{m_i}{u} \frac{1}{ \sqrt{2\pi} \sigma_y} \exp\left(-\frac{1}{2}\left(\frac{y}{\sigma_y}\right)^2\right) F_z\]
where $ F_z $ is the vertical dispersion term, a function of the mixing height $ h_m $, and other symbols are as defined for a Gaussian plume model.
There are two methods for the mixing layer:
:simplemixinglayer
uses a simple method of images, a series of reflections off of the mixing height:periodicmixinglayer
uses an infinite series of cosine terms to calculate the vertical dispersion, which is more accurate for large mixing heights
Keyword Arguments
downwash::Bool=false
: Include stack-downwash effects if true.plumerise::Bool=true
: Include plume-rise effects using Briggs' model if true.h_min=1.0
: Minimum height, in meters, for windspeed calculations.method=:simplemixinglayer
: The method used for the mixing layer.n_terms=10
: Number terms in the series calculation of $ F_z $.mixing_limit=10_000.0
: Limit for the mixing height, in meters. Mixing heights above this are treated as infinite.
References
- AIChE/CCPS. 1999. Guidelines for Consequence Analysis of Chemical Releases. New York: American Institute of Chemical Engineers
- Briggs, Gary A. 1969. Plume Rise Oak Ridge: U.S. Atomic Energy Commission
- US EPA. 1995. User's Guide for the Industrial Source Complex (ISC3) Dispersion Models EPA-454/B-95-003b, vol 2. Research Triangle Park, NC: Office of Air Quality Planning and Standards
- Seinfeld, John H. and Spyros N. Pandis. 2006. Atmospheric Chemistry and Physics 2nd Ed. New York: John Wiley and Sons.
The gaussian mixing layer model allows for the plume to be contained entirely within a mixing layer of a given height. This can be done using either the method of images or a periodic boundary.
\[c(x, y, z) = \frac{m_i}{u} \frac{1}{\sqrt{2\pi} \sigma_y} \exp\left(-\frac{1}{2}\left(\frac{y}{\sigma_y}\right)^2\right) F_z\]
Where $F_z$ is the vertical dispersion term. For the method of images this takes the form of the infinite sum (Beychok 1994 p 123)
\[F_z = \frac{1}{\sqrt{2\pi} \sigma_z} \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) \\ \sum_{n=1}^{\infty} \left[ \exp\left(-\frac{1}{2}\left(\frac{z - h + 2n h_m}{\sigma_z}\right)^2\right) + \exp\left(-\frac{1}{2}\left(\frac{z - h - 2n h_m}{\sigma_z}\right)^2\right) \\ + \exp\left(-\frac{1}{2}\left(\frac{z + h + 2n h_m}{\sigma_z}\right)^2\right) \\ + \exp\left(-\frac{1}{2}\left(\frac{z + h - 2n h_m}{\sigma_z}\right)^2\right) \right]\]
For the periodic boundary it takes the form of another infinite sum (Seinfeld and Pandis 2006 p 858)
\[F_z = \frac{2}{h_m} \left( \frac{1}{2} + \sum_{n=1}^{\infty} cos\left( {n\pi z} \over h_m \right) cos\left( {n\pi h} \over h_m \right) \exp\left(-\frac{1}{2}\left(\frac{n\pi \sigma_z}{h_m}\right)^2\right) \right)\]
The periodic boundary layer approach can be very slow to converge, in which case the number of terms given by the keyword argument n_terms
should be increased. By default the sums terminate early if the solution converges, e.g. if n_terms=100_000_000
or some other huge number but the sum converges after 5 terms, only 5 terms will be calculated. The simple mixing layer approach converges much more quickly, and typically 10 terms are more than enough.
As SimpleAtmosphere
s do not define mixing height, one is calculated based on the following:
- for stable atmospheres (class E and F) the mixing height is assumed to be infinite, and the model defaults back to a Simple Gaussian Plume
- for unstable and neutral atmospheres (classes A through D) the mixing height is calculated from the friction velocity $u^{*}$ and the coriolis parameter $f$: $h_m = 0.3 \frac{u^{*}}{f}$ where $f$ is calculated at a default latitude of 40°N (consistent with US EPA 1995).
Jet Plumes
Simple Jet Model
GasDispersion.plume
— Methodplume(::Scenario, ::SimpleJet; kwargs...)
Returns the solution to a simple turbulent jet dispersion model for the given scenario.
\[c\left(x,y,z\right) = k_2 c_0 \left( d \over z \right) \sqrt{ \rho_j \over \rho_a } \exp \left( - \left( k_3 { r \over z } \right)^2 \right)\]
where r is the radial distance from the jet centerline. Assumes a circular jet with diameter equal to the jet diameter. Ground-reflection is included by method of images.
References
- Long, V.D. 1963. "Estimation of the Extent of Hazard Areas Round a Vent." Chem. Process Hazard. II:6
Arguments
release_angle::Number=nothing
: the angle at which the jet is released, in radians, if nothing defaults to 0 for horizontal jets and π/2 for vertical jetsk2::Number=6
parameter of the model, default value is recommended by Longk3::Number=5
parameter of the model, default value is recommended by Long
Simple jet dispersion models are a useful tool for evaluating dispersion near the region where a jet release is occurring. They are based on a simplified model where the air is stationary and all of the momentum needed to mix the release is supplied by the jet. This is in some ways the opposite assumptions than are used in the Gaussian Plume model – where the release is assumed to have negligible velocity and the momentum is entirely supplied by the wind.
\[c = k_2 c_0 \left( d \over z \right) \sqrt{ \rho_j \over \rho_a } \exp \left( - \left( k_3 { y \over x } \right)^2 \right) \left[ \exp \left( - \left( k_3 { (z-h) \over x }\right)^2 \right) + \exp \left( - \left( k_3 { (z+h) \over x }\right)^2 \right) \right]\]
with
- c - concentration, volume fraction
- $k_2$ and $k_3$ - model parameters
- $c_0$ - initial concentration, volume fraction
- d - diameter of the jet, m
- $\rho_j$ - initial density of the jet material, kg/m^3
- $\rho_a$ - density of the ambient atmosphere, kg/m^3
Model Parameters
The model parameters $k_2$ and $k_3$ are per Long (1963)
$k_2$ | 6.0 |
$k_3$ | 5.0 |
the initial concentration is calculated from the mass flowrate and volumetric flowrate
\[ c_0 = { Q_i \over Q } = { \dot{m} \over \rho Q } = { \dot{m} \over { \rho \frac{\pi}{4} d^2 u } } \]
Example
Suppose we wish to model the dispersion of gaseous propane using the same scenario, scn
, worked out above.
j = plume(scn, SimpleJet())
j(100,0,2)
# output
0.002485496609730624
plot(j, xlims=(0,100), ylims=(-10,10), height=2)
Top-Hat Models
Britter-McQuaid Model
GasDispersion.plume
— Methodplume(::Scenario, ::BritterMcQuaidPlume[, equationset::EquationSet])
Returns the solution to the Britter-McQuaid continuous 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 based on the Workbook on the Dispersion of Dense Gases(Britter and McQuaid 1988) which uses a series of correlations relating maximum center-line concentrations to downwind distances based upon actual releases. The model of the plume is a series of rectangular slices with constant, average, concentration throughout – giving a "top-hat" model. Points outside the defined plume are assumed to have zero concentration.
The original workbook gives the correlations as simply curves on a page, this model uses digitizations of those correlations(AIChE/CCPS 1999, 118)
Example
This example is based on the Burro LNG dispersion results, in which LNG was released at ground-level, as given in Guidelines for Consequence Analysis (AIChE/CCPS 1999, 122):
- release temperature: -162°C
- release rate: 0.23 m³/s (liquid)
- release duration: 174 s
- windspeed at 10m: 10.9 m/s
- LNG liquid density (at release conditions): 425.6 kg/m³
- LNG gas density (at release conditions): 1.76 kg/m³
and we assume the atmosphere was otherwise at ambient conditions of 298K and 1atm.
using GasDispersion
lng = Substance(name = :LNG,
molar_weight = 0.01604, # kg/mol, Methane
gas_density = 1.76,
liquid_density = 425.6,
reference_temp=(273.15-162),
reference_pressure=101325.0,
boiling_temp = 111.6, # Methane, NIST Webbook
latent_heat = 509880.0, # J/kg, Methane
gas_heat_capacity = 2240.0, # J/kg/K, Methane
liquid_heat_capacity = 3349.0) # J/kg/K, Methane
ṁ = 0.23*lng.ρ_l # liquid spill rate times liquid density
Q = ṁ/lng.ρ_g # gas volumetric flowrate
d = 1
A = (π/4)*(d)^2 # release area, assuming a diameter of 1m.
u = Q/A # initial jet velocity
r = HorizontalJet( mass_rate = ṁ,
duration = 174,
diameter = d,
velocity = u,
height = 0.0,
pressure = 101325.0,
temperature = (273.15-162),
fraction_liquid = 0.0)
a = SimpleAtmosphere(windspeed=10.9, temperature=298, stability=ClassF())
scn = Scenario(lng,r,a)
Generating a solution using the Britter-McQuaid model is quite simple
bm = plume(scn, BritterMcQuaidPlume())
bm(367,0,0)
# output
0.050717667650511944
From the reference, we expect the concentration to be ~5%, which is within acceptable margins given the imprecision that comes with using correlations (especially with pencil and paper).