Exemple #1
0
    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"]
        )
Exemple #2
0
 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())
Exemple #3
0
    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])
Exemple #4
0
 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"]
     )
Exemple #5
0
    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)
Exemple #6
0
    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],
        )
Exemple #7
0
    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)
Exemple #8
0
    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)
Exemple #9
0
    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)