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.
Files changed (179) hide show
  1. {pysdm_examples-2.128 → pysdm_examples-2.130}/PKG-INFO +3 -1
  2. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/run_ARG_parcel.py +4 -4
  3. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/simulation.py +4 -4
  4. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_2020_MasterThesis/fig_5_SCIPY_VS_ADAPTIVE.py +2 -2
  5. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Grabowski_and_Pawlowska_2023/simulation.py +4 -8
  6. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/simulation.py +3 -3
  7. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kreidenweis_et_al_2003/simulation.py +1 -1
  8. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/simulation.py +2 -2
  9. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/profile_plotter.py +6 -2
  10. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/simulation.py +1 -1
  11. pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/__init__.py +7 -0
  12. pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/data/reference_bulk.py +47 -0
  13. pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/data/simulation_data.py +22 -0
  14. pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/settings.py +66 -0
  15. pysdm_examples-2.130/PySDM_examples/Spichtinger_et_al_2023/simulation.py +121 -0
  16. pysdm_examples-2.130/PySDM_examples/Zaba_et_al_2025/__init__.py +0 -0
  17. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/make_default_product_collection.py +1 -1
  18. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/pvanim.py +57 -21
  19. {pysdm_examples-2.128 → pysdm_examples-2.130}/docs/pysdm_examples_landing.md +2 -0
  20. {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/PKG-INFO +3 -1
  21. {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/SOURCES.txt +6 -0
  22. {pysdm_examples-2.128 → pysdm_examples-2.130}/MANIFEST.in +0 -0
  23. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abade_and_Albuquerque_2024/__init__.py +0 -0
  24. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abade_and_Albuquerque_2024/settings.py +0 -0
  25. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abade_and_Albuquerque_2024/simulation.py +0 -0
  26. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/__init__.py +0 -0
  27. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/aerosol.py +0 -0
  28. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_ARG2000_paper.py +0 -0
  29. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_CloudMicrophysics_ARG.py +0 -0
  30. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/__init__.py +0 -0
  31. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/simulation.py +0 -0
  32. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/table.py +0 -0
  33. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/table_1.py +0 -0
  34. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Alpert_and_Knopf_2016/table_2.py +0 -0
  35. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/__init__.py +0 -0
  36. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/example.py +0 -0
  37. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_and_Shima_2017/settings.py +0 -0
  38. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/__init__.py +0 -0
  39. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/example.py +0 -0
  40. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/example_benchmark.py +0 -0
  41. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/settings.py +0 -0
  42. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2015/spin_up.py +0 -0
  43. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/__init__.py +0 -0
  44. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/commons.py +0 -0
  45. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/curved_text.py +0 -0
  46. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/frozen_fraction.py +0 -0
  47. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/make_particulator.py +0 -0
  48. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/plots.py +0 -0
  49. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Arabas_et_al_2025/run_simulation.py +0 -0
  50. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_2020_MasterThesis/__init__.py +0 -0
  51. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_2020_MasterThesis/fig_4_adaptive_sdm.py +0 -0
  52. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_et_al_2021/__init__.py +0 -0
  53. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bartman_et_al_2021/label.py +0 -0
  54. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/__init__.py +0 -0
  55. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/example.py +0 -0
  56. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/example_fig_6.py +0 -0
  57. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/settings.py +0 -0
  58. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Berry_1967/spectrum_plotter.py +0 -0
  59. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bieli_et_al_2022/__init__.py +0 -0
  60. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bieli_et_al_2022/settings.py +0 -0
  61. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bieli_et_al_2022/simulation.py +0 -0
  62. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bolin_1958/__init__.py +0 -0
  63. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bolot_et_al_2013/__init__.py +0 -0
  64. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/__init__.py +0 -0
  65. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/performance_comparison_Srivastava_Setup.py +0 -0
  66. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/setups.py +0 -0
  67. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Bulenok_2023_MasterThesis/utils.py +0 -0
  68. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Ervens_and_Feingold_2012/__init__.py +0 -0
  69. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Ervens_and_Feingold_2012/settings.py +0 -0
  70. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Fisher_1991/__init__.py +0 -0
  71. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Gedzelman_and_Arnold_1994/__init__.py +0 -0
  72. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Gonfiantini_1986/__init__.py +0 -0
  73. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Grabowski_and_Pawlowska_2023/__init__.py +0 -0
  74. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Grabowski_and_Pawlowska_2023/settings.py +0 -0
  75. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Graf_et_al_2019/__init__.py +0 -0
  76. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jaruga_and_Pawlowska_2018/__init__.py +0 -0
  77. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/__init__.py +0 -0
  78. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/plotting.py +0 -0
  79. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/settings.py +0 -0
  80. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jensen_and_Nugent_2017/table_3.py +0 -0
  81. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jouzel_and_Merlivat_1984/__init__.py +0 -0
  82. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Jouzel_and_Merlivat_1984/thermodynamic_profiles.py +0 -0
  83. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kinzer_And_Gunn_1951/__init__.py +0 -0
  84. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kinzer_And_Gunn_1951/table_1_and_2.py +0 -0
  85. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kreidenweis_et_al_2003/__init__.py +0 -0
  86. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Kreidenweis_et_al_2003/settings.py +0 -0
  87. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lamb_et_al_2017/__init__.py +0 -0
  88. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/__init__.py +0 -0
  89. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/aerosol.py +0 -0
  90. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/aerosol_code.py +0 -0
  91. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/constants_def.py +0 -0
  92. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/plot_helper.py +0 -0
  93. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Lowe_et_al_2019/settings.py +0 -0
  94. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Merlivat_and_Nief_1967/__init__.py +0 -0
  95. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Miyake_et_al_1968/__init__.py +0 -0
  96. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Morrison_and_Grabowski_2007/__init__.py +0 -0
  97. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Morrison_and_Grabowski_2007/common.py +0 -0
  98. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Morrison_and_Grabowski_2007/strato_cumulus.py +0 -0
  99. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Niedermeier_et_al_2014/__init__.py +0 -0
  100. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Niedermeier_et_al_2014/settings.py +0 -0
  101. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Niedermeier_et_al_2014/simulation.py +0 -0
  102. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pierchala_et_al_2022/__init__.py +0 -0
  103. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pierchala_et_al_2022/commons.py +0 -0
  104. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pruppacher_and_Rasmussen_1979/__init__.py +0 -0
  105. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/__init__.py +0 -0
  106. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/settings.py +0 -0
  107. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Pyrcel/simulation.py +0 -0
  108. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Rogers_1975/__init__.py +0 -0
  109. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Rozanski_and_Sonntag_1982/__init__.py +0 -0
  110. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Rozanski_and_Sonntag_1982/multibox.py +0 -0
  111. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/__init__.py +0 -0
  112. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/error_measure.py +0 -0
  113. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/example.py +0 -0
  114. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/example_timing.py +0 -0
  115. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/settings.py +0 -0
  116. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/spectrum_plotter.py +0 -0
  117. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/tutorial_example.py +0 -0
  118. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/tutorial_plotter.py +0 -0
  119. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shima_et_al_2009/tutorial_settings.py +0 -0
  120. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/__init__.py +0 -0
  121. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/mpdata_1d.py +0 -0
  122. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/plot.py +0 -0
  123. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Shipway_and_Hill_2012/settings.py +0 -0
  124. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Singer_Ward/__init__.py +0 -0
  125. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Singer_Ward/aerosol.py +0 -0
  126. {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
  127. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/__init__.py +0 -0
  128. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/equations.py +0 -0
  129. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/example.py +0 -0
  130. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/settings.py +0 -0
  131. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Srivastava_1982/simulation.py +0 -0
  132. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Stewart_1975/__init__.py +0 -0
  133. {pysdm_examples-2.128/PySDM_examples/Zaba_et_al_2025 → pysdm_examples-2.130/PySDM_examples/Toon_et_al_1980}/__init__.py +0 -0
  134. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Van_Hook_1968/__init__.py +0 -0
  135. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Yang_et_al_2018/__init__.py +0 -0
  136. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Yang_et_al_2018/settings.py +0 -0
  137. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/Yang_et_al_2018/simulation.py +0 -0
  138. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/_HOWTOs/__init__.py +0 -0
  139. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/__init__.py +0 -0
  140. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/__init__.py +0 -0
  141. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/cloudy_data.py +0 -0
  142. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/cloudy_data_0d.py +0 -0
  143. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/settings1D.py +0 -0
  144. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Azimi/simulation_0D.py +0 -0
  145. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/__init__.py +0 -0
  146. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/plot_rates.py +0 -0
  147. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/settings1D.py +0 -0
  148. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/settings_0D.py +0 -0
  149. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/simulation1D.py +0 -0
  150. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_0D.py +0 -0
  151. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_ss.py +0 -0
  152. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/seeding/__init__.py +0 -0
  153. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/seeding/settings.py +0 -0
  154. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/seeding/simulation.py +0 -0
  155. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/__init__.py +0 -0
  156. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/basic_simulation.py +0 -0
  157. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/dummy_controller.py +0 -0
  158. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/__init__.py +0 -0
  159. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/fields.py +0 -0
  160. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui.py +0 -0
  161. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui_controller.py +0 -0
  162. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui_settings.py +0 -0
  163. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/gui_viewer.py +0 -0
  164. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/mpdata_2d.py +0 -0
  165. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/plots.py +0 -0
  166. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/simulation.py +0 -0
  167. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/kinematic_2d/storage.py +0 -0
  168. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/progbar_controller.py +0 -0
  169. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/read_vtk_1d.py +0 -0
  170. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/widgets/__init__.py +0 -0
  171. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/widgets/freezer.py +0 -0
  172. {pysdm_examples-2.128 → pysdm_examples-2.130}/PySDM_examples/utils/widgets/progbar_updater.py +0 -0
  173. {pysdm_examples-2.128 → pysdm_examples-2.130}/README.md +0 -0
  174. {pysdm_examples-2.128 → pysdm_examples-2.130}/pyproject.toml +0 -0
  175. {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/dependency_links.txt +0 -0
  176. {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/requires.txt +0 -0
  177. {pysdm_examples-2.128 → pysdm_examples-2.130}/pysdm_examples.egg-info/top_level.txt +0 -0
  178. {pysdm_examples-2.128 → pysdm_examples-2.130}/setup.cfg +0 -0
  179. {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.128
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.PeakSupersaturation(name="S max"),
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 supersaturation")
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 supersaturation": tuple([] for _ in range(particulator.n_sd)),
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 supersaturation"][i][-1] < RHmax:
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]
@@ -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", unit="%"),
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["S"].append(self.particulator.products["RH"].get()[cell_id] / 100 - 1)
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
- "S": [],
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["S"]
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 supersaturation",
42
- "equilibrium supersaturation",
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 supersaturation": tuple(
84
- [] for _ in range(self.particulator.n_sd)
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
  }
@@ -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
- PeakSupersaturation,
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 supersaturation")
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
- PeakSupersaturation(name="S_max"),
96
+ PeakSaturation(name="S_max"),
97
97
  ParcelDisplacement(name="z"),
98
98
  Time(name="t"),
99
99
  ActivatedMeanRadius(
@@ -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.PeakSupersaturation(unit="%", name="S_max"),
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.PeakSupersaturation(unit="%", name="S_max"),
85
- PySDM_products.AmbientRelativeHumidity(unit="%", name="RH"),
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
- np.asarray(output["products"]["S_max"]) - 100,
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 S = {np.nanmax(output['products']['S_max'])-100:.2f}%")
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()
@@ -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.PeakSupersaturation(unit="%"),
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,7 @@
1
+ # pylint: disable=invalid-name
2
+ """
3
+ homogeneous nucleation event example based on Fig. B1. in
4
+ [Spichtinger et al. 2023](https://doi.org/10.5194/acp-23-2035-2023)
5
+ """
6
+ from .simulation import Simulation
7
+ from .settings import Settings
@@ -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]
@@ -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.PeakSupersaturation(unit="%", name="S_max"))
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(1205, 739)
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.5045867211775,
190
- 677.8909274570431,
191
- -4098.0762113533165,
219
+ 836,
220
+ 677,
221
+ -4098,
192
222
  ]
193
- y.renderView1.CameraFocalPoint = [836.5045867211775, 677.8909274570431, 0.0]
223
+ y.renderView1.CameraFocalPoint = [636, 1030, 0.0]
194
224
  y.renderView1.CameraViewUp = [1.0, 0.0, 0.0]
195
- y.renderView1.CameraParallelScale = 1060.6601717798205
225
+ y.renderView1.CameraParallelScale = 1560
196
226
  y.renderView1.Update()
197
227
 
198
228
 
199
229
  def axes_settings(*, view):
200
- view.ViewSize = [2000, 800]
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 = [1.0, 1.0, 1.0]
220
- axesGrid.XLabelColor = [1.0, 1.0, 1.0]
221
- axesGrid.YTitleColor = [1.0, 1.0, 1.0]
222
- axesGrid.YLabelColor = [1.0, 1.0, 1.0]
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:f}s"
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 = [1.0, 1.0, 1.0]
274
+ textDisplay.Color = setup.color
241
275
  textDisplay.WindowLocation = "Any Location"
242
- textDisplay.FontSize = 16
243
- textDisplay.Position = [0.01, position_y]
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 number C=u*Δt/Δx,", 0.7, view=setup.renderView1)
294
- text("reflecting the grid spacing Δx and Δy.", 0.65, view=setup.renderView1)
295
- last_anim_frame(animation_frame_name=args.animationframename)
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)