|
10 | 10 | module AerosolActivation |
11 | 11 |
|
12 | 12 | import SpecialFunctions as SF |
| 13 | +import UnrolledUtilities as UU |
13 | 14 |
|
14 | 15 | import ..ThermodynamicsInterface as TDI |
15 | 16 | import ..Common as CO |
@@ -251,7 +252,7 @@ function N_activated_per_mode( |
251 | 252 | return ntuple(Val(AM.n_modes(ad))) do i |
252 | 253 |
|
253 | 254 | mode_i = ad.modes[i] |
254 | | - u_i::FT = 2 * log(sm[i] / smax) / 3 / sqrt(2) / log(mode_i.stdev) |
| 255 | + u_i = 2 * log(sm[i] / smax) / 3 / sqrt(FT(2)) / log(mode_i.stdev) |
255 | 256 |
|
256 | 257 | mode_i.N * FT(0.5) * (1 - SF.erf(u_i)) |
257 | 258 | end |
@@ -308,18 +309,14 @@ function M_activated_per_mode( |
308 | 309 | sm = critical_supersaturation(ap, ad, T) |
309 | 310 |
|
310 | 311 | return ntuple(Val(AM.n_modes(ad))) do i |
311 | | - |
312 | 312 | mode_i = ad.modes[i] |
| 313 | + Mᵢ = UU.unrolled_sum(mode_i.molar_mass .* mode_i.mass_mix_ratio) |
| 314 | + σᵢ = mode_i.stdev |
| 315 | + fac = 3log(σᵢ) * √(FT(2)) / 2 # 3√2/2 log(σᵢ), shared factor in `erf` |
| 316 | + u_i = log(sm[i] / smax) / fac |
313 | 317 |
|
314 | | - avg_molar_mass_i = FT(0) |
315 | | - @inbounds for j in 1:(AM.n_components(mode_i)) |
316 | | - avg_molar_mass_i += mode_i.molar_mass[j] * mode_i.mass_mix_ratio[j] |
317 | | - end |
318 | | - |
319 | | - u_i = 2 * log(sm[i] / smax) / 3 / sqrt(2) / log(mode_i.stdev) |
320 | | - |
321 | | - avg_molar_mass_i * 1 / 2 * |
322 | | - (1 - SF.erf(u_i - 3 * sqrt(2) / 2 * log(mode_i.stdev))) |
| 318 | + # erfc(x) ≡ 1 - erf(x), but more accurate for large x |
| 319 | + Mᵢ / 2 * SF.erfc(u_i - fac) |
323 | 320 | end |
324 | 321 | end |
325 | 322 | function M_activated_per_mode( |
|
0 commit comments