PySDM_examples.Yang_et_al_2018.simulation

  1import numpy as np
  2
  3import PySDM.products as PySDM_products
  4from PySDM import Builder, Formulae
  5from PySDM.backends import CPU
  6from PySDM.dynamics import AmbientThermodynamics, Condensation
  7from PySDM.environments import Parcel
  8from PySDM.physics import si
  9
 10
 11class Simulation:
 12    def __init__(self, settings, backend=CPU):
 13        dt_output = (
 14            settings.total_time / settings.n_steps
 15        )  # TODO #334 overwritten in notebook
 16        self.n_substeps = 1  # TODO #334 use condensation substeps
 17        while dt_output / self.n_substeps >= settings.dt_max:
 18            self.n_substeps += 1
 19        self.formulae = Formulae(
 20            diffusion_coordinate=settings.coord,
 21            saturation_vapour_pressure="AugustRocheMagnus",
 22        )
 23        self.bins_edges = self.formulae.trivia.volume(settings.r_bins_edges)
 24
 25        env = Parcel(
 26            dt=dt_output / self.n_substeps,
 27            mass_of_dry_air=settings.mass_of_dry_air,
 28            p0=settings.p0,
 29            initial_relative_humidity=settings.RH0,
 30            T0=settings.T0,
 31            w=settings.w,
 32            z0=settings.z0,
 33        )
 34
 35        condensation = Condensation(
 36            adaptive=settings.adaptive,
 37            rtol_x=settings.rtol_x,
 38            rtol_thd=settings.rtol_thd,
 39            dt_cond_range=settings.dt_cond_range,
 40        )
 41
 42        builder = Builder(
 43            backend=backend(
 44                formulae=self.formulae, override_jit_flags={"parallel": False}
 45            ),
 46            n_sd=settings.n_sd,
 47            environment=env,
 48            dynamics=(
 49                AmbientThermodynamics(),
 50                condensation,
 51            ),
 52        )
 53
 54        environment = builder.particulator.environment
 55
 56        products = [
 57            PySDM_products.ParticleSizeSpectrumPerVolume(
 58                name="Particles Wet Size Spectrum",
 59                radius_bins_edges=settings.r_bins_edges,
 60            ),
 61            PySDM_products.CondensationTimestepMin(name="dt_cond_min"),
 62            PySDM_products.CondensationTimestepMax(name="dt_cond_max"),
 63            PySDM_products.RipeningRate(),
 64            PySDM_products.MeanRadius(
 65                name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf)
 66            ),
 67            PySDM_products.ActivatedMeanRadius(
 68                name="r_act", count_activated=True, count_unactivated=False
 69            ),
 70            PySDM_products.Time(name="t"),
 71        ]
 72
 73        attributes = environment.init_attributes(
 74            n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry
 75        )
 76
 77        self.particulator = builder.build(attributes, products)
 78
 79        self.n_steps = settings.n_steps
 80
 81    def save(self, output):
 82        _sp = self.particulator
 83        cell_id = 0
 84        output["r_bins_values"].append(
 85            (_sp.products["Particles Wet Size Spectrum"].get()).T
 86        )
 87        volume = _sp.attributes["volume"].to_ndarray()
 88        output["r"].append((self.formulae.trivia.radius(volume=volume)).T)
 89        output["S"].append(_sp.environment["RH"][cell_id] - 1)
 90        output["t"].append(_sp.products["t"].get())
 91        for key in ("water_vapour_mixing_ratio", "T", "z"):
 92            output[key].append(_sp.environment[key][cell_id])
 93        for key in (
 94            "dt_cond_max",
 95            "dt_cond_min",
 96            "ripening rate",
 97            "r_mean_gt_1_um",
 98            "r_act",
 99        ):
100            output[key].append(_sp.products[key].get()[cell_id].copy())
101
102    def run(self):
103        output = {
104            key: []
105            for key in (
106                "r",
107                "S",
108                "z",
109                "t",
110                "water_vapour_mixing_ratio",
111                "T",
112                "r_bins_values",
113                "dt_cond_max",
114                "dt_cond_min",
115                "ripening rate",
116                "r_mean_gt_1_um",
117                "r_act",
118            )
119        }
120
121        self.save(output)
122        for _ in range(self.n_steps):
123            self.particulator.run(self.n_substeps)
124            self.save(output)
125        for k, v in output.items():
126            output[k] = np.asarray(v)
127        return output
class Simulation:
 12class Simulation:
 13    def __init__(self, settings, backend=CPU):
 14        dt_output = (
 15            settings.total_time / settings.n_steps
 16        )  # TODO #334 overwritten in notebook
 17        self.n_substeps = 1  # TODO #334 use condensation substeps
 18        while dt_output / self.n_substeps >= settings.dt_max:
 19            self.n_substeps += 1
 20        self.formulae = Formulae(
 21            diffusion_coordinate=settings.coord,
 22            saturation_vapour_pressure="AugustRocheMagnus",
 23        )
 24        self.bins_edges = self.formulae.trivia.volume(settings.r_bins_edges)
 25
 26        env = Parcel(
 27            dt=dt_output / self.n_substeps,
 28            mass_of_dry_air=settings.mass_of_dry_air,
 29            p0=settings.p0,
 30            initial_relative_humidity=settings.RH0,
 31            T0=settings.T0,
 32            w=settings.w,
 33            z0=settings.z0,
 34        )
 35
 36        condensation = Condensation(
 37            adaptive=settings.adaptive,
 38            rtol_x=settings.rtol_x,
 39            rtol_thd=settings.rtol_thd,
 40            dt_cond_range=settings.dt_cond_range,
 41        )
 42
 43        builder = Builder(
 44            backend=backend(
 45                formulae=self.formulae, override_jit_flags={"parallel": False}
 46            ),
 47            n_sd=settings.n_sd,
 48            environment=env,
 49            dynamics=(
 50                AmbientThermodynamics(),
 51                condensation,
 52            ),
 53        )
 54
 55        environment = builder.particulator.environment
 56
 57        products = [
 58            PySDM_products.ParticleSizeSpectrumPerVolume(
 59                name="Particles Wet Size Spectrum",
 60                radius_bins_edges=settings.r_bins_edges,
 61            ),
 62            PySDM_products.CondensationTimestepMin(name="dt_cond_min"),
 63            PySDM_products.CondensationTimestepMax(name="dt_cond_max"),
 64            PySDM_products.RipeningRate(),
 65            PySDM_products.MeanRadius(
 66                name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf)
 67            ),
 68            PySDM_products.ActivatedMeanRadius(
 69                name="r_act", count_activated=True, count_unactivated=False
 70            ),
 71            PySDM_products.Time(name="t"),
 72        ]
 73
 74        attributes = environment.init_attributes(
 75            n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry
 76        )
 77
 78        self.particulator = builder.build(attributes, products)
 79
 80        self.n_steps = settings.n_steps
 81
 82    def save(self, output):
 83        _sp = self.particulator
 84        cell_id = 0
 85        output["r_bins_values"].append(
 86            (_sp.products["Particles Wet Size Spectrum"].get()).T
 87        )
 88        volume = _sp.attributes["volume"].to_ndarray()
 89        output["r"].append((self.formulae.trivia.radius(volume=volume)).T)
 90        output["S"].append(_sp.environment["RH"][cell_id] - 1)
 91        output["t"].append(_sp.products["t"].get())
 92        for key in ("water_vapour_mixing_ratio", "T", "z"):
 93            output[key].append(_sp.environment[key][cell_id])
 94        for key in (
 95            "dt_cond_max",
 96            "dt_cond_min",
 97            "ripening rate",
 98            "r_mean_gt_1_um",
 99            "r_act",
100        ):
101            output[key].append(_sp.products[key].get()[cell_id].copy())
102
103    def run(self):
104        output = {
105            key: []
106            for key in (
107                "r",
108                "S",
109                "z",
110                "t",
111                "water_vapour_mixing_ratio",
112                "T",
113                "r_bins_values",
114                "dt_cond_max",
115                "dt_cond_min",
116                "ripening rate",
117                "r_mean_gt_1_um",
118                "r_act",
119            )
120        }
121
122        self.save(output)
123        for _ in range(self.n_steps):
124            self.particulator.run(self.n_substeps)
125            self.save(output)
126        for k, v in output.items():
127            output[k] = np.asarray(v)
128        return output
Simulation( settings, backend=functools.partial(<function _cached_backend>, backend_class=<class 'PySDM.backends.Numba'>))
13    def __init__(self, settings, backend=CPU):
14        dt_output = (
15            settings.total_time / settings.n_steps
16        )  # TODO #334 overwritten in notebook
17        self.n_substeps = 1  # TODO #334 use condensation substeps
18        while dt_output / self.n_substeps >= settings.dt_max:
19            self.n_substeps += 1
20        self.formulae = Formulae(
21            diffusion_coordinate=settings.coord,
22            saturation_vapour_pressure="AugustRocheMagnus",
23        )
24        self.bins_edges = self.formulae.trivia.volume(settings.r_bins_edges)
25
26        env = Parcel(
27            dt=dt_output / self.n_substeps,
28            mass_of_dry_air=settings.mass_of_dry_air,
29            p0=settings.p0,
30            initial_relative_humidity=settings.RH0,
31            T0=settings.T0,
32            w=settings.w,
33            z0=settings.z0,
34        )
35
36        condensation = Condensation(
37            adaptive=settings.adaptive,
38            rtol_x=settings.rtol_x,
39            rtol_thd=settings.rtol_thd,
40            dt_cond_range=settings.dt_cond_range,
41        )
42
43        builder = Builder(
44            backend=backend(
45                formulae=self.formulae, override_jit_flags={"parallel": False}
46            ),
47            n_sd=settings.n_sd,
48            environment=env,
49            dynamics=(
50                AmbientThermodynamics(),
51                condensation,
52            ),
53        )
54
55        environment = builder.particulator.environment
56
57        products = [
58            PySDM_products.ParticleSizeSpectrumPerVolume(
59                name="Particles Wet Size Spectrum",
60                radius_bins_edges=settings.r_bins_edges,
61            ),
62            PySDM_products.CondensationTimestepMin(name="dt_cond_min"),
63            PySDM_products.CondensationTimestepMax(name="dt_cond_max"),
64            PySDM_products.RipeningRate(),
65            PySDM_products.MeanRadius(
66                name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf)
67            ),
68            PySDM_products.ActivatedMeanRadius(
69                name="r_act", count_activated=True, count_unactivated=False
70            ),
71            PySDM_products.Time(name="t"),
72        ]
73
74        attributes = environment.init_attributes(
75            n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry
76        )
77
78        self.particulator = builder.build(attributes, products)
79
80        self.n_steps = settings.n_steps
n_substeps
formulae
bins_edges
particulator
n_steps
def save(self, output):
 82    def save(self, output):
 83        _sp = self.particulator
 84        cell_id = 0
 85        output["r_bins_values"].append(
 86            (_sp.products["Particles Wet Size Spectrum"].get()).T
 87        )
 88        volume = _sp.attributes["volume"].to_ndarray()
 89        output["r"].append((self.formulae.trivia.radius(volume=volume)).T)
 90        output["S"].append(_sp.environment["RH"][cell_id] - 1)
 91        output["t"].append(_sp.products["t"].get())
 92        for key in ("water_vapour_mixing_ratio", "T", "z"):
 93            output[key].append(_sp.environment[key][cell_id])
 94        for key in (
 95            "dt_cond_max",
 96            "dt_cond_min",
 97            "ripening rate",
 98            "r_mean_gt_1_um",
 99            "r_act",
100        ):
101            output[key].append(_sp.products[key].get()[cell_id].copy())
def run(self):
103    def run(self):
104        output = {
105            key: []
106            for key in (
107                "r",
108                "S",
109                "z",
110                "t",
111                "water_vapour_mixing_ratio",
112                "T",
113                "r_bins_values",
114                "dt_cond_max",
115                "dt_cond_min",
116                "ripening rate",
117                "r_mean_gt_1_um",
118                "r_act",
119            )
120        }
121
122        self.save(output)
123        for _ in range(self.n_steps):
124            self.particulator.run(self.n_substeps)
125            self.save(output)
126        for k, v in output.items():
127            output[k] = np.asarray(v)
128        return output