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)