def _calcInteriorAndExteriorFaceIDs(self): from fipy.variables.faceVariable import FaceVariable mask = MA.getmask(self.faceCellIDs[1]) exteriorFaces = FaceVariable(mesh=self, value=mask) interiorFaces = FaceVariable(mesh=self, value=numerix.logical_not(mask)) return interiorFaces, exteriorFaces
def _calcInteriorAndExteriorFaceIDs(self): from fipy.variables.faceVariable import FaceVariable mask = MA.getmask(self.faceCellIDs[1]) self.exteriorFaces = FaceVariable(mesh=self, value=mask) self.interiorFaces = FaceVariable(mesh=self, value=numerix.logical_not(mask))
def _calcInteriorAndExteriorCellIDs(self): try: import sets self.exteriorCellIDs = sets.Set(self.faceCellIDs[0, self.getExteriorFaces().getValue()]) self.interiorCellIDs = list(sets.Set(range(self.numberOfCells)) - self.exteriorCellIDs) self.exteriorCellIDs = list(self.exteriorCellIDs) except: self.exteriorCellIDs = self.faceCellIDs[0, self.getExteriorFaces().getValue()] tmp = numerix.zeros(self.numberOfCells) numerix.put(tmp, self.exteriorCellIDs, numerix.ones(len(self.exteriorCellIDs))) self.exteriorCellIDs = numerix.nonzero(tmp) self.interiorCellIDs = numerix.nonzero(numerix.logical_not(tmp))
def _calcInteriorAndExteriorCellIDs(self): try: import sys if sys.version_info < (2, 6): from sets import Set as set exteriorCellIDs = set(self.faceCellIDs[0, self._exteriorFaces.value]) interiorCellIDs = list(set(range(self.numberOfCells)) - self._exteriorCellIDs) exteriorCellIDs = list(self._exteriorCellIDs) except: exteriorCellIDs = self.faceCellIDs[0, self._exteriorFaces.value] tmp = numerix.zeros(self.numberOfCells, 'l') numerix.put(tmp, exteriorCellIDs, numerix.ones(len(exteriorCellIDs), 'l')) exteriorCellIDs = numerix.nonzero(tmp) interiorCellIDs = numerix.nonzero(numerix.logical_not(tmp)) return interiorCellIDs, exteriorCellIDs
def _calcDistanceFunction(self, extensionVariable = None, narrowBandWidth = None, deleteIslands = False): if narrowBandWidth == None: narrowBandWidth = self.narrowBandWidth ## calculate interface values cellToCellIDs = self.mesh._getCellToCellIDs() if deleteIslands: adjVals = numerix.take(self.value, cellToCellIDs) adjInterfaceValues = MA.masked_array(adjVals, mask = (adjVals * self.value) > 0) masksum = numerix.sum(numerix.logical_not(MA.getmask(adjInterfaceValues)), 0) tmp = MA.logical_and(masksum == 4, self.value > 0) self.value = MA.where(tmp, -1, self.value) adjVals = numerix.take(self.value, cellToCellIDs) adjInterfaceValues = MA.masked_array(adjVals, mask = (adjVals * self.value) > 0) dAP = self.mesh._getCellToCellDistances() distances = abs(self.value * dAP / (self.value - adjInterfaceValues)) indices = MA.argsort(distances, 0) sign = (self.value > 0) * 2 - 1 s = distances[indices[0], numerix.arange(indices.shape[1])] if self.mesh.getDim() == 2: t = distances[indices[1], numerix.arange(indices.shape[1])] u = distances[indices[2], numerix.arange(indices.shape[1])] if indices.shape[1] > 0: ns = self.cellNormals[..., indices[0], numerix.arange(indices.shape[1])] nt = self.cellNormals[..., indices[1], numerix.arange(indices.shape[1])] else: ns = MA.zeros(self.cellNormals.shape[:-1] + (0,)) nt = MA.zeros(self.cellNormals.shape[:-1] + (0,)) signedDistance = MA.where(MA.getmask(s), self.value, MA.where(MA.getmask(t), sign * s, MA.where(abs(numerix.dot(ns,nt)) < 0.9, sign * s * t / MA.sqrt(s**2 + t**2), MA.where(MA.getmask(u), sign * s, sign * s * u / MA.sqrt(s**2 + u**2) ) ) ) ) else: signedDistance = MA.where(MA.getmask(s), self.value, sign * s) self.value = signedDistance ## calculate interface flag masksum = numerix.sum(numerix.logical_not(MA.getmask(distances)), 0) interfaceFlag = (masksum > 0).astype('l') ## spread the extensionVariable to the whole interface flag = True if extensionVariable is None: extensionVariable = numerix.zeros(self.mesh.getNumberOfCells(), 'd') flag = False ext = numerix.zeros(self.mesh.getNumberOfCells(), 'd') positiveInterfaceFlag = numerix.where(self.value > 0, interfaceFlag, 0) negativeInterfaceIDs = numerix.nonzero(numerix.where(self.value < 0, interfaceFlag, 0))[0] for id in negativeInterfaceIDs: tmp, extensionVariable[...,id] = self._calcTrialValue(id, positiveInterfaceFlag, extensionVariable) if flag: self.value = self.tmpValue.copy() ## evaluate the trialIDs adjInterfaceFlag = numerix.take(interfaceFlag, cellToCellIDs) hasAdjInterface = (numerix.sum(MA.filled(adjInterfaceFlag, 0), 0) > 0).astype('l') trialFlag = numerix.logical_and(numerix.logical_not(interfaceFlag), hasAdjInterface).astype('l') trialIDs = list(numerix.nonzero(trialFlag)[0]) evaluatedFlag = interfaceFlag for id in trialIDs: self.value[...,id], extensionVariable[id] = self._calcTrialValue(id, evaluatedFlag, extensionVariable) while len(trialIDs): id = trialIDs[numerix.argmin(abs(numerix.take(self.value, trialIDs)))] if abs(self.value[...,id]) > narrowBandWidth / 2: break trialIDs.remove(id) evaluatedFlag[...,id] = 1 for adjID in MA.filled(cellToCellIDs[...,id], -1): if adjID != -1: if not evaluatedFlag[...,adjID]: self.value[...,adjID], extensionVariable[...,adjID] = self._calcTrialValue(adjID, evaluatedFlag, extensionVariable) if adjID not in trialIDs: trialIDs.append(adjID) self.value = numerix.array(self.value)