Source code for pybamm.models.submodels.interface.lithium_plating.base_plating
#
# Base class for lithium plating models.
#
import pybamm
from pybamm.models.submodels.interface.base_interface import BaseInterface
[docs]
class BasePlating(BaseInterface):
"""Base class for lithium plating models, from :footcite:t:`OKane2020` and
:footcite:t:`OKane2022`.
Parameters
----------
param : parameter class
The parameters to use for this submodel
options : dict, optional
A dictionary of options to be passed to the model.
"""
def __init__(self, param, domain, options=None, phase="primary"):
reaction = "lithium plating"
super().__init__(param, domain, reaction, options=options, phase=phase)
[docs]
def get_coupled_variables(self, variables):
# Update some common variables
domain, Domain = self.domain_Domain
j_plating_av = variables[
f"X-averaged {domain} electrode {self.phase_name}lithium plating "
"interfacial current density [A.m-2]"
]
j_plating = variables[
f"{Domain} electrode {self.phase_name}lithium plating "
"interfacial current density [A.m-2]"
]
variables.update(
{
f"X-averaged {domain} electrode {self.phase_name}lithium plating "
"interfacial current density [A.m-2]": j_plating_av,
f"{Domain} electrode {self.phase_name}lithium plating "
"interfacial current density [A.m-2]": j_plating,
}
)
variables.update(
self._get_standard_volumetric_current_density_variables(variables)
)
return variables
def _get_standard_concentration_variables(self, c_plated_Li, c_dead_Li):
"""
A private function to obtain the standard variables which
can be derived from the local plated lithium concentration.
Parameters
----------
c_plated_Li : :class:`pybamm.Symbol`
The plated lithium concentration.
Returns
-------
variables : dict
The variables which can be derived from the plated lithium thickness.
"""
phase_name = self.phase_name
phase_param = self.phase_param
domain, Domain = self.domain_Domain
if self.size_distribution is True:
c_plated_Li = pybamm.size_average(c_plated_Li)
c_dead_Li = pybamm.size_average(c_dead_Li)
# Set scales to one for the "no plating" model so that they are not required
# by parameter values in general
if isinstance(self, pybamm.lithium_plating.NoPlating):
c_to_L = 1
L_k = 1
elif domain == "negative":
c_to_L = self.param.V_bar_Li / phase_param.a_typ
L_k = self.param.n.L
elif domain == "positive":
c_to_L = self.param.V_bar_Li / phase_param.a_typ
L_k = self.param.p.L
c_plated_Li_xav = pybamm.x_average(c_plated_Li)
c_plated_Li_av = pybamm.yz_average(c_plated_Li_xav)
L_plated_Li = c_plated_Li * c_to_L # plated Li thickness
L_plated_Li_xav = pybamm.x_average(L_plated_Li)
L_plated_Li_av = pybamm.yz_average(L_plated_Li_xav)
Q_plated_Li = c_plated_Li_av * L_k * self.param.L_y * self.param.L_z
c_dead_Li_xav = pybamm.x_average(c_dead_Li)
c_dead_Li_av = pybamm.yz_average(c_dead_Li_xav)
# dead Li "thickness", required by porosity submodel
L_dead_Li = c_dead_Li * c_to_L
L_dead_Li_xav = pybamm.x_average(L_dead_Li)
L_dead_Li_av = pybamm.yz_average(L_dead_Li_xav)
Q_dead_Li = c_dead_Li_av * L_k * self.param.L_y * self.param.L_z
variables = {
f"{Domain} {phase_name}lithium plating concentration "
"[mol.m-3]": c_plated_Li,
f"X-averaged {domain} {phase_name}lithium plating concentration "
"[mol.m-3]": c_plated_Li_xav,
f"Volume-averaged {domain} {phase_name}lithium plating concentration "
"[mol.m-3]": c_plated_Li_av,
f"{Domain} {phase_name}dead lithium concentration [mol.m-3]": c_dead_Li,
f"X-averaged {domain} {phase_name}dead lithium concentration "
"[mol.m-3]": c_dead_Li_xav,
f"Volume-averaged {domain} {phase_name}dead lithium concentration "
"[mol.m-3]": c_dead_Li_av,
f"{Domain} {phase_name}lithium plating thickness [m]": L_plated_Li,
f"X-averaged {domain} {phase_name}lithium plating thickness "
"[m]": L_plated_Li_xav,
f"Volume-averaged {domain} {phase_name}lithium plating thickness "
"[m]": L_plated_Li_av,
f"{Domain} {phase_name}dead lithium thickness [m]": L_dead_Li,
f"X-averaged {domain} {phase_name}dead lithium thickness "
"[m]": L_dead_Li_xav,
f"Volume-averaged {domain} {phase_name}dead lithium thickness "
"[m]": L_dead_Li_av,
f"Loss of lithium to {domain} {phase_name}lithium plating [mol]": (
Q_plated_Li + Q_dead_Li
),
f"Loss of capacity to {domain} {phase_name}lithium plating [A.h]": (
Q_plated_Li + Q_dead_Li
)
* self.param.F
/ 3600,
}
return variables
def _get_standard_reaction_variables(self, j_stripping):
"""
A private function to obtain the standard variables which
can be derived from the lithum stripping interfacial reaction current
Parameters
----------
j_stripping : :class:`pybamm.Symbol`
The net lithium stripping interfacial reaction current.
Returns
-------
variables : dict
The variables which can be derived from the plated lithium thickness.
"""
domain, Domain = self.domain_Domain
j_stripping_av = pybamm.x_average(j_stripping)
variables = {
f"{Domain} electrode {self.phase_name}lithium plating "
"interfacial current density [A.m-2]": j_stripping,
f"X-averaged {domain} electrode {self.phase_name}lithium plating "
"interfacial current density [A.m-2]": j_stripping_av,
}
return variables
def _get_standard_size_distribution_reaction_variables(self, j_stripping):
"""
A private function to obtain the standard variables which
can be derived from the lithum stripping interfacial reaction current
"""
domain, Domain = self.domain_Domain
phase_name = self.phase_name
j_stripping_sav = pybamm.size_average(j_stripping)
j_stripping_av = pybamm.x_average(j_stripping_sav)
variables = {
f"{Domain} electrode {phase_name}lithium plating "
"interfacial current density distribution [A.m-2]": j_stripping,
f"{Domain} electrode {phase_name}lithium plating "
"interfacial current density [A.m-2]": j_stripping_sav,
f"X-averaged {domain} electrode {phase_name}lithium plating "
"interfacial current density [A.m-2]": j_stripping_av,
}
return variables