def _buildMatrix(self, var, SparseMatrix, boundaryConditions=(), dt=None, transientGeomCoeff=None, diffusionGeomCoeff=None): var, L, b = FaceTerm._buildMatrix(self, var, SparseMatrix, boundaryConditions=boundaryConditions, dt=dt, transientGeomCoeff=transientGeomCoeff, diffusionGeomCoeff=diffusionGeomCoeff) ## if var.rank != 1: mesh = var.mesh if (not hasattr(self, 'constraintL')) or (not hasattr(self, 'constraintB')): constraintMask = var.faceGrad.constraintMask | var.arithmeticFaceValue.constraintMask weight = self._getWeight(var, transientGeomCoeff, diffusionGeomCoeff) if 'implicit' in weight: alpha = weight['implicit']['cell 1 diag'] else: alpha = 0.0 exteriorCoeff = self.coeff * mesh.exteriorFaces self.constraintL = (alpha * constraintMask * exteriorCoeff).divergence * mesh.cellVolumes self.constraintB = -((1 - alpha) * var.arithmeticFaceValue * constraintMask * exteriorCoeff).divergence * mesh.cellVolumes ids = self._reshapeIDs(var, numerix.arange(mesh.numberOfCells)) L.addAt(numerix.array(self.constraintL).ravel(), ids.ravel(), ids.swapaxes(0, 1).ravel()) b += numerix.reshape(self.constraintB.value, ids.shape).sum(0).ravel() return (var, L, b)
def _buildMatrix(self, var, SparseMatrix, boundaryConditions=(), dt=None, transientGeomCoeff=None, diffusionGeomCoeff=None): var, L, b = FaceTerm._buildMatrix( self, var, SparseMatrix, boundaryConditions=boundaryConditions, dt=dt, transientGeomCoeff=transientGeomCoeff, diffusionGeomCoeff=diffusionGeomCoeff) ## if var.rank != 1: mesh = var.mesh if (not hasattr(self, 'constraintL')) or (not hasattr( self, 'constraintB')): weight = self._getWeight(var, transientGeomCoeff, diffusionGeomCoeff) if 'implicit' in weight: alpha = weight['implicit']['cell 1 diag'] else: alpha = 0.0 alpha_constraint = numerix.where(var.faceGrad.constraintMask, 1.0, alpha) def divergence(face_value): return ( face_value * \ (var.faceGrad.constraintMask | var.arithmeticFaceValue.constraintMask) * \ self.coeff * mesh.exteriorFaces ).divergence * mesh.cellVolumes self.constraintL = divergence(alpha_constraint) dvar = (var.faceGrad * mesh._cellDistances * mesh.faceNormals).sum(axis=0) self.constraintB = divergence( (alpha_constraint - 1) * var.arithmeticFaceValue + (alpha - 1) * dvar * var.faceGrad.constraintMask) ids = self._reshapeIDs(var, numerix.arange(mesh.numberOfCells)) L.addAt( numerix.array(self.constraintL).ravel(), ids.ravel(), ids.swapaxes(0, 1).ravel()) b += numerix.reshape(self.constraintB.value, ids.shape).sum(0).ravel() return (var, L, b)