PySDM_examples.Yang_et_al_2018.simulation

  1import numpy as np
  2
  3import PySDM.products as PySDM_products
  4from PySDM import Formulae, Particulator
  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            backend=backend(
 34                formulae=self.formulae, override_jit_flags={"parallel": False}
 35            ),
 36        )
 37
 38        condensation = Condensation(
 39            adaptive=settings.adaptive,
 40            rtol_x=settings.rtol_x,
 41            rtol_thd=settings.rtol_thd,
 42            dt_cond_range=settings.dt_cond_range,
 43        )
 44
 45        products = [
 46            PySDM_products.ParticleSizeSpectrumPerVolume(
 47                name="Particles Wet Size Spectrum",
 48                radius_bins_edges=settings.r_bins_edges,
 49            ),
 50            PySDM_products.CondensationTimestepMin(name="dt_cond_min"),
 51            PySDM_products.CondensationTimestepMax(name="dt_cond_max"),
 52            PySDM_products.RipeningRate(),
 53            PySDM_products.MeanRadius(
 54                name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf)
 55            ),
 56            PySDM_products.ActivatedMeanRadius(
 57                name="r_act", count_activated=True, count_unactivated=False
 58            ),
 59            PySDM_products.Time(name="t"),
 60        ]
 61
 62        attributes = env.init_attributes(
 63            n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry
 64        )
 65
 66        self.particulator = Particulator(
 67            attributes=attributes,
 68            products=products,
 69            n_sd=settings.n_sd,
 70            environment=env,
 71            dynamics=(
 72                AmbientThermodynamics(),
 73                condensation,
 74            ),
 75        )
 76
 77        self.n_steps = settings.n_steps
 78
 79    def save(self, output):
 80        _sp = self.particulator
 81        cell_id = 0
 82        output["r_bins_values"].append(
 83            (_sp.products["Particles Wet Size Spectrum"].get()).T
 84        )
 85        volume = _sp.attributes["volume"].to_ndarray()
 86        output["r"].append((self.formulae.trivia.radius(volume=volume)).T)
 87        output["S"].append(_sp.environment["RH"][cell_id] - 1)
 88        output["t"].append(_sp.products["t"].get())
 89        for key in ("water_vapour_mixing_ratio", "T", "z"):
 90            output[key].append(_sp.environment[key][cell_id])
 91        for key in (
 92            "dt_cond_max",
 93            "dt_cond_min",
 94            "ripening rate",
 95            "r_mean_gt_1_um",
 96            "r_act",
 97        ):
 98            output[key].append(_sp.products[key].get()[cell_id].copy())
 99
100    def run(self):
101        output = {
102            key: []
103            for key in (
104                "r",
105                "S",
106                "z",
107                "t",
108                "water_vapour_mixing_ratio",
109                "T",
110                "r_bins_values",
111                "dt_cond_max",
112                "dt_cond_min",
113                "ripening rate",
114                "r_mean_gt_1_um",
115                "r_act",
116            )
117        }
118
119        self.save(output)
120        for _ in range(self.n_steps):
121            self.particulator.run(self.n_substeps)
122            self.save(output)
123        for k, v in output.items():
124            output[k] = np.asarray(v)
125        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            backend=backend(
 35                formulae=self.formulae, override_jit_flags={"parallel": False}
 36            ),
 37        )
 38
 39        condensation = Condensation(
 40            adaptive=settings.adaptive,
 41            rtol_x=settings.rtol_x,
 42            rtol_thd=settings.rtol_thd,
 43            dt_cond_range=settings.dt_cond_range,
 44        )
 45
 46        products = [
 47            PySDM_products.ParticleSizeSpectrumPerVolume(
 48                name="Particles Wet Size Spectrum",
 49                radius_bins_edges=settings.r_bins_edges,
 50            ),
 51            PySDM_products.CondensationTimestepMin(name="dt_cond_min"),
 52            PySDM_products.CondensationTimestepMax(name="dt_cond_max"),
 53            PySDM_products.RipeningRate(),
 54            PySDM_products.MeanRadius(
 55                name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf)
 56            ),
 57            PySDM_products.ActivatedMeanRadius(
 58                name="r_act", count_activated=True, count_unactivated=False
 59            ),
 60            PySDM_products.Time(name="t"),
 61        ]
 62
 63        attributes = env.init_attributes(
 64            n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry
 65        )
 66
 67        self.particulator = Particulator(
 68            attributes=attributes,
 69            products=products,
 70            n_sd=settings.n_sd,
 71            environment=env,
 72            dynamics=(
 73                AmbientThermodynamics(),
 74                condensation,
 75            ),
 76        )
 77
 78        self.n_steps = settings.n_steps
 79
 80    def save(self, output):
 81        _sp = self.particulator
 82        cell_id = 0
 83        output["r_bins_values"].append(
 84            (_sp.products["Particles Wet Size Spectrum"].get()).T
 85        )
 86        volume = _sp.attributes["volume"].to_ndarray()
 87        output["r"].append((self.formulae.trivia.radius(volume=volume)).T)
 88        output["S"].append(_sp.environment["RH"][cell_id] - 1)
 89        output["t"].append(_sp.products["t"].get())
 90        for key in ("water_vapour_mixing_ratio", "T", "z"):
 91            output[key].append(_sp.environment[key][cell_id])
 92        for key in (
 93            "dt_cond_max",
 94            "dt_cond_min",
 95            "ripening rate",
 96            "r_mean_gt_1_um",
 97            "r_act",
 98        ):
 99            output[key].append(_sp.products[key].get()[cell_id].copy())
100
101    def run(self):
102        output = {
103            key: []
104            for key in (
105                "r",
106                "S",
107                "z",
108                "t",
109                "water_vapour_mixing_ratio",
110                "T",
111                "r_bins_values",
112                "dt_cond_max",
113                "dt_cond_min",
114                "ripening rate",
115                "r_mean_gt_1_um",
116                "r_act",
117            )
118        }
119
120        self.save(output)
121        for _ in range(self.n_steps):
122            self.particulator.run(self.n_substeps)
123            self.save(output)
124        for k, v in output.items():
125            output[k] = np.asarray(v)
126        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            backend=backend(
35                formulae=self.formulae, override_jit_flags={"parallel": False}
36            ),
37        )
38
39        condensation = Condensation(
40            adaptive=settings.adaptive,
41            rtol_x=settings.rtol_x,
42            rtol_thd=settings.rtol_thd,
43            dt_cond_range=settings.dt_cond_range,
44        )
45
46        products = [
47            PySDM_products.ParticleSizeSpectrumPerVolume(
48                name="Particles Wet Size Spectrum",
49                radius_bins_edges=settings.r_bins_edges,
50            ),
51            PySDM_products.CondensationTimestepMin(name="dt_cond_min"),
52            PySDM_products.CondensationTimestepMax(name="dt_cond_max"),
53            PySDM_products.RipeningRate(),
54            PySDM_products.MeanRadius(
55                name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf)
56            ),
57            PySDM_products.ActivatedMeanRadius(
58                name="r_act", count_activated=True, count_unactivated=False
59            ),
60            PySDM_products.Time(name="t"),
61        ]
62
63        attributes = env.init_attributes(
64            n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry
65        )
66
67        self.particulator = Particulator(
68            attributes=attributes,
69            products=products,
70            n_sd=settings.n_sd,
71            environment=env,
72            dynamics=(
73                AmbientThermodynamics(),
74                condensation,
75            ),
76        )
77
78        self.n_steps = settings.n_steps
n_substeps
formulae
bins_edges
particulator
n_steps
def save(self, output):
80    def save(self, output):
81        _sp = self.particulator
82        cell_id = 0
83        output["r_bins_values"].append(
84            (_sp.products["Particles Wet Size Spectrum"].get()).T
85        )
86        volume = _sp.attributes["volume"].to_ndarray()
87        output["r"].append((self.formulae.trivia.radius(volume=volume)).T)
88        output["S"].append(_sp.environment["RH"][cell_id] - 1)
89        output["t"].append(_sp.products["t"].get())
90        for key in ("water_vapour_mixing_ratio", "T", "z"):
91            output[key].append(_sp.environment[key][cell_id])
92        for key in (
93            "dt_cond_max",
94            "dt_cond_min",
95            "ripening rate",
96            "r_mean_gt_1_um",
97            "r_act",
98        ):
99            output[key].append(_sp.products[key].get()[cell_id].copy())
def run(self):
101    def run(self):
102        output = {
103            key: []
104            for key in (
105                "r",
106                "S",
107                "z",
108                "t",
109                "water_vapour_mixing_ratio",
110                "T",
111                "r_bins_values",
112                "dt_cond_max",
113                "dt_cond_min",
114                "ripening rate",
115                "r_mean_gt_1_um",
116                "r_act",
117            )
118        }
119
120        self.save(output)
121        for _ in range(self.n_steps):
122            self.particulator.run(self.n_substeps)
123            self.save(output)
124        for k, v in output.items():
125            output[k] = np.asarray(v)
126        return output