def run(self): logger = logging.getLogger() logger.info("Clock %d Atom %s adsorb at (%d,%d,%d). " % (Context.getEnv().now, self.id, self.position.x, self.position.y, self.position.z)) while True: try: yield self.request break except simpy.Interrupt as i: (reason, info) = i.cause if reason == 'Stop': self.status = 'Stop' elif reason == 'Freeze': self.status = 'Freeze' self.info = info else: raise ValueError('Unknown interruption! ') while True: while True: if self.status == 'Active': try: yield Context.getEnv().timeout(1) logger.debug("Atom %s at Site (%d,%d,%d) check. " % (self.id, self.position.x, self.position.y, self.position.z)) break except simpy.Interrupt as i: (reason, info) = i.cause if reason == 'Stop': self.status = 'Stop' elif reason == 'Freeze': self.status = 'Freeze' self.info = info else: raise ValueError('Impossible interruption reason! ') except Exception, e: logger.error("Atom %s at Site (%d,%d,%d) impossible interruption type. " % (self.id, self.position.x, self.position.y, self.position.k), exc_info=True) raise(e) elif self.status == 'Freeze': wait_for = self.info try: yield wait_for.reactivate self.status = 'Active' logger.debug('Atom %s at Site (%d,%d,%d) reactivated. % (self.id, self.position.x, self.position.y, self.position.k)') except simpy.Interrupt as i: (reason, info) = i.cause if reason == 'Stop': self.status = 'Stop' else: raise ValueError('Impossible interruption reason! ') except Exception, e: logger.error("Atom %s at Site (%d,%d,%d) impossible interruption type. " % (self.id, self.position.x, self.position.y, self.position.k), exc_info=True) raise(e)
def __init__(self, id, position): super(Atom, self).__init__(id, position) self.process = Context.getEnv().process(self.run()) Context.addAtom(self) self.request = Context.getField().requestSite(position) Context.getField().setSiteAtom(position, self) # deactivate the atom underneath self.deactivate()
def __init__(self, id, position): self.id = id self.position = position self.status = 'Active' self.reactivate = Context.getEnv().event()
logger.error("Atom %s at Site (%d,%d,%d) impossible interruption type. " % (self.id, self.position.x, self.position.y, self.position.k), exc_info=True) raise(e) elif self.status == 'Stop': Context.removeAtom(self) self.reactivate.succeed() # reactivate atom underneath logger.debug('Atom %s process terminated' % self.id) return else: raise ValueError('Unknown statues! ') if self.isDesorb(): # evaporation affected only by neighbors self.releaseSite() self.num -= 1 logger.info("Clock %d Atom %s desorb from (%d,%d,%d). " % (Context.getEnv().now, self.id, self.position.x, self.position.y, self.position.z)) self.status = 'Stop' elif self.isDiffuse(): next_position = self.getNextPosition() self.releaseSite() self.request = Context.getField().requestSite(next_position) logger.debug('Atom %s requests to Site (%d,%d,%d). Migration' % (self.id, next_position.x, next_position.y, next_position.z)) logger.info('Clock %d Atom %s diffuse from (%d,%d,%d) to (%d,%d,%d).' % (Context.getEnv().now, self.id, self.position.x, self.position.y, self.position.z, next_position.x, next_position.y, next_position.z)) self.requestSite(next_position) self.reactivate.succeed() self.reactivate = Context.getEnv().event() while True: try: yield self.request break