Skip to content

Commit bae3720

Browse files
Merge pull request #1537 from pybamm-team/double-negation
double negation case
2 parents d62c862 + e78f727 commit bae3720

File tree

5 files changed

+24
-3
lines changed

5 files changed

+24
-3
lines changed

pybamm/expression_tree/binary_operators.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -1104,7 +1104,10 @@ def simplified_multiplication(left, right):
11041104
return (left * r_left) + (left * r_right)
11051105

11061106
# Negation simplifications
1107-
if isinstance(left, pybamm.Negate) and right.is_constant():
1107+
if isinstance(left, pybamm.Negate) and isinstance(right, pybamm.Negate):
1108+
# Double negation cancels out
1109+
return left.orphans[0] * right.orphans[0]
1110+
elif isinstance(left, pybamm.Negate) and right.is_constant():
11081111
# Simplify (-a) * b to a * (-b) if (-b) is constant
11091112
return left.orphans[0] * (-right)
11101113
elif isinstance(right, pybamm.Negate) and left.is_constant():
@@ -1193,6 +1196,9 @@ def simplified_division(left, right):
11931196
return l_left * new_right
11941197

11951198
# Negation simplifications
1199+
if isinstance(left, pybamm.Negate) and isinstance(right, pybamm.Negate):
1200+
# Double negation cancels out
1201+
return left.orphans[0] / right.orphans[0]
11961202
elif isinstance(left, pybamm.Negate) and right.is_constant():
11971203
# Simplify (-a) / b to a / (-b) if (-b) is constant
11981204
return left.orphans[0] / (-right)

pybamm/expression_tree/printing/__init__.py

Whitespace-only changes.

pybamm/expression_tree/unary_operators.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -1116,8 +1116,15 @@ def div(symbol):
11161116
# Divergence commutes with Negate operator
11171117
if isinstance(symbol, pybamm.Negate):
11181118
return -div(symbol.orphans[0])
1119-
else:
1120-
return Divergence(symbol)
1119+
elif isinstance(symbol, (pybamm.Multiplication, pybamm.Division)):
1120+
left, right = symbol.orphans
1121+
if isinstance(left, pybamm.Negate):
1122+
return -div(symbol._binary_new_copy(left.orphans[0], right))
1123+
# elif isinstance(right, pybamm.Negate):
1124+
# return -div(symbol._binary_new_copy(left, right.orphans[0]))
1125+
1126+
# Last resort
1127+
return Divergence(symbol)
11211128

11221129

11231130
def laplacian(symbol):

tests/unit/test_expression_tree/test_binary_operators.py

+2
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ def test_binary_simplifications(self):
501501
self.assertEqual((c * -1).id, (-c).id)
502502
self.assertEqual((-1 * c).id, (-c).id)
503503
# multiplication with a negation
504+
self.assertEqual((-c * -f).id, (c * f).id)
504505
self.assertEqual((-c * 4).id, (c * -4).id)
505506
self.assertEqual((4 * -c).id, (-4 * c).id)
506507
# multiplication with broadcasts
@@ -532,6 +533,7 @@ def test_binary_simplifications(self):
532533
self.assertEqual((c / c).id, pybamm.Scalar(1).id)
533534
self.assertEqual((broad2 / broad2).id, broad1.id)
534535
# division with a negation
536+
self.assertEqual((-c / -f).id, (c / f).id)
535537
self.assertEqual((-c / 4).id, (c / -4).id)
536538
self.assertEqual((4 / -c).id, (-4 / c).id)
537539
# division with broadcasts

tests/unit/test_expression_tree/test_unary_operators.py

+6
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,12 @@ def test_div(self):
190190
div = pybamm.div(-pybamm.Gradient(a))
191191
self.assertEqual(div.id, (-pybamm.Divergence(pybamm.Gradient(a))).id)
192192

193+
div = pybamm.div(-a * pybamm.Gradient(a))
194+
self.assertEqual(div.id, (-pybamm.Divergence(a * pybamm.Gradient(a))).id)
195+
196+
# div = pybamm.div(a * -pybamm.Gradient(a))
197+
# self.assertEqual(div.id, (-pybamm.Divergence(a * pybamm.Gradient(a))).id)
198+
193199
def test_integral(self):
194200
# space integral
195201
a = pybamm.Symbol("a", domain=["negative electrode"])

0 commit comments

Comments
 (0)