Source code for pybamm.parameters.thermal_parameters
#
# Standard thermal parameters
#
import pybamm
from .base_parameters import BaseParameters
[docs]class ThermalParameters(BaseParameters):
"""
Standard thermal parameters
Layout:
1. Dimensional Parameters
2. Dimensional Functions
3. Dimensionless Parameters
4. Dimensionless Functions
"""
def __init__(self):
# Get geometric parameters
self.geo = pybamm.geometric_parameters
self.n = DomainThermalParameters("negative", self)
self.s = DomainThermalParameters("separator", self)
self.p = DomainThermalParameters("positive", self)
self.domain_params = {
"negative": self.n,
"separator": self.s,
"positive": self.p,
}
# Set parameters
self._set_dimensional_parameters()
self._set_dimensionless_parameters()
def _set_dimensional_parameters(self):
"""Defines the dimensional parameters"""
for domain in self.domain_params.values():
domain._set_dimensional_parameters()
# Reference temperature
self.T_ref = pybamm.Parameter("Reference temperature [K]")
# Cooling coefficient
self.h_edge_dim = pybamm.Parameter("Edge heat transfer coefficient [W.m-2.K-1]")
self.h_total_dim = pybamm.Parameter(
"Total heat transfer coefficient [W.m-2.K-1]"
)
# Typical temperature rise
self.Delta_T = pybamm.Scalar(1)
# Initial temperature
self.T_init_dim = pybamm.Parameter("Initial temperature [K]")
# References
self.rho_eff_dim_ref = self.rho_eff_dim(self.T_ref)
self.lambda_eff_dim_ref = self.lambda_eff_dim(self.T_ref)
# Planar (y,z) thermal diffusion timescale
self.tau_th_yz = (
self.rho_eff_dim_ref * (self.geo.L_z**2) / self.lambda_eff_dim_ref
)
def T_amb_dim(self, t):
"""Dimensional ambient temperature"""
return pybamm.FunctionParameter("Ambient temperature [K]", {"Time [s]": t})
def rho_eff_dim(self, T):
"""Effective volumetric heat capacity [J.m-3.K-1]"""
return (
self.n.rho_cc_dim(T) * self.n.c_p_cc_dim(T) * self.geo.n.L_cc
+ self.n.rho_dim(T) * self.n.c_p_dim(T) * self.geo.n.L
+ self.s.rho_dim(T) * self.s.c_p_dim(T) * self.geo.s.L
+ self.p.rho_dim(T) * self.p.c_p_dim(T) * self.geo.p.L
+ self.p.rho_cc_dim(T) * self.p.c_p_cc_dim(T) * self.geo.p.L_cc
) / self.geo.L
def lambda_eff_dim(self, T):
"""Effective thermal conductivity [W.m-1.K-1]"""
return (
self.n.lambda_cc_dim(T) * self.geo.n.L_cc
+ self.n.lambda_dim(T) * self.geo.n.L
+ self.s.lambda_dim(T) * self.geo.s.L
+ self.p.lambda_dim(T) * self.geo.p.L
+ self.p.lambda_cc_dim(T) * self.geo.p.L_cc
) / self.geo.L
def _set_dimensionless_parameters(self):
"""Defines the dimensionless parameters"""
for domain in self.domain_params.values():
domain._set_dimensionless_parameters()
# Relative temperature rise
self.Theta = self.Delta_T / self.T_ref
# Cooling coefficient
self.h_edge = self.h_edge_dim * self.geo.L_x / self.lambda_eff_dim_ref
self.h_total = self.h_total_dim * self.geo.L_x / self.lambda_eff_dim_ref
# Initial temperature
self.T_init = (self.T_init_dim - self.T_ref) / self.Delta_T
def rho(self, T):
"""
Dimensionless effective density, not to be confused with rho_eff_dim,
which is the dimensional effective volumetric heat capacity
"""
return (
self.n.rho_cc(T) * self.geo.n.l_cc
+ self.n.rho(T) * self.geo.n.l
+ self.s.rho(T) * self.geo.s.l
+ self.p.rho(T) * self.geo.p.l
+ self.p.rho_cc(T) * self.geo.p.l_cc
) / self.geo.l
def T_amb(self, t):
"""Dimensionless ambient temperature"""
return (self.T_amb_dim(t) - self.T_ref) / self.Delta_T
class DomainThermalParameters(BaseParameters):
def __init__(self, domain, main_param):
self.domain = domain
self.main_param = main_param
def _set_dimensional_parameters(self):
Domain = self.domain.capitalize()
self.h_cc_dim = pybamm.Parameter(
f"{Domain} current collector surface heat transfer coefficient "
"[W.m-2.K-1]"
)
self.h_tab_dim = pybamm.Parameter(
f"{Domain} tab heat transfer coefficient [W.m-2.K-1]"
)
def c_p_dim(self, T):
"""Electrode specific heat capacity [J.kg-1.K-1]"""
inputs = {"Temperature [K]": T}
if self.domain == "separator":
name = "Separator specific heat capacity [J.kg-1.K-1]"
else:
Domain = self.domain.capitalize()
name = f"{Domain} electrode specific heat capacity [J.kg-1.K-1]"
return pybamm.FunctionParameter(name, inputs)
def c_p_cc_dim(self, T):
"""Current collector specific heat capacity [J.kg-1.K-1]"""
inputs = {"Temperature [K]": T}
Domain = self.domain.capitalize()
return pybamm.FunctionParameter(
f"{Domain} current collector specific heat capacity [J.kg-1.K-1]",
inputs,
)
def lambda_dim(self, T):
"""Electrode thermal conductivity [W.m-1.K-1]"""
inputs = {"Temperature [K]": T}
if self.domain == "separator":
name = "Separator thermal conductivity [W.m-1.K-1]"
else:
Domain = self.domain.capitalize()
name = f"{Domain} electrode thermal conductivity [W.m-1.K-1]"
return pybamm.FunctionParameter(name, inputs)
def lambda_cc_dim(self, T):
"""Current collector thermal conductivity [W.m-1.K-1]"""
inputs = {"Temperature [K]": T}
Domain = self.domain.capitalize()
return pybamm.FunctionParameter(
f"{Domain} current collector thermal conductivity [W.m-1.K-1]", inputs
)
def rho_dim(self, T):
"""Electrode density [kg.m-3]"""
inputs = {"Temperature [K]": T}
if self.domain == "separator":
name = "Separator density [kg.m-3]"
else:
Domain = self.domain.capitalize()
name = f"{Domain} electrode density [kg.m-3]"
return pybamm.FunctionParameter(name, inputs)
def rho_cc_dim(self, T):
"""Current collector density [kg.m-3]"""
inputs = {"Temperature [K]": T}
Domain = self.domain.capitalize()
return pybamm.FunctionParameter(
f"{Domain} current collector density [kg.m-3]", inputs
)
def _set_dimensionless_parameters(self):
main = self.main_param
self.h_cc = self.h_cc_dim * main.geo.L_x / main.lambda_eff_dim_ref
self.h_tab = self.h_tab_dim * main.geo.L_x / main.lambda_eff_dim_ref
def rho(self, T):
"""Dimensionless electrode density"""
T_dim = self.main_param.Delta_T * T + self.main_param.T_ref
return (
self.rho_dim(T_dim) * self.c_p_dim(T_dim) / self.main_param.rho_eff_dim_ref
)
def rho_cc(self, T):
"""Dimensionless current collector density"""
T_dim = self.main_param.Delta_T * T + self.main_param.T_ref
return (
self.rho_cc_dim(T_dim)
* self.c_p_cc_dim(T_dim)
/ self.main_param.rho_eff_dim_ref
)
def lambda_(self, T): # cannot call a function "lambda"
"""Dimensionless electrode thermal conductivity"""
T_dim = self.main_param.Delta_T * T + self.main_param.T_ref
return self.lambda_dim(T_dim) / self.main_param.lambda_eff_dim_ref
def lambda_cc(self, T):
"""Dimensionless current collector thermal conductivity"""
T_dim = self.main_param.Delta_T * T + self.main_param.T_ref
return self.lambda_cc_dim(T_dim) / self.main_param.lambda_eff_dim_ref
thermal_parameters = ThermalParameters()