diff --git a/PySDM/backends/impl_numba/test_helpers/scipy_ode_condensation_solver.py b/PySDM/backends/impl_numba/test_helpers/scipy_ode_condensation_solver.py index 1ea2a43d0..1ac2740af 100644 --- a/PySDM/backends/impl_numba/test_helpers/scipy_ode_condensation_solver.py +++ b/PySDM/backends/impl_numba/test_helpers/scipy_ode_condensation_solver.py @@ -83,7 +83,7 @@ def _condensation( RH_max=RH_max.data, success=success.data, ) - particulator.attributes.mark_updated("water mass") + particulator.attributes.mark_updated("signed water mass") @lru_cache() diff --git a/PySDM/particulator.py b/PySDM/particulator.py index 5919feb80..7c0824fe0 100644 --- a/PySDM/particulator.py +++ b/PySDM/particulator.py @@ -546,6 +546,7 @@ def homogeneous_freezing_time_dependent(self, *, rand: Storage): temperature=self.environment["T"], relative_humidity_ice=self.environment["RH_ice"], ) + self.attributes.mark_updated("signed water mass") def homogeneous_freezing_threshold(self): self.backend.homogeneous_freezing_threshold( @@ -556,6 +557,7 @@ def homogeneous_freezing_threshold(self): temperature=self.environment["T"], relative_humidity_ice=self.environment["RH_ice"], ) + self.attributes.mark_updated("signed water mass") def thaw_instantaneous(self): self.backend.thaw_instantaneous( @@ -565,3 +567,4 @@ def thaw_instantaneous(self): cell=self.attributes["cell id"], temperature=self.environment["T"], ) + self.attributes.mark_updated("signed water mass") diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/__init__.py b/examples/PySDM_examples/Luettmer_homogeneous_freezing/__init__.py new file mode 100644 index 000000000..d7b9c920c --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/__init__.py @@ -0,0 +1,15 @@ +""" +Homogeneous freezing example + +hom_freezing.ipynb: +.. include:: ./hom_freezing.ipynb +""" + +from .settings import Settings +from .simulation import Simulation +from .plot import ( + plot_thermodynamics_and_bulk, + plot_freezing_temperatures_histogram, + plot_freezing_temperatures_2d_histogram, + plot_freezing_temperatures_2d_histogram_seaborn, +) diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/commons.py b/examples/PySDM_examples/Luettmer_homogeneous_freezing/commons.py new file mode 100644 index 000000000..156a0a3bf --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/commons.py @@ -0,0 +1,85 @@ +# import numpy as np +from PySDM import Formulae +from PySDM.physics.constants import si +from PySDM.backends import CPU +import time + +from PySDM_examples.Luettmer_homogeneous_freezing.settings import Settings +from PySDM_examples.Luettmer_homogeneous_freezing.simulation import Simulation + + +formulae = Formulae( + particle_shape_and_density="MixedPhaseSpheres", +) + + +def run_simulations(setting): + + simulation = { + "settings": setting, + "ensemble_member_outputs": [], + } + for n in range(setting["number_of_ensemble_runs"]): + model_setup = Settings(**simulation["settings"]) + model_setup.formulae.seed += 1 + model = Simulation(model_setup) + simulation["ensemble_member_outputs"].append(model.run()) + + return simulation + + +def hom_pure_droplet_freezing_backend(): + backends = { + "threshold": CPU( + formulae=Formulae( + particle_shape_and_density="MixedPhaseSpheres", + homogeneous_ice_nucleation_rate="Null", + saturation_vapour_pressure="MurphyKoop2005", + seed=time.time_ns(), + ) + ), + "KoopMurray2016": CPU( + formulae=Formulae( + particle_shape_and_density="MixedPhaseSpheres", + homogeneous_ice_nucleation_rate="KoopMurray2016", + saturation_vapour_pressure="MurphyKoop2005", + seed=time.time_ns(), + ) + ), + "Spichtinger2023": CPU( + formulae=Formulae( + particle_shape_and_density="MixedPhaseSpheres", + homogeneous_ice_nucleation_rate="Koop_Correction", + saturation_vapour_pressure="MurphyKoop2005", + seed=time.time_ns(), + ) + ), + "Koop2000": CPU( + formulae=Formulae( + particle_shape_and_density="MixedPhaseSpheres", + homogeneous_ice_nucleation_rate="Koop2000", + saturation_vapour_pressure="MurphyKoop2005", + seed=time.time_ns(), + ) + ), + } + return backends + + +def hom_pure_droplet_freezing_standard_setup(): + standard = { + "n_sd": int(1e3), + "w_updraft": 1.0 * si.meter / si.second, + "T0": formulae.trivia.C2K(-25), + "dz": 0.1 * si.meter, + "N_dv_droplet_distribution": 750 / si.cm**3, + "r_mean_droplet_distribution": 15 * si.nanometer, + "type_droplet_distribution": "monodisperse", + "RH_0": 0.995, + "p0": 500 * si.hectopascals, + "condensation_enable": True, + "deposition_enable": True, + "deposition_adaptive": True, + "number_of_ensemble_runs": 1, + } + return standard diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing.ipynb b/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing.ipynb new file mode 100644 index 000000000..20ed870c7 --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing.ipynb @@ -0,0 +1,923 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-29T01:46:26.621707Z", + "start_time": "2025-09-29T01:46:16.313525Z" + } + }, + "source": [ + "import numpy as np\n", + "from PySDM.physics.constants import si\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.commons import run_simulations, hom_pure_droplet_freezing_backend, hom_pure_droplet_freezing_standard_setup\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.simulation import Simulation\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.settings import Settings\n", + "from PySDM_examples.Luettmer_homogeneous_freezing import plot\n", + "from importlib import reload\n", + "from matplotlib import pyplot\n", + "from open_atmos_jupyter_utils import show_plot" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-25T07:45:50.718554Z", + "start_time": "2025-09-25T07:45:50.104588Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" General settings \"\"\"\n", + "hom_freezing_types = [ \"KoopMurray2016\", \"Spichtinger2023\" ]\n", + "hom_freezing_types_all = [ \"KoopMurray2016\", \"Spichtinger2023\", \"Koop2000\" ]\n", + "vertical_updrafts = np.geomspace(0.2,10,num=9) * si.meter / si.second\n", + "number_concentrations = np.geomspace(100, 20000, num=10) / si.cm ** 3\n", + "\n", + "backends = hom_pure_droplet_freezing_backend()\n", + "standard = hom_pure_droplet_freezing_standard_setup()" + ], + "id": "4d6a0d9ca45d5029", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-25T08:22:15.004972Z", + "start_time": "2025-09-25T08:13:48.244449Z" + } + }, + "cell_type": "code", + "source": [ + "\n", + "\"\"\" High output step reference simulations \"\"\"\n", + "setting_dict = {\n", + " **standard,\n", + " \"backend\": backends[\"KoopMurray2016\"],\n", + " \"hom_freezing\": \"KoopMurray2016\",\n", + " \"w_updraft\": 2.5,\n", + " \"deposition_enable\": False,\n", + " \"n_output\": 1\n", + " }\n", + "KoopMurray2016_reference_high_w_simulation = run_simulations(setting_dict)\n", + "setting_dict = {\n", + " **standard,\n", + " \"backend\": backends[\"Spichtinger2023\"],\n", + " \"hom_freezing\": \"Spichtinger2023\",\n", + " \"w_updraft\": 2.5,\n", + " \"deposition_enable\": False,\n", + " \"n_output\": 1,\n", + " \"dz\": 0.1,\n", + " }\n", + "Spichtinger2023_reference_high_w_simulation = run_simulations(setting_dict)\n", + "setting_dict = {\n", + " **standard,\n", + " \"backend\": backends[\"KoopMurray2016\"],\n", + " \"hom_freezing\": \"KoopMurray2016\",\n", + " \"w_updraft\": 0.2,\n", + " \"deposition_enable\": False,\n", + " \"n_output\": 1,\n", + " \"dz\": 0.1,\n", + " }\n", + "KoopMurray2016_reference_low_w_simulation = run_simulations(setting_dict)" + ], + "id": "9f42826e52927bdf", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=2.5 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=2.5 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=0.2 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-25T08:35:02.292843Z", + "start_time": "2025-09-25T08:34:30.039503Z" + } + }, + "cell_type": "code", + "source": [ + "reload(plot)\n", + "plot.plot_thermodynamics_and_bulk(KoopMurray2016_reference_high_w_simulation, \" without vapor deposition\")\n", + "show_plot(\"fig_KM16_high_w_no_dep\")\n", + "plot.plot_thermodynamics_and_bulk(Spichtinger2023_reference_high_w_simulation, \" without vapor deposition\")\n", + "show_plot(\"fig_SP23_high_w_no_dep\")\n", + "plot.plot_thermodynamics_and_bulk(KoopMurray2016_reference_low_w_simulation, \" without vapor deposition\")\n", + "show_plot(\"fig_KM16_low_w_no_dep\")" + ], + "id": "69e81c6c0f755b5b", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T17:34:39.208152\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./fig_KM16_high_w_no_dep.pdf…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "7de0ff20f3f941bba43824472cb1315e" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T17:34:50.493927\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./fig_SP23_high_w_no_dep.pdf…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "81f88b9cb469499097528c98de76b304" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T17:35:01.319393\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./fig_KM16_low_w_no_dep.pdf" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T15:40:26.869019\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./n_sd_10.0_e…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "15a2f268b988472881491cb755779a5b" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T15:40:29.468689\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./n_sd_100.0…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "0527f1a4f2674104b1336975820a6f58" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T15:40:31.828643\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./n_sd_1000…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "e23dc41110b2451db6974399c4056ef1" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T07:04:09.997409Z", + "start_time": "2025-09-24T06:40:32.129820Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Updraft ensemble simulations without deposition \"\"\"\n", + "simulations_ensemble_no_deposition = []\n", + "for hom_freezing_type in hom_freezing_types:\n", + " for updraft in vertical_updrafts:\n", + " setting_dict = {\n", + " **standard,\n", + " \"w_updraft\": updraft * si.meter / si.second,\n", + " \"backend\": backends[hom_freezing_type],\n", + " \"hom_freezing\": hom_freezing_type,\n", + " \"deposition_enable\": False,\n", + " }\n", + " simulations_ensemble_no_deposition.append( run_simulations(setting_dict) )" + ], + "id": "c6b2cb90d6533376", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=0.2 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=0.32613788179066194 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=0.5318295896944989 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=0.8672488792828036 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.4142135623730951 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=2.306143078159937 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=3.760603093086394 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=6.132375635173039 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=10.0 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.2 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.32613788179066194 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.5318295896944989 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.8672488792828036 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.4142135623730951 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=2.306143078159937 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=3.760603093086394 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=6.132375635173039 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=10.0 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 9 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T07:04:15.501592Z", + "start_time": "2025-09-24T07:04:10.605370Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Plot ensemble simulations without deposition \"\"\"\n", + "reload(plot)\n", + "for hom_freezing_type in hom_freezing_types:\n", + "\n", + " histogram_data_dict = {}\n", + "\n", + " histogram_data_dict[\"hom_freezing_type\"] = hom_freezing_type\n", + " histogram_data_dict[\"T_frz_histogram_list\"] = []\n", + " histogram_data_dict[\"w_updraft_histogram_list\"] = []\n", + "\n", + " for i, updraft in enumerate(vertical_updrafts):\n", + " for simulation in simulations_ensemble_no_deposition:\n", + " if (simulation[\"settings\"][\"w_updraft\"] == updraft\n", + " and simulation[\"settings\"][\"hom_freezing\"] == hom_freezing_type):\n", + " output = simulation[\"ensemble_member_outputs\"][0]\n", + " T_frz = output[\"T_frz\"]\n", + " histogram_data_dict[\"T_frz_histogram_list\"].extend( T_frz )\n", + " histogram_data_dict[\"w_updraft_histogram_list\"].extend( np.full_like(T_frz, updraft) )\n", + "\n", + " plot.plot_freezing_temperatures_2d_histogram_seaborn(histogram_data_dict, title_add = \" without vapor deposition\")\n", + " show_plot(hom_freezing_type+\"_updraft_ensemble_no_deposition\")" + ], + "id": "bed0dd6290f2a8ec", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T16:04:13.406264\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Koo…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "75a7665289a943a8b8d470e42f43e234" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T16:04:15.328816\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Sp…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "3dbdd068dc79410486d1ddbc9df2584a" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 10 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T07:28:52.645062Z", + "start_time": "2025-09-24T07:04:15.603620Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Simulations for CCN concentration histogram \"\"\"\n", + "simulations_ccn_concentration_ensemble = []\n", + "\n", + "for hom_freezing_type in hom_freezing_types:\n", + " for n_dv in number_concentrations:\n", + " setting_dict = {\n", + " **standard,\n", + " \"N_dv_droplet_distribution\": n_dv,\n", + " \"backend\": backends[hom_freezing_type],\n", + " \"hom_freezing\": hom_freezing_type,\n", + " \"deposition_enable\": False,\n", + " }\n", + " simulations_ccn_concentration_ensemble.append(run_simulations(setting_dict))" + ], + "id": "5ad7e4f68543fae0", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=99999999.99999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=180164823.06544116\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=324593634.7020169\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=584803547.6425728\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=1053610276.8906642\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=1898235091.1593704\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=3419951893.3533926\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=6161550277.583339\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=11100946155.696224\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=19999999999.999996\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=99999999.99999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=180164823.06544116\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=324593634.7020169\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=584803547.6425728\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=1053610276.8906642\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=1898235091.1593704\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=3419951893.3533926\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=6161550277.583339\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=11100946155.696224\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=19999999999.999996\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 11 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T07:29:04.320244Z", + "start_time": "2025-09-24T07:28:53.154955Z" + } + }, + "cell_type": "code", + "source": [ + "for hom_freezing_type in hom_freezing_types:\n", + "\n", + " histogram_data_ccn_concentration_ensemble = {}\n", + " histogram_data_ccn_concentration_ensemble[\"hom_freezing_type\"] = hom_freezing_type\n", + "\n", + " histogram_data_ccn_concentration_ensemble[\"T_frz_histogram_list\"] = []\n", + " histogram_data_ccn_concentration_ensemble[\"n_ccn_histogram_list\"] = []\n", + " histogram_data_ccn_concentration_ensemble[\"rc_max_histogram_list\"] = []\n", + "\n", + " for n_ccn in number_concentrations:\n", + " for simulation in simulations_ccn_concentration_ensemble:\n", + " if (simulation[\"settings\"][\"hom_freezing\"] == hom_freezing_type\n", + " and simulation[\"settings\"][\"N_dv_droplet_distribution\"] == n_ccn):\n", + " output = simulation[\"ensemble_member_outputs\"][0]\n", + " T_frz = np.asarray(output[\"T_frz\"])\n", + " rc = np.asarray(output[\"rs\"])\n", + " histogram_data_ccn_concentration_ensemble[\"T_frz_histogram_list\"].extend( T_frz )\n", + " histogram_data_ccn_concentration_ensemble[\"n_ccn_histogram_list\"].extend( np.full_like(T_frz, n_ccn) )\n", + " histogram_data_ccn_concentration_ensemble[\"rc_max_histogram_list\"].extend( np.full_like(T_frz, np.amax(rc)) )\n", + "\n", + " plot.plot_freezing_temperatures_2d_histogram_seaborn(histogram_data_ccn_concentration_ensemble, title_add=\" without vapor deposition\")\n", + " show_plot(hom_freezing_type+\"_ccn_ensemble_without_deposition\")\n", + " del histogram_data_ccn_concentration_ensemble[\"n_ccn_histogram_list\"]\n", + " plot.plot_freezing_temperatures_2d_histogram_seaborn(histogram_data_ccn_concentration_ensemble, title_add=\" without vapor deposition\")\n", + " show_plot(hom_freezing_type+\"_radius_ensemble_without_deposition\")" + ], + "id": "cafadc301cb29d15", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T16:28:55.543395\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Ko…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "5da15abb25044be59653412a24366757" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T16:28:57.955625\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\".…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "72a2ffb13e00421aa5fee71fbd069eac" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T16:29:01.220666\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./S…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "4b9200ea3f5b474c9589de78b71eb6d2" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-24T16:29:04.077045\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "40b431d671ce496d810aad4f6f95236d" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 12 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing_with_coalescence.ipynb b/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing_with_coalescence.ipynb new file mode 100644 index 000000000..72e4b9099 --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing_with_coalescence.ipynb @@ -0,0 +1,486 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-30T05:44:56.895488Z", + "start_time": "2025-09-30T05:44:47.897804Z" + } + }, + "source": [ + "import numpy as np\n", + "from PySDM.physics.constants import si\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.commons import run_simulations, hom_pure_droplet_freezing_backend, hom_pure_droplet_freezing_standard_setup\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.simulation import Simulation\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.settings import Settings\n", + "from PySDM_examples.Luettmer_homogeneous_freezing import plot\n", + "from importlib import reload\n", + "from matplotlib import pyplot\n", + "from open_atmos_jupyter_utils import show_plot" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-30T05:44:57.356968Z", + "start_time": "2025-09-30T05:44:56.908912Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" General settings \"\"\"\n", + "hom_freezing_types = [ \"KoopMurray2016\", \"Spichtinger2023\" ]\n", + "vertical_updrafts = np.geomspace(0.2,10,num=9) * si.meter / si.second\n", + "\n", + "backends = hom_pure_droplet_freezing_backend()\n", + "standard = hom_pure_droplet_freezing_standard_setup()" + ], + "id": "6733571921f473df", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-30T05:45:03.003239Z", + "start_time": "2025-09-30T05:44:57.382366Z" + } + }, + "cell_type": "code", + "source": [ + "setting_dict = {\n", + " **standard,\n", + " \"backend\": backends[\"KoopMurray2016\"],\n", + " \"hom_freezing\": \"KoopMurray2016\",\n", + " \"w_updraft\": 1.,\n", + " \"deposition_enable\": False,\n", + " \"coalescence_enable\": True,\n", + " \"n_output\": 1,\n", + " \"dz\": 0.2 * si.meter,\n", + " \"n_sd\": 10,\n", + " }\n", + "test = Settings(**setting_dict)" + ], + "id": "a497f7abc7f90fda", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10 and n_dv=749999999.9999999\n" + ] + } + ], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-30T05:49:27.849638Z", + "start_time": "2025-09-30T05:45:23.051127Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" High output step reference simulations \"\"\"\n", + "setting_dict = {\n", + " **standard,\n", + " \"backend\": backends[\"KoopMurray2016\"],\n", + " \"hom_freezing\": \"KoopMurray2016\",\n", + " \"w_updraft\": 1.,\n", + " \"deposition_enable\": False,\n", + " \"coalescence_enable\": True,\n", + " \"n_output\": 1,\n", + " \"dz\": 0.2 * si.meter,\n", + " }\n", + "KoopMurray2016_reference_high_w_simulation_no_coal = run_simulations(setting_dict)\n", + "\n", + "setting_dict[\"coalescence_enable\"] = True\n", + "KoopMurray2016_reference_high_w_simulation_coal = run_simulations(setting_dict)\n", + "\n", + "setting_dict[\"deposition_enable\"] = True\n", + "KoopMurray2016_reference_high_w_simulation_coal_and_dep = run_simulations(setting_dict)" + ], + "id": "a03eb9d441925970", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-30T05:50:09.825402Z", + "start_time": "2025-09-30T05:49:39.530867Z" + } + }, + "cell_type": "code", + "source": [ + "plot.plot_thermodynamics_and_bulk(KoopMurray2016_reference_high_w_simulation_no_coal, \" without coalescence\", show_conc = True)\n", + "show_plot(\"fig_KM16_low_w_no_coal\")\n", + "plot.plot_thermodynamics_and_bulk(KoopMurray2016_reference_high_w_simulation_coal, \" with coalescence\", show_conc = True)\n", + "show_plot(\"fig_KM16_low_w_coal\")\n", + "plot.plot_thermodynamics_and_bulk(KoopMurray2016_reference_high_w_simulation_coal_and_dep, \" with coalescence & deposition\", show_conc = True)\n", + "show_plot(\"fig_KM16_low_w_coal_dep\")" + ], + "id": "3fed46bd1729f946", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-30T14:50:09.087650\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./fig_KM16_low_w_no_coal.pdf…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "20cb597ed3d647c4bda696451a905c19" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T16:44:24.852687Z", + "start_time": "2025-09-15T16:35:22.458817Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Simulations for n_sd ensemble with coalescence \"\"\"\n", + "nsd_ensemble_simulations =[]\n", + "number_of_nsd = (1e1, 1e2, 1e3)\n", + "for hom_freezing_type in hom_freezing_types:\n", + " for n_sd in number_of_nsd:\n", + " setting_dict = {\n", + " **standard,\n", + " \"n_sd\": int(n_sd),\n", + " \"backend\": backends[hom_freezing_type],\n", + " \"hom_freezing\": hom_freezing_type,\n", + " \"number_of_ensemble_runs\": 5,\n", + " \"deposition_enable\": False,\n", + " \"coalescence_enable\": True,\n", + " }\n", + " nsd_ensemble_simulations.append( run_simulations(setting_dict) )" + ], + "id": "73dc0631d7c8091a", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=100 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=1000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-15T16:44:27.982751Z", + "start_time": "2025-09-15T16:44:24.877458Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Plots for n_sd ensemble with coalescence \"\"\"\n", + "for n_sd in number_of_nsd:\n", + " fig, axs = pyplot.subplots(1, 2, figsize=(12, 4), constrained_layout=True)\n", + " fig.suptitle(\"Number of super droplets: {}\".format(int(n_sd)),fontsize=20)\n", + " axs = axs.ravel()\n", + " i = 0\n", + " for simulation in nsd_ensemble_simulations:\n", + " if simulation[\"settings\"][\"n_sd\"] == n_sd and simulation[\"settings\"][\"w_updraft\"] == standard[\"w_updraft\"]:\n", + " axs[i] = plot.plot_freezing_temperatures_histogram(axs[i], simulation)\n", + " i += 1\n", + " show_plot(\"n_sd_\"+str(n_sd)+\"_ensemble_coalescence\")" + ], + "id": "fe27eedc073d8599", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-15T18:44:26.288434\n image/svg+xml\n \n \n Matplotlib v3.10.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./tmpypolj46s.pdf
\"), HTML(value…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "f19b1064d5f94952b782d21b61f6dd25" + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-15T18:44:27.106328\n image/svg+xml\n \n \n Matplotlib v3.10.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./tmpoof4w650.pdf
\"), HTML(value…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "ef0ab5102b5d4d589b6782616b7925b8" + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-15T18:44:27.924211\n image/svg+xml\n \n \n Matplotlib v3.10.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./tmp7b38xu5y.pdf
\"), HTML(value…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "829a3bcf6b474d53aebaf18f631f188b" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-29T07:48:13.836195Z", + "start_time": "2025-09-29T07:44:25.609327Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Updraft ensemble simulations with coalescence \"\"\"\n", + "simulations_ensemble_no_deposition = []\n", + "for hom_freezing_type in hom_freezing_types:\n", + " for updraft in vertical_updrafts:\n", + " setting_dict = {\n", + " **standard,\n", + " \"w_updraft\": updraft * si.meter / si.second,\n", + " \"backend\": backends[hom_freezing_type],\n", + " \"hom_freezing\": hom_freezing_type,\n", + " \"deposition_enable\": False,\n", + " \"coalescence_enable\": True,\n", + " }\n", + " simulations_ensemble_no_deposition.append( run_simulations(setting_dict) )" + ], + "id": "4574a44aa8f0bf8b", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=0.2 and n_sd=1000 and n_dv=749999999.9999999\n", + "0.5\n", + "Starting simulation...\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mKeyboardInterrupt\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[3]\u001B[39m\u001B[32m, line 13\u001B[39m\n\u001B[32m 4\u001B[39m \u001B[38;5;28;01mfor\u001B[39;00m updraft \u001B[38;5;129;01min\u001B[39;00m vertical_updrafts:\n\u001B[32m 5\u001B[39m setting_dict = {\n\u001B[32m 6\u001B[39m **standard,\n\u001B[32m 7\u001B[39m \u001B[33m\"\u001B[39m\u001B[33mw_updraft\u001B[39m\u001B[33m\"\u001B[39m: updraft * si.meter / si.second,\n\u001B[32m (...)\u001B[39m\u001B[32m 11\u001B[39m \u001B[33m\"\u001B[39m\u001B[33mcoalescence_enable\u001B[39m\u001B[33m\"\u001B[39m: \u001B[38;5;28;01mTrue\u001B[39;00m,\n\u001B[32m 12\u001B[39m }\n\u001B[32m---> \u001B[39m\u001B[32m13\u001B[39m simulations_ensemble_no_deposition.append( \u001B[43mrun_simulations\u001B[49m\u001B[43m(\u001B[49m\u001B[43msetting_dict\u001B[49m\u001B[43m)\u001B[49m )\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/examples/PySDM_examples/Luettmer_homogeneous_freezing/commons.py:26\u001B[39m, in \u001B[36mrun_simulations\u001B[39m\u001B[34m(setting)\u001B[39m\n\u001B[32m 24\u001B[39m model_setup.formulae.seed += \u001B[32m1\u001B[39m\n\u001B[32m 25\u001B[39m model = Simulation(model_setup)\n\u001B[32m---> \u001B[39m\u001B[32m26\u001B[39m simulation[\u001B[33m\"\u001B[39m\u001B[33mensemble_member_outputs\u001B[39m\u001B[33m\"\u001B[39m].append(\u001B[43mmodel\u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m)\n\u001B[32m 28\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m simulation\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/examples/PySDM_examples/Luettmer_homogeneous_freezing/simulation.py:173\u001B[39m, in \u001B[36mSimulation.run\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 170\u001B[39m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[32m 172\u001B[39m \u001B[38;5;28;01mfor\u001B[39;00m i \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mrange\u001B[39m(\u001B[38;5;28mself\u001B[39m.n_substeps):\n\u001B[32m--> \u001B[39m\u001B[32m173\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mparticulator\u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[32;43m1\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m 174\u001B[39m \u001B[38;5;66;03m# do_sedimenation_function:\u001B[39;00m\n\u001B[32m 175\u001B[39m \u001B[38;5;66;03m# for j in n_sd:\u001B[39;00m\n\u001B[32m 176\u001B[39m \u001B[38;5;66;03m# íf vt(j) > updraft: remove particle\u001B[39;00m\n\u001B[32m 177\u001B[39m \u001B[38;5;28mself\u001B[39m.save(output)\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/particulator.py:55\u001B[39m, in \u001B[36mParticulator.run\u001B[39m\u001B[34m(self, steps)\u001B[39m\n\u001B[32m 53\u001B[39m \u001B[38;5;28;01mfor\u001B[39;00m key, dynamic \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mself\u001B[39m.dynamics.items():\n\u001B[32m 54\u001B[39m \u001B[38;5;28;01mwith\u001B[39;00m \u001B[38;5;28mself\u001B[39m.timers[key]:\n\u001B[32m---> \u001B[39m\u001B[32m55\u001B[39m \u001B[43mdynamic\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 56\u001B[39m \u001B[38;5;28mself\u001B[39m.n_steps += \u001B[32m1\u001B[39m\n\u001B[32m 57\u001B[39m \u001B[38;5;28mself\u001B[39m._notify_observers()\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/dynamics/freezing.py:99\u001B[39m, in \u001B[36mFreezing.__call__\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 97\u001B[39m \u001B[38;5;28;01melif\u001B[39;00m \u001B[38;5;28mself\u001B[39m.homogeneous_freezing == \u001B[33m\"\u001B[39m\u001B[33mtime-dependent\u001B[39m\u001B[33m\"\u001B[39m:\n\u001B[32m 98\u001B[39m \u001B[38;5;28mself\u001B[39m.rand.urand(\u001B[38;5;28mself\u001B[39m.rng)\n\u001B[32m---> \u001B[39m\u001B[32m99\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mparticulator\u001B[49m\u001B[43m.\u001B[49m\u001B[43mhomogeneous_freezing_time_dependent\u001B[49m\u001B[43m(\u001B[49m\n\u001B[32m 100\u001B[39m \u001B[43m \u001B[49m\u001B[43mrand\u001B[49m\u001B[43m=\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mrand\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m 101\u001B[39m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 103\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m.thaw == \u001B[33m\"\u001B[39m\u001B[33minstantaneous\u001B[39m\u001B[33m\"\u001B[39m:\n\u001B[32m 104\u001B[39m \u001B[38;5;28mself\u001B[39m.particulator.thaw_instantaneous()\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/particulator.py:540\u001B[39m, in \u001B[36mParticulator.homogeneous_freezing_time_dependent\u001B[39m\u001B[34m(self, rand)\u001B[39m\n\u001B[32m 536\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mhomogeneous_freezing_time_dependent\u001B[39m(\u001B[38;5;28mself\u001B[39m, *, rand: Storage):\n\u001B[32m 537\u001B[39m \u001B[38;5;28mself\u001B[39m.backend.homogeneous_freezing_time_dependent(\n\u001B[32m 538\u001B[39m rand=rand,\n\u001B[32m 539\u001B[39m attributes=TimeDependentHomogeneousAttributes(\n\u001B[32m--> \u001B[39m\u001B[32m540\u001B[39m volume=\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mattributes\u001B[49m\u001B[43m[\u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[33;43mvolume\u001B[39;49m\u001B[33;43m\"\u001B[39;49m\u001B[43m]\u001B[49m,\n\u001B[32m 541\u001B[39m signed_water_mass=\u001B[38;5;28mself\u001B[39m.attributes[\u001B[33m\"\u001B[39m\u001B[33msigned water mass\u001B[39m\u001B[33m\"\u001B[39m],\n\u001B[32m 542\u001B[39m ),\n\u001B[32m 543\u001B[39m timestep=\u001B[38;5;28mself\u001B[39m.dt,\n\u001B[32m 544\u001B[39m cell=\u001B[38;5;28mself\u001B[39m.attributes[\u001B[33m\"\u001B[39m\u001B[33mcell id\u001B[39m\u001B[33m\"\u001B[39m],\n\u001B[32m 545\u001B[39m a_w_ice=\u001B[38;5;28mself\u001B[39m.environment[\u001B[33m\"\u001B[39m\u001B[33ma_w_ice\u001B[39m\u001B[33m\"\u001B[39m],\n\u001B[32m 546\u001B[39m temperature=\u001B[38;5;28mself\u001B[39m.environment[\u001B[33m\"\u001B[39m\u001B[33mT\u001B[39m\u001B[33m\"\u001B[39m],\n\u001B[32m 547\u001B[39m relative_humidity_ice=\u001B[38;5;28mself\u001B[39m.environment[\u001B[33m\"\u001B[39m\u001B[33mRH_ice\u001B[39m\u001B[33m\"\u001B[39m],\n\u001B[32m 548\u001B[39m )\n\u001B[32m 549\u001B[39m \u001B[38;5;28mself\u001B[39m.attributes.mark_updated(\u001B[33m\"\u001B[39m\u001B[33msigned water mass\u001B[39m\u001B[33m\"\u001B[39m)\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/impl/particle_attributes.py:93\u001B[39m, in \u001B[36mParticleAttributes.__getitem__\u001B[39m\u001B[34m(self, item)\u001B[39m\n\u001B[32m 92\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34m__getitem__\u001B[39m(\u001B[38;5;28mself\u001B[39m, item):\n\u001B[32m---> \u001B[39m\u001B[32m93\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43m__attributes\u001B[49m\u001B[43m[\u001B[49m\u001B[43mitem\u001B[49m\u001B[43m]\u001B[49m\u001B[43m.\u001B[49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/attributes/impl/attribute.py:32\u001B[39m, in \u001B[36mAttribute.get\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 31\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mget\u001B[39m(\u001B[38;5;28mself\u001B[39m):\n\u001B[32m---> \u001B[39m\u001B[32m32\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mupdate\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 33\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m.data\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/attributes/impl/derived_attribute.py:23\u001B[39m, in \u001B[36mDerivedAttribute.update\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 21\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m.timestamp < dependencies_timestamp:\n\u001B[32m 22\u001B[39m \u001B[38;5;28mself\u001B[39m.timestamp = dependencies_timestamp\n\u001B[32m---> \u001B[39m\u001B[32m23\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mrecalculate\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/attributes/physics/volume.py:17\u001B[39m, in \u001B[36mVolume.recalculate\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 16\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mrecalculate\u001B[39m(\u001B[38;5;28mself\u001B[39m):\n\u001B[32m---> \u001B[39m\u001B[32m17\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mparticulator\u001B[49m\u001B[43m.\u001B[49m\u001B[43mbackend\u001B[49m\u001B[43m.\u001B[49m\u001B[43mvolume_of_water_mass\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mdata\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mwater_mass\u001B[49m\u001B[43m.\u001B[49m\u001B[43mget\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/python/PySDM/PySDM/backends/impl_numba/methods/physics_methods.py:119\u001B[39m, in \u001B[36mPhysicsMethods.volume_of_water_mass\u001B[39m\u001B[34m(self, volume, mass)\u001B[39m\n\u001B[32m 118\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mvolume_of_water_mass\u001B[39m(\u001B[38;5;28mself\u001B[39m, volume, mass):\n\u001B[32m--> \u001B[39m\u001B[32m119\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43m_volume_of_mass_body\u001B[49m\u001B[43m(\u001B[49m\u001B[43mvolume\u001B[49m\u001B[43m.\u001B[49m\u001B[43mdata\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmass\u001B[49m\u001B[43m.\u001B[49m\u001B[43mdata\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[31mKeyboardInterrupt\u001B[39m: " + ] + } + ], + "execution_count": 3 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "ca3dff61011a9506" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing_with_deposition.ipynb b/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing_with_deposition.ipynb new file mode 100644 index 000000000..05051bce5 --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/hom_freezing_with_deposition.ipynb @@ -0,0 +1,1032 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-29T02:31:22.166432Z", + "start_time": "2025-09-29T02:30:58.759493Z" + } + }, + "source": [ + "import numpy as np\n", + "from PySDM.physics.constants import si\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.commons import run_simulations, hom_pure_droplet_freezing_backend, hom_pure_droplet_freezing_standard_setup\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.simulation import Simulation\n", + "from PySDM_examples.Luettmer_homogeneous_freezing.settings import Settings\n", + "from PySDM_examples.Luettmer_homogeneous_freezing import plot\n", + "from importlib import reload\n", + "from matplotlib import pyplot\n", + "from open_atmos_jupyter_utils import show_plot" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T13:39:44.732670Z", + "start_time": "2025-09-24T13:39:44.048662Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" General settings \"\"\"\n", + "hom_freezing_types = [ \"KoopMurray2016\", \"Spichtinger2023\" ]\n", + "hom_freezing_types_all = [ \"KoopMurray2016\", \"Spichtinger2023\", \"Koop2000\" ]\n", + "vertical_updrafts = np.geomspace(0.2,10,num=9) * si.meter / si.second\n", + "\n", + "backends = hom_pure_droplet_freezing_backend()\n", + "standard = hom_pure_droplet_freezing_standard_setup()" + ], + "id": "e567ea5dc9abaf7d", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T13:36:09.312612098Z", + "start_time": "2025-09-17T11:59:13.164154Z" + } + }, + "cell_type": "code", + "source": [ + "setting_dict = {\n", + " **standard,\n", + " \"backend\": backends[\"KoopMurray2016\"],\n", + " \"hom_freezing\": \"KoopMurray2016\",\n", + " \"w_updraft\": 10.,\n", + " \"deposition_enable\": True,\n", + " \"n_output\": 1,\n", + " \"n_sd\": int(1e4),\n", + " }\n", + "reference_high_dep_KoopMurray2016_simulation = run_simulations(setting_dict)\n", + "setting_dict = {\n", + " **standard,\n", + " \"backend\": backends[\"Spichtinger2023\"],\n", + " \"hom_freezing\": \"Spichtinger2023\",\n", + " \"w_updraft\": 10.,\n", + " \"deposition_enable\": True,\n", + " \"n_output\": 1,\n", + " \"n_sd\": int(1e4),\n", + " }\n", + "reference_high_dep_Spichtinger2023_simulation = run_simulations(setting_dict)" + ], + "id": "a7fedd700b66e5f", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=10.0 and n_sd=10000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=10.0 and n_sd=10000 and n_dv=4999999999.999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T13:38:06.344883884Z", + "start_time": "2025-09-17T12:12:40.964422Z" + } + }, + "cell_type": "code", + "source": [ + "plot.plot_thermodynamics_and_bulk(reference_high_dep_KoopMurray2016_simulation, \" with vapor deposition\")\n", + "show_plot(\"fig_KM16_high_w_dep\")\n", + "plot.plot_thermodynamics_and_bulk(reference_high_dep_Spichtinger2023_simulation, \" with vapor deposition\")\n", + "show_plot(\"fig_SP23_high_w_dep\")" + ], + "id": "c661ea3f9edfa2e7", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-17T14:12:44.817509\n image/svg+xml\n \n \n Matplotlib v3.10.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./fig_KM16_high_w_dep.pdf" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-17T14:12:49.721954\n image/svg+xml\n \n \n Matplotlib v3.10.1, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./fig_SP23_high_w_dep.pdf" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T08:17:45.460019\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./n_sd_100.0_ensembl…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "da2a2af4d34846fdaeab630ca666cd34" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T08:17:49.699415\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./n_sd_1000.0_ensem…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "09c9ccf71d964f9e87b930cef74d4720" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T08:17:52.614908\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./n_sd_10000.0_ens…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "30ece0a8acca4f33b1cf32f64cefb7ae" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 15 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T17:19:10.141356Z", + "start_time": "2025-09-24T15:02:02.998734Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Simulations for updraft histogram with deposition \"\"\"\n", + "simulations_updraft_ensemble = []\n", + "\n", + "for hom_freezing_type in hom_freezing_types:\n", + " for updraft in vertical_updrafts:\n", + " setting_dict = {\n", + " **standard,\n", + " \"w_updraft\": updraft * si.meter / si.second,\n", + " \"n_sd\": int(1e4),\n", + " \"backend\": backends[hom_freezing_type],\n", + " \"hom_freezing\": hom_freezing_type,\n", + " \"number_of_ensemble_runs\": 1,\n", + " }\n", + "\n", + " simulations_updraft_ensemble.append( run_simulations(setting_dict) )" + ], + "id": "93d3f3f886290b", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=0.2 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=0.32613788179066194 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=0.5318295896944989 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=0.8672488792828036 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.4142135623730951 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=2.306143078159937 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=3.760603093086394 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=6.132375635173039 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=10.0 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.2 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.32613788179066194 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.5318295896944989 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=0.8672488792828036 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.4142135623730951 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=2.306143078159937 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=3.760603093086394 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=6.132375635173039 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=10.0 and n_sd=10000 and n_dv=749999999.9999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T17:19:16.908008Z", + "start_time": "2025-09-24T17:19:10.439950Z" + } + }, + "cell_type": "code", + "source": [ + "for hom_freezing_type in hom_freezing_types:\n", + "\n", + " histogram_data_dict = {}\n", + "\n", + " histogram_data_dict[\"hom_freezing_type\"] = hom_freezing_type\n", + " histogram_data_dict[\"T_frz_histogram_list\"] = []\n", + " histogram_data_dict[\"w_updraft_histogram_list\"] = []\n", + "\n", + " for i, updraft in enumerate(vertical_updrafts):\n", + " for simulation in simulations_updraft_ensemble:\n", + " if (simulation[\"settings\"][\"w_updraft\"] == updraft\n", + " and simulation[\"settings\"][\"hom_freezing\"] == hom_freezing_type):\n", + " output = simulation[\"ensemble_member_outputs\"][0]\n", + " T_frz = output[\"T_frz\"]\n", + " histogram_data_dict[\"T_frz_histogram_list\"].extend( T_frz )\n", + " histogram_data_dict[\"w_updraft_histogram_list\"].extend( np.full_like(T_frz, updraft) )\n", + "\n", + " plot.plot_freezing_temperatures_2d_histogram_seaborn(histogram_data_dict, title_add=\" with vapor deposition\")\n", + " show_plot(hom_freezing_type+\"_updraft_ensemble_deposition\")" + ], + "id": "93a76944f19bfcb1", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T02:19:13.334223\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./KoopMu…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "fb405ac5394748db983cd262ee6927ce" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T02:19:16.721042\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Spich…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "de5ea028bb9b43c0b52330a7665bde77" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T23:23:34.350554Z", + "start_time": "2025-09-24T23:23:28.921260Z" + } + }, + "cell_type": "code", + "source": [ + "for var_name in [\"ni\",\"freezing_fraction\"]:\n", + " plot.plot_ensemble_bulk(simulations_updraft_ensemble, var_name, (vertical_updrafts, \"w_updraft\"), hom_freezing_types, title_add=\" with vapor deposition\")\n", + " show_plot(\"w_ensemble_with_deposition_\"+var_name)" + ], + "id": "dffa5cba9fb189e6", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T08:23:32.073770\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./w_ensemble_with_dep…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "c5d0ff86c58c4947bb4c432fe2476828" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T08:23:34.178374\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./w_en…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "38074c5a6020434b99fd887ead6e8a6a" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 16 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T19:37:53.558927Z", + "start_time": "2025-09-24T17:19:21.621075Z" + } + }, + "cell_type": "code", + "source": [ + "\"\"\" Simulations for CCN concentration histogram \"\"\"\n", + "simulations_ccn_concentration_ensemble = []\n", + "number_concentrations = np.geomspace(100, 20000, num=10) / si.cm ** 3\n", + "\n", + "for hom_freezing_type in hom_freezing_types:\n", + " for n_dv in number_concentrations:\n", + " setting_dict = {\n", + " **standard,\n", + " \"n_sd\": int(1e4),\n", + " \"N_dv_droplet_distribution\": n_dv,\n", + " \"backend\": backends[hom_freezing_type],\n", + " \"hom_freezing\": hom_freezing_type,\n", + " }\n", + " simulations_ccn_concentration_ensemble.append(run_simulations(setting_dict))" + ], + "id": "a2ece44e2e802c0c", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=99999999.99999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=180164823.06544116\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=324593634.7020169\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=584803547.6425728\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=1053610276.8906642\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=1898235091.1593704\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=3419951893.3533926\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=6161550277.583339\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=11100946155.696224\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for KoopMurray2016 with wpdraft=1.0 and n_sd=10000 and n_dv=19999999999.999996\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=99999999.99999999\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=180164823.06544116\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=324593634.7020169\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=584803547.6425728\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=1053610276.8906642\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=1898235091.1593704\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=3419951893.3533926\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=6161550277.583339\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=11100946155.696224\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n", + "Setting up simulation for Spichtinger2023 with wpdraft=1.0 and n_sd=10000 and n_dv=19999999999.999996\n", + "Starting simulation...\n", + "all particles frozen or evaporated\n" + ] + } + ], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T19:38:02.225019Z", + "start_time": "2025-09-24T19:37:53.807715Z" + } + }, + "cell_type": "code", + "source": [ + "for hom_freezing_type in hom_freezing_types:\n", + "\n", + " histogram_data_ccn_concentration_ensemble = {}\n", + " histogram_data_ccn_concentration_ensemble[\"hom_freezing_type\"] = hom_freezing_type\n", + "\n", + " histogram_data_ccn_concentration_ensemble[\"T_frz_histogram_list\"] = []\n", + " histogram_data_ccn_concentration_ensemble[\"n_ccn_histogram_list\"] = []\n", + " histogram_data_ccn_concentration_ensemble[\"rc_max_histogram_list\"] = []\n", + "\n", + " for n_ccn in number_concentrations:\n", + " for simulation in simulations_ccn_concentration_ensemble:\n", + " if (simulation[\"settings\"][\"hom_freezing\"] == hom_freezing_type\n", + " and simulation[\"settings\"][\"N_dv_droplet_distribution\"] == n_ccn):\n", + " output = simulation[\"ensemble_member_outputs\"][0]\n", + " T_frz = np.asarray(output[\"T_frz\"])\n", + " rc = np.asarray(output[\"rs\"])\n", + " histogram_data_ccn_concentration_ensemble[\"T_frz_histogram_list\"].extend( T_frz )\n", + " histogram_data_ccn_concentration_ensemble[\"n_ccn_histogram_list\"].extend( np.full_like(T_frz, n_ccn) )\n", + " histogram_data_ccn_concentration_ensemble[\"rc_max_histogram_list\"].extend( np.full_like(T_frz, np.amax(rc)) )\n", + "\n", + " plot.plot_freezing_temperatures_2d_histogram_seaborn(histogram_data_ccn_concentration_ensemble, title_add=\" with vapor deposition\")\n", + " show_plot(hom_freezing_type+\"_ccn_ensemble_deposition\")\n", + " del histogram_data_ccn_concentration_ensemble[\"n_ccn_histogram_list\"]\n", + " plot.plot_freezing_temperatures_2d_histogram_seaborn(histogram_data_ccn_concentration_ensemble, title_add=\" with vapor deposition\")\n", + " show_plot(hom_freezing_type+\"_radius_ensemble_deposition\")" + ], + "id": "332bd1dcfbdd531f", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T04:37:55.931036\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./KoopMurray…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "aa25fecbcdad47fd8723eb371a6e5bba" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T04:37:57.856922\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./KoopMur…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "f7835cd3cc9f4e36a317b016687e83ad" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T04:38:00.136878\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Spichting…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "a3cb3722ba2a481688eb99cf02854a80" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T04:38:02.086149\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Spicht…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "5fef68b1062c4d7da4f3af093ff94da4" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 9 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-09-24T23:27:02.147968Z", + "start_time": "2025-09-24T23:26:56.630617Z" + } + }, + "cell_type": "code", + "source": [ + "for var_name in [\"ni\",\"freezing_fraction\"]:\n", + " plot.plot_ensemble_bulk(simulations_ccn_concentration_ensemble, var_name, (number_concentrations, \"N_dv_droplet_distribution\"), hom_freezing_types)\n", + " show_plot(\"ccn_ensemble_with_deposition_\"+var_name)" + ], + "id": "1655c74e1492ff5", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T08:26:59.222105\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./ccn_ensemble_with…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "c4982ccd5a2646b4a160fe49181d754c" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-09-25T08:27:01.827199\n image/svg+xml\n \n \n Matplotlib v3.10.6, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./cc…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "bc60d3553e2c4b3ab12d971aa9e4c530" + } + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 23 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/plot.py b/examples/PySDM_examples/Luettmer_homogeneous_freezing/plot.py new file mode 100644 index 000000000..5bfcba3e0 --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/plot.py @@ -0,0 +1,351 @@ +import matplotlib.pyplot as plt +from matplotlib import pyplot +import numpy as np +from scipy.ndimage import histogram +import seaborn as sns + +from PySDM import Formulae + +formulae = Formulae( + particle_shape_and_density="MixedPhaseSpheres", +) + +# general plot settings +ax_lab_fsize = 15 +tick_fsize = 15 +# title_fsize = 15 +# line_width = 2.5 +T_frz_bins = np.linspace(-40, -34, num=60, endpoint=True) +T_frz_bins_kelvin = np.linspace(230, 240, num=100, endpoint=True) + + +def plot_thermodynamics_and_bulk(simulation, title_add="", show_conc=False): + + output = simulation["ensemble_member_outputs"][0] + time = output["t"] + T = np.asarray(output["T"]) + RH = np.asarray(output["RH"]) + RHi = np.asarray(output["RHi"]) + qc = np.asarray(output["LWC"]) + qi = np.asarray(output["IWC"]) + qv = np.asarray(output["qv"]) + qt = qc + qv + qi + rc = np.asarray(output["rs"]) + ri = np.asarray(output["ri"]) + if show_conc: + nc = np.asarray(output["ns"]) + ni = np.asarray(output["ni"]) + + svp = Formulae( + saturation_vapour_pressure="FlatauWalkoCotton" + ).saturation_vapour_pressure + a_w_ice = svp.pvs_ice(T) / svp.pvs_water(T) + d_a_w_ice = (RHi / 100 - 1) * a_w_ice + + j_hom_rate = Formulae( + homogeneous_ice_nucleation_rate="Koop2000" + ).homogeneous_ice_nucleation_rate + koop_2000 = j_hom_rate.j_hom(T, d_a_w_ice) + j_hom_rate = Formulae( + homogeneous_ice_nucleation_rate="KoopMurray2016" + ).homogeneous_ice_nucleation_rate + koop_murray_2016 = j_hom_rate.j_hom(T, d_a_w_ice) + j_hom_rate = Formulae( + homogeneous_ice_nucleation_rate="Koop_Correction" + ).homogeneous_ice_nucleation_rate + spichtinger_2023 = j_hom_rate.j_hom(T, d_a_w_ice) + + fig, axs = pyplot.subplots( + 2, 2, figsize=(10, 10), sharex=False, constrained_layout=True + ) + + title = ( + "Freezing: " + + simulation["settings"]["hom_freezing"] + + " n_sd: " + + str(simulation["settings"]["n_sd"]) + + " w: " + + str(simulation["settings"]["w_updraft"]) + + r" $\mathrm{m \, s^{-1}}$" + + title_add + ) + fig.suptitle(title, fontsize=16) + + """ Temperture profile """ + ax = axs[0, 0] + ax.plot(time, formulae.trivia.K2C(T), color="black", linestyle="-", label="T") + ax.set_xlabel("time [s]", fontsize=ax_lab_fsize) + ax.set_ylabel("temperature [°C]", fontsize=ax_lab_fsize) + ax.legend(loc="upper left", fontsize=ax_lab_fsize) + ax.tick_params(labelsize=tick_fsize) + + twin = ax.twinx() + twin.plot(time, RH, color="red", linestyle="-", label=r"$S_{w}$") + twin.plot(time, RHi, color="blue", linestyle="-", label=r"$S_{i}$") + twin.set_ylabel("relative humidity [%]", fontsize=ax_lab_fsize) + twin.legend(loc="center right", fontsize=ax_lab_fsize) + twin.tick_params(labelsize=tick_fsize) + twin.grid(visible=True) + + """ Water activity difference profile """ + lin_s_SP2023 = "--" + lin_s_KM2016 = "-" + if simulation["settings"]["hom_freezing"] == "Spichtinger2023": + lin_s_SP2023 = "-" + lin_s_KM2016 = "--" + ax = axs[0, 1] + # ax.plot(time, koop_2000, color="black", linestyle="-", label="Koop2000") + ax.plot( + time, + koop_murray_2016, + color="blue", + linestyle=lin_s_KM2016, + label="KoopMurray2016", + ) + ax.plot( + time, + spichtinger_2023, + color="red", + linestyle=lin_s_SP2023, + label="Spichtinger2023", + ) + ax.set_xlabel("time [s]", fontsize=ax_lab_fsize) + ax.set_ylabel( + r"nucleation rate [$\mathrm{m^{-3} \, s^{-1}}$]", fontsize=ax_lab_fsize + ) + ax.legend(loc="upper left", fontsize=ax_lab_fsize) + ax.set_ylim(1e-30, 1e30) + ax.set_yscale("log") + ax.tick_params(labelsize=tick_fsize) + ax.grid(visible=True) + twin = ax.twinx() + twin.plot(time, d_a_w_ice, color="gray", linestyle="-", label=r"$\Delta a_{w}$") + twin.set_ylim(0.2, 0.35) + twin.set_ylabel("water activity difference", fontsize=ax_lab_fsize) + twin.tick_params(labelsize=tick_fsize) + twin.legend(loc="lower right", fontsize=ax_lab_fsize) + + """ Mass content and number concentration""" + ax = axs[1, 0] + ax.plot(time, qc, color="red", linestyle="-", label="water") + ax.plot(time, qi, color="blue", linestyle="-", label="ice") + ax.plot(time, qv, color="black", linestyle="-", label="vapor") + ax.plot(time, qt, color="black", linestyle="dotted", label="total") + ax.set_yscale("log") + ax.set_ylim(1e-5, 1e-2) + ax.set_xlabel("time [s]", fontsize=ax_lab_fsize) + ax.set_ylabel(r"mass content [$\mathrm{kg \, kg^{-1}}$]", fontsize=ax_lab_fsize) + ax.legend(fontsize=ax_lab_fsize) + ax.tick_params(labelsize=tick_fsize) + ax.grid(visible=True) + + if show_conc: + twin = ax.twinx() + twin.plot(time, nc, color="red", linestyle="--", label="water") + twin.plot(time, ni, color="blue", linestyle="--", label="ice") + twin.set_yscale("log") + twin.set_xlabel("time [s]", fontsize=ax_lab_fsize) + twin.set_ylabel( + r"number concentration [$\mathrm{kg^{-1}}$]", fontsize=ax_lab_fsize + ) + twin.tick_params(labelsize=tick_fsize) + + """ Mean radius """ + ax = axs[1, 1] + ax.plot(time, rc * 1e6, color="red", linestyle="-", label="water") + ax.plot(time, ri * 1e6, color="blue", linestyle="-", label="ice") + ax.set_yscale("log") + ax.set_ylim(1e-2, 1e2) + ax.set_xlabel("time [s]", fontsize=ax_lab_fsize) + ax.set_ylabel("mean radius [µm]", fontsize=ax_lab_fsize) + ax.legend(fontsize=ax_lab_fsize) + ax.tick_params(labelsize=tick_fsize) + ax.grid(visible=True) + + +def plot_freezing_temperatures_histogram(ax, simulation): + + number_of_ensemble_runs = simulation["settings"]["number_of_ensemble_runs"] + + for i in range(number_of_ensemble_runs): + output = simulation["ensemble_member_outputs"][i] + T_frz = np.asarray(output["T_frz"]) + + title = "Nucleation rate=" + simulation["settings"]["hom_freezing"] + + """ Freezing temperatures """ + hist = ax.hist( + # formulae.trivia.K2C(T_frz), + T_frz, + # bins=T_frz_bins, + bins=T_frz_bins_kelvin, + density=True, + cumulative=-1, + alpha=1.0, + histtype="step", + linewidth=1.5, + ) + + ax.set_xlim(left=234, right=239) + ax.axvline(x=235, color="k", linestyle="--") + ax.set_title(title, fontsize=ax_lab_fsize) + ax.set_xlabel("freezing temperature [K]", fontsize=ax_lab_fsize) + ax.set_ylabel("frequency", fontsize=ax_lab_fsize) + ax.tick_params(labelsize=tick_fsize) + + return ax + + +def plot_freezing_temperatures_2d_histogram(histogram_data_dict): + + vertical_updrafts_bins = np.geomspace(0.05, 15, num=6, endpoint=True) + + hom_freezing_types = histogram_data_dict.keys() + + fig, axs = pyplot.subplots(2, 2, figsize=(10, 10), constrained_layout=True) + axs = axs.ravel() + i = 0 + for hom_freezing_type in hom_freezing_types: + + title = "Freezing method=" + hom_freezing_type + + ax = axs[i] + T_frz = formulae.trivia.K2C( + np.asarray(histogram_data_dict[hom_freezing_type]["T_frz_histogram_list"]) + ) + + hist, x, y = np.histogram2d( + T_frz, + histogram_data_dict[hom_freezing_type]["w_updraft_histogram_list"], + bins=(T_frz_bins, vertical_updrafts_bins), + ) + y = np.log10(y) + X, Y = np.meshgrid(x, y) + + hist = hist.T / sum(hist.flatten()) + + c = ax.pcolor(X, Y, hist) + fig.colorbar(c, ax=ax) + + ax.set_title(title, fontsize=ax_lab_fsize) + ax.set_xlabel("freezing temperature [°C]", fontsize=ax_lab_fsize) + ax.set_ylabel("vertical updraft [m/s]", fontsize=ax_lab_fsize) + + i += 1 + + +def plot_freezing_temperatures_2d_histogram_seaborn(histogram_data_dict, title_add=""): + + # hom_freezing_types = ["KoopMurray2016", "Koop_Correction", "Koop2000"] + sns.set_theme(style="ticks") + + hom_freezing_type = histogram_data_dict["hom_freezing_type"] + # for i, hom_freezing_type in enumerate(hom_freezing_types): + + # T_frz = formulae.trivia.K2C( + # (np.asarray(histogram_data_dict["T_frz_histogram_list"])) + # ) + T_frz = np.asarray(histogram_data_dict["T_frz_histogram_list"]) + + if "w_updraft_histogram_list" in histogram_data_dict: + w = histogram_data_dict["w_updraft_histogram_list"] + y_label = r"vertical updraft [$\mathrm{m \, s^{-1}}$]" + elif "n_ccn_histogram_list" in histogram_data_dict: + w = histogram_data_dict["n_ccn_histogram_list"] + y_label = r"ccn concentration [$\mathrm{m^{-3}}$]" + elif "rc_max_histogram_list" in histogram_data_dict: + w = np.asarray(histogram_data_dict["rc_max_histogram_list"]) * 1e6 + y_label = "(maximum) radius [µm]" + + # xlim = (-39.5, -34) + xlim = (233, 241) + h = sns.JointGrid( + x=T_frz, + y=w, + xlim=xlim, + ) + h.ax_joint.set(yscale="log") + # if hom_freezing_type == "KoopMurray2016": + # x_pos_cbar = 0.75 + # else: + x_pos_cbar = 0.75 + cax = h.figure.add_axes([x_pos_cbar, 0.55, 0.02, 0.2]) + h.plot_joint( + sns.histplot, + stat="density", + binwidth=0.25, + discrete=(False, False), + pmax=0.8, + cbar=True, + cbar_ax=cax, + ) + + h.plot_marginals( + sns.histplot, + element="step", + ) + h.set_axis_labels("freezing temperature [K]", y_label, fontsize=ax_lab_fsize) + h.ax_joint.set_title( + "Freezing: " + hom_freezing_type + title_add, + pad=70, + fontsize=ax_lab_fsize, + ) + h.ax_marg_y.remove() + + return h + + +def plot_ensemble_bulk( + simulations, var_name, ensemble_var, freezing_types, title_add="" +): + + ens_var, ens_var_name = ensemble_var + len_ens_var = len(ens_var) + + for hom_freezing_type in freezing_types: + var = np.zeros(len_ens_var) + for i in range(len_ens_var): + for simulation in simulations: + if ( + simulation["settings"]["hom_freezing"] == hom_freezing_type + and simulation["settings"][ens_var_name] == ens_var[i] + ): + output = simulation["ensemble_member_outputs"][0] + if var_name == "freezing_fraction": + ni = np.asarray(output["ni"])[-1] + nc = np.asarray(output["ns"])[0] + var[i] = (1 - (nc - ni) / nc) * 100 + # print("{:.2E}".format(nc),"{:.2E}".format(ni), var[i]) + # quit() + else: + var[i] = np.asarray(output[var_name])[-1] + + pyplot.scatter(var, ens_var, label=hom_freezing_type) + + if var_name == "ni": + pyplot.xscale("log") + x_label = r"$n_{i} \, [\mathrm{kg^{-1}}$]" + title = "Ice number concentrations" + pyplot.xlim(1e6, 1e10) + + if var_name == "IWC": + pyplot.xscale("log") + x_label = r"mass content [$\mathrm{kg \, kg^{-1}}$]" + title = "Ice mass content" + + if var_name == "freezing_fraction": + title = "frozen fraction of real droplets " + x_label = r"$n_{frz} \, [\mathrm{\%}$]" + + if ens_var_name == "N_dv_droplet_distribution": + pyplot.yscale("log") + y_label = r"$n_{ccn} \, [\mathrm{m^{-3}}$]" + + if ens_var_name == "w_updraft": + pyplot.yscale("log") + y_label = r"w [$\mathrm{m \, s^{-1}}$]" + + pyplot.title(title + title_add, fontsize=ax_lab_fsize) + pyplot.xlabel(x_label, fontsize=ax_lab_fsize) + pyplot.ylabel(y_label, fontsize=ax_lab_fsize) + pyplot.legend(fontsize=ax_lab_fsize) diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/settings.py b/examples/PySDM_examples/Luettmer_homogeneous_freezing/settings.py new file mode 100644 index 000000000..d41cebda7 --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/settings.py @@ -0,0 +1,122 @@ +import time + +import numpy as np +from pystrict import strict + +from PySDM import Formulae +from PySDM.physics.constants import si +from PySDM.initialisation.spectra import Lognormal +from PySDM.initialisation.sampling import spectral_sampling +from tests.unit_tests.backends.test_oxidation import formulae +from PySDM.dynamics.collisions.collision_kernels import Golovin, Geometric + + +class Settings: + def __init__( + self, + *, + hom_freezing: str, + n_sd: int, + w_updraft: float, + T0: float, + dz: float, + N_dv_droplet_distribution: float, + r_mean_droplet_distribution: float, + sigma_droplet_distribution: float = None, + type_droplet_distribution: str, + p0: float = 200 * si.hectopascals, + RH_0: float = 1.0, + kappa: float = 0.64, + condensation_enable: bool = True, + deposition_enable: bool = True, + coalescence_enable: bool = False, + deposition_adaptive: bool = True, + n_output: int = 30, + backend=None, + scipy_solver=False, + number_of_ensemble_runs: None, + ): + self.backend = backend + print( + "Setting up simulation for " + + hom_freezing + + " with wpdraft=" + + str(w_updraft) + + " and n_sd=" + + str(n_sd) + + " and n_dv=" + + str(N_dv_droplet_distribution) + ) + self.n_sd = n_sd + self.w_updraft = w_updraft + self.N_dv_droplet_distribution = N_dv_droplet_distribution + self.r_mean_droplet_distribution = r_mean_droplet_distribution + self.sigma_droplet_distribution = sigma_droplet_distribution + self.type_droplet_distribution = type_droplet_distribution + + self.mass_of_dry_air = 1000 * si.kilogram + self.initial_pressure = p0 + self.initial_water_supersaturation = RH_0 + # self.initial_ice_supersaturation = RHi_0 + self.kappa = kappa + self.initial_temperature = T0 + + self.condensation_enable = condensation_enable + self.coalescence_enable = coalescence_enable + self.deposition_enable = deposition_enable + self.deposition_adaptive = deposition_adaptive + self.scipy_solver = scipy_solver + self.collision_kernel = Geometric() + + if hom_freezing == "threshold": + self.hom_freezing_type = "threshold" + else: + self.hom_freezing_type = "time-dependent" + + self.formulae = backend.formulae + + const = self.formulae.constants + pvs_w = self.formulae.saturation_vapour_pressure.pvs_water( + self.initial_temperature + ) + self.initial_water_vapour_mixing_ratio = const.eps / ( + self.initial_pressure / self.initial_water_supersaturation / pvs_w - 1 + ) + + dry_air_density = ( + self.formulae.trivia.p_d( + self.initial_pressure, self.initial_water_vapour_mixing_ratio + ) + / self.initial_temperature + / const.Rd + ) + + if self.type_droplet_distribution == ("monodisperse"): + self.r_wet = np.ones(self.n_sd) * r_mean_droplet_distribution + self.specific_concentration = ( + np.ones(self.n_sd) + * N_dv_droplet_distribution + / self.n_sd + / dry_air_density + ) + if coalescence_enable: # do lucky droplet method + v_small = self.formulae.trivia.volume( + radius=r_mean_droplet_distribution + ) + self.r_wet[0 : int(self.n_sd * 0.1)] = self.formulae.trivia.radius( + volume=2 * v_small + ) + elif self.type_droplet_distribution == ("lognormal"): + spectrum = Lognormal( + norm_factor=N_dv_droplet_distribution / dry_air_density, + m_mode=r_mean_droplet_distribution, + s_geom=sigma_droplet_distribution, + ) + self.r_wet, self.specific_concentration = spectral_sampling.Linear( + spectrum + ).sample(n_sd) + + self.dz = dz + self.t_max_duration = 10000 + self.dt = dz / self.w_updraft + self.n_output = n_output diff --git a/examples/PySDM_examples/Luettmer_homogeneous_freezing/simulation.py b/examples/PySDM_examples/Luettmer_homogeneous_freezing/simulation.py new file mode 100644 index 000000000..7785e57b3 --- /dev/null +++ b/examples/PySDM_examples/Luettmer_homogeneous_freezing/simulation.py @@ -0,0 +1,201 @@ +import numpy as np +import warnings +import PySDM.products as PySDM_products +from PySDM.backends import CPU +from PySDM.builder import Builder +from PySDM.dynamics import ( + AmbientThermodynamics, + Condensation, + Freezing, + VapourDepositionOnIce, + Coalescence, +) +from PySDM.environments import Parcel +from PySDM.initialisation import discretise_multiplicities +from PySDM.initialisation.hygroscopic_equilibrium import equilibrate_dry_radii +from PySDM.backends.impl_numba.test_helpers import scipy_ode_condensation_solver + + +class Simulation: + def __init__(self, settings, backend=CPU): + + dt = settings.dt + + formulae = settings.formulae + + env = Parcel( + mixed_phase=True, + dt=dt, + mass_of_dry_air=settings.mass_of_dry_air, + p0=settings.initial_pressure, + initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio, + T0=settings.initial_temperature, + w=settings.w_updraft, + ) + + builder = Builder( + backend=settings.backend, + n_sd=settings.n_sd, + environment=env, + ) + + builder.add_dynamic(AmbientThermodynamics()) + if settings.condensation_enable: + builder.add_dynamic(Condensation(adaptive=True)) + if settings.coalescence_enable: + builder.add_dynamic( + Coalescence(collision_kernel=settings.collision_kernel, adaptive=False) + ) + if settings.deposition_enable: + builder.add_dynamic( + VapourDepositionOnIce(adaptive=settings.deposition_adaptive) + ) + builder.add_dynamic( + Freezing( + homogeneous_freezing=settings.hom_freezing_type, immersion_freezing=None + ) + ) + + self.n_sd = settings.n_sd + self.multiplicities = discretise_multiplicities( + settings.specific_concentration * env.mass_of_dry_air + ) + # self.r_dry = settings.r_dry + self.r_wet = settings.r_wet + + kappa = np.full_like(settings.r_wet, settings.kappa) + + self.r_dry = equilibrate_dry_radii( + r_wet=self.r_wet, + environment=builder.particulator.environment, + kappa=kappa, + ) + v_dry = settings.formulae.trivia.volume(radius=self.r_dry) + self.initial_mass = formulae.particle_shape_and_density.radius_to_mass( + self.r_wet + ) + + attributes = { + "multiplicity": self.multiplicities, + "dry volume": v_dry, + "kappa times dry volume": kappa * v_dry, + "signed water mass": self.initial_mass, + } + builder.request_attribute("temperature of last freezing") + builder.request_attribute("radius") + + products = [ + PySDM_products.ParcelDisplacement(name="z"), + PySDM_products.Time(name="t"), + PySDM_products.AmbientRelativeHumidity(name="RH", unit="%"), + PySDM_products.AmbientRelativeHumidity(name="RH_ice", unit="%"), + PySDM_products.AmbientTemperature(name="T"), + PySDM_products.AmbientPressure(name="p", unit="hPa"), + PySDM_products.WaterMixingRatio(name="water", radius_range=(0, np.inf)), + PySDM_products.WaterMixingRatio(name="ice", radius_range=(-np.inf, 0)), + PySDM_products.WaterMixingRatio( + name="total", radius_range=(-np.inf, np.inf) + ), + PySDM_products.AmbientWaterVapourMixingRatio( + name="vapour", var="water_vapour_mixing_ratio" + ), + PySDM_products.ParticleSpecificConcentration( + name="n_s", radius_range=(0, np.inf), unit="kg^-1" + ), + PySDM_products.ParticleSpecificConcentration( + name="n_i", radius_range=(-np.inf, 0), unit="kg^-1" + ), + PySDM_products.MeanRadius(name="r_s", radius_range=(0, np.inf)), + PySDM_products.MeanRadius(name="r_i", radius_range=(-np.inf, 0)), + ] + + self.particulator = builder.build(attributes, products) + if settings.scipy_solver: + scipy_ode_condensation_solver.patch_particulator(self.particulator) + + self.n_output = settings.n_output + if settings.n_output == 1: + self.n_substeps = 1 + else: + self.n_substeps = int(self.n_output / dt) + self.t_max_duration = settings.t_max_duration + + def save(self, output): + cell_id = 0 + + output["z"].append(self.particulator.products["z"].get()[cell_id]) + output["t"].append(self.particulator.products["t"].get()) + output["RH"].append(self.particulator.products["RH"].get()[cell_id]) + output["RHi"].append(self.particulator.products["RH_ice"].get()[cell_id]) + output["T"].append(self.particulator.products["T"].get()[cell_id]) + output["P"].append(self.particulator.products["p"].get()[cell_id]) + output["LWC"].append(self.particulator.products["water"].get()[cell_id]) + output["IWC"].append(self.particulator.products["ice"].get()[cell_id]) + output["qv"].append(self.particulator.products["vapour"].get()[cell_id]) + output["ns"].append(self.particulator.products["n_s"].get()[cell_id]) + output["ni"].append(self.particulator.products["n_i"].get()[cell_id]) + output["rs"].append(self.particulator.products["r_s"].get()[cell_id]) + output["ri"].append(self.particulator.products["r_i"].get()[cell_id]) + # output["water_mass"].append( + # self.particulator.attributes["signed water mass"].data.tolist() + # ) + # output["T_frz"].append( + # self.particulator.attributes["temperature of last freezing"].data.tolist() + # ) + output["T_frz"] = self.particulator.attributes[ + "temperature of last freezing" + ].data.tolist() + + def run(self): + + print("Starting simulation...") + + output = { + "t": [], + "z": [], + "RH": [], + "RHi": [], + "T": [], + "P": [], + "LWC": [], + "IWC": [], + "qv": [], + "ns": [], + "ni": [], + "rs": [], + "ri": [], + # "water_mass": [], + "T_frz": [], + } + + self.save(output) + + while True: + + self.particulator.run(self.n_substeps) + self.save(output) + + # print( output["t"][-1], output["T"][-1], output["RH"][-1], output["LWC"][-1], output["IWC"][-1] ) + + if output["LWC"][-1] < output["LWC"][0]: + print("all particles frozen or evaporated") + # Assert for water saturation + test_water_saturation = np.asarray(output["RH"]) + # Sort out times before CCN activation & after first occurence of ice + test_water_saturation = np.where( + np.asarray(output["rs"]) < 1e-6, 100.0, test_water_saturation + ) + test_water_saturation = np.where( + np.asarray(output["IWC"]) > 0.0, 100.0, test_water_saturation + ) + if np.allclose(test_water_saturation, 100.0, rtol=5e-2) == False: + print( + "Warning: water saturation is too high outside of activation and mixed-phase environment" + ) + + break + if output["t"][-1] >= self.t_max_duration: + print("time exceeded") + break + + return output diff --git a/tests/smoke_tests/box/luettmer_homogeneous_freezing/__init__.py b/tests/smoke_tests/box/luettmer_homogeneous_freezing/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/smoke_tests/box/luettmer_homogeneous_freezing/test_notebook.py b/tests/smoke_tests/box/luettmer_homogeneous_freezing/test_notebook.py new file mode 100644 index 000000000..cc2713895 --- /dev/null +++ b/tests/smoke_tests/box/luettmer_homogeneous_freezing/test_notebook.py @@ -0,0 +1,29 @@ +"""basic tests for threshold freezing temperatures""" + +from pathlib import Path + +import pytest + +from open_atmos_jupyter_utils import notebook_vars +from PySDM_examples import Luettmer_homogeneous_freezing + +PLOT = False + + +@pytest.fixture(scope="session", name="variables") +def variables_fixture(): + return notebook_vars( + file=Path(Luettmer_homogeneous_freezing.__file__).parent + / "hom_freezing_cloud_droplets.ipynb", + plot=PLOT, + ) + + +class TestNotebook: + @staticmethod + def test_1(variables): + assert variables["n_sd"] == 100 + + @staticmethod + def test_2(variables): + print(len(variables["simulations"])) diff --git a/tests/unit_tests/dynamics/condensation/test_ventilation.py b/tests/unit_tests/dynamics/condensation/test_ventilation.py index 04978bcd4..e30ad3694 100644 --- a/tests/unit_tests/dynamics/condensation/test_ventilation.py +++ b/tests/unit_tests/dynamics/condensation/test_ventilation.py @@ -33,7 +33,7 @@ def _make_particulator(backend): return builder.build( attributes={ "multiplicity": np.ones(1), - "water mass": np.asarray([INITIAL_DROPLET_MASS]), + "signed water mass": np.asarray([INITIAL_DROPLET_MASS]), "dry volume": np.asarray([DRY_VOLUME]), "kappa times dry volume": 0.5 * np.asarray([DRY_VOLUME]), }, @@ -75,7 +75,8 @@ def test_ventilation(backend_class, var_ventilation, var_drop_growth, scipy_solv # assert mass_ratios = { - key: particulator.attributes["water mass"].to_ndarray() / INITIAL_DROPLET_MASS + key: particulator.attributes["signed water mass"].to_ndarray() + / INITIAL_DROPLET_MASS for key, particulator in particulators.items() } assert 0.93 < mass_ratios[var_ventilation] < mass_ratios["Neglect"] < 1 diff --git a/tests/unit_tests/dynamics/test_freezing.py b/tests/unit_tests/dynamics/test_freezing.py index ddf81fede..d1fde7b47 100644 --- a/tests/unit_tests/dynamics/test_freezing.py +++ b/tests/unit_tests/dynamics/test_freezing.py @@ -13,7 +13,7 @@ ) from PySDM.backends import ThrustRTC -VERY_BIG_J_HET = 1e20 +VERY_BIG_RATE = 1e20 EPSILON_RH = 1e-3 @@ -23,8 +23,16 @@ class TestDropletFreezing: "record_freezing_temperature", (pytest.param(True, id="recording"), pytest.param(False, id="not recording")), ) + @pytest.mark.parametrize( + "freezing_mode", + ( + {"immersion_freezing": "time-dependent", "homogeneous_freezing": None}, + {"immersion_freezing": None, "homogeneous_freezing": "threshold"}, + {"immersion_freezing": None, "homogeneous_freezing": "time-dependent"}, + ), + ) def test_record_freezing_temperature_on_time_dependent_freeze( - backend_class, record_freezing_temperature + backend_class, record_freezing_temperature, freezing_mode ): if backend_class is ThrustRTC and record_freezing_temperature: pytest.skip("TODO #1495") @@ -33,7 +41,11 @@ def test_record_freezing_temperature_on_time_dependent_freeze( formulae = Formulae( particle_shape_and_density="MixedPhaseSpheres", heterogeneous_ice_nucleation_rate="Constant", - constants={"J_HET": VERY_BIG_J_HET}, + homogeneous_ice_nucleation_rate="Constant", + constants={ + "J_HET": VERY_BIG_RATE, + "J_HOM": VERY_BIG_RATE, + }, ) builder = Builder( n_sd=1, @@ -41,7 +53,12 @@ def test_record_freezing_temperature_on_time_dependent_freeze( environment=Box(dt=1 * si.s, dv=1 * si.m**3), ) builder.add_dynamic( - Freezing(immersion_freezing="time-dependent", thaw="instantaneous") + # Freezing(immersion_freezing="time-dependent", thaw="instantaneous") + Freezing( + immersion_freezing=freezing_mode["immersion_freezing"], + homogeneous_freezing=freezing_mode["homogeneous_freezing"], + thaw="instantaneous", + ) ) if record_freezing_temperature: builder.request_attribute("temperature of last freezing") @@ -55,8 +72,9 @@ def test_record_freezing_temperature_on_time_dependent_freeze( temp_1 = 200 * si.K temp_2 = 250 * si.K + temp_3 = 220 * si.K particulator.environment["a_w_ice"] = np.nan - particulator.environment["T"] = temp_1 + particulator.environment["T"] = temp_2 # act & assert attr_name = "temperature of last freezing" @@ -68,23 +86,30 @@ def test_record_freezing_temperature_on_time_dependent_freeze( # still not frozen since RH not greater than 100% particulator.environment["RH"] = 1.0 + particulator.environment["RH_ice"] = 1.0 particulator.run(steps=1) np.isnan(particulator.attributes[attr_name].to_ndarray()).all() + assert all(particulator.attributes["signed water mass"].to_ndarray() > 0) # should freeze and record T1 particulator.environment["RH"] += EPSILON_RH + particulator.environment["RH_ice"] += EPSILON_RH + particulator.environment["T"] = temp_1 particulator.run(steps=1) + assert all(particulator.attributes["signed water mass"].to_ndarray() < 0) assert all(particulator.attributes[attr_name].to_ndarray() == temp_1) # should thaw particulator.environment["T"] = 300 * si.K particulator.run(steps=1) + assert all(particulator.attributes["signed water mass"].to_ndarray() > 0) np.isnan(particulator.attributes[attr_name].to_ndarray()).all() # should re-freeze and record T2 - particulator.environment["T"] = temp_2 + particulator.environment["T"] = temp_3 particulator.run(steps=1) - assert all(particulator.attributes[attr_name].to_ndarray() == temp_2) + assert all(particulator.attributes["signed water mass"].to_ndarray() < 0) + assert all(particulator.attributes[attr_name].to_ndarray() == temp_3) # TODO #599 def test_no_subsaturated_freezing(self): diff --git a/tests/unit_tests/physics/test_homogeneous_nucleation_rates.py b/tests/unit_tests/physics/test_homogeneous_nucleation_rates.py index f3b51a01e..876ea8a57 100644 --- a/tests/unit_tests/physics/test_homogeneous_nucleation_rates.py +++ b/tests/unit_tests/physics/test_homogeneous_nucleation_rates.py @@ -51,6 +51,7 @@ def test_fig_2_in_spichtinger_et_al_2023( # arrange formulae = Formulae( homogeneous_ice_nucleation_rate=parametrisation, + saturation_vapour_pressure="MurphyKoop2005", ) # act @@ -93,6 +94,112 @@ def test_fig_2_in_spichtinger_et_al_2023( significant=2, ) + @staticmethod + @pytest.mark.parametrize( + "pvs_parametrisation, context", + ( + ( + "FlatauWalkoCotton", + pytest.raises( + AssertionError, match="Not equal to tolerance rtol=0.05, atol=0" + ), + ), + ("MurphyKoop2005", nullcontext()), + ), + ) + def test_fig_1_in_spichtinger_et_al_2023( + pvs_parametrisation, context, plot=False + ): # pylint disable=too-many-locals + # arrange + si = physics.si + formulae = Formulae( + homogeneous_ice_nucleation_rate="KoopMurray2016", + saturation_vapour_pressure=pvs_parametrisation, + ) + formulae_koop2000 = Formulae( + homogeneous_ice_nucleation_rate="Koop2000", + ) + formulae_Koop_Correction = Formulae( + homogeneous_ice_nucleation_rate="Koop_Correction", + ) + temperature = np.linspace(230, 245, num=16) * si.K + + with context: + # act + pv_sat_water = ( + formulae.saturation_vapour_pressure.pvs_water(temperature) * si.Pa + ) + pv_sat_ice = ( + formulae.saturation_vapour_pressure.pvs_ice(temperature) * si.Pa + ) + + d_aw_ice = (pv_sat_water * 1.0 / pv_sat_ice - 1) * pv_sat_ice / pv_sat_water + + J_hom_parametrisations = { + "KoopMurray2016": np.log10( + formulae.homogeneous_ice_nucleation_rate.j_hom( + temperature, d_aw_ice + ) + ), + "Koop2000": np.log10( + formulae_koop2000.homogeneous_ice_nucleation_rate.j_hom( + temperature, d_aw_ice + ) + ), + "Koop_Correction": np.log10( + formulae_Koop_Correction.homogeneous_ice_nucleation_rate.j_hom( + temperature, d_aw_ice + ) + ), + } + + # plot + J_hom_range = (-10, 25) + for parametrisation, data in J_hom_parametrisations.items(): + pyplot.plot( + temperature, + data, + label=parametrisation, + ) + pyplot.grid() + pyplot.gca().set( + xlabel=r"temperature (K)", + ylabel="log$_{10}(J)$", + title="saturation_vapour_pressure: " + pvs_parametrisation, + xlim=(np.amin(temperature), np.amax(temperature)), + ylim=J_hom_range, + ) + pyplot.xticks(ticks=temperature, minor=True) + pyplot.xticks(ticks=np.arange(230, 250, 5), minor=False) + pyplot.yticks( + ticks=np.arange(J_hom_range[0], J_hom_range[1] + 1, 1), minor=True + ) + pyplot.legend() + + if plot: + pyplot.show() + else: + pyplot.clf() + + # Assert + assert all( + J_hom_parametrisations["Koop2000"] + >= J_hom_parametrisations["KoopMurray2016"] + ) + assert all( + J_hom_parametrisations["Koop2000"] + >= J_hom_parametrisations["Koop_Correction"] + ) + index = range( + np.where(temperature == 235)[0][0], + np.where(temperature == 240)[0][0] + 1, + ) + np.testing.assert_allclose( + J_hom_parametrisations["Koop_Correction"][index], + J_hom_parametrisations["KoopMurray2016"][index], + rtol=0.05, + ) + @staticmethod @pytest.mark.parametrize("variant", _choices(homogeneous_ice_nucleation_rate)) def test_units(variant):