Beispiel #1
0
    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)
Beispiel #2
0
 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()
Beispiel #3
0
 def __init__(self, id, position):
     self.id = id
     self.position = position
     self.status = 'Active'
     self.reactivate = Context.getEnv().event()
Beispiel #4
0
                        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