Source code for pybamm.models.full_battery_models.lead_acid.full

#
# Lead-acid Full model
#
import pybamm

from .base_lead_acid_model import BaseModel


[docs] class Full(BaseModel): """ Porous electrode model for lead-acid, from :footcite:t:`Sulzer2019asymptotic`, based on the Newman-Tiedemann model. See :class:`pybamm.lead_acid.BaseModel` for more details. """ def __init__(self, options=None, name="Full model", build=True): super().__init__(options, name) self.set_external_circuit_submodel() self.set_open_circuit_potential_submodel() self.set_intercalation_kinetics_submodel() self.set_interface_utilisation_submodel() self.set_porosity_submodel() self.set_active_material_submodel() self.set_transport_efficiency_submodels() self.set_convection_submodel() self.set_electrolyte_submodel() self.set_solid_submodel() self.set_thermal_submodel() self.set_surface_temperature_submodel() self.set_side_reaction_submodels() self.set_current_collector_submodel() self.set_sei_submodel() self.set_lithium_plating_submodel() self.set_total_interface_submodel() if build: self.build_model() pybamm.citations.register("Sulzer2019physical") def set_porosity_submodel(self): self.submodels["porosity"] = pybamm.porosity.ReactionDrivenODE( self.param, self.options, False ) def set_convection_submodel(self): if self.options["convection"] == "none": self.submodels["transverse convection"] = ( pybamm.convection.transverse.NoConvection(self.param) ) self.submodels["through-cell convection"] = ( pybamm.convection.through_cell.NoConvection(self.param) ) else: if self.options["convection"] == "uniform transverse": self.submodels["transverse convection"] = ( pybamm.convection.transverse.Uniform(self.param) ) elif self.options["convection"] == "full transverse": self.submodels["transverse convection"] = ( pybamm.convection.transverse.Full(self.param) ) self.submodels["through-cell convection"] = ( pybamm.convection.through_cell.Full(self.param) ) def set_intercalation_kinetics_submodel(self): for domain in ["negative", "positive"]: intercalation_kinetics = self.get_intercalation_kinetics(domain) self.submodels[f"{domain} interface"] = intercalation_kinetics( self.param, domain, "lead-acid main", self.options, "primary" ) def set_solid_submodel(self): if self.options["surface form"] == "false": submod_n = pybamm.electrode.ohm.Full(self.param, "negative") submod_p = pybamm.electrode.ohm.Full(self.param, "positive") else: submod_n = pybamm.electrode.ohm.SurfaceForm(self.param, "negative") submod_p = pybamm.electrode.ohm.SurfaceForm(self.param, "positive") self.submodels["negative electrode potential"] = submod_n self.submodels["positive electrode potential"] = submod_p def set_electrolyte_submodel(self): surf_form = pybamm.electrolyte_conductivity.surface_potential_form self.submodels["electrolyte diffusion"] = pybamm.electrolyte_diffusion.Full( self.param ) if self.options["surface form"] == "false": self.submodels["electrolyte conductivity"] = ( pybamm.electrolyte_conductivity.Full(self.param) ) surf_model = surf_form.Explicit elif self.options["surface form"] == "differential": surf_model = surf_form.FullDifferential elif self.options["surface form"] == "algebraic": surf_model = surf_form.FullAlgebraic for domain in ["negative", "separator", "positive"]: self.submodels[f"{domain} surface potential difference"] = surf_model( self.param, domain, self.options ) def set_side_reaction_submodels(self): if self.options["hydrolysis"] == "true": self.submodels["oxygen diffusion"] = pybamm.oxygen_diffusion.Full( self.param ) self.submodels["positive oxygen interface"] = pybamm.kinetics.ForwardTafel( self.param, "positive", "lead-acid oxygen", self.options, "primary" ) self.submodels["negative oxygen interface"] = ( pybamm.kinetics.DiffusionLimited( self.param, "negative", "lead-acid oxygen", self.options, order="full", ) ) else: self.submodels["oxygen diffusion"] = pybamm.oxygen_diffusion.NoOxygen( self.param ) self.submodels["positive oxygen interface"] = pybamm.kinetics.NoReaction( self.param, "positive", "lead-acid oxygen", "primary" ) self.submodels["negative oxygen interface"] = pybamm.kinetics.NoReaction( self.param, "negative", "lead-acid oxygen", "primary" )