Skip to content

Commit

Permalink
#759 create Event class for storing events of different types
Browse files Browse the repository at this point in the history
  • Loading branch information
martinjrobins committed Jan 27, 2020
1 parent f772517 commit 4618751
Show file tree
Hide file tree
Showing 10 changed files with 122 additions and 29 deletions.
1 change: 1 addition & 0 deletions pybamm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ def version(formatted=False):
#
from .models.base_model import BaseModel
from .models import standard_variables
from .models.event import Event

# Battery models
from .models.full_battery_models.base_battery_model import BaseBatteryModel
Expand Down
11 changes: 8 additions & 3 deletions pybamm/discretisations/discretisation.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,11 +198,16 @@ def process_model(self, model, inplace=True, check_model=True):
model_disc.algebraic, model_disc.concatenated_algebraic = alg, concat_alg

# Process events
processed_events = {}
processed_events = []
pybamm.logger.info("Discretise events for {}".format(model.name))
for event, equation in model.events.items():
for event in model.events:
pybamm.logger.debug("Discretise event '{}'".format(event))
processed_events[event] = self.process_symbol(equation)
processed_event = pybamm.Event(
event.name,
self.process_symbol(event.expression),
event.event_type
)
processed_events.append(processed_event)
model_disc.events = processed_events

# Create mass matrix
Expand Down
11 changes: 6 additions & 5 deletions pybamm/models/base_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,10 @@ class BaseModel(object):
variables: dict
A dictionary that maps strings to expressions that represent
the useful variables
events: list
A list of events that should cause the solver to terminate (e.g. concentration
goes negative)
events: list of pybamm.Event
A list of events. Each event can either cause the solver to terminate
(e.g. concentration goes negative), or be used to inform the solver of the
existance of a discontinuity (e.g. discontinuity in the input current)
concatenated_rhs : :class:`pybamm.Concatenation`
After discretisation, contains the expressions representing the rhs equations
concatenated into a single expression
Expand Down Expand Up @@ -105,7 +106,7 @@ def __init__(self, name="Unnamed model"):
self._initial_conditions = {}
self._boundary_conditions = {}
self._variables = {}
self._events = {}
self._events = []
self._concatenated_rhs = None
self._concatenated_algebraic = None
self._concatenated_initial_conditions = None
Expand Down Expand Up @@ -337,7 +338,7 @@ def update(self, *submodels):
self._boundary_conditions, submodel.boundary_conditions
)
self.variables.update(submodel.variables) # keys are strings so no check
self._events.update(submodel.events)
self._events += submodel.events

def check_and_combine_dict(self, dict1, dict2):
# check that the key ids are distinct
Expand Down
52 changes: 52 additions & 0 deletions pybamm/models/event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import pybamm

from enum import Enum


class EventType(Enum):
"""Defines the type of event, see Event"""
TERMINATION = 0
DISCONTINUITY = 1


class Event:
"""
Defines an event for use within a pybamm model
Attributes
----------
name: str
A string giving the name of the event
event_type: EventType
An enum defining the type of event, see EventType
expression: pybamm.Symbol
An expression that defines when the event occurs
"""

def __init__(self, name, expression, event_type=EventType.TERMINATION):
self._name = name
self._expression = expression
self._event_type = event_type

def __str__(self):
return self._name

@property
def name(self):
return self._name

@property
def expression(self):
return self._expression

@expression.setter
def expression(self, value):
self._expression = value

@property
def event_type(self):
return event_type
12 changes: 10 additions & 2 deletions pybamm/models/full_battery_models/base_battery_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -767,8 +767,16 @@ def set_voltage_variables(self):

# Cut-off voltage
voltage = self.variables["Terminal voltage"]
self.events["Minimum voltage"] = voltage - self.param.voltage_low_cut
self.events["Maximum voltage"] = voltage - self.param.voltage_high_cut
self.events.append(pybamm.Event(
"Minimum voltage",
voltage - self.param.voltage_low_cut,
pybamm.EventType.TERMINATION
))
self.events.append(pybamm.Event(
"Maximum voltage",
voltage - self.param.voltage_high_cut,
pybamm.EventType.TERMINATION
))

# Power
I_dim = self.variables["Current [A]"]
Expand Down
10 changes: 5 additions & 5 deletions pybamm/models/submodels/base_submodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ class BaseSubModel:
variables: dict
A dictionary that maps strings to expressions that represent
the useful variables
events: dict
A dictionary of events that should cause the solver to terminate (e.g.
concentration goes negative). The keys are strings and the values are
symbols.
events: list
A list of events. Each event can either cause the solver to terminate
(e.g. concentration goes negative), or be used to inform the solver of the
existance of a discontinuity (e.g. discontinuity in the input current)
"""

def __init__(
Expand All @@ -63,7 +63,7 @@ def __init__(
self.boundary_conditions = {}
self.initial_conditions = {}
self.variables = {}
self.events = {}
self.events = []

self.domain = domain
self.set_domain_for_broadcast()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,8 @@ def _get_standard_flux_variables(self, N_e):

def set_events(self, variables):
c_e = variables["Electrolyte concentration"]
self.events["Zero electrolyte concentration cut-off"] = pybamm.min(c_e) - 0.002
self.events.append(pybamm.Event(
"Zero electrolyte concentration cut-off",
pybamm.min(c_e) - 0.002,
pybamm.EventType.TERMINATION
))
18 changes: 11 additions & 7 deletions pybamm/models/submodels/particle/base_particle.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,14 @@ def set_events(self, variables):
c_s_surf = variables[self.domain + " particle surface concentration"]
tol = 0.01

self.events[
"Minumum " + self.domain.lower() + " particle surface concentration"
] = (pybamm.min(c_s_surf) - tol)

self.events[
"Maximum " + self.domain.lower() + " particle surface concentration"
] = (1 - tol) - pybamm.max(c_s_surf)
self.events.append(pybamm.Event(
"Minumum " + self.domain.lower() + " particle surface concentration",
pybamm.min(c_s_surf) - tol,
pybamm.EventType.TERMINATION
))

self.events.append(pybamm.Event(
"Maximum " + self.domain.lower() + " particle surface concentration",
(1 - tol) - pybamm.max(c_s_surf),
pybamm.EventType.TERMINATION
))
26 changes: 22 additions & 4 deletions pybamm/models/submodels/porosity/base_porosity.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,25 @@ def _get_standard_porosity_change_variables(self, deps_dt, set_leading_order=Fal
def set_events(self, variables):
eps_n = variables["Negative electrode porosity"]
eps_p = variables["Positive electrode porosity"]
self.events["Zero negative electrode porosity cut-off"] = pybamm.min(eps_n)
self.events["Max negative electrode porosity cut-off"] = pybamm.max(eps_n) - 1
self.events["Zero positive electrode porosity cut-off"] = pybamm.min(eps_p)
self.events["Max positive electrode porosity cut-off"] = pybamm.max(eps_p) - 1
self.events.append(pybamm.Event(
"Zero negative electrode porosity cut-off",
pybamm.min(eps_n),
pybamm.EventType.TERMINATION
))
self.events.append(pybamm.Event(
"Max negative electrode porosity cut-off",
pybamm.max(eps_n) - 1,
pybamm.EventType.TERMINATION
))

self.events.append(pybamm.Event(
"Zero positive electrode porosity cut-off",
pybamm.min(eps_p),
pybamm.EventType.TERMINATION
))

self.events.append(pybamm.Event(
"Max positive electrode porosity cut-off",
pybamm.max(eps_p) - 1,
pybamm.EventType.TERMINATION
))
4 changes: 2 additions & 2 deletions pybamm/parameters/parameter_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,11 +346,11 @@ def process_model(self, unprocessed_model, processing="process", inplace=True):
)
)
model.variables[variable] = processing_function(equation)
for event, equation in model.events.items():
for event in model.events:
pybamm.logger.debug(
"{} parameters for event '{}''".format(processing.capitalize(), event)
)
model.events[event] = processing_function(equation)
event.expression = processing_function(event.expression)

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

Expand Down

0 comments on commit 4618751

Please sign in to comment.