Source code for pybamm.models.submodels.interface.sei.base_sei

#
# Base class for SEI models.
#
import pybamm
from pybamm.models.submodels.interface.base_interface import BaseInterface


[docs] class BaseModel(BaseInterface): """Base class for SEI models. Parameters ---------- param : parameter class The parameters to use for this submodel options : dict A dictionary of options to be passed to the model. phase : str, optional Phase of the particle (default is "primary") cracks : bool, optional Whether this is a submodel for standard SEI or SEI on cracks """ def __init__(self, param, domain, options, phase="primary", cracks=False): if cracks is True: reaction = "SEI on cracks" else: reaction = "SEI" 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 if self.reaction_loc != "interface": j_sei_av = variables[ f"X-averaged {domain} electrode {self.reaction_name}interfacial" " current density [A.m-2]" ] j_sei = variables[ f"{Domain} electrode {self.reaction_name}interfacial current" " density [A.m-2]" ] variables.update( { f"X-averaged {domain} electrode {self.reaction_name}interfacial " "current density [A.m-2]": j_sei_av, f"{Domain} electrode {self.reaction_name}interfacial current " "density [A.m-2]": j_sei, } ) variables.update( self._get_standard_volumetric_current_density_variables(variables) ) return variables
def _get_standard_concentration_variables(self, c_sei): """ A private function to obtain the standard variables which can be derived from the local SEI concentration. Parameters ---------- c : :class:`pybamm.Symbol` The SEI concentration. Returns ------- variables : dict The variables which can be derived from the SEI concentration. """ domain, Domain = self.domain_Domain phase_param = self.phase_param reaction_name = self.reaction_name if self.reaction_loc == "interface": # c_sei is an interfacial quantity [mol.m-2] c_sei_av = pybamm.yz_average(c_sei) variables = { f"{Domain} {reaction_name}concentration [mol.m-2]": c_sei, f"Volume-averaged {domain} {reaction_name}concentration " "[mol.m-2]": c_sei_av, } else: # c_sei is a bulk quantity [mol.m-3] if self.size_distribution: c_sei_sav = pybamm.size_average(c_sei) c_sei_xav = pybamm.x_average(c_sei_sav) else: c_sei_xav = pybamm.x_average(c_sei) c_sei_av = pybamm.yz_average(c_sei_xav) variables = { f"{Domain} {self.reaction_name}concentration [mol.m-3]": c_sei, f"X-averaged {domain} {reaction_name}concentration " "[mol.m-3]": c_sei_xav, f"Volume-averaged {domain} {reaction_name}concentration " "[mol.m-3]": c_sei_av, } # Set scales to one for the "no SEI" model so that they are not required # by parameter values in general if isinstance(self, pybamm.sei.NoSEI): c_sei_0 = 0 c_sei_cr0 = 0 z_sei = 1 else: L_sei_0 = phase_param.L_sei_0 V_bar_sei = phase_param.V_bar_sei z_sei = phase_param.z_sei if self.reaction_loc == "interface": c_sei_0 = L_sei_0 / V_bar_sei # mol.m-2 else: c_sei_0 = L_sei_0 * phase_param.a_typ / V_bar_sei # mol.m-3 c_sei_cr0 = phase_param.L_sei_cr0 * phase_param.a_typ / V_bar_sei if self.reaction == "SEI": delta_c_sei = c_sei_av - c_sei_0 elif self.reaction == "SEI on cracks": delta_c_sei = c_sei_av - c_sei_cr0 if self.reaction_loc == "interface": L_k = 1 elif domain == "negative": L_k = self.param.n.L elif domain == "positive": L_k = self.param.p.L # Multiply delta_n_SEI by V_k to get total moles of SEI formed # Multiply by z_sei to get total lithium moles consumed by SEI V_k = L_k * self.param.L_y * self.param.L_z Q_sei = delta_c_sei * V_k * z_sei variables.update( { f"Loss of lithium to {domain} {self.reaction_name}[mol]": Q_sei, f"Loss of capacity to {domain} {self.reaction_name}[A.h]": Q_sei * self.param.F / 3600, } ) return variables def _get_standard_reaction_variables(self, j_sei): """ A private function to obtain the standard variables which can be derived from the SEI interfacial reaction current Parameters ---------- j_sei : :class:`pybamm.Symbol` The SEI interfacial reaction current. Returns ------- variables : dict The variables which can be derived from the SEI currents. """ domain, Domain = self.domain_Domain variables = { f"{Domain} electrode {self.reaction_name}" "interfacial current density [A.m-2]": j_sei, } if self.reaction_loc != "interface": j_sei_av = pybamm.x_average(j_sei) variables.update( { f"X-averaged {domain} electrode {self.reaction_name}" "interfacial current density [A.m-2]": j_sei_av, } ) return variables def _get_standard_reaction_distribution_variables(self, j_sei): """ A private function to obtain the standard variables which can be derived from the SEI interfacial reaction current Parameters ---------- j_sei : :class:`pybamm.Symbol` The SEI interfacial reaction current. Returns ------- variables : dict The variables which can be derived from the SEI currents. """ domain, Domain = self.domain_Domain j_sei = pybamm.size_average(j_sei) variables = { f"{Domain} electrode {self.reaction_name}" "interfacial current density [A.m-2]": j_sei, } if self.reaction_loc != "interface": j_sei_av = pybamm.x_average(j_sei) variables.update( { f"X-averaged {domain} electrode {self.reaction_name}" "interfacial current density [A.m-2]": j_sei_av, } ) return variables