@@ -32,6 +32,7 @@ import ..Microphysics1M as CM1
3232import .. Microphysics2M as CM2
3333import .. MicrophysicsNonEq as CMNonEq
3434import .. P3Scheme as CMP3
35+ import .. HetIceNucleation as CM_HetIce
3536import ... ThermodynamicsInterface as TDI
3637
3738export 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)
736782end
737783
738784end # module BulkMicrophysicsTendencies
0 commit comments