Пример #1
0
    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')}
Пример #2
0
    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')
        }
Пример #3
0
    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)
Пример #4
0
    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')
        }
Пример #5
0
 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
Пример #7
0
    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)
Пример #8
0
 def sign(self):
     return self._UnaryOperatorVariable(lambda a: numerix.sign(a), canInline=False)