Skip to content

Commit 7ed9553

Browse files
authored
Merge pull request #596 from CliMA/he/feat/p3-collisions-sub-parameterizations
add supporting P3 collisions sub-parameterizations
2 parents 87618d5 + 155a2d1 commit 7ed9553

File tree

11 files changed

+340
-64
lines changed

11 files changed

+340
-64
lines changed

docs/bibliography.bib

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,19 @@ @article{Choletteetal2019
141141
pages= {561--582}
142142
}
143143

144+
145+
@article{CoberList1993,
146+
title = {Measurements of the Heat and Mass Transfer Parameters Characterizing Conical Graupel Growth},
147+
volume = {50},
148+
doi = {10.1175/1520-0469(1993)050<1591:MOTHAM>2.0.CO;2},
149+
pages = {1591--1609},
150+
number = {11},
151+
journal = {Journal of the Atmospheric Sciences},
152+
author = {Cober, Stewart G. and List, Roland},
153+
year = {1993},
154+
}
155+
156+
144157
@article{Desai2019,
145158
title = {Aerosol-Mediated Glaciation of Mixed-Phase Clouds: Steady-State Laboratory Measurements},
146159
author = {Desai, Neel and Chandrakar, KK and Kinney, G and Cantrell, W and Shaw, RA},
@@ -549,6 +562,19 @@ @article{Murray2012
549562
doi = {10.1039/C2CS35200A}
550563
}
551564

565+
566+
@article{Musil1970,
567+
title = {Computer Modeling of Hailstone Growth in Feeder Clouds},
568+
volume = {27},
569+
doi = {10.1175/1520-0469(1970)027<0474:CMOHGI>2.0.CO;2},
570+
pages = {474--482},
571+
number = {3},
572+
journal = {Journal of the Atmospheric Sciences},
573+
author = {Musil, Dennis J.},
574+
year = {1970},
575+
}
576+
577+
552578
@article{Ogura1971,
553579
title = {Numerical simulation of the life cycle of a thunderstorm cell},
554580
author = {Ogura, Yoshimitsu and Takahashi, Tsutomu},

docs/src/API.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ CMP.SlopeLaw
109109
CMP.SlopePowerLaw{Float64}
110110
CMP.SlopeConstant{Float64}
111111
CMP.VentilationFactor
112+
CMP.LocalRimeDensity
112113
```
113114

114115
## Obtain particle state
@@ -167,10 +168,27 @@ P3Scheme.D_m
167168
P3Scheme.ice_particle_terminal_velocity
168169
P3Scheme.ice_terminal_velocity_number_weighted
169170
P3Scheme.ice_terminal_velocity_mass_weighted
171+
```
172+
173+
### Processes
174+
175+
#### Heterogeneous ice nucleation
176+
```@docs
170177
P3Scheme.het_ice_nucleation
178+
```
179+
180+
#### Ice melting
181+
```@docs
171182
P3Scheme.ice_melt
172183
```
173184

185+
#### Collisions with liquid droplets
186+
Supporting methods:
187+
```@docs
188+
P3Scheme.compute_max_freeze_rate
189+
P3Scheme.compute_local_rime_density
190+
```
191+
174192
### Supporting integral methods
175193

176194
```@docs

docs/src/plots/P3Melting.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,26 @@ Fᵣ1 = FT(0.8)
3333
ρᵣ1 = FT(800)
3434
state = P3.get_state(params; F_rim = Fᵣ1, ρ_rim = ρᵣ1, L_ice = Lᵢ, N_ice = Nᵢ)
3535
logλ = P3.get_distribution_logλ(state)
36-
dLdt1 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt).dLdt for ΔT in ΔT_range]
37-
dNdt1 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt).dNdt for ΔT in ΔT_range]
36+
dLdt1 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt, state, logλ).dLdt for ΔT in ΔT_range]
37+
dNdt1 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt, state, logλ).dNdt for ΔT in ΔT_range]
3838

3939
Fᵣ2 = FT(0.2)
4040
state = P3.get_state(params; F_rim = Fᵣ2, ρ_rim = ρᵣ1, L_ice = Lᵢ, N_ice = Nᵢ)
4141
logλ = P3.get_distribution_logλ(state)
42-
dLdt2 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt).dLdt for ΔT in ΔT_range]
43-
dNdt2 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt).dNdt for ΔT in ΔT_range]
42+
dLdt2 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt, state, logλ).dLdt for ΔT in ΔT_range]
43+
dNdt2 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt, state, logλ).dNdt for ΔT in ΔT_range]
4444

4545
ρᵣ2 = FT(200)
4646
state = P3.get_state(params; F_rim = Fᵣ2, ρ_rim = ρᵣ2, L_ice = Lᵢ, N_ice = Nᵢ)
4747
logλ = P3.get_distribution_logλ(state)
48-
dLdt3 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt).dLdt for ΔT in ΔT_range]
49-
dNdt3 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt).dNdt for ΔT in ΔT_range]
48+
dLdt3 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt, state, logλ).dLdt for ΔT in ΔT_range]
49+
dNdt3 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ1, dt, state, logλ).dNdt for ΔT in ΔT_range]
5050

5151
ρₐ2 = FT(0.5)
5252
state = P3.get_state(params; F_rim = Fᵣ2, ρ_rim = ρᵣ2, L_ice = Lᵢ, N_ice = Nᵢ)
5353
logλ = P3.get_distribution_logλ(state)
54-
dLdt4 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ2, dt).dLdt for ΔT in ΔT_range]
55-
dNdt4 = [P3.ice_melt(state, logλ, vel, aps, tps, params.T_freeze .+ ΔT, ρₐ2, dt).dNdt for ΔT in ΔT_range]
54+
dLdt4 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ2, dt, state, logλ).dLdt for ΔT in ΔT_range]
55+
dNdt4 = [P3.ice_melt(vel, aps, tps, params.T_freeze .+ ΔT, ρₐ2, dt, state, logλ).dNdt for ΔT in ΔT_range]
5656

5757
# plotting
5858
fig = Makie.Figure(size = (1500, 500), fontsize=22, linewidth=3)

docs/src/plots/P3TerminalVelocityPlots.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ function get_values(
3232
ρ_rim = ρ_rims[j]
3333
state = P3.get_state(params; F_rim, ρ_rim, L_ice = L, N_ice = N)
3434
logλ = P3.get_distribution_logλ(state)
35-
V_m[i, j] = P3.ice_terminal_velocity_mass_weighted(state, logλ, Chen2022, ρ_a; use_aspect_ratio = false)
36-
V_m_ϕ[i, j] = P3.ice_terminal_velocity_mass_weighted(state, logλ, Chen2022, ρ_a; use_aspect_ratio = true)
35+
V_m[i, j] = P3.ice_terminal_velocity_mass_weighted(Chen2022, ρ_a, state, logλ; use_aspect_ratio = false)
36+
V_m_ϕ[i, j] = P3.ice_terminal_velocity_mass_weighted(Chen2022, ρ_a, state, logλ; use_aspect_ratio = true)
3737
D_m[i, j] = P3.D_m(state, logλ)
3838
D_m_regimes[i, j] = D_m[i, j]
3939
ϕᵢ[i, j] = P3.ϕᵢ(state, D_m[i, j])

src/Common.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -383,14 +383,15 @@ The ventilation factor parameterizes the increase in the mass and heat exchange
383383
# Returns
384384
- `F_v(D)`: The ventilation factor as a function of diameter, `D`
385385
386-
See e.g. [SeifertBeheng2006](@cite) Eq. (24) for the definition of the ventilation factor.
386+
See e.g. [SeifertBeheng2006](@cite) Eq. (24), or [`CMP.VentilationFactor`](@ref),
387+
for the definition of the ventilation factor.
387388
"""
388389
function ventilation_factor(vent, aps, v_term)
389-
(; vent_a, vent_b) = vent
390+
(; aᵥ, bᵥ) = vent
390391
(; ν_air, D_vapor) = aps
391392
N_sc = ν_air / D_vapor # Schmidt number
392393
N_Re(D) = D * v_term(D) / ν_air # Reynolds number
393-
F_v(D) = vent_a + vent_b * (N_sc) * (N_Re(D)) # Ventilation factor
394+
F_v(D) = aᵥ + bᵥ * (N_sc) * (N_Re(D)) # Ventilation factor
394395
return F_v
395396
end
396397

src/P3_processes.jl

Lines changed: 109 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,25 @@ function het_ice_nucleation(
4747
end
4848

4949
"""
50-
ice_melt(state, logλ, Chen2022, aps, tps, Tₐ, ρₐ, dt; ∫kwargs...)
50+
ice_melt(velocity_params::CMP.Chen2022VelType, aps, tps, Tₐ, ρₐ, dt, state, logλ; ∫kwargs...)
5151
5252
# Arguments
53-
- `state`: a [`P3State`](@ref) object
54-
- `logλ`: the log of the slope parameter [log(1/m)]
55-
- `Chen2022`: struct containing Chen 2022 velocity parameters
56-
- `aps`: air properties
53+
- `velocity_params`: [`CMP.Chen2022VelType`](@ref)
54+
- `aps`: [`CMP.AirProperties`](@ref)
5755
- `tps`: thermodynamics parameters
5856
- `Tₐ`: temperature (K)
5957
- `ρₐ`: air density
6058
- `dt`: model time step (for limiting the tendnecy)
59+
- `state`: a [`P3State`](@ref) object
60+
- `logλ`: the log of the slope parameter [log(1/m)]
6161
6262
# Keyword arguments
6363
- `∫kwargs`: Named tuple of keyword arguments passed to [`∫fdD`](@ref)
6464
6565
Returns the melting rate of ice (QIMLT in Morrison and Mildbrandt (2015)).
6666
"""
6767
function ice_melt(
68-
state::P3State, logλ, Chen2022::CMP.Chen2022VelType,
69-
aps::CMP.AirProperties, tps::TDI.PS,
70-
Tₐ, ρₐ, dt;
68+
velocity_params::CMP.Chen2022VelType, aps::CMP.AirProperties, tps::TDI.PS, Tₐ, ρₐ, dt, state::P3State, logλ;
7169
∫kwargs = (;),
7270
)
7371
# Note: process not dependent on `F_liq`
@@ -79,7 +77,7 @@ function ice_melt(
7977
(; L_ice, N_ice) = state
8078
(; T_freeze, vent) = state.params
8179

82-
v_term = ice_particle_terminal_velocity(state, Chen2022, ρₐ)
80+
v_term = ice_particle_terminal_velocity(velocity_params, ρₐ, state)
8381
F_v = CO.ventilation_factor(vent, aps, v_term)
8482
N′ = size_distribution(state, logλ)
8583

@@ -99,3 +97,105 @@ function ice_melt(
9997
dLdt = min(dLdt, L_ice / dt)
10098
return (; dNdt, dLdt)
10199
end
100+
101+
"""
102+
compute_max_freeze_rate(aps, tps, velocity_params, ρₐ, Tₐ, state)
103+
104+
Returns a function `max_freeze_rate(Dᵢ)` that returns the maximum possible freezing rate [kg/s]
105+
for an ice particle of diameter `Dᵢ` [m]. Evaluates to `0` if `T ≥ T_freeze`.
106+
107+
# Arguments
108+
- `aps`: [`CMP.AirProperties`](@ref)
109+
- `tps`: `TDP.ThermodynamicsParameters`
110+
- `velocity_params`: velocity parameterization, e.g. [`CMP.Chen2022VelType`](@ref)
111+
- `ρₐ`: air density [kg/m³]
112+
- `Tₐ`: air temperature [K]
113+
- `state`: [`P3State`](@ref)
114+
115+
This rate represents the thermodynamic upper limit to collisional freezing,
116+
which occurs when the heat transfer from the ice particle to the environment is
117+
balanced by the latent heat of fusion.
118+
119+
From Eq (A7) in Musil (1970), [Musil1970](@cite).
120+
"""
121+
function compute_max_freeze_rate(aps, tps, velocity_params, ρₐ, Tₐ, state)
122+
(; D_vapor, K_therm) = aps
123+
cp_l = TDI.TD.Parameters.cp_l(tps)
124+
T_frz = TDI.TD.Parameters.T_freeze(tps)
125+
Lᵥ = TDI.Lᵥ(tps, Tₐ)
126+
L_f = TDI.Lf(tps, Tₐ)
127+
Tₛ = T_frz # the surface of the ice particle is assumed to be at the freezing temperature
128+
ΔT = Tₛ - Tₐ # temperature difference between the surface of the ice particle and the air
129+
Δρᵥ_sat =
130+
ρₐ * ( # saturation vapor density difference between the surface of the ice particle and the air
131+
TDI.p2q(tps, Tₛ, ρₐ, TDI.saturation_vapor_pressure_over_ice(tps, Tₛ)) -
132+
TDI.p2q(tps, Tₐ, ρₐ, TDI.saturation_vapor_pressure_over_ice(tps, Tₐ))
133+
)
134+
v_term = ice_particle_terminal_velocity(velocity_params, ρₐ, state)
135+
F_v = CO.ventilation_factor(state.params.vent, aps, v_term)
136+
function max_freeze_rate(Dᵢ)
137+
Tₐ T_frz && return zero(Dᵢ) # No collisional freezing above the freezing temperature
138+
return 2 ** Dᵢ) * F_v(Dᵢ) * (K_therm * ΔT + Lᵥ * D_vapor * Δρᵥ_sat) / (L_f - cp_l * ΔT)
139+
end
140+
return max_freeze_rate
141+
end
142+
143+
"""
144+
compute_local_rime_density(velocity_params, ρₐ, T, state)
145+
146+
Provides a function `ρ′_rim(Dᵢ, Dₗ)` that computes the local rime density [kg/m³]
147+
for a given ice particle diameter `Dᵢ` [m] and liquid particle diameter `Dₗ` [m].
148+
149+
# Arguments
150+
- `velocity_params`: velocity parameterization, e.g. [`CMP.Chen2022VelType`](@ref)
151+
- `ρₐ`: air density [kg/m³]
152+
- `T`: temperature [K]
153+
- `state`: [`P3State`](@ref)
154+
155+
# Returns
156+
A function that computes the local rime density [kg/m³] using the equation:
157+
158+
```math
159+
ρ'_{rim} = a + b R_i + c R_i^2
160+
```
161+
where
162+
```math
163+
R_i = \\frac{ 10^6 ⋅ D_{liq} ⋅ |v_{liq} - v_{ice}| }{ 2 T_{sfc} }
164+
```
165+
and ``T_{sfc}`` is the surface temperature [°C], ``D_{liq}`` is the liquid particle
166+
diameter [m], ``v_{liq/ice}`` is the particle terminal velocity [m/s].
167+
So the units of ``R_i`` are [m² s⁻¹ °C⁻¹]. The units of ``ρ'_{rim}`` are [kg/m³].
168+
169+
We assume for simplicity that ``T_{sfc}`` equals ``T``, the ambient air temperature.
170+
For real graupel, ``T_{sfc}`` is slightly higher than ``T`` due to latent heat release
171+
of freezing liquid particles onto the ice particle. Morrison & Milbrandt (2013)
172+
found little sensitivity to "realistic" increases in ``T_{sfc}``.
173+
174+
See also [`LocalRimeDensity`](@ref CloudMicrophysics.Parameters.LocalRimeDensity).
175+
176+
# Extended help
177+
178+
Implementation follows Cober and List (1993), Eq. 16 and 17.
179+
See also the P3 fortran code, `microphy_p3.f90`, Line 3315-3323,
180+
which extends the range of the calculation to ``R_i ≤ 12``, the upper limit of which
181+
then equals the solid bulk ice density, ``ρ_ice = 916.7 kg/m^3``.
182+
183+
Note that Morrison & Milbrandt (2015) [MorrisonMilbrandt2015](@cite) only uses this
184+
parameterization for collisions with cloud droplets.
185+
For rain drops, they use a value near the solid bulk ice density, ``ρ^* = 900 kg/m^3``.
186+
We do not consider this distinction, and use this parameterization for all liquid particles.
187+
"""
188+
function compute_local_rime_density(velocity_params, ρₐ, T, state)
189+
(; T_freeze, ρ_rim_local) = state.params
190+
T°C = T - T_freeze # Convert to °C
191+
μm = 1_000_000 # Note: m to μm factor, c.f. units of rₘ in Eq. 16 in Cober and List (1993)
192+
193+
v_ice = ice_particle_terminal_velocity(velocity_params, ρₐ, state)
194+
v_liq = CO.particle_terminal_velocity(velocity_params.rain, ρₐ)
195+
function ρ′_rim(Dᵢ, Dₗ)
196+
v_term = abs(v_ice(Dᵢ) - v_liq(Dₗ))
197+
Rᵢ = (Dₗ * μm * v_term) / (2 * T°C) # Eq. 16 in Cober and List (1993). Note: no `-` due to absolute value in v_term
198+
return ρ_rim_local(Rᵢ)
199+
end
200+
return ρ′_rim
201+
end

src/P3_terminal_velocity.jl

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
"""
3-
ice_particle_terminal_velocity(state, velocity_params, ρₐ; [use_aspect_ratio])
3+
ice_particle_terminal_velocity(velocity_params, ρₐ, state::P3State; [use_aspect_ratio])
4+
ice_particle_terminal_velocity(velocity_params, ρₐ, params::CMP.ParametersP3, F_rim, ρ_rim; [use_aspect_ratio])
45
56
Returns the terminal velocity of a single ice particle as a function of its size
67
(maximum dimension, `D`) using the Chen 2022 parametrization.
@@ -15,31 +16,34 @@ Returns the terminal velocity of a single ice particle as a function of its size
1516
of particle aspect ratio on its terminal velocity (default: `true`)
1617
"""
1718
function ice_particle_terminal_velocity(
18-
state::P3State, velocity_params::CMP.Chen2022VelType, ρₐ; use_aspect_ratio = true,
19+
velocity_params::CMP.Chen2022VelType, ρₐ, state_components...; use_aspect_ratio = true,
1920
)
2021
function v_term(D::FT) where {FT}
2122
(; small_ice, large_ice) = velocity_params
2223
D_cutoff = small_ice.cutoff # Diameter cutoff between small and large ice regimes
2324
ρᵢ = FT(916.7) # ρᵢ = p3_density(p3, D, F_rim, th) # TODO: tmp
2425
v_term_small = CO.particle_terminal_velocity(small_ice, ρₐ, ρᵢ)
2526
v_term_large = CO.particle_terminal_velocity(large_ice, ρₐ, ρᵢ)
26-
ϕ_factor = use_aspect_ratio ? cbrt(ϕᵢ(state, D)) : FT(1)
27+
# `state_components...` is either `state` or `(params, F_rim, ρ_rim)`
28+
ϕ_factor = use_aspect_ratio ? cbrt(ϕᵢ(state_components..., D)) : FT(1)
2729
vₜ = D <= D_cutoff ? v_term_small(D) : v_term_large(D)
2830
return ϕ_factor * vₜ
2931
end
3032
return v_term
3133
end
32-
3334
"""
34-
ice_terminal_velocity_number_weighted(state, logλ velocity_params, ρₐ; [use_aspect_ratio], [∫kwargs...])
35+
ice_terminal_velocity_number_weighted(
36+
velocity_params::CMP.Chen2022VelType, ρₐ, state::P3State, logλ;
37+
[use_aspect_ratio], [∫kwargs...],
38+
)
3539
3640
Return the terminal velocity of the number-weighted mean ice particle size.
3741
3842
# Arguments
39-
- `state`: A [`P3State`](@ref)
40-
- `logλ`: The log of the slope parameter [log(1/m)]
4143
- `velocity_params`: A [`CMP.Chen2022VelType`](@ref) with terminal velocity parameters
4244
- `ρₐ`: Air density [kg/m³]
45+
- `state`: A [`P3State`](@ref)
46+
- `logλ`: The log of the slope parameter [log(1/m)]
4347
4448
# Keyword arguments
4549
- `use_aspect_ratio`: Bool flag set to `true` if we want to consider the effects
@@ -49,15 +53,15 @@ Return the terminal velocity of the number-weighted mean ice particle size.
4953
See also [`ice_terminal_velocity_mass_weighted`](@ref)
5054
"""
5155
function ice_terminal_velocity_number_weighted(
52-
state::P3State, logλ, velocity_params::CMP.Chen2022VelType, ρₐ;
56+
velocity_params::CMP.Chen2022VelType, ρₐ, state::P3State, logλ;
5357
use_aspect_ratio = true, ∫kwargs...,
5458
)
5559
(; N_ice, L_ice) = state
5660
if N_ice < eps(one(N_ice)) || L_ice < eps(one(L_ice))
5761
return zero(N_ice)
5862
end
5963

60-
v_term = ice_particle_terminal_velocity(state, velocity_params, ρₐ; use_aspect_ratio)
64+
v_term = ice_particle_terminal_velocity(velocity_params, ρₐ, state; use_aspect_ratio)
6165
n = DT.size_distribution(state, logλ)
6266

6367
# ∫n(D) v(D) dD
@@ -67,15 +71,15 @@ function ice_terminal_velocity_number_weighted(
6771
end
6872

6973
"""
70-
ice_terminal_velocity_mass_weighted(state, logλ, velocity_params, ρₐ; [use_aspect_ratio], [∫kwargs...])
74+
ice_terminal_velocity_mass_weighted(velocity_params::CMP.Chen2022VelType, ρₐ, state::P3State, logλ; [use_aspect_ratio], [∫kwargs...])
7175
7276
Return the terminal velocity of the mass-weighted mean ice particle size.
7377
7478
# Arguments
75-
- `state`: A [`P3State`](@ref)
76-
- `logλ`: The log of the slope parameter [log(1/m)]
7779
- `velocity_params`: A [`CMP.Chen2022VelType`](@ref) with terminal velocity parameters
7880
- `ρₐ`: Air density [kg/m³]
81+
- `state`: A [`P3State`](@ref)
82+
- `logλ`: The log of the slope parameter [log(1/m)]
7983
8084
# Keyword arguments
8185
- `use_aspect_ratio`: Bool flag set to `true` if we want to consider the effects
@@ -85,15 +89,15 @@ Return the terminal velocity of the mass-weighted mean ice particle size.
8589
See also [`ice_terminal_velocity_number_weighted`](@ref)
8690
"""
8791
function ice_terminal_velocity_mass_weighted(
88-
state::P3State, logλ, velocity_params::CMP.Chen2022VelType, ρₐ;
92+
velocity_params::CMP.Chen2022VelType, ρₐ, state::P3State, logλ;
8993
use_aspect_ratio = true, ∫kwargs...,
9094
)
9195
(; N_ice, L_ice) = state
9296
if N_ice < eps(one(N_ice)) || L_ice < eps(one(L_ice))
9397
return zero(L_ice)
9498
end
9599

96-
v_term = ice_particle_terminal_velocity(state, velocity_params, ρₐ; use_aspect_ratio)
100+
v_term = ice_particle_terminal_velocity(velocity_params, ρₐ, state; use_aspect_ratio)
97101
n = DT.size_distribution(state, logλ) # Number concentration at diameter D
98102

99103
# ∫n(D) m(D) v(D) dD

0 commit comments

Comments
 (0)