Source code for pybamm.models.submodels.oxygen_diffusion.full_oxygen_diffusion
#
# Class for oxygen diffusion
#
import pybamm
from .base_oxygen_diffusion import BaseModel
[docs]
class Full(BaseModel):
"""Class for conservation of mass of oxygen. (Full refers to unreduced by
asymptotic methods)
In this model, extremely fast oxygen kinetics in the negative electrode imposes
zero oxygen concentration there, and so the oxygen variable only lives in the
separator and positive electrode. The boundary condition at the negative electrode/
separator interface is homogeneous Dirichlet.
Parameters
----------
param : parameter class
The parameters to use for this submodel
"""
def __init__(self, param):
super().__init__(param)
[docs]
def get_fundamental_variables(self):
# Oxygen concentration (oxygen concentration is zero in the negative electrode)
c_ox_n = pybamm.FullBroadcast(0, "negative electrode", "current collector")
c_ox_s = pybamm.Variable(
"Separator oxygen concentration [mol.m-3]",
domain="separator",
auxiliary_domains={"secondary": "current collector"},
)
c_ox_p = pybamm.Variable(
"Positive oxygen concentration [mol.m-3]",
domain="positive electrode",
auxiliary_domains={"secondary": "current collector"},
)
c_ox_s_p = pybamm.concatenation(
c_ox_s,
c_ox_p,
name="Separator and positive electrode oxygen concentration [mol.m-3]",
)
variables = {
"Separator and positive electrode oxygen concentration [mol.m-3]": c_ox_s_p
}
variables.update(
self._get_standard_concentration_variables(c_ox_n, c_ox_s, c_ox_p)
)
return variables
[docs]
def get_coupled_variables(self, variables):
tor_s = variables["Separator electrolyte transport efficiency"]
tor_p = variables["Positive electrolyte transport efficiency"]
tor = pybamm.concatenation(tor_s, tor_p)
c_ox = variables[
"Separator and positive electrode oxygen concentration [mol.m-3]"
]
# TODO: allow charge and convection?
v_box = pybamm.Scalar(0)
N_ox_diffusion = -tor * self.param.D_ox * pybamm.grad(c_ox)
N_ox = N_ox_diffusion + c_ox * v_box
# Flux in the negative electrode is zero
N_ox = pybamm.concatenation(
pybamm.FullBroadcast(0, "negative electrode", "current collector"), N_ox
)
variables.update(self._get_standard_flux_variables(N_ox))
return variables
[docs]
def set_rhs(self, variables):
eps_s = variables["Separator porosity"]
eps_p = variables["Positive electrode porosity"]
eps = pybamm.concatenation(eps_s, eps_p)
deps_dt_s = variables["Separator porosity change [s-1]"]
deps_dt_p = variables["Positive electrode porosity change [s-1]"]
deps_dt = pybamm.concatenation(deps_dt_s, deps_dt_p)
c_ox = variables[
"Separator and positive electrode oxygen concentration [mol.m-3]"
]
N_ox = variables["Oxygen flux [mol.m-2.s-1]"].orphans[1]
a_j_ox = variables[
"Positive electrode oxygen volumetric interfacial current density [A.m-3]"
]
source_terms = pybamm.concatenation(
pybamm.FullBroadcast(0, "separator", "current collector"),
self.param.s_ox_Ox * a_j_ox,
)
self.rhs = {
c_ox: (1 / eps)
* (-pybamm.div(N_ox) + source_terms / self.param.F - c_ox * deps_dt)
}
[docs]
def set_boundary_conditions(self, variables):
c_ox = variables[
"Separator and positive electrode oxygen concentration [mol.m-3]"
]
self.boundary_conditions = {
c_ox: {
"left": (pybamm.Scalar(0), "Dirichlet"),
"right": (pybamm.Scalar(0), "Neumann"),
}
}
[docs]
def set_initial_conditions(self, variables):
c_ox = variables[
"Separator and positive electrode oxygen concentration [mol.m-3]"
]
self.initial_conditions = {c_ox: self.param.c_ox_init}