@@ -47,27 +47,25 @@ function het_ice_nucleation(
4747end
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
6565Returns the melting rate of ice (QIMLT in Morrison and Mildbrandt (2015)).
6666"""
6767function 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)
10199end
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
0 commit comments