PySDM_examples.deJong_Azimi.simulation_0D

 1from collections import namedtuple
 2
 3import numpy as np
 4
 5from PySDM.backends import CPU
 6from PySDM.particulator import Particulator
 7from PySDM.dynamics import Coalescence
 8from PySDM.environments import Box
 9from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity
10from PySDM.products.size_spectral import (
11    ParticleVolumeVersusRadiusLogarithmSpectrum,
12    VolumeFirstMoment,
13    VolumeSecondMoment,
14    ZerothMoment,
15)
16
17
18def run_box(settings, backend_class=CPU):
19    environment = Box(
20        dv=settings.dv,
21        dt=settings.dt,
22        backend=backend_class(settings.formulae),
23    )
24
25    environment["rhod"] = settings.rhod
26    attributes = {}
27    attributes["volume"], attributes["multiplicity"] = ConstantMultiplicity(
28        settings.spectrum
29    ).sample_deterministic(settings.n_sd)
30    products = (
31        ParticleVolumeVersusRadiusLogarithmSpectrum(
32            radius_bins_edges=settings.radius_bins_edges, name="dv/dlnr"
33        ),
34        ZerothMoment(name="M0"),
35        VolumeFirstMoment(name="M1"),
36        VolumeSecondMoment(name="M2"),
37    )
38    particulator = Particulator(
39        n_sd=settings.n_sd,
40        environment=environment,
41        dynamics=[
42            Coalescence(
43                collision_kernel=settings.kernel,
44                coalescence_efficiency=settings.coal_eff,
45                adaptive=settings.adaptive,
46            )
47        ],
48        attributes=attributes,
49        products=products,
50    )
51
52    y = np.ndarray((len(settings.steps), len(settings.radius_bins_edges) - 1))
53    mom = np.ndarray((len(settings.steps), 3))
54    for i, step in enumerate(settings.steps):
55        particulator.run(step - particulator.n_steps)
56        y[i] = particulator.products["dv/dlnr"].get()[0]
57        (mom[i, 0],) = particulator.products["M0"].get()
58        (mom[i, 1],) = particulator.products["M1"].get()
59        (mom[i, 2],) = particulator.products["M2"].get()
60
61    return namedtuple("_", ("radius_bins_left_edges", "dv_dlnr", "moments"))(
62        radius_bins_left_edges=settings.radius_bins_edges[:-1], dv_dlnr=y, moments=mom
63    )
def run_box( settings, backend_class=functools.partial(<function _cached_backend>, backend_class=<class 'PySDM.backends.Numba'>)):
19def run_box(settings, backend_class=CPU):
20    environment = Box(
21        dv=settings.dv,
22        dt=settings.dt,
23        backend=backend_class(settings.formulae),
24    )
25
26    environment["rhod"] = settings.rhod
27    attributes = {}
28    attributes["volume"], attributes["multiplicity"] = ConstantMultiplicity(
29        settings.spectrum
30    ).sample_deterministic(settings.n_sd)
31    products = (
32        ParticleVolumeVersusRadiusLogarithmSpectrum(
33            radius_bins_edges=settings.radius_bins_edges, name="dv/dlnr"
34        ),
35        ZerothMoment(name="M0"),
36        VolumeFirstMoment(name="M1"),
37        VolumeSecondMoment(name="M2"),
38    )
39    particulator = Particulator(
40        n_sd=settings.n_sd,
41        environment=environment,
42        dynamics=[
43            Coalescence(
44                collision_kernel=settings.kernel,
45                coalescence_efficiency=settings.coal_eff,
46                adaptive=settings.adaptive,
47            )
48        ],
49        attributes=attributes,
50        products=products,
51    )
52
53    y = np.ndarray((len(settings.steps), len(settings.radius_bins_edges) - 1))
54    mom = np.ndarray((len(settings.steps), 3))
55    for i, step in enumerate(settings.steps):
56        particulator.run(step - particulator.n_steps)
57        y[i] = particulator.products["dv/dlnr"].get()[0]
58        (mom[i, 0],) = particulator.products["M0"].get()
59        (mom[i, 1],) = particulator.products["M1"].get()
60        (mom[i, 2],) = particulator.products["M2"].get()
61
62    return namedtuple("_", ("radius_bins_left_edges", "dv_dlnr", "moments"))(
63        radius_bins_left_edges=settings.radius_bins_edges[:-1], dv_dlnr=y, moments=mom
64    )