def getNumNeighbors(self): num_neighbors = 0 positions = Position.getNeighborPositions(self.position) for position in positions: if Context.getField().isSiteOccupied(position): num_neighbors += 1 return num_neighbors
def getNextPosition(self): # Diffusion is one-way down. positions = Position.getSameHeightNeighborPositions(self.position) unoccupied_positions = [] for position in positions: if not Context.getField().isSiteOccupied(position): unoccupied_positions.append(position) if len(unoccupied_positions) == 0: return self.position rn = random.randint(0, len(unoccupied_positions)-1) position = unoccupied_positions[rn] return Context.getField().getLowestUnoccupiedPosition(position.x, position.y)
def deactivate(self): if self.position.z == 0: return # only deactivate atom underneath atom = Context.getField().getSiteAtom(Position.getDownPosition(self.position)) atom.process.interrupt(('Freeze', self))