Site and dispersion parameters
The stack, the air it discharges into, the ground beneath, and everything derived from them that does not depend on where the receptor is.
Surface categories
AtmosphericDispersion.PRECIPITATION_TYPES — Constant
PRECIPITATION_TYPESBoth precipitation types, rain first.
AtmosphericDispersion.ROUGHNESS_CLASSES — Constant
ROUGHNESS_CLASSESThe six roughness classes, in order of increasing roughness length.
AtmosphericDispersion.WIND_PROFILE_SURFACES — Constant
WIND_PROFILE_SURFACESThe three wind-profile surface categories, in table order.
AtmosphericDispersion.PrecipitationType — Type
PrecipitationTypeForm of precipitation scavenging the plume. Rain removes airborne material between two and three orders of magnitude faster than snow at the same intensity.
AtmosphericDispersion.RoughnessClass — Type
RoughnessClassSurface roughness category controlling the vertical dispersion parameter σ_z, from open water through to dense urban fabric.
Each class carries a roughness length z₀ (see roughness_length) and a set of coefficients for the roughness correction factor of σ_z.
AtmosphericDispersion.WindProfileSurface — Type
WindProfileSurfaceSurface category controlling the exponent of the power-law wind profile u(z) = u₁₀ (z/10)^m.
This is a coarser classification than RoughnessClass, which controls the vertical dispersion parameter. The two are tabulated separately and are not interchangeable: a site is described by one of each.
Tabulated coefficients
AtmosphericDispersion.DISPERSION_SCHEMES — Constant
DISPERSION_SCHEMESThe four dispersion schemes, in enumeration order.
AtmosphericDispersion.EIMUTIS_KONICEK_LATERAL_EXPONENT — Constant
EIMUTIS_KONICEK_LATERAL_EXPONENTThe exponent of distance in the Eimutis–Konicek σ_y, 0.9031, common to every class.
AtmosphericDispersion.EIMUTIS_KONICEK_RANGES — Constant
EIMUTIS_KONICEK_RANGESDistances in metres at which the Eimutis–Konicek σ_z changes from one set of coefficients to the next: below 100 m, from 100 m to 1 km, and beyond.
AtmosphericDispersion.PRECIPITATION_RATES — Constant
PRECIPITATION_RATESThe precipitation intensities in mm/h at which the washout coefficients are tabulated. washout_coefficients is defined at these values and nowhere else.
AtmosphericDispersion.BriggsCoefficients — Type
BriggsCoefficientsCoefficients of one of Briggs' interpolation formulae for a dispersion parameter,
σ = a x (1 + b x)^pwith x and σ in metres. See briggs_lateral_coefficients and briggs_vertical_coefficients.
AtmosphericDispersion.DispersionScheme — Type
DispersionSchemeWhich published set of dispersion parameters a Site evaluates.
DISPERSION_HOSKER— the normative's pairing, and the default: Briggs' open-countryσ_ywith Hosker'sσ_z, which carries an explicit roughness correction. Seelateral_dispersionandvertical_dispersion.DISPERSION_BRIGGS_OPEN_COUNTRY— both parameters from Briggs (1973), as printed in the Handbook on Atmospheric Diffusion (Hanna et al., 1982) Table 4.5. No roughness dependence.DISPERSION_BRIGGS_URBAN— Briggs' urban set from the same table, his fit to the St. Louis experiment of McElroy and Pooler (1968). Classes A and B share one curve, as do E and F.DISPERSION_EIMUTIS_KONICEK— the analytic fit of Eimutis and Konicek (1972) to the Pasquill–Gifford curves, which the NRC codes XOQDOQ (Sagendorf et al., 1982) and PAVAN (Bander, 1982) evaluate.
Every scheme states a range of downwind distance it was fitted over; validity_range returns it.
AtmosphericDispersion.PowerLawCoefficients — Type
PowerLawCoefficientsCoefficients of a dispersion parameter written as
σ = a x^b + cwith x and σ in metres, the form of the Eimutis–Konicek fit. See eimutis_konicek_vertical_coefficients.
AtmosphericDispersion.RoughnessCoefficients — Type
RoughnessCoefficientsRoughness length z₀ in metres and the coefficients of the roughness correction factor applied to the vertical dispersion parameter. See roughness_coefficients and roughness_correction.
AtmosphericDispersion.VerticalShapeCoefficients — Type
VerticalShapeCoefficientsCoefficients of the shape function of the vertical dispersion parameter,
g(x) = a₁ x^b₁ / (1 + a₂ x^b₂)with x in metres. Keyed by Pasquill class; see vertical_shape_coefficients.
AtmosphericDispersion.WashoutCoefficients — Type
WashoutCoefficientsLower and upper washout coefficients Λ in s⁻¹ for a given precipitation type and intensity. The pair brackets the reported range; low is used where an underestimate of removal is conservative for the airborne concentration and high where an overestimate of deposition is.
AtmosphericDispersion.WashoutModel — Type
WashoutModelWhich scavenging scheme to use.
WASHOUT_NORMATIVE— the tabulated scheme of the normative, and the default. Its snow columns are the rain columns divided by exactly 100 and 500, a suppression appropriate to particles and reactive gases: IAEA TECDOC-379 (International Atomic Energy Agency, 1986) §3.5.4 gives 5 × 10⁻⁸ s⁻¹ for inorganic iodine in powder snow at 0.2 mm/h against 1.7 × 10⁻⁵ for the same species in rain, a factor of some 340 in the same direction.WASHOUT_HTO— the same rain columns, with snow from Ogram (1985), §6.0 Eq. (38):Λ_s = 1.2×10⁻⁴ R^0.33 + 3.0×10⁻⁴ R^0.64 s⁻¹, R in mm/hSnow scavenging of tritiated water is isotopic exchange at the crystal surface, not impaction, so the particle suppression is the wrong physics for it. Ogram measures scavenging about three orders of magnitude above the normative snow column, and calls the correlation an approximate upper limit.
The reference case of this package is HTO, so the two differ for it by a factor of roughly a thousand in snow. They are identical in rain.
AtmosphericDispersion.WashoutSpecies — Type
WashoutSpeciesWhich row of the normative's washout table applies. NSR-23 Table 7, which it attributes to CAN/CSA-N288.2-M91, tabulates two:
WASHOUT_TRITIUM_IODINE— tritium and iodine, the default, and the case this package's reference configuration is.WASHOUT_OTHER_NUCLIDES— every other radionuclide. Its rain values are roughly twice the tritium row's; its snow values are three to four orders of magnitude larger, not smaller.
That the two snow rows differ by so much in opposite directions is the reason the snow scavenging of tritiated water is worth stating explicitly rather than inheriting. See WashoutModel.
AtmosphericDispersion.briggs_lateral_coefficients — Method
briggs_lateral_coefficients(class, scheme)BriggsCoefficients of σ_y for the given Pasquill class under DISPERSION_BRIGGS_OPEN_COUNTRY or DISPERSION_BRIGGS_URBAN.
AtmosphericDispersion.briggs_vertical_coefficients — Method
briggs_vertical_coefficients(class, scheme)BriggsCoefficients of σ_z for the given Pasquill class under DISPERSION_BRIGGS_OPEN_COUNTRY or DISPERSION_BRIGGS_URBAN.
AtmosphericDispersion.eimutis_konicek_lateral_coefficient — Method
eimutis_konicek_lateral_coefficient(class)Coefficient a of the Eimutis–Konicek σ_y = a x^0.9031 for the given Pasquill class.
AtmosphericDispersion.eimutis_konicek_vertical_coefficients — Method
eimutis_konicek_vertical_coefficients(class, x)PowerLawCoefficients of the Eimutis–Konicek σ_z for the given Pasquill class on the range of distance that contains x metres; see EIMUTIS_KONICEK_RANGES.
AtmosphericDispersion.lateral_coefficient — Method
lateral_coefficient(class)Coefficient c₃ of the lateral dispersion parameter for the given Pasquill class, Briggs' open-country a; see lateral_dispersion.
AtmosphericDispersion.ogram_snow_washout — Method
ogram_snow_washout(rate)Washout coefficient in s⁻¹ for tritiated water in snow at rate mm/h of water equivalent, from Ogram (1985) Eq. (38).
The report's own Table V reproduces this at 0.5, 1 and 2 mm/h but prints 2.0 × 10⁻⁴ at 0.1 mm/h where the equation gives 1.25 × 10⁻⁴. That inconsistency is in the original; the equation is used here.
AtmosphericDispersion.profile_exponent — Method
profile_exponent(surface, class)Exponent m of the power-law wind profile u(z) = u₁₀ (z/10)^m for the given WindProfileSurface and Pasquill class.
The exponent grows with both surface roughness and atmospheric stability: shear is strongest over rough ground under a stable stratification.
AtmosphericDispersion.roughness_coefficients — Method
roughness_coefficients(roughness)RoughnessCoefficients of the given RoughnessClass.
AtmosphericDispersion.roughness_length — Method
roughness_length(roughness)Roughness length z₀ of the given class, in metres.
AtmosphericDispersion.vertical_shape_coefficients — Method
vertical_shape_coefficients(class)VerticalShapeCoefficients of the given Pasquill class.
AtmosphericDispersion.washout_coefficients — Function
washout_coefficients(precipitation, rate, model = WASHOUT_NORMATIVE)WashoutCoefficients for the given precipitation type and intensity in mm/h, under the chosen WashoutModel.
The table is defined only at the intensities in PRECIPITATION_RATES; any other value throws. The tabulated points follow a power law in intensity closely enough that interpolating between them would be defensible, but that is a modelling decision rather than a lookup, and it is not made here.
The mixing layer
AtmosphericDispersion.MIXING_TABULATED — Constant
MIXING_TABULATEDHPA-RPD-058 (Smith and Simmonds, 2009) Table 3.5(a), "Typical values of wind speed and depth of mixing layer for use when measured values are not available", attributed there to Clarke (1979) and Jones (1980): A 1300, B 900, C 850, D 800, E 400, F 100 m. The default. The table's category G is not carried, this package having none.
AtmosphericDispersion.MIXING_UNBOUNDED — Constant
MIXING_UNBOUNDEDNo lid in any class: the plume disperses upwards without limit.
AtmosphericDispersion.RECOMMENDED_MIXING_DEPTH — Constant
RECOMMENDED_MIXING_DEPTHThe single depth in metres HPA-RPD-058 §3.2.2.2.3 recommends "for all conditions" where the real one is unknown; MixingLayer(RECOMMENDED_MIXING_DEPTH).
AtmosphericDispersion.LidRule — Type
LidRuleWhat happens to a plume whose effective height lies above the top of the mixing layer.
RISE_INHIBITED— the capping inversion arrests the rise, and the plume is dispersed from the top of the layer: the effective height is taken asmin(H, A). NRPB-R157 (Jones, 1983) §B2.3: "plume rise will be inhibited by a capping inversion to the mixing layer. If a plume rises into such an inversion the amount of material in the mixing layer, and hence ground-level concentration, will be reduced." Keeping all of it in the layer is therefore the conservative reading, it is continuous inH, and it is what HPA-RPD-058 (Smith and Simmonds, 2009) Table 3.7 tabulates for a 100 m release under a 100 m lid. The default. A source that stands physically above the lid is treated the same way.FULL_PENETRATION— EPA ISC3 (U.S. Environmental Protection Agency, 1995): "if the effective stack height exceeds the mixing height, the plume is assumed to fully penetrate the elevated inversion and the ground-level concentration is set equal to zero." Nothing reaches the layer, so nothing deposits from it either.
AtmosphericDispersion.MixingLayer — Type
MixingLayer(depths; above_lid = RISE_INHIBITED)
MixingLayer(depth; above_lid = RISE_INHIBITED)Depth of the mixing layer in metres for each Pasquill class A to F, and the LidRule applied to a plume above it. Inf leaves a class unbounded. A single depth applies to every class.
The depth is a site measurement. Where it has not been measured, MIXING_TABULATED carries typical values; where it has, pass them:
MixingLayer((1500.0, 1200.0, 1000.0, 900.0, 300.0, 120.0))The ISC3 convention, which treats stable air as unbounded and lets a plume through the lid, is
MixingLayer((1500.0, 1200.0, 1000.0, 900.0, Inf, Inf); above_lid = FULL_PENETRATION)AtmosphericDispersion.crosswind_integrated_factor — Function
crosswind_integrated_factor(H, Σz, A, rule = RISE_INHIBITED)
crosswind_integrated_factor(H, Σz, layer, class)The vertical part of the crosswind-integrated plume, in m⁻¹: vertical_factor at ground level. Without a lid the two image terms coincide and it is exactly the √(2/π) exp(−H²/2Σ_z²)/Σ_z of the sector-averaged form; under a lid the plume has filled it tends to 1/A.
AtmosphericDispersion.mixing_depth — Function
mixing_depth(class, layer = MIXING_TABULATED)Depth of the mixing layer in metres for the given Pasquill class, Inf where the class is unbounded.
AtmosphericDispersion.vertical_factor — Function
vertical_factor(z, H, Σz, A, rule = RISE_INHIBITED)
vertical_factor(z, H, Σz, layer, class)The vertical part of the Gaussian plume at receptor height z for a release at effective height H with vertical dispersion Σz, under a mixing layer of depth A metres, in m⁻¹.
With A = Inf it is the ordinary ground-reflected Gaussian,
[exp(−(z − H)²/2Σ_z²) + exp(−(z + H)²/2Σ_z²)] / (√(2π) Σ_z)Under a lid it is the profile between two reflecting planes, HPA-RPD-058 Eq. (3.4) summed to convergence, which goes over to the uniform 1/A of Eq. (3.5) as Σ_z passes the depth. The activity between the ground and the lid integrates to one at every Σ_z, and the factor is zero above the lid.
A plume above the lid, H > A, is treated by rule; see LidRule.
Wind profile and dispersion parameters
AtmosphericDispersion.PROFILE_CEILING — Constant
PROFILE_CEILINGHeight in metres above which the power-law wind profile is held constant.
AtmosphericDispersion.REFERENCE_HEIGHT — Constant
REFERENCE_HEIGHTHeight in metres at which the reference wind speed of the power-law profile is quoted, by convention ten metres.
AtmosphericDispersion.SHORT_RELEASE_REFERENCE — Constant
SHORT_RELEASE_REFERENCEReference release duration in seconds, ten minutes, below which no meander broadening is applied to the lateral dispersion parameter.
AtmosphericDispersion.SMOOTH_ROUGHNESS_LIMIT — Constant
SMOOTH_ROUGHNESS_LIMITRoughness length in metres separating the two tabulated forms of the roughness correction factor.
AtmosphericDispersion.briggs_lateral_dispersion — Method
briggs_lateral_dispersion(x, class, scheme)Lateral dispersion parameter σ_y in metres at downwind distance x metres from Briggs' interpolation formulae (Briggs, 1973), as printed in the Handbook on Atmospheric Diffusion (Hanna et al., 1982) Table 4.5,
σ_y = a x (1 + b x)^(−1/2)with b = 10⁻⁴ under DISPERSION_BRIGGS_OPEN_COUNTRY and 4 × 10⁻⁴ under DISPERSION_BRIGGS_URBAN; see briggs_lateral_coefficients. Briggs quotes the formulae for 10² < x < 10⁴ m, validity_range.
AtmosphericDispersion.briggs_vertical_dispersion — Method
briggs_vertical_dispersion(x, class, scheme)Vertical dispersion parameter σ_z in metres at downwind distance x metres from Briggs' interpolation formulae, σ_z = a x (1 + b x)^p, under DISPERSION_BRIGGS_OPEN_COUNTRY or DISPERSION_BRIGGS_URBAN; see briggs_vertical_coefficients. Unlike Hosker's, these carry no roughness dependence: the Handbook notes that they "are independent of release height and roughness".
AtmosphericDispersion.dispersion_parameters — Method
dispersion_parameters(x, class, scheme, roughness;
release_duration = SHORT_RELEASE_REFERENCE)Both dispersion parameters at downwind distance x metres under the given DispersionScheme, as a named tuple (σy, σz) in metres: lateral_dispersion and vertical_dispersion of that scheme, σ_y broadened for a long release.
AtmosphericDispersion.eimutis_konicek_lateral_dispersion — Method
eimutis_konicek_lateral_dispersion(x, class)Lateral dispersion parameter σ_y in metres at downwind distance x metres from the fit of Eimutis and Konicek (1972) to the Pasquill–Gifford curves, σ_y = a x^0.9031; see eimutis_konicek_lateral_coefficient. This is the σ_y of NRC XOQDOQ (Sagendorf et al., 1982) and PAVAN (Bander, 1982).
AtmosphericDispersion.eimutis_konicek_vertical_dispersion — Method
eimutis_konicek_vertical_dispersion(x, class)Vertical dispersion parameter σ_z in metres at downwind distance x metres from the fit of Eimutis and Konicek (1972) to the Pasquill–Gifford curves, σ_z = a x^b + c with one set of coefficients on each of three ranges of distance; see eimutis_konicek_vertical_coefficients.
AtmosphericDispersion.lateral_dispersion — Method
lateral_dispersion(x, class; release_duration = SHORT_RELEASE_REFERENCE)
lateral_dispersion(x, class, scheme; release_duration = SHORT_RELEASE_REFERENCE)Lateral dispersion parameter σ_y in metres at downwind distance x metres. Without a scheme it is Briggs' open-country form, the σ_y of the normative,
σ_y = c₃ x / √(1 + 10⁻⁴ x)and with one it is that scheme's; see DispersionScheme. Either is broadened for a release longer than ten minutes by meander_broadened. release_duration is in seconds.
AtmosphericDispersion.layer_mean_wind_speed — Method
layer_mean_wind_speed(u₁₀, z₁, z₂, surface, class)Mean of the power-law wind profile over the layer z₁ ≤ z ≤ z₂, in m/s,
ū = (1/(z₂ − z₁)) ∫ u(z) dzintegrated in closed form, with the profile held at its ceiling value above PROFILE_CEILING as wind_speed holds it. With z₂ = z₁ it is the wind speed at that height. This is the u of the stable final rise under WIND_MEAN_OVER_RISE.
AtmosphericDispersion.meander_broadened — Method
meander_broadened(σy, release_duration)σ_y in metres broadened for a release longer than SHORT_RELEASE_REFERENCE by the factor (t_R / 600)^0.2, which accounts for the additional meander of the wind direction over the release; unchanged at or below ten minutes. release_duration is in seconds. The rule is the normative's and applies whichever DispersionScheme supplied σ_y.
AtmosphericDispersion.roughness_correction — Method
roughness_correction(x, roughness)Roughness correction factor F(x) multiplying the shape function of the vertical dispersion parameter, at downwind distance x metres.
Two forms are tabulated, selected by the roughness length: smooth surfaces (z₀ ≤ 0.1 m) take F = ln(c₁ x^d₁ / (1 + c₂ x^d₂)), rough ones take F = ln(c₁ x^d₁ (1 + 1/(c₂ x^d₂))).
AtmosphericDispersion.validity_range — Method
validity_range(scheme)The range of downwind distance in metres, (lower, upper), over which the parameters of a DispersionScheme were fitted, as the intersection of what its two parameters state; the ends are included.
- Briggs quotes his formulae, open country and urban alike, for
10² < x < 10⁴ m(Handbook Table 4.5 (Hanna et al., 1982)):DISPERSION_BRIGGS_OPEN_COUNTRYandDISPERSION_BRIGGS_URBANgive(100, 10_000). DISPERSION_HOSKERpairs Briggs'σ_ywith Hosker'sσ_z, which was fitted to Smith's curves "presented graphically out to distances of 100 km" (HPA-RPD-058 (Smith and Simmonds, 2009) §3.2.2.1). The pairing is bounded by itsσ_y:(100, 10_000).- The Eimutis–Konicek fit reproduces the Pasquill–Gifford curves, which Turner (1970) draws from 100 m to 100 km:
(100, 100_000).
The evaluation itself refuses no distance. The configuration loader applies the policy of [model] extrapolation to the receptor grid, and within_validity tests a single distance.
AtmosphericDispersion.vertical_dispersion — Method
vertical_dispersion(x, class, scheme, roughness)Vertical dispersion parameter σ_z in metres at downwind distance x metres under the given DispersionScheme. roughness enters only through Hosker's σ_z, the parameters of the other three schemes carrying no roughness dependence.
AtmosphericDispersion.vertical_dispersion — Method
vertical_dispersion(x, class, roughness)Vertical dispersion parameter σ_z in metres at downwind distance x metres, as the product of the shape function and the roughness correction, σ_z = g(x) F(x).
Throws a DomainError if the parameterisation returns a non-positive value. That happens only at distances far shorter than the model is meant for — below about a tenth of a millimetre for the smoothest class — but a negative σ_z would otherwise propagate silently into every quantity downstream.
AtmosphericDispersion.vertical_shape — Method
vertical_shape(x, class)Shape function g(x) = a₁ x^b₁ / (1 + a₂ x^b₂) of the vertical dispersion parameter, in metres, at downwind distance x metres.
AtmosphericDispersion.wind_speed — Method
wind_speed(u₁₀, z, surface, class)Wind speed at height z metres, from the reference speed u₁₀ at ten metres, through the power law u(z) = u₁₀ (z/10)^m.
The exponent m comes from profile_exponent. Above PROFILE_CEILING the profile is held at its ceiling value: the power law is a surface-layer fit, and extrapolating it into the free atmosphere overstates the shear.
z must be positive and u₁₀ non-negative.
AtmosphericDispersion.within_validity — Method
within_validity(x, scheme)Whether the downwind distance x metres lies inside the validity_range of the scheme, ends included.
Source and ambient state
AtmosphericDispersion.DRY_AIR_SPECIFIC_HEAT — Constant
DRY_AIR_SPECIFIC_HEATIsobaric specific heat capacity of dry air, 1005 J/(kg·K).
This is the value the atmospheric stability parameter needs: the term g/c_p in it is the dry adiabatic lapse rate, a property of the ambient air the plume rises through, not of the gas leaving the stack.
AtmosphericDispersion.STANDARD_GRAVITY — Constant
STANDARD_GRAVITYStandard acceleration of gravity, 9.80665 m/s², the SI defined value.
AtmosphericDispersion.Atmosphere — Type
Atmosphere(; reference_speed, temperature, density, lapse_rate, surface, roughness,
specific_heat = DRY_AIR_SPECIFIC_HEAT)Ambient state the plume disperses into.
reference_speed— wind speed atREFERENCE_HEIGHT, m/stemperature— ambient air temperature, Kdensity— ambient air density, kg/m³lapse_rate— vertical temperature gradientdT/dz, K/m, positive for an inversionsurface—WindProfileSurfacedriving the wind profile exponentroughness—RoughnessClassdriving the vertical dispersionspecific_heat— isobaric specific heat of the ambient air, J/(kg·K)
The Pasquill class and the lapse rate describe the same stratification. A physically consistent calculation varies lapse_rate with the class — negative for the unstable classes A to C, near the adiabatic value for D, positive for E and F. Holding one fixed while sweeping the other, as the 2021 code did with a single strongly stable gradient applied to every class, makes the unstable classes internally inconsistent.
AtmosphericDispersion.StackSource — Type
StackSource(; height, diameter, exit_velocity, exit_density, exit_temperature)Geometry and discharge conditions of an elevated point source.
height— stack height above ground, mdiameter— inner diameter at the stack exit, mexit_velocity— vertical gas velocity at the exit, m/sexit_density— density of the emitted gas at the exit, kg/m³exit_temperature— temperature of the emitted gas, K
The buoyancy and momentum fluxes that drive plume rise are derived from these together with the ambient state; see buoyancy_flux and momentum_flux.
AtmosphericDispersion.buoyancy_flux — Method
buoyancy_flux(source, atmosphere)Buoyancy flux parameter F in m⁴/s³,
F = (ρ − ρ₀)/ρ · g · w₀ · (D/2)²from the density deficit of the emitted gas against the ambient air.
Negative for a plume denser than the ambient air, in which case the rise correlations of this model do not apply — they describe buoyant plumes — and buoyant_rise will reject it.
AtmosphericDispersion.momentum_flux — Method
momentum_flux(source, atmosphere)Momentum flux parameter F_m in m⁴/s²,
F_m = ρ₀/ρ · w₀² · (D/2)²AtmosphericDispersion.stability_parameter — Method
stability_parameter(atmosphere)Atmospheric stability parameter S in s⁻²,
S = g/T · (g/c_p + dT/dz)the squared Brunt–Väisälä frequency of the ambient stratification. Positive in stably stratified air, zero at the dry adiabatic lapse rate, negative in unstable air.
The specific heat entering through g/c_p is that of the ambient air, which is what makes that term the dry adiabatic lapse rate. The 2021 code used the specific heat of the emitted water vapour here, 1871 J/(kg·K) instead of about 1005, which halves the adiabatic correction and shifts S by some fifteen per cent for the gradient it ran with.
Plume rise
AtmosphericDispersion.BRIGGS_RISE — Constant
BRIGGS_RISEBriggs throughout, and the default: 2β² = 0.72, 3 w₀D/u, 2.6[F/(uS)]^(1/3).
AtmosphericDispersion.BUOYANCY_FLUX_BREAKPOINT — Constant
BUOYANCY_FLUX_BREAKPOINTBuoyancy flux in m⁴/s³ separating the two branches of the transition-distance correlation.
AtmosphericDispersion.MECHANISM_BALANCE_TOLERANCE — Constant
MECHANISM_BALANCE_TOLERANCERelative difference between the two final rises below which neither mechanism is taken to dominate and the combined law is used instead.
AtmosphericDispersion.NSR23_RISE — Constant
NSR23_RISEThe constants of CNCAN NSR-23 (Comisia Națională pentru Controlul Activităților Nucleare, 2004), the Romanian normative, which the 2021 thesis code followed: 0.5 in the combined law and Holland's 1.5 for the momentum rise. combined_buoyancy here does not reduce to the two-thirds law.
AtmosphericDispersion.XOQDOQ_RISE — Constant
XOQDOQ_RISEBriggs, with the stable coefficient NRC XOQDOQ (Sagendorf et al., 1982) writes as 2.4.
AtmosphericDispersion.RiseCoefficients — Type
RiseCoefficientsThe three plume-rise constants that published schemes disagree on, so that the choice is made in the configuration rather than buried in the source.
combined_buoyancy— the denominator of the buoyancy term in the combined law. Briggs writes3F x²/(2β²u³)with an entrainment parameterβ = 0.6, giving 0.72; NSR-23 has 0.5, which does not reduce to the two-thirds law as the momentum flux vanishes.neutral_momentum— the coefficient of the neutral final momentum rise,c w₀D/u. Briggs (1969) Eq. 5.2, as implemented by EPA ISC3 (U.S. Environmental Protection Agency, 1995) Eq. (1-16), gives 3. CNCAN NSR-23 has 1.5, which is the momentum term of Holland's formula,Δh = (w₀D/u)[1.5 + 2.68×10⁻³ p (T_s − T_a)D/T_s]withpin mbar ((Holland, 1953); Turner (1970) Eq. 4.1), taken without its buoyancy term.stable_final— the coefficient of the stable final buoyant rise,c [F/(uS)]^(1/3). Briggs and the Handbook on Atmospheric Diffusion (Hanna et al., 1982) give 2.6; NRC XOQDOQ writes 2.4.
See BRIGGS_RISE, XOQDOQ_RISE and NSR23_RISE.
AtmosphericDispersion.StableRiseWind — Type
StableRiseWindWhich wind speed enters the stable final rise c [F/(uS)]^(1/3).
WIND_MEAN_OVER_RISE— the mean of the profile between the release height and the top of the rise, which is how the Handbook on Atmospheric Diffusion (Hanna et al., 1982) defines theuof its Eq. 2.19: "an average value between the heights hs and hs + Δh". The rise and the mean depend on each other and are solved together; seestable_rise_wind_speed. The default.WIND_AT_RELEASE_HEIGHT— the transport wind at the release height, as the neutral limit and the transitional law take it, and as NRC XOQDOQ (Sagendorf et al., 1982) and the 2021 code did.
Only a Site, which knows the wind profile, can form the mean. The functions that take a scalar wind speed take whichever value they are given, through their stable_wind keyword.
AtmosphericDispersion.buoyancy_transition_distance — Method
buoyancy_transition_distance(F)Distance x₀ in metres over which a buoyant plume approaches its final rise,
x₀ = 14 F^(5/8) for F < 55 m⁴/s³
x₀ = 34 F^(2/5) otherwiseFinal rise is attained by about 3.5 x₀.
AtmosphericDispersion.buoyant_rise — Function
buoyant_rise(x, F, u, S, rise = BRIGGS_RISE; stable_wind = u)Rise in metres of a buoyant plume at downwind distance x metres: the transitional law 1.6 F^(1/3) x^(2/3) / u while the plume is still rising, and the final rise beyond. stable_wind is passed to final_buoyant_rise.
AtmosphericDispersion.combined_rise — Function
combined_rise(x, F, Fₘ, w₀, u, S, D, rise = BRIGGS_RISE; stable_wind = u)Rise in metres from the semi-empirical law combining momentum and buoyancy,
Δh = 3^(1/3) [ Fₘ x / ((1/3 + u/w₀)² u²) + F x² / (c u³) ]^(1/3)capped at the sum of the two final rises. Used where neither mechanism dominates the other. stable_wind is passed to final_buoyant_rise for the cap.
c is rise.combined_buoyancy. With Briggs' c = 2β² = 0.72 the expression reduces, as Fₘ → 0, to the two-thirds law 1.6 F^(1/3) x^(2/3) / u that buoyant_rise uses; with the 2021 value 0.5 it overshoots it by 13.6 %.
AtmosphericDispersion.final_buoyant_rise — Function
final_buoyant_rise(F, u, S, rise = BRIGGS_RISE; stable_wind = u)Final rise in metres of a buoyant plume, from the buoyancy flux F in m⁴/s³, the wind speed u in m/s at the release height, and the stability parameter S in s⁻².
The smallest of the applicable limits is taken: the neutral limit, which ambient turbulence sets and which always applies, and — only where the air is stably stratified, S > 0 — the stable and calm limits that stratification imposes.
stable_wind is the wind speed the stable limit c [F/(uS)]^(1/3) is evaluated with. The Handbook on Atmospheric Diffusion defines it as the mean of the profile over the depth of the rise, which Site supplies; see StableRiseWind. By default it is u.
AtmosphericDispersion.final_momentum_rise — Function
final_momentum_rise(Fₘ, w₀, D, u, S, rise = BRIGGS_RISE)Final rise in metres driven by the exit momentum, from the momentum flux Fₘ in m⁴/s², the exit velocity w₀ in m/s, the stack diameter D in m, the wind speed u in m/s and the stability parameter S in s⁻².
As for buoyancy, the stratification-limited branches enter only where S > 0.
AtmosphericDispersion.momentum_rise — Function
momentum_rise(x, Fₘ, w₀, D, u, S, rise = BRIGGS_RISE)Rise in metres driven by exit momentum at downwind distance x metres, taking the transitional law 1.89 (w₀² D / (u(w₀ + 3u)))^(2/3) x^(1/3) until it reaches the final rise.
AtmosphericDispersion.plume_rise — Function
plume_rise(x, source, atmosphere, u, rise = BRIGGS_RISE; stable_wind = u)Rise of the plume above the release height, in metres, at downwind distance x metres, with u the wind speed at the release height in m/s and stable_wind the wind speed of the stable final rise, by default the same; see StableRiseWind.
The dominant mechanism is chosen by comparing the two final rises: where they agree to within MECHANISM_BALANCE_TOLERANCE in relative terms neither dominates and the combined law applies, otherwise the larger mechanism carries the plume and its law is used alone. rise selects the RiseCoefficients.
Buildings
AtmosphericDispersion.CAVITY_EXTENT_FACTOR — Constant
CAVITY_EXTENT_FACTORMultiple of √A_B, the square root of the building's frontal area, that the cavity zone extends downwind of it: 2.5, IAEA SRS-19 §3.3.
AtmosphericDispersion.DEFAULT_WAKE_COEFFICIENT — Constant
DEFAULT_WAKE_COEFFICIENTCoefficient C of the wake broadening of the dispersion parameters, √(σ² + C A/π). Setting it to zero disables the building correction entirely.
One, which is what IAEA Safety Reports Series No. 19 (International Atomic Energy Agency, 2001) Eq. (6) writes as Σ_z = (σ_z² + A_B/π)^(1/2) and the German AVV zu §47 StrlSchV (Bundesregierung, 2012) Eqs. (4.31)/(4.32) as √(σ² + I_G²/π). The 2021 thesis code used 1.5, following the Romanian normative it was written against, and no source outside that normative was found for it; NRC Regulatory Guide 1.111 (U.S. Nuclear Regulatory Commission, 1977) Eq. (9) is a third convention again, applying 0.5 to the building height rather than its area.
See NSR23_WAKE_COEFFICIENT to restore the 2021 value.
AtmosphericDispersion.NSR23_WAKE_COEFFICIENT — Constant
NSR23_WAKE_COEFFICIENTThe wake coefficient of the Romanian normative the 2021 thesis followed, kept so its results can be reproduced. See DEFAULT_WAKE_COEFFICIENT.
AtmosphericDispersion.WAKE_INFLUENCE_RADII — Constant
WAKE_INFLUENCE_RADIIMultiple of a building's own height within which it is taken to influence the plume. A building further from the stack than this plays no part.
AtmosphericDispersion.Building — Type
Building(; east, north, height, frontal_area)A structure near the stack, positioned relative to it in the geographic frame.
east,north— displacement from the stack, mheight— building height above ground, mfrontal_area— cross-sectional area presented to the wind, m²
AtmosphericDispersion.BuildingEnvelope — Type
BuildingEnvelope(buildings = Building[]; wake_coefficient = DEFAULT_WAKE_COEFFICIENT)The collective effect of the buildings around a stack, reduced once to a single equivalent height and frontal area.
Buildings within WAKE_INFLUENCE_RADII of their own height from the stack contribute; the rest are ignored. Contributions are averaged with weights inversely proportional to distance, so nearer structures dominate.
The reduction is performed at construction. The 2021 code recomputed it inside the dispersion-parameter correction, which is called once per grid point per stability class, so the whole building list was rescanned for every evaluation of a field that never changes.
An empty envelope has zero equivalent height and area, which makes every building correction downstream the identity.
AtmosphericDispersion.BuildingZone — Type
BuildingZoneWhere a receptor sits relative to the building that most disturbs the flow, after IAEA Safety Reports Series No. 19 (International Atomic Energy Agency, 2001) §3.3, which bounds the three zones by the release height H, the building height H_B, its frontal area A_B and the downwind distance x:
DISPLACEMENT_ZONE—H > 2.5 H_B: the flow is deflected around the building and dispersion is undisturbed.WAKE_ZONE—H ≤ 2.5 H_Bandx > 2.5 √A_B: the disturbed wake downwind of the building, where the plume is broadened bywake_broadened.CAVITY_ZONE—H ≤ 2.5 H_Bandx ≤ 2.5 √A_B: the recirculating cavity in the lee of the building, where the Gaussian plume does not apply anddilution_cavityordilution_cavity_wallis used.
AtmosphericDispersion.building_zone — Method
building_zone(H, x, envelope)The BuildingZone of a receptor at downwind distance x metres for a plume at effective height H metres over the BuildingEnvelope. An empty envelope places every receptor in the displacement zone.
AtmosphericDispersion.distance — Method
distance(building)Horizontal distance of building from the stack, in metres.
AtmosphericDispersion.equivalent_area — Method
equivalent_area(envelope)Weighted equivalent frontal area, in m².
AtmosphericDispersion.equivalent_height — Method
equivalent_height(envelope)Weighted equivalent building height, in metres. Zero when no building is close enough to influence the plume.
AtmosphericDispersion.wake_broadened — Method
wake_broadened(σ, H, envelope)Dispersion parameter in metres, broadened by the building wake.
A plume released well above the buildings — higher than 2.5 × equivalent_height — is unaffected. One released below their tops is fully mixed into the wake and takes the broadened value √(σ² + C A / π). Between the two the correction is interpolated linearly in release height.
With an empty envelope this is the identity, since every release height clears a ceiling of zero.
Site
AtmosphericDispersion.STABLE_RISE_MAX_ITERATIONS — Constant
STABLE_RISE_MAX_ITERATIONSIterations stable_rise_wind_speed allows the rise and its mean wind to converge in before it gives up. The map contracts strongly — the rise varies as the inverse cube root of the wind — and a handful suffice.
AtmosphericDispersion.STABLE_RISE_TOLERANCE — Constant
STABLE_RISE_TOLERANCERelative change of the stable final rise between two iterations below which stable_rise_wind_speed takes the rise and its mean wind as solved.
AtmosphericDispersion.WAKE_WIND_THRESHOLD — Constant
WAKE_WIND_THRESHOLDWind speed in m/s below which a plume clearing the buildings is taken to escape their wake rather than be drawn down into it.
AtmosphericDispersion.AbstractSite — Type
AbstractSiteWhat the dilution, depletion and deposition functions ask of a release: its effective_height, transport_wind_speed, corrected_lateral_dispersion, corrected_vertical_dispersion and mixing_layer. Site derives them from a stack and its surroundings; PrescribedPlume takes them as given.
AtmosphericDispersion.PrescribedPlume — Type
PrescribedPlume(site; height = nothing, wind = nothing,
lateral = nothing, vertical = nothing)The plume over site with some of its parameters stated rather than derived: the effective height in metres, the transport wind speed in m/s, and the lateral and vertical dispersion parameters in metres. Whatever is left as nothing comes from site as usual, and so does the mixing layer.
Published benchmarks are posed this way. Turner's worked problems give H, u and the two σ read off his figures; the HPA-RPD-058 depletion tables give H and the wind speed at it. Those numbers are the inputs of the problem, and reproducing it means taking them as such rather than finding a stack and a roughness class that happen to return them.
A prescribed vertical is a statement about one distance, so depletion_integral, which needs σ_z along the whole path, rejects it.
AtmosphericDispersion.Site — Type
Site(; source, atmosphere, buildings = BuildingEnvelope(), rise = BRIGGS_RISE,
mixing = MIXING_TABULATED, dispersion = DISPERSION_HOSKER,
stable_rise_wind = WIND_MEAN_OVER_RISE)A stack in its surroundings: everything a dispersion calculation needs that does not vary over the receptor grid.
dispersion selects the DispersionScheme the site's parameters are evaluated with, and stable_rise_wind the StableRiseWind of its stable final rise.
The release height, the buoyancy and momentum fluxes and the stability parameter are all independent of receptor position and of stability class, so they are computed once here. The 2021 code recomputed them inside the innermost loop — the building reduction and the downwash correction, the latter six wind-profile evaluations deep, were repeated for every point of every field.
AtmosphericDispersion.corrected_lateral_dispersion — Method
corrected_lateral_dispersion(x, site, class; release_duration = SHORT_RELEASE_REFERENCE)Lateral dispersion parameter in metres of the site's DispersionScheme, broadened by the building wake.
AtmosphericDispersion.corrected_vertical_dispersion — Method
corrected_vertical_dispersion(x, site, class)Vertical dispersion parameter in metres of the site's DispersionScheme, broadened by the building wake.
AtmosphericDispersion.dispersion_scheme — Method
dispersion_scheme(site)The DispersionScheme the site's parameters are evaluated with.
AtmosphericDispersion.downwash_height — Method
downwash_height(source, atmosphere)Stack height in metres corrected for aerodynamic downwash at the stack itself.
Where the efflux velocity fails to clear about one and a half times the wind speed, the plume is drawn into the lee of the stack and the effective release height drops by 2 (1.5 − w₀/u) D.
AtmosphericDispersion.effective_height — Method
effective_height(x, site, class)Effective release height in metres at downwind distance x metres: the release height after downwash and building wake, plus the plume rise attained by that distance.
AtmosphericDispersion.mean_wind_speed — Method
mean_wind_speed(atmosphere, z)Wind speed at height z metres averaged over the six Pasquill classes.
The stack-downwash and building-wake corrections are geometric: they ask whether the efflux can overcome the wind at the stack top at all, not what the stratification is doing. They therefore take this class-averaged speed rather than a class-specific one.
AtmosphericDispersion.mixing_layer — Method
mixing_layer(site)The MixingLayer over the site.
AtmosphericDispersion.plume_rise — Method
plume_rise(x, site, class)Rise of the plume above its release height, in metres, at downwind distance x metres, using the transport wind of the given stability class, and for the stable final rise the wind of stable_rise_wind_speed.
AtmosphericDispersion.release_height — Method
release_height(site)Height in metres at which the plume is released, after downwash and building wake but before plume rise. Zero where the plume is trapped in a building cavity.
AtmosphericDispersion.stable_rise_wind_speed — Method
stable_rise_wind_speed(site, class)The wind speed in m/s that the stable final rise of site is evaluated with in the given stability class.
Under WIND_MEAN_OVER_RISE it is the mean of the wind profile between the release height and the top of the stable rise, Δh = c [F/(ūS)]^(1/3), which depends on that mean in turn: the two are solved together by iterating from the rise at the release-height wind, each pass averaging the profile over the current rise and re-evaluating it, until the rise settles to STABLE_RISE_TOLERANCE. The profile has no skill below the height its reference is quoted at, so the layer starts at REFERENCE_HEIGHT where the release is lower, as transport_wind_speed is floored.
Under WIND_AT_RELEASE_HEIGHT, or where there is no stable rise to average over — unstable or neutral air, or a plume without buoyancy — it is the transport wind.
AtmosphericDispersion.transport_wind_speed — Method
transport_wind_speed(site, class)Wind speed in m/s carrying the plume, evaluated at the release height.
The power-law profile has no skill below the height its reference is quoted at, and returns zero at the ground, so the evaluation height is floored at REFERENCE_HEIGHT. Without that floor a plume trapped in a building cavity — release height zero — would be transported at zero wind speed, and every dilution factor divides by it.
AtmosphericDispersion.wake_height — Method
wake_height(source, atmosphere, envelope)Release height in metres after both the stack downwash and entrainment into the aerodynamic cavity of nearby buildings.
A plume leaving below the building tops is taken into the cavity and released at ground level. One clearing two and a half times the building height escapes untouched, as does one in wind below WAKE_WIND_THRESHOLD, too weak to drive the entrainment. Between those the release height is reduced by 1.5 H_b − 0.6 H₁.