PySDM-examples 3.0.0rc30__tar.gz → 3.0.0rc31__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.
Files changed (195) hide show
  1. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PKG-INFO +2 -2
  2. pysdm_examples-3.0.0rc31/PySDM_examples/Luettmer_homogeneous_freezing/__init__.py +17 -0
  3. pysdm_examples-3.0.0rc31/PySDM_examples/Luettmer_homogeneous_freezing/commons.py +91 -0
  4. pysdm_examples-3.0.0rc31/PySDM_examples/Luettmer_homogeneous_freezing/plot.py +546 -0
  5. pysdm_examples-3.0.0rc31/PySDM_examples/Luettmer_homogeneous_freezing/settings.py +99 -0
  6. pysdm_examples-3.0.0rc31/PySDM_examples/Luettmer_homogeneous_freezing/simulation.py +191 -0
  7. pysdm_examples-3.0.0rc31/PySDM_examples/Murray_et_al_2010/__init__.py +9 -0
  8. pysdm_examples-3.0.0rc31/PySDM_examples/Murray_et_al_2010/simulation.py +172 -0
  9. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/pysdm_examples.egg-info/PKG-INFO +2 -2
  10. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/pysdm_examples.egg-info/SOURCES.txt +7 -0
  11. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/pysdm_examples.egg-info/requires.txt +1 -1
  12. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/setup.py +1 -1
  13. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/MANIFEST.in +0 -0
  14. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abade_and_Albuquerque_2024/__init__.py +0 -0
  15. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abade_and_Albuquerque_2024/settings.py +0 -0
  16. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abade_and_Albuquerque_2024/simulation.py +0 -0
  17. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abdul_Razzak_Ghan_2000/__init__.py +0 -0
  18. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abdul_Razzak_Ghan_2000/aerosol.py +0 -0
  19. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_ARG2000_paper.py +0 -0
  20. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_CloudMicrophysics_ARG.py +0 -0
  21. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Abdul_Razzak_Ghan_2000/run_ARG_parcel.py +0 -0
  22. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Alpert_and_Knopf_2016/__init__.py +0 -0
  23. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Alpert_and_Knopf_2016/simulation.py +0 -0
  24. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Alpert_and_Knopf_2016/table.py +0 -0
  25. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Alpert_and_Knopf_2016/table_1.py +0 -0
  26. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Alpert_and_Knopf_2016/table_2.py +0 -0
  27. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_and_Pawlowska_2011/__init__.py +0 -0
  28. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_and_Pawlowska_2011/settings.py +0 -0
  29. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_and_Pawlowska_2011/simulation.py +0 -0
  30. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_and_Shima_2017/__init__.py +0 -0
  31. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_and_Shima_2017/example.py +0 -0
  32. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_and_Shima_2017/settings.py +0 -0
  33. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_and_Shima_2017/simulation.py +0 -0
  34. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2015/__init__.py +0 -0
  35. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2015/example.py +0 -0
  36. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2015/example_benchmark.py +0 -0
  37. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2015/settings.py +0 -0
  38. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2015/spin_up.py +0 -0
  39. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2025/__init__.py +0 -0
  40. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2025/commons.py +0 -0
  41. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2025/curved_text.py +0 -0
  42. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2025/frozen_fraction.py +0 -0
  43. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2025/make_particulator.py +0 -0
  44. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2025/plots.py +0 -0
  45. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Arabas_et_al_2025/run_simulation.py +0 -0
  46. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bartman_2020_MasterThesis/__init__.py +0 -0
  47. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bartman_2020_MasterThesis/fig_4_adaptive_sdm.py +0 -0
  48. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bartman_2020_MasterThesis/fig_5_SCIPY_VS_ADAPTIVE.py +0 -0
  49. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bartman_et_al_2021/__init__.py +0 -0
  50. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bartman_et_al_2021/label.py +0 -0
  51. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Berry_1967/__init__.py +0 -0
  52. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Berry_1967/example.py +0 -0
  53. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Berry_1967/example_fig_6.py +0 -0
  54. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Berry_1967/settings.py +0 -0
  55. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Berry_1967/spectrum_plotter.py +0 -0
  56. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bieli_et_al_2022/__init__.py +0 -0
  57. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bieli_et_al_2022/settings.py +0 -0
  58. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bieli_et_al_2022/simulation.py +0 -0
  59. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bolin_1958/__init__.py +0 -0
  60. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bolot_et_al_2013/__init__.py +0 -0
  61. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bulenok_2023_MasterThesis/__init__.py +0 -0
  62. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bulenok_2023_MasterThesis/performance_comparison_Srivastava_Setup.py +0 -0
  63. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bulenok_2023_MasterThesis/setups.py +0 -0
  64. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Bulenok_2023_MasterThesis/utils.py +0 -0
  65. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Ervens_and_Feingold_2012/__init__.py +0 -0
  66. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Ervens_and_Feingold_2012/settings.py +0 -0
  67. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Fisher_1991/__init__.py +0 -0
  68. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Gedzelman_and_Arnold_1994/__init__.py +0 -0
  69. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Gonfiantini_1986/__init__.py +0 -0
  70. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Grabowski_and_Pawlowska_2023/__init__.py +0 -0
  71. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Grabowski_and_Pawlowska_2023/settings.py +0 -0
  72. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Grabowski_and_Pawlowska_2023/simulation.py +0 -0
  73. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Graf_et_al_2019/__init__.py +0 -0
  74. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jaruga_and_Pawlowska_2018/__init__.py +0 -0
  75. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jensen_and_Nugent_2017/__init__.py +0 -0
  76. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jensen_and_Nugent_2017/plotting.py +0 -0
  77. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jensen_and_Nugent_2017/settings.py +0 -0
  78. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jensen_and_Nugent_2017/simulation.py +0 -0
  79. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jensen_and_Nugent_2017/table_3.py +0 -0
  80. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jouzel_and_Merlivat_1984/__init__.py +0 -0
  81. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Jouzel_and_Merlivat_1984/thermodynamic_profiles.py +0 -0
  82. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Kinzer_And_Gunn_1951/__init__.py +0 -0
  83. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Kinzer_And_Gunn_1951/table_1_and_2.py +0 -0
  84. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Kreidenweis_et_al_2003/__init__.py +0 -0
  85. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Kreidenweis_et_al_2003/settings.py +0 -0
  86. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Kreidenweis_et_al_2003/simulation.py +0 -0
  87. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lamb_et_al_2017/__init__.py +0 -0
  88. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Long_1974/__init__.py +0 -0
  89. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Long_1974/settings.py +0 -0
  90. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Long_1974/simulation.py +0 -0
  91. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lowe_et_al_2019/__init__.py +0 -0
  92. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lowe_et_al_2019/aerosol.py +0 -0
  93. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lowe_et_al_2019/aerosol_code.py +0 -0
  94. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lowe_et_al_2019/constants_def.py +0 -0
  95. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lowe_et_al_2019/plot_helper.py +0 -0
  96. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lowe_et_al_2019/settings.py +0 -0
  97. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Lowe_et_al_2019/simulation.py +0 -0
  98. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Matsushima_et_al_2023/__init__.py +0 -0
  99. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Merlivat_and_Nief_1967/__init__.py +0 -0
  100. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Miyake_et_al_1968/__init__.py +0 -0
  101. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Morrison_and_Grabowski_2007/__init__.py +0 -0
  102. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Morrison_and_Grabowski_2007/common.py +0 -0
  103. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Morrison_and_Grabowski_2007/strato_cumulus.py +0 -0
  104. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Niedermeier_et_al_2014/__init__.py +0 -0
  105. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Niedermeier_et_al_2014/settings.py +0 -0
  106. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Niedermeier_et_al_2014/simulation.py +0 -0
  107. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Pierchala_et_al_2022/__init__.py +0 -0
  108. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Pierchala_et_al_2022/commons.py +0 -0
  109. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Pruppacher_and_Rasmussen_1979/__init__.py +0 -0
  110. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Pyrcel/__init__.py +0 -0
  111. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Pyrcel/profile_plotter.py +0 -0
  112. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Pyrcel/settings.py +0 -0
  113. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Pyrcel/simulation.py +0 -0
  114. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Rogers_1975/__init__.py +0 -0
  115. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Rozanski_and_Sonntag_1982/__init__.py +0 -0
  116. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Rozanski_and_Sonntag_1982/multibox.py +0 -0
  117. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/__init__.py +0 -0
  118. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/error_measure.py +0 -0
  119. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/example.py +0 -0
  120. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/example_timing.py +0 -0
  121. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/settings.py +0 -0
  122. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/spectrum_plotter.py +0 -0
  123. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/tutorial_example.py +0 -0
  124. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/tutorial_plotter.py +0 -0
  125. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shima_et_al_2009/tutorial_settings.py +0 -0
  126. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shipway_and_Hill_2012/__init__.py +0 -0
  127. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shipway_and_Hill_2012/mpdata_1d.py +0 -0
  128. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shipway_and_Hill_2012/plot.py +0 -0
  129. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shipway_and_Hill_2012/settings.py +0 -0
  130. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Shipway_and_Hill_2012/simulation.py +0 -0
  131. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Singer_Ward/__init__.py +0 -0
  132. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Singer_Ward/aerosol.py +0 -0
  133. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Spichtinger_et_al_2023/__init__.py +0 -0
  134. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Spichtinger_et_al_2023/data/__init__.py +0 -0
  135. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Spichtinger_et_al_2023/data/reference_bulk.py +0 -0
  136. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Spichtinger_et_al_2023/data/simulation_data.py +0 -0
  137. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Spichtinger_et_al_2023/settings.py +0 -0
  138. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Spichtinger_et_al_2023/simulation.py +0 -0
  139. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Srivastava_1982/__init__.py +0 -0
  140. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Srivastava_1982/equations.py +0 -0
  141. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Srivastava_1982/example.py +0 -0
  142. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Srivastava_1982/settings.py +0 -0
  143. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Srivastava_1982/simulation.py +0 -0
  144. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Stewart_1975/__init__.py +0 -0
  145. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Strzabala_2025_BEng/__init__.py +0 -0
  146. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Toon_et_al_1980/__init__.py +0 -0
  147. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Van_Hook_1968/__init__.py +0 -0
  148. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Ware_et_al_2025/__init__.py +0 -0
  149. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Yang_et_al_2018/__init__.py +0 -0
  150. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Yang_et_al_2018/settings.py +0 -0
  151. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Yang_et_al_2018/simulation.py +0 -0
  152. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/Zaba_et_al/__init__.py +0 -0
  153. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/_HOWTOs/__init__.py +0 -0
  154. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/__init__.py +0 -0
  155. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Azimi/__init__.py +0 -0
  156. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Azimi/cloudy_data.py +0 -0
  157. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Azimi/cloudy_data_0d.py +0 -0
  158. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Azimi/settings1D.py +0 -0
  159. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Azimi/simulation_0D.py +0 -0
  160. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Mackay_et_al_2023/__init__.py +0 -0
  161. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Mackay_et_al_2023/plot_rates.py +0 -0
  162. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Mackay_et_al_2023/settings1D.py +0 -0
  163. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Mackay_et_al_2023/settings_0D.py +0 -0
  164. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Mackay_et_al_2023/simulation1D.py +0 -0
  165. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_0D.py +0 -0
  166. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_ss.py +0 -0
  167. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/seeding/__init__.py +0 -0
  168. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/seeding/settings.py +0 -0
  169. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/seeding/simulation.py +0 -0
  170. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/__init__.py +0 -0
  171. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/basic_simulation.py +0 -0
  172. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/dummy_controller.py +0 -0
  173. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/__init__.py +0 -0
  174. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/fields.py +0 -0
  175. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/gui.py +0 -0
  176. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/gui_controller.py +0 -0
  177. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/gui_settings.py +0 -0
  178. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/gui_viewer.py +0 -0
  179. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/make_default_product_collection.py +0 -0
  180. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/mpdata_2d.py +0 -0
  181. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/plots.py +0 -0
  182. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/simulation.py +0 -0
  183. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/kinematic_2d/storage.py +0 -0
  184. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/progbar_controller.py +0 -0
  185. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/pvanim.py +0 -0
  186. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/read_vtk_1d.py +0 -0
  187. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/widgets/__init__.py +0 -0
  188. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/widgets/freezer.py +0 -0
  189. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/PySDM_examples/utils/widgets/progbar_updater.py +0 -0
  190. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/README.md +0 -0
  191. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/docs/pysdm_examples_landing.md +0 -0
  192. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/pyproject.toml +0 -0
  193. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/pysdm_examples.egg-info/dependency_links.txt +0 -0
  194. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/pysdm_examples.egg-info/top_level.txt +0 -0
  195. {pysdm_examples-3.0.0rc30 → pysdm_examples-3.0.0rc31}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysdm-examples
3
- Version: 3.0.0rc30
3
+ Version: 3.0.0rc31
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
@@ -34,7 +34,7 @@ Requires-Dist: joblib==1.5.3; extra == "ci-version-pins"
34
34
  Requires-Dist: ipywidgets==8.1.7; extra == "ci-version-pins"
35
35
  Requires-Dist: seaborn==0.13.2; extra == "ci-version-pins"
36
36
  Requires-Dist: numdifftools==0.9.42; extra == "ci-version-pins"
37
- Requires-Dist: vtk==9.6.1; extra == "ci-version-pins"
37
+ Requires-Dist: vtk==9.6.2; extra == "ci-version-pins"
38
38
  Requires-Dist: pyrcel==1.3.4; extra == "ci-version-pins"
39
39
  Requires-Dist: pyvinecopulib==0.7.6; extra == "ci-version-pins"
40
40
  Dynamic: author
@@ -0,0 +1,17 @@
1
+ """
2
+ Homogeneous freezing example
3
+
4
+ .. include:: ./fig_1_2_3.ipynb
5
+ .. include:: ./fig_4_5_6_S3_S4.ipynb
6
+ .. include:: ./fig_S1_S2.ipynb
7
+ .. include:: ./simple_homogenous_freezing_example.ipynb
8
+ """
9
+
10
+ from .settings import Settings
11
+ from .simulation import Simulation
12
+ from .plot import (
13
+ plot_thermodynamics_and_bulk,
14
+ plot_freezing_temperatures_histogram,
15
+ plot_freezing_temperatures_histogram_allinone,
16
+ plot_freezing_temperatures_2d_histogram_seaborn,
17
+ )
@@ -0,0 +1,91 @@
1
+ """commons for homogeneous freezing notebooks"""
2
+
3
+ from PySDM_examples.Luettmer_homogeneous_freezing.settings import Settings
4
+ from PySDM_examples.Luettmer_homogeneous_freezing.simulation import Simulation
5
+ from PySDM import Formulae
6
+ from PySDM.physics.constants import si
7
+ from PySDM.backends import CPU
8
+
9
+ formulae = Formulae(
10
+ particle_shape_and_density="MixedPhaseSpheres",
11
+ )
12
+
13
+
14
+ def run_simulations(setting):
15
+
16
+ simulation = {
17
+ "settings": setting,
18
+ "ensemble_member_outputs": [],
19
+ }
20
+ for _ in range(setting["number_of_ensemble_runs"]):
21
+ model_setup = Settings(**simulation["settings"])
22
+ model_setup.formulae.seed += 1
23
+ model = Simulation(model_setup)
24
+ simulation["ensemble_member_outputs"].append(model.run())
25
+
26
+ return simulation
27
+
28
+
29
+ def hom_pure_droplet_freezing_backend():
30
+ cmn = {"override_jit_flags": {"parallel": False}}
31
+ backends = {
32
+ "threshold": CPU(
33
+ formulae=Formulae(
34
+ particle_shape_and_density="MixedPhaseSpheres",
35
+ homogeneous_ice_nucleation_rate="Null",
36
+ saturation_vapour_pressure="MurphyKoop2005",
37
+ ),
38
+ **cmn,
39
+ ),
40
+ "KoopMurray2016": CPU(
41
+ formulae=Formulae(
42
+ particle_shape_and_density="MixedPhaseSpheres",
43
+ homogeneous_ice_nucleation_rate="KoopMurray2016",
44
+ saturation_vapour_pressure="MurphyKoop2005",
45
+ ),
46
+ **cmn,
47
+ ),
48
+ "Spichtinger2023": CPU(
49
+ formulae=Formulae(
50
+ particle_shape_and_density="MixedPhaseSpheres",
51
+ homogeneous_ice_nucleation_rate="Koop_Correction",
52
+ saturation_vapour_pressure="MurphyKoop2005",
53
+ ),
54
+ **cmn,
55
+ ),
56
+ "Koop2000": CPU(
57
+ formulae=Formulae(
58
+ particle_shape_and_density="MixedPhaseSpheres",
59
+ homogeneous_ice_nucleation_rate="Koop2000",
60
+ saturation_vapour_pressure="MurphyKoop2005",
61
+ ),
62
+ **cmn,
63
+ ),
64
+ "KoopMurray2016_DWA": CPU(
65
+ formulae=Formulae(
66
+ particle_shape_and_density="MixedPhaseSpheres",
67
+ homogeneous_ice_nucleation_rate="KoopMurray2016_DWA",
68
+ saturation_vapour_pressure="MurphyKoop2005",
69
+ ),
70
+ **cmn,
71
+ ),
72
+ }
73
+ return backends
74
+
75
+
76
+ def hom_pure_droplet_freezing_standard_setup():
77
+ standard = {
78
+ "n_sd": int(1e3),
79
+ "w_updraft": 1.0 * si.meter / si.second,
80
+ "T0": 245 * si.kelvin,
81
+ "dz": 1.0 * si.meter,
82
+ "n_ccn": 750 / si.cm**3,
83
+ "r_ccn": 15 * si.nanometer,
84
+ "type_droplet_distribution": "monodisperse",
85
+ "RH_0": 0.995,
86
+ "p0": 500 * si.hectopascals,
87
+ "deposition_enable": True,
88
+ "number_of_ensemble_runs": 1,
89
+ "silent": True,
90
+ }
91
+ return standard
@@ -0,0 +1,546 @@
1
+ """shared plot functions for homogeneous freezing notebooks"""
2
+
3
+ from matplotlib import pyplot, ticker
4
+ import numpy as np
5
+ import seaborn as sns
6
+ from cycler import cycler
7
+ from PySDM import Formulae
8
+
9
+ formulae = Formulae(particle_shape_and_density="MixedPhaseSpheres")
10
+
11
+ ax_title_size = 18
12
+ ax_lab_fsize = 15
13
+ tick_fsize = 15
14
+ T_frz_bins = np.linspace(-40, -34, num=60, endpoint=True)
15
+ T_frz_bins_kelvin = np.linspace(230, 240, num=100, endpoint=True)
16
+
17
+
18
+ def cumulative_histogram(data, bins, reverse=False, density=True):
19
+ # Compute regular histogram using given bins
20
+ hist, bin_edges = np.histogram(data, bins=bins, density=False)
21
+
22
+ # Cumulative sum
23
+ if reverse:
24
+ cum_hist = np.cumsum(hist[::-1])[::-1]
25
+ cum_hist_0 = cum_hist[0]
26
+ else:
27
+ cum_hist = np.cumsum(hist)
28
+ cum_hist_0 = cum_hist[-1]
29
+
30
+ # Normalize
31
+ if density:
32
+ cum_hist = cum_hist / cum_hist_0
33
+
34
+ bin_centers = 0.5 * (bin_edges[:-1] + bin_edges[1:])
35
+ return cum_hist, bin_centers
36
+
37
+
38
+ def plot_thermodynamics_and_bulk(
39
+ simulation,
40
+ title_add=None,
41
+ show_conc=False,
42
+ show_jhom=True,
43
+ show_tf=True,
44
+ t_lim=None,
45
+ ):
46
+ if title_add is None:
47
+ title_add = ["", "", "", ""]
48
+ plot_daw = False
49
+ output = simulation["ensemble_member_outputs"][0]
50
+ time = output["t"]
51
+ T = np.asarray(output["T"])
52
+ RH = np.asarray(output["RH"]) / 100
53
+ RHi = np.asarray(output["RH_ice"]) / 100
54
+ qc = np.asarray(output["LWC"])
55
+ qi = np.asarray(output["IWC"])
56
+ qv = np.asarray(output["qv"])
57
+ T_frz = np.asarray(output["T_frz"])
58
+ if show_conc:
59
+ nc = np.asarray(output["ns"])
60
+ ni = np.asarray(output["ni"])
61
+
62
+ if t_lim is None:
63
+ t_lim = np.amax(time)
64
+
65
+ first_ice_idx = np.where(qi > 1e-7)[0][0]
66
+ first_ice_time = time[first_ice_idx]
67
+ first_T_frz = T[first_ice_idx]
68
+
69
+ if not show_tf:
70
+ rc = np.asarray(output["rs"])
71
+ ri = np.asarray(output["ri"])
72
+
73
+ if show_jhom:
74
+ svp = Formulae(
75
+ saturation_vapour_pressure="FlatauWalkoCotton"
76
+ ).saturation_vapour_pressure
77
+ a_w_ice = svp.pvs_ice(T) / svp.pvs_water(T)
78
+ d_a_w_ice = (RHi - 1) * a_w_ice
79
+
80
+ j_hom_rate = Formulae(
81
+ homogeneous_ice_nucleation_rate="KoopMurray2016"
82
+ ).homogeneous_ice_nucleation_rate
83
+ koop_murray_2016 = j_hom_rate.j_hom(T, d_a_w_ice)
84
+ j_hom_rate = Formulae(
85
+ homogeneous_ice_nucleation_rate="Koop_Correction"
86
+ ).homogeneous_ice_nucleation_rate
87
+ spichtinger_2023 = j_hom_rate.j_hom(T, d_a_w_ice)
88
+ abs_diff_j_hom = (koop_murray_2016 - spichtinger_2023) / koop_murray_2016
89
+ else:
90
+ radius = np.asarray(output["radius"])
91
+ multiplicity = np.asarray(output["multiplicity"])
92
+
93
+ _, axs = pyplot.subplots(
94
+ 1, 4, figsize=(20, 5), sharex=False, constrained_layout=True
95
+ )
96
+
97
+ # Temperture profile
98
+ iax = 0
99
+ ax = axs[iax]
100
+ ax.plot(time, RH, color="red", linestyle="dashdot", label=r"$S_\text{w}$")
101
+ ax.plot(time, RHi, color="blue", linestyle="--", label=r"$S_\text{i}$")
102
+ ax.set_ylabel("saturation ratio", fontsize=ax_lab_fsize)
103
+ ax.legend(loc="center left", fontsize=ax_lab_fsize)
104
+ ax.set_xlim(time[0], t_lim)
105
+ ax.tick_params(labelsize=tick_fsize)
106
+ ax.set_title(title_add[iax] + r"ambient thermodynamics", fontsize=ax_lab_fsize)
107
+ ax.grid(visible=True)
108
+ ax.axvline(x=first_ice_time, color="black", linestyle=":")
109
+
110
+ twin = ax.twinx()
111
+ twin.plot(time, T, color="black", linestyle="-", label="T")
112
+ twin.set_xlabel("time [s]", fontsize=ax_lab_fsize)
113
+ twin.set_ylabel("temperature [K]", fontsize=ax_lab_fsize)
114
+ twin.legend(loc="upper left", fontsize=ax_lab_fsize)
115
+ twin.tick_params(labelsize=tick_fsize)
116
+
117
+ # mixing ratio and number concentration
118
+ iax = 1
119
+ ax = axs[iax]
120
+ ax.plot(time, qc, color="red", linestyle="dashdot", label=r"$q_\text{w}$")
121
+ ax.plot(time, qi, color="blue", linestyle="--", label=r"$q_\text{i}$")
122
+ ax.plot(time, qv, color="black", linestyle="-", label=r"$q_\text{v}$")
123
+ ax.set_yscale("log")
124
+ ax.set_ylim(1e-5, 1e-2)
125
+ ax.set_xlabel("time [s]", fontsize=ax_lab_fsize)
126
+ ax.set_ylabel(r"mixing ratio [$\mathrm{kg \, kg^{-1}}$]", fontsize=ax_lab_fsize)
127
+ ax.legend(fontsize=ax_lab_fsize)
128
+ ax.tick_params(labelsize=tick_fsize)
129
+ ax.set_xlim(time[0], t_lim)
130
+ ax.grid(visible=True)
131
+ ax.axvline(x=first_ice_time, color="black", linestyle=":")
132
+ ax.set_title(title_add[iax] + r"bulk quantities", fontsize=ax_lab_fsize)
133
+ if show_conc:
134
+ twin = ax.twinx()
135
+ twin.plot(time, nc, color="red", linestyle="densly dashdot", label="water")
136
+ twin.plot(time, ni, color="blue", linestyle="densly dashed", label="ice")
137
+ twin.set_yscale("log")
138
+ twin.set_xlabel("time [s]", fontsize=ax_lab_fsize)
139
+ twin.set_ylabel(
140
+ r"number concentration [$\mathrm{kg^{-1}}$]", fontsize=ax_lab_fsize
141
+ )
142
+ twin.tick_params(labelsize=tick_fsize)
143
+
144
+ iax = 2
145
+ ax = axs[iax]
146
+ if show_tf:
147
+ ax.hist(
148
+ T_frz,
149
+ bins=T_frz_bins_kelvin,
150
+ density=True,
151
+ cumulative=-1,
152
+ alpha=1.0,
153
+ histtype="step",
154
+ linewidth=1.5,
155
+ )
156
+ ax.set_xlim(left=234, right=239)
157
+ ax.set_xlabel("freezing temperature [K]", fontsize=ax_lab_fsize)
158
+ ax.set_ylabel("frozen fraction", fontsize=ax_lab_fsize)
159
+ ax.tick_params(labelsize=tick_fsize)
160
+ ax.grid(visible=True)
161
+ ax.axvline(x=first_T_frz, color="black", linestyle=":")
162
+ ax.set_title(title_add[iax] + r"$T_{frz}$ histogram", fontsize=ax_lab_fsize)
163
+ else:
164
+ ax.plot(time, rc * 1e6, color="red", linestyle="dashdot", label="water")
165
+ ax.plot(time, ri * 1e6, color="blue", linestyle="--", label="ice")
166
+ ax.set_yscale("log")
167
+ ax.set_ylim(1e-2, 1e2)
168
+ ax.set_xlabel("time [s]", fontsize=ax_lab_fsize)
169
+ ax.set_ylabel("mean radius [µm]", fontsize=ax_lab_fsize)
170
+ ax.legend(fontsize=ax_lab_fsize)
171
+ ax.set_xlim(time[0], t_lim)
172
+ ax.tick_params(labelsize=tick_fsize)
173
+ ax.grid(visible=True)
174
+ ax.axvline(x=first_ice_time, color="black", linestyle=":")
175
+ ax.set_title(title_add[iax] + r" mean radius", fontsize=ax_lab_fsize)
176
+
177
+ # Water activity difference profile
178
+ iax = 3
179
+ ax = axs[iax]
180
+ if show_jhom:
181
+ lin_s_SP2023 = "--"
182
+ lin_s_KM2016 = "-"
183
+ if simulation["settings"]["hom_freezing"] == "Spichtinger2023":
184
+ lin_s_SP2023 = "-"
185
+ lin_s_KM2016 = "--"
186
+
187
+ ax.plot(
188
+ time,
189
+ koop_murray_2016,
190
+ color="blue",
191
+ linestyle=lin_s_KM2016,
192
+ label="JHOM-T",
193
+ )
194
+ ax.plot(
195
+ time,
196
+ spichtinger_2023,
197
+ color="red",
198
+ linestyle=lin_s_SP2023,
199
+ label="JHOM-DWA",
200
+ )
201
+ ax.set_ylabel(
202
+ r"nucleation rate [$\mathrm{m^{-3} \, s^{-1}}$]", fontsize=ax_lab_fsize
203
+ )
204
+ ax.set_ylim(1e-30, 1e30)
205
+ ax.set_title(title_add[iax] + r"nucleation rates", fontsize=ax_lab_fsize)
206
+ ax.legend(loc="upper left", fontsize=ax_lab_fsize)
207
+ ax.set_yscale("log")
208
+ ax.set_xlim(time[0], t_lim)
209
+ ax.axvline(x=first_ice_time, color="black", linestyle=":")
210
+ ax.set_xlabel("time [s]", fontsize=ax_lab_fsize)
211
+ if plot_daw:
212
+ twin = ax.twinx()
213
+ twin.plot(
214
+ time,
215
+ d_a_w_ice,
216
+ color="gray",
217
+ linestyle="dashdot",
218
+ label=r"$\Delta a_{w}$",
219
+ )
220
+ twin.set_ylim(0.2, 0.35)
221
+ twin.set_ylabel("water activity difference", fontsize=ax_lab_fsize)
222
+ twin.tick_params(labelsize=tick_fsize)
223
+ twin.legend(loc="lower left", fontsize=ax_lab_fsize)
224
+ else:
225
+ twin = ax.twinx()
226
+ twin.plot(
227
+ time,
228
+ abs_diff_j_hom,
229
+ label=r"$\Delta J_{\mathrm{hom}}$",
230
+ color="gray",
231
+ linestyle="dashdot",
232
+ )
233
+ twin.set_ylim(-10, 10)
234
+ twin.set_ylabel("relative error", fontsize=ax_lab_fsize)
235
+ twin.tick_params(labelsize=tick_fsize)
236
+ twin.legend(loc="lower left", fontsize=ax_lab_fsize)
237
+ else:
238
+ ax.scatter(radius * 1e6, multiplicity)
239
+ ax.set_yscale("log")
240
+ ax.set_xscale("log")
241
+ ax.set_xlim(1e-3, 5e-0)
242
+ ax.set_xlabel("initial radius [µm]", fontsize=ax_lab_fsize)
243
+ ax.set_ylabel("multiplicity", fontsize=ax_lab_fsize)
244
+ ax.set_title(title_add[iax] + r"CCN size distribution", fontsize=ax_lab_fsize)
245
+
246
+ ax.tick_params(labelsize=tick_fsize)
247
+ ax.grid(visible=True)
248
+
249
+
250
+ def plot_freezing_temperatures_histogram(ax, simulation):
251
+
252
+ number_of_ensemble_runs = simulation["settings"]["number_of_ensemble_runs"]
253
+
254
+ for i in range(number_of_ensemble_runs):
255
+ output = simulation["ensemble_member_outputs"][i]
256
+ T_frz = np.asarray(output["T_frz"])
257
+ title = "Nucleation rate=" + simulation["settings"]["hom_freezing"]
258
+
259
+ # Freezing temperatures
260
+ ax.hist(
261
+ T_frz,
262
+ bins=T_frz_bins_kelvin,
263
+ density=True,
264
+ cumulative=-1,
265
+ alpha=1.0,
266
+ histtype="step",
267
+ linewidth=1.5,
268
+ )
269
+
270
+ ax.set_xlim(left=234, right=239)
271
+ ax.axvline(x=235, color="k", linestyle="--")
272
+ ax.set_title(title, fontsize=ax_lab_fsize)
273
+ ax.set_xlabel("freezing temperature [K]", fontsize=ax_lab_fsize)
274
+ ax.set_ylabel("frozen fraction", fontsize=ax_lab_fsize)
275
+ ax.tick_params(labelsize=tick_fsize)
276
+ return ax
277
+
278
+
279
+ def plot_freezing_temperatures_histogram_allinone(
280
+ ax, simulations, title, lloc="upper right"
281
+ ):
282
+
283
+ colors = ["black", "blue", "red"]
284
+ linestyles = ["-", "--", ":"]
285
+
286
+ for k, simulation in enumerate(simulations):
287
+
288
+ number_of_ensemble_runs = simulation["settings"]["number_of_ensemble_runs"]
289
+ n_sd = simulation["settings"]["n_sd"]
290
+ histogram_list = np.zeros((number_of_ensemble_runs, len(T_frz_bins_kelvin) - 1))
291
+ for i in range(number_of_ensemble_runs):
292
+ output = simulation["ensemble_member_outputs"][i]
293
+ T_frz = np.asarray(output["T_frz"])
294
+
295
+ hist, T_frz_bins_center = cumulative_histogram(
296
+ T_frz, T_frz_bins_kelvin, reverse=True
297
+ )
298
+ histogram_list[i, :] = hist
299
+
300
+ max_line = np.max(histogram_list, axis=0)
301
+ mean_line = np.mean(histogram_list, axis=0)
302
+ min_line = np.min(histogram_list, axis=0)
303
+
304
+ ax.plot(
305
+ T_frz_bins_center,
306
+ mean_line,
307
+ color=colors[k],
308
+ linestyle=linestyles[k],
309
+ label=r"$n_\text{sd}$: " + f"{int(n_sd):5.0f}",
310
+ )
311
+ ax.fill_between(
312
+ T_frz_bins_center, min_line, max_line, color=colors[k], alpha=0.2
313
+ )
314
+ ax.set_xlim(left=234.5, right=239)
315
+ ax.set_title(title, fontsize=ax_lab_fsize)
316
+ ax.set_xlabel("freezing temperature [K]", fontsize=ax_lab_fsize)
317
+ ax.set_ylabel("frozen fraction", fontsize=ax_lab_fsize)
318
+ ax.tick_params(labelsize=tick_fsize)
319
+ ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
320
+ ax.xaxis.set_minor_locator(ticker.MultipleLocator(0.5))
321
+ ax.grid(visible=True)
322
+ ax.legend(loc=lloc, fontsize=ax_lab_fsize)
323
+ return ax
324
+
325
+
326
+ def plot_freezing_temperatures_2d_histogram_seaborn(
327
+ ensemble_simulations,
328
+ hom_freezing_type,
329
+ title="",
330
+ height=4,
331
+ width=5,
332
+ ):
333
+
334
+ sns.set_theme(style="ticks")
335
+
336
+ second_axis = True
337
+ y_log = True
338
+
339
+ ens_variable_name = ensemble_simulations["ens_variable_name"]
340
+ simulations = ensemble_simulations[hom_freezing_type]
341
+
342
+ ens_variable = []
343
+ ens_variable_sec = []
344
+ T_frz_hist = []
345
+ multiplicity_hist = []
346
+
347
+ for simulation in simulations:
348
+ if ens_variable_name == "sig":
349
+ ens_variable_value = simulation["settings"]["sigma_droplet_distribution"]
350
+ else:
351
+ ens_variable_value = simulation["settings"][ens_variable_name]
352
+
353
+ output = simulation["ensemble_member_outputs"][0]
354
+ qi = np.asarray(output["IWC"])
355
+ T_frz = np.asarray(output["T_frz"])
356
+ multiplicity = np.asarray(output["multiplicity"])
357
+ first_ice_idx = np.where(qi > 1e-7)[0][0]
358
+
359
+ if ens_variable_name == "n_ccn":
360
+ rs = np.asarray(output["rs"])
361
+ ens_variable_sec_value = rs[first_ice_idx - 1]
362
+ else:
363
+ time = np.asarray(output["t"])
364
+ T = np.asarray(output["T"])
365
+ ens_variable_sec_value = abs(np.mean(np.diff(T) / np.diff(time)))
366
+
367
+ T_frz_hist.extend(T_frz)
368
+ multiplicity_hist.extend(multiplicity)
369
+ ens_variable.extend(np.full_like(T_frz, ens_variable_value))
370
+ ens_variable_sec.append(ens_variable_sec_value)
371
+
372
+ ens_variable = np.array(ens_variable)
373
+ ens_variable_sec = np.array(ens_variable_sec)
374
+ y_label, y_label_sec = "", ""
375
+ if ens_variable_name == "w_updraft":
376
+ y_label = r"vertical updraft [$\mathrm{m \, s^{-1}}$]"
377
+ y_label_sec = r"cooling rate [$\mathrm{mK \, s^{-1}}$]"
378
+ ens_variable_sec = ens_variable_sec * 1e3
379
+ binwidth = 0.25
380
+ elif ens_variable_name == "n_ccn":
381
+ y_label = r"ccn concentration [$\mathrm{cm^{-3}}$]"
382
+ y_label_sec = r"radius [$\mathrm{\mu m}$]"
383
+ ens_variable = ens_variable / 1.0e6
384
+ ens_variable_sec = ens_variable_sec * 1.0e6
385
+ binwidth = 0.25
386
+ elif ens_variable_name == "sig":
387
+ y_label = r"$\sigma$"
388
+ second_axis = False
389
+ y_log = False
390
+ binwidth = 0.1
391
+
392
+ ens_variable_label = np.unique(np.sort(ens_variable))
393
+
394
+ xlim = (232.5, 240)
395
+ h = sns.JointGrid(
396
+ x=T_frz_hist,
397
+ y=ens_variable,
398
+ xlim=xlim,
399
+ )
400
+ if y_log:
401
+ h.ax_joint.set(yscale="log")
402
+
403
+ h.plot_joint(
404
+ sns.histplot,
405
+ stat="probability",
406
+ binwidth=binwidth,
407
+ discrete=(False, False),
408
+ weights=multiplicity_hist,
409
+ pmax=0.8,
410
+ )
411
+
412
+ h.plot_marginals(
413
+ sns.histplot,
414
+ element="step",
415
+ )
416
+ h.set_axis_labels("freezing temperature [K]", y_label, fontsize=ax_lab_fsize)
417
+ h.ax_joint.set_title(
418
+ title,
419
+ pad=50,
420
+ fontsize=ax_title_size,
421
+ )
422
+ h.ax_joint.tick_params(labelsize=tick_fsize)
423
+ h.ax_joint.grid(True, axis="x", which="both", linestyle="-", linewidth=0.6)
424
+ h.ax_marg_x.tick_params(labelsize=tick_fsize)
425
+ h.ax_marg_y.tick_params(labelsize=tick_fsize)
426
+
427
+ h.ax_joint.xaxis.set_major_locator(ticker.MultipleLocator(2, offset=1))
428
+ h.ax_joint.xaxis.set_minor_locator(ticker.MultipleLocator(1, offset=1))
429
+ h.ax_marg_y.remove()
430
+
431
+ if second_axis:
432
+
433
+ ax2 = h.ax_joint.secondary_yaxis("right", functions=(lambda y: y, lambda y: y))
434
+ ax2.set_yticks(ens_variable_label)
435
+ ax2.set_yticklabels([f"{v:.1f}" for v in ens_variable_sec])
436
+ ax2.minorticks_off()
437
+ ax2.tick_params(
438
+ axis="y",
439
+ which="both",
440
+ direction="out",
441
+ length=h.ax_joint.yaxis.get_ticklines()[0].get_markersize(),
442
+ width=h.ax_joint.yaxis.get_ticklines()[0].get_markeredgewidth(),
443
+ labelsize=tick_fsize,
444
+ )
445
+ ax2.set_ylabel(y_label_sec, fontsize=ax_lab_fsize)
446
+
447
+ h.fig.set_size_inches(width, height)
448
+
449
+
450
+ def plot_ensemble_bulk(
451
+ ax, ensemble_simulations, var_name, title_add=""
452
+ ): # pylint: disable=too-many-nested-blocks
453
+
454
+ colors = ["blue", "red", "cyan"]
455
+ linestyles = ["-", "--", ":"]
456
+ pyplot.rcParams["axes.prop_cycle"] = cycler(color=colors) + cycler(
457
+ linestyle=linestyles
458
+ )
459
+
460
+ for ensemble_simulation in ensemble_simulations:
461
+ ens_var = np.asarray(ensemble_simulation["ens_variable"])
462
+ ens_var_name = ensemble_simulation["ens_variable_name"]
463
+ hom_freezing_types = ensemble_simulation["hom_freezing_types"]
464
+ hom_freezing_labels = ensemble_simulation["hom_freezing_labels"]
465
+ len_ens_var = len(ens_var)
466
+
467
+ if ens_var_name == "n_ccn":
468
+ ens_var_scale = 1.0 / 1e6
469
+ else:
470
+ ens_var_scale = 1.0
471
+ if ens_var_name == "sig":
472
+ ens_var_name = "sigma_droplet_distribution"
473
+
474
+ for j, hom_freezing_type in enumerate(hom_freezing_types):
475
+ simulations = ensemble_simulation[hom_freezing_type]
476
+ number_of_ensemble_runs = simulations[0]["settings"][
477
+ "number_of_ensemble_runs"
478
+ ]
479
+ var = np.zeros((len_ens_var, number_of_ensemble_runs))
480
+ for i in range(len_ens_var):
481
+ for simulation in simulations:
482
+ if simulation["settings"][ens_var_name] == ens_var[i]:
483
+ for h in range(number_of_ensemble_runs):
484
+ output = simulation["ensemble_member_outputs"][h]
485
+ if var_name == "freezing_fraction":
486
+ ni = np.asarray(output["ni"])[-1]
487
+ nc = np.asarray(output["ns"])[0]
488
+ var[i, h] = (1 - (nc - ni) / nc) * 100
489
+ else:
490
+ var[i, h] = np.asarray(output[var_name])[-1]
491
+
492
+ if number_of_ensemble_runs > 1:
493
+ ax.fill_betweenx(
494
+ ens_var * ens_var_scale,
495
+ np.min(var, axis=1),
496
+ np.max(var, axis=1),
497
+ alpha=0.2,
498
+ )
499
+ else:
500
+ ax.scatter(
501
+ var[:, 0],
502
+ ens_var * ens_var_scale,
503
+ )
504
+ ax.plot(
505
+ var[:, 0],
506
+ ens_var * ens_var_scale,
507
+ label=hom_freezing_labels[j],
508
+ )
509
+
510
+ title, x_label, y_label, ens_label = "", "", "", ""
511
+ if var_name == "ni":
512
+ ax.set_xscale("log")
513
+ x_label = r"ice number concentration [$\mathrm{kg^{-1}}$]"
514
+ title = r"$n_\text{i}$"
515
+ ax.set_xlim(1e6, 1e10)
516
+ elif var_name == "IWC":
517
+ ax.set_xscale("log")
518
+ x_label = r"mixing ratio [$\mathrm{kg \, kg^{-1}}$]"
519
+ title = "ice mixing ratio"
520
+ ax.set_xlim(1e-4, 1e-3)
521
+ elif var_name == "freezing_fraction":
522
+ title = r"$n_\text{frz}$"
523
+ x_label = r"frozen fraction [$\mathrm{\%}$]"
524
+ ax.set_xlim(0, 20)
525
+
526
+ if ens_var_name == "n_ccn":
527
+ ax.set_yscale("log")
528
+ y_label = r"ccn concentration [$\mathrm{cm^{-3}}$]"
529
+ ens_label = r"$n_\text{ccn}$ ensemble"
530
+ elif ens_var_name == "w_updraft":
531
+ ax.set_yscale("log")
532
+ y_label = r"vertical updraft [$\mathrm{m \, s^{-1}}$]"
533
+ ens_label = "w ensemble"
534
+ elif ens_var_name == "sigma_droplet_distribution":
535
+ y_label = r"standard deviation DSD"
536
+ ens_label = r"$\sigma$ ensemble"
537
+ elif ens_var_name == "n_sd":
538
+ ax.set_yscale("log")
539
+ y_label = "number of super-particles"
540
+ ens_label = r"$n_\text{sd}$ ensemble"
541
+ ax.set_title(title_add + " " + title + " for " + ens_label, fontsize=ax_lab_fsize)
542
+ ax.set_xlabel(x_label, fontsize=ax_lab_fsize)
543
+ ax.set_ylabel(y_label, fontsize=ax_lab_fsize)
544
+ ax.grid(visible=True)
545
+ ax.legend(fontsize=ax_lab_fsize)
546
+ return ax