Source code for pybamm.parameters.geometric_parameters
#
# Geometric Parameters
#
import pybamm
from .base_parameters import BaseParameters
[docs]class GeometricParameters(BaseParameters):
"""
Standard geometric parameters
Layout:
1. Dimensional Parameters
2. Dimensional Functions
3. Scalings
4. Dimensionless Parameters
5. Dimensionless Functions
"""
def __init__(self):
self.n = DomainGeometricParameters("Negative", self)
self.s = DomainGeometricParameters("Separator", self)
self.p = DomainGeometricParameters("Positive", self)
self.domain_params = [self.n, self.s, self.p]
# Set parameters and scales
self._set_dimensional_parameters()
self._set_scales()
self._set_dimensionless_parameters()
def _set_dimensional_parameters(self):
"""Defines the dimensional parameters."""
for domain in self.domain_params:
domain._set_dimensional_parameters()
# Macroscale geometry
self.L_x = (
self.n.L + self.s.L + self.p.L
) # Total distance between current collectors
self.L = self.n.L_cc + self.L_x + self.p.L_cc # Total cell thickness
self.L_Li = pybamm.Parameter("Lithium counter electrode thickness [m]")
self.L_y = pybamm.Parameter(
"Electrode width [m]"
) # For a cylindrical cell L_y is the "unwound" length of the electrode
self.L_z = pybamm.Parameter("Electrode height [m]")
self.r_inner_dimensional = pybamm.Parameter("Inner cell radius [m]")
self.r_outer_dimensional = pybamm.Parameter("Outer cell radius [m]")
self.A_cc = self.L_y * self.L_z # Current collector cross sectional area
self.A_cooling = pybamm.Parameter("Cell cooling surface area [m2]")
self.V_cell = pybamm.Parameter("Cell volume [m3]")
def _set_scales(self):
"""Define the scales used in the non-dimensionalisation scheme"""
for domain in self.domain_params:
domain._set_scales()
def _set_dimensionless_parameters(self):
"""Defines the dimensionless parameters."""
for domain in self.domain_params:
domain._set_dimensionless_parameters()
# Macroscale Geometry
self.l_x = self.L_x / self.L_x
self.l_Li = self.L_Li / self.L_x
self.l_y = self.L_y / self.L_z
self.l_z = self.L_z / self.L_z
self.r_inner = self.r_inner_dimensional / self.r_outer_dimensional
self.r_outer = self.r_outer_dimensional / self.r_outer_dimensional
self.a_cc = self.l_y * self.l_z
self.a_cooling = self.A_cooling / (self.L_z ** 2)
self.v_cell = self.V_cell / (self.L_x * self.L_z ** 2)
self.l = self.L / self.L_x
self.delta = self.L_x / self.L_z # Pouch cell aspect ratio
class DomainGeometricParameters(BaseParameters):
def __init__(self, domain, main_param):
self.domain = domain
self.main_param = main_param
def _set_dimensional_parameters(self):
"""Defines the dimensional parameters."""
Domain = self.domain
if self.domain == "Separator":
self.L = pybamm.Parameter("Separator thickness [m]")
self.b_e = pybamm.Parameter("Separator Bruggeman coefficient (electrolyte)")
return
# Macroscale geometry
self.L_cc = pybamm.Parameter(f"{Domain} current collector thickness [m]")
self.L = pybamm.Parameter(f"{Domain} electrode thickness [m]")
# Tab geometry (for pouch cells)
self.L_tab = pybamm.Parameter(f"{Domain} tab width [m]")
self.Centre_y_tab = pybamm.Parameter(f"{Domain} tab centre y-coordinate [m]")
self.Centre_z_tab = pybamm.Parameter(f"{Domain} tab centre z-coordinate [m]")
self.A_tab = self.L_tab * self.L_cc # Area of tab
# Microscale geometry
# Note: for li-ion cells, the definition of the surface area to
# volume ratio is overwritten in lithium_ion_parameters.py to be computed
# based on the assumed particle shape
self.a_dim = pybamm.Parameter(
f"{Domain} electrode surface area to volume ratio [m-1]"
)
self.b_e = pybamm.Parameter(
f"{Domain} electrode Bruggeman coefficient (electrolyte)"
)
self.b_s = pybamm.Parameter(
f"{Domain} electrode Bruggeman coefficient (electrode)"
)
# Particle-size distribution geometry
self.R_min_dim = pybamm.Parameter(f"{Domain} minimum particle radius [m]")
self.R_max_dim = pybamm.Parameter(f"{Domain} maximum particle radius [m]")
self.sd_a_dim = pybamm.Parameter(
f"{Domain} area-weighted particle-size standard deviation [m]"
)
@property
def R_dimensional(self):
if self.domain == "Negative":
x = pybamm.standard_spatial_vars.x_n
elif self.domain == "Positive":
x = pybamm.standard_spatial_vars.x_p
return pybamm.FunctionParameter(
f"{self.domain} particle radius [m]",
{"Through-cell distance (x) [m]": x * self.main_param.L_x},
)
def f_a_dist_dimensional(self, R):
"""
Dimensional electrode area-weighted particle-size distribution
"""
inputs = {f"{self.domain} particle-size variable [m]": R}
return pybamm.FunctionParameter(
f"{self.domain} area-weighted particle-size distribution [m-1]", inputs
)
def _set_scales(self):
"""Define the scales used in the non-dimensionalisation scheme"""
if self.domain == "Separator":
return
# Microscale geometry
# Note: these scales are necessary here to non-dimensionalise the
# particle size distributions.
self.R_typ = pybamm.xyz_average(self.R_dimensional)
def _set_dimensionless_parameters(self):
"""Defines the dimensionless parameters."""
main = self.main_param
# Macroscale Geometry
self.l = self.L / main.L_x
if self.domain == "Separator":
return
self.l_cc = self.L_cc / main.L_x
# Tab geometry (for pouch cells)
self.l_tab = self.L_tab / main.L_z
self.centre_y_tab = self.Centre_y_tab / main.L_z
self.centre_z_tab = self.Centre_z_tab / main.L_z
# Particle-size distribution geometry
self.R_min = self.R_min_dim / self.R_typ
self.R_max = self.R_max_dim / self.R_typ
self.sd_a = self.sd_a_dim / self.R_typ
# Particle radius
self.R = self.R_dimensional / self.R_typ
def f_a_dist(self, R):
"""
Dimensionless electrode area-weighted particle-size distribution
"""
R_dim = R * self.R_typ
return self.f_a_dist_dimensional(R_dim) * self.R_typ
geometric_parameters = GeometricParameters()