PySDM-examples 2.70__tar.gz → 2.72__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 (158) hide show
  1. {PySDM-examples-2.70 → PySDM-examples-2.72}/PKG-INFO +1 -1
  2. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shipway_and_Hill_2012/mpdata_1d.py +34 -17
  3. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shipway_and_Hill_2012/simulation.py +5 -4
  4. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/gui_settings.py +7 -2
  5. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/mpdata_2d.py +41 -34
  6. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/simulation.py +7 -9
  7. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples.egg-info/PKG-INFO +1 -1
  8. {PySDM-examples-2.70 → PySDM-examples-2.72}/setup.py +2 -1
  9. {PySDM-examples-2.70 → PySDM-examples-2.72}/MANIFEST.in +0 -0
  10. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abade_and_Albuquerque_2024/__init__.py +0 -0
  11. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abade_and_Albuquerque_2024/settings.py +0 -0
  12. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abade_and_Albuquerque_2024/simulation.py +0 -0
  13. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abdul_Razzak_Ghan_2000/__init__.py +0 -0
  14. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abdul_Razzak_Ghan_2000/aerosol.py +0 -0
  15. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_ARG2000_paper.py +0 -0
  16. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abdul_Razzak_Ghan_2000/data_from_CloudMicrophysics_ARG.py +0 -0
  17. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Abdul_Razzak_Ghan_2000/run_ARG_parcel.py +0 -0
  18. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Alpert_and_Knopf_2016/__init__.py +0 -0
  19. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Alpert_and_Knopf_2016/simulation.py +0 -0
  20. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Alpert_and_Knopf_2016/table.py +0 -0
  21. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Alpert_and_Knopf_2016/table_1.py +0 -0
  22. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Alpert_and_Knopf_2016/table_2.py +0 -0
  23. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_and_Shima_2017/__init__.py +0 -0
  24. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_and_Shima_2017/example.py +0 -0
  25. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_and_Shima_2017/settings.py +0 -0
  26. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_and_Shima_2017/simulation.py +0 -0
  27. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2015/__init__.py +0 -0
  28. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2015/example.py +0 -0
  29. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2015/example_benchmark.py +0 -0
  30. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2015/settings.py +0 -0
  31. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2015/spin_up.py +0 -0
  32. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2023/__init__.py +0 -0
  33. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2023/commons.py +0 -0
  34. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2023/curved_text.py +0 -0
  35. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2023/frozen_fraction.py +0 -0
  36. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2023/make_particulator.py +0 -0
  37. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2023/plots.py +0 -0
  38. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Arabas_et_al_2023/run_simulation.py +0 -0
  39. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bartman_2020_MasterThesis/__init__.py +0 -0
  40. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bartman_2020_MasterThesis/fig_4_adaptive_sdm.py +0 -0
  41. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bartman_2020_MasterThesis/fig_5_SCIPY_VS_ADAPTIVE.py +0 -0
  42. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bartman_et_al_2021/__init__.py +0 -0
  43. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bartman_et_al_2021/label.py +0 -0
  44. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Berry_1967/__init__.py +0 -0
  45. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Berry_1967/example.py +0 -0
  46. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Berry_1967/example_fig_6.py +0 -0
  47. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Berry_1967/settings.py +0 -0
  48. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Berry_1967/spectrum_plotter.py +0 -0
  49. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bieli_et_al_2022/__init__.py +0 -0
  50. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bieli_et_al_2022/settings.py +0 -0
  51. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bieli_et_al_2022/simulation.py +0 -0
  52. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bolot_et_al_2013/__init__.py +0 -0
  53. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bulenok_2023_MasterThesis/__init__.py +0 -0
  54. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bulenok_2023_MasterThesis/setups.py +0 -0
  55. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Bulenok_2023_MasterThesis/utils.py +0 -0
  56. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Ervens_and_Feingold_2012/__init__.py +0 -0
  57. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Ervens_and_Feingold_2012/settings.py +0 -0
  58. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Gedzelman_and_Arnold_1994/__init__.py +0 -0
  59. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Grabowski_and_Pawlowska_2023/__init__.py +0 -0
  60. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Grabowski_and_Pawlowska_2023/settings.py +0 -0
  61. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Grabowski_and_Pawlowska_2023/simulation.py +0 -0
  62. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Graf_et_al_2019/__init__.py +0 -0
  63. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Jaruga_and_Pawlowska_2018/__init__.py +0 -0
  64. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Jensen_and_Nugent_2017/__init__.py +0 -0
  65. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Jensen_and_Nugent_2017/plotting.py +0 -0
  66. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Jensen_and_Nugent_2017/settings.py +0 -0
  67. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Jensen_and_Nugent_2017/simulation.py +0 -0
  68. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Jensen_and_Nugent_2017/table_3.py +0 -0
  69. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Kreidenweis_et_al_2003/__init__.py +0 -0
  70. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Kreidenweis_et_al_2003/settings.py +0 -0
  71. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Kreidenweis_et_al_2003/simulation.py +0 -0
  72. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lamb_et_al_2017/__init__.py +0 -0
  73. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lowe_et_al_2019/__init__.py +0 -0
  74. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lowe_et_al_2019/aerosol.py +0 -0
  75. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lowe_et_al_2019/aerosol_code.py +0 -0
  76. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lowe_et_al_2019/constants_def.py +0 -0
  77. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lowe_et_al_2019/plot_helper.py +0 -0
  78. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lowe_et_al_2019/settings.py +0 -0
  79. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Lowe_et_al_2019/simulation.py +0 -0
  80. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Merlivat_and_Nief_1967/__init__.py +0 -0
  81. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Miyake_et_al_1968/__init__.py +0 -0
  82. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Morrison_and_Grabowski_2007/__init__.py +0 -0
  83. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Morrison_and_Grabowski_2007/common.py +0 -0
  84. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Morrison_and_Grabowski_2007/cumulus.py +0 -0
  85. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Morrison_and_Grabowski_2007/strato_cumulus.py +0 -0
  86. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Niedermeier_et_al_2014/__init__.py +0 -0
  87. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Niedermeier_et_al_2014/settings.py +0 -0
  88. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Niedermeier_et_al_2014/simulation.py +0 -0
  89. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pierchala_et_al_2022/__init__.py +0 -0
  90. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pierchala_et_al_2022/commons.py +0 -0
  91. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pyrcel/__init__.py +0 -0
  92. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pyrcel/profile_plotter.py +0 -0
  93. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pyrcel/settings.py +0 -0
  94. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pyrcel/simulation.py +0 -0
  95. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pyrcel/tutorial_settings.py +0 -0
  96. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Pyrcel/tutorial_simulation.py +0 -0
  97. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Rozanski_and_Sonntag_1982/__init__.py +0 -0
  98. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/__init__.py +0 -0
  99. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/error_measure.py +0 -0
  100. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/example.py +0 -0
  101. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/example_timing.py +0 -0
  102. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/settings.py +0 -0
  103. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/spectrum_plotter.py +0 -0
  104. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/tutorial_example.py +0 -0
  105. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/tutorial_plotter.py +0 -0
  106. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shima_et_al_2009/tutorial_settings.py +0 -0
  107. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shipway_and_Hill_2012/__init__.py +0 -0
  108. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shipway_and_Hill_2012/plot.py +0 -0
  109. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Shipway_and_Hill_2012/settings.py +0 -0
  110. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Singer_Ward/__init__.py +0 -0
  111. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Singer_Ward/aerosol.py +0 -0
  112. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Srivastava_1982/__init__.py +0 -0
  113. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Srivastava_1982/equations.py +0 -0
  114. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Srivastava_1982/example.py +0 -0
  115. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Srivastava_1982/settings.py +0 -0
  116. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Srivastava_1982/simulation.py +0 -0
  117. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/__init__.py +0 -0
  118. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/fields.py +0 -0
  119. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/gui.py +0 -0
  120. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/gui_controller.py +0 -0
  121. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/gui_viewer.py +0 -0
  122. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/make_default_product_collection.py +0 -0
  123. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/plots.py +0 -0
  124. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/sounding.py +0 -0
  125. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Szumowski_et_al_1998/storage.py +0 -0
  126. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Van_Hook_1968/__init__.py +0 -0
  127. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Yang_et_al_2018/__init__.py +0 -0
  128. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Yang_et_al_2018/settings.py +0 -0
  129. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/Yang_et_al_2018/simulation.py +0 -0
  130. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/__init__.py +0 -0
  131. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Azimi/__init__.py +0 -0
  132. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Azimi/cloudy_data.py +0 -0
  133. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Azimi/cloudy_data_0d.py +0 -0
  134. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Azimi/settings1D.py +0 -0
  135. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Azimi/simulation_0D.py +0 -0
  136. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Mackay_et_al_2023/__init__.py +0 -0
  137. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Mackay_et_al_2023/plot_rates.py +0 -0
  138. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Mackay_et_al_2023/settings1D.py +0 -0
  139. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Mackay_et_al_2023/settings_0D.py +0 -0
  140. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Mackay_et_al_2023/simulation1D.py +0 -0
  141. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_0D.py +0 -0
  142. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/deJong_Mackay_et_al_2023/simulation_ss.py +0 -0
  143. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/__init__.py +0 -0
  144. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/basic_simulation.py +0 -0
  145. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/dummy_controller.py +0 -0
  146. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/notebook_vars.py +0 -0
  147. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/progbar_controller.py +0 -0
  148. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/read_vtk_1d.py +0 -0
  149. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/widgets/__init__.py +0 -0
  150. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/widgets/freezer.py +0 -0
  151. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples/utils/widgets/progbar_updater.py +0 -0
  152. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples.egg-info/SOURCES.txt +0 -0
  153. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples.egg-info/dependency_links.txt +0 -0
  154. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples.egg-info/requires.txt +0 -0
  155. {PySDM-examples-2.70 → PySDM-examples-2.72}/PySDM_examples.egg-info/top_level.txt +0 -0
  156. {PySDM-examples-2.70 → PySDM-examples-2.72}/README.md +0 -0
  157. {PySDM-examples-2.70 → PySDM-examples-2.72}/pyproject.toml +0 -0
  158. {PySDM-examples-2.70 → PySDM-examples-2.72}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PySDM-examples
3
- Version: 2.70
3
+ Version: 2.72
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
@@ -1,4 +1,7 @@
1
+ from functools import cached_property
2
+
1
3
  import numpy as np
4
+
2
5
  from PyMPDATA import Options, ScalarField, Solver, Stepper, VectorField
3
6
  from PyMPDATA.boundary_conditions import Extrapolated
4
7
 
@@ -19,41 +22,55 @@ class MPDATA_1D:
19
22
  self.dt = dt
20
23
  self.advector_of_t = advector_of_t
21
24
 
22
- grid = (nz,)
23
- options = Options(
25
+ self._grid = (nz,)
26
+ self._options = Options(
24
27
  n_iters=mpdata_settings["n_iters"],
25
28
  infinite_gauge=mpdata_settings["iga"],
26
29
  nonoscillatory=mpdata_settings["fct"],
27
30
  third_order_terms=mpdata_settings["tot"],
28
31
  )
29
- stepper = Stepper(options=options, grid=grid, non_unit_g_factor=True)
30
32
  bcs = (Extrapolated(),)
31
- zZ_scalar = arakawa_c.z_scalar_coord(grid) / nz
32
- g_factor = ScalarField(
33
+ zZ_scalar = arakawa_c.z_scalar_coord(self._grid) / nz
34
+ self._g_factor = ScalarField(
33
35
  data=g_factor_of_zZ(zZ_scalar),
34
- halo=options.n_halo,
36
+ halo=self._options.n_halo,
35
37
  boundary_conditions=bcs,
36
38
  )
37
- advector = VectorField(
39
+ self._advector = VectorField(
38
40
  data=(np.full(nz + 1, advector_of_t(0)),),
39
- halo=options.n_halo,
41
+ halo=self._options.n_halo,
40
42
  boundary_conditions=bcs,
41
43
  )
42
- self.advectee = ScalarField(
44
+ self._advectee = ScalarField(
43
45
  data=advectee_of_zZ_at_t0(zZ_scalar),
44
- halo=options.n_halo,
46
+ halo=self._options.n_halo,
45
47
  boundary_conditions=bcs,
46
48
  )
47
- self.solver = Solver(
48
- stepper=stepper,
49
- advectee=self.advectee,
50
- advector=advector,
51
- g_factor=g_factor,
49
+
50
+ @cached_property
51
+ def solver(self):
52
+ return Solver(
53
+ stepper=Stepper(
54
+ options=self._options, grid=self._grid, non_unit_g_factor=True
55
+ ),
56
+ advectee=self._advectee,
57
+ advector=self._advector,
58
+ g_factor=self._g_factor,
52
59
  )
53
60
 
61
+ @property
62
+ def solver_cached(self):
63
+ return "solver" in self.__dict__
64
+
65
+ @property
66
+ def advectee(self):
67
+ return (self.solver.advectee if self.solver_cached else self._advectee).get()
68
+
54
69
  @property
55
70
  def advector(self):
56
- return self.solver.advector.get_component(0)
71
+ return (
72
+ self.solver.advector if self.solver_cached else self._advector
73
+ ).get_component(0)
57
74
 
58
75
  def update_advector_field(self):
59
76
  self.__t += 0.5 * self.dt
@@ -61,5 +78,5 @@ class MPDATA_1D:
61
78
  np.testing.assert_array_less(np.abs(self.advector), 1)
62
79
  self.__t += 0.5 * self.dt
63
80
 
64
- def __call__(self):
81
+ def __call__(self, _):
65
82
  self.solver.advance(1)
@@ -46,7 +46,7 @@ class Simulation:
46
46
  z_above_reservoir = zZ * (settings.nz * settings.dz) + self.z0
47
47
  return z_above_reservoir
48
48
 
49
- self.mpdata = MPDATA_1D(
49
+ mpdata = MPDATA_1D(
50
50
  nz=settings.nz,
51
51
  dt=settings.dt,
52
52
  mpdata_settings=settings.mpdata_settings,
@@ -79,7 +79,7 @@ class Simulation:
79
79
  update_thd=settings.condensation_update_thd,
80
80
  )
81
81
  )
82
- self.builder.add_dynamic(EulerianAdvection(self.mpdata))
82
+ self.builder.add_dynamic(EulerianAdvection(mpdata))
83
83
 
84
84
  self.products = []
85
85
  if settings.precip:
@@ -257,10 +257,11 @@ class Simulation:
257
257
 
258
258
  self.save(0)
259
259
  for step in range(self.nt):
260
- self.mpdata.update_advector_field()
260
+ mpdata = self.particulator.dynamics["EulerianAdvection"].solvers
261
+ mpdata.update_advector_field()
261
262
  if "Displacement" in self.particulator.dynamics:
262
263
  self.particulator.dynamics["Displacement"].upload_courant_field(
263
- (self.mpdata.advector / self.g_factor_vec,)
264
+ (mpdata.advector / self.g_factor_vec,)
264
265
  )
265
266
  self.particulator.run(steps=1)
266
267
  self.save(step + 1)
@@ -348,10 +348,15 @@ class GUISettings:
348
348
  return widget.value
349
349
  raise NotImplementedError()
350
350
 
351
- def stream_function(self, xX, zZ, _):
351
+ @property
352
+ def stream_function(self):
352
353
  assert hasattr(self.__settings, "rhod_w_max")
353
354
  self.__settings.rhod_w_max = self.ui_rhod_w_max.value
354
- return self.__settings.stream_function(xX, zZ, _)
355
+
356
+ def fun(xX, zZ, _):
357
+ return self.__settings.stream_function(xX, zZ, _)
358
+
359
+ return fun
355
360
 
356
361
  @property
357
362
  def freezing_inp_spec(self):
@@ -1,4 +1,5 @@
1
1
  import inspect
2
+ from functools import cached_property
2
3
  from threading import Thread
3
4
 
4
5
  import numpy as np
@@ -24,13 +25,12 @@ class MPDATA_2D:
24
25
  dt,
25
26
  grid,
26
27
  size,
27
- displacement,
28
28
  n_iters=2,
29
29
  infinite_gauge=True,
30
30
  nonoscillatory=True,
31
31
  third_order_terms=False
32
32
  ):
33
- self.grid = grid
33
+ self._grid = grid
34
34
  self.size = size
35
35
  self.dt = dt
36
36
  self.stream_function = stream_function
@@ -39,96 +39,103 @@ class MPDATA_2D:
39
39
  )
40
40
  self.asynchronous = False
41
41
  self.thread: (Thread, None) = None
42
- self.displacement = displacement
43
42
  self.t = 0
43
+ self.advectees = advectees
44
44
 
45
- options = Options(
45
+ self._options = Options(
46
46
  n_iters=n_iters,
47
47
  infinite_gauge=infinite_gauge,
48
48
  nonoscillatory=nonoscillatory,
49
49
  third_order_terms=third_order_terms,
50
50
  )
51
+
52
+ self.g_factor = make_rhod(grid, rhod_of_zZ)
53
+ self.g_factor_vec = (
54
+ rhod_of_zZ(zZ=x_vec_coord(grid)[-1]),
55
+ rhod_of_zZ(zZ=z_vec_coord(grid)[-1]),
56
+ )
57
+
58
+ @cached_property
59
+ def mpdatas(self):
51
60
  disable_threads_if_needed = {}
52
61
  if not conf.JIT_FLAGS["parallel"]:
53
62
  disable_threads_if_needed["n_threads"] = 1
54
63
 
55
64
  stepper = Stepper(
56
- options=options,
57
- grid=self.grid,
65
+ options=self._options,
66
+ grid=self._grid,
58
67
  non_unit_g_factor=True,
59
68
  **disable_threads_if_needed
60
69
  )
61
70
 
62
71
  advector_impl = VectorField(
63
72
  (
64
- np.full((grid[0] + 1, grid[1]), np.nan),
65
- np.full((grid[0], grid[1] + 1), np.nan),
73
+ np.full((self._grid[0] + 1, self._grid[1]), np.nan),
74
+ np.full((self._grid[0], self._grid[1] + 1), np.nan),
66
75
  ),
67
- halo=options.n_halo,
76
+ halo=self._options.n_halo,
68
77
  boundary_conditions=(Periodic(), Periodic()),
69
78
  )
70
79
 
71
- g_factor = make_rhod(self.grid, rhod_of_zZ)
72
80
  g_factor_impl = ScalarField(
73
- g_factor.astype(dtype=options.dtype),
74
- halo=options.n_halo,
81
+ self.g_factor.astype(dtype=self._options.dtype),
82
+ halo=self._options.n_halo,
75
83
  boundary_conditions=(Periodic(), Periodic()),
76
84
  )
77
85
 
78
- self.g_factor_vec = (
79
- rhod_of_zZ(zZ=x_vec_coord(self.grid)[-1]),
80
- rhod_of_zZ(zZ=z_vec_coord(self.grid)[-1]),
81
- )
82
- self.mpdatas = {}
83
- for k, v in advectees.items():
86
+ mpdatas = {}
87
+ for k, v in self.advectees.items():
84
88
  advectee_impl = ScalarField(
85
- np.asarray(v, dtype=options.dtype),
86
- halo=options.n_halo,
89
+ np.asarray(v, dtype=self._options.dtype),
90
+ halo=self._options.n_halo,
87
91
  boundary_conditions=(Periodic(), Periodic()),
88
92
  )
89
- self.mpdatas[k] = Solver(
93
+ mpdatas[k] = Solver(
90
94
  stepper=stepper,
91
95
  advectee=advectee_impl,
92
96
  advector=advector_impl,
93
97
  g_factor=g_factor_impl,
94
98
  )
99
+ return mpdatas
95
100
 
96
- def __getitem__(self, item):
97
- return self.mpdatas[item]
101
+ def __getitem__(self, key: str):
102
+ if "mpdatas" in self.__dict__:
103
+ return self.mpdatas[key].advectee.get()
104
+ return self.advectees[key]
98
105
 
99
- def __call__(self):
106
+ def __call__(self, displacement):
100
107
  if self.asynchronous:
101
108
  self.thread = Thread(target=self.step, args=())
102
109
  self.thread.start()
103
110
  else:
104
- self.step()
111
+ self.step(displacement)
105
112
 
106
113
  def wait(self):
107
114
  if self.asynchronous:
108
115
  if self.thread is not None:
109
116
  self.thread.join()
110
117
 
111
- def refresh_advector(self):
118
+ def refresh_advector(self, displacement):
112
119
  for mpdata in self.mpdatas.values():
113
120
  advector = nondivergent_vector_field_2d(
114
- self.grid, self.size, self.dt, self.stream_function, t=self.t
121
+ self._grid, self.size, self.dt, self.stream_function, t=self.t
115
122
  )
116
- for d in range(len(self.grid)):
123
+ for d in range(len(self._grid)):
117
124
  np.testing.assert_array_less(np.abs(advector[d]), 1)
118
125
  mpdata.advector.get_component(d)[:] = advector[d]
119
- if self.displacement is not None:
120
- for d in range(len(self.grid)):
126
+ if displacement is not None:
127
+ for d in range(len(self._grid)):
121
128
  advector[d] /= self.g_factor_vec[d]
122
- self.displacement.upload_courant_field(advector)
129
+ displacement.upload_courant_field(advector)
123
130
  break # the advector field is shared
124
131
 
125
- def step(self):
132
+ def step(self, displacement):
126
133
  if not self.stream_function_time_dependent and self.t == 0:
127
- self.refresh_advector()
134
+ self.refresh_advector(displacement)
128
135
 
129
136
  self.t += 0.5 * self.dt
130
137
  if self.stream_function_time_dependent:
131
- self.refresh_advector()
138
+ self.refresh_advector(displacement)
132
139
  for mpdata in self.mpdatas.values():
133
140
  mpdata.advance(1)
134
141
  self.t += 0.5 * self.dt
@@ -66,13 +66,6 @@ class Simulation:
66
66
  **kwargs,
67
67
  )
68
68
  builder.add_dynamic(condensation)
69
- displacement = None
70
- if self.settings.processes["particle advection"]:
71
- displacement = Displacement(
72
- enable_sedimentation=self.settings.processes["sedimentation"],
73
- adaptive=self.settings.displacement_adaptive,
74
- rtol=self.settings.displacement_rtol,
75
- )
76
69
  if self.settings.processes["fluid advection"]:
77
70
  initial_profiles = {
78
71
  "th": self.settings.initial_dry_potential_temperature_profile,
@@ -92,7 +85,6 @@ class Simulation:
92
85
  dt=self.settings.dt,
93
86
  grid=self.settings.grid,
94
87
  size=self.settings.size,
95
- displacement=displacement,
96
88
  n_iters=self.settings.mpdata_iters,
97
89
  infinite_gauge=self.settings.mpdata_iga,
98
90
  nonoscillatory=self.settings.mpdata_fct,
@@ -100,7 +92,13 @@ class Simulation:
100
92
  )
101
93
  builder.add_dynamic(EulerianAdvection(solver))
102
94
  if self.settings.processes["particle advection"]:
103
- builder.add_dynamic(displacement)
95
+ builder.add_dynamic(
96
+ Displacement(
97
+ enable_sedimentation=self.settings.processes["sedimentation"],
98
+ adaptive=self.settings.displacement_adaptive,
99
+ rtol=self.settings.displacement_rtol,
100
+ )
101
+ )
104
102
  if (
105
103
  self.settings.processes["coalescence"]
106
104
  and self.settings.processes["breakup"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PySDM-examples
3
- Version: 2.70
3
+ Version: 2.72
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
@@ -26,7 +26,8 @@ setup(
26
26
  "PyMPDATA" + (">=1.0.15" if CI else ""),
27
27
  "open-atmos-jupyter-utils",
28
28
  "pystrict",
29
- "matplotlib",
29
+ # https://github.com/matplotlib/matplotlib/issues/28551
30
+ "matplotlib" + ("!=3.9.1" if CI else ""),
30
31
  "joblib",
31
32
  "ipywidgets",
32
33
  "seaborn",
File without changes
File without changes
File without changes