def execute(self, pset, endtime, dt, recovery=None, output_file=None): """Execute this Kernel over a ParticleSet for several timesteps""" def remove_deleted(pset): """Utility to remove all particles that signalled deletion""" indices = [ i for i, p in enumerate(pset.particles) if p.state in [ErrorCode.Delete] ] if len(indices) > 0 and output_file is not None: output_file.write(pset[indices], endtime, deleted_only=True) pset.remove(indices) if recovery is None: recovery = {} recovery_map = recovery_base_map.copy() recovery_map.update(recovery) # Execute the kernel over the particle set if self.ptype.uses_jit: self.execute_jit(pset, endtime, dt) else: self.execute_python(pset, endtime, dt) # Remove all particles that signalled deletion remove_deleted(pset) # Identify particles that threw errors error_particles = [ p for p in pset.particles if p.state != ErrorCode.Success ] while len(error_particles) > 0: # Apply recovery kernel for p in error_particles: if p.state == ErrorCode.Repeat: p.state = ErrorCode.Success else: recovery_kernel = recovery_map[p.state] p.state = ErrorCode.Success recovery_kernel(p, self.fieldset, p.time, dt) # Remove all particles that signalled deletion remove_deleted(pset) # Execute core loop again to continue interrupted particles if self.ptype.uses_jit: self.execute_jit(pset, endtime, dt) else: self.execute_python(pset, endtime, dt) error_particles = [ p for p in pset.particles if p.state != ErrorCode.Success ]
def execute(self, pset, endtime, dt, recovery=None): """Execute this Kernel over a ParticleSet for several timesteps""" def remove_deleted(pset): """Utility to remove all particles that signalled deletion""" indices = [i for i, p in enumerate(pset.particles) if p.state in [ErrorCode.Delete]] pset.remove(indices) if recovery is None: recovery = {} recovery_map = recovery_base_map.copy() recovery_map.update(recovery) # Execute the kernel over the particle set if self.ptype.uses_jit: self.execute_jit(pset, endtime, dt) else: self.execute_python(pset, endtime, dt) # Remove all particles that signalled deletion remove_deleted(pset) # Idenitify particles that threw errors error_particles = [p for p in pset.particles if p.state not in [ErrorCode.Success, ErrorCode.Repeat]] while len(error_particles) > 0: # Apply recovery kernel for p in error_particles: recovery_kernel = recovery_map[p.state] p.state = ErrorCode.Success recovery_kernel(p) # Remove all particles that signalled deletion remove_deleted(pset) # Execute core loop again to continue interrupted particles if self.ptype.uses_jit: self.execute_jit(pset, endtime, dt) else: self.execute_python(pset, endtime, dt) error_particles = [p for p in pset.particles if p.state not in [ErrorCode.Success, ErrorCode.Repeat]]