PySDM_examples.featured.Luettmer_et_al_2026.commons

commons for homogeneous freezing notebooks

 1"""commons for homogeneous freezing notebooks"""
 2
 3from PySDM_examples.featured.Luettmer_et_al_2026.settings import Settings
 4from PySDM_examples.featured.Luettmer_et_al_2026.simulation import Simulation
 5from PySDM import Formulae
 6from PySDM.physics.constants import si
 7from PySDM.backends import CPU
 8
 9formulae = Formulae(
10    particle_shape_and_density="MixedPhaseSpheres",
11)
12
13
14def run_simulations(setting):
15
16    simulation = {
17        "settings": setting,
18        "ensemble_member_outputs": [],
19    }
20    for _ in range(setting["number_of_ensemble_runs"]):
21        model_setup = Settings(**simulation["settings"])
22        model_setup.formulae.seed += 1
23        model = Simulation(model_setup)
24        simulation["ensemble_member_outputs"].append(model.run())
25
26    return simulation
27
28
29def hom_pure_droplet_freezing_backend():
30    backends = {
31        "threshold": CPU(
32            formulae=Formulae(
33                particle_shape_and_density="MixedPhaseSpheres",
34                homogeneous_ice_nucleation_rate="Null",
35                saturation_vapour_pressure="MurphyKoop2005",
36            ),
37        ),
38        "KoopMurray2016": CPU(
39            formulae=Formulae(
40                particle_shape_and_density="MixedPhaseSpheres",
41                homogeneous_ice_nucleation_rate="KoopMurray2016",
42                saturation_vapour_pressure="MurphyKoop2005",
43            ),
44        ),
45        "Spichtinger2023": CPU(
46            formulae=Formulae(
47                particle_shape_and_density="MixedPhaseSpheres",
48                homogeneous_ice_nucleation_rate="Koop_Correction",
49                saturation_vapour_pressure="MurphyKoop2005",
50            ),
51        ),
52        "Koop2000": CPU(
53            formulae=Formulae(
54                particle_shape_and_density="MixedPhaseSpheres",
55                homogeneous_ice_nucleation_rate="Koop2000",
56                saturation_vapour_pressure="MurphyKoop2005",
57            ),
58        ),
59        "KoopMurray2016_DWA": CPU(
60            formulae=Formulae(
61                particle_shape_and_density="MixedPhaseSpheres",
62                homogeneous_ice_nucleation_rate="KoopMurray2016_DWA",
63                saturation_vapour_pressure="MurphyKoop2005",
64            ),
65        ),
66    }
67    return backends
68
69
70def hom_pure_droplet_freezing_standard_setup():
71    standard = {
72        "n_sd": int(1e3),
73        "w_updraft": 1.0 * si.meter / si.second,
74        "T0": 245 * si.kelvin,
75        "dz": 1.0 * si.meter,
76        "n_ccn": 750 / si.cm**3,
77        "r_ccn": 15 * si.nanometer,
78        "type_droplet_distribution": "monodisperse",
79        "RH_0": 0.995,
80        "p0": 500 * si.hectopascals,
81        "deposition_enable": True,
82        "number_of_ensemble_runs": 1,
83        "silent": True,
84    }
85    return standard
formulae = <PySDM.formulae.Formulae object>
def run_simulations(setting):
15def run_simulations(setting):
16
17    simulation = {
18        "settings": setting,
19        "ensemble_member_outputs": [],
20    }
21    for _ in range(setting["number_of_ensemble_runs"]):
22        model_setup = Settings(**simulation["settings"])
23        model_setup.formulae.seed += 1
24        model = Simulation(model_setup)
25        simulation["ensemble_member_outputs"].append(model.run())
26
27    return simulation
def hom_pure_droplet_freezing_backend():
30def hom_pure_droplet_freezing_backend():
31    backends = {
32        "threshold": CPU(
33            formulae=Formulae(
34                particle_shape_and_density="MixedPhaseSpheres",
35                homogeneous_ice_nucleation_rate="Null",
36                saturation_vapour_pressure="MurphyKoop2005",
37            ),
38        ),
39        "KoopMurray2016": CPU(
40            formulae=Formulae(
41                particle_shape_and_density="MixedPhaseSpheres",
42                homogeneous_ice_nucleation_rate="KoopMurray2016",
43                saturation_vapour_pressure="MurphyKoop2005",
44            ),
45        ),
46        "Spichtinger2023": CPU(
47            formulae=Formulae(
48                particle_shape_and_density="MixedPhaseSpheres",
49                homogeneous_ice_nucleation_rate="Koop_Correction",
50                saturation_vapour_pressure="MurphyKoop2005",
51            ),
52        ),
53        "Koop2000": CPU(
54            formulae=Formulae(
55                particle_shape_and_density="MixedPhaseSpheres",
56                homogeneous_ice_nucleation_rate="Koop2000",
57                saturation_vapour_pressure="MurphyKoop2005",
58            ),
59        ),
60        "KoopMurray2016_DWA": CPU(
61            formulae=Formulae(
62                particle_shape_and_density="MixedPhaseSpheres",
63                homogeneous_ice_nucleation_rate="KoopMurray2016_DWA",
64                saturation_vapour_pressure="MurphyKoop2005",
65            ),
66        ),
67    }
68    return backends
def hom_pure_droplet_freezing_standard_setup():
71def hom_pure_droplet_freezing_standard_setup():
72    standard = {
73        "n_sd": int(1e3),
74        "w_updraft": 1.0 * si.meter / si.second,
75        "T0": 245 * si.kelvin,
76        "dz": 1.0 * si.meter,
77        "n_ccn": 750 / si.cm**3,
78        "r_ccn": 15 * si.nanometer,
79        "type_droplet_distribution": "monodisperse",
80        "RH_0": 0.995,
81        "p0": 500 * si.hectopascals,
82        "deposition_enable": True,
83        "number_of_ensemble_runs": 1,
84        "silent": True,
85    }
86    return standard