PySDM_examples.Abade_and_Albuquerque_2024.simulation

 1import numpy as np
 2
 3from PySDM_examples.utils import BasicSimulation
 4
 5from PySDM import Builder
 6from PySDM.backends import CPU
 7from PySDM.dynamics import (
 8    Condensation,
 9    AmbientThermodynamics,
10    VapourDepositionOnIce,
11    Freezing,
12)
13from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity
14from PySDM.products import (
15    AmbientTemperature,
16    AmbientWaterVapourMixingRatio,
17    ParcelDisplacement,
18    WaterMixingRatio,
19    SpecificIceWaterContent,
20)
21from PySDM.environments import Parcel
22
23
24class Simulation(BasicSimulation):
25    def __init__(self, settings):
26        builder = Builder(
27            backend=CPU(settings.formulae, override_jit_flags={"parallel": False}),
28            n_sd=settings.n_sd,
29            environment=Parcel(
30                dt=settings.timestep,
31                mass_of_dry_air=settings.mass_of_dry_air,
32                p0=settings.initial_total_pressure,
33                initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio,
34                T0=settings.initial_temperature,
35                w=settings.updraft,
36                mixed_phase=True,
37            ),
38        )
39        builder.add_dynamic(AmbientThermodynamics())
40        builder.add_dynamic(Condensation())
41
42        if settings.enable_immersion_freezing:
43            builder.add_dynamic(Freezing())
44        if settings.enable_vapour_deposition_on_ice:
45            builder.add_dynamic(VapourDepositionOnIce())
46
47        r_dry, n_in_dv = ConstantMultiplicity(settings.soluble_aerosol).sample(
48            n_sd=settings.n_sd
49        )
50        attributes = builder.particulator.environment.init_attributes(
51            n_in_dv=n_in_dv, kappa=settings.kappa, r_dry=r_dry
52        )
53        attributes["signed water mass"] = (
54            builder.particulator.formulae.particle_shape_and_density.volume_to_mass(
55                attributes["volume"]
56            )
57        )
58        del attributes["volume"]
59
60        # TODO #1524
61        if settings.enable_immersion_freezing:
62            attributes["freezing temperature"] = np.full(
63                shape=(settings.n_sd,), fill_value=250
64            )
65
66        self.products = (
67            WaterMixingRatio(name="water", radius_range=(0, np.inf)),
68            SpecificIceWaterContent(name="ice"),
69            ParcelDisplacement(name="height"),
70            AmbientTemperature(name="T"),
71            AmbientWaterVapourMixingRatio(
72                name="vapour", var="water_vapour_mixing_ratio"
73            ),
74        )
75        super().__init__(
76            particulator=builder.build(attributes=attributes, products=self.products)
77        )
78
79    def run(self, *, nt, steps_per_output_interval):
80        return self._run(nt=nt, steps_per_output_interval=steps_per_output_interval)
25class Simulation(BasicSimulation):
26    def __init__(self, settings):
27        builder = Builder(
28            backend=CPU(settings.formulae, override_jit_flags={"parallel": False}),
29            n_sd=settings.n_sd,
30            environment=Parcel(
31                dt=settings.timestep,
32                mass_of_dry_air=settings.mass_of_dry_air,
33                p0=settings.initial_total_pressure,
34                initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio,
35                T0=settings.initial_temperature,
36                w=settings.updraft,
37                mixed_phase=True,
38            ),
39        )
40        builder.add_dynamic(AmbientThermodynamics())
41        builder.add_dynamic(Condensation())
42
43        if settings.enable_immersion_freezing:
44            builder.add_dynamic(Freezing())
45        if settings.enable_vapour_deposition_on_ice:
46            builder.add_dynamic(VapourDepositionOnIce())
47
48        r_dry, n_in_dv = ConstantMultiplicity(settings.soluble_aerosol).sample(
49            n_sd=settings.n_sd
50        )
51        attributes = builder.particulator.environment.init_attributes(
52            n_in_dv=n_in_dv, kappa=settings.kappa, r_dry=r_dry
53        )
54        attributes["signed water mass"] = (
55            builder.particulator.formulae.particle_shape_and_density.volume_to_mass(
56                attributes["volume"]
57            )
58        )
59        del attributes["volume"]
60
61        # TODO #1524
62        if settings.enable_immersion_freezing:
63            attributes["freezing temperature"] = np.full(
64                shape=(settings.n_sd,), fill_value=250
65            )
66
67        self.products = (
68            WaterMixingRatio(name="water", radius_range=(0, np.inf)),
69            SpecificIceWaterContent(name="ice"),
70            ParcelDisplacement(name="height"),
71            AmbientTemperature(name="T"),
72            AmbientWaterVapourMixingRatio(
73                name="vapour", var="water_vapour_mixing_ratio"
74            ),
75        )
76        super().__init__(
77            particulator=builder.build(attributes=attributes, products=self.products)
78        )
79
80    def run(self, *, nt, steps_per_output_interval):
81        return self._run(nt=nt, steps_per_output_interval=steps_per_output_interval)
Simulation(settings)
26    def __init__(self, settings):
27        builder = Builder(
28            backend=CPU(settings.formulae, override_jit_flags={"parallel": False}),
29            n_sd=settings.n_sd,
30            environment=Parcel(
31                dt=settings.timestep,
32                mass_of_dry_air=settings.mass_of_dry_air,
33                p0=settings.initial_total_pressure,
34                initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio,
35                T0=settings.initial_temperature,
36                w=settings.updraft,
37                mixed_phase=True,
38            ),
39        )
40        builder.add_dynamic(AmbientThermodynamics())
41        builder.add_dynamic(Condensation())
42
43        if settings.enable_immersion_freezing:
44            builder.add_dynamic(Freezing())
45        if settings.enable_vapour_deposition_on_ice:
46            builder.add_dynamic(VapourDepositionOnIce())
47
48        r_dry, n_in_dv = ConstantMultiplicity(settings.soluble_aerosol).sample(
49            n_sd=settings.n_sd
50        )
51        attributes = builder.particulator.environment.init_attributes(
52            n_in_dv=n_in_dv, kappa=settings.kappa, r_dry=r_dry
53        )
54        attributes["signed water mass"] = (
55            builder.particulator.formulae.particle_shape_and_density.volume_to_mass(
56                attributes["volume"]
57            )
58        )
59        del attributes["volume"]
60
61        # TODO #1524
62        if settings.enable_immersion_freezing:
63            attributes["freezing temperature"] = np.full(
64                shape=(settings.n_sd,), fill_value=250
65            )
66
67        self.products = (
68            WaterMixingRatio(name="water", radius_range=(0, np.inf)),
69            SpecificIceWaterContent(name="ice"),
70            ParcelDisplacement(name="height"),
71            AmbientTemperature(name="T"),
72            AmbientWaterVapourMixingRatio(
73                name="vapour", var="water_vapour_mixing_ratio"
74            ),
75        )
76        super().__init__(
77            particulator=builder.build(attributes=attributes, products=self.products)
78        )
products
def run(self, *, nt, steps_per_output_interval):
80    def run(self, *, nt, steps_per_output_interval):
81        return self._run(nt=nt, steps_per_output_interval=steps_per_output_interval)