PySDM 2.43__py3-none-any.whl → 2.45__py3-none-any.whl

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 (28) hide show
  1. PySDM/backends/impl_numba/methods/terminal_velocity_methods.py +20 -0
  2. PySDM/backends/impl_thrust_rtc/methods/terminal_velocity_methods.py +24 -0
  3. PySDM/dynamics/terminal_velocity/__init__.py +1 -0
  4. PySDM/dynamics/terminal_velocity/power_series.py +30 -0
  5. PySDM/environments/kinematic_1d.py +28 -13
  6. PySDM/formulae.py +2 -1
  7. PySDM/initialisation/sampling/spatial_sampling.py +12 -3
  8. PySDM/initialisation/sampling/spectral_sampling.py +2 -1
  9. PySDM/physics/constants_defaults.py +10 -0
  10. PySDM/physics/diffusion_kinetics/__init__.py +2 -0
  11. PySDM/physics/diffusion_kinetics/grabowski_et_al_2011.py +9 -0
  12. PySDM/physics/diffusion_kinetics/jensen_and_nugent_2017.py +14 -0
  13. PySDM/physics/diffusion_kinetics/pruppacher_and_klett_2005.py +8 -0
  14. PySDM/physics/diffusion_thermics/__init__.py +1 -0
  15. PySDM/physics/diffusion_thermics/grabowski_et_al_2011.py +23 -0
  16. PySDM/physics/impl/fake_unit_registry.py +2 -0
  17. PySDM/physics/trivia.py +4 -0
  18. PySDM/products/condensation/peak_supersaturation.py +4 -0
  19. PySDM/products/housekeeping/__init__.py +1 -2
  20. PySDM/products/parcel/__init__.py +1 -0
  21. PySDM/products/size_spectral/__init__.py +1 -0
  22. PySDM/products/size_spectral/arbitrary_moment.py +4 -0
  23. {PySDM-2.43.dist-info → PySDM-2.45.dist-info}/METADATA +2 -2
  24. {PySDM-2.43.dist-info → PySDM-2.45.dist-info}/RECORD +28 -24
  25. /PySDM/products/{housekeeping → parcel}/parcel_displacement.py +0 -0
  26. {PySDM-2.43.dist-info → PySDM-2.45.dist-info}/LICENSE +0 -0
  27. {PySDM-2.43.dist-info → PySDM-2.45.dist-info}/WHEEL +0 -0
  28. {PySDM-2.43.dist-info → PySDM-2.45.dist-info}/top_level.txt +0 -0
@@ -46,3 +46,23 @@ class TerminalVelocityMethods(BackendMethods):
46
46
  self.terminal_velocity_body(
47
47
  values=values, radius=radius, k1=k1, k2=k2, k3=k3, r1=r1, r2=r2
48
48
  )
49
+
50
+ @cached_property
51
+ def power_series_body(self):
52
+ @numba.njit(**{**conf.JIT_FLAGS, "fastmath": self.formulae.fastmath})
53
+ def power_series_body(*, values, radius, num_terms, prefactors, powers):
54
+ for i in numba.prange(len(values)): # pylint: disable=not-an-iterable
55
+ values[i] = 0.0
56
+ for j in range(num_terms):
57
+ values[i] = values[i] + prefactors[j] * radius[i] ** (powers[j] * 3)
58
+
59
+ return power_series_body
60
+
61
+ def power_series(self, *, values, radius, num_terms, prefactors, powers):
62
+ self.power_series_body(
63
+ values=values,
64
+ radius=radius,
65
+ num_terms=num_terms,
66
+ prefactors=prefactors,
67
+ powers=powers,
68
+ )
@@ -131,3 +131,27 @@ class TerminalVelocityMethods(ThrustRTCBackendMethods):
131
131
  self.__interpolation_body.launch_n(
132
132
  len(radius), (output.data, radius.data, factor_device, b.data, c.data)
133
133
  )
134
+
135
+ @cached_property
136
+ def __power_series_body(self):
137
+ # TODO #599 r<0
138
+ return trtc.For(
139
+ ("output", "radius", "num_terms", "prefactors", "powers"),
140
+ "i",
141
+ """
142
+ output[i] = 0.0
143
+ int kmax = num_terms
144
+ for (auto k = 0; k < kmax; k+=1) {
145
+ auto sumterm = prefactors[k] * pow(radius[i], 3*powers[k])
146
+ output[i] = output[i] + sumterm
147
+ """,
148
+ )
149
+
150
+ @nice_thrust(**NICE_THRUST_FLAGS)
151
+ def power_series(self, *, values, radius, num_terms, prefactors, powers):
152
+ prefactors = self._get_floating_point(prefactors)
153
+ powers = self._get_floating_point(powers)
154
+ num_terms = self._get_floating_point(num_terms)
155
+ self.__power_series_body.launch_n(
156
+ values.size(), (values, radius, num_terms, prefactors, powers)
157
+ )
@@ -3,4 +3,5 @@ particle terminal velocity formulae
3
3
  """
4
4
 
5
5
  from PySDM.dynamics.terminal_velocity.gunn_and_kinzer import GunnKinzer1949
6
+ from PySDM.dynamics.terminal_velocity.power_series import PowerSeries
6
7
  from PySDM.dynamics.terminal_velocity.rogers_and_yau import RogersYau
@@ -0,0 +1,30 @@
1
+ """
2
+ Power series expression
3
+ """
4
+
5
+ import numpy as np
6
+
7
+ from PySDM.physics import constants as const
8
+
9
+
10
+ class PowerSeries: # pylint: disable=too-few-public-methods
11
+ def __init__(self, particulator, *, prefactors=None, powers=None):
12
+ si = const.si
13
+ self.particulator = particulator
14
+ prefactors = prefactors or [2.0e-1 * si.m / si.s / np.sqrt(si.m)]
15
+ self.prefactors = np.array(prefactors)
16
+ powers = powers or [1 / 6]
17
+ self.powers = np.array(powers)
18
+ for i, p in enumerate(self.powers):
19
+ self.prefactors[i] *= (4 / 3 * const.PI) ** (p)
20
+ self.prefactors[i] /= (1 * si.um**3) ** (p)
21
+ assert len(self.prefactors) == len(self.powers)
22
+
23
+ def __call__(self, output, radius):
24
+ self.particulator.backend.power_series(
25
+ values=output.data,
26
+ radius=radius.data,
27
+ num_terms=len(self.powers),
28
+ prefactors=self.prefactors,
29
+ powers=self.powers,
30
+ )
@@ -32,7 +32,13 @@ class Kinematic1D(Moist):
32
32
  return self.thd0
33
33
 
34
34
  def init_attributes(
35
- self, *, spatial_discretisation, spectral_discretisation, kappa
35
+ self,
36
+ *,
37
+ spatial_discretisation,
38
+ spectral_discretisation,
39
+ kappa,
40
+ z_part=None,
41
+ collisions_only=False
36
42
  ):
37
43
  super().sync()
38
44
  self.notify()
@@ -43,6 +49,7 @@ class Kinematic1D(Moist):
43
49
  backend=self.particulator.backend,
44
50
  grid=self.mesh.grid,
45
51
  n_sd=self.particulator.n_sd,
52
+ z_part=z_part,
46
53
  )
47
54
  (
48
55
  attributes["cell id"],
@@ -50,24 +57,32 @@ class Kinematic1D(Moist):
50
57
  attributes["position in cell"],
51
58
  ) = self.mesh.cellular_attributes(positions)
52
59
 
53
- r_dry, n_per_kg = spectral_discretisation.sample(
54
- backend=self.particulator.backend, n_sd=self.particulator.n_sd
55
- )
56
- attributes["dry volume"] = self.formulae.trivia.volume(radius=r_dry)
57
- attributes["kappa times dry volume"] = attributes["dry volume"] * kappa
58
- r_wet = equilibrate_wet_radii(
59
- r_dry=r_dry,
60
- environment=self,
61
- cell_id=attributes["cell id"],
62
- kappa_times_dry_volume=attributes["kappa times dry volume"],
63
- )
60
+ if collisions_only:
61
+ v_wet, n_per_kg = spectral_discretisation.sample(
62
+ backend=self.particulator.backend, n_sd=self.particulator.n_sd
63
+ )
64
+ # attributes["dry volume"] = v_wet
65
+ attributes["volume"] = v_wet
66
+ # attributes["kappa times dry volume"] = attributes["dry volume"] * kappa
67
+ else:
68
+ r_dry, n_per_kg = spectral_discretisation.sample(
69
+ backend=self.particulator.backend, n_sd=self.particulator.n_sd
70
+ )
71
+ attributes["dry volume"] = self.formulae.trivia.volume(radius=r_dry)
72
+ attributes["kappa times dry volume"] = attributes["dry volume"] * kappa
73
+ r_wet = equilibrate_wet_radii(
74
+ r_dry=r_dry,
75
+ environment=self,
76
+ cell_id=attributes["cell id"],
77
+ kappa_times_dry_volume=attributes["kappa times dry volume"],
78
+ )
79
+ attributes["volume"] = self.formulae.trivia.volume(radius=r_wet)
64
80
 
65
81
  rhod = self["rhod"].to_ndarray()
66
82
  cell_id = attributes["cell id"]
67
83
  domain_volume = np.prod(np.array(self.mesh.size))
68
84
 
69
85
  attributes["multiplicity"] = n_per_kg * rhod[cell_id] * domain_volume
70
- attributes["volume"] = self.formulae.trivia.volume(radius=r_wet)
71
86
 
72
87
  return attributes
73
88
 
PySDM/formulae.py CHANGED
@@ -19,7 +19,7 @@ from numba.core.errors import NumbaExperimentalFeatureWarning
19
19
 
20
20
  from PySDM import physics
21
21
  from PySDM.backends.impl_numba import conf
22
- from PySDM.dynamics.terminal_velocity import GunnKinzer1949, RogersYau
22
+ from PySDM.dynamics.terminal_velocity import GunnKinzer1949, PowerSeries, RogersYau
23
23
  from PySDM.dynamics.terminal_velocity.gunn_and_kinzer import TpDependent
24
24
 
25
25
 
@@ -124,6 +124,7 @@ class Formulae: # pylint: disable=too-few-public-methods,too-many-instance-attr
124
124
  "GunnKinzer1949": GunnKinzer1949,
125
125
  "RogersYau": RogersYau,
126
126
  "TpDependent": TpDependent,
127
+ "PowerSeries": PowerSeries,
127
128
  }[terminal_velocity]
128
129
 
129
130
  def __str__(self):
@@ -8,7 +8,7 @@ spatial sampling logic (i.e., physical x-y-z coordinates)
8
8
 
9
9
  class Pseudorandom: # pylint: disable=too-few-public-methods
10
10
  @staticmethod
11
- def sample(*, backend, grid, n_sd):
11
+ def sample(*, backend, grid, n_sd, z_part=None):
12
12
  dimension = len(grid)
13
13
  n_elements = dimension * n_sd
14
14
 
@@ -16,6 +16,15 @@ class Pseudorandom: # pylint: disable=too-few-public-methods
16
16
  backend.Random(seed=backend.formulae.seed, size=n_elements)(storage)
17
17
  positions = storage.to_ndarray().reshape(dimension, n_sd)
18
18
 
19
- for dim in range(dimension):
20
- positions[dim, :] *= grid[dim]
19
+ if z_part is None:
20
+ for dim in range(dimension):
21
+ positions[dim, :] *= grid[dim]
22
+ else:
23
+ assert dimension == 1
24
+ iz_min = int(grid[0] * z_part[0])
25
+ iz_max = int(grid[0] * z_part[1])
26
+ for dim in range(dimension):
27
+ positions[dim, :] *= iz_max - iz_min
28
+ positions[dim, :] += iz_min
29
+
21
30
  return positions
@@ -55,7 +55,8 @@ class DeterministicSpectralSampling(
55
55
  diff = abs(1 - np.sum(y_float) / spectrum.norm_factor)
56
56
  if diff > self.error_threshold:
57
57
  raise ValueError(
58
- f"{100*diff}% error in total real-droplet number due to sampling"
58
+ f"{diff * 100:.3g}% error in total real-droplet number due to sampling "
59
+ f"({len(x)} samples)"
59
60
  )
60
61
 
61
62
  return x, y_float
@@ -321,6 +321,16 @@ CRAIG_1961_INTERCEPT_COEFF = 10 * PER_MILLE
321
321
  """ [Bohren 1987](https://doi.org/10.1119/1.15109) """
322
322
  asymmetry_g = 0.85 # forward scattering from cloud droplets
323
323
 
324
+ """ TODO #1266 """
325
+ diffussion_thermics_D_G11_A = 1e-5 * si.m**2 / si.s
326
+ diffussion_thermics_D_G11_B = 0.15 / si.K
327
+ diffussion_thermics_D_G11_C = -1.9
328
+
329
+ diffussion_thermics_K_G11_A = 1.5e-11 * si.W / si.m / si.K**4
330
+ diffussion_thermics_K_G11_B = -4.8e-8 * si.W / si.m / si.K**3
331
+ diffussion_thermics_K_G11_C = 1e-4 * si.W / si.m / si.K**2
332
+ diffussion_thermics_K_G11_D = -3.9e-4 * si.W / si.m / si.K
333
+
324
334
 
325
335
  def compute_derived_values(c: dict):
326
336
  c["eps"] = c["Mv"] / c["Md"]
@@ -5,3 +5,5 @@ Formulae for handling transition-régime corrections in condensational growth/ev
5
5
  from .fuchs_sutugin import FuchsSutugin
6
6
  from .lowe_et_al_2019 import LoweEtAl2019
7
7
  from .neglect import Neglect
8
+ from .grabowski_et_al_2011 import GrabowskiEtAl2011
9
+ from .jensen_and_nugent_2017 import JensenAndNugent2017
@@ -0,0 +1,9 @@
1
+ """
2
+ as in [Grabowski et al. (2011)](https://doi.org/10.1016/j.atmosres.2010.10.020)
3
+ """
4
+
5
+ from .pruppacher_and_klett_2005 import PruppacherKlett
6
+
7
+
8
+ class GrabowskiEtAl2011(PruppacherKlett):
9
+ pass
@@ -0,0 +1,14 @@
1
+ """
2
+ as in [Jensen and Nugent 2017](https://doi.org/10.1175/JAS-D-15-0370.1)
3
+ (which refers to [Grabowski et al. (2011)](https://doi.org/10.1016/j.atmosres.2010.10.020)
4
+ but uses different gas constant, typo?)
5
+ """
6
+
7
+ import numpy as np
8
+ from .grabowski_et_al_2011 import GrabowskiEtAl2011
9
+
10
+
11
+ class JensenAndNugent2017(GrabowskiEtAl2011):
12
+ @staticmethod
13
+ def lambdaD(const, D, T):
14
+ return D / np.sqrt(2 * const.Rd * T)
@@ -19,3 +19,11 @@ class PruppacherKlett:
19
19
  return D / (
20
20
  (r / (r + const.dv_pk05)) + 2 * np.sqrt(const.PI) * lmbd / r / const.MAC
21
21
  )
22
+
23
+ @staticmethod
24
+ def lambdaK(_, T, p): # pylint: disable=unused-argument
25
+ return -1
26
+
27
+ @staticmethod
28
+ def K(const, K, r, lmbd): # pylint: disable=unused-argument
29
+ return K # TODO #1266
@@ -5,3 +5,4 @@ Formulae for representing the temperature and pressure dependence of vapour diff
5
5
  from .lowe_et_al_2019 import LoweEtAl2019
6
6
  from .neglect import Neglect
7
7
  from .tracy_welch_porter import TracyWelchPorter
8
+ from .grabowski_et_al_2011 import GrabowskiEtAl2011
@@ -0,0 +1,23 @@
1
+ """
2
+ as in [Grabowski et al. (2011)](https://doi.org/10.1016/j.atmosres.2010.10.020)
3
+ """
4
+
5
+
6
+ class GrabowskiEtAl2011:
7
+ def __init__(self, _):
8
+ pass
9
+
10
+ @staticmethod
11
+ def D(const, T, p): # pylint: disable=unused-argument
12
+ return const.diffussion_thermics_D_G11_A * (
13
+ const.diffussion_thermics_D_G11_B * T + const.diffussion_thermics_D_G11_C
14
+ )
15
+
16
+ @staticmethod
17
+ def K(const, T, p): # pylint: disable=unused-argument
18
+ return (
19
+ const.diffussion_thermics_K_G11_A * T**3
20
+ + const.diffussion_thermics_K_G11_B * T**2
21
+ + const.diffussion_thermics_K_G11_C * T
22
+ + const.diffussion_thermics_K_G11_D
23
+ )
@@ -26,6 +26,7 @@ class FakeUnitRegistry: # pylint: disable=too-few-public-methods
26
26
  "litre",
27
27
  "hour",
28
28
  "newton",
29
+ "watt",
29
30
  ):
30
31
  self.__setattr__(prefix + unit, _fake(si.__getattr__(prefix + unit)))
31
32
  self.__setattr__(
@@ -48,5 +49,6 @@ class FakeUnitRegistry: # pylint: disable=too-few-public-methods
48
49
  "h",
49
50
  "bar",
50
51
  "N",
52
+ "W",
51
53
  ):
52
54
  self.__setattr__(prefix + unit, _fake(si.__getattr__(prefix + unit)))
PySDM/physics/trivia.py CHANGED
@@ -125,3 +125,7 @@ class Trivia: # pylint: disable=too-many-public-methods
125
125
  @staticmethod
126
126
  def mixing_ratio_to_specific_content(mixing_ratio):
127
127
  return mixing_ratio / (1 + mixing_ratio)
128
+
129
+ @staticmethod
130
+ def dn_dlogr(r, dn_dr):
131
+ return np.log(10) * r * dn_dr
@@ -19,6 +19,10 @@ class PeakSupersaturation(Product):
19
19
  def register(self, builder):
20
20
  super().register(builder)
21
21
  self.particulator.observers.append(self)
22
+
23
+ assert (
24
+ "Condensation" in self.particulator.dynamics
25
+ ), "It seems the Condensation dynamic was not added when building particulator"
22
26
  self.condensation = self.particulator.dynamics["Condensation"]
23
27
  self.RH_max = np.full_like(self.buffer, np.nan)
24
28
 
@@ -1,9 +1,8 @@
1
1
  """
2
- Housekeeping products: time, parcel displacement, super-particle counts, wall-time timers...
2
+ Housekeeping products: time, super-particle count, wall-time timers...
3
3
  """
4
4
 
5
5
  from .dynamic_wall_time import DynamicWallTime
6
- from .parcel_displacement import ParcelDisplacement
7
6
  from .super_droplet_count_per_gridbox import SuperDropletCountPerGridbox
8
7
  from .time import Time
9
8
  from .timers import CPUTime, WallTime
@@ -1,3 +1,4 @@
1
1
  """ products specific to the parcel environment """
2
2
 
3
3
  from .cloud_water_path import ParcelLiquidWaterPath
4
+ from .parcel_displacement import ParcelDisplacement
@@ -4,6 +4,7 @@ from .arbitrary_moment import (
4
4
  RadiusFirstMoment,
5
5
  RadiusSixthMoment,
6
6
  VolumeFirstMoment,
7
+ VolumeSecondMoment,
7
8
  ZerothMoment,
8
9
  )
9
10
  from .effective_radius import EffectiveRadius
@@ -32,6 +32,10 @@ VolumeFirstMoment = make_arbitrary_moment_product(
32
32
  rank=1, attr="volume", attr_unit="m^3"
33
33
  )
34
34
 
35
+ VolumeSecondMoment = make_arbitrary_moment_product(
36
+ rank=2, attr="volume", attr_unit="m^3"
37
+ )
38
+
35
39
  RadiusSixthMoment = make_arbitrary_moment_product(rank=6, attr="radius", attr_unit="m")
36
40
 
37
41
  RadiusFirstMoment = make_arbitrary_moment_product(rank=1, attr="radius", attr_unit="m")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PySDM
3
- Version: 2.43
3
+ Version: 2.45
4
4
  Summary: Pythonic particle-based (super-droplet) warm-rain/aqueous-chemistry cloud microphysics package with box, parcel & 1D/2D prescribed-flow examples in Python, Julia and Matlab
5
5
  Home-page: https://github.com/open-atmos/PySDM
6
6
  Author: https://github.com/open-atmos/PySDM/graphs/contributors
@@ -34,7 +34,7 @@ Provides-Extra: tests
34
34
  Requires-Dist: matplotlib ; extra == 'tests'
35
35
  Requires-Dist: pytest ; extra == 'tests'
36
36
  Requires-Dist: pytest-timeout ; extra == 'tests'
37
- Requires-Dist: PyPartMC ==1.0.3 ; extra == 'tests'
37
+ Requires-Dist: PyPartMC ==1.1.0 ; extra == 'tests'
38
38
  Requires-Dist: pyrcel ; extra == 'tests'
39
39
  Requires-Dist: jupyter-core <5.0.0 ; extra == 'tests'
40
40
  Requires-Dist: ipywidgets !=8.0.3 ; extra == 'tests'
@@ -1,6 +1,6 @@
1
1
  PySDM/__init__.py,sha256=-jFr7iN9cgzKvlcRdCA3NLAxMc_1NHyQR4uk0ZfF_A0,1640
2
2
  PySDM/builder.py,sha256=3xwlnz2HijK4FHYm1YlkxPE02udj-WbZULZcq-iXaSk,5682
3
- PySDM/formulae.py,sha256=8Kde9ZYRtk20yu8pEcgH5ldc_B_FHwmDG50sPg_5L9s,10793
3
+ PySDM/formulae.py,sha256=9B2C4k2Z8okXtZr_yDY5vbtXWChBVMoXXXUQO70rXtk,10846
4
4
  PySDM/particulator.py,sha256=yh3QThCYsqIIoEHrUsmB8aIhh5iWL7T87C6or_xcyG4,16591
5
5
  PySDM/attributes/__init__.py,sha256=wR9DAJL3beWY_9IyDsbSjLV9BqJrOXdNScVCYy-Qtw8,55
6
6
  PySDM/attributes/chemistry/__init__.py,sha256=sv9kFUXgcZjbjmrQKK8sgdgqM05MPxAw73Euj0O3n40,223
@@ -76,7 +76,7 @@ PySDM/backends/impl_numba/methods/isotope_methods.py,sha256=_kP669HfXYXilO3pvrk3
76
76
  PySDM/backends/impl_numba/methods/moments_methods.py,sha256=p2y3TrLsCmmycGEadr9AyZZ5_Je7ZH_GMYVMhp1t0TE,5020
77
77
  PySDM/backends/impl_numba/methods/pair_methods.py,sha256=zAWINfSc9S2lrPNLkBQCdpqL-u_pCl2NH20mS2fR81U,5578
78
78
  PySDM/backends/impl_numba/methods/physics_methods.py,sha256=BdumMJMUh7NLxKscUhdCI_DlLZsSOwRu5kOEdMVFhQs,4982
79
- PySDM/backends/impl_numba/methods/terminal_velocity_methods.py,sha256=WiBw_CpUUP8T-R3K5x885WVISvTa2SvHGkuLJc2RXpY,1798
79
+ PySDM/backends/impl_numba/methods/terminal_velocity_methods.py,sha256=19_JrUDk1V9zdnh-ZeBa0Z4EpM5YsfzURTaHpPRiyfA,2563
80
80
  PySDM/backends/impl_numba/test_helpers/__init__.py,sha256=8_cw4HYZE6jatsdpVWJHbbS2HwXWisbMpjFsos6JBqk,94
81
81
  PySDM/backends/impl_numba/test_helpers/scipy_ode_condensation_solver.py,sha256=6O7Xrpd7vcnJJjKwfHnDTYWc4Lzd_SLl1Cc2Rzkx9Pg,8400
82
82
  PySDM/backends/impl_thrust_rtc/__init__.py,sha256=iGWQO2nSMkX79is4W85b1MCM3oUE9miA20qI28wUvNM,36
@@ -95,7 +95,7 @@ PySDM/backends/impl_thrust_rtc/methods/isotope_methods.py,sha256=BHLS4yTlTVnrRea
95
95
  PySDM/backends/impl_thrust_rtc/methods/moments_methods.py,sha256=Rav3lhqwtNo1omRl_Wq0oU9e37sYJH2ZdEGZHNlaPrI,8006
96
96
  PySDM/backends/impl_thrust_rtc/methods/pair_methods.py,sha256=1QfyDh0cHB61umoEphMT37QcuHngTu7a-0tebGTbNz0,6997
97
97
  PySDM/backends/impl_thrust_rtc/methods/physics_methods.py,sha256=0BB-p5L9NQQnlE2IkMW40YldWq97FsWZYzQ6VzpePk8,5715
98
- PySDM/backends/impl_thrust_rtc/methods/terminal_velocity_methods.py,sha256=er7KXK2TNy4R11wBYGM6E-SOuYn4zmyXNq9RPMKjM8U,4273
98
+ PySDM/backends/impl_thrust_rtc/methods/terminal_velocity_methods.py,sha256=yjrMlNjzkvgElFd41WzbVxiyHpwhWgvhZFtH4Xb1ppM,5150
99
99
  PySDM/backends/impl_thrust_rtc/methods/thrust_rtc_backend_methods.py,sha256=ZuHeSImR8--2RRmHTNITE2v_7PzbeCgC4zyL0hMsI6E,811
100
100
  PySDM/backends/impl_thrust_rtc/test_helpers/__init__.py,sha256=c-QZ2cI70jcZ8Yvb1ZHunobGypXHTxeaTAjuGM7qe_0,145
101
101
  PySDM/backends/impl_thrust_rtc/test_helpers/cpp2python.py,sha256=ThtAUqJ_Hqqsa0nVZvBvTrFOoiX95PaNWKzfpwvl6Cs,6048
@@ -149,12 +149,13 @@ PySDM/dynamics/impl/__init__.py,sha256=wQgfxtwzlaBeOY61t-6DQ-nXdrOh2VU2J4FBo_hzy
149
149
  PySDM/dynamics/impl/chemistry_utils.py,sha256=TylQxynIO7sgTwr_RO0LTcGP3-LO8vMAE98Uj2BJVyY,5243
150
150
  PySDM/dynamics/impl/random_generator_optimizer.py,sha256=lMlQn6jVNPKsCcZeroph_o-aZbinEx7BkKAsxWbh7ms,1515
151
151
  PySDM/dynamics/impl/random_generator_optimizer_nopair.py,sha256=MF_aGZqgEdV_x8JSu9G0Wv0xJ4lX6DcSeNWmbnkCnw8,1059
152
- PySDM/dynamics/terminal_velocity/__init__.py,sha256=ap9ZGtd6UvTJdXiGsGJ_D_nuUMxhKb6Li0SdXiWgP24,191
152
+ PySDM/dynamics/terminal_velocity/__init__.py,sha256=uvxTCpUx_DMAVwLUvhcGKwo0_l8OVK7SaFD5HbKeulk,261
153
153
  PySDM/dynamics/terminal_velocity/gunn_and_kinzer.py,sha256=ykbZFHne_oOyBw5ABmdi633RZDmoOj1YKsb5T1bdAbQ,6400
154
+ PySDM/dynamics/terminal_velocity/power_series.py,sha256=Fyqop4Y74s_qO-jPYUWe_-xYRjKV9Fs-GC6bImlzv5E,981
154
155
  PySDM/dynamics/terminal_velocity/rogers_and_yau.py,sha256=ZzG03esNoLayyHIYT2lUdKV2sOKNd9BhME96YCNXRUs,1033
155
156
  PySDM/environments/__init__.py,sha256=t9Pxa2ZdEcfh6siHPrcA1LbAMNNd0uoA2jdi5XoBxNg,246
156
157
  PySDM/environments/box.py,sha256=ai9j3lkOS001jIo1L-PvZ-cSFxsomD_Na4xshDKbE7c,1014
157
- PySDM/environments/kinematic_1d.py,sha256=5dNlebyMNvz6DFZ-fyFjyUoG7pAUgkhHfiNLjNQoiX8,2687
158
+ PySDM/environments/kinematic_1d.py,sha256=kTZD3IdxUr-3Mk9RwC3lLH23DKaguphvw5S8_tMohDI,3257
158
159
  PySDM/environments/kinematic_2d.py,sha256=Pn4vIFB6jlAVBQGFnidHF8j5n_kZ0QhmGcazFqmxAZs,3341
159
160
  PySDM/environments/parcel.py,sha256=Me_9tRV8cxBcT4RcMeAYTVGzx77aSqPpViiTOwwyujY,4825
160
161
  PySDM/environments/impl/__init__.py,sha256=VLo3BCKoh2ITc5eMudK17HzmktSn74d-bCdjq9xbhRo,68
@@ -179,8 +180,8 @@ PySDM/initialisation/aerosol_composition/dry_aerosol.py,sha256=FxFqPyR7Fhg1mi5lY
179
180
  PySDM/initialisation/impl/__init__.py,sha256=vejuF9ebIGXb7l9zEiBBbNjs1Qct1KZuZRPLh8w3SJE,125
180
181
  PySDM/initialisation/impl/spectrum.py,sha256=mnhodIKZUReelgxgT3GwT8FH9LnyaUigmr1GaQIJkv8,1138
181
182
  PySDM/initialisation/sampling/__init__.py,sha256=zVwv6m1lrC4moviau-rL-tdGNL1pjx9KujEfEAmLe-Y,42
182
- PySDM/initialisation/sampling/spatial_sampling.py,sha256=EygEFcX5Jthe6F1hQVLFQ-f-J7BVWiHS3gAHNpndPqw,673
183
- PySDM/initialisation/sampling/spectral_sampling.py,sha256=-zD3wR9RuM9Q9WazCKaGbU--QiEBPB_W6eEzSvGT-jc,4313
183
+ PySDM/initialisation/sampling/spatial_sampling.py,sha256=HPDEEjTN_CWU9KX2Fw_7wMMKzQRMqi1tKVhzZ1KLcWY,1000
184
+ PySDM/initialisation/sampling/spectral_sampling.py,sha256=9Nd38R06EnbPLnpucu8occ-u1qmCGO6xD6PSSx8PYZY,4358
184
185
  PySDM/initialisation/sampling/spectro_glacial_sampling.py,sha256=Wtq-NvZGX3-hFzRe_2LI2Ab8vi1BAcHNtdrC5gk3Rfo,1662
185
186
  PySDM/initialisation/spectra/__init__.py,sha256=jU86INl3-p7HPOroJ5kGy7k43U4bxbXkfvffmvlIHz0,309
186
187
  PySDM/initialisation/spectra/exponential.py,sha256=bF61am70p4KJsU910SamlY_PO-rXVs9yErKXQIZ2LGE,364
@@ -191,18 +192,21 @@ PySDM/initialisation/spectra/sum.py,sha256=SaxepweOdCozWlUkxCfr6Udo-KjGKWXgrdS0a
191
192
  PySDM/initialisation/spectra/top_hat.py,sha256=xmBr_IrctsnguPNgX-jR7JnQnQl1qzIaEyz75fvAJho,563
192
193
  PySDM/physics/__init__.py,sha256=FLer5MXgu69MztiUN91rpVVRV75SX-_YCRZohTF3y-U,1745
193
194
  PySDM/physics/constants.py,sha256=wrIR-prH5ougsrL7jmpaIdmdmGZ5BejjmIEf5yFQpZs,1293
194
- PySDM/physics/constants_defaults.py,sha256=XGKJ6WhaJPZsRK0of8Oya5YyJjpCEq4ufWTu69DWo4A,10500
195
+ PySDM/physics/constants_defaults.py,sha256=kha03ZhX3ZewG1L6CaHQJsWJhoxeOO8WU8V2J1NvQAc,10892
195
196
  PySDM/physics/dimensional_analysis.py,sha256=6_myMgc_eKhcbuNr7RqiQGj0OKNQ1TNqEMRb6Kzsqj0,688
196
- PySDM/physics/trivia.py,sha256=Y6DxnBp5a6BqGvfZNYlOWlP6X6mr2HHOUfWJ759N_sg,3677
197
+ PySDM/physics/trivia.py,sha256=8fWqTP2G2jbnuK9xqpAIo-gfZ5ORx7In-b7AEUFAhBQ,3762
197
198
  PySDM/physics/condensation_coordinate/__init__.py,sha256=LlSg1TLiLRQ46tfsKA1Khg7SaVPd2wg-MF0Syk5O7ng,151
198
199
  PySDM/physics/condensation_coordinate/volume.py,sha256=DvkuOTHEq_vLFnJMjfEr0K0OUxTvcBBgFPlBb606sk8,410
199
200
  PySDM/physics/condensation_coordinate/volume_logarithm.py,sha256=92xFq-qSIN8llu9HM59DQvbwawzbeRBIZ5hi7KEs7gc,512
200
- PySDM/physics/diffusion_kinetics/__init__.py,sha256=kwHERKnqQdVa8Wv8qlTCL-Y4WxC5mInUuMoU6AVAQvs,210
201
+ PySDM/physics/diffusion_kinetics/__init__.py,sha256=CWyIRClhDMzTLeNORHbg1izb-aGz00T6yORefVjwMsY,318
201
202
  PySDM/physics/diffusion_kinetics/fuchs_sutugin.py,sha256=6HSMZoyKzCa1Vl-CkIOFJalGNnQB5Cl5MFFVsRtibFc,1025
203
+ PySDM/physics/diffusion_kinetics/grabowski_et_al_2011.py,sha256=_-bvXLcSfjPH2KEnRpSxyxG0olGi-hxkV2-nLBN4SwE,197
204
+ PySDM/physics/diffusion_kinetics/jensen_and_nugent_2017.py,sha256=YVUVyLhwjs_i1LQ40ULXZri2--t41I0otzTEGj4UJQ0,424
202
205
  PySDM/physics/diffusion_kinetics/lowe_et_al_2019.py,sha256=mIR5jH00SNurVzKEgWk0e3-KKq65NbFqTHo3ZBDqzjY,621
203
206
  PySDM/physics/diffusion_kinetics/neglect.py,sha256=QCiLZwQo7VW29dftNuwQjLdOePz0kZSvjepGmqr_Ar8,500
204
- PySDM/physics/diffusion_kinetics/pruppacher_and_klett_2005.py,sha256=ZsFuoGlPOoMuzdJ_h4pOM70lGhtyeiIATFcuEWlWwGY,473
205
- PySDM/physics/diffusion_thermics/__init__.py,sha256=70pZ4RhK-Ykz46r00gxfnkFYjPNf8i9KFc0oHzRtFtg,227
207
+ PySDM/physics/diffusion_kinetics/pruppacher_and_klett_2005.py,sha256=1GVoKpZ9sw5se-uxvnyjcOc4khLJ64hYTPoztMM5nz0,686
208
+ PySDM/physics/diffusion_thermics/__init__.py,sha256=0m8nbzap79JQDOa6NOKaKX6issZi76KoBib9qxDV65Q,279
209
+ PySDM/physics/diffusion_thermics/grabowski_et_al_2011.py,sha256=_JRfeYa_Bo9ylYbGPWKPVaNGJUNm5M4YJL4cm6c5zoI,695
206
210
  PySDM/physics/diffusion_thermics/lowe_et_al_2019.py,sha256=JkzhyHQwRHgui3M_fh3-QqXPlzjgtNrfHrcYFzAtl4Y,452
207
211
  PySDM/physics/diffusion_thermics/neglect.py,sha256=m_yXkbDMb_bnMlfQR2qjteTQ9cmbE3E6tDRC3M2DtUM,312
208
212
  PySDM/physics/diffusion_thermics/seinfeld_and_pandis_2010.py,sha256=Efz20-SZzbapGaxXlywj26BtGU3zATDMk9FkbYA9MTw,316
@@ -233,7 +237,7 @@ PySDM/physics/hygroscopicity/__init__.py,sha256=Iu3uM5NzjY9RCffhguD_hHrRy4DoVlz-
233
237
  PySDM/physics/hygroscopicity/kappa_koehler.py,sha256=cTuuShyG7v9PbTTjRc9Xp6Wua_5YZS6XycTMXOwb6Ok,606
234
238
  PySDM/physics/hygroscopicity/kappa_koehler_leading_terms.py,sha256=PzKLb9fPeR1jH872jtY5unNKGrmpLrFquXaT9WkCFu0,712
235
239
  PySDM/physics/impl/__init__.py,sha256=M0WoRoBIUk2fXAL2GKv4AS8QTIcOJQ5fzE1x53X1YHI,154
236
- PySDM/physics/impl/fake_unit_registry.py,sha256=IEwYsXHFCJrhLLD_ZcTyRDhPJKPPwErH2koCJiW8-kw,1683
240
+ PySDM/physics/impl/fake_unit_registry.py,sha256=3Iv5vbMde_pTncJVQO51lzmnqGR1905oOjIPVG-NlFk,1728
237
241
  PySDM/physics/impl/flag.py,sha256=zjTKmfWEKY60AiNUWbxLVy3DBzXFMy-YaMxKnUjMap8,192
238
242
  PySDM/physics/isotope_equilibrium_fractionation_factors/__init__.py,sha256=BNh6k8VAqAX8BKH0LsVVTH1662wpvpIoGfbXbT5XQSg,681
239
243
  PySDM/physics/isotope_equilibrium_fractionation_factors/barkan_and_luz_2005.py,sha256=W_GaRPlA905UpoS4OYG7uIrBxSAb5UXwK2TyBZd-gHY,350
@@ -311,7 +315,7 @@ PySDM/products/condensation/__init__.py,sha256=4Trl0rt4f2j3XFnBMooMDIPaq2pjl86hF
311
315
  PySDM/products/condensation/activable_fraction.py,sha256=YoGJH7jTL2P6NH9-9E4og8ZUGb0sHpZTRs9pj1MZcxM,891
312
316
  PySDM/products/condensation/condensation_timestep.py,sha256=7vi2V0BwVXZDngVwY2u-zFpgN42_Dd_ykYg_NhjYyj0,1540
313
317
  PySDM/products/condensation/event_rates.py,sha256=-djWcPHbsO2V0tv9NoGp98y1MU-qHjFyceGm1I75P98,1812
314
- PySDM/products/condensation/peak_supersaturation.py,sha256=dVJdt-J1woS-YqdjDzgl7TKcPHig3HturJY5d5_RRS8,1111
318
+ PySDM/products/condensation/peak_supersaturation.py,sha256=e0AwMjooCueuQ3YLrUZ6AxahGQLJdh5ocOE1SVMYyaE,1274
315
319
  PySDM/products/displacement/__init__.py,sha256=dHAXQ2b7jmQVMYdWkIuGjGz56EU0UyJMRDyKV0meo1w,315
316
320
  PySDM/products/displacement/averaged_terminal_velocity.py,sha256=h2JBUmYkTeyGwGdVJoGsYeY0XJStg2pwGcuDpZVT-mk,1172
317
321
  PySDM/products/displacement/flow_velocity_component.py,sha256=I5K8gpKeMDYlCeIYuwF3W7hGsHHSKLp-my-OPcwYb0k,1383
@@ -323,9 +327,8 @@ PySDM/products/freezing/freezable_specific_concentration.py,sha256=I4RJMBFCVDvDj
323
327
  PySDM/products/freezing/frozen_particle_concentration.py,sha256=8SpNQXOGQb1sIcnZWBwoR1kWNh1CgkbMJsuy48gwB9c,1460
324
328
  PySDM/products/freezing/ice_nuclei_concentration.py,sha256=iAd_-TMc3Q9Q6PQTkvYMhxYi6HofI7VFRJopGAhPWLY,1277
325
329
  PySDM/products/freezing/total_unfrozen_immersed_surface_area.py,sha256=0qMCsERyDMwcXg41SQQgSgDbwqjtQtoxSlozaIIkQkU,744
326
- PySDM/products/housekeeping/__init__.py,sha256=UAPGrdoyGwIDFDrx4vUTFyQOfvmShuuzsC1YHksROak,335
330
+ PySDM/products/housekeeping/__init__.py,sha256=S4q5D5NgTtDMD94uyAVMP5omVCzMQY2i6hRz_4taGDs,261
327
331
  PySDM/products/housekeeping/dynamic_wall_time.py,sha256=lcpeMNTjwjAvO0uLpawLSo0YPxvoQeQp9CEDttRWPkg,643
328
- PySDM/products/housekeeping/parcel_displacement.py,sha256=zDklDrFT2EBUw2uyxm1R7Ud301lN0D6uIwRzhJuqeQ4,653
329
332
  PySDM/products/housekeeping/super_droplet_count_per_gridbox.py,sha256=4aWPrPOSU7NUUZ0zXsBJDJvQ4id9mn84EIlBoMuExz4,996
330
333
  PySDM/products/housekeeping/time.py,sha256=LvGhRNtCHtZGO8Anfc_Vo_xtA34T3w41HvtBhwEyeAk,457
331
334
  PySDM/products/housekeeping/timers.py,sha256=bgaQNhqI6KuMDLUqDCCZNIAs4Ldvxf6okyv7Mm-t59Q,1085
@@ -340,10 +343,11 @@ PySDM/products/impl/spectrum_moment_product.py,sha256=0QUUBJyzbNmnGTgv1Ol9dtf2av
340
343
  PySDM/products/optical/__init__.py,sha256=jBNQ2aUR6hUfZZtZPt9UR5866EeOdgtMU-FjlXZ6x_U,123
341
344
  PySDM/products/optical/cloud_albedo.py,sha256=aW8_Rz7lFBoXMar45ub2iIcEidBt5Rc8X84KX__M_d8,315
342
345
  PySDM/products/optical/cloud_optical_depth.py,sha256=Vm0WPCWbCTG305XTP-denNzgIkqyLojfTW-2a3rbsy4,391
343
- PySDM/products/parcel/__init__.py,sha256=U3oSlIGv4hXgvxbKv87lZAQTvC24FjjM29sojaT-e1Q,105
346
+ PySDM/products/parcel/__init__.py,sha256=SfVQ25TE48njgj0TyQ9VJ1OG8LGXVqxFBA-mgfbb0S0,157
344
347
  PySDM/products/parcel/cloud_water_path.py,sha256=J9FQ6m7pfGa6cyV5CzXcDPKhlN0iuwQj4O8YCXAC-ho,1823
345
- PySDM/products/size_spectral/__init__.py,sha256=ZooEolyv6wkEaeBrNex5D5_MYUqegPywQ0dr_0Ga5mA,1570
346
- PySDM/products/size_spectral/arbitrary_moment.py,sha256=K642dzCyX5TvX9rfFRqlqZol2Wcfl-fGvv7TXgBUoDI,1110
348
+ PySDM/products/parcel/parcel_displacement.py,sha256=zDklDrFT2EBUw2uyxm1R7Ud301lN0D6uIwRzhJuqeQ4,653
349
+ PySDM/products/size_spectral/__init__.py,sha256=8B4wiFGoyXbAjR09eRWpCCeVT14ZMooh7VLBQ1Pjl7g,1594
350
+ PySDM/products/size_spectral/arbitrary_moment.py,sha256=YukqGvkYuKzWbDkaDCbsgcaM-siXY80iN3zRwMbgXIA,1208
347
351
  PySDM/products/size_spectral/cloud_water_content.py,sha256=iZNIhF02jQzlHa4dGTMRosGrq_jhf-F9-gwN1AYKHD4,2522
348
352
  PySDM/products/size_spectral/effective_radius.py,sha256=Fm7WWNvLKG0arBp8fqXmlhkbWNb1SblJ-PbMOZKRNJw,1878
349
353
  PySDM/products/size_spectral/effective_radius_activated.py,sha256=WzqRNMxpFvcezzz92IhWlZFIFnQdKbL5Jho2F7jCauk,1351
@@ -360,8 +364,8 @@ PySDM/products/size_spectral/size_standard_deviation.py,sha256=ikW_BefV27gwUlDPo
360
364
  PySDM/products/size_spectral/total_particle_concentration.py,sha256=stDEn67KGhxEkrOC4CCfCFVgjtQPMphZTfJ1Vy_H5aw,454
361
365
  PySDM/products/size_spectral/total_particle_specific_concentration.py,sha256=z6SfknIoXgT2XbVeuswrwBew9yTlmbW7qWFRmD4rqUg,460
362
366
  PySDM/products/size_spectral/water_mixing_ratio.py,sha256=i2g2s8Hj_ZTmggZvXuGRWnqyxutSknncY8Imzw_Vfhk,1301
363
- PySDM-2.43.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
364
- PySDM-2.43.dist-info/METADATA,sha256=OZxq_SDHyH4Yhm_oCxQbZJ7bp7mZzEzDS5NdLFh8IiA,45361
365
- PySDM-2.43.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
366
- PySDM-2.43.dist-info/top_level.txt,sha256=6NYaDAhUnaYMD7ebD_dQ7HlhiJS7NMuKEXb0ck7Wcsg,6
367
- PySDM-2.43.dist-info/RECORD,,
367
+ PySDM-2.45.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
368
+ PySDM-2.45.dist-info/METADATA,sha256=8azh6MqIvPeMTMBcvLKqPIOH5pi-ETHBMnqzXfm-GDM,45361
369
+ PySDM-2.45.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
370
+ PySDM-2.45.dist-info/top_level.txt,sha256=6NYaDAhUnaYMD7ebD_dQ7HlhiJS7NMuKEXb0ck7Wcsg,6
371
+ PySDM-2.45.dist-info/RECORD,,
File without changes
File without changes