PySDM_examples.featured.Srivastava_1982.simulation
1import numpy as np 2from PySDM_examples.featured.Srivastava_1982.settings import SimProducts 3 4from PySDM import Particulator, 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( 26 dt=self.settings.dt, 27 dv=self.settings.dv, 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 ) 37 38 particulator = Particulator( 39 n_sd=n_sd, 40 environment=env, 41 dynamics=(self.collision_dynamic,), 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.advance(n_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
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( 27 dt=self.settings.dt, 28 dv=self.settings.dv, 29 backend=self.settings.backend_class( 30 formulae=Formulae( 31 constants={"rho_w": self.settings.rho}, 32 fragmentation_function="ConstantMass", 33 seed=seed, 34 ), 35 double_precision=self.double_precision, 36 ), 37 ) 38 39 particulator = Particulator( 40 n_sd=n_sd, 41 environment=env, 42 dynamics=(self.collision_dynamic,), 43 products=products, 44 attributes={ 45 "multiplicity": np.full(n_sd, self.settings.total_number_0 / n_sd), 46 "volume": np.full( 47 n_sd, 48 self.settings.total_volume / self.settings.total_number_0, 49 ), 50 }, 51 ) 52 return particulator 53 54 def run_convergence_analysis(self, x, seeds): 55 for n_sd in self.settings.n_sds: 56 for seed in seeds: 57 products = ( 58 SuperDropletCountPerGridbox( 59 name=SimProducts.PySDM.super_particle_count.name 60 ), 61 VolumeFirstMoment(name=SimProducts.PySDM.total_volume.name), 62 ZerothMoment(name=SimProducts.PySDM.total_numer.name), 63 ) 64 65 particulator = self.build(n_sd, seed, products) 66 67 for prod in self.settings.prods: 68 self.simulation_res[n_sd][prod][seed] = np.full( 69 self.n_steps + 1, -np.inf 70 ) 71 72 for step in range(len(x)): 73 if step != 0: 74 particulator.advance(n_steps=1) 75 for prod in self.settings.prods: 76 (self.simulation_res[n_sd][prod][seed][step],) = ( 77 particulator.products[prod].get() 78 ) 79 80 np.testing.assert_allclose( 81 actual=self.simulation_res[n_sd][ 82 SimProducts.PySDM.total_volume.name 83 ][seed], 84 desired=self.settings.total_volume, 85 rtol=1e-3, 86 ) 87 88 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( 27 dt=self.settings.dt, 28 dv=self.settings.dv, 29 backend=self.settings.backend_class( 30 formulae=Formulae( 31 constants={"rho_w": self.settings.rho}, 32 fragmentation_function="ConstantMass", 33 seed=seed, 34 ), 35 double_precision=self.double_precision, 36 ), 37 ) 38 39 particulator = Particulator( 40 n_sd=n_sd, 41 environment=env, 42 dynamics=(self.collision_dynamic,), 43 products=products, 44 attributes={ 45 "multiplicity": np.full(n_sd, self.settings.total_number_0 / n_sd), 46 "volume": np.full( 47 n_sd, 48 self.settings.total_volume / self.settings.total_number_0, 49 ), 50 }, 51 ) 52 return particulator
def
run_convergence_analysis(self, x, seeds):
54 def run_convergence_analysis(self, x, seeds): 55 for n_sd in self.settings.n_sds: 56 for seed in seeds: 57 products = ( 58 SuperDropletCountPerGridbox( 59 name=SimProducts.PySDM.super_particle_count.name 60 ), 61 VolumeFirstMoment(name=SimProducts.PySDM.total_volume.name), 62 ZerothMoment(name=SimProducts.PySDM.total_numer.name), 63 ) 64 65 particulator = self.build(n_sd, seed, products) 66 67 for prod in self.settings.prods: 68 self.simulation_res[n_sd][prod][seed] = np.full( 69 self.n_steps + 1, -np.inf 70 ) 71 72 for step in range(len(x)): 73 if step != 0: 74 particulator.advance(n_steps=1) 75 for prod in self.settings.prods: 76 (self.simulation_res[n_sd][prod][seed][step],) = ( 77 particulator.products[prod].get() 78 ) 79 80 np.testing.assert_allclose( 81 actual=self.simulation_res[n_sd][ 82 SimProducts.PySDM.total_volume.name 83 ][seed], 84 desired=self.settings.total_volume, 85 rtol=1e-3, 86 ) 87 88 return self.simulation_res