Source code for pybamm.models.submodels.interface.kinetics.diffusion_limited
#
# Diffusion-limited kinetics
#
import pybamm
from pybamm.models.submodels.interface.base_interface import BaseInterface
[docs]
class DiffusionLimited(BaseInterface):
"""
Submodel for diffusion-limited kinetics
Parameters
----------
param :
model parameters
domain : str
The domain to implement the model, either: 'Negative' or 'Positive'.
reaction : str
The name of the reaction being implemented
options: dict
A dictionary of options to be passed to the model. See
:class:`pybamm.BaseBatteryModel`
order : str
The order of the model ("leading" or "full")
"""
def __init__(self, param, domain, reaction, options, order):
super().__init__(param, domain, reaction, options)
self.order = order
[docs]
def get_coupled_variables(self, variables):
_domain, Domain = self.domain_Domain
reaction_name = self.reaction_name
delta_phi_s = variables[f"{Domain} electrode surface potential difference [V]"]
# If delta_phi_s was broadcast, take only the orphan
if isinstance(delta_phi_s, pybamm.Broadcast):
delta_phi_s = delta_phi_s.orphans[0]
# Get exchange-current density
j0 = self._get_exchange_current_density(variables)
# Get open-circuit potential variables and reaction overpotential
ocp = variables[f"{Domain} electrode {reaction_name}open-circuit potential [V]"]
eta_r = delta_phi_s - ocp
# Get interfacial current densities
j = self._get_diffusion_limited_current_density(variables)
j_tot_av, a_j_tot_av = self._get_average_total_interfacial_current_density(
variables
)
variables.update(self._get_standard_interfacial_current_variables(j))
variables.update(
self._get_standard_total_interfacial_current_variables(j_tot_av, a_j_tot_av)
)
variables.update(self._get_standard_exchange_current_variables(j0))
variables.update(self._get_standard_overpotential_variables(eta_r))
variables.update(
self._get_standard_volumetric_current_density_variables(variables)
)
# No SEI film resistance in this model
eta_sei = pybamm.Scalar(0)
variables.update(self._get_standard_sei_film_overpotential_variables(eta_sei))
return variables
def _get_diffusion_limited_current_density(self, variables):
if self.domain == "negative":
if self.order == "leading":
j_p = variables[
f"X-averaged positive electrode {self.reaction_name}"
"interfacial current density [A.m-2]"
]
j = -self.param.p.L * j_p / self.param.n.L
elif self.order == "full":
tor_s = variables["Separator electrolyte transport efficiency"]
c_ox_s = variables["Separator oxygen concentration [mol.m-3]"]
N_ox_neg_sep_interface = (
-pybamm.boundary_value(tor_s, "left")
* self.param.D_ox
* pybamm.boundary_gradient(c_ox_s, "left")
)
j = -N_ox_neg_sep_interface / -self.param.s_ox_Ox / self.param.n.L
return j