PySDM_examples.seeding.simulation
1import numpy as np 2 3from PySDM_examples.seeding.settings import Settings 4 5from PySDM import Builder 6from PySDM.backends import CPU 7from PySDM.environments import Parcel 8from PySDM.dynamics import Condensation, AmbientThermodynamics, Coalescence, Seeding 9from PySDM.dynamics.collisions.collision_kernels import Geometric 10from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity 11from PySDM import products 12from PySDM.physics import si 13 14 15class Simulation: 16 def __init__(self, settings: Settings): 17 builder = Builder( 18 n_sd=settings.n_sd_seeding + settings.n_sd_initial, 19 backend=CPU( 20 formulae=settings.formulae, override_jit_flags={"parallel": False} 21 ), 22 environment=Parcel( 23 dt=settings.timestep, 24 mass_of_dry_air=settings.mass_of_dry_air, 25 w=settings.updraft, 26 initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio, 27 p0=settings.initial_total_pressure, 28 T0=settings.initial_temperature, 29 ), 30 dynamics=[ 31 AmbientThermodynamics(), 32 Condensation(), 33 ] 34 + ( 35 [] 36 if not settings.enable_collisions 37 else [ 38 Coalescence(collision_kernel=Geometric()), 39 ] 40 ) 41 + [ 42 Seeding( 43 **{ 44 k: getattr(settings, k) 45 for k in ( 46 "super_droplet_injection_rate", 47 "seeded_particle_multiplicity", 48 "seeded_particle_extensive_attributes", 49 ) 50 } 51 ), 52 ], 53 ) 54 55 r_dry, n_in_dv = ConstantMultiplicity( 56 settings.initial_aerosol_dry_radii 57 ).sample_deterministic( 58 n_sd=settings.n_sd_initial, backend=builder.particulator.backend 59 ) 60 attributes = builder.particulator.environment.init_attributes( 61 n_in_dv=n_in_dv, kappa=settings.initial_aerosol_kappa, r_dry=r_dry 62 ) 63 self.particulator = builder.build( 64 attributes={ 65 k: np.pad( 66 array=v, 67 pad_width=(0, settings.n_sd_seeding), 68 mode="constant", 69 constant_values=np.nan if k == "multiplicity" else 0, 70 ) 71 for k, v in attributes.items() 72 }, 73 products=( 74 products.SuperDropletCountPerGridbox(name="sd_count"), 75 products.Time(), 76 products.WaterMixingRatio( 77 radius_range=(settings.rain_water_radius_threshold, np.inf), 78 name="rain water mixing ratio", 79 ), 80 products.EffectiveRadius( 81 name="r_eff", 82 unit="um", 83 radius_range=(0.5 * si.um, 25 * si.um), 84 ), 85 products.ParticleConcentration( 86 name="n_drop", 87 unit="cm^-3", 88 radius_range=(0.5 * si.um, 25 * si.um), 89 ), 90 ), 91 ) 92 self.n_steps = int(settings.t_max // settings.timestep) 93 94 def run(self): 95 output = { 96 "attributes": {"water mass": []}, 97 "products": {key: [] for key in self.particulator.products}, 98 } 99 for step in range(self.n_steps + 1): 100 if step != 0: 101 self.particulator.run(steps=1) 102 for key, attr in output["attributes"].items(): 103 data = self.particulator.attributes[key].to_ndarray(raw=True) 104 data[data == 0] = np.nan 105 attr.append(data) 106 for key, prod in output["products"].items(): 107 value = self.particulator.products[key].get() 108 if not isinstance(value, float): 109 (value,) = value 110 prod.append(float(value)) 111 for out in ("attributes", "products"): 112 for key, val in output[out].items(): 113 output[out][key] = np.array(val) 114 return output
class
Simulation:
16class Simulation: 17 def __init__(self, settings: Settings): 18 builder = Builder( 19 n_sd=settings.n_sd_seeding + settings.n_sd_initial, 20 backend=CPU( 21 formulae=settings.formulae, override_jit_flags={"parallel": False} 22 ), 23 environment=Parcel( 24 dt=settings.timestep, 25 mass_of_dry_air=settings.mass_of_dry_air, 26 w=settings.updraft, 27 initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio, 28 p0=settings.initial_total_pressure, 29 T0=settings.initial_temperature, 30 ), 31 dynamics=[ 32 AmbientThermodynamics(), 33 Condensation(), 34 ] 35 + ( 36 [] 37 if not settings.enable_collisions 38 else [ 39 Coalescence(collision_kernel=Geometric()), 40 ] 41 ) 42 + [ 43 Seeding( 44 **{ 45 k: getattr(settings, k) 46 for k in ( 47 "super_droplet_injection_rate", 48 "seeded_particle_multiplicity", 49 "seeded_particle_extensive_attributes", 50 ) 51 } 52 ), 53 ], 54 ) 55 56 r_dry, n_in_dv = ConstantMultiplicity( 57 settings.initial_aerosol_dry_radii 58 ).sample_deterministic( 59 n_sd=settings.n_sd_initial, backend=builder.particulator.backend 60 ) 61 attributes = builder.particulator.environment.init_attributes( 62 n_in_dv=n_in_dv, kappa=settings.initial_aerosol_kappa, r_dry=r_dry 63 ) 64 self.particulator = builder.build( 65 attributes={ 66 k: np.pad( 67 array=v, 68 pad_width=(0, settings.n_sd_seeding), 69 mode="constant", 70 constant_values=np.nan if k == "multiplicity" else 0, 71 ) 72 for k, v in attributes.items() 73 }, 74 products=( 75 products.SuperDropletCountPerGridbox(name="sd_count"), 76 products.Time(), 77 products.WaterMixingRatio( 78 radius_range=(settings.rain_water_radius_threshold, np.inf), 79 name="rain water mixing ratio", 80 ), 81 products.EffectiveRadius( 82 name="r_eff", 83 unit="um", 84 radius_range=(0.5 * si.um, 25 * si.um), 85 ), 86 products.ParticleConcentration( 87 name="n_drop", 88 unit="cm^-3", 89 radius_range=(0.5 * si.um, 25 * si.um), 90 ), 91 ), 92 ) 93 self.n_steps = int(settings.t_max // settings.timestep) 94 95 def run(self): 96 output = { 97 "attributes": {"water mass": []}, 98 "products": {key: [] for key in self.particulator.products}, 99 } 100 for step in range(self.n_steps + 1): 101 if step != 0: 102 self.particulator.run(steps=1) 103 for key, attr in output["attributes"].items(): 104 data = self.particulator.attributes[key].to_ndarray(raw=True) 105 data[data == 0] = np.nan 106 attr.append(data) 107 for key, prod in output["products"].items(): 108 value = self.particulator.products[key].get() 109 if not isinstance(value, float): 110 (value,) = value 111 prod.append(float(value)) 112 for out in ("attributes", "products"): 113 for key, val in output[out].items(): 114 output[out][key] = np.array(val) 115 return output
Simulation(settings: PySDM_examples.seeding.settings.Settings)
17 def __init__(self, settings: Settings): 18 builder = Builder( 19 n_sd=settings.n_sd_seeding + settings.n_sd_initial, 20 backend=CPU( 21 formulae=settings.formulae, override_jit_flags={"parallel": False} 22 ), 23 environment=Parcel( 24 dt=settings.timestep, 25 mass_of_dry_air=settings.mass_of_dry_air, 26 w=settings.updraft, 27 initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio, 28 p0=settings.initial_total_pressure, 29 T0=settings.initial_temperature, 30 ), 31 dynamics=[ 32 AmbientThermodynamics(), 33 Condensation(), 34 ] 35 + ( 36 [] 37 if not settings.enable_collisions 38 else [ 39 Coalescence(collision_kernel=Geometric()), 40 ] 41 ) 42 + [ 43 Seeding( 44 **{ 45 k: getattr(settings, k) 46 for k in ( 47 "super_droplet_injection_rate", 48 "seeded_particle_multiplicity", 49 "seeded_particle_extensive_attributes", 50 ) 51 } 52 ), 53 ], 54 ) 55 56 r_dry, n_in_dv = ConstantMultiplicity( 57 settings.initial_aerosol_dry_radii 58 ).sample_deterministic( 59 n_sd=settings.n_sd_initial, backend=builder.particulator.backend 60 ) 61 attributes = builder.particulator.environment.init_attributes( 62 n_in_dv=n_in_dv, kappa=settings.initial_aerosol_kappa, r_dry=r_dry 63 ) 64 self.particulator = builder.build( 65 attributes={ 66 k: np.pad( 67 array=v, 68 pad_width=(0, settings.n_sd_seeding), 69 mode="constant", 70 constant_values=np.nan if k == "multiplicity" else 0, 71 ) 72 for k, v in attributes.items() 73 }, 74 products=( 75 products.SuperDropletCountPerGridbox(name="sd_count"), 76 products.Time(), 77 products.WaterMixingRatio( 78 radius_range=(settings.rain_water_radius_threshold, np.inf), 79 name="rain water mixing ratio", 80 ), 81 products.EffectiveRadius( 82 name="r_eff", 83 unit="um", 84 radius_range=(0.5 * si.um, 25 * si.um), 85 ), 86 products.ParticleConcentration( 87 name="n_drop", 88 unit="cm^-3", 89 radius_range=(0.5 * si.um, 25 * si.um), 90 ), 91 ), 92 ) 93 self.n_steps = int(settings.t_max // settings.timestep)
def
run(self):
95 def run(self): 96 output = { 97 "attributes": {"water mass": []}, 98 "products": {key: [] for key in self.particulator.products}, 99 } 100 for step in range(self.n_steps + 1): 101 if step != 0: 102 self.particulator.run(steps=1) 103 for key, attr in output["attributes"].items(): 104 data = self.particulator.attributes[key].to_ndarray(raw=True) 105 data[data == 0] = np.nan 106 attr.append(data) 107 for key, prod in output["products"].items(): 108 value = self.particulator.products[key].get() 109 if not isinstance(value, float): 110 (value,) = value 111 prod.append(float(value)) 112 for out in ("attributes", "products"): 113 for key, val in output[out].items(): 114 output[out][key] = np.array(val) 115 return output