From 1bb0514197933c37cd660811c33b58c79b277811 Mon Sep 17 00:00:00 2001 From: Bruno Turcksin Date: Thu, 4 Apr 2024 13:35:10 -0400 Subject: [PATCH] Add GridGenerator::subdivided_cylinder to the python wrappers --- .../include/triangulation_wrapper.h | 6 +++ .../source/export_triangulation.cc | 24 +++++++++++ .../source/triangulation_wrapper.cc | 42 +++++++++++++++++++ .../tests/triangulation_wrapper.py | 7 ++++ 4 files changed, 79 insertions(+) diff --git a/contrib/python-bindings/include/triangulation_wrapper.h b/contrib/python-bindings/include/triangulation_wrapper.h index 7422c11ac6..a2710fa513 100644 --- a/contrib/python-bindings/include/triangulation_wrapper.h +++ b/contrib/python-bindings/include/triangulation_wrapper.h @@ -291,6 +291,12 @@ namespace python void generate_cylinder(const double radius = 1., const double half_length = 1.); + /*! @copydoc GridGenerator::subdivided_cylinder + */ + void + generate_subdivided_cylinder(const unsigned int x_subdivisions, + const double radius = 1., + const double half_length = 1.); /*! @copydoc GridGenerator::hyper_shell */ void diff --git a/contrib/python-bindings/source/export_triangulation.cc b/contrib/python-bindings/source/export_triangulation.cc index 65b1bbdac0..76b65b8f60 100644 --- a/contrib/python-bindings/source/export_triangulation.cc +++ b/contrib/python-bindings/source/export_triangulation.cc @@ -114,6 +114,10 @@ namespace python generate_cylinder, 0, 2) + BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(generate_subdivided_cylinder_overloads, + generate_subdivided_cylinder, + 1, + 3) BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(generate_hyper_shell_overloads, generate_hyper_shell, 3, @@ -347,6 +351,20 @@ namespace python + const char generate_subdivided_cylinder_docstring[] = + "Create a dim dimensional cylinder where the x-axis serves as the axis \n" + "of the cylinder. For the purposes of this function, a cylinder is \n" + "defined as a (dim - 1) dimensional disk of given radius, extruded \n" + "along the axis of the cylinder (which is the first coordinate \n" + "direction). Consequently, in three dimensions, the cylinder extends \n" + "from x=-half_length to x=+half_length and its projection into the \n" + "yz-plane is a circle of radius radius. In two dimensions, the \n" + "cylinder is a rectangle from x=-half_length to x=+half_length and \n" + "from y=-radius to y=radius. This function is only implemented for \n" + "dim == 3. \n"; + + + const char generate_hyper_cube_with_cylindrical_hole_docstring[] = "This function produces a square in the xy-plane with a cylindrical \n" "hole in the middle. In 3d, this geometry is extruded in z direction \n" @@ -733,6 +751,12 @@ namespace python generate_cylinder_overloads( boost::python::args("self", "radius", "half_length"), generate_cylinder_docstring)) + .def("generate_subdivided_cylinder", + &TriangulationWrapper::generate_subdivided_cylinder, + generate_subdivided_cylinder_overloads( + boost::python::args( + "self", "x_subdivisions", "radius", "half_length"), + generate_subdivided_cylinder_docstring)) .def("generate_hyper_shell", &TriangulationWrapper::generate_hyper_shell, generate_hyper_shell_overloads(boost::python::args("self", diff --git a/contrib/python-bindings/source/triangulation_wrapper.cc b/contrib/python-bindings/source/triangulation_wrapper.cc index 1f131c00d2..9faa68faa9 100644 --- a/contrib/python-bindings/source/triangulation_wrapper.cc +++ b/contrib/python-bindings/source/triangulation_wrapper.cc @@ -577,6 +577,24 @@ namespace python + template + void + generate_subdivided_cylinder(const unsigned int x_subdivisions, + const double radius, + const double half_length, + void *triangulation) + { + Triangulation *tria = + static_cast *>(triangulation); + tria->clear(); + GridGenerator::subdivided_cylinder(*tria, + x_subdivisions, + radius, + half_length); + } + + + template void scale(const double scaling_factor, void *triangulation) @@ -1631,6 +1649,30 @@ namespace python + void + TriangulationWrapper::generate_subdivided_cylinder( + const unsigned int x_subdivisions, + const double radius, + const double half_length) + { + AssertThrow( + dim == spacedim, + ExcMessage( + "This function is only implemented for dim equal to spacedim.")); + if (dim == 2) + internal::generate_subdivided_cylinder<2>(radius, + x_subdivisions, + half_length, + triangulation); + else + internal::generate_subdivided_cylinder<3>(radius, + x_subdivisions, + half_length, + triangulation); + } + + + void TriangulationWrapper::generate_hyper_cube_with_cylindrical_hole( const double inner_radius, diff --git a/contrib/python-bindings/tests/triangulation_wrapper.py b/contrib/python-bindings/tests/triangulation_wrapper.py index 5a645be1f0..e62cd1d3e1 100644 --- a/contrib/python-bindings/tests/triangulation_wrapper.py +++ b/contrib/python-bindings/tests/triangulation_wrapper.py @@ -388,6 +388,13 @@ class TestTriangulationWrapper(unittest.TestCase): n_cells = triangulation.n_active_cells() self.assertEqual(n_cells, n_cells_ref) + def test_subdivided_cylinder(self): + triangulation = Triangulation('3D') + n_cells_ref = 5 + triangulation.generate_subdivided_cylinder(2) + n_cells = triangulation.n_active_cells() + self.assertEqual(n_cells, n_cells_ref) + def test_shift_and_merge(self): for dim in self.dim: triangulation_1 = self.build_hyper_cube_triangulation(dim) -- 2.39.5