Beispiel #1
0
    def _binary_simplify(self, left, right):
        """ See :meth:`pybamm.BinaryOperator.simplify()`. """

        # anything multiplied by a scalar zero returns a scalar zero
        if is_scalar_zero(left):
            if isinstance(right, pybamm.Array):
                return pybamm.Array(np.zeros(right.shape))
            else:
                return pybamm.Scalar(0)
        if is_scalar_zero(right):
            if isinstance(left, pybamm.Array):
                return pybamm.Array(np.zeros(left.shape))
            else:
                return pybamm.Scalar(0)

        # if one of the children is a zero matrix, we have to be careful about shapes
        if is_matrix_zero(left) or is_matrix_zero(right):
            shape = (left * right).shape
            if len(shape) == 1 or shape[1] == 1:
                return pybamm.Vector(np.zeros(shape))
            else:
                return pybamm.Matrix(csr_matrix(shape))

        # anything multiplied by a scalar one returns itself
        if is_one(left):
            return right
        if is_one(right):
            return left

        return pybamm.simplify_multiplication_division(self.__class__, left,
                                                       right)
Beispiel #2
0
    def _binary_simplify(self, left, right):
        """ See :meth:`pybamm.BinaryOperator.simplify()`. """

        # zero divided by zero returns nan scalar
        if is_scalar_zero(left) and is_scalar_zero(right):
            return pybamm.Scalar(np.nan)

        # zero divided by anything returns zero
        if is_scalar_zero(left):
            if right.shape_for_testing == ():
                return pybamm.Scalar(0)
            else:
                return pybamm.Array(np.zeros(right.shape_for_testing))

        # anything divided by zero returns inf
        if is_scalar_zero(right):
            if left.shape_for_testing == ():
                return pybamm.Scalar(np.inf)
            else:
                return pybamm.Array(np.inf * np.ones(left.shape_for_testing))

        # anything divided by one is itself
        if is_one(right):
            return left

        return pybamm.simplify_multiplication_division(self.__class__, left,
                                                       right)
Beispiel #3
0
    def _binary_simplify(self, left, right):
        """ See :meth:`pybamm.BinaryOperator._binary_simplify()`. """

        # zero divided by zero returns nan scalar
        if is_scalar_zero(left) and is_scalar_zero(right):
            return pybamm.Scalar(np.nan)

        # zero divided by anything returns zero (being careful about shape)
        if is_scalar_zero(left):
            return zeros_of_shape(right.shape_for_testing)

        # matrix zero divided by anything returns matrix zero (i.e. itself)
        if is_matrix_zero(left):
            return left

        # anything divided by zero returns inf
        if is_scalar_zero(right):
            if left.shape_for_testing == ():
                return pybamm.Scalar(np.inf)
            else:
                return pybamm.Array(np.inf * np.ones(left.shape_for_testing))

        # anything divided by one is itself
        if is_scalar_one(right):
            return left

        return pybamm.simplify_multiplication_division(self.__class__, left, right)
Beispiel #4
0
    def _binary_simplify(self, left, right):
        """ See :meth:`pybamm.BinaryOperator._binary_simplify()`. """
        if is_matrix_zero(left) or is_matrix_zero(right):
            shape = (left @ right).shape
            return zeros_of_shape(shape)

        return pybamm.simplify_multiplication_division(self.__class__, left, right)
Beispiel #5
0
    def _binary_simplify(self, left, right):
        """ See :meth:`pybamm.BinaryOperator.simplify()`. """
        # anything multiplied by a scalar zero returns a scalar zero
        if is_scalar_zero(left) or is_scalar_zero(right):
            return pybamm.Scalar(0)

        return pybamm.simplify_multiplication_division(self.__class__, left,
                                                       right)
Beispiel #6
0
    def _binary_simplify(self, left, right):
        """ See :meth:`pybamm.BinaryOperator._binary_simplify()`. """

        # simplify multiply by scalar zero, being careful about shape
        if is_scalar_zero(left):
            return zeros_of_shape(right.shape_for_testing)
        if is_scalar_zero(right):
            return zeros_of_shape(left.shape_for_testing)

        # if one of the children is a zero matrix, we have to be careful about shapes
        if is_matrix_zero(left) or is_matrix_zero(right):
            shape = (left * right).shape
            return zeros_of_shape(shape)

        # anything multiplied by a scalar one returns itself
        if is_scalar_one(left):
            return right
        if is_scalar_one(right):
            return left

        return pybamm.simplify_multiplication_division(self.__class__, left, right)