PySDM_examples.featured.deJong_Mackay_et_al_2023.simulation1D

 1import numpy as np
 2from PySDM_examples.featured.Shipway_and_Hill_2012.simulation import (
 3    Simulation as SimulationSH,
 4)
 5
 6import PySDM.products as PySDM_products
 7from PySDM.dynamics import Collision
 8from PySDM.dynamics.collisions.collision_kernels import Geometric
 9from PySDM.physics import si
10
11
12class Simulation1D(SimulationSH):
13    def __init__(self, settings):
14        super().__init__(settings)
15        self.output_steps = settings.output_steps
16
17    @staticmethod
18    def add_collision_dynamic(dynamics, settings, products):
19        if settings.breakup:
20            dynamics.append(
21                Collision(
22                    collision_kernel=Geometric(collection_efficiency=1),
23                    coalescence_efficiency=settings.coalescence_efficiency,
24                    breakup_efficiency=settings.breakup_efficiency,
25                    fragmentation_function=settings.fragmentation_function,
26                    adaptive=settings.coalescence_adaptive,
27                    warn_overflows=settings.warn_breakup_overflow,
28                )
29            )
30            products.append(
31                PySDM_products.BreakupRateDeficitPerGridbox(
32                    name="breakup_deficit",
33                )
34            )
35            products.append(
36                PySDM_products.BreakupRatePerGridbox(
37                    name="breakup_rate",
38                )
39            )
40        else:
41            SimulationSH.add_collision_dynamic(dynamics, settings, products)
42
43        radius_bins_edges = np.logspace(
44            np.log10(0.01 * si.um), np.log10(5000 * si.um), num=101, endpoint=True
45        )
46        products.append(
47            PySDM_products.NumberSizeSpectrum(
48                name="N(v)", radius_bins_edges=radius_bins_edges
49            )
50        )
51        products.append(
52            PySDM_products.ParticleVolumeVersusRadiusLogarithmSpectrum(
53                name="dvdlnr", radius_bins_edges=radius_bins_edges
54            )
55        )
56
57    def save(self, step):
58        if step in self.output_steps:
59            super().save(step)
60
61    def run(self):
62        result = super().run()
63        for key, val in result.products.items():
64            if len(val.shape) == 2:
65                result.products[key] = val[:, self.output_steps]
66            elif len(val.shape) == 3:
67                result.products[key] = val[:, :, :]
68        result.products["t"] = result.products["t"][self.output_steps]
69        return result
13class Simulation1D(SimulationSH):
14    def __init__(self, settings):
15        super().__init__(settings)
16        self.output_steps = settings.output_steps
17
18    @staticmethod
19    def add_collision_dynamic(dynamics, settings, products):
20        if settings.breakup:
21            dynamics.append(
22                Collision(
23                    collision_kernel=Geometric(collection_efficiency=1),
24                    coalescence_efficiency=settings.coalescence_efficiency,
25                    breakup_efficiency=settings.breakup_efficiency,
26                    fragmentation_function=settings.fragmentation_function,
27                    adaptive=settings.coalescence_adaptive,
28                    warn_overflows=settings.warn_breakup_overflow,
29                )
30            )
31            products.append(
32                PySDM_products.BreakupRateDeficitPerGridbox(
33                    name="breakup_deficit",
34                )
35            )
36            products.append(
37                PySDM_products.BreakupRatePerGridbox(
38                    name="breakup_rate",
39                )
40            )
41        else:
42            SimulationSH.add_collision_dynamic(dynamics, settings, products)
43
44        radius_bins_edges = np.logspace(
45            np.log10(0.01 * si.um), np.log10(5000 * si.um), num=101, endpoint=True
46        )
47        products.append(
48            PySDM_products.NumberSizeSpectrum(
49                name="N(v)", radius_bins_edges=radius_bins_edges
50            )
51        )
52        products.append(
53            PySDM_products.ParticleVolumeVersusRadiusLogarithmSpectrum(
54                name="dvdlnr", radius_bins_edges=radius_bins_edges
55            )
56        )
57
58    def save(self, step):
59        if step in self.output_steps:
60            super().save(step)
61
62    def run(self):
63        result = super().run()
64        for key, val in result.products.items():
65            if len(val.shape) == 2:
66                result.products[key] = val[:, self.output_steps]
67            elif len(val.shape) == 3:
68                result.products[key] = val[:, :, :]
69        result.products["t"] = result.products["t"][self.output_steps]
70        return result
Simulation1D(settings)
14    def __init__(self, settings):
15        super().__init__(settings)
16        self.output_steps = settings.output_steps
output_steps
@staticmethod
def add_collision_dynamic(dynamics, settings, products):
18    @staticmethod
19    def add_collision_dynamic(dynamics, settings, products):
20        if settings.breakup:
21            dynamics.append(
22                Collision(
23                    collision_kernel=Geometric(collection_efficiency=1),
24                    coalescence_efficiency=settings.coalescence_efficiency,
25                    breakup_efficiency=settings.breakup_efficiency,
26                    fragmentation_function=settings.fragmentation_function,
27                    adaptive=settings.coalescence_adaptive,
28                    warn_overflows=settings.warn_breakup_overflow,
29                )
30            )
31            products.append(
32                PySDM_products.BreakupRateDeficitPerGridbox(
33                    name="breakup_deficit",
34                )
35            )
36            products.append(
37                PySDM_products.BreakupRatePerGridbox(
38                    name="breakup_rate",
39                )
40            )
41        else:
42            SimulationSH.add_collision_dynamic(dynamics, settings, products)
43
44        radius_bins_edges = np.logspace(
45            np.log10(0.01 * si.um), np.log10(5000 * si.um), num=101, endpoint=True
46        )
47        products.append(
48            PySDM_products.NumberSizeSpectrum(
49                name="N(v)", radius_bins_edges=radius_bins_edges
50            )
51        )
52        products.append(
53            PySDM_products.ParticleVolumeVersusRadiusLogarithmSpectrum(
54                name="dvdlnr", radius_bins_edges=radius_bins_edges
55            )
56        )
def save(self, step):
58    def save(self, step):
59        if step in self.output_steps:
60            super().save(step)
def run(self):
62    def run(self):
63        result = super().run()
64        for key, val in result.products.items():
65            if len(val.shape) == 2:
66                result.products[key] = val[:, self.output_steps]
67            elif len(val.shape) == 3:
68                result.products[key] = val[:, :, :]
69        result.products["t"] = result.products["t"][self.output_steps]
70        return result