Source code for pybamm.models.submodels.electrode.ohm.composite_ohm
#
# Composite model for Ohm's law in the electrode
#
import pybamm
from .base_ohm import BaseModel
[docs]
class Composite(BaseModel):
"""An explicit composite leading and first order solution to solid phase
current conservation with ohm's law. Note that the returned current density is
only the leading order approximation.
Parameters
----------
param : parameter class
The parameters to use for this submodel
domain : str
Either 'Negative electrode' or 'Positive electrode'
options : dict, optional
A dictionary of options to be passed to the model.
"""
def __init__(self, param, domain, options=None):
super().__init__(param, domain, options=options)
[docs]
def get_coupled_variables(self, variables):
domain = self.domain
i_boundary_cc = variables["Current collector current density [A.m-2]"]
# import parameters and spatial variables
L_n = self.param.n.L
L_p = self.param.p.L
L_x = self.param.L_x
x_n = pybamm.standard_spatial_vars.x_n
x_p = pybamm.standard_spatial_vars.x_p
tor = variables[f"X-averaged {domain} electrode transport efficiency"]
phi_s_cn = variables["Negative current collector potential [V]"]
T = variables[f"X-averaged {domain} electrode temperature [K]"]
sigma_eff = self.domain_param.sigma(T) * tor
if self._domain == "negative":
phi_s = phi_s_cn + (i_boundary_cc / sigma_eff) * (
x_n * (x_n - 2 * L_n) / (2 * L_n)
)
i_s = i_boundary_cc * (1 - x_n / L_n)
elif self.domain == "positive":
delta_phi_p_av = variables[
"X-averaged positive electrode surface potential difference [V]"
]
phi_e_p_av = variables["X-averaged positive electrolyte potential [V]"]
const = (
delta_phi_p_av
+ phi_e_p_av
+ (i_boundary_cc / sigma_eff) * (L_x - L_p / 3)
)
phi_s = const - (i_boundary_cc / sigma_eff) * (
x_p + (x_p - L_x) ** 2 / (2 * L_p)
)
i_s = i_boundary_cc * (1 - (L_x - x_p) / L_p)
variables.update(self._get_standard_potential_variables(phi_s))
variables.update(self._get_standard_current_variables(i_s))
if self.domain == "positive":
variables.update(self._get_standard_whole_cell_variables(variables))
return variables
[docs]
def set_boundary_conditions(self, variables):
domain, Domain = self.domain_Domain
phi_s = variables[f"{Domain} electrode potential [V]"]
tor = variables[f"X-averaged {domain} electrode transport efficiency"]
i_boundary_cc = variables["Current collector current density [A.m-2]"]
T = variables[f"X-averaged {domain} electrode temperature [K]"]
if self.domain == "negative":
lbc = (pybamm.Scalar(0), "Dirichlet")
rbc = (pybamm.Scalar(0), "Neumann")
elif self.domain == "positive":
lbc = (pybamm.Scalar(0), "Neumann")
sigma_eff = self.param.p.sigma(T) * tor
rbc = (-i_boundary_cc / sigma_eff, "Neumann")
self.boundary_conditions[phi_s] = {"left": lbc, "right": rbc}