Skip to content

Commit 2b43f64

Browse files
committed
created a function to sort and clean discontinuties, and a corresponding test
1 parent 085b573 commit 2b43f64

File tree

2 files changed

+31
-31
lines changed

2 files changed

+31
-31
lines changed

src/pybamm/solvers/base_solver.py

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -963,38 +963,45 @@ def solve(
963963
return solutions
964964

965965
@staticmethod
966-
def _get_discontinuity_start_end_indices(model, inputs, t_eval):
967-
if not model.discontinuity_events_eval:
968-
pybamm.logger.verbose("No discontinuity events found")
969-
return [0], [len(t_eval)], t_eval
970-
971-
# Calculate discontinuities
972-
discontinuities = [
973-
# Assuming that discontinuities do not depend on
974-
# input parameters when len(input_list) > 1, only
975-
# `inputs` is passed to `evaluate`.
976-
# See https://github.com/pybamm-team/PyBaMM/pull/1261
977-
event.expression.evaluate(inputs=inputs)
978-
for event in model.discontinuity_events_eval
979-
]
980-
966+
def _sort_and_clean_discontinuities(discontinuities, t_eval):
981967
# make sure they are increasing in time
982968
discontinuities = sorted(discontinuities)
983969

984-
# remove any identical discontinuities
970+
# remove any identical discontinuities, and also unwanted discontinuities
971+
# at the beginning of the integration (see https://github.com/pybamm-team/PyBaMM/pull/5075)
985972
discontinuities = [
986973
v
987974
for i, v in enumerate(discontinuities)
988975
if (
989976
i == len(discontinuities) - 1
990977
or discontinuities[i] < discontinuities[i + 1]
991978
)
992-
and v > t_eval[0]
979+
and v > t_eval[0]
993980
]
994981

995982
# remove any discontinuities after end of t_eval
996983
discontinuities = [v for v in discontinuities if v < t_eval[-1]]
997984

985+
return discontinuities
986+
987+
def _get_discontinuity_start_end_indices(self, model, inputs, t_eval):
988+
if not model.discontinuity_events_eval:
989+
pybamm.logger.verbose("No discontinuity events found")
990+
return [0], [len(t_eval)], t_eval
991+
992+
# Calculate discontinuities
993+
discontinuities = [
994+
# Assuming that discontinuities do not depend on
995+
# input parameters when len(input_list) > 1, only
996+
# `inputs` is passed to `evaluate`.
997+
# See https://github.com/pybamm-team/PyBaMM/pull/1261
998+
event.expression.evaluate(inputs=inputs)
999+
for event in model.discontinuity_events_eval
1000+
]
1001+
1002+
# sort and remove unwanted discontinuities
1003+
discontinuities = self._sort_and_clean_discontinuities(discontinuities, t_eval)
1004+
9981005
pybamm.logger.verbose(f"Discontinuity events found at t = {discontinuities}")
9991006
if isinstance(inputs, list):
10001007
raise pybamm.SolverError(

tests/unit/test_solvers/test_base_solver.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -435,18 +435,11 @@ def test_on_extrapolation_settings(self):
435435
base_solver.on_extrapolation = "invalid"
436436

437437
def test_discontinuity_removed_at_nonzero_initial_time(self):
438-
# Test that discontinuity caused by Heaviside(t) is removed when solver called with non-zero initial time
439-
model = pybamm.BaseModel()
440-
u = pybamm.Variable("u")
441-
v = pybamm.Variable("v")
442-
model.rhs = {v: -1 * (pybamm.t < 1)}
443-
model.algebraic = {u: v - 1 - u}
444-
model.initial_conditions = {v: 1, u: 0}
445-
disc = pybamm.Discretisation()
446-
disc.process_model(model)
447-
solver = pybamm.IDAKLUSolver()
448-
sol1 = solver.solve(model, t_eval=[0, 1])
438+
# Test that the discontinuity caused by Heaviside(t) will be removed when
439+
# the solver is called with t_eval[0] != 0
440+
base_solver = pybamm.BaseSolver()
441+
t_eval = [1, 2]
442+
uncleaned_discontinuities = [1]
443+
cleaned_discontinuities = base_solver._sort_and_clean_discontinuities(uncleaned_discontinuities, t_eval)
449444

450-
model.set_initial_conditions_from(sol1)
451-
sol2 = solver.solve(model, t_eval=[1, 2])
452-
assert sol2 is not None
445+
assert t_eval[0] not in cleaned_discontinuities

0 commit comments

Comments
 (0)