Skip to content

Commit c172fe9

Browse files
committed
add P3 ice nucleation modes
1 parent 8723b62 commit c172fe9

File tree

2 files changed

+67
-21
lines changed

2 files changed

+67
-21
lines changed

src/BulkMicrophysicsTendencies.jl

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import ..Microphysics1M as CM1
3232
import ..Microphysics2M as CM2
3333
import ..MicrophysicsNonEq as CMNonEq
3434
import ..P3Scheme as CMP3
35+
import ..HetIceNucleation as CM_HetIce
3536
import ...ThermodynamicsInterface as TDI
3637

3738
export MicrophysicsScheme,
@@ -665,6 +666,9 @@ to be non-Nothing, eliminating runtime type checks and dynamic dispatch.
665666
vel = mp.ice.terminal_velocity
666667
pdf_c = mp.ice.cloud_pdf
667668
pdf_r = mp.ice.rain_pdf
669+
heterogeneous = mp.ice.heterogeneous
670+
deposition_condfreeze = mp.ice.deposition_condfreeze
671+
668672

669673
# Only compute ice processes if there is ice mass/number present
670674
if (q_ice > zero(q_ice) || n_ice > zero(n_ice))
@@ -684,23 +688,8 @@ to be non-Nothing, eliminating runtime type checks and dynamic dispatch.
684688
# Only compute if there is ice present
685689
if L_ice > zero(L_ice) && N_ice > zero(N_ice)
686690
coll = CMP3.bulk_liquid_ice_collision_sources(
687-
p3,
688-
logλ,
689-
L_ice,
690-
N_ice,
691-
F_rim,
692-
ρ_rim,
693-
pdf_c,
694-
pdf_r,
695-
L_lcl,
696-
N_lcl,
697-
L_rai,
698-
N_rai,
699-
aps,
700-
tps,
701-
vel,
702-
ρ,
703-
T,
691+
p3, logλ, L_ice, N_ice, F_rim, ρ_rim, pdf_c, pdf_r,
692+
L_lcl, N_lcl, L_rai, N_rai, aps, tps, vel, ρ, T,
704693
)
705694

706695
# Add collision tendencies
@@ -730,9 +719,66 @@ to be non-Nothing, eliminating runtime type checks and dynamic dispatch.
730719
end
731720
end
732721

733-
# TODO: When ice number concentration is tracked, add dn_ice_dt to return tuple:
734-
# return (; dq_lcl_dt, dn_lcl_dt, dq_rai_dt, dn_rai_dt, dq_ice_dt, dn_ice_dt, dq_rim_dt, db_rim_dt)
735-
return (; dq_lcl_dt, dn_lcl_dt, dq_rai_dt, dn_rai_dt, dq_ice_dt, dq_rim_dt, db_rim_dt)
722+
# --- -------------------- ---
723+
# --- Ice Nucleation Modes ---
724+
# --- -------------------- ---
725+
726+
# --- Ice Nucleation (Deposition) ---
727+
# Assume nucleated particles have diameter 1μm --> nucleated mass (per particle)
728+
D_nuc_ice = 1e-6 # 1μm
729+
m_nuc = p3.ρ_i * CO.volume_sphere_D(D_nuc_ice) # [kg]
730+
731+
# TODO: The parameterixation should return a rate, `∂N/∂t`, not number changes `ΔN`
732+
n_dep = CM_HetIce.P3_deposition_N_i(deposition_condfreeze, T) / ρ # [particles / kg air]
733+
m_dep = n_dep * m_nuc # [kg ice / kg air]
734+
dn_ice_dt += n_dep
735+
dq_ice_dt += m_dep
736+
dq_rim_dt += m_dep
737+
db_rim_dt += m_dep / 900
738+
739+
# --- Heterogeneous Ice Nucleation (Immersion freezing) ---
740+
# Assume mass loss is mean condensate mass
741+
m_lcl = q_lcl / n_lcl # mean liquid mass
742+
743+
# TODO: The parameterixation should return a rate, `∂N/∂t`, not number changes `ΔN`
744+
inpc = CM_HetIce.INP_concentration_mean(heterogeneous, T) / ρ # [particles / kg air]
745+
n_het = max(FT(0), inpc - n_ice) # [particles / kg air]
746+
q_het = n_het * m_lcl # [kg ice / kg air]
747+
748+
dn_ice_dt += n_het
749+
dq_ice_dt += q_het
750+
dq_rim_dt += q_het
751+
db_rim_dt += q_het / 900 # = ρ^* TODO: make this a parameter?
752+
dn_lcl_dt -= n_het
753+
dq_lcl_dt -= q_het
754+
755+
# --- Cloud Droplet Condensation Freezing ---
756+
# ref: `homogeneous_freezing` in `parcel/ParcelTendencies.jl`
757+
# get mean diameter of cloud droplets, then convert to volume
758+
759+
# --- Ice Sublimation / Deposition ---
760+
# Deposition/sublimation of cloud ice
761+
∂ₜq_ice_dep = CMNonEq.conv_q_vap_to_q_lcl_icl_MM2015(icl, tps, q_tot, q_lcl, q_ice, q_rai, zero(q_ice), ρ, T)
762+
# No ice deposition above freezing (lack of INPs)
763+
∂ₜq_ice_dep = ifelse(T > tps.T_freeze, min(∂ₜq_ice_dep, zero(T)), ∂ₜq_ice_dep)
764+
∂ₜn_ice_dep = ifelse(∂ₜq_ice_dep < 0, (N_ice / q_ice) * ∂ₜq_ice_dep, zero(∂ₜq_ice_dep))
765+
dq_ice_dt += ∂ₜq_ice_dep
766+
dn_ice_dt += ∂ₜn_ice_dep
767+
768+
# --- Ice Self-collection (Aggregation) ---
769+
# TODO: Implement P3 ice self-collection (aggregation)
770+
# This process is currently missing in P3_processes.jl
771+
# S_ice_agg = CMP3.ice_self_collection(p3, q_ice, n_ice, ...)
772+
# dn_ice_dt -= S_ice_agg
773+
774+
# --- Rain Heterogeneous Freezing ---
775+
# TODO: Implement heterogeneous freezing of rain
776+
# This process is currently missing in P3_processes.jl
777+
# S_rai_frz = ...
778+
# dq_rai_dt -= S_rai_frz
779+
# dq_ice_dt += S_rai_frz
780+
781+
return (; dq_lcl_dt, dn_lcl_dt, dq_rai_dt, dn_rai_dt, dq_ice_dt, dn_ice_dt, dq_rim_dt, db_rim_dt)
736782
end
737783

738784
end # module BulkMicrophysicsTendencies

src/parameters/MicrophysicsP3.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ function ParametersP3(toml_dict::CP.ParamDict; slope_law = :powerlaw)
338338
vent = VentilationFactor(toml_dict)
339339
ρ_rim_local = LocalRimeDensity(toml_dict)
340340
name_map = (;
341-
:density_ice_water => :ρ_i,
341+
:density_ice_water => :ρ_i, # TODO: Check if this should be 900 or 916.7
342342
:density_liquid_water => :ρ_l,
343343
:temperature_water_freeze => :T_freeze,
344344
:P3_wet_growth_timescale => :τ_wet,

0 commit comments

Comments
 (0)