PySDM_examples.Abade_and_Albuquerque_2024.simulation
1import numpy as np 2 3from PySDM_examples.utils import BasicSimulation 4 5from PySDM import Builder 6from PySDM.backends import CPU 7from PySDM.dynamics import ( 8 Condensation, 9 AmbientThermodynamics, 10 VapourDepositionOnIce, 11 Freezing, 12) 13from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity 14from PySDM.products import ( 15 AmbientTemperature, 16 AmbientWaterVapourMixingRatio, 17 ParcelDisplacement, 18 WaterMixingRatio, 19 SpecificIceWaterContent, 20) 21from PySDM.environments import Parcel 22 23 24class Simulation(BasicSimulation): 25 def __init__(self, settings): 26 builder = Builder( 27 backend=CPU(settings.formulae, override_jit_flags={"parallel": False}), 28 n_sd=settings.n_sd, 29 environment=Parcel( 30 dt=settings.timestep, 31 mass_of_dry_air=settings.mass_of_dry_air, 32 p0=settings.initial_total_pressure, 33 initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio, 34 T0=settings.initial_temperature, 35 w=settings.updraft, 36 mixed_phase=True, 37 ), 38 ) 39 builder.add_dynamic(AmbientThermodynamics()) 40 builder.add_dynamic(Condensation()) 41 42 if settings.enable_immersion_freezing: 43 builder.add_dynamic(Freezing()) 44 if settings.enable_vapour_deposition_on_ice: 45 builder.add_dynamic(VapourDepositionOnIce()) 46 47 r_dry, n_in_dv = ConstantMultiplicity(settings.soluble_aerosol).sample( 48 n_sd=settings.n_sd 49 ) 50 attributes = builder.particulator.environment.init_attributes( 51 n_in_dv=n_in_dv, kappa=settings.kappa, r_dry=r_dry 52 ) 53 attributes["signed water mass"] = ( 54 builder.particulator.formulae.particle_shape_and_density.volume_to_mass( 55 attributes["volume"] 56 ) 57 ) 58 del attributes["volume"] 59 60 # TODO #1524 61 if settings.enable_immersion_freezing: 62 attributes["freezing temperature"] = np.full( 63 shape=(settings.n_sd,), fill_value=250 64 ) 65 66 self.products = ( 67 WaterMixingRatio(name="water", radius_range=(0, np.inf)), 68 SpecificIceWaterContent(name="ice"), 69 ParcelDisplacement(name="height"), 70 AmbientTemperature(name="T"), 71 AmbientWaterVapourMixingRatio( 72 name="vapour", var="water_vapour_mixing_ratio" 73 ), 74 ) 75 super().__init__( 76 particulator=builder.build(attributes=attributes, products=self.products) 77 ) 78 79 def run(self, *, nt, steps_per_output_interval): 80 return self._run(nt=nt, steps_per_output_interval=steps_per_output_interval)
25class Simulation(BasicSimulation): 26 def __init__(self, settings): 27 builder = Builder( 28 backend=CPU(settings.formulae, override_jit_flags={"parallel": False}), 29 n_sd=settings.n_sd, 30 environment=Parcel( 31 dt=settings.timestep, 32 mass_of_dry_air=settings.mass_of_dry_air, 33 p0=settings.initial_total_pressure, 34 initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio, 35 T0=settings.initial_temperature, 36 w=settings.updraft, 37 mixed_phase=True, 38 ), 39 ) 40 builder.add_dynamic(AmbientThermodynamics()) 41 builder.add_dynamic(Condensation()) 42 43 if settings.enable_immersion_freezing: 44 builder.add_dynamic(Freezing()) 45 if settings.enable_vapour_deposition_on_ice: 46 builder.add_dynamic(VapourDepositionOnIce()) 47 48 r_dry, n_in_dv = ConstantMultiplicity(settings.soluble_aerosol).sample( 49 n_sd=settings.n_sd 50 ) 51 attributes = builder.particulator.environment.init_attributes( 52 n_in_dv=n_in_dv, kappa=settings.kappa, r_dry=r_dry 53 ) 54 attributes["signed water mass"] = ( 55 builder.particulator.formulae.particle_shape_and_density.volume_to_mass( 56 attributes["volume"] 57 ) 58 ) 59 del attributes["volume"] 60 61 # TODO #1524 62 if settings.enable_immersion_freezing: 63 attributes["freezing temperature"] = np.full( 64 shape=(settings.n_sd,), fill_value=250 65 ) 66 67 self.products = ( 68 WaterMixingRatio(name="water", radius_range=(0, np.inf)), 69 SpecificIceWaterContent(name="ice"), 70 ParcelDisplacement(name="height"), 71 AmbientTemperature(name="T"), 72 AmbientWaterVapourMixingRatio( 73 name="vapour", var="water_vapour_mixing_ratio" 74 ), 75 ) 76 super().__init__( 77 particulator=builder.build(attributes=attributes, products=self.products) 78 ) 79 80 def run(self, *, nt, steps_per_output_interval): 81 return self._run(nt=nt, steps_per_output_interval=steps_per_output_interval)
Simulation(settings)
26 def __init__(self, settings): 27 builder = Builder( 28 backend=CPU(settings.formulae, override_jit_flags={"parallel": False}), 29 n_sd=settings.n_sd, 30 environment=Parcel( 31 dt=settings.timestep, 32 mass_of_dry_air=settings.mass_of_dry_air, 33 p0=settings.initial_total_pressure, 34 initial_water_vapour_mixing_ratio=settings.initial_water_vapour_mixing_ratio, 35 T0=settings.initial_temperature, 36 w=settings.updraft, 37 mixed_phase=True, 38 ), 39 ) 40 builder.add_dynamic(AmbientThermodynamics()) 41 builder.add_dynamic(Condensation()) 42 43 if settings.enable_immersion_freezing: 44 builder.add_dynamic(Freezing()) 45 if settings.enable_vapour_deposition_on_ice: 46 builder.add_dynamic(VapourDepositionOnIce()) 47 48 r_dry, n_in_dv = ConstantMultiplicity(settings.soluble_aerosol).sample( 49 n_sd=settings.n_sd 50 ) 51 attributes = builder.particulator.environment.init_attributes( 52 n_in_dv=n_in_dv, kappa=settings.kappa, r_dry=r_dry 53 ) 54 attributes["signed water mass"] = ( 55 builder.particulator.formulae.particle_shape_and_density.volume_to_mass( 56 attributes["volume"] 57 ) 58 ) 59 del attributes["volume"] 60 61 # TODO #1524 62 if settings.enable_immersion_freezing: 63 attributes["freezing temperature"] = np.full( 64 shape=(settings.n_sd,), fill_value=250 65 ) 66 67 self.products = ( 68 WaterMixingRatio(name="water", radius_range=(0, np.inf)), 69 SpecificIceWaterContent(name="ice"), 70 ParcelDisplacement(name="height"), 71 AmbientTemperature(name="T"), 72 AmbientWaterVapourMixingRatio( 73 name="vapour", var="water_vapour_mixing_ratio" 74 ), 75 ) 76 super().__init__( 77 particulator=builder.build(attributes=attributes, products=self.products) 78 )