PySDM_examples.Yang_et_al_2018.simulation
1import numpy as np 2 3import PySDM.products as PySDM_products 4from PySDM import Formulae, Particulator 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 diffusion_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_relative_humidity=settings.RH0, 30 T0=settings.T0, 31 w=settings.w, 32 z0=settings.z0, 33 backend=backend( 34 formulae=self.formulae, override_jit_flags={"parallel": False} 35 ), 36 ) 37 38 condensation = Condensation( 39 adaptive=settings.adaptive, 40 rtol_x=settings.rtol_x, 41 rtol_thd=settings.rtol_thd, 42 dt_cond_range=settings.dt_cond_range, 43 ) 44 45 products = [ 46 PySDM_products.ParticleSizeSpectrumPerVolume( 47 name="Particles Wet Size Spectrum", 48 radius_bins_edges=settings.r_bins_edges, 49 ), 50 PySDM_products.CondensationTimestepMin(name="dt_cond_min"), 51 PySDM_products.CondensationTimestepMax(name="dt_cond_max"), 52 PySDM_products.RipeningRate(), 53 PySDM_products.MeanRadius( 54 name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf) 55 ), 56 PySDM_products.ActivatedMeanRadius( 57 name="r_act", count_activated=True, count_unactivated=False 58 ), 59 PySDM_products.Time(name="t"), 60 ] 61 62 attributes = env.init_attributes( 63 n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry 64 ) 65 66 self.particulator = Particulator( 67 attributes=attributes, 68 products=products, 69 n_sd=settings.n_sd, 70 environment=env, 71 dynamics=( 72 AmbientThermodynamics(), 73 condensation, 74 ), 75 ) 76 77 self.n_steps = settings.n_steps 78 79 def save(self, output): 80 _sp = self.particulator 81 cell_id = 0 82 output["r_bins_values"].append( 83 (_sp.products["Particles Wet Size Spectrum"].get()).T 84 ) 85 volume = _sp.attributes["volume"].to_ndarray() 86 output["r"].append((self.formulae.trivia.radius(volume=volume)).T) 87 output["S"].append(_sp.environment["RH"][cell_id] - 1) 88 output["t"].append(_sp.products["t"].get()) 89 for key in ("water_vapour_mixing_ratio", "T", "z"): 90 output[key].append(_sp.environment[key][cell_id]) 91 for key in ( 92 "dt_cond_max", 93 "dt_cond_min", 94 "ripening rate", 95 "r_mean_gt_1_um", 96 "r_act", 97 ): 98 output[key].append(_sp.products[key].get()[cell_id].copy()) 99 100 def run(self): 101 output = { 102 key: [] 103 for key in ( 104 "r", 105 "S", 106 "z", 107 "t", 108 "water_vapour_mixing_ratio", 109 "T", 110 "r_bins_values", 111 "dt_cond_max", 112 "dt_cond_min", 113 "ripening rate", 114 "r_mean_gt_1_um", 115 "r_act", 116 ) 117 } 118 119 self.save(output) 120 for _ in range(self.n_steps): 121 self.particulator.run(self.n_substeps) 122 self.save(output) 123 for k, v in output.items(): 124 output[k] = np.asarray(v) 125 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 diffusion_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_relative_humidity=settings.RH0, 31 T0=settings.T0, 32 w=settings.w, 33 z0=settings.z0, 34 backend=backend( 35 formulae=self.formulae, override_jit_flags={"parallel": False} 36 ), 37 ) 38 39 condensation = Condensation( 40 adaptive=settings.adaptive, 41 rtol_x=settings.rtol_x, 42 rtol_thd=settings.rtol_thd, 43 dt_cond_range=settings.dt_cond_range, 44 ) 45 46 products = [ 47 PySDM_products.ParticleSizeSpectrumPerVolume( 48 name="Particles Wet Size Spectrum", 49 radius_bins_edges=settings.r_bins_edges, 50 ), 51 PySDM_products.CondensationTimestepMin(name="dt_cond_min"), 52 PySDM_products.CondensationTimestepMax(name="dt_cond_max"), 53 PySDM_products.RipeningRate(), 54 PySDM_products.MeanRadius( 55 name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf) 56 ), 57 PySDM_products.ActivatedMeanRadius( 58 name="r_act", count_activated=True, count_unactivated=False 59 ), 60 PySDM_products.Time(name="t"), 61 ] 62 63 attributes = env.init_attributes( 64 n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry 65 ) 66 67 self.particulator = Particulator( 68 attributes=attributes, 69 products=products, 70 n_sd=settings.n_sd, 71 environment=env, 72 dynamics=( 73 AmbientThermodynamics(), 74 condensation, 75 ), 76 ) 77 78 self.n_steps = settings.n_steps 79 80 def save(self, output): 81 _sp = self.particulator 82 cell_id = 0 83 output["r_bins_values"].append( 84 (_sp.products["Particles Wet Size Spectrum"].get()).T 85 ) 86 volume = _sp.attributes["volume"].to_ndarray() 87 output["r"].append((self.formulae.trivia.radius(volume=volume)).T) 88 output["S"].append(_sp.environment["RH"][cell_id] - 1) 89 output["t"].append(_sp.products["t"].get()) 90 for key in ("water_vapour_mixing_ratio", "T", "z"): 91 output[key].append(_sp.environment[key][cell_id]) 92 for key in ( 93 "dt_cond_max", 94 "dt_cond_min", 95 "ripening rate", 96 "r_mean_gt_1_um", 97 "r_act", 98 ): 99 output[key].append(_sp.products[key].get()[cell_id].copy()) 100 101 def run(self): 102 output = { 103 key: [] 104 for key in ( 105 "r", 106 "S", 107 "z", 108 "t", 109 "water_vapour_mixing_ratio", 110 "T", 111 "r_bins_values", 112 "dt_cond_max", 113 "dt_cond_min", 114 "ripening rate", 115 "r_mean_gt_1_um", 116 "r_act", 117 ) 118 } 119 120 self.save(output) 121 for _ in range(self.n_steps): 122 self.particulator.run(self.n_substeps) 123 self.save(output) 124 for k, v in output.items(): 125 output[k] = np.asarray(v) 126 return output
Simulation( settings, backend=functools.partial(<function _cached_backend>, backend_class=<class 'PySDM.backends.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 diffusion_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_relative_humidity=settings.RH0, 31 T0=settings.T0, 32 w=settings.w, 33 z0=settings.z0, 34 backend=backend( 35 formulae=self.formulae, override_jit_flags={"parallel": False} 36 ), 37 ) 38 39 condensation = Condensation( 40 adaptive=settings.adaptive, 41 rtol_x=settings.rtol_x, 42 rtol_thd=settings.rtol_thd, 43 dt_cond_range=settings.dt_cond_range, 44 ) 45 46 products = [ 47 PySDM_products.ParticleSizeSpectrumPerVolume( 48 name="Particles Wet Size Spectrum", 49 radius_bins_edges=settings.r_bins_edges, 50 ), 51 PySDM_products.CondensationTimestepMin(name="dt_cond_min"), 52 PySDM_products.CondensationTimestepMax(name="dt_cond_max"), 53 PySDM_products.RipeningRate(), 54 PySDM_products.MeanRadius( 55 name="r_mean_gt_1_um", radius_range=(1 * si.um, np.inf) 56 ), 57 PySDM_products.ActivatedMeanRadius( 58 name="r_act", count_activated=True, count_unactivated=False 59 ), 60 PySDM_products.Time(name="t"), 61 ] 62 63 attributes = env.init_attributes( 64 n_in_dv=settings.n, kappa=settings.kappa, r_dry=settings.r_dry 65 ) 66 67 self.particulator = Particulator( 68 attributes=attributes, 69 products=products, 70 n_sd=settings.n_sd, 71 environment=env, 72 dynamics=( 73 AmbientThermodynamics(), 74 condensation, 75 ), 76 ) 77 78 self.n_steps = settings.n_steps
def
save(self, output):
80 def save(self, output): 81 _sp = self.particulator 82 cell_id = 0 83 output["r_bins_values"].append( 84 (_sp.products["Particles Wet Size Spectrum"].get()).T 85 ) 86 volume = _sp.attributes["volume"].to_ndarray() 87 output["r"].append((self.formulae.trivia.radius(volume=volume)).T) 88 output["S"].append(_sp.environment["RH"][cell_id] - 1) 89 output["t"].append(_sp.products["t"].get()) 90 for key in ("water_vapour_mixing_ratio", "T", "z"): 91 output[key].append(_sp.environment[key][cell_id]) 92 for key in ( 93 "dt_cond_max", 94 "dt_cond_min", 95 "ripening rate", 96 "r_mean_gt_1_um", 97 "r_act", 98 ): 99 output[key].append(_sp.products[key].get()[cell_id].copy())
def
run(self):
101 def run(self): 102 output = { 103 key: [] 104 for key in ( 105 "r", 106 "S", 107 "z", 108 "t", 109 "water_vapour_mixing_ratio", 110 "T", 111 "r_bins_values", 112 "dt_cond_max", 113 "dt_cond_min", 114 "ripening rate", 115 "r_mean_gt_1_um", 116 "r_act", 117 ) 118 } 119 120 self.save(output) 121 for _ in range(self.n_steps): 122 self.particulator.run(self.n_substeps) 123 self.save(output) 124 for k, v in output.items(): 125 output[k] = np.asarray(v) 126 return output