PySDM 2.73__py3-none-any.whl → 2.76__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.
@@ -12,3 +12,4 @@ from .moments_methods import MomentsMethods
12
12
  from .pair_methods import PairMethods
13
13
  from .physics_methods import PhysicsMethods
14
14
  from .terminal_velocity_methods import TerminalVelocityMethods
15
+ from .seeding_methods import SeedingMethods
@@ -445,7 +445,7 @@ class CondensationMethods(BackendMethods):
445
445
  v_drop = formulae.particle_shape_and_density__mass_to_volume(
446
446
  attributes.water_mass[drop]
447
447
  )
448
- if v_drop < 0:
448
+ if v_drop <= 0:
449
449
  continue
450
450
  x_old = formulae.condensation_coordinate__x(v_drop)
451
451
  r_old = formulae.trivia__radius(v_drop)
@@ -0,0 +1,68 @@
1
+ """ CPU implementation of backend methods for particle injections """
2
+
3
+ from functools import cached_property
4
+
5
+ import numba
6
+
7
+ from PySDM.backends.impl_common.backend_methods import BackendMethods
8
+
9
+
10
+ class SeedingMethods(BackendMethods): # pylint: disable=too-few-public-methods
11
+ @cached_property
12
+ def _seeding(self):
13
+ @numba.njit(**{**self.default_jit_flags, "parallel": False})
14
+ def body( # pylint: disable=too-many-arguments
15
+ idx,
16
+ multiplicity,
17
+ extensive_attributes,
18
+ seeded_particle_index,
19
+ seeded_particle_multiplicity,
20
+ seeded_particle_extensive_attributes,
21
+ number_of_super_particles_to_inject: int,
22
+ ):
23
+ number_of_super_particles_already_injected = 0
24
+ # TODO #1387 start enumerating from the end of valid particle set
25
+ for i, mult in enumerate(multiplicity):
26
+ if (
27
+ number_of_super_particles_to_inject
28
+ == number_of_super_particles_already_injected
29
+ ):
30
+ break
31
+ if mult == 0:
32
+ idx[i] = -1
33
+ s = seeded_particle_index[
34
+ number_of_super_particles_already_injected
35
+ ]
36
+ number_of_super_particles_already_injected += 1
37
+ multiplicity[i] = seeded_particle_multiplicity[s]
38
+ for a in range(len(extensive_attributes)):
39
+ extensive_attributes[a, i] = (
40
+ seeded_particle_extensive_attributes[a, s]
41
+ )
42
+ assert (
43
+ number_of_super_particles_to_inject
44
+ == number_of_super_particles_already_injected
45
+ )
46
+
47
+ return body
48
+
49
+ def seeding(
50
+ self,
51
+ *,
52
+ idx,
53
+ multiplicity,
54
+ extensive_attributes,
55
+ seeded_particle_index,
56
+ seeded_particle_multiplicity,
57
+ seeded_particle_extensive_attributes,
58
+ number_of_super_particles_to_inject: int,
59
+ ):
60
+ self._seeding(
61
+ idx=idx.data,
62
+ multiplicity=multiplicity.data,
63
+ extensive_attributes=extensive_attributes.data,
64
+ seeded_particle_index=seeded_particle_index.data,
65
+ seeded_particle_multiplicity=seeded_particle_multiplicity.data,
66
+ seeded_particle_extensive_attributes=seeded_particle_extensive_attributes.data,
67
+ number_of_super_particles_to_inject=number_of_super_particles_to_inject,
68
+ )
PySDM/backends/numba.py CHANGED
@@ -28,6 +28,7 @@ class Numba( # pylint: disable=too-many-ancestors,duplicate-code
28
28
  methods.DisplacementMethods,
29
29
  methods.TerminalVelocityMethods,
30
30
  methods.IsotopeMethods,
31
+ methods.SeedingMethods,
31
32
  ):
32
33
  Storage = ImportedStorage
33
34
  Random = ImportedRandom
@@ -75,3 +76,4 @@ class Numba( # pylint: disable=too-many-ancestors,duplicate-code
75
76
  methods.DisplacementMethods.__init__(self)
76
77
  methods.TerminalVelocityMethods.__init__(self)
77
78
  methods.IsotopeMethods.__init__(self)
79
+ methods.SeedingMethods.__init__(self)
PySDM/builder.py CHANGED
@@ -150,4 +150,8 @@ class Builder:
150
150
  for key in self.particulator.dynamics:
151
151
  self.particulator.timers[key] = WallTimer()
152
152
 
153
+ if (attributes["multiplicity"] == 0).any():
154
+ self.particulator.attributes.healthy = False
155
+ self.particulator.attributes.sanitize()
156
+
153
157
  return self.particulator
@@ -15,3 +15,4 @@ from PySDM.dynamics.displacement import Displacement
15
15
  from PySDM.dynamics.eulerian_advection import EulerianAdvection
16
16
  from PySDM.dynamics.freezing import Freezing
17
17
  from PySDM.dynamics.relaxed_velocity import RelaxedVelocity
18
+ from PySDM.dynamics.seeding import Seeding
@@ -0,0 +1,94 @@
1
+ """ particle injection handling, requires initalising a simulation with
2
+ enough particles flagged with NaN multiplicity (translated to zeros
3
+ at multiplicity discretisation """
4
+
5
+ from collections.abc import Sized
6
+
7
+ import numpy as np
8
+
9
+ from PySDM.dynamics.impl import register_dynamic
10
+ from PySDM.initialisation import discretise_multiplicities
11
+
12
+
13
+ @register_dynamic()
14
+ class Seeding:
15
+ def __init__(
16
+ self,
17
+ *,
18
+ super_droplet_injection_rate: callable,
19
+ seeded_particle_extensive_attributes: dict,
20
+ seeded_particle_multiplicity: Sized,
21
+ ):
22
+ for attr in seeded_particle_extensive_attributes.values():
23
+ assert len(seeded_particle_multiplicity) == len(attr)
24
+ self.particulator = None
25
+ self.super_droplet_injection_rate = super_droplet_injection_rate
26
+ self.seeded_particle_extensive_attributes = seeded_particle_extensive_attributes
27
+ self.seeded_particle_multiplicity = seeded_particle_multiplicity
28
+ self.rnd = None
29
+ self.u01 = None
30
+ self.index = None
31
+
32
+ def register(self, builder):
33
+ self.particulator = builder.particulator
34
+
35
+ def post_register_setup_when_attributes_are_known(self):
36
+ if tuple(self.particulator.attributes.get_extensive_attribute_keys()) != tuple(
37
+ self.seeded_particle_extensive_attributes.keys()
38
+ ):
39
+ raise ValueError(
40
+ f"extensive attributes ({self.seeded_particle_extensive_attributes.keys()})"
41
+ " do not match those used in particulator"
42
+ f" ({self.particulator.attributes.get_extensive_attribute_keys()})"
43
+ )
44
+
45
+ self.index = self.particulator.Index.identity_index(
46
+ len(self.seeded_particle_multiplicity)
47
+ )
48
+ if len(self.seeded_particle_multiplicity) > 1:
49
+ self.rnd = self.particulator.Random(
50
+ len(self.seeded_particle_multiplicity), self.particulator.formulae.seed
51
+ )
52
+ self.u01 = self.particulator.Storage.empty(
53
+ len(self.seeded_particle_multiplicity), dtype=float
54
+ )
55
+ self.seeded_particle_multiplicity = (
56
+ self.particulator.IndexedStorage.from_ndarray(
57
+ self.index,
58
+ discretise_multiplicities(
59
+ np.asarray(self.seeded_particle_multiplicity)
60
+ ),
61
+ )
62
+ )
63
+ self.seeded_particle_extensive_attributes = (
64
+ self.particulator.IndexedStorage.from_ndarray(
65
+ self.index,
66
+ np.asarray(list(self.seeded_particle_extensive_attributes.values())),
67
+ )
68
+ )
69
+
70
+ def __call__(self):
71
+ if self.particulator.n_steps == 0:
72
+ self.post_register_setup_when_attributes_are_known()
73
+
74
+ time = self.particulator.n_steps * self.particulator.dt
75
+ number_of_super_particles_to_inject = self.super_droplet_injection_rate(time)
76
+
77
+ if number_of_super_particles_to_inject > 0:
78
+ assert number_of_super_particles_to_inject <= len(
79
+ self.seeded_particle_multiplicity
80
+ )
81
+
82
+ if self.rnd is not None:
83
+ self.u01.urand(self.rnd)
84
+ # TODO #1387 make shuffle smarter
85
+ # e.g. don't need to shuffle if only one type of seed particle
86
+ # or if the number of super particles to inject
87
+ # is equal to the number of possible seeds
88
+ self.index.shuffle(self.u01)
89
+ self.particulator.seeding(
90
+ seeded_particle_index=self.index,
91
+ number_of_super_particles_to_inject=number_of_super_particles_to_inject,
92
+ seeded_particle_multiplicity=self.seeded_particle_multiplicity,
93
+ seeded_particle_extensive_attributes=self.seeded_particle_extensive_attributes,
94
+ )
@@ -118,3 +118,8 @@ class ParticleAttributes: # pylint: disable=too-many-instance-attributes
118
118
 
119
119
  def has_attribute(self, attr):
120
120
  return attr in self.__attributes
121
+
122
+ def reset_idx(self):
123
+ self.__valid_n_sd = self.__idx.shape[0]
124
+ self.__idx.reset_index()
125
+ self.healthy = False
@@ -6,11 +6,22 @@ import numpy as np
6
6
 
7
7
 
8
8
  def discretise_multiplicities(values_arg):
9
- values_int = values_arg.round().astype(np.int64)
9
+ """any NaN values in the input array are ignored and flagged
10
+ with zero multiplicities in the output array"""
11
+
12
+ values_int = np.where(np.isnan(values_arg), 0, values_arg).round().astype(np.int64)
10
13
 
11
14
  if np.issubdtype(values_arg.dtype, np.floating):
15
+ if np.isnan(values_arg).all():
16
+ return values_int
17
+
18
+ if not np.logical_or(values_int > 0, np.isnan(values_arg)).all():
19
+ raise ValueError(
20
+ f"int-casting resulted in multiplicity of zero (min(y_float)={min(values_arg)})"
21
+ )
22
+
12
23
  percent_diff = 100 * abs(
13
- 1 - np.sum(values_arg) / np.sum(values_int.astype(float))
24
+ 1 - np.nansum(values_arg) / np.sum(values_int.astype(float))
14
25
  )
15
26
  if percent_diff > 1:
16
27
  raise ValueError(
@@ -18,9 +29,4 @@ def discretise_multiplicities(values_arg):
18
29
  f" due to casting multiplicities to ints"
19
30
  )
20
31
 
21
- if not (values_int > 0).all():
22
- raise ValueError(
23
- f"int-casting resulted in multiplicity of zero (min(y_float)={min(values_arg)})"
24
- )
25
-
26
32
  return values_int
@@ -5,7 +5,6 @@ of droplets
5
5
 
6
6
  import numpy as np
7
7
 
8
- from PySDM.backends import CPU
9
8
  from PySDM.dynamics.terminal_velocity import GunnKinzer1949
10
9
  from PySDM.formulae import Formulae
11
10
  from PySDM.particulator import Particulator
@@ -31,6 +30,8 @@ def init_fall_momenta(
31
30
  if zero:
32
31
  return np.zeros_like(water_mass)
33
32
 
33
+ from PySDM.backends import CPU # pylint: disable=import-outside-toplevel
34
+
34
35
  particulator = Particulator(0, CPU(Formulae())) # TODO #1155
35
36
 
36
37
  approximation = terminal_velocity_approx(particulator=particulator)
PySDM/particulator.py CHANGED
@@ -13,7 +13,7 @@ from PySDM.impl.particle_attributes import ParticleAttributes
13
13
 
14
14
 
15
15
  class Particulator: # pylint: disable=too-many-public-methods,too-many-instance-attributes
16
- def __init__(self, n_sd, backend: BackendMethods):
16
+ def __init__(self, n_sd, backend):
17
17
  assert isinstance(backend, BackendMethods)
18
18
  self.__n_sd = n_sd
19
19
 
@@ -438,3 +438,44 @@ class Particulator: # pylint: disable=too-many-public-methods,too-many-instance
438
438
  self.backend.isotopic_fractionation()
439
439
  for isotope in heavy_isotopes:
440
440
  self.attributes.mark_updated(f"moles_{isotope}")
441
+
442
+ def seeding(
443
+ self,
444
+ *,
445
+ seeded_particle_index,
446
+ seeded_particle_multiplicity,
447
+ seeded_particle_extensive_attributes,
448
+ number_of_super_particles_to_inject,
449
+ ):
450
+ n_null = self.n_sd - self.attributes.super_droplet_count
451
+ if n_null == 0:
452
+ raise ValueError(
453
+ "No available seeds to inject. Please provide particles with nan filled attributes."
454
+ )
455
+
456
+ if number_of_super_particles_to_inject > n_null:
457
+ raise ValueError(
458
+ "Trying to inject more super particles than space available."
459
+ )
460
+
461
+ if number_of_super_particles_to_inject > len(seeded_particle_multiplicity):
462
+ raise ValueError(
463
+ "Trying to inject multiple super particles with the same attributes. \
464
+ Instead increase multiplicity of injected particles."
465
+ )
466
+
467
+ self.backend.seeding(
468
+ idx=self.attributes._ParticleAttributes__idx,
469
+ multiplicity=self.attributes["multiplicity"],
470
+ extensive_attributes=self.attributes.get_extensive_attribute_storage(),
471
+ seeded_particle_index=seeded_particle_index,
472
+ seeded_particle_multiplicity=seeded_particle_multiplicity,
473
+ seeded_particle_extensive_attributes=seeded_particle_extensive_attributes,
474
+ number_of_super_particles_to_inject=number_of_super_particles_to_inject,
475
+ )
476
+ self.attributes.reset_idx()
477
+ self.attributes.sanitize()
478
+
479
+ self.attributes.mark_updated("multiplicity")
480
+ for key in self.attributes.get_extensive_attribute_keys():
481
+ self.attributes.mark_updated(key)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PySDM
3
- Version: 2.73
3
+ Version: 2.76
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
@@ -25,7 +25,7 @@ Description-Content-Type: text/markdown
25
25
  Requires-Dist: ThrustRTC==0.3.20
26
26
  Requires-Dist: CURandRTC>=0.1.2
27
27
  Requires-Dist: numba>=0.51.2
28
- Requires-Dist: numpy<2.0.0
28
+ Requires-Dist: numpy
29
29
  Requires-Dist: Pint
30
30
  Requires-Dist: chempy
31
31
  Requires-Dist: scipy
@@ -39,6 +39,8 @@ 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"
41
41
 
42
+ # <img src="https://raw.githubusercontent.com/open-atmos/PySDM/main/.github/pysdm_logo.png" width=100 height=146 alt="pysdm logo">
43
+
42
44
  # PySDM
43
45
 
44
46
  [![Python 3](https://img.shields.io/static/v1?label=Python&logo=Python&color=3776AB&message=3)](https://www.python.org/)
@@ -1,7 +1,7 @@
1
1
  PySDM/__init__.py,sha256=nrBhoz8kmvowBpYj_ijAM85wIqlcCxZg5Y-I1LLpeNo,1738
2
- PySDM/builder.py,sha256=NpUwIZLXhepjB2BO7NRt6L42vmURXclLnw82iSv671g,5772
2
+ PySDM/builder.py,sha256=6hgxvCFmDe9sJJDT9CgNf9c9ByLvOSvC9cXcc164Yac,5934
3
3
  PySDM/formulae.py,sha256=KZmUm6JpVPt5Y8lc7BYc_EWY8ZSMDktFjVHnFENp6YM,13761
4
- PySDM/particulator.py,sha256=yIRFNMTBDKelLlhD-uejqUL_-QUYu2Y9ShjE5wPzzZw,16447
4
+ PySDM/particulator.py,sha256=pPI2yWD9RsKkiQPKODRtiaBo_cgsMMJH6HwmSJEbj94,18120
5
5
  PySDM/attributes/__init__.py,sha256=cJVc2aGo7ZID8fTo_AcxSi0XhnxML-r9yc4L4RYJaE4,171
6
6
  PySDM/attributes/chemistry/__init__.py,sha256=sv9kFUXgcZjbjmrQKK8sgdgqM05MPxAw73Euj0O3n40,223
7
7
  PySDM/attributes/chemistry/acidity.py,sha256=XGRhQEi7XH9WtBmwzsaMphzuq3ZYGhqClo4PY1d79bA,1642
@@ -47,7 +47,7 @@ PySDM/attributes/physics/terminal_velocity.py,sha256=zu0U0g-qGcx5HJqhTFJHuLyp7lm
47
47
  PySDM/attributes/physics/volume.py,sha256=25eG5HEXeRMJV4iKywtZ0JTU5PiF2Ibp3X-WHC6BB6c,587
48
48
  PySDM/attributes/physics/water_mass.py,sha256=fzmCjIWLWgghWy_Pa4KZoCd2XgdUv3tb-qB9FFmCUF8,392
49
49
  PySDM/backends/__init__.py,sha256=6dPU5Y30rDovvkaTehryG9gA-tJk5sEOrmlxpQAP4Ek,2235
50
- PySDM/backends/numba.py,sha256=bBtZPmlfoyV1vT2_yfgW_h39IJMC_tOqKlr5nFMKBkw,2708
50
+ PySDM/backends/numba.py,sha256=WaaMBnEpJF0DqjapZfuQu2-DNmJOcfqfss4km1jgRRA,2782
51
51
  PySDM/backends/thrust_rtc.py,sha256=5T2joHmLA5y-HPbLfw4m3wf9-BFuk-1YsmWJj62LPNU,2643
52
52
  PySDM/backends/impl_common/__init__.py,sha256=hP2LHBlnzcaOh8MMNdm2fbChkfRakwbKn0PaKhLdyP8,37
53
53
  PySDM/backends/impl_common/backend_methods.py,sha256=2TaqFIccgQfsNB0X_H4kTgUdgSUu3_H6lDyLUhN4Z2E,560
@@ -66,10 +66,10 @@ PySDM/backends/impl_numba/storage.py,sha256=2ht3sL2FRQcFs-U7373Y2EJ1rHujMZ00rbRp
66
66
  PySDM/backends/impl_numba/storage_impl.py,sha256=s1zd6NlpQIQgIlTLvk_GucYUseBouWEGDgvdVHm3LfQ,1957
67
67
  PySDM/backends/impl_numba/toms748.py,sha256=pcI0Fhocma_9jbfkW3oDemWikDhG1pOWF3iamn2R2eU,6393
68
68
  PySDM/backends/impl_numba/warnings.py,sha256=MiYn_5sqWYV__dkVVQu88X_XcYW1N5vqDZtyE5c8FmA,649
69
- PySDM/backends/impl_numba/methods/__init__.py,sha256=T9Ex5Ra_G5_Xr-YTlt3pGPrlTBU8ocxHfQr4GVCv8Vg,624
69
+ PySDM/backends/impl_numba/methods/__init__.py,sha256=esVAXeSXLDLqrue--vFac0zMcUsL6bUc1q6Q8SnyeQo,668
70
70
  PySDM/backends/impl_numba/methods/chemistry_methods.py,sha256=qAz3VTZAPQeTuti11w6Wv1ZZUXSHa4jxkkihukgLx0k,15508
71
71
  PySDM/backends/impl_numba/methods/collisions_methods.py,sha256=PkCnV3apuC16mSxel733kkWsgXRTlQf_WvbkLzRwmzY,25941
72
- PySDM/backends/impl_numba/methods/condensation_methods.py,sha256=Uu1jhRVtqWXzIibV5K6ud6bSH7sra2ylBUPIjb59ZXk,24985
72
+ PySDM/backends/impl_numba/methods/condensation_methods.py,sha256=Gu4c6MN17WKtSSesgvhO2SGP6xLPQItJ1qjpPUxtSXI,24986
73
73
  PySDM/backends/impl_numba/methods/displacement_methods.py,sha256=pgsf98FQNf-sdHx4aiSLwn8m8JKk3eG0J_DlsDC8hLo,7673
74
74
  PySDM/backends/impl_numba/methods/fragmentation_methods.py,sha256=LzaBL7DxwGoprOMz7t-vRrpnKLl-lq_mpTbAyoV_VxA,17127
75
75
  PySDM/backends/impl_numba/methods/freezing_methods.py,sha256=-ZKoKzIsMMuk6eL3QqNaZ9kd8QnBr3AEgcGCCoDUrQM,5019
@@ -78,6 +78,7 @@ PySDM/backends/impl_numba/methods/isotope_methods.py,sha256=aFdezr4MqneCxYJVXDT9
78
78
  PySDM/backends/impl_numba/methods/moments_methods.py,sha256=7UzggKu186vqouByHNcgE03QkV0OwJn4f8RpWtVfFKM,5512
79
79
  PySDM/backends/impl_numba/methods/pair_methods.py,sha256=NeRji-X1NBUFDLGsGyGYFUWkFTKX9JIZp_Bny30AVJ0,6259
80
80
  PySDM/backends/impl_numba/methods/physics_methods.py,sha256=aM3LaLsx06nH8_l9CDYoqMOiCRKt4D6MAl322kCYgRM,7053
81
+ PySDM/backends/impl_numba/methods/seeding_methods.py,sha256=vZDmQ7XEVX8CivdMT3tmmHpOs9zSACYxL1mip-B_iSw,2571
81
82
  PySDM/backends/impl_numba/methods/terminal_velocity_methods.py,sha256=KO-RfmseucWEXG-i2CGNPpqyFYXzmOExNQdw4JxrGJo,2117
82
83
  PySDM/backends/impl_numba/test_helpers/__init__.py,sha256=8_cw4HYZE6jatsdpVWJHbbS2HwXWisbMpjFsos6JBqk,94
83
84
  PySDM/backends/impl_numba/test_helpers/scipy_ode_condensation_solver.py,sha256=MRnpnhEgaZjBdCMTEVHmOJ_Z2V2bLoLnXmjNDPYKdYM,10250
@@ -103,7 +104,7 @@ PySDM/backends/impl_thrust_rtc/test_helpers/__init__.py,sha256=c-QZ2cI70jcZ8Yvb1
103
104
  PySDM/backends/impl_thrust_rtc/test_helpers/cpp2python.py,sha256=akXMMjRPTXLhvTPmifFkPcbIdBjsAzSMby7QWDiur_s,6078
104
105
  PySDM/backends/impl_thrust_rtc/test_helpers/fake_thrust_rtc.py,sha256=LMzL3KtLtVJRfjV4PxbJz7syo46EFNPkJ2HGZm3p6AQ,7962
105
106
  PySDM/backends/impl_thrust_rtc/test_helpers/flag.py,sha256=jVDnnq0rN_2jXlgbXx6nDY6m9jncV2CwjdL3-tKZ9iY,170
106
- PySDM/dynamics/__init__.py,sha256=wl-gnX3q9pGHjD5javTNVSigxzOdeVqcZytECqMnEFw,721
107
+ PySDM/dynamics/__init__.py,sha256=COm5PdJoSCxgwWiwMFFaXBlxLf0wYEUfw9jQOGSHcrM,764
107
108
  PySDM/dynamics/ambient_thermodynamics.py,sha256=GWRzhyVZLNZjneHJ7aFk7LK1UBaUs48XfxzqkfX8jj8,353
108
109
  PySDM/dynamics/aqueous_chemistry.py,sha256=zk4wwf-TPkHn5BVitR4UcpcU3aH6sUuEpGOviRcL9DI,4823
109
110
  PySDM/dynamics/condensation.py,sha256=n1Mm0yqBE-cZHigth-PLgekLIOYQyxXvX81a_NnpqR0,4361
@@ -112,6 +113,7 @@ PySDM/dynamics/eulerian_advection.py,sha256=NOPO6h0V9ApjeGNxxE0_86AzBUY27DL8Sinr
112
113
  PySDM/dynamics/freezing.py,sha256=iXiHZJOmK3RarTI7Vm5VF7fO4OosR9hd_Dz-9-R8dzA,3710
113
114
  PySDM/dynamics/isotopic_fractionation.py,sha256=xJoEJzuA-93Jyww_BQxduZqDNRrsUD95bLzvhgI6Q1k,1270
114
115
  PySDM/dynamics/relaxed_velocity.py,sha256=SCLVcqJIsFvzQ5LDZ7YxTSFAuojQf-sbiU-_tY_wteo,3131
116
+ PySDM/dynamics/seeding.py,sha256=OBofNtF9M5-j7BoAAAAayvAlATx2CIZu56StVIOO76s,3842
115
117
  PySDM/dynamics/collisions/__init__.py,sha256=gutS6RlEXSp9S7z6zgUKq-K4hXLrHXTJFQkYCi2KibY,554
116
118
  PySDM/dynamics/collisions/collision.py,sha256=Wl-hSj3BamAZLY7fg2bQ7_hMAoucMuvEmZqvR3oAWno,13359
117
119
  PySDM/dynamics/collisions/breakup_efficiencies/__init__.py,sha256=PWWgvr3wLjlOKjiK_S9-Bd9bcGFIIwMlbwJtMriDc1Q,59
@@ -174,13 +176,13 @@ PySDM/impl/arakawa_c.py,sha256=ACzN8k4lVapTP5ra2r3foUO-olBJf5ZcFTpH5I4SCEE,331
174
176
  PySDM/impl/camel_case.py,sha256=2ivX9gjsLDPwYvGWL0omPqSBp9LXyg-rPLC_pJ62pTU,367
175
177
  PySDM/impl/mesh.py,sha256=h64y8vKLR2sqKcs7BMSrtlz2S6JIq15KJMW4KQfKynI,2528
176
178
  PySDM/impl/null_physics_class.py,sha256=-AEqs_yrPyDkgOlkXtG4nMtIeyp6tShiyVNvQqQexkI,128
177
- PySDM/impl/particle_attributes.py,sha256=g0LbhZ3cM8kLWOG07acFGTAmZ2qNuzYBV2nWBFWBENo,3566
179
+ PySDM/impl/particle_attributes.py,sha256=97VK7EMyupc_FouzZGcD7TTS9bakWc4vIbjfewuMGlo,3702
178
180
  PySDM/impl/particle_attributes_factory.py,sha256=ZKkkbkFIoEcw7Yj7axlmrsqhy-_Hb9TusMnu1XtuH3w,4687
179
181
  PySDM/impl/wall_timer.py,sha256=cDApBqoTS_kUfnBzzQtP-XTJxBMBmyqv4m9mODaA2CE,465
180
182
  PySDM/initialisation/__init__.py,sha256=Li4IboyzZBIwoLbNKceZq9nDUgJpShQr8QyibDZM_5Q,351
181
- PySDM/initialisation/discretise_multiplicities.py,sha256=D_8EsoXwSLsgIGUyOuLDDVuaQpZAQbtEDtJfcXK90Bw,779
183
+ PySDM/initialisation/discretise_multiplicities.py,sha256=rRUJUGQYCUeLbVoUonrCvK3_w8HcJz8bIP8FfBzUBlI,1040
182
184
  PySDM/initialisation/equilibrate_wet_radii.py,sha256=mQSMWChcF3YnfH9AIYAzYgjZXmXxZ3NaS0yNVCk5nuY,3774
183
- PySDM/initialisation/init_fall_momenta.py,sha256=LFMTVm5DaO8B2_txi4yj9jvHGpgNX3JxYXzdaCai_VE,1427
185
+ PySDM/initialisation/init_fall_momenta.py,sha256=RlZSFtMgIRXAiimOfzY3Iu9GlUTxaIn0wClRuBIcrbA,1475
184
186
  PySDM/initialisation/aerosol_composition/__init__.py,sha256=IsaPAyhxPXHaXY2nu9cyYdtjWnwxAGKZejvpRsv3Dyc,206
185
187
  PySDM/initialisation/aerosol_composition/dry_aerosol.py,sha256=FxFqPyR7Fhg1mi5lYfim4Z4PsnWrwIKGsVRiWa2HW6s,4372
186
188
  PySDM/initialisation/impl/__init__.py,sha256=vejuF9ebIGXb7l9zEiBBbNjs1Qct1KZuZRPLh8w3SJE,125
@@ -381,8 +383,8 @@ PySDM/products/size_spectral/size_standard_deviation.py,sha256=A7fSj_keQi_bHW41P
381
383
  PySDM/products/size_spectral/total_particle_concentration.py,sha256=K7sO2jgUpYOwWvBK3jXp9KUxLRXk_Ve6ooOdY5q5jd0,470
382
384
  PySDM/products/size_spectral/total_particle_specific_concentration.py,sha256=isLZt5j2vJGr-FrzYFcUNPHZqMKhOtl51za1Hogh6hQ,476
383
385
  PySDM/products/size_spectral/water_mixing_ratio.py,sha256=PP54hfMy4SPDQDJgV4RNzVP03lmL1THZPa2KXrdgoQ4,1324
384
- PySDM-2.73.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
385
- PySDM-2.73.dist-info/METADATA,sha256=wEzcfKjLwxOYHbjaYkvoAaLf4q83agwXc-VM18naydw,45910
386
- PySDM-2.73.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
387
- PySDM-2.73.dist-info/top_level.txt,sha256=6NYaDAhUnaYMD7ebD_dQ7HlhiJS7NMuKEXb0ck7Wcsg,6
388
- PySDM-2.73.dist-info/RECORD,,
386
+ PySDM-2.76.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
387
+ PySDM-2.76.dist-info/METADATA,sha256=t9WrHc4GBaUdP8_MmzJ8rDQZAGgAOfACj5UdCy4lmaQ,46036
388
+ PySDM-2.76.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
389
+ PySDM-2.76.dist-info/top_level.txt,sha256=6NYaDAhUnaYMD7ebD_dQ7HlhiJS7NMuKEXb0ck7Wcsg,6
390
+ PySDM-2.76.dist-info/RECORD,,
File without changes
File without changes