Source code for pybamm.models.submodels.interface.interface_utilisation.current_driven_utilisation
#
# Class for current-driven ODE for interface utilisation
#
import pybamm
from .base_utilisation import BaseModel
[docs]
class CurrentDriven(BaseModel):
"""Current-driven ODE for interface utilisation
Parameters
----------
param : parameter class
The parameters to use for this submodel
domain : str
Either 'negative' or 'positive'
options : dict, optional
A dictionary of options to be passed to the model.
reaction_loc : str
Where the reaction happens: "x-average" (SPM, SPMe, etc),
"full electrode" (full DFN), or "interface" (half-cell model)
"""
def __init__(self, param, domain, options, reaction_loc):
super().__init__(param, domain, options)
self.reaction_loc = reaction_loc
[docs]
def get_fundamental_variables(self):
domain, Domain = self.domain_Domain
if self.reaction_loc == "full electrode":
u = pybamm.Variable(
f"{Domain} electrode interface utilisation variable",
domain=f"{domain} electrode",
auxiliary_domains={"secondary": "current collector"},
)
elif self.reaction_loc == "x-average":
u_xav = pybamm.Variable(
f"X-averaged {domain} electrode interface utilisation variable",
domain="current collector",
)
u = pybamm.PrimaryBroadcast(u_xav, f"{domain} electrode")
else:
u = pybamm.Variable(
"Lithium metal interface utilisation variable",
domain="current collector",
)
variables = self._get_standard_interface_utilisation_variables(u)
return variables
[docs]
def set_rhs(self, variables):
domain, Domain = self.domain_Domain
if self.reaction_loc == "full electrode":
u = variables[f"{Domain} electrode interface utilisation variable"]
a_j = variables[
f"{Domain} electrode volumetric interfacial current density [A.m-3]"
]
elif self.reaction_loc == "x-average":
u = variables[
f"X-averaged {domain} electrode interface utilisation variable"
]
a_j = variables[
f"X-averaged {domain} electrode volumetric "
"interfacial current density [A.m-3]"
]
else:
u = variables["Lithium metal interface utilisation variable"]
a_j = variables["Lithium metal total interfacial current density [A.m-2]"]
beta = self.domain_param.beta_utilisation
self.rhs = {u: beta * u * a_j / self.param.F}
[docs]
def set_initial_conditions(self, variables):
domain, Domain = self.domain_Domain
if self.reaction_loc == "full electrode":
u = variables[f"{Domain} electrode interface utilisation variable"]
elif self.reaction_loc == "x-average":
u = variables[
f"X-averaged {domain} electrode interface utilisation variable"
]
else:
u = variables["Lithium metal interface utilisation variable"]
u_init = self.domain_param.u_init
self.initial_conditions = {u: u_init}
[docs]
def add_events_from(self, variables):
domain, Domain = self.domain_Domain
if self.reaction_loc == "full electrode":
u = variables[f"{Domain} electrode interface utilisation"]
elif self.reaction_loc == "x-average":
u = variables[f"X-averaged {domain} electrode interface utilisation"]
else:
u = variables["Lithium metal interface utilisation"]
self.events.append(
pybamm.Event(
f"Zero {domain} electrode utilisation cut-off",
pybamm.min(u),
pybamm.EventType.TERMINATION,
)
)