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.
- PySDM/backends/impl_numba/methods/__init__.py +1 -0
- PySDM/backends/impl_numba/methods/condensation_methods.py +1 -1
- PySDM/backends/impl_numba/methods/seeding_methods.py +68 -0
- PySDM/backends/numba.py +2 -0
- PySDM/builder.py +4 -0
- PySDM/dynamics/__init__.py +1 -0
- PySDM/dynamics/seeding.py +94 -0
- PySDM/impl/particle_attributes.py +5 -0
- PySDM/initialisation/discretise_multiplicities.py +13 -7
- PySDM/initialisation/init_fall_momenta.py +2 -1
- PySDM/particulator.py +42 -1
- {PySDM-2.73.dist-info → PySDM-2.76.dist-info}/METADATA +4 -2
- {PySDM-2.73.dist-info → PySDM-2.76.dist-info}/RECORD +16 -14
- {PySDM-2.73.dist-info → PySDM-2.76.dist-info}/LICENSE +0 -0
- {PySDM-2.73.dist-info → PySDM-2.76.dist-info}/WHEEL +0 -0
- {PySDM-2.73.dist-info → PySDM-2.76.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
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
|
PySDM/dynamics/__init__.py
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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
|
[](https://www.python.org/)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PySDM/__init__.py,sha256=nrBhoz8kmvowBpYj_ijAM85wIqlcCxZg5Y-I1LLpeNo,1738
|
|
2
|
-
PySDM/builder.py,sha256=
|
|
2
|
+
PySDM/builder.py,sha256=6hgxvCFmDe9sJJDT9CgNf9c9ByLvOSvC9cXcc164Yac,5934
|
|
3
3
|
PySDM/formulae.py,sha256=KZmUm6JpVPt5Y8lc7BYc_EWY8ZSMDktFjVHnFENp6YM,13761
|
|
4
|
-
PySDM/particulator.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
385
|
-
PySDM-2.
|
|
386
|
-
PySDM-2.
|
|
387
|
-
PySDM-2.
|
|
388
|
-
PySDM-2.
|
|
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
|
|
File without changes
|