Source code for pybamm.models.full_battery_models.lithium_ion.newman_tobias
#
# Newman Tobias Model
#
import pybamm
from .dfn import DFN
[docs]
class NewmanTobias(DFN):
"""
Newman-Tobias model of a lithium-ion battery based on the formulation in
:footcite:t:`Newman1962`. This model assumes a uniform concentration profile in the
electrolyte. Unlike the model posed in :footcite:t:`Newman1962`, this model accounts
for nonlinear Butler-Volmer kinetics. It also tracks the average concentration in
the solid phase in each electrode, which is equivalent to including an equation for
the local state of charge as in :footcite:t:`Chu2020`. The user can pass the
"particle" option to include mass transport in the particles.
See :class:`pybamm.lithium_ion.BaseModel` for more details.
"""
def __init__(self, options=None, name="Newman-Tobias model", build=True):
# Set default option "uniform profile" for particle submodel. Other
# default options are those given in `pybamm.BatteryModelOptions` defined in
# `base_battery_model.py`.
options = options or {}
if "particle" not in options:
options["particle"] = "uniform profile"
self.x_average = True
super().__init__(options, name, build)
pybamm.citations.register("Newman1962")
pybamm.citations.register("Chu2020")
def set_particle_submodel(self):
for domain in ["negative", "positive"]:
particle = getattr(self.options, domain)["particle"]
for phase in self.options.phases[domain]:
if particle == "Fickian diffusion":
submod = pybamm.particle.FickianDiffusion(
self.param, domain, self.options, phase=phase, x_average=True
)
elif particle in [
"uniform profile",
"quadratic profile",
"quartic profile",
]:
submod = pybamm.particle.XAveragedPolynomialProfile(
self.param, domain, self.options, phase=phase
)
elif particle == "MSMR":
submod = pybamm.particle.MSMRDiffusion(
self.param, domain, self.options, phase=phase, x_average=True
)
# also set the submodel for calculating stoichiometry from
# potential
self.submodels[f"{domain} {phase} stoichiometry"] = (
pybamm.particle.MSMRStoichiometryVariables(
self.param,
domain,
self.options,
phase=phase,
x_average=True,
)
)
self.submodels[f"{domain} {phase} particle"] = submod
self.submodels[f"{domain} {phase} total particle concentration"] = (
pybamm.particle.TotalConcentration(
self.param, domain, self.options, phase
)
)
def set_electrolyte_concentration_submodel(self):
self.submodels["electrolyte diffusion"] = (
pybamm.electrolyte_diffusion.ConstantConcentration(self.param)
)