PySDM-examples 3.0.0rc12__tar.gz → 3.0.0rc16__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 (183) hide show
  1. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PKG-INFO +7 -4
  2. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abade_and_Albuquerque_2024/simulation.py +3 -3
  3. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abdul_Razzak_Ghan_2000/run_ARG_parcel.py +3 -1
  4. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Alpert_and_Knopf_2016/simulation.py +3 -1
  5. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bieli_et_al_2022/simulation.py +1 -1
  6. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Ervens_and_Feingold_2012/settings.py +1 -1
  7. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Grabowski_and_Pawlowska_2023/simulation.py +3 -2
  8. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jensen_and_Nugent_2017/simulation.py +1 -1
  9. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Kreidenweis_et_al_2003/settings.py +12 -8
  10. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lowe_et_al_2019/settings.py +0 -3
  11. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lowe_et_al_2019/simulation.py +3 -2
  12. pysdm_examples-3.0.0rc16/PySDM_examples/Matsushima_et_al_2023/__init__.py +7 -0
  13. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Pyrcel/simulation.py +11 -3
  14. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/example.py +3 -1
  15. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/example_timing.py +3 -1
  16. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/tutorial_example.py +1 -1
  17. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Spichtinger_et_al_2023/settings.py +1 -1
  18. pysdm_examples-3.0.0rc16/PySDM_examples/Strzabala_2025_BEng/__init__.py +8 -0
  19. pysdm_examples-3.0.0rc16/PySDM_examples/Strzabala_2025_BEng/paraview_parcel_model.py +244 -0
  20. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Yang_et_al_2018/settings.py +2 -4
  21. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Yang_et_al_2018/simulation.py +4 -2
  22. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/__init__.py +1 -1
  23. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Azimi/simulation_0D.py +1 -1
  24. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_0D.py +5 -5
  25. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/seeding/settings.py +1 -1
  26. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/seeding/simulation.py +3 -1
  27. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/docs/pysdm_examples_landing.md +5 -0
  28. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/pysdm_examples.egg-info/PKG-INFO +7 -4
  29. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/pysdm_examples.egg-info/SOURCES.txt +3 -0
  30. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/pysdm_examples.egg-info/requires.txt +1 -3
  31. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/setup.py +1 -3
  32. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/MANIFEST.in +0 -0
  33. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abade_and_Albuquerque_2024/__init__.py +0 -0
  34. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abade_and_Albuquerque_2024/settings.py +0 -0
  35. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abdul_Razzak_Ghan_2000/__init__.py +0 -0
  36. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abdul_Razzak_Ghan_2000/aerosol.py +0 -0
  37. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_ARG2000_paper.py +0 -0
  38. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_CloudMicrophysics_ARG.py +0 -0
  39. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Alpert_and_Knopf_2016/__init__.py +0 -0
  40. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Alpert_and_Knopf_2016/table.py +0 -0
  41. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Alpert_and_Knopf_2016/table_1.py +0 -0
  42. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Alpert_and_Knopf_2016/table_2.py +0 -0
  43. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_and_Shima_2017/__init__.py +0 -0
  44. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_and_Shima_2017/example.py +0 -0
  45. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_and_Shima_2017/settings.py +0 -0
  46. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_and_Shima_2017/simulation.py +0 -0
  47. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2015/__init__.py +0 -0
  48. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2015/example.py +0 -0
  49. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2015/example_benchmark.py +0 -0
  50. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2015/settings.py +0 -0
  51. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2015/spin_up.py +0 -0
  52. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2025/__init__.py +0 -0
  53. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2025/commons.py +0 -0
  54. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2025/curved_text.py +0 -0
  55. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2025/frozen_fraction.py +0 -0
  56. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2025/make_particulator.py +0 -0
  57. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2025/plots.py +0 -0
  58. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Arabas_et_al_2025/run_simulation.py +0 -0
  59. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bartman_2020_MasterThesis/__init__.py +0 -0
  60. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bartman_2020_MasterThesis/fig_4_adaptive_sdm.py +0 -0
  61. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bartman_2020_MasterThesis/fig_5_SCIPY_VS_ADAPTIVE.py +0 -0
  62. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bartman_et_al_2021/__init__.py +0 -0
  63. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bartman_et_al_2021/label.py +0 -0
  64. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Berry_1967/__init__.py +0 -0
  65. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Berry_1967/example.py +0 -0
  66. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Berry_1967/example_fig_6.py +0 -0
  67. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Berry_1967/settings.py +0 -0
  68. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Berry_1967/spectrum_plotter.py +0 -0
  69. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bieli_et_al_2022/__init__.py +0 -0
  70. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bieli_et_al_2022/settings.py +0 -0
  71. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bolin_1958/__init__.py +0 -0
  72. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bolot_et_al_2013/__init__.py +0 -0
  73. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bulenok_2023_MasterThesis/__init__.py +0 -0
  74. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bulenok_2023_MasterThesis/performance_comparison_Srivastava_Setup.py +0 -0
  75. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bulenok_2023_MasterThesis/setups.py +0 -0
  76. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Bulenok_2023_MasterThesis/utils.py +0 -0
  77. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Ervens_and_Feingold_2012/__init__.py +0 -0
  78. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Fisher_1991/__init__.py +0 -0
  79. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Gedzelman_and_Arnold_1994/__init__.py +0 -0
  80. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Gonfiantini_1986/__init__.py +0 -0
  81. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Grabowski_and_Pawlowska_2023/__init__.py +0 -0
  82. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Grabowski_and_Pawlowska_2023/settings.py +0 -0
  83. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Graf_et_al_2019/__init__.py +0 -0
  84. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jaruga_and_Pawlowska_2018/__init__.py +0 -0
  85. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jensen_and_Nugent_2017/__init__.py +0 -0
  86. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jensen_and_Nugent_2017/plotting.py +0 -0
  87. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jensen_and_Nugent_2017/settings.py +0 -0
  88. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jensen_and_Nugent_2017/table_3.py +0 -0
  89. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jouzel_and_Merlivat_1984/__init__.py +0 -0
  90. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Jouzel_and_Merlivat_1984/thermodynamic_profiles.py +0 -0
  91. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Kinzer_And_Gunn_1951/__init__.py +0 -0
  92. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Kinzer_And_Gunn_1951/table_1_and_2.py +0 -0
  93. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Kreidenweis_et_al_2003/__init__.py +0 -0
  94. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Kreidenweis_et_al_2003/simulation.py +0 -0
  95. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lamb_et_al_2017/__init__.py +0 -0
  96. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lowe_et_al_2019/__init__.py +0 -0
  97. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lowe_et_al_2019/aerosol.py +0 -0
  98. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lowe_et_al_2019/aerosol_code.py +0 -0
  99. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lowe_et_al_2019/constants_def.py +0 -0
  100. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Lowe_et_al_2019/plot_helper.py +0 -0
  101. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Merlivat_and_Nief_1967/__init__.py +0 -0
  102. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Miyake_et_al_1968/__init__.py +0 -0
  103. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Morrison_and_Grabowski_2007/__init__.py +0 -0
  104. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Morrison_and_Grabowski_2007/common.py +0 -0
  105. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Morrison_and_Grabowski_2007/strato_cumulus.py +0 -0
  106. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Niedermeier_et_al_2014/__init__.py +0 -0
  107. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Niedermeier_et_al_2014/settings.py +0 -0
  108. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Niedermeier_et_al_2014/simulation.py +0 -0
  109. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Pierchala_et_al_2022/__init__.py +0 -0
  110. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Pierchala_et_al_2022/commons.py +0 -0
  111. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Pruppacher_and_Rasmussen_1979/__init__.py +0 -0
  112. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Pyrcel/__init__.py +0 -0
  113. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Pyrcel/profile_plotter.py +0 -0
  114. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Pyrcel/settings.py +0 -0
  115. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Rogers_1975/__init__.py +0 -0
  116. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Rozanski_and_Sonntag_1982/__init__.py +0 -0
  117. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Rozanski_and_Sonntag_1982/multibox.py +0 -0
  118. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/__init__.py +0 -0
  119. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/error_measure.py +0 -0
  120. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/settings.py +0 -0
  121. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/spectrum_plotter.py +0 -0
  122. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/tutorial_plotter.py +0 -0
  123. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shima_et_al_2009/tutorial_settings.py +0 -0
  124. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shipway_and_Hill_2012/__init__.py +0 -0
  125. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shipway_and_Hill_2012/mpdata_1d.py +0 -0
  126. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shipway_and_Hill_2012/plot.py +0 -0
  127. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shipway_and_Hill_2012/settings.py +0 -0
  128. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Shipway_and_Hill_2012/simulation.py +0 -0
  129. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Singer_Ward/__init__.py +0 -0
  130. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Singer_Ward/aerosol.py +0 -0
  131. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Spichtinger_et_al_2023/__init__.py +0 -0
  132. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Spichtinger_et_al_2023/data/__init__.py +0 -0
  133. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Spichtinger_et_al_2023/data/reference_bulk.py +0 -0
  134. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Spichtinger_et_al_2023/data/simulation_data.py +0 -0
  135. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Spichtinger_et_al_2023/simulation.py +0 -0
  136. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Srivastava_1982/__init__.py +0 -0
  137. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Srivastava_1982/equations.py +0 -0
  138. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Srivastava_1982/example.py +0 -0
  139. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Srivastava_1982/settings.py +0 -0
  140. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Srivastava_1982/simulation.py +0 -0
  141. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Stewart_1975/__init__.py +0 -0
  142. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Toon_et_al_1980/__init__.py +0 -0
  143. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Van_Hook_1968/__init__.py +0 -0
  144. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Ware_et_al_2025/__init__.py +0 -0
  145. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Yang_et_al_2018/__init__.py +0 -0
  146. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/Zaba_et_al/__init__.py +0 -0
  147. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/_HOWTOs/__init__.py +0 -0
  148. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Azimi/__init__.py +0 -0
  149. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Azimi/cloudy_data.py +0 -0
  150. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Azimi/cloudy_data_0d.py +0 -0
  151. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Azimi/settings1D.py +0 -0
  152. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Mackay_et_al_2023/__init__.py +0 -0
  153. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Mackay_et_al_2023/plot_rates.py +0 -0
  154. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Mackay_et_al_2023/settings1D.py +0 -0
  155. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Mackay_et_al_2023/settings_0D.py +0 -0
  156. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Mackay_et_al_2023/simulation1D.py +0 -0
  157. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_ss.py +0 -0
  158. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/seeding/__init__.py +0 -0
  159. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/__init__.py +0 -0
  160. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/basic_simulation.py +0 -0
  161. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/dummy_controller.py +0 -0
  162. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/__init__.py +0 -0
  163. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/fields.py +0 -0
  164. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/gui.py +0 -0
  165. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/gui_controller.py +0 -0
  166. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/gui_settings.py +0 -0
  167. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/gui_viewer.py +0 -0
  168. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/make_default_product_collection.py +0 -0
  169. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/mpdata_2d.py +0 -0
  170. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/plots.py +0 -0
  171. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/simulation.py +0 -0
  172. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/kinematic_2d/storage.py +0 -0
  173. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/progbar_controller.py +0 -0
  174. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/pvanim.py +0 -0
  175. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/read_vtk_1d.py +0 -0
  176. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/widgets/__init__.py +0 -0
  177. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/widgets/freezer.py +0 -0
  178. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/PySDM_examples/utils/widgets/progbar_updater.py +0 -0
  179. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/README.md +0 -0
  180. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/pyproject.toml +0 -0
  181. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/pysdm_examples.egg-info/dependency_links.txt +0 -0
  182. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/pysdm_examples.egg-info/top_level.txt +0 -0
  183. {pysdm_examples-3.0.0rc12 → pysdm_examples-3.0.0rc16}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysdm-examples
3
- Version: 3.0.0rc12
3
+ Version: 3.0.0rc16
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
@@ -15,7 +15,6 @@ Requires-Dist: PyMPDATA
15
15
  Requires-Dist: open-atmos-jupyter-utils
16
16
  Requires-Dist: pystrict
17
17
  Requires-Dist: matplotlib
18
- Requires-Dist: Pillow
19
18
  Requires-Dist: joblib
20
19
  Requires-Dist: ipywidgets
21
20
  Requires-Dist: seaborn
@@ -26,11 +25,10 @@ Requires-Dist: pyvinecopulib
26
25
  Requires-Dist: networkx
27
26
  Provides-Extra: ci-version-pins
28
27
  Requires-Dist: PySDM[CI_version_pins]; extra == "ci-version-pins"
29
- Requires-Dist: PyMPDATA==1.6.1; extra == "ci-version-pins"
28
+ Requires-Dist: PyMPDATA==1.6.3; extra == "ci-version-pins"
30
29
  Requires-Dist: open-atmos-jupyter-utils==1.3.0; extra == "ci-version-pins"
31
30
  Requires-Dist: pystrict==1.3; extra == "ci-version-pins"
32
31
  Requires-Dist: matplotlib!=3.9.1; extra == "ci-version-pins"
33
- Requires-Dist: Pillow<11.3.0; extra == "ci-version-pins"
34
32
  Requires-Dist: joblib==1.5.1; extra == "ci-version-pins"
35
33
  Requires-Dist: ipywidgets==8.1.7; extra == "ci-version-pins"
36
34
  Requires-Dist: seaborn==0.13.2; extra == "ci-version-pins"
@@ -137,6 +135,7 @@ Example notebooks include:
137
135
  - <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Yang_et_al_2018.html">Yang_et_al_2018</a>: polydisperse particle spectrum, activation/deactivation cycles
138
136
  - <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Abdul_Razzak_Ghan_2000.html">Abdul_Razzak_Ghan_2000</a>: polydisperse activation, comparison against <mark>GCM parameterisation</mark>
139
137
  - <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Pyrcel.html">Pyrcel</a>: polydisperse activation, mimicking example test case from <mark>Pyrcel</mark> documentation
138
+ - <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Strzabala_2025_BEng.html">Strzabala_2025_BEng</a>: ParaView visualisation example
140
139
  - <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Lowe_et_al_2019.html">Lowe_et_al_2019</a>: externally mixed polydisperse size spectrum with <mark>surface-active organics</mark> case
141
140
  - <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Grabowski_and_Pawlowska_2023.html">Grabowski_and_Pawlowska_2023</a>: polydisperse activation, focus on <mark>ripening</mark>
142
141
  - <a href="https://open-atmos.github.io/PySDM/PySDM_examples/Jensen_and_Nugent_2017.html">Jensen_and_Nugent_2017</a>: polydisperse activation featuring <mark>giant CCN</mark>
@@ -148,6 +147,10 @@ Example notebooks include:
148
147
 
149
148
  The parcel environment is also featured in the <a href="https://open-atmos.github.io/PySDM/PySDM.html#tutorials">PySDM tutorials</a>.
150
149
 
150
+ <center>
151
+ <img src="https://github.com/open-atmos/PySDM/releases/download/tip/parcel_animation_ubuntu-24.04.gif" style="width:80%" />
152
+ </center>
153
+
151
154
  ## 0D box environment
152
155
 
153
156
  The box environment is void of any spatial or thermodynamic context, it constitutes the most basic framework.
@@ -49,9 +49,9 @@ class Simulation(BasicSimulation):
49
49
  if settings.enable_vapour_deposition_on_ice:
50
50
  builder.add_dynamic(VapourDepositionOnIce(adaptive=True))
51
51
 
52
- r_dry, n_in_dv = ConstantMultiplicity(settings.soluble_aerosol).sample(
53
- n_sd=settings.n_sd
54
- )
52
+ r_dry, n_in_dv = ConstantMultiplicity(
53
+ settings.soluble_aerosol
54
+ ).sample_deterministic(n_sd=settings.n_sd)
55
55
  attributes = builder.particulator.environment.init_attributes(
56
56
  n_in_dv=n_in_dv, kappa=settings.kappa, r_dry=r_dry
57
57
  )
@@ -61,7 +61,9 @@ def run_parcel(
61
61
  }
62
62
  for i, mode in enumerate(aerosol.modes):
63
63
  kappa, spectrum = mode["kappa"]["CompressedFilmOvadnevaite"], mode["spectrum"]
64
- r_dry, concentration = ConstantMultiplicity(spectrum).sample(n_sd_per_mode)
64
+ r_dry, concentration = ConstantMultiplicity(spectrum).sample_deterministic(
65
+ n_sd_per_mode
66
+ )
65
67
  v_dry = builder.formulae.trivia.volume(radius=r_dry)
66
68
  specific_concentration = concentration / builder.formulae.constants.rho_STP
67
69
  attributes["multiplicity"] = np.append(
@@ -227,7 +227,9 @@ def simulation(
227
227
  n_sd, multiplicity / volume
228
228
  )
229
229
  else:
230
- _isa, _conc = spectral_sampling.ConstantMultiplicity(spectrum).sample(n_sd)
230
+ _isa, _conc = spectral_sampling.ConstantMultiplicity(
231
+ spectrum
232
+ ).sample_deterministic(n_sd)
231
233
  attributes = {
232
234
  "multiplicity": discretise_multiplicities(_conc * volume),
233
235
  "immersed surface area": _isa,
@@ -18,7 +18,7 @@ def make_core(settings, coal_eff):
18
18
  attributes = {}
19
19
  attributes["volume"], attributes["multiplicity"] = ConstantMultiplicity(
20
20
  settings.spectrum
21
- ).sample(settings.n_sd)
21
+ ).sample_deterministic(settings.n_sd)
22
22
  collision = Collision(
23
23
  collision_kernel=settings.kernel,
24
24
  coalescence_efficiency=coal_eff,
@@ -9,4 +9,4 @@ def sampled_ccn_diameter_number_concentration_spectrum(
9
9
  return Logarithmic(
10
10
  spectrum=Lognormal(s_geom=1.4, m_mode=0.04 * si.um, norm_factor=100 / si.cm**3),
11
11
  size_range=size_range,
12
- ).sample(n_sd)
12
+ ).sample_deterministic(n_sd)
@@ -17,7 +17,6 @@ class Simulation(BasicSimulation):
17
17
  settings,
18
18
  products=None,
19
19
  scipy_solver=False,
20
- sampling_class=ConstantMultiplicity,
21
20
  ):
22
21
  builder = Builder(
23
22
  n_sd=settings.n_sd,
@@ -55,7 +54,9 @@ class Simulation(BasicSimulation):
55
54
  kappa = tuple(settings.aerosol_modes_by_kappa.keys())[0]
56
55
  spectrum = settings.aerosol_modes_by_kappa[kappa]
57
56
 
58
- r_dry, n_per_volume = sampling_class(spectrum).sample(settings.n_sd)
57
+ r_dry, n_per_volume = ConstantMultiplicity(spectrum).sample_deterministic(
58
+ settings.n_sd
59
+ )
59
60
  v_dry = settings.formulae.trivia.volume(radius=r_dry)
60
61
  attributes["multiplicity"] = np.append(
61
62
  attributes["multiplicity"], n_per_volume * volume
@@ -65,7 +65,7 @@ class Simulation(BasicSimulation):
65
65
 
66
66
  self.r_dry, n_in_unit_volume = Logarithmic(
67
67
  spectrum=settings.dry_radii_spectrum,
68
- ).sample(builder.particulator.n_sd - n_gccn)
68
+ ).sample_deterministic(builder.particulator.n_sd - n_gccn)
69
69
 
70
70
  if gccn:
71
71
  nonzero_concentration_mask = np.nonzero(table_3.NA)
@@ -17,7 +17,8 @@ class Settings:
17
17
  dt: float,
18
18
  n_sd: int,
19
19
  n_substep: int,
20
- spectral_sampling: spec_sampling.SpectralSampling = spec_sampling.Logarithmic,
20
+ spectral_sampling_class: spec_sampling.SpectralSampling = spec_sampling.Logarithmic,
21
+ spectral_sampling_method: str = "sample_deterministic",
21
22
  ):
22
23
  self.formulae = Formulae(
23
24
  saturation_vapour_pressure="AugustRocheMagnus",
@@ -51,13 +52,16 @@ class Settings:
51
52
  # note: rho is not specified in the paper
52
53
  rho0 = 1
53
54
 
54
- self.r_dry, self.n_in_dv = spectral_sampling(
55
- spectrum=spectra.Lognormal(
56
- norm_factor=566 / si.cm**3 / rho0 * self.mass_of_dry_air,
57
- m_mode=0.08 * si.um / 2,
58
- s_geom=2,
59
- )
60
- ).sample(n_sd)
55
+ self.r_dry, self.n_in_dv = getattr(
56
+ spectral_sampling_class(
57
+ spectrum=spectra.Lognormal(
58
+ norm_factor=566 / si.cm**3 / rho0 * self.mass_of_dry_air,
59
+ m_mode=0.08 * si.um / 2,
60
+ s_geom=2,
61
+ )
62
+ ),
63
+ spectral_sampling_method,
64
+ )(n_sd)
61
65
 
62
66
  self.ENVIRONMENT_MOLE_FRACTIONS = {
63
67
  "SO2": 0.2 * PPB,
@@ -7,7 +7,6 @@ from pystrict import strict
7
7
  from PySDM import Formulae
8
8
  from PySDM.backends import CPU
9
9
  from PySDM.initialisation.aerosol_composition import DryAerosolMixture
10
- from PySDM.initialisation.sampling import spectral_sampling as spec_sampling
11
10
  from PySDM.physics import si
12
11
 
13
12
 
@@ -36,7 +35,6 @@ class Settings:
36
35
  n_sd_per_mode: int,
37
36
  aerosol: DryAerosolMixture,
38
37
  model: str,
39
- spectral_sampling: type(spec_sampling.SpectralSampling),
40
38
  w: float = 0.32 * si.m / si.s,
41
39
  ):
42
40
  assert model in ("Constant", "CompressedFilmOvadnevaite")
@@ -46,7 +44,6 @@ class Settings:
46
44
  self.formulae = self.backend.formulae
47
45
  const = self.formulae.constants
48
46
  self.aerosol = aerosol
49
- self.spectral_sampling = spectral_sampling
50
47
 
51
48
  max_altitude = 200 * si.m
52
49
  self.w = w
@@ -7,6 +7,7 @@ from PySDM.dynamics import AmbientThermodynamics, Condensation
7
7
  from PySDM.environments import Parcel
8
8
  from PySDM.initialisation.hygroscopic_equilibrium import equilibrate_wet_radii
9
9
  from PySDM.initialisation.spectra import Sum
10
+ from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity
10
11
 
11
12
 
12
13
  class Simulation(BasicSimulation):
@@ -33,9 +34,9 @@ class Simulation(BasicSimulation):
33
34
  }
34
35
  initial_volume = settings.mass_of_dry_air / settings.rho0
35
36
  for mode in settings.aerosol.modes:
36
- r_dry, n_in_dv = settings.spectral_sampling(
37
+ r_dry, n_in_dv = ConstantMultiplicity(
37
38
  spectrum=mode["spectrum"]
38
- ).sample(settings.n_sd_per_mode)
39
+ ).sample_deterministic(settings.n_sd_per_mode)
39
40
  v_dry = settings.formulae.trivia.volume(radius=r_dry)
40
41
  attributes["multiplicity"] = np.append(
41
42
  attributes["multiplicity"], n_in_dv * initial_volume
@@ -0,0 +1,7 @@
1
+ # pylint: disable=invalid-name
2
+ """
3
+ Fig. 1 from [Matsushima et al. 2023 (GMD)](https://doi.org/10.5194/gmd-16-6211-2023)
4
+
5
+ figure_1.ipynb:
6
+ .. include:: ./figure_1.ipynb.badges.md
7
+ """
@@ -13,7 +13,13 @@ from PySDM.physics import si
13
13
 
14
14
  class Simulation(BasicSimulation):
15
15
  def __init__(
16
- self, settings, products=None, scipy_solver=False, rtol_thd=1e-10, rtol_x=1e-10
16
+ self,
17
+ settings,
18
+ products=None,
19
+ scipy_solver=False,
20
+ rtol_thd=1e-10,
21
+ rtol_x=1e-10,
22
+ mass_of_dry_air=44 * si.kg,
17
23
  ):
18
24
  n_sd = sum(settings.n_sd_per_mode)
19
25
  builder = Builder(
@@ -27,7 +33,7 @@ class Simulation(BasicSimulation):
27
33
  initial_water_vapour_mixing_ratio=settings.initial_vapour_mixing_ratio,
28
34
  T0=settings.initial_temperature,
29
35
  w=settings.vertical_velocity,
30
- mass_of_dry_air=44 * si.kg,
36
+ mass_of_dry_air=mass_of_dry_air,
31
37
  ),
32
38
  )
33
39
  builder.add_dynamic(AmbientThermodynamics())
@@ -43,7 +49,9 @@ class Simulation(BasicSimulation):
43
49
  }
44
50
  for i, (kappa, spectrum) in enumerate(settings.aerosol_modes_by_kappa.items()):
45
51
  sampling = ConstantMultiplicity(spectrum)
46
- r_dry, n_per_volume = sampling.sample(settings.n_sd_per_mode[i])
52
+ r_dry, n_per_volume = sampling.sample_deterministic(
53
+ settings.n_sd_per_mode[i]
54
+ )
47
55
  v_dry = settings.formulae.trivia.volume(radius=r_dry)
48
56
  attributes["multiplicity"] = np.append(
49
57
  attributes["multiplicity"], n_per_volume * volume
@@ -22,7 +22,9 @@ def run(settings, backend=CPU, observers=()):
22
22
  )
23
23
  attributes = {}
24
24
  sampling = ConstantMultiplicity(settings.spectrum)
25
- attributes["volume"], attributes["multiplicity"] = sampling.sample(settings.n_sd)
25
+ attributes["volume"], attributes["multiplicity"] = sampling.sample_deterministic(
26
+ settings.n_sd
27
+ )
26
28
  coalescence = Coalescence(
27
29
  collision_kernel=settings.kernel, adaptive=settings.adaptive
28
30
  )
@@ -16,7 +16,9 @@ def run(settings, backend):
16
16
  builder = Builder(n_sd=settings.n_sd, backend=backend, environment=env)
17
17
  attributes = {}
18
18
  sampling = ConstantMultiplicity(settings.spectrum)
19
- attributes["volume"], attributes["multiplicity"] = sampling.sample(settings.n_sd)
19
+ attributes["volume"], attributes["multiplicity"] = sampling.sample_deterministic(
20
+ settings.n_sd
21
+ )
20
22
  builder.add_dynamic(Coalescence(collision_kernel=settings.kernel))
21
23
  particles = builder.build(attributes, products=(WallTime(),))
22
24
 
@@ -11,7 +11,7 @@ def run(settings, observers=()):
11
11
  builder.set_environment(Box(dv=settings.dv, dt=settings.dt))
12
12
  attributes = {}
13
13
  sampling = ConstantMultiplicity(settings.spectrum)
14
- attributes["volume"], attributes["n"] = sampling.sample(settings.n_sd)
14
+ attributes["volume"], attributes["n"] = sampling.sample_deterministic(settings.n_sd)
15
15
  coalescence = Coalescence(
16
16
  collision_kernel=settings.kernel, adaptive=settings.adaptive
17
17
  )
@@ -59,7 +59,7 @@ class Settings:
59
59
 
60
60
  self.r_dry, self.specific_concentration = spectral_sampling.Linear(
61
61
  spectrum
62
- ).sample(n_sd)
62
+ ).sample_deterministic(n_sd)
63
63
 
64
64
  self.t_duration = 7200
65
65
  self.dt = dt
@@ -0,0 +1,8 @@
1
+ # pylint: disable=invalid-name
2
+ """
3
+ ParaView visualisation of a parcel-model example based on the test case from
4
+ [Pyrcel package docs](https://pyrcel.readthedocs.io/)
5
+
6
+ paraview_parcel_model.ipynb:
7
+ .. include:: ./paraview.ipynb.badges.md
8
+ """
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env pvpython
2
+ """
3
+ ParaView pvpython script for visualizing sd_products and sd_attributes.
4
+ """
5
+
6
+ import argparse
7
+ from collections import namedtuple
8
+ import pathlib
9
+ from paraview import simple as pvs # pylint: disable=import-error
10
+
11
+ pvs._DisableFirstRenderCameraReset() # pylint: disable=protected-access
12
+
13
+
14
+ def cli_using_argparse(argparse_parser):
15
+ """
16
+ Command line interface using argparse.
17
+ """
18
+ argparse_parser.add_argument(
19
+ "--sd-products-pvd",
20
+ dest="sd_products_pvd",
21
+ help="Path to sd_products.pvd",
22
+ )
23
+ argparse_parser.add_argument(
24
+ "--sd-attributes-pvd",
25
+ dest="sd_attributes_pvd",
26
+ help="Path to sd_attributes.pvd",
27
+ )
28
+ argparse_parser.add_argument(
29
+ "--output-animation-path",
30
+ help="Output path for the animation file.",
31
+ )
32
+ argparse_parser.add_argument(
33
+ "--output-screenshot-path",
34
+ help="Output path for the screenshot file.",
35
+ )
36
+
37
+ argparse_parser.add_argument(
38
+ "--scalarbar-title-size",
39
+ type=int,
40
+ default=30,
41
+ help="Font size for scalar bar titles.",
42
+ )
43
+ argparse_parser.add_argument(
44
+ "--scalarbar-label-size",
45
+ type=int,
46
+ default=30,
47
+ help="Font size for scalar bar labels.",
48
+ )
49
+ argparse_parser.add_argument(
50
+ "--axes-title-size",
51
+ type=int,
52
+ default=30,
53
+ help="Font size for axes titles.",
54
+ )
55
+ argparse_parser.add_argument(
56
+ "--axes-label-size",
57
+ type=int,
58
+ default=30,
59
+ help="Font size for axes labels.",
60
+ )
61
+
62
+
63
+ parser = argparse.ArgumentParser(
64
+ description="ParaView pvpython script for visualizing sd_products and sd_attributes PVD files."
65
+ )
66
+ cli_using_argparse(parser)
67
+ args = parser.parse_args()
68
+
69
+ sd_productspvd = pvs.PVDReader(
70
+ registrationName="sd_products.pvd", FileName=args.sd_products_pvd
71
+ )
72
+ sd_attributespvd = pvs.PVDReader(
73
+ registrationName="sd_attributes.pvd", FileName=args.sd_attributes_pvd
74
+ )
75
+
76
+ setup = {
77
+ "renderView1": pvs.GetActiveViewOrCreate("RenderView"),
78
+ "sd_productspvdDisplay": pvs.Show(
79
+ sd_productspvd,
80
+ pvs.GetActiveViewOrCreate("RenderView"),
81
+ "UnstructuredGridRepresentation",
82
+ ),
83
+ "sd_attributespvdDisplay": pvs.Show(
84
+ sd_attributespvd,
85
+ pvs.GetActiveViewOrCreate("RenderView"),
86
+ "UnstructuredGridRepresentation",
87
+ ),
88
+ "rHlookup_table": pvs.GetColorTransferFunction("RH"),
89
+ "volumelookup_table": pvs.GetColorTransferFunction("volume"),
90
+ }
91
+
92
+ animation_setup = namedtuple("setup", setup.keys())(**setup)
93
+
94
+
95
+ def configure_color_bar_and_display(
96
+ display, lookup_table, kind, *, anim_setup=animation_setup
97
+ ):
98
+ """
99
+ Configure color bar and display settings.
100
+ """
101
+ display.Representation = "Surface"
102
+ display.SetScalarBarVisibility(anim_setup.renderView1, True)
103
+ color_bar = pvs.GetScalarBar(lookup_table, anim_setup.renderView1)
104
+ color_bar.LabelColor = [0.0, 0.0, 0.0]
105
+ color_bar.DrawScalarBarOutline = 1
106
+ color_bar.ScalarBarOutlineColor = [0.0, 0.0, 0.0]
107
+ color_bar.TitleColor = [0.0, 0.0, 0.0]
108
+
109
+ color_bar.TitleFontSize = args.scalarbar_title_size
110
+ color_bar.LabelFontSize = args.scalarbar_label_size
111
+
112
+ if kind == "prod":
113
+ display.Opacity = 0.4
114
+ display.DisableLighting = 1
115
+ display.Diffuse = 0.76
116
+ lookup_table.RescaleTransferFunction(90.0, 101.0)
117
+ lookup_table.ApplyPreset("Black, Blue and White", True)
118
+ lookup_table.NanColor = [0.67, 1.0, 1.0]
119
+ else:
120
+ display.PointSize = 13.0
121
+ display.RenderPointsAsSpheres = 1
122
+ display.Interpolation = "PBR"
123
+ lookup_table.RescaleTransferFunction(1e-18, 1e-13)
124
+ lookup_table.ApplyPreset("Cold and Hot", True)
125
+ lookup_table.MapControlPointsToLogSpace()
126
+ lookup_table.UseLogScale = 1
127
+ lookup_table.NumberOfTableValues = 16
128
+ lookup_table.InvertTransferFunction()
129
+
130
+
131
+ def configure_data_axes_grid(display, kind):
132
+ """
133
+ Configure data axes grid settings.
134
+ """
135
+ display.DataAxesGrid.GridAxesVisibility = 1
136
+ display.DataAxesGrid.XTitle = ""
137
+ display.DataAxesGrid.YTitle = ""
138
+ display.DataAxesGrid.XAxisUseCustomLabels = 1
139
+ display.DataAxesGrid.YAxisUseCustomLabels = 1
140
+
141
+ display.DataAxesGrid.XTitleFontSize = args.axes_title_size
142
+ display.DataAxesGrid.XLabelFontSize = args.axes_label_size
143
+ display.DataAxesGrid.YTitleFontSize = args.axes_title_size
144
+ display.DataAxesGrid.YLabelFontSize = args.axes_label_size
145
+
146
+ if kind == "prod":
147
+ display.DataAxesGrid.ZTitle = ""
148
+ display.DataAxesGrid.GridColor = [0.0, 0.0, 0.0]
149
+ display.DataAxesGrid.ShowGrid = 1
150
+ display.DataAxesGrid.LabelUniqueEdgesOnly = 0
151
+ display.DataAxesGrid.ZAxisUseCustomLabels = 1
152
+ display.DataAxesGrid.ZTitleFontSize = args.axes_title_size
153
+ display.DataAxesGrid.ZLabelFontSize = args.axes_label_size
154
+ else:
155
+ display.DataAxesGrid.ZTitle = " Z [m] "
156
+ display.DataAxesGrid.ZLabelColor = [0.0, 0.0, 0.0]
157
+ display.DataAxesGrid.ZTitleColor = [0.0, 0.0, 0.0]
158
+ display.DataAxesGrid.ZTitleFontSize = args.axes_title_size
159
+ display.DataAxesGrid.ZLabelFontSize = args.axes_label_size
160
+
161
+
162
+ def configure_view_appearance(render_view):
163
+ """
164
+ Configure view appearance settings."""
165
+ render_view.OrientationAxesLabelColor = [0.0, 0.0, 0.0]
166
+ render_view.OrientationAxesOutlineColor = [0.0, 0.0, 0.0]
167
+ render_view.OrientationAxesXVisibility = 0
168
+ render_view.OrientationAxesYVisibility = 0
169
+ render_view.OrientationAxesZColor = [0.0, 0.0, 0.0]
170
+ render_view.UseColorPaletteForBackground = 0
171
+ render_view.Background = [1.0, 1.0, 1.0]
172
+
173
+
174
+ def set_camera_view(render_view):
175
+ """
176
+ Set camera view settings.
177
+ """
178
+ layout1 = pvs.GetLayout()
179
+ layout1.SetSize(1592, 1128)
180
+ render_view.CameraPosition = [
181
+ 1548.95,
182
+ -1349.49,
183
+ 699.27,
184
+ ]
185
+ render_view.CameraFocalPoint = [
186
+ -1.37e-13,
187
+ 3.18e-13,
188
+ 505.00,
189
+ ]
190
+ render_view.CameraViewUp = [
191
+ -0.07,
192
+ 0.06,
193
+ 0.99,
194
+ ]
195
+ render_view.CameraParallelScale = 534.08
196
+
197
+
198
+ def save_animation_and_screenshot(render_view, animation_path, screenshot_path):
199
+ """
200
+ Save animation and screenshot.
201
+ """
202
+ animation_scene = pvs.GetAnimationScene()
203
+ animation_scene.UpdateAnimationUsingDataTimeSteps()
204
+
205
+ pvs.SaveAnimation(animation_path, render_view, FrameRate=15)
206
+
207
+ if not screenshot_path:
208
+ return
209
+
210
+ time_steps = sd_productspvd.TimestepValues
211
+ if not time_steps:
212
+ return
213
+
214
+ last_time = time_steps[-1]
215
+ render_view.ViewTime = last_time
216
+
217
+ for reader in (sd_productspvd, sd_attributespvd):
218
+ reader.UpdatePipeline(last_time)
219
+
220
+ pvs.ExportView(
221
+ filename=str(pathlib.Path(screenshot_path)),
222
+ view=render_view,
223
+ Rasterize3Dgeometry=False,
224
+ GL2PSdepthsortmethod="BSP sorting (slow, best)",
225
+ )
226
+
227
+ pvs.RenderAllViews()
228
+
229
+
230
+ configure_color_bar_and_display(
231
+ animation_setup.sd_productspvdDisplay, animation_setup.rHlookup_table, kind="prod"
232
+ )
233
+ configure_data_axes_grid(animation_setup.sd_productspvdDisplay, kind="prod")
234
+ configure_view_appearance(animation_setup.renderView1)
235
+ configure_color_bar_and_display(
236
+ animation_setup.sd_attributespvdDisplay,
237
+ animation_setup.volumelookup_table,
238
+ kind="attr",
239
+ )
240
+ configure_data_axes_grid(animation_setup.sd_attributespvdDisplay, kind="attr")
241
+ set_camera_view(animation_setup.renderView1)
242
+ save_animation_and_screenshot(
243
+ animation_setup.renderView1, args.output_animation_path, args.output_screenshot_path
244
+ )
@@ -19,9 +19,7 @@ class Settings:
19
19
  dt_max: float = 1 * si.second,
20
20
  ):
21
21
  self.total_time = 3 * si.hours
22
- self.mass_of_dry_air = (
23
- 1000 * si.kilogram
24
- ) # TODO #335 doubled with jupyter si unit
22
+ self.mass_of_dry_air = 1000 * si.kilogram
25
23
 
26
24
  self.n_steps = int(
27
25
  self.total_time / (5 * si.second)
@@ -34,7 +32,7 @@ class Settings:
34
32
  s_geom=1.4,
35
33
  ),
36
34
  size_range=(10.633 * si.nanometre, 513.06 * si.nanometre),
37
- ).sample(n_sd)
35
+ ).sample_deterministic(n_sd)
38
36
  self.dt_max = dt_max
39
37
 
40
38
  self.dt_output = dt_output
@@ -84,10 +84,10 @@ class Simulation:
84
84
  _sp = self.particulator
85
85
  cell_id = 0
86
86
  output["r_bins_values"].append(
87
- _sp.products["Particles Wet Size Spectrum"].get()
87
+ (_sp.products["Particles Wet Size Spectrum"].get()).T
88
88
  )
89
89
  volume = _sp.attributes["volume"].to_ndarray()
90
- output["r"].append(self.formulae.trivia.radius(volume=volume))
90
+ output["r"].append((self.formulae.trivia.radius(volume=volume)).T)
91
91
  output["S"].append(_sp.environment["RH"][cell_id] - 1)
92
92
  output["t"].append(_sp.products["t"].get())
93
93
  for key in ("water_vapour_mixing_ratio", "T", "z"):
@@ -124,4 +124,6 @@ class Simulation:
124
124
  for _ in range(self.n_steps):
125
125
  self.particulator.run(self.n_substeps)
126
126
  self.save(output)
127
+ for k, v in output.items():
128
+ output[k] = np.asarray(v)
127
129
  return output
@@ -11,4 +11,4 @@ except PackageNotFoundError:
11
11
  # package is not installed
12
12
  pass
13
13
 
14
- assert PySDM.__version__ == __version__
14
+ # assert PySDM.__version__ == __version__
@@ -25,7 +25,7 @@ def run_box(settings, backend_class=CPU):
25
25
  attributes = {}
26
26
  attributes["volume"], attributes["multiplicity"] = ConstantMultiplicity(
27
27
  settings.spectrum
28
- ).sample(settings.n_sd)
28
+ ).sample_deterministic(settings.n_sd)
29
29
  builder.add_dynamic(
30
30
  Coalescence(
31
31
  collision_kernel=settings.kernel,
@@ -35,15 +35,15 @@ def run_box_breakup(
35
35
  builder.particulator.environment["rhod"] = 1.0
36
36
  attributes = {}
37
37
  if sample_in_radius:
38
- diams, attributes["multiplicity"] = Logarithmic(settings.spectrum).sample(
39
- settings.n_sd
40
- )
38
+ diams, attributes["multiplicity"] = Logarithmic(
39
+ settings.spectrum
40
+ ).sample_deterministic(settings.n_sd)
41
41
  radii = diams / 2
42
42
  attributes["volume"] = Formulae().trivia.volume(radius=radii)
43
43
  else:
44
44
  attributes["volume"], attributes["multiplicity"] = ConstantMultiplicity(
45
45
  settings.spectrum
46
- ).sample(settings.n_sd)
46
+ ).sample_deterministic(settings.n_sd)
47
47
  breakup = Collision(
48
48
  collision_kernel=settings.kernel,
49
49
  coalescence_efficiency=settings.coal_eff,
@@ -100,7 +100,7 @@ def run_box_NObreakup(settings, steps=None, backend_class=CPU):
100
100
  attributes = {}
101
101
  attributes["volume"], attributes["multiplicity"] = ConstantMultiplicity(
102
102
  settings.spectrum
103
- ).sample(settings.n_sd)
103
+ ).sample_deterministic(settings.n_sd)
104
104
  coal = Coalescence(
105
105
  collision_kernel=settings.kernel,
106
106
  coalescence_efficiency=settings.coal_eff,
@@ -53,7 +53,7 @@ class Settings:
53
53
  m_mode=1 * si.um,
54
54
  s_geom=1.1,
55
55
  )
56
- ).sample(
56
+ ).sample_deterministic(
57
57
  n_sd=n_sd_seeding
58
58
  ) # TODO #1387: does not to be the same?
59
59
  v_dry = self.formulae.trivia.volume(radius=r_dry)