Source code for pybamm.models.submodels.convection.through_cell.full_convection
#
# Submodel for pressure driven convection
#
import pybamm
from .base_through_cell_convection import BaseThroughCellModel
[docs]
class Full(BaseThroughCellModel):
"""Submodel for the full model of pressure-driven convection
Parameters
----------
param : parameter class
The parameters to use for this submodel
"""
def __init__(self, param):
super().__init__(param)
[docs]
def get_fundamental_variables(self):
variables = {}
for domain in self.options.whole_cell_domains:
if domain != "separator":
Domain = domain.capitalize()
# Electrolyte pressure
p_k = pybamm.Variable(
f"{Domain} pressure [Pa]",
domain=domain,
auxiliary_domains={"secondary": "current collector"},
)
v_mass_k = -pybamm.grad(p_k)
v_box_k = v_mass_k
div_v_box_k = pybamm.div(v_box_k)
variables.update(
self._get_standard_convection_variables(
domain, v_box_k, div_v_box_k, p_k
)
)
return variables
[docs]
def get_coupled_variables(self, variables):
# Set up
L_n = self.param.n.L
x_s = pybamm.standard_spatial_vars.x_s
# Transverse velocity in the separator determines through-cell velocity
div_Vbox_s = variables[
"X-averaged separator transverse volume-averaged acceleration [m.s-2]"
]
i_boundary_cc = variables["Current collector current density [A.m-2]"]
v_box_n_right = -self.param.n.DeltaV * i_boundary_cc / self.param.F
div_v_box_s_av = -div_Vbox_s
div_v_box_s = pybamm.PrimaryBroadcast(div_v_box_s_av, "separator")
# Simple formula for velocity in the separator
v_box_s = div_v_box_s_av * (x_s - L_n) + v_box_n_right
variables.update(
self._get_standard_sep_velocity_variables(v_box_s, div_v_box_s)
)
variables.update(self._get_standard_whole_cell_velocity_variables(variables))
variables.update(
self._get_standard_whole_cell_acceleration_variables(variables)
)
variables.update(self._get_standard_whole_cell_pressure_variables(variables))
return variables
[docs]
def set_algebraic(self, variables):
p_n = variables["Negative electrode pressure [Pa]"]
p_p = variables["Positive electrode pressure [Pa]"]
a_j_n = variables[
"Negative electrode volumetric interfacial current density [A.m-3]"
]
a_j_p = variables[
"Positive electrode volumetric interfacial current density [A.m-3]"
]
v_box_n = variables["Negative electrode volume-averaged velocity [m.s-1]"]
v_box_p = variables["Positive electrode volume-averaged velocity [m.s-1]"]
# Problems in the x-direction for p_n and p_p
# multiply by Lx**2 to improve conditioning
self.algebraic = {
p_n: self.param.L_x**2
* (pybamm.div(v_box_n) + self.param.n.DeltaV * a_j_n / self.param.F),
p_p: self.param.L_x**2
* (pybamm.div(v_box_p) + self.param.p.DeltaV * a_j_p / self.param.F),
}
[docs]
def set_boundary_conditions(self, variables):
p_n = variables["Negative electrode pressure [Pa]"]
p_s = variables["X-averaged separator pressure [Pa]"]
p_p = variables["Positive electrode pressure [Pa]"]
# Boundary conditions in x-direction for p_n and p_p
self.boundary_conditions = {
p_n: {"left": (pybamm.Scalar(0), "Neumann"), "right": (p_s, "Dirichlet")},
p_p: {"left": (p_s, "Dirichlet"), "right": (pybamm.Scalar(0), "Neumann")},
}
[docs]
def set_initial_conditions(self, variables):
p_n = variables["Negative electrode pressure [Pa]"]
p_p = variables["Positive electrode pressure [Pa]"]
self.initial_conditions = {p_n: pybamm.Scalar(0), p_p: pybamm.Scalar(0)}