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