Source code for pybamm.models.submodels.thermal.lumped
#
# Class for lumped thermal submodel
#
import pybamm
from .base_thermal import BaseThermal
[docs]
class Lumped(BaseThermal):
"""
Class for lumped thermal submodel. For more information see :footcite:t:`Timms2021`
and :footcite:t:`Marquis2020`.
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, x_average=False):
super().__init__(param, options=options, x_average=x_average)
pybamm.citations.register("Timms2021")
[docs]
def get_fundamental_variables(self):
T_vol_av = pybamm.Variable(
"Volume-averaged cell temperature [K]",
scale=self.param.T_ref,
print_name="T_av",
)
T_x_av = pybamm.PrimaryBroadcast(T_vol_av, ["current collector"])
T_dict = {
"negative current collector": T_x_av,
"positive current collector": T_x_av,
"x-averaged cell": T_x_av,
"volume-averaged cell": T_vol_av,
}
for domain in ["negative electrode", "separator", "positive electrode"]:
T_dict[domain] = pybamm.PrimaryBroadcast(T_x_av, domain)
variables = self._get_standard_fundamental_variables(T_dict)
return variables
[docs]
def get_coupled_variables(self, variables):
variables.update(self._get_standard_coupled_variables(variables))
# Newton cooling, accounting for surface area to volume ratio
T_vol_av = variables["Volume-averaged cell temperature [K]"]
T_surf = variables["Surface temperature [K]"]
V = variables["Cell thermal volume [m3]"]
Q_cool_W = -self.param.h_total * (T_vol_av - T_surf) * self.param.A_cooling
Q_cool_vol_av = Q_cool_W / V
# Contact resistance heating Q_cr
if self.options["contact resistance"] == "true":
I = variables["Current [A]"]
Q_cr_W = self.calculate_Q_cr_W(I, self.param.R_contact)
V = self.param.V_cell
Q_cr_vol_av = self.calculate_Q_cr_vol_av(I, self.param.R_contact, V)
else:
Q_cr_W = pybamm.Scalar(0)
Q_cr_vol_av = Q_cr_W
variables.update(
{
# Lumped cooling
"Surface total cooling [W.m-3]": Q_cool_vol_av,
"Surface total cooling [W]": Q_cool_W,
# Contact resistance
"Lumped contact resistance heating [W.m-3]": Q_cr_vol_av,
"Lumped contact resistance heating [W]": Q_cr_W,
}
)
return variables
[docs]
def set_rhs(self, variables):
T_vol_av = variables["Volume-averaged cell temperature [K]"]
Q_vol_av = variables["Volume-averaged total heating [W.m-3]"]
Q_cool_vol_av = variables["Surface total cooling [W.m-3]"]
Q_cr_vol_av = variables["Lumped contact resistance heating [W.m-3]"]
rho_c_p_eff_av = variables[
"Volume-averaged effective heat capacity [J.K-1.m-3]"
]
self.rhs = {T_vol_av: (Q_vol_av + Q_cr_vol_av + Q_cool_vol_av) / rho_c_p_eff_av}
[docs]
def set_initial_conditions(self, variables):
T_vol_av = variables["Volume-averaged cell temperature [K]"]
T_init_av = pybamm.x_average(self.param.T_init)
self.initial_conditions = {T_vol_av: T_init_av}
def calculate_Q_cr_W(self, current, contact_resistance):
Q_cr_W = current**2 * contact_resistance
return Q_cr_W
def calculate_Q_cr_vol_av(self, current, contact_resistance, volume):
Q_cr_W = self.calculate_Q_cr_W(current, contact_resistance)
Q_cr_vol_av = Q_cr_W / volume
return Q_cr_vol_av