Skip to content

Commit 4618751

Browse files
committed
#759 create Event class for storing events of different types
1 parent f772517 commit 4618751

File tree

10 files changed

+122
-29
lines changed

10 files changed

+122
-29
lines changed

pybamm/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def version(formatted=False):
148148
#
149149
from .models.base_model import BaseModel
150150
from .models import standard_variables
151+
from .models.event import Event
151152

152153
# Battery models
153154
from .models.full_battery_models.base_battery_model import BaseBatteryModel

pybamm/discretisations/discretisation.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -198,11 +198,16 @@ def process_model(self, model, inplace=True, check_model=True):
198198
model_disc.algebraic, model_disc.concatenated_algebraic = alg, concat_alg
199199

200200
# Process events
201-
processed_events = {}
201+
processed_events = []
202202
pybamm.logger.info("Discretise events for {}".format(model.name))
203-
for event, equation in model.events.items():
203+
for event in model.events:
204204
pybamm.logger.debug("Discretise event '{}'".format(event))
205-
processed_events[event] = self.process_symbol(equation)
205+
processed_event = pybamm.Event(
206+
event.name,
207+
self.process_symbol(event.expression),
208+
event.event_type
209+
)
210+
processed_events.append(processed_event)
206211
model_disc.events = processed_events
207212

208213
# Create mass matrix

pybamm/models/base_model.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ class BaseModel(object):
4646
variables: dict
4747
A dictionary that maps strings to expressions that represent
4848
the useful variables
49-
events: list
50-
A list of events that should cause the solver to terminate (e.g. concentration
51-
goes negative)
49+
events: list of pybamm.Event
50+
A list of events. Each event can either cause the solver to terminate
51+
(e.g. concentration goes negative), or be used to inform the solver of the
52+
existance of a discontinuity (e.g. discontinuity in the input current)
5253
concatenated_rhs : :class:`pybamm.Concatenation`
5354
After discretisation, contains the expressions representing the rhs equations
5455
concatenated into a single expression
@@ -105,7 +106,7 @@ def __init__(self, name="Unnamed model"):
105106
self._initial_conditions = {}
106107
self._boundary_conditions = {}
107108
self._variables = {}
108-
self._events = {}
109+
self._events = []
109110
self._concatenated_rhs = None
110111
self._concatenated_algebraic = None
111112
self._concatenated_initial_conditions = None
@@ -337,7 +338,7 @@ def update(self, *submodels):
337338
self._boundary_conditions, submodel.boundary_conditions
338339
)
339340
self.variables.update(submodel.variables) # keys are strings so no check
340-
self._events.update(submodel.events)
341+
self._events += submodel.events
341342

342343
def check_and_combine_dict(self, dict1, dict2):
343344
# check that the key ids are distinct

pybamm/models/event.py

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import pybamm
2+
3+
from enum import Enum
4+
5+
6+
class EventType(Enum):
7+
"""Defines the type of event, see Event"""
8+
TERMINATION = 0
9+
DISCONTINUITY = 1
10+
11+
12+
class Event:
13+
"""
14+
15+
Defines an event for use within a pybamm model
16+
17+
Attributes
18+
----------
19+
20+
name: str
21+
A string giving the name of the event
22+
event_type: EventType
23+
An enum defining the type of event, see EventType
24+
expression: pybamm.Symbol
25+
An expression that defines when the event occurs
26+
27+
28+
"""
29+
30+
def __init__(self, name, expression, event_type=EventType.TERMINATION):
31+
self._name = name
32+
self._expression = expression
33+
self._event_type = event_type
34+
35+
def __str__(self):
36+
return self._name
37+
38+
@property
39+
def name(self):
40+
return self._name
41+
42+
@property
43+
def expression(self):
44+
return self._expression
45+
46+
@expression.setter
47+
def expression(self, value):
48+
self._expression = value
49+
50+
@property
51+
def event_type(self):
52+
return event_type

pybamm/models/full_battery_models/base_battery_model.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -767,8 +767,16 @@ def set_voltage_variables(self):
767767

768768
# Cut-off voltage
769769
voltage = self.variables["Terminal voltage"]
770-
self.events["Minimum voltage"] = voltage - self.param.voltage_low_cut
771-
self.events["Maximum voltage"] = voltage - self.param.voltage_high_cut
770+
self.events.append(pybamm.Event(
771+
"Minimum voltage",
772+
voltage - self.param.voltage_low_cut,
773+
pybamm.EventType.TERMINATION
774+
))
775+
self.events.append(pybamm.Event(
776+
"Maximum voltage",
777+
voltage - self.param.voltage_high_cut,
778+
pybamm.EventType.TERMINATION
779+
))
772780

773781
# Power
774782
I_dim = self.variables["Current [A]"]

pybamm/models/submodels/base_submodel.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ class BaseSubModel:
4040
variables: dict
4141
A dictionary that maps strings to expressions that represent
4242
the useful variables
43-
events: dict
44-
A dictionary of events that should cause the solver to terminate (e.g.
45-
concentration goes negative). The keys are strings and the values are
46-
symbols.
43+
events: list
44+
A list of events. Each event can either cause the solver to terminate
45+
(e.g. concentration goes negative), or be used to inform the solver of the
46+
existance of a discontinuity (e.g. discontinuity in the input current)
4747
"""
4848

4949
def __init__(
@@ -63,7 +63,7 @@ def __init__(
6363
self.boundary_conditions = {}
6464
self.initial_conditions = {}
6565
self.variables = {}
66-
self.events = {}
66+
self.events = []
6767

6868
self.domain = domain
6969
self.set_domain_for_broadcast()

pybamm/models/submodels/electrolyte/base_electrolyte_diffusion.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,8 @@ def _get_standard_flux_variables(self, N_e):
105105

106106
def set_events(self, variables):
107107
c_e = variables["Electrolyte concentration"]
108-
self.events["Zero electrolyte concentration cut-off"] = pybamm.min(c_e) - 0.002
108+
self.events.append(pybamm.Event(
109+
"Zero electrolyte concentration cut-off",
110+
pybamm.min(c_e) - 0.002,
111+
pybamm.EventType.TERMINATION
112+
))

pybamm/models/submodels/particle/base_particle.py

+11-7
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,14 @@ def set_events(self, variables):
9191
c_s_surf = variables[self.domain + " particle surface concentration"]
9292
tol = 0.01
9393

94-
self.events[
95-
"Minumum " + self.domain.lower() + " particle surface concentration"
96-
] = (pybamm.min(c_s_surf) - tol)
97-
98-
self.events[
99-
"Maximum " + self.domain.lower() + " particle surface concentration"
100-
] = (1 - tol) - pybamm.max(c_s_surf)
94+
self.events.append(pybamm.Event(
95+
"Minumum " + self.domain.lower() + " particle surface concentration",
96+
pybamm.min(c_s_surf) - tol,
97+
pybamm.EventType.TERMINATION
98+
))
99+
100+
self.events.append(pybamm.Event(
101+
"Maximum " + self.domain.lower() + " particle surface concentration",
102+
(1 - tol) - pybamm.max(c_s_surf),
103+
pybamm.EventType.TERMINATION
104+
))

pybamm/models/submodels/porosity/base_porosity.py

+22-4
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,25 @@ def _get_standard_porosity_change_variables(self, deps_dt, set_leading_order=Fal
9696
def set_events(self, variables):
9797
eps_n = variables["Negative electrode porosity"]
9898
eps_p = variables["Positive electrode porosity"]
99-
self.events["Zero negative electrode porosity cut-off"] = pybamm.min(eps_n)
100-
self.events["Max negative electrode porosity cut-off"] = pybamm.max(eps_n) - 1
101-
self.events["Zero positive electrode porosity cut-off"] = pybamm.min(eps_p)
102-
self.events["Max positive electrode porosity cut-off"] = pybamm.max(eps_p) - 1
99+
self.events.append(pybamm.Event(
100+
"Zero negative electrode porosity cut-off",
101+
pybamm.min(eps_n),
102+
pybamm.EventType.TERMINATION
103+
))
104+
self.events.append(pybamm.Event(
105+
"Max negative electrode porosity cut-off",
106+
pybamm.max(eps_n) - 1,
107+
pybamm.EventType.TERMINATION
108+
))
109+
110+
self.events.append(pybamm.Event(
111+
"Zero positive electrode porosity cut-off",
112+
pybamm.min(eps_p),
113+
pybamm.EventType.TERMINATION
114+
))
115+
116+
self.events.append(pybamm.Event(
117+
"Max positive electrode porosity cut-off",
118+
pybamm.max(eps_p) - 1,
119+
pybamm.EventType.TERMINATION
120+
))

pybamm/parameters/parameter_values.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,11 @@ def process_model(self, unprocessed_model, processing="process", inplace=True):
346346
)
347347
)
348348
model.variables[variable] = processing_function(equation)
349-
for event, equation in model.events.items():
349+
for event in model.events:
350350
pybamm.logger.debug(
351351
"{} parameters for event '{}''".format(processing.capitalize(), event)
352352
)
353-
model.events[event] = processing_function(equation)
353+
event.expression = processing_function(event.expression)
354354

355355
pybamm.logger.info("Finish setting parameters for {}".format(model.name))
356356

0 commit comments

Comments
 (0)