PySDM_examples.featured.Kreidenweis_et_al_2003.simulation

  1import numpy as np
  2from PySDM_examples.utils import BasicSimulation
  3
  4import PySDM.products as PySDM_products
  5from PySDM import Particulator
  6from PySDM.backends import CPU
  7from PySDM.dynamics import AmbientThermodynamics, AqueousChemistry, Condensation
  8from PySDM.dynamics.impl.chemistry_utils import AQUEOUS_COMPOUNDS, GASEOUS_COMPOUNDS
  9from PySDM.environments import Parcel
 10from PySDM.physics import si
 11
 12
 13class Simulation(BasicSimulation):
 14    def __init__(self, settings, products=None):
 15        environment = Parcel(
 16            dt=settings.dt,
 17            mass_of_dry_air=settings.mass_of_dry_air,
 18            p0=settings.p0,
 19            initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio,
 20            T0=settings.T0,
 21            w=settings.w,
 22            backend=CPU(formulae=settings.formulae),
 23        )
 24        attributes = environment.init_attributes(
 25            n_in_dv=settings.n_in_dv,
 26            kappa=settings.kappa,
 27            r_dry=settings.r_dry,
 28            include_dry_volume_in_attribute=False,
 29        )
 30        attributes = {
 31            **attributes,
 32            **settings.starting_amounts,
 33        }
 34
 35        products = products or (
 36            PySDM_products.AmbientRelativeHumidity(name="RH", unit="%"),
 37            PySDM_products.WaterMixingRatio(
 38                name="liquid water mixing ratio",
 39                radius_range=[1 * si.um, np.inf],
 40                unit="g/kg",
 41            ),
 42            PySDM_products.ParcelDisplacement(name="z"),
 43            PySDM_products.AmbientPressure(name="p"),
 44            PySDM_products.AmbientTemperature(name="T"),
 45            PySDM_products.AmbientDryAirDensity(name="rhod"),
 46            PySDM_products.AmbientWaterVapourMixingRatio(
 47                name="water vapour mixing ratio",
 48                var="water_vapour_mixing_ratio",
 49                unit="g/kg",
 50            ),
 51            PySDM_products.Time(name="t"),
 52            *(
 53                PySDM_products.AqueousMoleFraction(
 54                    comp, unit="ppb", name=f"aq_{comp}_ppb"
 55                )
 56                for comp in AQUEOUS_COMPOUNDS
 57            ),
 58            *(
 59                PySDM_products.GaseousMoleFraction(
 60                    comp, unit="ppb", name=f"gas_{comp}_ppb"
 61                )
 62                for comp in GASEOUS_COMPOUNDS
 63            ),
 64            PySDM_products.Acidity(
 65                name="pH_pH_number_weighted",
 66                radius_range=settings.cloud_radius_range,
 67                weighting="number",
 68                attr="pH",
 69            ),
 70            PySDM_products.Acidity(
 71                name="pH_pH_volume_weighted",
 72                radius_range=settings.cloud_radius_range,
 73                weighting="volume",
 74                attr="pH",
 75            ),
 76            PySDM_products.Acidity(
 77                name="pH_conc_H_number_weighted",
 78                radius_range=settings.cloud_radius_range,
 79                weighting="number",
 80                attr="conc_H",
 81            ),
 82            PySDM_products.Acidity(
 83                name="pH_conc_H_volume_weighted",
 84                radius_range=settings.cloud_radius_range,
 85                weighting="volume",
 86                attr="conc_H",
 87            ),
 88            PySDM_products.TotalDryMassMixingRatio(
 89                settings.DRY_RHO, name="q_dry", unit="ug/kg"
 90            ),
 91            PySDM_products.PeakSaturation(unit="%", name="S_max_percent"),
 92            PySDM_products.ParticleSpecificConcentration(
 93                radius_range=settings.cloud_radius_range, name="n_c_mg", unit="mg^-1"
 94            ),
 95            PySDM_products.AqueousMassSpectrum(
 96                key="S_VI",
 97                dry_radius_bins_edges=settings.dry_radius_bins_edges,
 98                name="dm_S_VI/dlog_10(dry diameter)",
 99                unit="ug / m^3",
100            ),
101        )
102
103        particulator = Particulator(
104            n_sd=settings.n_sd,
105            environment=environment,
106            dynamics=(
107                AmbientThermodynamics(),
108                Condensation(),
109                AqueousChemistry(
110                    environment_mole_fractions=settings.ENVIRONMENT_MOLE_FRACTIONS,
111                    system_type=settings.system_type,
112                    n_substep=settings.n_substep,
113                    dry_rho=settings.DRY_RHO,
114                    dry_molar_mass=settings.dry_molar_mass,
115                ),
116            ),
117            attributes=attributes,
118            products=products,
119        )
120        self.settings = settings
121        super().__init__(particulator=particulator)
122
123    def run(self):
124        return super()._run(self.settings.nt, self.settings.steps_per_output_interval)
 14class Simulation(BasicSimulation):
 15    def __init__(self, settings, products=None):
 16        environment = Parcel(
 17            dt=settings.dt,
 18            mass_of_dry_air=settings.mass_of_dry_air,
 19            p0=settings.p0,
 20            initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio,
 21            T0=settings.T0,
 22            w=settings.w,
 23            backend=CPU(formulae=settings.formulae),
 24        )
 25        attributes = environment.init_attributes(
 26            n_in_dv=settings.n_in_dv,
 27            kappa=settings.kappa,
 28            r_dry=settings.r_dry,
 29            include_dry_volume_in_attribute=False,
 30        )
 31        attributes = {
 32            **attributes,
 33            **settings.starting_amounts,
 34        }
 35
 36        products = products or (
 37            PySDM_products.AmbientRelativeHumidity(name="RH", unit="%"),
 38            PySDM_products.WaterMixingRatio(
 39                name="liquid water mixing ratio",
 40                radius_range=[1 * si.um, np.inf],
 41                unit="g/kg",
 42            ),
 43            PySDM_products.ParcelDisplacement(name="z"),
 44            PySDM_products.AmbientPressure(name="p"),
 45            PySDM_products.AmbientTemperature(name="T"),
 46            PySDM_products.AmbientDryAirDensity(name="rhod"),
 47            PySDM_products.AmbientWaterVapourMixingRatio(
 48                name="water vapour mixing ratio",
 49                var="water_vapour_mixing_ratio",
 50                unit="g/kg",
 51            ),
 52            PySDM_products.Time(name="t"),
 53            *(
 54                PySDM_products.AqueousMoleFraction(
 55                    comp, unit="ppb", name=f"aq_{comp}_ppb"
 56                )
 57                for comp in AQUEOUS_COMPOUNDS
 58            ),
 59            *(
 60                PySDM_products.GaseousMoleFraction(
 61                    comp, unit="ppb", name=f"gas_{comp}_ppb"
 62                )
 63                for comp in GASEOUS_COMPOUNDS
 64            ),
 65            PySDM_products.Acidity(
 66                name="pH_pH_number_weighted",
 67                radius_range=settings.cloud_radius_range,
 68                weighting="number",
 69                attr="pH",
 70            ),
 71            PySDM_products.Acidity(
 72                name="pH_pH_volume_weighted",
 73                radius_range=settings.cloud_radius_range,
 74                weighting="volume",
 75                attr="pH",
 76            ),
 77            PySDM_products.Acidity(
 78                name="pH_conc_H_number_weighted",
 79                radius_range=settings.cloud_radius_range,
 80                weighting="number",
 81                attr="conc_H",
 82            ),
 83            PySDM_products.Acidity(
 84                name="pH_conc_H_volume_weighted",
 85                radius_range=settings.cloud_radius_range,
 86                weighting="volume",
 87                attr="conc_H",
 88            ),
 89            PySDM_products.TotalDryMassMixingRatio(
 90                settings.DRY_RHO, name="q_dry", unit="ug/kg"
 91            ),
 92            PySDM_products.PeakSaturation(unit="%", name="S_max_percent"),
 93            PySDM_products.ParticleSpecificConcentration(
 94                radius_range=settings.cloud_radius_range, name="n_c_mg", unit="mg^-1"
 95            ),
 96            PySDM_products.AqueousMassSpectrum(
 97                key="S_VI",
 98                dry_radius_bins_edges=settings.dry_radius_bins_edges,
 99                name="dm_S_VI/dlog_10(dry diameter)",
100                unit="ug / m^3",
101            ),
102        )
103
104        particulator = Particulator(
105            n_sd=settings.n_sd,
106            environment=environment,
107            dynamics=(
108                AmbientThermodynamics(),
109                Condensation(),
110                AqueousChemistry(
111                    environment_mole_fractions=settings.ENVIRONMENT_MOLE_FRACTIONS,
112                    system_type=settings.system_type,
113                    n_substep=settings.n_substep,
114                    dry_rho=settings.DRY_RHO,
115                    dry_molar_mass=settings.dry_molar_mass,
116                ),
117            ),
118            attributes=attributes,
119            products=products,
120        )
121        self.settings = settings
122        super().__init__(particulator=particulator)
123
124    def run(self):
125        return super()._run(self.settings.nt, self.settings.steps_per_output_interval)
Simulation(settings, products=None)
 15    def __init__(self, settings, products=None):
 16        environment = Parcel(
 17            dt=settings.dt,
 18            mass_of_dry_air=settings.mass_of_dry_air,
 19            p0=settings.p0,
 20            initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio,
 21            T0=settings.T0,
 22            w=settings.w,
 23            backend=CPU(formulae=settings.formulae),
 24        )
 25        attributes = environment.init_attributes(
 26            n_in_dv=settings.n_in_dv,
 27            kappa=settings.kappa,
 28            r_dry=settings.r_dry,
 29            include_dry_volume_in_attribute=False,
 30        )
 31        attributes = {
 32            **attributes,
 33            **settings.starting_amounts,
 34        }
 35
 36        products = products or (
 37            PySDM_products.AmbientRelativeHumidity(name="RH", unit="%"),
 38            PySDM_products.WaterMixingRatio(
 39                name="liquid water mixing ratio",
 40                radius_range=[1 * si.um, np.inf],
 41                unit="g/kg",
 42            ),
 43            PySDM_products.ParcelDisplacement(name="z"),
 44            PySDM_products.AmbientPressure(name="p"),
 45            PySDM_products.AmbientTemperature(name="T"),
 46            PySDM_products.AmbientDryAirDensity(name="rhod"),
 47            PySDM_products.AmbientWaterVapourMixingRatio(
 48                name="water vapour mixing ratio",
 49                var="water_vapour_mixing_ratio",
 50                unit="g/kg",
 51            ),
 52            PySDM_products.Time(name="t"),
 53            *(
 54                PySDM_products.AqueousMoleFraction(
 55                    comp, unit="ppb", name=f"aq_{comp}_ppb"
 56                )
 57                for comp in AQUEOUS_COMPOUNDS
 58            ),
 59            *(
 60                PySDM_products.GaseousMoleFraction(
 61                    comp, unit="ppb", name=f"gas_{comp}_ppb"
 62                )
 63                for comp in GASEOUS_COMPOUNDS
 64            ),
 65            PySDM_products.Acidity(
 66                name="pH_pH_number_weighted",
 67                radius_range=settings.cloud_radius_range,
 68                weighting="number",
 69                attr="pH",
 70            ),
 71            PySDM_products.Acidity(
 72                name="pH_pH_volume_weighted",
 73                radius_range=settings.cloud_radius_range,
 74                weighting="volume",
 75                attr="pH",
 76            ),
 77            PySDM_products.Acidity(
 78                name="pH_conc_H_number_weighted",
 79                radius_range=settings.cloud_radius_range,
 80                weighting="number",
 81                attr="conc_H",
 82            ),
 83            PySDM_products.Acidity(
 84                name="pH_conc_H_volume_weighted",
 85                radius_range=settings.cloud_radius_range,
 86                weighting="volume",
 87                attr="conc_H",
 88            ),
 89            PySDM_products.TotalDryMassMixingRatio(
 90                settings.DRY_RHO, name="q_dry", unit="ug/kg"
 91            ),
 92            PySDM_products.PeakSaturation(unit="%", name="S_max_percent"),
 93            PySDM_products.ParticleSpecificConcentration(
 94                radius_range=settings.cloud_radius_range, name="n_c_mg", unit="mg^-1"
 95            ),
 96            PySDM_products.AqueousMassSpectrum(
 97                key="S_VI",
 98                dry_radius_bins_edges=settings.dry_radius_bins_edges,
 99                name="dm_S_VI/dlog_10(dry diameter)",
100                unit="ug / m^3",
101            ),
102        )
103
104        particulator = Particulator(
105            n_sd=settings.n_sd,
106            environment=environment,
107            dynamics=(
108                AmbientThermodynamics(),
109                Condensation(),
110                AqueousChemistry(
111                    environment_mole_fractions=settings.ENVIRONMENT_MOLE_FRACTIONS,
112                    system_type=settings.system_type,
113                    n_substep=settings.n_substep,
114                    dry_rho=settings.DRY_RHO,
115                    dry_molar_mass=settings.dry_molar_mass,
116                ),
117            ),
118            attributes=attributes,
119            products=products,
120        )
121        self.settings = settings
122        super().__init__(particulator=particulator)
settings
def run(self):
124    def run(self):
125        return super()._run(self.settings.nt, self.settings.steps_per_output_interval)