PySDM_examples.Srivastava_1982.simulation
1import numpy as np 2from PySDM_examples.Srivastava_1982.settings import SimProducts 3 4from PySDM import Builder, Formulae 5from PySDM.environments import Box 6from PySDM.products import SuperDropletCountPerGridbox, VolumeFirstMoment, ZerothMoment 7 8 9class Simulation: 10 def __init__( 11 self, n_steps, settings, collision_dynamic=None, double_precision=True 12 ): 13 self.collision_dynamic = collision_dynamic 14 self.settings = settings 15 self.n_steps = n_steps 16 17 self.double_precision = double_precision 18 19 self.simulation_res = { 20 n_sd: {prod: {} for prod in self.settings.prods} 21 for n_sd in self.settings.n_sds 22 } 23 24 def build(self, n_sd, seed, products): 25 env = Box(dt=self.settings.dt, dv=self.settings.dv) 26 builder = Builder( 27 backend=self.settings.backend_class( 28 formulae=Formulae( 29 constants={"rho_w": self.settings.rho}, 30 fragmentation_function="ConstantMass", 31 seed=seed, 32 ), 33 double_precision=self.double_precision, 34 ), 35 n_sd=n_sd, 36 environment=env, 37 dynamics=(self.collision_dynamic,), 38 ) 39 40 particulator = builder.build( 41 products=products, 42 attributes={ 43 "multiplicity": np.full(n_sd, self.settings.total_number_0 / n_sd), 44 "volume": np.full( 45 n_sd, 46 self.settings.total_volume / self.settings.total_number_0, 47 ), 48 }, 49 ) 50 return particulator 51 52 def run_convergence_analysis(self, x, seeds): 53 for n_sd in self.settings.n_sds: 54 for seed in seeds: 55 products = ( 56 SuperDropletCountPerGridbox( 57 name=SimProducts.PySDM.super_particle_count.name 58 ), 59 VolumeFirstMoment(name=SimProducts.PySDM.total_volume.name), 60 ZerothMoment(name=SimProducts.PySDM.total_numer.name), 61 ) 62 63 particulator = self.build(n_sd, seed, products) 64 65 for prod in self.settings.prods: 66 self.simulation_res[n_sd][prod][seed] = np.full( 67 self.n_steps + 1, -np.inf 68 ) 69 70 for step in range(len(x)): 71 if step != 0: 72 particulator.run(steps=1) 73 for prod in self.settings.prods: 74 (self.simulation_res[n_sd][prod][seed][step],) = ( 75 particulator.products[prod].get() 76 ) 77 78 np.testing.assert_allclose( 79 actual=self.simulation_res[n_sd][ 80 SimProducts.PySDM.total_volume.name 81 ][seed], 82 desired=self.settings.total_volume, 83 rtol=1e-3, 84 ) 85 86 return self.simulation_res
class
Simulation:
10class Simulation: 11 def __init__( 12 self, n_steps, settings, collision_dynamic=None, double_precision=True 13 ): 14 self.collision_dynamic = collision_dynamic 15 self.settings = settings 16 self.n_steps = n_steps 17 18 self.double_precision = double_precision 19 20 self.simulation_res = { 21 n_sd: {prod: {} for prod in self.settings.prods} 22 for n_sd in self.settings.n_sds 23 } 24 25 def build(self, n_sd, seed, products): 26 env = Box(dt=self.settings.dt, dv=self.settings.dv) 27 builder = Builder( 28 backend=self.settings.backend_class( 29 formulae=Formulae( 30 constants={"rho_w": self.settings.rho}, 31 fragmentation_function="ConstantMass", 32 seed=seed, 33 ), 34 double_precision=self.double_precision, 35 ), 36 n_sd=n_sd, 37 environment=env, 38 dynamics=(self.collision_dynamic,), 39 ) 40 41 particulator = builder.build( 42 products=products, 43 attributes={ 44 "multiplicity": np.full(n_sd, self.settings.total_number_0 / n_sd), 45 "volume": np.full( 46 n_sd, 47 self.settings.total_volume / self.settings.total_number_0, 48 ), 49 }, 50 ) 51 return particulator 52 53 def run_convergence_analysis(self, x, seeds): 54 for n_sd in self.settings.n_sds: 55 for seed in seeds: 56 products = ( 57 SuperDropletCountPerGridbox( 58 name=SimProducts.PySDM.super_particle_count.name 59 ), 60 VolumeFirstMoment(name=SimProducts.PySDM.total_volume.name), 61 ZerothMoment(name=SimProducts.PySDM.total_numer.name), 62 ) 63 64 particulator = self.build(n_sd, seed, products) 65 66 for prod in self.settings.prods: 67 self.simulation_res[n_sd][prod][seed] = np.full( 68 self.n_steps + 1, -np.inf 69 ) 70 71 for step in range(len(x)): 72 if step != 0: 73 particulator.run(steps=1) 74 for prod in self.settings.prods: 75 (self.simulation_res[n_sd][prod][seed][step],) = ( 76 particulator.products[prod].get() 77 ) 78 79 np.testing.assert_allclose( 80 actual=self.simulation_res[n_sd][ 81 SimProducts.PySDM.total_volume.name 82 ][seed], 83 desired=self.settings.total_volume, 84 rtol=1e-3, 85 ) 86 87 return self.simulation_res
Simulation(n_steps, settings, collision_dynamic=None, double_precision=True)
11 def __init__( 12 self, n_steps, settings, collision_dynamic=None, double_precision=True 13 ): 14 self.collision_dynamic = collision_dynamic 15 self.settings = settings 16 self.n_steps = n_steps 17 18 self.double_precision = double_precision 19 20 self.simulation_res = { 21 n_sd: {prod: {} for prod in self.settings.prods} 22 for n_sd in self.settings.n_sds 23 }
def
build(self, n_sd, seed, products):
25 def build(self, n_sd, seed, products): 26 env = Box(dt=self.settings.dt, dv=self.settings.dv) 27 builder = Builder( 28 backend=self.settings.backend_class( 29 formulae=Formulae( 30 constants={"rho_w": self.settings.rho}, 31 fragmentation_function="ConstantMass", 32 seed=seed, 33 ), 34 double_precision=self.double_precision, 35 ), 36 n_sd=n_sd, 37 environment=env, 38 dynamics=(self.collision_dynamic,), 39 ) 40 41 particulator = builder.build( 42 products=products, 43 attributes={ 44 "multiplicity": np.full(n_sd, self.settings.total_number_0 / n_sd), 45 "volume": np.full( 46 n_sd, 47 self.settings.total_volume / self.settings.total_number_0, 48 ), 49 }, 50 ) 51 return particulator
def
run_convergence_analysis(self, x, seeds):
53 def run_convergence_analysis(self, x, seeds): 54 for n_sd in self.settings.n_sds: 55 for seed in seeds: 56 products = ( 57 SuperDropletCountPerGridbox( 58 name=SimProducts.PySDM.super_particle_count.name 59 ), 60 VolumeFirstMoment(name=SimProducts.PySDM.total_volume.name), 61 ZerothMoment(name=SimProducts.PySDM.total_numer.name), 62 ) 63 64 particulator = self.build(n_sd, seed, products) 65 66 for prod in self.settings.prods: 67 self.simulation_res[n_sd][prod][seed] = np.full( 68 self.n_steps + 1, -np.inf 69 ) 70 71 for step in range(len(x)): 72 if step != 0: 73 particulator.run(steps=1) 74 for prod in self.settings.prods: 75 (self.simulation_res[n_sd][prod][seed][step],) = ( 76 particulator.products[prod].get() 77 ) 78 79 np.testing.assert_allclose( 80 actual=self.simulation_res[n_sd][ 81 SimProducts.PySDM.total_volume.name 82 ][seed], 83 desired=self.settings.total_volume, 84 rtol=1e-3, 85 ) 86 87 return self.simulation_res