PySDM_examples.Shima_et_al_2009.example
1import os 2from typing import Optional 3 4import numpy as np 5from PySDM_examples.Shima_et_al_2009.settings import Settings 6from PySDM_examples.Shima_et_al_2009.spectrum_plotter import SpectrumPlotter 7 8from PySDM.backends import CPU 9from PySDM.builder import Builder 10from PySDM.dynamics import Coalescence 11from PySDM.environments import Box 12from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity 13from PySDM.products import ParticleVolumeVersusRadiusLogarithmSpectrum, WallTime 14 15 16def run(settings, backend=CPU, observers=()): 17 env = Box(dv=settings.dv, dt=settings.dt) 18 builder = Builder( 19 n_sd=settings.n_sd, 20 backend=backend(formulae=settings.formulae), 21 environment=env, 22 dynamics=( 23 Coalescence(collision_kernel=settings.kernel, adaptive=settings.adaptive), 24 ), 25 ) 26 attributes = {} 27 sampling = ConstantMultiplicity(settings.spectrum) 28 attributes["volume"], attributes["multiplicity"] = sampling.sample_deterministic( 29 settings.n_sd 30 ) 31 products = ( 32 ParticleVolumeVersusRadiusLogarithmSpectrum( 33 settings.radius_bins_edges, name="dv/dlnr" 34 ), 35 WallTime(), 36 ) 37 particulator = builder.build(attributes, products) 38 39 for observer in observers: 40 particulator.observers.append(observer) 41 42 vals = {} 43 particulator.products["wall time"].reset() 44 for step in settings.output_steps: 45 particulator.run(step - particulator.n_steps) 46 vals[step] = particulator.products["dv/dlnr"].get()[0] 47 vals[step][:] *= settings.rho 48 49 exec_time = particulator.products["wall time"].get() 50 return vals, exec_time 51 52 53def main(plot: bool, save: Optional[str]): 54 with np.errstate(all="raise"): 55 settings = Settings() 56 57 settings.n_sd = 2**15 58 59 states, _ = run(settings) 60 61 with np.errstate(invalid="ignore"): 62 plotter = SpectrumPlotter(settings) 63 plotter.smooth = True 64 for step, vals in states.items(): 65 _ = plotter.plot(vals, step * settings.dt) 66 # assert _ < 200 # TODO #327 67 if save is not None: 68 n_sd = settings.n_sd 69 plotter.save(save + "/" + f"{n_sd}_shima_fig_2" + "." + plotter.format) 70 if plot: 71 plotter.show() 72 73 74if __name__ == "__main__": 75 main(plot="CI" not in os.environ, save=None)
def
run( settings, backend=functools.partial(<function _cached_backend>, backend_class=<class 'PySDM.backends.Numba'>), observers=()):
17def run(settings, backend=CPU, observers=()): 18 env = Box(dv=settings.dv, dt=settings.dt) 19 builder = Builder( 20 n_sd=settings.n_sd, 21 backend=backend(formulae=settings.formulae), 22 environment=env, 23 dynamics=( 24 Coalescence(collision_kernel=settings.kernel, adaptive=settings.adaptive), 25 ), 26 ) 27 attributes = {} 28 sampling = ConstantMultiplicity(settings.spectrum) 29 attributes["volume"], attributes["multiplicity"] = sampling.sample_deterministic( 30 settings.n_sd 31 ) 32 products = ( 33 ParticleVolumeVersusRadiusLogarithmSpectrum( 34 settings.radius_bins_edges, name="dv/dlnr" 35 ), 36 WallTime(), 37 ) 38 particulator = builder.build(attributes, products) 39 40 for observer in observers: 41 particulator.observers.append(observer) 42 43 vals = {} 44 particulator.products["wall time"].reset() 45 for step in settings.output_steps: 46 particulator.run(step - particulator.n_steps) 47 vals[step] = particulator.products["dv/dlnr"].get()[0] 48 vals[step][:] *= settings.rho 49 50 exec_time = particulator.products["wall time"].get() 51 return vals, exec_time
def
main(plot: bool, save: Optional[str]):
54def main(plot: bool, save: Optional[str]): 55 with np.errstate(all="raise"): 56 settings = Settings() 57 58 settings.n_sd = 2**15 59 60 states, _ = run(settings) 61 62 with np.errstate(invalid="ignore"): 63 plotter = SpectrumPlotter(settings) 64 plotter.smooth = True 65 for step, vals in states.items(): 66 _ = plotter.plot(vals, step * settings.dt) 67 # assert _ < 200 # TODO #327 68 if save is not None: 69 n_sd = settings.n_sd 70 plotter.save(save + "/" + f"{n_sd}_shima_fig_2" + "." + plotter.format) 71 if plot: 72 plotter.show()