PySDM_examples.featured.deJong_Mackay_et_al_2023.simulation1D
1import numpy as np 2from PySDM_examples.featured.Shipway_and_Hill_2012.simulation import ( 3 Simulation as SimulationSH, 4) 5 6import PySDM.products as PySDM_products 7from PySDM.dynamics import Collision 8from PySDM.dynamics.collisions.collision_kernels import Geometric 9from PySDM.physics import si 10 11 12class Simulation1D(SimulationSH): 13 def __init__(self, settings): 14 super().__init__(settings) 15 self.output_steps = settings.output_steps 16 17 @staticmethod 18 def add_collision_dynamic(dynamics, settings, products): 19 if settings.breakup: 20 dynamics.append( 21 Collision( 22 collision_kernel=Geometric(collection_efficiency=1), 23 coalescence_efficiency=settings.coalescence_efficiency, 24 breakup_efficiency=settings.breakup_efficiency, 25 fragmentation_function=settings.fragmentation_function, 26 adaptive=settings.coalescence_adaptive, 27 warn_overflows=settings.warn_breakup_overflow, 28 ) 29 ) 30 products.append( 31 PySDM_products.BreakupRateDeficitPerGridbox( 32 name="breakup_deficit", 33 ) 34 ) 35 products.append( 36 PySDM_products.BreakupRatePerGridbox( 37 name="breakup_rate", 38 ) 39 ) 40 else: 41 SimulationSH.add_collision_dynamic(dynamics, settings, products) 42 43 radius_bins_edges = np.logspace( 44 np.log10(0.01 * si.um), np.log10(5000 * si.um), num=101, endpoint=True 45 ) 46 products.append( 47 PySDM_products.NumberSizeSpectrum( 48 name="N(v)", radius_bins_edges=radius_bins_edges 49 ) 50 ) 51 products.append( 52 PySDM_products.ParticleVolumeVersusRadiusLogarithmSpectrum( 53 name="dvdlnr", radius_bins_edges=radius_bins_edges 54 ) 55 ) 56 57 def save(self, step): 58 if step in self.output_steps: 59 super().save(step) 60 61 def run(self): 62 result = super().run() 63 for key, val in result.products.items(): 64 if len(val.shape) == 2: 65 result.products[key] = val[:, self.output_steps] 66 elif len(val.shape) == 3: 67 result.products[key] = val[:, :, :] 68 result.products["t"] = result.products["t"][self.output_steps] 69 return result
13class Simulation1D(SimulationSH): 14 def __init__(self, settings): 15 super().__init__(settings) 16 self.output_steps = settings.output_steps 17 18 @staticmethod 19 def add_collision_dynamic(dynamics, settings, products): 20 if settings.breakup: 21 dynamics.append( 22 Collision( 23 collision_kernel=Geometric(collection_efficiency=1), 24 coalescence_efficiency=settings.coalescence_efficiency, 25 breakup_efficiency=settings.breakup_efficiency, 26 fragmentation_function=settings.fragmentation_function, 27 adaptive=settings.coalescence_adaptive, 28 warn_overflows=settings.warn_breakup_overflow, 29 ) 30 ) 31 products.append( 32 PySDM_products.BreakupRateDeficitPerGridbox( 33 name="breakup_deficit", 34 ) 35 ) 36 products.append( 37 PySDM_products.BreakupRatePerGridbox( 38 name="breakup_rate", 39 ) 40 ) 41 else: 42 SimulationSH.add_collision_dynamic(dynamics, settings, products) 43 44 radius_bins_edges = np.logspace( 45 np.log10(0.01 * si.um), np.log10(5000 * si.um), num=101, endpoint=True 46 ) 47 products.append( 48 PySDM_products.NumberSizeSpectrum( 49 name="N(v)", radius_bins_edges=radius_bins_edges 50 ) 51 ) 52 products.append( 53 PySDM_products.ParticleVolumeVersusRadiusLogarithmSpectrum( 54 name="dvdlnr", radius_bins_edges=radius_bins_edges 55 ) 56 ) 57 58 def save(self, step): 59 if step in self.output_steps: 60 super().save(step) 61 62 def run(self): 63 result = super().run() 64 for key, val in result.products.items(): 65 if len(val.shape) == 2: 66 result.products[key] = val[:, self.output_steps] 67 elif len(val.shape) == 3: 68 result.products[key] = val[:, :, :] 69 result.products["t"] = result.products["t"][self.output_steps] 70 return result
@staticmethod
def
add_collision_dynamic(dynamics, settings, products):
18 @staticmethod 19 def add_collision_dynamic(dynamics, settings, products): 20 if settings.breakup: 21 dynamics.append( 22 Collision( 23 collision_kernel=Geometric(collection_efficiency=1), 24 coalescence_efficiency=settings.coalescence_efficiency, 25 breakup_efficiency=settings.breakup_efficiency, 26 fragmentation_function=settings.fragmentation_function, 27 adaptive=settings.coalescence_adaptive, 28 warn_overflows=settings.warn_breakup_overflow, 29 ) 30 ) 31 products.append( 32 PySDM_products.BreakupRateDeficitPerGridbox( 33 name="breakup_deficit", 34 ) 35 ) 36 products.append( 37 PySDM_products.BreakupRatePerGridbox( 38 name="breakup_rate", 39 ) 40 ) 41 else: 42 SimulationSH.add_collision_dynamic(dynamics, settings, products) 43 44 radius_bins_edges = np.logspace( 45 np.log10(0.01 * si.um), np.log10(5000 * si.um), num=101, endpoint=True 46 ) 47 products.append( 48 PySDM_products.NumberSizeSpectrum( 49 name="N(v)", radius_bins_edges=radius_bins_edges 50 ) 51 ) 52 products.append( 53 PySDM_products.ParticleVolumeVersusRadiusLogarithmSpectrum( 54 name="dvdlnr", radius_bins_edges=radius_bins_edges 55 ) 56 )
def
run(self):
62 def run(self): 63 result = super().run() 64 for key, val in result.products.items(): 65 if len(val.shape) == 2: 66 result.products[key] = val[:, self.output_steps] 67 elif len(val.shape) == 3: 68 result.products[key] = val[:, :, :] 69 result.products["t"] = result.products["t"][self.output_steps] 70 return result