def run(self): """Runs the model indefinitely. To control the simulations, model must have been initialized with proper Queues.""" if not base.is_allocated(): self.reset() while True: for _ in xrange(50000): proclist.do_kmc_step() if self.autosend and not self.image_queue.full(): atoms = self.get_atoms() # attach other quantities need to plot # to the atoms object and let it travel # piggy-back through the queue atoms.size = self.size self.image_queue.put(atoms) if not self.signal_queue.empty(): signal = self.signal_queue.get() if signal.upper() == 'STOP': self.deallocate() break elif signal.upper() == 'PAUSE': print('starting pause') elif signal.upper() == 'RESET_TIME': base.set_kmc_time(0.0) elif signal.upper() == 'START': pass elif signal.upper() == 'ATOMS': self.image_queue.put(self.get_atoms()) elif signal.upper() == 'DOUBLE': self.double() elif signal.upper() == 'HALVE': self.halve() elif signal.upper() == 'SWITCH_SURFACE_PROCESSES_OFF': self.switch_surface_processes_off() elif signal.upper() == 'SWITCH_SURFACE_PROCESSES_ON': self.switch_surface_processes_on() elif signal.upper() == 'TERMINATE': self.deallocate() self.terminate() elif signal.upper() == 'JOIN': self.join() if not self.parameter_queue.empty(): while not self.parameter_queue.empty(): parameters = self.parameter_queue.get() settings.parameters.update(parameters) set_rate_constants(parameters, self.print_rates)
def do_steps(self, n=10000): """Propagate the model `n` steps.""" for _ in xrange(n): proclist.do_kmc_step()