@@ -12,6 +12,11 @@ function limit(q, dt, n::Int)
12
12
return q / dt / n
13
13
end
14
14
15
+ # the triangle inequality limiter used in ClimaAtmos
16
+ function triangle_inequality_limiter (force, limit)
17
+ return force + limit - sqrt (force^ 2 + limit^ 2 )
18
+ end
19
+
15
20
function aerosol_activation (:: Empty , state)
16
21
FT = eltype (state)
17
22
return FT (0 )
@@ -249,23 +254,28 @@ end
249
254
function condensation (params:: NonEqCondParams , PSD, state, ρ_air)
250
255
FT = eltype (state)
251
256
(; T, qₗ, qᵥ, qᵢ) = state
252
- (; tps, liquid, dt) = params
253
257
254
- if qᵥ + qₗ > FT ( 0 )
258
+ (; tps, liquid, limiter, dt) = params
255
259
256
- qₜ = qᵥ + qₗ + qᵢ
260
+ qₜ = qᵥ + qₗ + qᵢ
257
261
258
- cond_rate = MNE. conv_q_vap_to_q_liq_ice_MM2015 (liquid, tps, qₜ, qₗ, qᵢ, FT (0 ), FT (0 ), ρ_air, T)
262
+ cond_rate = MNE. conv_q_vap_to_q_liq_ice_MM2015 (liquid, tps, qₜ, qₗ, qᵢ, FT (0 ), FT (0 ), ρ_air, T)
259
263
260
- # Using same limiter as ClimaAtmos for now
264
+ # Using same limiter as ClimaAtmos
265
+ if limiter
261
266
# Not sure why, but without intermediate storing of the tendencies for the
262
267
# if/else branch this code segfaults on julia v1.11 (works fine on v1.10)
268
+
263
269
cond_limit = min (cond_rate, limit (qᵥ, dt, 1 ))
264
270
evap_limit = min (abs (cond_rate), limit (qₗ, dt, 1 ))
265
- ret = ifelse (cond_rate > FT (0 ), cond_limit, - 1 * evap_limit)
266
- return ret
271
+
272
+ return ifelse (
273
+ cond_rate > FT (0 ),
274
+ triangle_inequality_limiter (cond_rate, cond_limit),
275
+ - triangle_inequality_limiter (abs (cond_rate), evap_limit),
276
+ )
267
277
else
268
- return FT ( 0 )
278
+ return cond_rate
269
279
end
270
280
end
271
281
@@ -307,21 +317,24 @@ function deposition(params::NonEqDepParams, PSD, state, ρ_air)
307
317
FT = eltype (state)
308
318
(; T, qₗ, qᵥ, qᵢ) = state
309
319
310
- (; tps, ice, dt) = params
320
+ (; tps, ice, limiter, dt) = params
311
321
312
- if qᵥ + qᵢ > FT (0 )
313
- qₜ = qᵥ + qₗ + qᵢ
322
+ qₜ = qᵥ + qₗ + qᵢ
314
323
315
- dep_rate = MNE. conv_q_vap_to_q_liq_ice_MM2015 (ice, tps, qₜ, qₗ, qᵢ, FT (0 ), FT (0 ), ρ_air, T)
324
+ dep_rate = MNE. conv_q_vap_to_q_liq_ice_MM2015 (ice, tps, qₜ, qₗ, qᵢ, FT (0 ), FT (0 ), ρ_air, T)
316
325
317
- # Using same limiter as ClimaAtmos for now
326
+ # using same limiter as ClimaAtmos for now
327
+ if limiter
318
328
# Not sure why, but without intermediate storing of the tendencies for the
319
329
# if/else branch this code segfaults on julia v1.11 (works fine on v1.10)
320
330
dep_limit = min (dep_rate, limit (qᵥ, dt, 1 ))
321
331
sub_limit = min (abs (dep_rate), limit (qᵢ, dt, 1 ))
322
- ret = ifelse (dep_rate > FT (0 ), dep_limit, - 1 * sub_limit)
323
- return ret
332
+ return ifelse (
333
+ dep_rate > FT (0 ),
334
+ triangle_inequality_limiter (dep_rate, dep_limit),
335
+ - triangle_inequality_limiter (abs (dep_rate), sub_limit),
336
+ )
324
337
else
325
- return FT ( 0 )
338
+ return dep_rate
326
339
end
327
340
end
0 commit comments