def _getWeight(self, var, transientGeomCoeff=None, diffusionGeomCoeff=None): """ Test for a bug due to the sign operator not being updating correctly. >>> from fipy import * >>> m = Grid1D(nx=1) >>> v = CellVariable(mesh=m, value=1.) >>> eq = TransientTerm() == ImplicitSourceTerm(v) >>> eq.solve(v, dt=1.) >>> print(v) [ 2.] >>> v.setValue(-1.) >>> eq.solve(v, dt=1.) >>> print(v) [-0.5] """ coeff = self._getGeomCoeff(var) diagonalSign = self._getDiagonalSign(transientGeomCoeff, diffusionGeomCoeff) combinedSign = numerix.array(diagonalSign)[..., numerix.newaxis] * numerix.sign(coeff) return {'diagonal' : (combinedSign >= 0), 'old value' : numerix.zeros(var.shape, 'd'), 'b vector' : -var * (combinedSign < 0), 'new value' : numerix.zeros(var.shape, 'd')}
def _getWeight(self, var, transientGeomCoeff=None, diffusionGeomCoeff=None): """ Test for a bug due to the sign operator not being updating correctly. >>> from fipy import * >>> m = Grid1D(nx=1) >>> v = CellVariable(mesh=m, value=1.) >>> eq = TransientTerm() == ImplicitSourceTerm(v) >>> eq.solve(v, dt=1.) >>> print v [ 2.] >>> v.setValue(-1.) >>> eq.solve(v, dt=1.) >>> print v [-0.5] """ coeff = self._getGeomCoeff(var) diagonalSign = self._getDiagonalSign(transientGeomCoeff, diffusionGeomCoeff) combinedSign = numerix.array(diagonalSign)[ ..., numerix.newaxis] * numerix.sign(coeff) return { 'diagonal': (combinedSign >= 0), 'old value': numerix.zeros(var.shape, 'd'), 'b vector': -var * (combinedSign < 0), 'new value': numerix.zeros(var.shape, 'd') }
def _buildMatrix(self, var, SparseMatrix, boundaryConditions=(), dt=1., equation=None): """Implicit portion considers """ mesh = var.getMesh() id1, id2 = mesh._getAdjacentCellIDs() interiorFaces = numerix.nonzero(mesh.getInteriorFaces())[0] id1 = numerix.take(id1, interiorFaces) id2 = numerix.take(id2, interiorFaces) N = len(var) b = numerix.zeros((N),'d') L = SparseMatrix(size = N) if equation is not None: from fipy.tools.numerix import sign, add self._diagonalSign.setValue(sign(add.reduce(equation.matrix.takeDiagonal()))) else: self._diagonalSign.setValue(1) weight = self._getWeight(mesh, equation=equation) if weight.has_key('implicit'): self._implicitBuildMatrix(SparseMatrix, L, id1, id2, b, weight['implicit'], mesh, boundaryConditions, interiorFaces, dt) if weight.has_key('explicit'): self._explicitBuildMatrix(SparseMatrix, var.getOld(), id1, id2, b, weight['explicit'], mesh, boundaryConditions, interiorFaces, dt) return (L, b)
def _calcCoeffVectors(self, var, equation=None): """ Test for a bug due to the sign operator not being updating correctly. >>> from fipy import * >>> m = Grid1D(nx=1) >>> v = CellVariable(mesh=m, value=1.) >>> eq = TransientTerm() == ImplicitSourceTerm(v) >>> eq.solve(v) >>> print v [ 2.] >>> v.setValue(-1.) >>> eq.solve(v) >>> print v [-0.5] """ coeff = self._getGeomCoeff(var.getMesh()) from fipy.tools.numerix import sign combinedSign = self._diagonalSign * sign(coeff) self.coeffVectors = { 'diagonal': coeff * (combinedSign >= 0), 'old value': numerix.zeros(var.getMesh().getNumberOfCells(), 'd'), 'b vector': -coeff * var * (combinedSign < 0), 'new value': numerix.zeros(var.getMesh().getNumberOfCells(), 'd') }
def __call__(self, x, pos=None): 'Return the format for tick val x at position pos' vmin, vmax = self.axis.get_view_interval() d = abs(vmax - vmin) b = self._base # only label the decades sgn = numerix.sign(x) x = abs(x) x += self.threshold isDecade = ticker.is_decade(x) bx = b**x sgnbx = sgn * bx if not isDecade and self.labelOnlyBase: s = '' elif x > 4: s = '%+1.0e' % sgnbx elif x < 0: s = '%+1.0e' % sgnbx else: s = self.pprint_val(sgnbx, d) return s
def __call__(self, x, pos=None): 'Return the format for tick val x at position pos' vmin, vmax = self.axis.get_view_interval() d = abs(vmax - vmin) b=self._base # only label the decades sgn = numerix.sign(x) x = abs(x) x += self.threshold isDecade = ticker.is_decade(x) bx = b**x sgnbx = sgn * bx if not isDecade and self.labelOnlyBase: s = '' elif x > 4: s= '%+1.0e' % sgnbx elif x < 0: s = '%+1.0e' % sgnbx else : s = self.pprint_val(sgnbx, d) return s
def _buildMatrix(self, var, SparseMatrix, boundaryConditions=(), dt=1., equation=None): N = len(var) b = numerix.zeros((N),'d') L = SparseMatrix(size=N) # The sign of the matrix diagonal doesn't seem likely to change # after initialization, but who knows? if equation is not None: from fipy.tools.numerix import sign, add self._diagonalSign.setValue(sign(add.reduce(equation.matrix.takeDiagonal()))) else: self._diagonalSign.setValue(1) coeffVectors = self._getCoeffVectors(var=var) inline._optionalInline(self._buildMatrixIn, self._buildMatrixPy, L, var.getOld(), b, dt, coeffVectors) return (L, b)
def sign(self): return self._UnaryOperatorVariable(lambda a: numerix.sign(a), canInline=False)