Source code for pybamm.models.submodels.electrode.base_electrode

#
# Base class for electrode submodels
#
import pybamm


[docs] class BaseElectrode(pybamm.BaseSubModel): """Base class for electrode submodels. 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. set_positive_potential : bool, optional If True the battery model sets the positive potential based on the current. If False, the potential is specified by the user. Default is True. """ def __init__(self, param, domain, options=None, set_positive_potential=True): super().__init__(param, domain, options=options) self.set_positive_potential = set_positive_potential def _get_standard_potential_variables(self, phi_s): """ A private function to obtain the standard variables which can be derived from the potential in the electrode. Parameters ---------- phi_s : :class:`pybamm.Symbol` The potential in the electrode. Returns ------- variables : dict The variables which can be derived from the potential in the electrode. """ domain, Domain = self.domain_Domain phi_s_av = pybamm.x_average(phi_s) if self.domain == "negative": delta_phi_s = pybamm.boundary_value(phi_s, "left") - phi_s elif self.domain == "positive": delta_phi_s = pybamm.boundary_value(phi_s, "right") - phi_s delta_phi_s_av = pybamm.x_average(delta_phi_s) variables = { f"{Domain} electrode potential [V]": phi_s, f"X-averaged {domain} electrode potential [V]": phi_s_av, f"{Domain} electrode ohmic losses [V]": delta_phi_s, f"X-averaged {domain} electrode ohmic losses [V]": delta_phi_s_av, } if self.options.electrode_types[self.domain] == "porous": variables.update( { f"Gradient of {domain} electrode potential [V.m-1]": pybamm.grad( phi_s ), } ) return variables def _get_standard_current_variables(self, i_s): """ A private function to obtain the standard variables which can be derived from the current in the electrode. Parameters ---------- i_s : :class:`pybamm.Symbol` The current in the electrode. Returns ------- variables : dict The variables which can be derived from the current in the electrode. """ Domain = self.domain.capitalize() variables = { f"{Domain} electrode current density [A.m-2]": i_s, } return variables def _get_standard_current_collector_potential_variables( self, phi_s_cn, phi_s_cp, delta_phi_contact ): """ A private function to obtain the standard variables which can be derived from the potentials in the current collector. Parameters ---------- phi_s_cn : :class:`pybamm.Symbol` The potential in the negative current collector. phi_s_cp : :class:`pybamm.Symbol` The potential in the positive current collector. delta_phi_contact : :class:`pybamm.Symbol` The potential difference due to the contact resistance, if any. Returns ------- variables : dict The variables which can be derived from the potential in the current collector. """ # Local potential difference V_cc = phi_s_cp - phi_s_cn # Voltage # Note phi_s_cn is always zero at the negative tab by definition V = pybamm.boundary_value(phi_s_cp, "positive tab") # Voltage is local current collector potential difference at the tabs, in 1D # this will be equal to the local current collector potential difference variables = { "Negative current collector potential [V]": phi_s_cn, "Positive current collector potential [V]": phi_s_cp, "Local voltage [V]": V_cc, "Voltage expression [V]": V - delta_phi_contact, "Terminal voltage [V]": V - delta_phi_contact, "Contact overpotential [V]": delta_phi_contact, } if self.options["voltage as a state"] == "false": variables.update({"Voltage [V]": V - delta_phi_contact}) return variables def _get_standard_whole_cell_variables(self, variables): """ A private function to obtain the whole-cell versions of the current variables. Parameters ---------- variables : dict The variables in the whole model. Returns ------- variables : dict The variables in the whole model with the whole-cell current variables added. """ if "negative electrode" not in self.options.whole_cell_domains: i_s_n = None else: i_s_n = variables["Negative electrode current density [A.m-2]"] i_s_s = pybamm.FullBroadcast(0, ["separator"], "current collector") i_s_p = variables["Positive electrode current density [A.m-2]"] i_s = pybamm.concatenation(i_s_n, i_s_s, i_s_p) variables.update({"Electrode current density [A.m-2]": i_s}) if self.set_positive_potential: # Get phi_s_cn from the current collector submodel and phi_s_p from the # electrode submodel phi_s_cn = variables["Negative current collector potential [V]"] phi_s_p = variables["Positive electrode potential [V]"] phi_s_cp = pybamm.boundary_value(phi_s_p, "right") if self.options["contact resistance"] == "true": I = variables["Current [A]"] delta_phi_contact = I * self.param.R_contact else: delta_phi_contact = pybamm.Scalar(0) variables.update( self._get_standard_current_collector_potential_variables( phi_s_cn, phi_s_cp, delta_phi_contact ) ) return variables