def test_combine_geometries(self): geometry1Dmacro = pybamm.Geometry1DMacro() geometry1Dmicro = pybamm.Geometry1DMicro() geometry = pybamm.Geometry(geometry1Dmacro, geometry1Dmicro) self.assertEqual( set(geometry.keys()), set( [ "negative electrode", "separator", "positive electrode", "negative particle", "positive particle", "current collector", ] ), ) # update with custom geometry whole_cell = ["negative electrode", "separator", "positive electrode"] x = pybamm.SpatialVariable("x", whole_cell) custom_geometry = { "negative electrode": { "primary": {x: {"min": pybamm.Scalar(1), "max": pybamm.Scalar(2)}} } } geometry = pybamm.Geometry( geometry1Dmacro, geometry1Dmicro, custom_geometry=custom_geometry ) self.assertEqual( geometry["negative electrode"], custom_geometry["negative electrode"] )
def test_geometry_keys(self): geometry = pybamm.Geometry1DMacro() for prim_sec_vars in geometry.values(): spatial_vars = prim_sec_vars["primary"] all( self.assertIsInstance(spatial_var, pybamm.SpatialVariable) for spatial_var in spatial_vars.keys())
def test_mesh_sizes(self): param = pybamm.ParameterValues( values={ "Negative electrode thickness [m]": 0.1, "Separator thickness [m]": 0.2, "Positive electrode thickness [m]": 0.3, }) geometry = pybamm.Geometry1DMacro() param.process_geometry(geometry) # provide mesh properties var = pybamm.standard_spatial_vars var_pts = { var.x_n: 10, var.x_s: 10, var.x_p: 12, var.r_n: 5, var.r_p: 6 } submesh_types = { "negative electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "separator": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "negative particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "current collector": pybamm.MeshGenerator(pybamm.SubMesh0D), } mesh_type = pybamm.Mesh # create mesh mesh = mesh_type(geometry, submesh_types, var_pts) var_id_pts = {var.id: pts for var, pts in var_pts.items()} self.assertEqual(mesh["negative electrode"][0].npts, var_id_pts[var.x_n.id]) self.assertEqual(mesh["separator"][0].npts, var_id_pts[var.x_s.id]) self.assertEqual(mesh["positive electrode"][0].npts, var_id_pts[var.x_p.id]) self.assertEqual( len(mesh["negative electrode"][0].edges) - 1, var_id_pts[var.x_n.id]) self.assertEqual( len(mesh["separator"][0].edges) - 1, var_id_pts[var.x_s.id]) self.assertEqual( len(mesh["positive electrode"][0].edges) - 1, var_id_pts[var.x_p.id])
def test_add_custom_geometry(self): geometry = pybamm.Geometry1DMacro() whole_cell = ["negative electrode", "separator", "positive electrode"] x = pybamm.SpatialVariable("x", whole_cell) custom_geometry = { "negative electrode": { x: {"min": pybamm.Scalar(1), "max": pybamm.Scalar(2)} } } geometry.update(custom_geometry) self.assertEqual( geometry["negative electrode"], custom_geometry["negative electrode"] )
def test_mesh_creation(self): param = pybamm.ParameterValues( values={ "Negative electrode thickness [m]": 0.1, "Separator thickness [m]": 0.2, "Positive electrode thickness [m]": 0.3, }) geometry = pybamm.Geometry1DMacro() param.process_geometry(geometry) var = pybamm.standard_spatial_vars var_pts = { var.x_n: 10, var.x_s: 10, var.x_p: 12, var.r_n: 5, var.r_p: 6 } submesh_types = { "negative electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "separator": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "negative particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "current collector": pybamm.MeshGenerator(pybamm.SubMesh0D), } mesh_type = pybamm.Mesh # create mesh mesh = mesh_type(geometry, submesh_types, var_pts) # check boundary locations self.assertEqual(mesh["negative electrode"][0].edges[0], 0) self.assertEqual(mesh["positive electrode"][0].edges[-1], 1) # check internal boundary locations self.assertEqual(mesh["negative electrode"][0].edges[-1], mesh["separator"][0].edges[0]) self.assertEqual(mesh["positive electrode"][0].edges[0], mesh["separator"][0].edges[-1]) for domain in mesh: if domain != "current collector": self.assertEqual(len(mesh[domain][0].edges), len(mesh[domain][0].nodes) + 1)
def test_ghost_cells(self): param = pybamm.ParameterValues( values={ "Negative electrode thickness [m]": 0.1, "Separator thickness [m]": 0.2, "Positive electrode thickness [m]": 0.3, }) geometry = pybamm.Geometry1DMacro() param.process_geometry(geometry) # provide mesh properties var = pybamm.standard_spatial_vars var_pts = { var.x_n: 10, var.x_s: 10, var.x_p: 12, var.r_n: 5, var.r_p: 6 } submesh_types = { "negative electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "separator": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "negative particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "current collector": pybamm.MeshGenerator(pybamm.SubMesh0D), } mesh_type = pybamm.Mesh # create mesh mesh = mesh_type(geometry, submesh_types, var_pts) np.testing.assert_array_equal( mesh["negative electrode_left ghost cell"][0].edges[1], mesh["negative electrode"][0].edges[0], ) np.testing.assert_array_equal( mesh["negative electrode_left ghost cell"][0].edges[0], -mesh["negative electrode"][0].edges[1], ) np.testing.assert_array_equal( mesh["positive electrode_right ghost cell"][0].edges[0], mesh["positive electrode"][0].edges[-1], )
def test_combine_geometries_3D(self): geometry3Dmacro = pybamm.Geometry3DMacro() geometry1Dmicro = pybamm.Geometry1DMicro() geometry = pybamm.Geometry(geometry3Dmacro, geometry1Dmicro) self.assertEqual( set(geometry.keys()), set([ "negative electrode", "separator", "positive electrode", "negative particle", "positive particle", "current collector", ]), ) with self.assertRaises(ValueError): geometry1Dmacro = pybamm.Geometry1DMacro() geometry = pybamm.Geometry(geometry3Dmacro, geometry1Dmacro)
def test_init_failure(self): geometry = pybamm.Geometry1DMacro() submesh_types = { "negative electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "separator": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "negative particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "current collector": pybamm.MeshGenerator(pybamm.SubMesh0D), } with self.assertRaisesRegex(KeyError, "Points not given"): pybamm.Mesh(geometry, submesh_types, {}) var = pybamm.standard_spatial_vars var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 12} geometry = pybamm.Geometry1p1DMicro() with self.assertRaisesRegex(KeyError, "Points not given"): pybamm.Mesh(geometry, submesh_types, var_pts)
def test_mesh_coord_sys(self): param = pybamm.ParameterValues( values={ "Negative electrode thickness [m]": 0.1, "Separator thickness [m]": 0.2, "Positive electrode thickness [m]": 0.3, }) geometry = pybamm.Geometry1DMacro() param.process_geometry(geometry) var = pybamm.standard_spatial_vars var_pts = { var.x_n: 10, var.x_s: 10, var.x_p: 12, var.r_n: 5, var.r_p: 6 } submesh_types = { "negative electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "separator": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive electrode": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "negative particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "positive particle": pybamm.MeshGenerator(pybamm.Uniform1DSubMesh), "current collector": pybamm.MeshGenerator(pybamm.SubMesh0D), } mesh_type = pybamm.Mesh # create mesh mesh = mesh_type(geometry, submesh_types, var_pts) for submeshlist in mesh.values(): for submesh in submeshlist: if not isinstance(submesh, pybamm.SubMesh0D): self.assertTrue( submesh.coord_sys in pybamm.KNOWN_COORD_SYS)