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)