Skip to content

Commit 16b68ea

Browse files
authored
Merge pull request #74 from aefarrell/mixing-layer-bug-fixes
Adding relative tolerance to mixing layer models
2 parents 4f7a6da + c3e5cf2 commit 16b68ea

1 file changed

Lines changed: 23 additions & 6 deletions

File tree

src/models/gaussian_mixing_layer.jl

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ struct GaussianMixingLayer <: PlumeModel end
44
# mixing layer vertical term -- method of images
55
struct SimpleMixingLayer{N<:Integer,F<:Number} <: GaussianVerticalTerm
66
nterms::N
7+
rtol::F
78
mixing_height::F
89
end
910

@@ -16,7 +17,7 @@ function vertical_term(z, h, σz, ml::SimpleMixingLayer)
1617
H₄ = z + (2*i*ml.mixing_height + h)
1718
next_term = exp(-0.5*(H₁/σz)^2) + exp(-0.5*(H₂/σz)^2) + exp(-0.5*(H₃/σz)^2) + exp(-0.5*(H₄/σz)^2)
1819
Fz += next_term
19-
if next_term 0
20+
if isapprox(next_term,0;rtol=ml.rtol)
2021
break
2122
end
2223
end
@@ -26,6 +27,7 @@ end
2627
# mixing layer vertical term -- periodic
2728
struct PeriodicMixingLayer{N<:Integer,F<:Number} <: GaussianVerticalTerm
2829
nterms::N
30+
rtol::F
2931
mixing_height::F
3032
end
3133

@@ -34,7 +36,7 @@ function vertical_term(z, h, σz, ml::PeriodicMixingLayer)
3436
for n=1:ml.nterms
3537
next_term = cos(n*π*z/ml.mixing_height)*cos(n*π*h/ml.mixing_height)*exp(-0.5*(n*π*σz/ml.mixing_height)^2)
3638
Fz += next_term
37-
if next_term 0
39+
if isapprox(next_term,0;rtol=ml.rtol)
3840
break
3941
end
4042
end
@@ -61,6 +63,7 @@ There are two methods for the mixing layer:
6163
- `h_min=1.0`: Minimum height for windspeed calculations.
6264
- `method=:simplemixinglayer`: The method used for the mixing layer.
6365
- `n_terms=10`: Number terms in the series calculation of $ F_z $.
66+
- `rtol=√eps` : The relative tolerance for the series calculation of $ F_z $.
6467
- `mixing_limit=10_000.0`: Limit for the mixing height, in meters. Mixing heights above this are treated as infinite.
6568
6669
# References
@@ -73,7 +76,9 @@ function plume(scenario::Scenario, ::GaussianMixingLayer, eqs=DefaultSet;
7376
method=:simplemixinglayer,
7477
h_min=1.0,
7578
n_terms=10,
79+
rtol=nothing,
7680
mixing_limit=10_000.0)
81+
7782
# parameters of the jet
7883
hᵣ = _release_height(scenario)
7984
m = _mass_rate(scenario)
@@ -94,15 +99,20 @@ function plume(scenario::Scenario, ::GaussianMixingLayer, eqs=DefaultSet;
9499
c_max = m/Qᵒ
95100
c_max = c_max/ρₐ
96101

102+
# series tolerance
103+
if isnothing(rtol)
104+
rtol = ( eps(m) )
105+
end
106+
97107
# mixing layer
98108
if hₘ > mixing_limit
99109
# infinite mixing height
100110
@warn "Mixing height $hₘ exceeds limit $mixing_limit, using infinite mixing height."
101111
ml = SimpleVerticalTerm()
102112
elseif method == :simplemixinglayer
103-
ml = SimpleMixingLayer(n_terms, hₘ)
113+
ml = SimpleMixingLayer(n_terms, rtol, hₘ)
104114
elseif method == :periodicmixinglayer
105-
ml = PeriodicMixingLayer(n_terms, hₘ)
115+
ml = PeriodicMixingLayer(n_terms, rtol, hₘ)
106116
else
107117
error("Unknown mixing layer method: $method")
108118
end
@@ -146,6 +156,7 @@ There are two methods for the mixing layer:
146156
- `h_min=1.0`: Minimum height, in meters, for windspeed calculations.
147157
- `method=:simplemixinglayer`: The method used for the mixing layer.
148158
- `n_terms=10`: Number terms in the series calculation of $ F_z $.
159+
- `rtol=√eps` : The relative tolerance for the series calculation of $ F_z $.
149160
- `mixing_limit=10_000.0`: Limit for the mixing height, in meters. Mixing heights above this are treated as infinite.
150161
151162
# References
@@ -161,6 +172,7 @@ function plume(scenario::Scenario{<:AbstractSubstance,<:VerticalJet,<:Atmosphere
161172
method=:simplemixinglayer,
162173
h_min=1.0,
163174
n_terms=10,
175+
rtol=nothing,
164176
mixing_limit=10_000.0)
165177
# parameters of the jet
166178
Dⱼ = _release_diameter(scenario)
@@ -210,15 +222,20 @@ function plume(scenario::Scenario{<:AbstractSubstance,<:VerticalJet,<:Atmosphere
210222
plume = NoPlumeRise()
211223
end
212224

225+
# series tolerance
226+
if isnothing(rtol)
227+
rtol = ( eps(m) )
228+
end
229+
213230
# mixing layer
214231
if hₘ > mixing_limit
215232
# infinite mixing height
216233
@warn "Mixing height $hₘ exceeds limit $mixing_limit, using infinite mixing height."
217234
ml = SimpleVerticalTerm()
218235
elseif method == :simplemixinglayer
219-
ml = SimpleMixingLayer(n_terms, hₘ)
236+
ml = SimpleMixingLayer(n_terms, rtol, hₘ)
220237
elseif method == :periodicmixinglayer
221-
ml = PeriodicMixingLayer(n_terms, hₘ)
238+
ml = PeriodicMixingLayer(n_terms, rtol, hₘ)
222239
else
223240
error("Unknown mixing layer method: $method")
224241
end

0 commit comments

Comments
 (0)