# Martin (1976) coefficients: sigma_y = a x^0.894, sigma_z = c x^d + f, with x in km
stability_coefs = Dict(
"B" => (; a=156, c_near=106.6, d_near=1.149, f_near=3.3, c_far=108.2, d_far=1.098, f_far=2),
"D" => (; a=68, c_near=33.2, d_near=0.725, f_near=-1.7, c_far=44.5, d_far=0.516, f_far=-13),
"F" => (; a=34, c_near=14.35, d_near=0.740, f_near=-0.35, c_far=62.6, d_far=0.180, f_far=-48.6))
# Ground-level centreline concentration [µg/m³] under a given stability class
function centreline_class(xk, coef, params)
if xk <= 0.05
return 0.0
end
sy = coef.a * xk^0.894
if xk < 1
sz = coef.c_near * xk^coef.d_near + coef.f_near
else
sz = coef.c_far * xk^coef.d_far + coef.f_far
end
return params.Q / (π * params.u_wind * sy * sz) * exp(-params.H^2 / (2sz^2)) * 1e6
end
class_names = ["B", "D", "F"]
class_labels = ["B (sunny afternoon)", "D (overcast)", "F (clear night)"]
class_colours = [cb_orange, cb_purple, cb_blue]
class_styles = [:solid, :dash, :dot]
near_positions = 0.05:0.005:10 # [km]
class_peaks = zeros(length(class_names))
class_peak_distances = zeros(length(class_names))
p_class = plot(xlabel="Distance downwind [km]", ylabel="C [µg/m³]", legend=:topright)
for i in 1:length(class_names)
c = [centreline_class(x, stability_coefs[class_names[i]], plume_params) for x in near_positions]
class_peaks[i], j = findmax(c)
class_peak_distances[i] = near_positions[j]
plot!(p_class, near_positions, c, color=class_colours[i], linestyle=class_styles[i],
label=class_labels[i])
end
hline!(p_class, [standard], color=:black, linestyle=:dashdot, linewidth=2, label="1-hour SO₂ standard, $(standard) µg/m³")
plot!(p_class, size=(1200, 450), left_margin=12mm, right_margin=8mm,
bottom_margin=12mm, top_margin=5mm)