diff --git a/PySDM/backends/impl_numba/methods/deposition_methods.py b/PySDM/backends/impl_numba/methods/deposition_methods.py index 131ac74da..14047bb37 100644 --- a/PySDM/backends/impl_numba/methods/deposition_methods.py +++ b/PySDM/backends/impl_numba/methods/deposition_methods.py @@ -64,6 +64,9 @@ def body( lambdaK = formulae.diffusion_ice_kinetics__lambdaK(temperature, pressure) thermal_conductivity = formulae.diffusion_ice_kinetics__K(Ka_const, radius, lambdaK, temperature, rho) + latent_heat_sub = formulae.latent_heat_sublimation__ls(temperature) + + saturation_ratio_ice = ( ambient_humidity[cid] / ambient_water_activity[cid] ) diff --git a/PySDM/formulae.py b/PySDM/formulae.py index b03e43653..586553b67 100644 --- a/PySDM/formulae.py +++ b/PySDM/formulae.py @@ -34,6 +34,7 @@ def __init__( # pylint: disable=too-many-locals condensation_coordinate: str = "VolumeLogarithm", saturation_vapour_pressure: str = "FlatauWalkoCotton", latent_heat: str = "Kirchhoff", + latent_heat_sublimation: str = "MurphyKoop", hygroscopicity: str = "KappaKoehlerLeadingTerms", drop_growth: str = "Mason1971", surface_tension: str = "Constant", @@ -75,6 +76,7 @@ def __init__( # pylint: disable=too-many-locals self.diffusion_ice_kinetics = diffusion_ice_kinetics self.diffusion_ice_capacity = diffusion_ice_capacity self.latent_heat = latent_heat + self.latent_heat_sublimation = latent_heat_sublimation self.diffusion_thermics = diffusion_thermics self.ventilation = ventilation self.state_variable_triplet = state_variable_triplet diff --git a/PySDM/physics/__init__.py b/PySDM/physics/__init__.py index c172b3fad..6a7c7f9ee 100644 --- a/PySDM/physics/__init__.py +++ b/PySDM/physics/__init__.py @@ -37,6 +37,7 @@ isotope_diffusivity_ratios, isotope_relaxation_timescale, latent_heat, + latent_heat_sublimation, optical_albedo, optical_depth, particle_advection, diff --git a/PySDM/physics/constants_defaults.py b/PySDM/physics/constants_defaults.py index 54ef3c6a4..34bb957e2 100644 --- a/PySDM/physics/constants_defaults.py +++ b/PySDM/physics/constants_defaults.py @@ -131,6 +131,7 @@ l_l19_a = 0.167 * si.dimensionless l_l19_b = 3.65e-4 / si.kelvin + # Thermal diffusivity constants from Lowe et al. (2019) k_l19_a = 4.2e-3 * si.joules / si.metres / si.seconds / si.kelvins k_l19_b = 1.0456 * si.dimensionless @@ -168,6 +169,13 @@ MK05_LIQ_C12 = 1 * si.K MK05_LIQ_C13 = 0.014025 / si.K +# Latent heat of sublimation from Murphy and Koop (2005) +MK05_SUB_C1 = 46782.5 * si.joule / si.mole +MK05_SUB_C2 = 35.8925 * si.joule / si.mole / si.kelvin +MK05_SUB_C3 = 0.07414 * si.joule / si.mole / si.kelvin**2 +MK05_SUB_C4 = 541.5 * si.joule / si.mole +MK05_SUB_C5 = 123.75 * si.kelvin + # standard pressure and temperature (ICAO) T_STP = (sci.zero_Celsius + 15) * si.kelvin p_STP = 101325 * si.pascal diff --git a/PySDM/physics/latent_heat_sublimation/__init__.py b/PySDM/physics/latent_heat_sublimation/__init__.py new file mode 100644 index 000000000..e42dda007 --- /dev/null +++ b/PySDM/physics/latent_heat_sublimation/__init__.py @@ -0,0 +1,6 @@ +""" +formulations of latent heat of sublimation temperature dependence (or lack thereof) +""" + +from .constant import Constant +from .murphy_koop_2005 import MurphyKoop diff --git a/PySDM/physics/latent_heat_sublimation/constant.py b/PySDM/physics/latent_heat_sublimation/constant.py new file mode 100644 index 000000000..cd1fae92b --- /dev/null +++ b/PySDM/physics/latent_heat_sublimation/constant.py @@ -0,0 +1,12 @@ +""" +temperature-independent latent heat of sublimation +""" + + +class Constant: # pylint: disable=too-few-public-methods + def __init__(self, _): + pass + + @staticmethod + def ls(const, T): # pylint: disable=unused-argument + return const.l_tri diff --git a/PySDM/physics/latent_heat_sublimation/murphy_koop_2005.py b/PySDM/physics/latent_heat_sublimation/murphy_koop_2005.py new file mode 100644 index 000000000..d50204525 --- /dev/null +++ b/PySDM/physics/latent_heat_sublimation/murphy_koop_2005.py @@ -0,0 +1,12 @@ +""" +temperature-dependent latent heat of sublimation from Murphy and Koop (2005) Eq. (5) +""" + + +class MurphyKoop: # pylint: disable=too-few-public-methods + def __init__(self, _): + pass + + @staticmethod + def ls(const, T): # pylint: disable=unused-argument + return (const.MK05_SUB_C1 + const.MK05_SUB_C2 * T - const.MK05_SUB_C3 * T**2. + const.MK05_SUB_C4 * np.exp(-(T/const.MK05_SUB_C5)**2.)) / const.Mv