PySDM_examples.Yang_et_al_2018.simulation
1import numpy as np 2 3import PySDM.products as PySDM_products 4from PySDM import Builder, Formulae 5from PySDM.backends import CPU 6from PySDM.dynamics import AmbientThermodynamics, Condensation 7from PySDM.environments import Parcel 8from PySDM.physics import si 9 10 11class Simulation: 12 def __init__(self, settings, backend=CPU): 13 dt_output = ( 14 settings.total_time / settings.n_steps 15 ) # TODO #334 overwritten in notebook 16 self.n_substeps = 1 # TODO #334 use condensation substeps 17 while dt_output / self.n_substeps >= settings.dt_max: 18 self.n_substeps += 1 19 self.formulae = Formulae( 20 condensation_coordinate=settings.coord, 21 saturation_vapour_pressure="AugustRocheMagnus", 22 ) 23 self.bins_edges = self.formulae.trivia.volume(settings.r_bins_edges) 24 25 env = Parcel( 26 dt=dt_output / self.n_substeps, 27 mass_of_dry_air=settings.mass_of_dry_air, 28 p0=settings.p0, 29 initial_water_vapour_mixing_ratio=self.formulae.constants.eps 30 / ( 31 settings.p0 32 / settings.RH0 33 / self.formulae.saturation_vapour_pressure.pvs_water(settings.T0) 34 - 1 35 ), 36 T0=settings.T0, 37 w=settings.w, 38 z0=settings.z0, 39 ) 40 builder = Builder( 41 backend=backend( 42 formulae=self.formulae, override_jit_flags={"parallel": False} 43 ), 44 n_sd=settings.n_sd, 45 environment=env, 46 ) 47 48 environment = builder.particulator.environment 49 builder.add_dynamic(AmbientThermodynamics()) 50 condensation = Condensation( 51 adaptive=settings.adaptive, 52 rtol_x=settings.rtol_x, 53 rtol_thd=settings.rtol_thd, 54 dt_cond_range=settings.dt_cond_range, 55 ) 56 builder.add_dynamic(condensation) 57 58 products = [ 59 PySDM_products.ParticleSizeSpectrumPerVolume( 60 name="Particles Wet Size Spectrum", 61 radius_bins_edges=settings.r_bins_edges, 62 ), 63 PySDM_products.CondensationTimestepMin(name="dt_cond_min"), 64 PySDM_products.CondensationTimestepMax(name="dt_cond_max"), 65 PySDM_products.RipeningRate(), 66 PySDM_products.MeanRadius( 67 name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf) 68 ), 69 PySDM_products.ActivatedMeanRadius( 70 name="r_act", count_activated=True, count_unactivated=False 71 ), 72 PySDM_products.Time(name="t"), 73 ] 74 75 attributes = environment.init_attributes( 76 n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry 77 ) 78 79 self.particulator = builder.build(attributes, products) 80 81 self.n_steps = settings.n_steps 82 83 def save(self, output): 84 _sp = self.particulator 85 cell_id = 0 86 output["r_bins_values"].append( 87 _sp.products["Particles Wet Size Spectrum"].get() 88 ) 89 volume = _sp.attributes["volume"].to_ndarray() 90 output["r"].append(self.formulae.trivia.radius(volume=volume)) 91 output["S"].append(_sp.environment["RH"][cell_id] - 1) 92 output["t"].append(_sp.products["t"].get()) 93 for key in ("water_vapour_mixing_ratio", "T", "z"): 94 output[key].append(_sp.environment[key][cell_id]) 95 for key in ( 96 "dt_cond_max", 97 "dt_cond_min", 98 "ripening rate", 99 "r_mean_gt_1_um", 100 "r_act", 101 ): 102 output[key].append(_sp.products[key].get()[cell_id].copy()) 103 104 def run(self): 105 output = { 106 key: [] 107 for key in ( 108 "r", 109 "S", 110 "z", 111 "t", 112 "water_vapour_mixing_ratio", 113 "T", 114 "r_bins_values", 115 "dt_cond_max", 116 "dt_cond_min", 117 "ripening rate", 118 "r_mean_gt_1_um", 119 "r_act", 120 ) 121 } 122 123 self.save(output) 124 for _ in range(self.n_steps): 125 self.particulator.run(self.n_substeps) 126 self.save(output) 127 return output
class
Simulation:
12class Simulation: 13 def __init__(self, settings, backend=CPU): 14 dt_output = ( 15 settings.total_time / settings.n_steps 16 ) # TODO #334 overwritten in notebook 17 self.n_substeps = 1 # TODO #334 use condensation substeps 18 while dt_output / self.n_substeps >= settings.dt_max: 19 self.n_substeps += 1 20 self.formulae = Formulae( 21 condensation_coordinate=settings.coord, 22 saturation_vapour_pressure="AugustRocheMagnus", 23 ) 24 self.bins_edges = self.formulae.trivia.volume(settings.r_bins_edges) 25 26 env = Parcel( 27 dt=dt_output / self.n_substeps, 28 mass_of_dry_air=settings.mass_of_dry_air, 29 p0=settings.p0, 30 initial_water_vapour_mixing_ratio=self.formulae.constants.eps 31 / ( 32 settings.p0 33 / settings.RH0 34 / self.formulae.saturation_vapour_pressure.pvs_water(settings.T0) 35 - 1 36 ), 37 T0=settings.T0, 38 w=settings.w, 39 z0=settings.z0, 40 ) 41 builder = Builder( 42 backend=backend( 43 formulae=self.formulae, override_jit_flags={"parallel": False} 44 ), 45 n_sd=settings.n_sd, 46 environment=env, 47 ) 48 49 environment = builder.particulator.environment 50 builder.add_dynamic(AmbientThermodynamics()) 51 condensation = Condensation( 52 adaptive=settings.adaptive, 53 rtol_x=settings.rtol_x, 54 rtol_thd=settings.rtol_thd, 55 dt_cond_range=settings.dt_cond_range, 56 ) 57 builder.add_dynamic(condensation) 58 59 products = [ 60 PySDM_products.ParticleSizeSpectrumPerVolume( 61 name="Particles Wet Size Spectrum", 62 radius_bins_edges=settings.r_bins_edges, 63 ), 64 PySDM_products.CondensationTimestepMin(name="dt_cond_min"), 65 PySDM_products.CondensationTimestepMax(name="dt_cond_max"), 66 PySDM_products.RipeningRate(), 67 PySDM_products.MeanRadius( 68 name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf) 69 ), 70 PySDM_products.ActivatedMeanRadius( 71 name="r_act", count_activated=True, count_unactivated=False 72 ), 73 PySDM_products.Time(name="t"), 74 ] 75 76 attributes = environment.init_attributes( 77 n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry 78 ) 79 80 self.particulator = builder.build(attributes, products) 81 82 self.n_steps = settings.n_steps 83 84 def save(self, output): 85 _sp = self.particulator 86 cell_id = 0 87 output["r_bins_values"].append( 88 _sp.products["Particles Wet Size Spectrum"].get() 89 ) 90 volume = _sp.attributes["volume"].to_ndarray() 91 output["r"].append(self.formulae.trivia.radius(volume=volume)) 92 output["S"].append(_sp.environment["RH"][cell_id] - 1) 93 output["t"].append(_sp.products["t"].get()) 94 for key in ("water_vapour_mixing_ratio", "T", "z"): 95 output[key].append(_sp.environment[key][cell_id]) 96 for key in ( 97 "dt_cond_max", 98 "dt_cond_min", 99 "ripening rate", 100 "r_mean_gt_1_um", 101 "r_act", 102 ): 103 output[key].append(_sp.products[key].get()[cell_id].copy()) 104 105 def run(self): 106 output = { 107 key: [] 108 for key in ( 109 "r", 110 "S", 111 "z", 112 "t", 113 "water_vapour_mixing_ratio", 114 "T", 115 "r_bins_values", 116 "dt_cond_max", 117 "dt_cond_min", 118 "ripening rate", 119 "r_mean_gt_1_um", 120 "r_act", 121 ) 122 } 123 124 self.save(output) 125 for _ in range(self.n_steps): 126 self.particulator.run(self.n_substeps) 127 self.save(output) 128 return output
Simulation(settings, backend=<class 'PySDM.backends.numba.Numba'>)
13 def __init__(self, settings, backend=CPU): 14 dt_output = ( 15 settings.total_time / settings.n_steps 16 ) # TODO #334 overwritten in notebook 17 self.n_substeps = 1 # TODO #334 use condensation substeps 18 while dt_output / self.n_substeps >= settings.dt_max: 19 self.n_substeps += 1 20 self.formulae = Formulae( 21 condensation_coordinate=settings.coord, 22 saturation_vapour_pressure="AugustRocheMagnus", 23 ) 24 self.bins_edges = self.formulae.trivia.volume(settings.r_bins_edges) 25 26 env = Parcel( 27 dt=dt_output / self.n_substeps, 28 mass_of_dry_air=settings.mass_of_dry_air, 29 p0=settings.p0, 30 initial_water_vapour_mixing_ratio=self.formulae.constants.eps 31 / ( 32 settings.p0 33 / settings.RH0 34 / self.formulae.saturation_vapour_pressure.pvs_water(settings.T0) 35 - 1 36 ), 37 T0=settings.T0, 38 w=settings.w, 39 z0=settings.z0, 40 ) 41 builder = Builder( 42 backend=backend( 43 formulae=self.formulae, override_jit_flags={"parallel": False} 44 ), 45 n_sd=settings.n_sd, 46 environment=env, 47 ) 48 49 environment = builder.particulator.environment 50 builder.add_dynamic(AmbientThermodynamics()) 51 condensation = Condensation( 52 adaptive=settings.adaptive, 53 rtol_x=settings.rtol_x, 54 rtol_thd=settings.rtol_thd, 55 dt_cond_range=settings.dt_cond_range, 56 ) 57 builder.add_dynamic(condensation) 58 59 products = [ 60 PySDM_products.ParticleSizeSpectrumPerVolume( 61 name="Particles Wet Size Spectrum", 62 radius_bins_edges=settings.r_bins_edges, 63 ), 64 PySDM_products.CondensationTimestepMin(name="dt_cond_min"), 65 PySDM_products.CondensationTimestepMax(name="dt_cond_max"), 66 PySDM_products.RipeningRate(), 67 PySDM_products.MeanRadius( 68 name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf) 69 ), 70 PySDM_products.ActivatedMeanRadius( 71 name="r_act", count_activated=True, count_unactivated=False 72 ), 73 PySDM_products.Time(name="t"), 74 ] 75 76 attributes = environment.init_attributes( 77 n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry 78 ) 79 80 self.particulator = builder.build(attributes, products) 81 82 self.n_steps = settings.n_steps
def
save(self, output):
84 def save(self, output): 85 _sp = self.particulator 86 cell_id = 0 87 output["r_bins_values"].append( 88 _sp.products["Particles Wet Size Spectrum"].get() 89 ) 90 volume = _sp.attributes["volume"].to_ndarray() 91 output["r"].append(self.formulae.trivia.radius(volume=volume)) 92 output["S"].append(_sp.environment["RH"][cell_id] - 1) 93 output["t"].append(_sp.products["t"].get()) 94 for key in ("water_vapour_mixing_ratio", "T", "z"): 95 output[key].append(_sp.environment[key][cell_id]) 96 for key in ( 97 "dt_cond_max", 98 "dt_cond_min", 99 "ripening rate", 100 "r_mean_gt_1_um", 101 "r_act", 102 ): 103 output[key].append(_sp.products[key].get()[cell_id].copy())
def
run(self):
105 def run(self): 106 output = { 107 key: [] 108 for key in ( 109 "r", 110 "S", 111 "z", 112 "t", 113 "water_vapour_mixing_ratio", 114 "T", 115 "r_bins_values", 116 "dt_cond_max", 117 "dt_cond_min", 118 "ripening rate", 119 "r_mean_gt_1_um", 120 "r_act", 121 ) 122 } 123 124 self.save(output) 125 for _ in range(self.n_steps): 126 self.particulator.run(self.n_substeps) 127 self.save(output) 128 return output