Source code for pysph.tools.sph_evaluator

"""A convenience class that combines an AccelerationEval and an SPHCompiler to
allow a user to specify particle arrays, equations, an optional domain and
kernel to produce an SPH evaluation.

This is handy for post-processing.

"""

from pysph.base.kernels import Gaussian
from pysph.base.nnps import LinkedListNNPS as NNPS
from pysph.sph.acceleration_eval import AccelerationEval
from pysph.sph.sph_compiler import SPHCompiler


[docs]class SPHEvaluator(object): def __init__(self, arrays, equations, dim, kernel=None, domain_manager=None, backend=None, nnps_factory=NNPS): """Constructor. Parameters ---------- arrays: list(ParticleArray) equations: list dim: int kernel: kernel instance. domain_manager: DomainManager backend: str: indicates the backend to use. one of ('opencl', 'cython', '', None) nnps_factory: A factory that creates an NNPSBase instance. """ self.arrays = arrays self.equations = equations self.domain_manager = domain_manager self.dim = dim if kernel is None: self.kernel = Gaussian(dim=dim) else: self.kernel = kernel self.nnps_factory = nnps_factory self.backend = backend self.func_eval = AccelerationEval(arrays, equations, self.kernel, backend=backend) compiler = SPHCompiler(self.func_eval, None) compiler.compile() self._create_nnps(arrays)
[docs] def evaluate(self, t=0.0, dt=0.1): """Evalute the SPH equations, dummy t and dt values can be passed. """ self.func_eval.compute(t, dt)
[docs] def update(self, update_domain=True): """Update the NNPS when particles have moved. If the update_domain is False, the domain is not updated. Use this when the arrays are the same but the particles have themselves changed. If the particle arrays themselves change use the `update_particle_arrays` method instead. """ if update_domain: self.nnps.update_domain() self.nnps.update()
[docs] def update_particle_arrays(self, arrays): """Call this for a new set of particle arrays which have the same properties as before. For example, if you are reading the particle array data from files, each time you load a new file a new particle array is read with the same properties. Call this function to reset the arrays. """ self._create_nnps(arrays) self.func_eval.update_particle_arrays(arrays)
# Private protocol ################################################### def _create_nnps(self, arrays): self.nnps = self.nnps_factory( dim=self.kernel.dim, particles=arrays, radius_scale=self.kernel.radius_scale, domain=self.domain_manager, cache=True ) self.func_eval.set_nnps(self.nnps)