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.PrecipitationType — Type
PrecipitationType

Form of precipitation scavenging the plume. Rain removes airborne material between two and three orders of magnitude faster than snow at the same intensity.

source
AtmosphericDispersion.RoughnessClass — Type
RoughnessClass

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

source
AtmosphericDispersion.WindProfileSurface — Type
WindProfileSurface

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

source

Tabulated coefficients

AtmosphericDispersion.DispersionScheme — Type
DispersionScheme

Which published set of dispersion parameters a Site evaluates.

Every scheme states a range of downwind distance it was fitted over; validity_range returns it.

source
AtmosphericDispersion.WashoutCoefficients — Type
WashoutCoefficients

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

source
AtmosphericDispersion.WashoutModel — Type
WashoutModel

Which 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/h

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

source
AtmosphericDispersion.WashoutSpecies — Type
WashoutSpecies

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

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

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

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

source

The mixing layer

AtmosphericDispersion.LidRule — Type
LidRule

What 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 as min(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 in H, 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.
source
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)
source
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.

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

source

Wind profile and dispersion parameters

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.

source
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".

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

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

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

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

source
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₂))).

source
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_COUNTRY and DISPERSION_BRIGGS_URBAN give (100, 10_000).
  • DISPERSION_HOSKER pairs Briggs' σ_y with 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.

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

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

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

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

source

Source and ambient state

AtmosphericDispersion.DRY_AIR_SPECIFIC_HEAT — Constant
DRY_AIR_SPECIFIC_HEAT

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

source
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 at REFERENCE_HEIGHT, m/s
  • temperature — ambient air temperature, K
  • density — ambient air density, kg/m³
  • lapse_rate — vertical temperature gradient dT/dz, K/m, positive for an inversion
  • surface — WindProfileSurface driving the wind profile exponent
  • roughness — RoughnessClass driving the vertical dispersion
  • specific_heat — isobaric specific heat of the ambient air, J/(kg·K)
Lapse rate and stability class are not independent

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.

source
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, m
  • diameter — inner diameter at the stack exit, m
  • exit_velocity — vertical gas velocity at the exit, m/s
  • exit_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.

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

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

source

Plume rise

AtmosphericDispersion.RiseCoefficients — Type
RiseCoefficients

The 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 writes 3F 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] with p in 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.

source
AtmosphericDispersion.StableRiseWind — Type
StableRiseWind

Which 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 the u of 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; see stable_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.

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

Final rise is attained by about 3.5 x₀.

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

source
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 %.

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

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

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

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

source

Buildings

AtmosphericDispersion.DEFAULT_WAKE_COEFFICIENT — Constant
DEFAULT_WAKE_COEFFICIENT

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

source
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, m
  • height — building height above ground, m
  • frontal_area — cross-sectional area presented to the wind, m²
source
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.

source
AtmosphericDispersion.BuildingZone — Type
BuildingZone

Where 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_B and x > 2.5 √A_B: the disturbed wake downwind of the building, where the plume is broadened by wake_broadened.
  • CAVITY_ZONE — H ≤ 2.5 H_B and x ≤ 2.5 √A_B: the recirculating cavity in the lee of the building, where the Gaussian plume does not apply and dilution_cavity or dilution_cavity_wall is used.
source
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.

source

Site

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.

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

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

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

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

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

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

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

source
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₁.

source