@@ -4,6 +4,7 @@ struct GaussianMixingLayer <: PlumeModel end
44# mixing layer vertical term -- method of images
55struct SimpleMixingLayer{N<: Integer ,F<: Number } <: GaussianVerticalTerm
66 nterms:: N
7+ rtol:: F
78 mixing_height:: F
89end
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
2627# mixing layer vertical term -- periodic
2728struct PeriodicMixingLayer{N<: Integer ,F<: Number } <: GaussianVerticalTerm
2829 nterms:: N
30+ rtol:: F
2931 mixing_height:: F
3032end
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