Source code for pybamm.models.submodels.electrolyte_diffusion.base_electrolyte_diffusion
#
# Base class for electrolyte diffusion
#
import pybamm
[docs]
class BaseElectrolyteDiffusion(pybamm.BaseSubModel):
"""Base class for conservation of mass in the electrolyte.
Parameters
----------
param : parameter class
The parameters to use for this submodel
options : dict, optional
A dictionary of options to be passed to the model.
"""
def __init__(self, param, options=None):
super().__init__(param, options=options)
def _get_standard_concentration_variables(self, c_e_dict):
"""
A private function to obtain the standard variables which
can be derived from the concentration in the electrolyte.
Parameters
----------
c_e_dict : dict of :class:`pybamm.Symbol`
Electrolyte concentrations in the various domains
Returns
-------
variables : dict
The variables which can be derived from the concentration in the
electrolyte.
"""
c_e = pybamm.concatenation(*c_e_dict.values())
# Override print_name
c_e.print_name = "c_e"
variables = self._get_standard_domain_concentration_variables(c_e_dict)
variables.update(self._get_standard_whole_cell_concentration_variables(c_e))
return variables
def _get_standard_domain_concentration_variables(self, c_e_dict):
variables = {}
# Case where an electrode is not included (half-cell)
if "negative electrode" not in self.options.whole_cell_domains:
c_e_s = c_e_dict["separator"]
c_e_dict["negative electrode"] = pybamm.boundary_value(c_e_s, "left")
for domain, c_e_k in c_e_dict.items():
domain = domain.split()[0]
Domain = domain.capitalize()
c_e_k_av = pybamm.x_average(c_e_k)
variables.update(
{
f"{Domain} electrolyte concentration [mol.m-3]": c_e_k,
f"X-averaged {domain} electrolyte "
"concentration [mol.m-3]": c_e_k_av,
}
)
# Calculate dimensionless and molar variables
variables_dim = variables.copy()
for name, var in variables_dim.items():
name = name.replace("[mol.m-3]", "[Molar]")
variables[name] = var / 1000
return variables
def _get_standard_whole_cell_concentration_variables(self, c_e):
c_e.print_name = "c_e"
variables = {
"Electrolyte concentration [mol.m-3]": c_e,
"X-averaged electrolyte concentration [mol.m-3]": pybamm.x_average(c_e),
}
variables_nondim = variables.copy()
for name, var in variables_nondim.items():
name = name.replace("[mol.m-3]", "[Molar]")
variables[name] = var / 1000
return variables
def _get_standard_porosity_times_concentration_variables(self, eps_c_e_dict):
eps_c_e = pybamm.concatenation(*eps_c_e_dict.values())
variables = {"Porosity times concentration [mol.m-3]": eps_c_e}
for domain, eps_c_e_k in eps_c_e_dict.items():
Domain = domain.capitalize()
variables[f"{Domain} porosity times concentration [mol.m-3]"] = eps_c_e_k
# Total lithium concentration in electrolyte
variables.update(self._get_total_concentration_electrolyte(eps_c_e))
return variables
def _get_standard_flux_variables(self, N_e):
"""
A private function to obtain the standard variables which
can be derived from the mass flux in the electrolyte.
Parameters
----------
N_e : :class:`pybamm.Symbol`
The flux in the electrolyte.
Returns
-------
variables : dict
The variables which can be derived from the flux in the
electrolyte.
"""
variables = {"Electrolyte flux [mol.m-2.s-1]": N_e}
return variables
def _get_total_concentration_electrolyte(self, eps_c_e):
"""
A private function to obtain the total ion concentration in the electrolyte.
Parameters
----------
eps_c_e : :class:`pybamm.Symbol`
Porosity times electrolyte concentration
Returns
-------
variables : dict
The "Total lithium in electrolyte [mol]" variable.
"""
L_x = self.param.L_x
A = self.param.A_cc
eps_c_e_av = pybamm.yz_average(pybamm.x_average(eps_c_e))
variables = {"Total lithium in electrolyte [mol]": L_x * A * eps_c_e_av}
return variables