PySDM-examples 2.128__tar.gz → 2.130__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PKG-INFO +3 -1
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/run_ARG_parcel.py +4 -4
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/simulation.py +4 -4
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_2020_MasterThesis/fig_5_SCIPY_VS_ADAPTIVE.py +2 -2
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Grabowski_and_Pawlowska_2023/simulation.py +4 -8
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/simulation.py +3 -3
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kreidenweis_et_al_2003/simulation.py +1 -1
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/simulation.py +2 -2
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/profile_plotter.py +6 -2
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/simulation.py +1 -1
- pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/__init__.py +7 -0
- pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/data/reference_bulk.py +47 -0
- pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/data/simulation_data.py +22 -0
- pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/settings.py +66 -0
- pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/simulation.py +121 -0
- pysdm_examples-2.130/PySDM_examples/Zaba_et_al_2025/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/make_default_product_collection.py +1 -1
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/pvanim.py +57 -21
- {pysdm_examples-2.128 → pysdm_examples-2.130}/docs/pysdm_examples_landing.md +2 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/PKG-INFO +3 -1
- {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/SOURCES.txt +6 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/MANIFEST.in +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abade_and_Albuquerque_2024/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abade_and_Albuquerque_2024/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abade_and_Albuquerque_2024/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/aerosol.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_ARG2000_paper.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_CloudMicrophysics_ARG.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/table.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/table_1.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/table_2.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/example.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/example.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/example_benchmark.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/spin_up.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/commons.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/curved_text.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/frozen_fraction.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/make_particulator.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/plots.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/run_simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_2020_MasterThesis/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_2020_MasterThesis/fig_4_adaptive_sdm.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_et_al_2021/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_et_al_2021/label.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/example.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/example_fig_6.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/spectrum_plotter.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bieli_et_al_2022/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bieli_et_al_2022/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bieli_et_al_2022/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bolin_1958/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bolot_et_al_2013/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/performance_comparison_Srivastava_Setup.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/setups.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/utils.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Ervens_and_Feingold_2012/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Ervens_and_Feingold_2012/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Fisher_1991/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Gedzelman_and_Arnold_1994/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Gonfiantini_1986/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Grabowski_and_Pawlowska_2023/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Grabowski_and_Pawlowska_2023/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Graf_et_al_2019/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jaruga_and_Pawlowska_2018/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/plotting.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/table_3.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jouzel_and_Merlivat_1984/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jouzel_and_Merlivat_1984/thermodynamic_profiles.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kinzer_And_Gunn_1951/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kinzer_And_Gunn_1951/table_1_and_2.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kreidenweis_et_al_2003/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kreidenweis_et_al_2003/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lamb_et_al_2017/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/aerosol.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/aerosol_code.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/constants_def.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/plot_helper.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Merlivat_and_Nief_1967/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Miyake_et_al_1968/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Morrison_and_Grabowski_2007/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Morrison_and_Grabowski_2007/common.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Morrison_and_Grabowski_2007/strato_cumulus.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Niedermeier_et_al_2014/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Niedermeier_et_al_2014/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Niedermeier_et_al_2014/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pierchala_et_al_2022/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pierchala_et_al_2022/commons.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pruppacher_and_Rasmussen_1979/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Rogers_1975/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Rozanski_and_Sonntag_1982/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Rozanski_and_Sonntag_1982/multibox.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/error_measure.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/example.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/example_timing.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/spectrum_plotter.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/tutorial_example.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/tutorial_plotter.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/tutorial_settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/mpdata_1d.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/plot.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Singer_Ward/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Singer_Ward/aerosol.py +0 -0
- {pysdm_examples-2.128/PySDM_examples/Toon_et_al_1980 → pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/data}/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/equations.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/example.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Stewart_1975/__init__.py +0 -0
- {pysdm_examples-2.128/PySDM_examples/Zaba_et_al_2025 → pysdm_examples-2.130/PySDM_examples/Toon_et_al_1980}/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Van_Hook_1968/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Yang_et_al_2018/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Yang_et_al_2018/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Yang_et_al_2018/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/_HOWTOs/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/cloudy_data.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/cloudy_data_0d.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/settings1D.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/simulation_0D.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/plot_rates.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/settings1D.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/settings_0D.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/simulation1D.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_0D.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_ss.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/seeding/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/seeding/settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/seeding/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/basic_simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/dummy_controller.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/fields.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui_controller.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui_settings.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui_viewer.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/mpdata_2d.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/plots.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/simulation.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/storage.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/progbar_controller.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/read_vtk_1d.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/widgets/__init__.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/widgets/freezer.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/widgets/progbar_updater.py +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/README.md +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/pyproject.toml +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/dependency_links.txt +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/requires.txt +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/top_level.txt +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/setup.cfg +0 -0
- {pysdm_examples-2.128 → pysdm_examples-2.130}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pysdm-examples
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.130
|
|
4
4
|
Summary: PySDM usage examples reproducing results from literature and depicting how to use PySDM from Python Jupyter notebooks
|
|
5
5
|
Home-page: https://github.com/open-atmos/PySDM
|
|
6
6
|
Author: https://github.com/open-atmos/PySDM/graphs/contributors
|
|
@@ -128,6 +128,8 @@ Example notebooks include:
|
|
|
128
128
|
- condensation and aqueous-chemistry
|
|
129
129
|
- <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Kreidenweis_et_al_2003.html">Kreidenweis_et_al_2003</a>: <mark>Hoppel gap</mark> simulation setup (i.e. depiction of evolution of aerosol mass spectrum from a monomodal to bimodal due to aqueous‐phase SO2 oxidation)
|
|
130
130
|
- <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Jaruga_and_Pawlowska_2018.html">Jaruga_and_Pawlowska_2018</a>: exploration of numerical convergence using the above Hoppel-gap simulation setup
|
|
131
|
+
- freezing
|
|
132
|
+
- <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Spichtinger_et_al_2023.html">Spichtinger_et_al_2023</a>: <mark>homogeneous freezing</mark> and ice growth (<mark>Wegener-Bergeron-Findeisen process</mark>)
|
|
131
133
|
|
|
132
134
|
The parcel environment is also featured in the <a href="https://open-atmos.github.io/PySDM/PySDM.html#tutorials">PySDM tutorials</a>.
|
|
133
135
|
|
|
@@ -28,7 +28,7 @@ def run_parcel(
|
|
|
28
28
|
):
|
|
29
29
|
products = (
|
|
30
30
|
PySDM_products.WaterMixingRatio(unit="g/kg", name="liquid water mixing ratio"),
|
|
31
|
-
PySDM_products.
|
|
31
|
+
PySDM_products.PeakSaturation(name="S max"),
|
|
32
32
|
PySDM_products.AmbientRelativeHumidity(name="RH"),
|
|
33
33
|
PySDM_products.ParcelDisplacement(name="z"),
|
|
34
34
|
)
|
|
@@ -54,7 +54,7 @@ def run_parcel(
|
|
|
54
54
|
builder = Builder(backend=CPU(formulae), n_sd=n_sd, environment=env)
|
|
55
55
|
builder.add_dynamic(AmbientThermodynamics())
|
|
56
56
|
builder.add_dynamic(Condensation())
|
|
57
|
-
builder.request_attribute("critical
|
|
57
|
+
builder.request_attribute("critical saturation")
|
|
58
58
|
|
|
59
59
|
attributes = {
|
|
60
60
|
k: np.empty(0) for k in ("dry volume", "kappa times dry volume", "multiplicity")
|
|
@@ -87,7 +87,7 @@ def run_parcel(
|
|
|
87
87
|
"multiplicity": tuple([] for _ in range(particulator.n_sd)),
|
|
88
88
|
"volume": tuple([] for _ in range(particulator.n_sd)),
|
|
89
89
|
"critical volume": tuple([] for _ in range(particulator.n_sd)),
|
|
90
|
-
"critical
|
|
90
|
+
"critical saturation": tuple([] for _ in range(particulator.n_sd)),
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
for _ in range(n_steps):
|
|
@@ -109,7 +109,7 @@ def run_parcel(
|
|
|
109
109
|
RHmax = np.nanmax(np.asarray(output["RH"]))
|
|
110
110
|
for i, volume in enumerate(output_attributes["volume"]):
|
|
111
111
|
if j * n_sd_per_mode <= i < (j + 1) * n_sd_per_mode:
|
|
112
|
-
if output_attributes["critical
|
|
112
|
+
if output_attributes["critical saturation"][i][-1] < RHmax:
|
|
113
113
|
activated_drops_j_S += output_attributes["multiplicity"][i][-1]
|
|
114
114
|
if output_attributes["critical volume"][i][-1] < volume[-1]:
|
|
115
115
|
activated_drops_j_V += output_attributes["multiplicity"][i][-1]
|
{pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/simulation.py
RENAMED
|
@@ -62,14 +62,14 @@ class Simulation:
|
|
|
62
62
|
PySDM_products.MeanRadius(name="radius_m1", unit="um"),
|
|
63
63
|
PySDM_products.CondensationTimestepMin(name="dt_cond_min"),
|
|
64
64
|
PySDM_products.ParcelDisplacement(name="z"),
|
|
65
|
-
PySDM_products.AmbientRelativeHumidity(name="RH"
|
|
65
|
+
PySDM_products.AmbientRelativeHumidity(name="RH"),
|
|
66
|
+
PySDM_products.PeakSaturation(name="S_max"),
|
|
66
67
|
PySDM_products.Time(name="t"),
|
|
67
68
|
PySDM_products.ActivatingRate(unit="s^-1 mg^-1", name="activating_rate"),
|
|
68
69
|
PySDM_products.DeactivatingRate(
|
|
69
70
|
unit="s^-1 mg^-1", name="deactivating_rate"
|
|
70
71
|
),
|
|
71
72
|
PySDM_products.RipeningRate(unit="s^-1 mg^-1", name="ripening_rate"),
|
|
72
|
-
PySDM_products.PeakSupersaturation(unit="%", name="S_max"),
|
|
73
73
|
]
|
|
74
74
|
|
|
75
75
|
self.particulator = builder.build(attributes, products)
|
|
@@ -85,7 +85,7 @@ class Simulation:
|
|
|
85
85
|
self.particulator.products["dt_cond_min"].get()[cell_id]
|
|
86
86
|
)
|
|
87
87
|
output["z"].append(self.particulator.products["z"].get()[cell_id])
|
|
88
|
-
output["
|
|
88
|
+
output["RH"].append(self.particulator.products["RH"].get()[cell_id])
|
|
89
89
|
output["t"].append(self.particulator.products["t"].get())
|
|
90
90
|
|
|
91
91
|
for event in ("activating", "deactivating", "ripening"):
|
|
@@ -96,7 +96,7 @@ class Simulation:
|
|
|
96
96
|
def run(self):
|
|
97
97
|
output = {
|
|
98
98
|
"r": [],
|
|
99
|
-
"
|
|
99
|
+
"RH": [],
|
|
100
100
|
"z": [],
|
|
101
101
|
"t": [],
|
|
102
102
|
"dt_cond_min": [],
|
|
@@ -75,12 +75,12 @@ def plot(plot_data, rtols, schemes, setups_num, show_plot, path=None):
|
|
|
75
75
|
ax = axs[settings_idx, rtol_idx]
|
|
76
76
|
for scheme in schemes:
|
|
77
77
|
datum = plot_data[scheme][_rtol][settings_idx]
|
|
78
|
-
S = datum["
|
|
78
|
+
S = datum["RH"]
|
|
79
79
|
z = datum["z"]
|
|
80
80
|
dt = datum["dt_cond_min"]
|
|
81
81
|
if scheme == "SciPy":
|
|
82
|
-
ax.plot(S, z, label=scheme, color="grey")
|
|
83
82
|
SCIPY_S = np.array(S)
|
|
83
|
+
ax.plot(SCIPY_S - 1, z, label=scheme, color="grey")
|
|
84
84
|
else:
|
|
85
85
|
add_color_line(fig, ax, S, z, dt)
|
|
86
86
|
PySDM_S = np.array(S)
|
|
@@ -38,8 +38,8 @@ class Simulation(BasicSimulation):
|
|
|
38
38
|
Condensation(rtol_thd=settings.rtol_thd, rtol_x=settings.rtol_x)
|
|
39
39
|
)
|
|
40
40
|
for attribute in (
|
|
41
|
-
"critical
|
|
42
|
-
"equilibrium
|
|
41
|
+
"critical saturation",
|
|
42
|
+
"equilibrium saturation",
|
|
43
43
|
"critical volume",
|
|
44
44
|
):
|
|
45
45
|
builder.request_attribute(attribute)
|
|
@@ -80,12 +80,8 @@ class Simulation(BasicSimulation):
|
|
|
80
80
|
self.output_attributes = {
|
|
81
81
|
"volume": tuple([] for _ in range(self.particulator.n_sd)),
|
|
82
82
|
"dry volume": tuple([] for _ in range(self.particulator.n_sd)),
|
|
83
|
-
"critical
|
|
84
|
-
|
|
85
|
-
),
|
|
86
|
-
"equilibrium supersaturation": tuple(
|
|
87
|
-
[] for _ in range(self.particulator.n_sd)
|
|
88
|
-
),
|
|
83
|
+
"critical saturation": tuple([] for _ in range(self.particulator.n_sd)),
|
|
84
|
+
"equilibrium saturation": tuple([] for _ in range(self.particulator.n_sd)),
|
|
89
85
|
"critical volume": tuple([] for _ in range(self.particulator.n_sd)),
|
|
90
86
|
"multiplicity": tuple([] for _ in range(self.particulator.n_sd)),
|
|
91
87
|
}
|
{pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/simulation.py
RENAMED
|
@@ -6,7 +6,7 @@ from PySDM import Builder
|
|
|
6
6
|
from PySDM.physics import si
|
|
7
7
|
from PySDM.backends import CPU
|
|
8
8
|
from PySDM.products import (
|
|
9
|
-
|
|
9
|
+
PeakSaturation,
|
|
10
10
|
ParcelDisplacement,
|
|
11
11
|
Time,
|
|
12
12
|
ActivatedMeanRadius,
|
|
@@ -52,7 +52,7 @@ class Simulation(BasicSimulation):
|
|
|
52
52
|
),
|
|
53
53
|
)
|
|
54
54
|
|
|
55
|
-
additional_derived_attributes = ("radius", "equilibrium
|
|
55
|
+
additional_derived_attributes = ("radius", "equilibrium saturation")
|
|
56
56
|
for additional_derived_attribute in additional_derived_attributes:
|
|
57
57
|
builder.request_attribute(additional_derived_attribute)
|
|
58
58
|
|
|
@@ -93,7 +93,7 @@ class Simulation(BasicSimulation):
|
|
|
93
93
|
builder.build(
|
|
94
94
|
attributes=attributes,
|
|
95
95
|
products=(
|
|
96
|
-
|
|
96
|
+
PeakSaturation(name="S_max"),
|
|
97
97
|
ParcelDisplacement(name="z"),
|
|
98
98
|
Time(name="t"),
|
|
99
99
|
ActivatedMeanRadius(
|
{pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kreidenweis_et_al_2003/simulation.py
RENAMED
|
@@ -106,7 +106,7 @@ class Simulation(BasicSimulation):
|
|
|
106
106
|
PySDM_products.TotalDryMassMixingRatio(
|
|
107
107
|
settings.DRY_RHO, name="q_dry", unit="ug/kg"
|
|
108
108
|
),
|
|
109
|
-
PySDM_products.
|
|
109
|
+
PySDM_products.PeakSaturation(unit="%", name="S_max_percent"),
|
|
110
110
|
PySDM_products.ParticleSpecificConcentration(
|
|
111
111
|
radius_range=settings.cloud_radius_range, name="n_c_mg", unit="mg^-1"
|
|
112
112
|
),
|
|
@@ -81,8 +81,8 @@ class Simulation(BasicSimulation):
|
|
|
81
81
|
products = products or (
|
|
82
82
|
PySDM_products.ParcelDisplacement(name="z"),
|
|
83
83
|
PySDM_products.Time(name="t"),
|
|
84
|
-
PySDM_products.
|
|
85
|
-
PySDM_products.AmbientRelativeHumidity(
|
|
84
|
+
PySDM_products.PeakSaturation(name="S_max"),
|
|
85
|
+
PySDM_products.AmbientRelativeHumidity(name="RH"),
|
|
86
86
|
PySDM_products.ActivatedParticleConcentration(
|
|
87
87
|
name="CDNC_cm3",
|
|
88
88
|
unit="cm^-3",
|
|
@@ -28,8 +28,12 @@ class ProfilePlotter:
|
|
|
28
28
|
def plot_data(self, settings, output):
|
|
29
29
|
_, axs = pyplot.subplots(1, 2, sharey=True, figsize=(10, 5))
|
|
30
30
|
axS = axs[0]
|
|
31
|
+
if output["products"].get("S_max"):
|
|
32
|
+
SS_percent = (np.asarray(output["products"]["S_max"]) - 1) * 100
|
|
33
|
+
else:
|
|
34
|
+
SS_percent = np.asarray(output["products"]["S_max_percent"]) - 100
|
|
31
35
|
axS.plot(
|
|
32
|
-
|
|
36
|
+
SS_percent,
|
|
33
37
|
output["products"]["z"],
|
|
34
38
|
color="black",
|
|
35
39
|
)
|
|
@@ -37,7 +41,7 @@ class ProfilePlotter:
|
|
|
37
41
|
axS.set_xlabel("Supersaturation [%]")
|
|
38
42
|
axS.set_xlim(0, 0.7)
|
|
39
43
|
axS.set_ylim(0, 250)
|
|
40
|
-
axS.text(0.3, 52, f"max
|
|
44
|
+
axS.text(0.3, 52, f"max SS = {np.nanmax(SS_percent):.2f}%")
|
|
41
45
|
axS.grid()
|
|
42
46
|
|
|
43
47
|
axT = axS.twiny()
|
{pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/simulation.py
RENAMED
|
@@ -148,7 +148,7 @@ class Simulation:
|
|
|
148
148
|
PySDM_products.RipeningRate(name="ripening"),
|
|
149
149
|
PySDM_products.ActivatingRate(name="activating"),
|
|
150
150
|
PySDM_products.DeactivatingRate(name="deactivating"),
|
|
151
|
-
PySDM_products.
|
|
151
|
+
PySDM_products.PeakSaturation(),
|
|
152
152
|
PySDM_products.ParticleSizeSpectrumPerVolume(
|
|
153
153
|
name="dry spectrum",
|
|
154
154
|
radius_bins_edges=settings.r_bins_edges_dry,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""
|
|
2
|
+
reference results for bulk scheme in Fig B1. in
|
|
3
|
+
[Spichtinger et al. 2023](https://doi.org/10.5194/acp-23-2035-2023)
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def bulk_model_reference_array():
|
|
10
|
+
|
|
11
|
+
initial_temperatures = np.array([196.0, 216.0, 236.0])
|
|
12
|
+
updrafts = np.array([0.05, 0.1, 0.3, 0.5, 1.0, 3.0, 5.0, 10.0])
|
|
13
|
+
|
|
14
|
+
dim_size = (np.shape(initial_temperatures)[0], np.shape(updrafts)[0])
|
|
15
|
+
ni_bulk_ref = np.zeros(dim_size)
|
|
16
|
+
|
|
17
|
+
# T = 196
|
|
18
|
+
ni_bulk_ref[0, 0] = 643686.1316903427
|
|
19
|
+
ni_bulk_ref[0, 1] = 2368481.0609527444
|
|
20
|
+
ni_bulk_ref[0, 2] = 20160966.984670535
|
|
21
|
+
ni_bulk_ref[0, 3] = 49475281.81718969
|
|
22
|
+
ni_bulk_ref[0, 4] = 131080662.23620115
|
|
23
|
+
ni_bulk_ref[0, 5] = 401046528.70428866
|
|
24
|
+
ni_bulk_ref[0, 6] = 627442148.3402529
|
|
25
|
+
ni_bulk_ref[0, 7] = 1151707310.2210448
|
|
26
|
+
|
|
27
|
+
# T = 216
|
|
28
|
+
ni_bulk_ref[1, 0] = 60955.84292640147
|
|
29
|
+
ni_bulk_ref[1, 1] = 189002.0792186534
|
|
30
|
+
ni_bulk_ref[1, 2] = 1200751.6897658105
|
|
31
|
+
ni_bulk_ref[1, 3] = 2942110.815055958
|
|
32
|
+
ni_bulk_ref[1, 4] = 10475282.894692907
|
|
33
|
+
ni_bulk_ref[1, 5] = 90871045.40856971
|
|
34
|
+
ni_bulk_ref[1, 6] = 252175505.460412
|
|
35
|
+
ni_bulk_ref[1, 7] = 860335156.4717773
|
|
36
|
+
|
|
37
|
+
# T = 236
|
|
38
|
+
ni_bulk_ref[2, 0] = 13049.108886452004
|
|
39
|
+
ni_bulk_ref[2, 1] = 40422.244759544985
|
|
40
|
+
ni_bulk_ref[2, 2] = 237862.49854786208
|
|
41
|
+
ni_bulk_ref[2, 3] = 545315.7805748513
|
|
42
|
+
ni_bulk_ref[2, 4] = 1707801.469906006
|
|
43
|
+
ni_bulk_ref[2, 5] = 11128055.66932415
|
|
44
|
+
ni_bulk_ref[2, 6] = 27739585.111447476
|
|
45
|
+
ni_bulk_ref[2, 7] = 101799566.47225031
|
|
46
|
+
|
|
47
|
+
return initial_temperatures, updrafts, ni_bulk_ref
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def saved_simulation_ensemble_mean():
|
|
5
|
+
|
|
6
|
+
ni_ens_mean = np.array(
|
|
7
|
+
[
|
|
8
|
+
[0.00000000e00, 0.00000000e00, 0.00000000e00],
|
|
9
|
+
[0.00000000e00, 0.00000000e00, 0.00000000e00],
|
|
10
|
+
[1.62069821e03, 0.00000000e00, 0.00000000e00],
|
|
11
|
+
[5.25377025e06, 9.75512904e05, 4.51431097e05],
|
|
12
|
+
[3.67137290e07, 5.45240337e06, 1.53884530e06],
|
|
13
|
+
[7.96514420e07, 1.13878118e07, 3.26386880e06],
|
|
14
|
+
[2.19385480e08, 3.62240242e07, 9.00657591e06],
|
|
15
|
+
[1.00631095e09, 2.34443408e08, 4.90577208e07],
|
|
16
|
+
[1.73457062e09, 5.20774276e08, 1.16040316e08],
|
|
17
|
+
]
|
|
18
|
+
)
|
|
19
|
+
T = np.array([196.0, 216.0, 236.0])
|
|
20
|
+
w = np.array([0.01, 0.03, 0.05, 0.1, 0.3, 0.5, 1.0, 3.0, 5.0])
|
|
21
|
+
|
|
22
|
+
return T, w, ni_ens_mean
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from pystrict import strict
|
|
2
|
+
|
|
3
|
+
from PySDM import Formulae
|
|
4
|
+
from PySDM.physics.constants import si
|
|
5
|
+
from PySDM.initialisation.spectra import Lognormal
|
|
6
|
+
from PySDM.initialisation.sampling import spectral_sampling
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@strict
|
|
10
|
+
class Settings:
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
*,
|
|
14
|
+
n_sd: int,
|
|
15
|
+
w_updraft: float,
|
|
16
|
+
T0: float,
|
|
17
|
+
seed: int,
|
|
18
|
+
dt: float,
|
|
19
|
+
):
|
|
20
|
+
|
|
21
|
+
self.n_sd = n_sd
|
|
22
|
+
self.w_updraft = w_updraft
|
|
23
|
+
|
|
24
|
+
self.N_dv_solution_droplet = 2500 / si.centimetre**3
|
|
25
|
+
self.r_mean_solution_droplet = 0.055 * si.micrometre
|
|
26
|
+
self.sigma_solution_droplet = 1.6
|
|
27
|
+
|
|
28
|
+
self.mass_of_dry_air = 1000 * si.kilogram
|
|
29
|
+
self.initial_pressure = 200 * si.hectopascals
|
|
30
|
+
self.initial_ice_supersaturation = 1.0
|
|
31
|
+
self.kappa = 0.64
|
|
32
|
+
self.initial_temperature = T0
|
|
33
|
+
|
|
34
|
+
self.formulae = Formulae(
|
|
35
|
+
particle_shape_and_density="MixedPhaseSpheres",
|
|
36
|
+
homogeneous_ice_nucleation_rate="Koop_Correction",
|
|
37
|
+
seed=seed,
|
|
38
|
+
)
|
|
39
|
+
const = self.formulae.constants
|
|
40
|
+
pvs_i = self.formulae.saturation_vapour_pressure.pvs_ice(
|
|
41
|
+
self.initial_temperature
|
|
42
|
+
)
|
|
43
|
+
self.initial_water_vapour_mixing_ratio = const.eps / (
|
|
44
|
+
self.initial_pressure / self.initial_ice_supersaturation / pvs_i - 1
|
|
45
|
+
)
|
|
46
|
+
dry_air_density = (
|
|
47
|
+
self.formulae.trivia.p_d(
|
|
48
|
+
self.initial_pressure, self.initial_water_vapour_mixing_ratio
|
|
49
|
+
)
|
|
50
|
+
/ self.initial_temperature
|
|
51
|
+
/ const.Rd
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
spectrum = Lognormal(
|
|
55
|
+
norm_factor=self.N_dv_solution_droplet / dry_air_density,
|
|
56
|
+
m_mode=self.r_mean_solution_droplet,
|
|
57
|
+
s_geom=self.sigma_solution_droplet,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
self.r_dry, self.specific_concentration = spectral_sampling.Linear(
|
|
61
|
+
spectrum
|
|
62
|
+
).sample(n_sd)
|
|
63
|
+
|
|
64
|
+
self.t_duration = 7200
|
|
65
|
+
self.dt = dt
|
|
66
|
+
self.n_output = int(self.t_duration / 100)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
from PySDM_examples.utils import BasicSimulation
|
|
4
|
+
|
|
5
|
+
import PySDM.products as PySDM_products
|
|
6
|
+
from PySDM.backends import CPU
|
|
7
|
+
from PySDM.builder import Builder
|
|
8
|
+
from PySDM.dynamics import (
|
|
9
|
+
AmbientThermodynamics,
|
|
10
|
+
Condensation,
|
|
11
|
+
Freezing,
|
|
12
|
+
VapourDepositionOnIce,
|
|
13
|
+
)
|
|
14
|
+
from PySDM.environments import Parcel
|
|
15
|
+
from PySDM.initialisation import discretise_multiplicities, equilibrate_wet_radii
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Simulation(BasicSimulation):
|
|
19
|
+
def __init__(self, settings, backend=CPU):
|
|
20
|
+
|
|
21
|
+
dt = settings.dt
|
|
22
|
+
|
|
23
|
+
formulae = settings.formulae
|
|
24
|
+
|
|
25
|
+
env = Parcel(
|
|
26
|
+
mixed_phase=True,
|
|
27
|
+
dt=dt,
|
|
28
|
+
mass_of_dry_air=settings.mass_of_dry_air,
|
|
29
|
+
p0=settings.initial_pressure,
|
|
30
|
+
initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio,
|
|
31
|
+
T0=settings.initial_temperature,
|
|
32
|
+
w=settings.w_updraft,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
builder = Builder(
|
|
36
|
+
backend=backend(
|
|
37
|
+
formulae=settings.formulae,
|
|
38
|
+
**(
|
|
39
|
+
{"override_jit_flags": {"parallel": False}}
|
|
40
|
+
if backend == CPU
|
|
41
|
+
else {}
|
|
42
|
+
),
|
|
43
|
+
),
|
|
44
|
+
n_sd=settings.n_sd,
|
|
45
|
+
environment=env,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
builder.add_dynamic(AmbientThermodynamics())
|
|
49
|
+
builder.add_dynamic(Condensation())
|
|
50
|
+
builder.add_dynamic(VapourDepositionOnIce())
|
|
51
|
+
builder.add_dynamic(
|
|
52
|
+
Freezing(
|
|
53
|
+
singular=False, homogeneous_freezing=True, immersion_freezing=False
|
|
54
|
+
)
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
self.n_sd = settings.n_sd
|
|
58
|
+
self.multiplicities = discretise_multiplicities(
|
|
59
|
+
settings.specific_concentration * env.mass_of_dry_air
|
|
60
|
+
)
|
|
61
|
+
self.r_dry = settings.r_dry
|
|
62
|
+
v_dry = settings.formulae.trivia.volume(radius=self.r_dry)
|
|
63
|
+
kappa = settings.kappa
|
|
64
|
+
|
|
65
|
+
self.r_wet = equilibrate_wet_radii(
|
|
66
|
+
r_dry=self.r_dry,
|
|
67
|
+
environment=builder.particulator.environment,
|
|
68
|
+
kappa_times_dry_volume=kappa * v_dry,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
attributes = {
|
|
72
|
+
"multiplicity": self.multiplicities,
|
|
73
|
+
"dry volume": v_dry,
|
|
74
|
+
"kappa times dry volume": kappa * v_dry,
|
|
75
|
+
"signed water mass": formulae.particle_shape_and_density.radius_to_mass(
|
|
76
|
+
self.r_wet
|
|
77
|
+
),
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
products = [
|
|
81
|
+
PySDM_products.Time(name="t"),
|
|
82
|
+
PySDM_products.AmbientRelativeHumidity(name="RH_ice", unit="%"),
|
|
83
|
+
PySDM_products.ParticleConcentration(
|
|
84
|
+
name="n_i", unit="1/m**3", radius_range=(-np.inf, 0)
|
|
85
|
+
),
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
self.n_output = settings.n_output
|
|
89
|
+
self.n_substeps = int(settings.t_duration / dt / self.n_output)
|
|
90
|
+
super().__init__(builder.build(attributes, products))
|
|
91
|
+
|
|
92
|
+
def save(self, output):
|
|
93
|
+
cell_id = 0
|
|
94
|
+
output["t"].append(self.particulator.products["t"].get())
|
|
95
|
+
output["ni"].append(self.particulator.products["n_i"].get()[cell_id])
|
|
96
|
+
output["RHi"].append(self.particulator.products["RH_ice"].get()[cell_id])
|
|
97
|
+
|
|
98
|
+
def run(self):
|
|
99
|
+
output = {
|
|
100
|
+
"t": [],
|
|
101
|
+
"ni": [],
|
|
102
|
+
"RHi": [],
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
self.save(output)
|
|
106
|
+
|
|
107
|
+
RHi_old = self.particulator.products["RH_ice"].get()[0].copy()
|
|
108
|
+
for _ in range(self.n_output):
|
|
109
|
+
|
|
110
|
+
self.particulator.run(self.n_substeps)
|
|
111
|
+
|
|
112
|
+
self.save(output)
|
|
113
|
+
|
|
114
|
+
RHi = self.particulator.products["RH_ice"].get()[0].copy()
|
|
115
|
+
dRHi = (RHi_old - RHi) / RHi_old
|
|
116
|
+
if dRHi > 0.0 and RHi < 130.0:
|
|
117
|
+
print("break")
|
|
118
|
+
break
|
|
119
|
+
RHi_old = RHi
|
|
120
|
+
|
|
121
|
+
return output["ni"][-1]
|
|
File without changes
|
|
@@ -67,7 +67,7 @@ def make_default_product_collection(settings):
|
|
|
67
67
|
if settings.processes["condensation"]:
|
|
68
68
|
products.append(PySDM_products.CondensationTimestepMin(name="dt_cond_min"))
|
|
69
69
|
products.append(PySDM_products.CondensationTimestepMax(name="dt_cond_max"))
|
|
70
|
-
products.append(PySDM_products.
|
|
70
|
+
products.append(PySDM_products.PeakSaturation(unit="%", name="S_max_percent"))
|
|
71
71
|
products.append(PySDM_products.ActivatingRate())
|
|
72
72
|
products.append(PySDM_products.DeactivatingRate())
|
|
73
73
|
products.append(PySDM_products.RipeningRate())
|
|
@@ -12,6 +12,12 @@ def cli_using_argparse(argp):
|
|
|
12
12
|
argp.add_argument("product_path", help="path to pvd products file")
|
|
13
13
|
argp.add_argument("attributes_path", help=" path to pvd attributes file")
|
|
14
14
|
argp.add_argument("output_path", help="path where to write output files")
|
|
15
|
+
argp.add_argument(
|
|
16
|
+
"--mode",
|
|
17
|
+
choices=["light", "dark"],
|
|
18
|
+
default="dark",
|
|
19
|
+
help="Choose 'light' or 'dark' mode.",
|
|
20
|
+
)
|
|
15
21
|
argp.add_argument(
|
|
16
22
|
"--multiplicity_preset",
|
|
17
23
|
default="Inferno (matplotlib)",
|
|
@@ -54,6 +60,13 @@ def cli_using_argparse(argp):
|
|
|
54
60
|
default=0.77,
|
|
55
61
|
help="Opacity for sd_attributes",
|
|
56
62
|
)
|
|
63
|
+
argp.add_argument(
|
|
64
|
+
"--animation_size",
|
|
65
|
+
nargs=2,
|
|
66
|
+
type=int,
|
|
67
|
+
default=[800, 800],
|
|
68
|
+
help="Animation size [x,y]",
|
|
69
|
+
)
|
|
57
70
|
argp.add_argument(
|
|
58
71
|
"--animationframename",
|
|
59
72
|
type=str,
|
|
@@ -86,12 +99,14 @@ setup = {
|
|
|
86
99
|
"sd_productspvdDisplay": pvs.GetDisplayProperties(
|
|
87
100
|
sd_productspvd, view=pvs.GetActiveViewOrCreate("RenderView")
|
|
88
101
|
),
|
|
102
|
+
"color": [1, 1, 1] if args.mode == "dark" else [0, 0, 0],
|
|
103
|
+
"inverted_color": [0.129, 0.145, 0.161] if args.mode == "dark" else [1, 1, 1],
|
|
89
104
|
}
|
|
90
105
|
|
|
91
106
|
setup = namedtuple("Setup", setup.keys())(**setup)
|
|
92
107
|
|
|
93
108
|
setup.effectiveradiusLUT.RescaleTransferFunction(0.1380997175392798, 207.7063518856934)
|
|
94
|
-
|
|
109
|
+
materialLibrary1 = pvs.GetMaterialLibrary()
|
|
95
110
|
setup.renderView1.Update()
|
|
96
111
|
|
|
97
112
|
|
|
@@ -127,6 +142,10 @@ def scalar_bar(name, *, y, erLUT):
|
|
|
127
142
|
scalarBar = pvs.GetScalarBar(erLUT.effectiveradiusLUT, y.renderView1)
|
|
128
143
|
scalarBar.ComponentTitle = ""
|
|
129
144
|
scalarBar.Title = name
|
|
145
|
+
scalarBar.TitleFontSize = 25
|
|
146
|
+
scalarBar.LabelFontSize = 25
|
|
147
|
+
scalarBar.LabelColor = setup.color
|
|
148
|
+
scalarBar.TitleColor = setup.color
|
|
130
149
|
y.renderView1.Update()
|
|
131
150
|
|
|
132
151
|
|
|
@@ -139,6 +158,12 @@ def create_glyph(
|
|
|
139
158
|
glyph.ScaleArray = [scale_array1, scale_array2]
|
|
140
159
|
glyph.ScaleFactor = 100
|
|
141
160
|
glyphDisplay.SetScalarBarVisibility(y.renderView1, True)
|
|
161
|
+
multiplicityLUT = pvs.GetColorTransferFunction("multiplicity")
|
|
162
|
+
multiplicityLUTColorBar = pvs.GetScalarBar(multiplicityLUT, y.renderView1)
|
|
163
|
+
multiplicityLUTColorBar.TitleFontSize = 25
|
|
164
|
+
multiplicityLUTColorBar.LabelFontSize = 25
|
|
165
|
+
multiplicityLUTColorBar.LabelColor = setup.color
|
|
166
|
+
multiplicityLUTColorBar.TitleColor = setup.color
|
|
142
167
|
if color_by is True:
|
|
143
168
|
glyphDisplay.ColorArrayName = ["POINTS", ""]
|
|
144
169
|
pvs.ColorBy(glyphDisplay, None)
|
|
@@ -178,27 +203,31 @@ def apply_presets_logscale_opacity_and_update(*, y, attdisplay, erLUT, proddispl
|
|
|
178
203
|
|
|
179
204
|
|
|
180
205
|
def get_layout(*, y):
|
|
206
|
+
pvs.SetViewProperties(
|
|
207
|
+
Background=setup.inverted_color, UseColorPaletteForBackground=0
|
|
208
|
+
)
|
|
209
|
+
pvs.Render(setup.renderView1)
|
|
181
210
|
layout1 = pvs.GetLayout()
|
|
182
|
-
layout1.SetSize(
|
|
211
|
+
layout1.SetSize(args.animation_size)
|
|
212
|
+
layout1.PreviewMode = args.animation_size
|
|
183
213
|
y.renderView1.Update()
|
|
184
214
|
|
|
185
215
|
|
|
186
216
|
def set_current_camera_placement(*, y):
|
|
187
217
|
y.renderView1.InteractionMode = "2D"
|
|
188
218
|
y.renderView1.CameraPosition = [
|
|
189
|
-
836
|
|
190
|
-
677
|
|
191
|
-
-4098
|
|
219
|
+
836,
|
|
220
|
+
677,
|
|
221
|
+
-4098,
|
|
192
222
|
]
|
|
193
|
-
y.renderView1.CameraFocalPoint = [
|
|
223
|
+
y.renderView1.CameraFocalPoint = [636, 1030, 0.0]
|
|
194
224
|
y.renderView1.CameraViewUp = [1.0, 0.0, 0.0]
|
|
195
|
-
y.renderView1.CameraParallelScale =
|
|
225
|
+
y.renderView1.CameraParallelScale = 1560
|
|
196
226
|
y.renderView1.Update()
|
|
197
227
|
|
|
198
228
|
|
|
199
229
|
def axes_settings(*, view):
|
|
200
|
-
|
|
201
|
-
view.Background = [1, 1, 1]
|
|
230
|
+
# setup.renderView1.Background = [1,0.5,0.2]
|
|
202
231
|
view.CenterAxesVisibility = True
|
|
203
232
|
view.OrientationAxesVisibility = False
|
|
204
233
|
axesGrid = view.AxesGrid
|
|
@@ -216,10 +245,10 @@ def axes_settings(*, view):
|
|
|
216
245
|
axesGrid.YTitleFontSize = 30
|
|
217
246
|
axesGrid.YLabelFontSize = 30
|
|
218
247
|
|
|
219
|
-
axesGrid.XTitleColor =
|
|
220
|
-
axesGrid.XLabelColor =
|
|
221
|
-
axesGrid.YTitleColor =
|
|
222
|
-
axesGrid.YLabelColor =
|
|
248
|
+
axesGrid.XTitleColor = setup.color
|
|
249
|
+
axesGrid.XLabelColor = setup.color
|
|
250
|
+
axesGrid.YTitleColor = setup.color
|
|
251
|
+
axesGrid.YLabelColor = setup.color
|
|
223
252
|
axesGrid.GridColor = [0.1, 0.1, 0.1]
|
|
224
253
|
view.CenterAxesVisibility = False
|
|
225
254
|
view.Update()
|
|
@@ -227,9 +256,14 @@ def axes_settings(*, view):
|
|
|
227
256
|
|
|
228
257
|
def time_annotation(*, y):
|
|
229
258
|
time = pvs.AnnotateTimeFilter(
|
|
230
|
-
guiName="AnnotateTimeFilter1", Format="Time:{time:
|
|
259
|
+
guiName="AnnotateTimeFilter1", Scale=1 / 60, Format="Time:{time:g}min"
|
|
231
260
|
)
|
|
232
|
-
pvs.Show(time, y.renderView1)
|
|
261
|
+
timedisplay = pvs.Show(time, y.renderView1)
|
|
262
|
+
timedisplay.FontSize = 25
|
|
263
|
+
timedisplay.WindowLocation = "Any Location"
|
|
264
|
+
timedisplay.FontSize = 30
|
|
265
|
+
timedisplay.Position = [0.31, 0.9]
|
|
266
|
+
timedisplay.Color = setup.color
|
|
233
267
|
y.renderView1.Update()
|
|
234
268
|
|
|
235
269
|
|
|
@@ -237,10 +271,10 @@ def text(text_in, position_y, *, view):
|
|
|
237
271
|
sentence = pvs.Text()
|
|
238
272
|
sentence.Text = text_in
|
|
239
273
|
textDisplay = pvs.Show(sentence, view)
|
|
240
|
-
textDisplay.Color =
|
|
274
|
+
textDisplay.Color = setup.color
|
|
241
275
|
textDisplay.WindowLocation = "Any Location"
|
|
242
|
-
textDisplay.FontSize =
|
|
243
|
-
textDisplay.Position = [0.
|
|
276
|
+
textDisplay.FontSize = 28
|
|
277
|
+
textDisplay.Position = [0.17, position_y]
|
|
244
278
|
|
|
245
279
|
|
|
246
280
|
def last_anim_frame(animation_frame_name):
|
|
@@ -290,9 +324,11 @@ get_layout(y=setup)
|
|
|
290
324
|
set_current_camera_placement(y=setup)
|
|
291
325
|
axes_settings(view=setup.renderView1)
|
|
292
326
|
time_annotation(y=setup)
|
|
293
|
-
text("Arrows scale with Courant
|
|
294
|
-
text("
|
|
295
|
-
|
|
327
|
+
text("Arrows scale with Courant", 0.15, view=setup.renderView1)
|
|
328
|
+
text("number C=u·Δt/Δx, reflecting", 0.1, view=setup.renderView1)
|
|
329
|
+
text("the grid spacing Δx and Δy.", 0.05, view=setup.renderView1)
|
|
330
|
+
if args.animationframename is not None:
|
|
331
|
+
last_anim_frame(animation_frame_name=args.animationframename)
|
|
296
332
|
scene = pvs.GetAnimationScene()
|
|
297
333
|
scene.UpdateAnimationUsingDataTimeSteps()
|
|
298
334
|
pvs.Render(setup.renderView1)
|