Source code for pybamm.geometry.battery_geometry

#
# Function to create battery geometries
#
import pybamm


[docs]def battery_geometry( include_particles=True, options=None, form_factor="pouch", ): """ A convenience function to create battery geometries. Parameters ---------- include_particles : bool, optional Whether to include particle domains. Can be True (default) or False. options : dict, optional Dictionary of model options. Necessary for "particle-size geometry", relevant for lithium-ion chemistries. form_factor : str, optional The form factor of the cell. Can be "pouch" (default) or "cylindrical". Returns ------- :class:`pybamm.Geometry` A geometry class for the battery """ if options is None or type(options) == dict: options = pybamm.BatteryModelOptions(options) geo = pybamm.geometric_parameters l_n = geo.n.l l_s = geo.s.l l_n_l_s = l_n + l_s # Override print_name l_n_l_s.print_name = "l_n + l_s" # Set up electrode/separator/electrode geometry geometry = { "negative electrode": {"x_n": {"min": 0, "max": l_n}}, "separator": {"x_s": {"min": l_n, "max": l_n_l_s}}, "positive electrode": {"x_p": {"min": l_n_l_s, "max": 1}}, } # Add particle domains if include_particles is True: zero_one = {"min": 0, "max": 1} geometry.update( { "negative particle": {"r_n": zero_one}, "positive particle": {"r_p": zero_one}, } ) for domain in ["negative", "positive"]: phases = int(getattr(options, domain)["particle phases"]) if phases >= 2: geometry.update( { f"{domain} primary particle": {"r_n_prim": zero_one}, f"{domain} secondary particle": {"r_n_sec": zero_one}, } ) # Add particle size domains if options is not None and options["particle size"] == "distribution": R_min_n = geo.n.prim.R_min R_min_p = geo.p.prim.R_min R_max_n = geo.n.prim.R_max R_max_p = geo.p.prim.R_max geometry.update( { "negative particle size": {"R_n": {"min": R_min_n, "max": R_max_n}}, "positive particle size": {"R_p": {"min": R_min_p, "max": R_max_p}}, } ) # Add current collector domains current_collector_dimension = options["dimensionality"] if form_factor == "pouch": if current_collector_dimension == 0: geometry["current collector"] = {"z": {"position": 1}} elif current_collector_dimension == 1: geometry["current collector"] = { "z": {"min": 0, "max": 1}, "tabs": { "negative": {"z_centre": geo.n.centre_z_tab}, "positive": {"z_centre": geo.p.centre_z_tab}, }, } elif current_collector_dimension == 2: geometry["current collector"] = { "y": {"min": 0, "max": geo.l_y}, "z": {"min": 0, "max": geo.l_z}, "tabs": { "negative": { "y_centre": geo.n.centre_y_tab, "z_centre": geo.n.centre_z_tab, "width": geo.n.l_tab, }, "positive": { "y_centre": geo.p.centre_y_tab, "z_centre": geo.p.centre_z_tab, "width": geo.p.l_tab, }, }, } elif form_factor == "cylindrical": if current_collector_dimension == 0: geometry["current collector"] = {"r_macro": {"position": 1}} elif current_collector_dimension == 1: geometry["current collector"] = { "r_macro": {"min": geo.r_inner, "max": 1}, } else: raise pybamm.GeometryError( "Invalid current collector dimension '{}' (should be 0 or 1 for " "a 'cylindrical' battery geometry)".format(current_collector_dimension) ) else: raise pybamm.GeometryError( "Invalid form factor '{}' (should be 'pouch' or 'cylindrical'".format( form_factor ) ) return pybamm.Geometry(geometry)