From 89822c33fc2e8c9eb443fe7c6f82008ff059967a Mon Sep 17 00:00:00 2001 From: Bruno Turcksin Date: Mon, 13 Jun 2016 09:29:21 -0400 Subject: [PATCH] Use helper functions to decrease code duplication. --- source/python/triangulation_wrapper.cc | 309 +++++++++++++------------ 1 file changed, 158 insertions(+), 151 deletions(-) diff --git a/source/python/triangulation_wrapper.cc b/source/python/triangulation_wrapper.cc index 2c7c8b5696..87080d078b 100644 --- a/source/python/triangulation_wrapper.cc +++ b/source/python/triangulation_wrapper.cc @@ -23,6 +23,145 @@ namespace PyDealII { + namespace internal + { + template + void generate_hyper_cube(const double left, + const double right, + const bool colorize, + void *triangulation) + { + dealii::Triangulation *tria = + static_cast*>(triangulation); + tria->clear(); + dealii::GridGenerator::hyper_cube(*tria, left, right, colorize); + } + + + + template + void generate_simplex(std::vector &wrapped_points, + void *triangulation) + { + // Cast the PointWrapper objects to Point + std::vector> points(dim); + for (int i=0; i*>((wrapped_points[i]).get_point())); + + dealii::Triangulation *tria = + static_cast*>(triangulation); + tria->clear(); + dealii::GridGenerator::simplex(*tria, points); + } + + + + template + void generate_subdivided_hyper_cube(const unsigned int repetitions, + const double left, + const double right, + void *triangulation) + { + dealii::Triangulation *tria = + static_cast*>(triangulation); + tria->clear(); + dealii::GridGenerator::subdivided_hyper_cube(*tria, repetitions, left, right); + } + + + + template + void generate_hyper_rectangle(PointWrapper &p1, + PointWrapper &p2, + const bool colorize, + void *triangulation) + { + // Cast the PointWrapper object to Point + dealii::Point point_1 = *(static_cast*>(p1.get_point())); + dealii::Point point_2 = *(static_cast*>(p2.get_point())); + + dealii::Triangulation *tria = + static_cast*>(triangulation); + tria->clear(); + dealii::GridGenerator::hyper_rectangle(*tria, point_1, point_2, colorize); + } + + + + template + void generate_subdivided_hyper_rectangle(const std::vector &repetitions, + PointWrapper &p1, + PointWrapper &p2, + const bool colorize, + void *triangulation) + { + // Cast the PointWrapper object to Point + dealii::Point point_1 = *(static_cast*>(p1.get_point())); + dealii::Point point_2 = *(static_cast*>(p2.get_point())); + + dealii::Triangulation *tria = + static_cast*>(triangulation); + tria->clear(); + dealii::GridGenerator::subdivided_hyper_rectangle(*tria, repetitions, point_1, + point_2, colorize); + } + + + + template + void generate_hyper_ball(PointWrapper ¢er, + const double radius, + void *triangulation) + { + // Cast the PointWrapper object to Point + dealii::Point center_point = *(static_cast*>( + center.get_point())); + + dealii::Triangulation *tria = + static_cast*>(triangulation); + tria->clear(); + dealii::GridGenerator::hyper_ball(*tria, center_point, radius); + } + + + + template + void shift(boost::python::list &shift_list, + void *triangulation) + { + // Extract the shift vector from the python list + dealii::Tensor<1,dim> shift_vector; + for (int i=0; i(shift_list[i]); + + dealii::Triangulation *tria = + static_cast*>(triangulation); + dealii::GridTools::shift(shift_vector, *tria); + } + + + + template + void merge_triangulations(TriangulationWrapper &triangulation_1, + TriangulationWrapper &triangulation_2, + void *triangulation) + { + dealii::Triangulation *tria = + static_cast*>(triangulation); + tria->clear(); + dealii::Triangulation *tria_1 = + static_cast*>(triangulation_1.get_triangulation()); + dealii::Triangulation *tria_2 = + static_cast*>(triangulation_2.get_triangulation()); + dealii::GridGenerator::merge_triangulations(*tria_1, *tria_2, *tria); + // We need to reassign tria to triangulation because tria was cleared + // inside merge_triangulations. + triangulation = tria; + } + } + + + TriangulationWrapper::TriangulationWrapper(const std::string &dimension) : triangulation(nullptr) @@ -69,9 +208,7 @@ namespace PyDealII unsigned int TriangulationWrapper::n_active_cells() const { if (dim == 2) - { - return (*static_cast*>(triangulation)).n_active_cells(); - } + return (*static_cast*>(triangulation)).n_active_cells(); else return (*static_cast*>(triangulation)).n_active_cells(); } @@ -83,19 +220,9 @@ namespace PyDealII const bool colorize) { if (dim == 2) - { - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::hyper_cube(*tria, left, right, colorize); - } + internal::generate_hyper_cube<2>(left, right, colorize, triangulation); else - { - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::hyper_cube(*tria, left, right, colorize); - } + internal::generate_hyper_cube<3>(left, right, colorize, triangulation); } @@ -108,28 +235,9 @@ namespace PyDealII wrapped_points[i] = boost::python::extract(vertices[i]); if (dim == 2) - { - // Cast the PointWrapper objects to Point - std::vector> points(dim); - for (int i=0; i*>((wrapped_points[i]).get_point())); - - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::simplex(*tria, points); - } + internal::generate_simplex<2>(wrapped_points, triangulation); else - { - std::vector> points(dim); - for (int i=0; i*>((wrapped_points[i]).get_point())); - - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::simplex(*tria, points); - } + internal::generate_simplex<3>(wrapped_points, triangulation); } @@ -139,19 +247,9 @@ namespace PyDealII const double right) { if (dim == 2) - { - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::subdivided_hyper_cube(*tria, repetitions, left, right); - } + internal::generate_subdivided_hyper_cube<2>(repetitions, left, right, triangulation); else - { - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::subdivided_hyper_cube(*tria, repetitions, left, right); - } + internal::generate_subdivided_hyper_cube<3>(repetitions, left, right, triangulation); } @@ -161,27 +259,9 @@ namespace PyDealII const bool colorize) { if (dim == 2) - { - // Cast the PointWrapper object to Point - dealii::Point<2> point_1 = *(static_cast*>(p1.get_point())); - dealii::Point<2> point_2 = *(static_cast*>(p2.get_point())); - - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::hyper_rectangle(*tria, point_1, point_2, colorize); - } + internal::generate_hyper_rectangle<2>(p1, p2, colorize, triangulation); else - { - dealii::Point<3> point_1 = *(static_cast*>(p1.get_point())); - dealii::Point<3> point_2 = *(static_cast*>(p2.get_point())); - - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::hyper_rectangle(*tria, point_1, point_2, colorize); - } - + internal::generate_hyper_rectangle<3>(p1, p2, colorize, triangulation); } @@ -197,28 +277,11 @@ namespace PyDealII repetitions[i] = boost::python::extract(repetition_list[i]); if (dim == 2) - { - // Cast the PointWrapper object to Point - dealii::Point<2> point_1 = *(static_cast*>(p1.get_point())); - dealii::Point<2> point_2 = *(static_cast*>(p2.get_point())); - - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::subdivided_hyper_rectangle(*tria, repetitions, point_1, - point_2, colorize); - } + internal::generate_subdivided_hyper_rectangle<2>(repetitions, p1, p2, colorize, + triangulation); else - { - dealii::Point<3> point_1 = *(static_cast*>(p1.get_point())); - dealii::Point<3> point_2 = *(static_cast*>(p2.get_point())); - - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::subdivided_hyper_rectangle(*tria, repetitions, point_1, - point_2, colorize); - } + internal::generate_subdivided_hyper_rectangle<3>(repetitions, p1, p2, colorize, + triangulation); } @@ -227,26 +290,9 @@ namespace PyDealII const double radius) { if (dim == 2) - { - // Cast the PointWrapper object to Point - dealii::Point<2> center_point = *(static_cast*>( - center.get_point())); - - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::hyper_ball(*tria, center_point, radius); - } + internal::generate_hyper_ball<2>(center, radius, triangulation); else - { - dealii::Point<3> center_point = *(static_cast*>( - center.get_point())); - - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::GridGenerator::hyper_ball(*tria, center_point, radius); - } + internal::generate_hyper_ball<3>(center, radius, triangulation); } @@ -254,26 +300,9 @@ namespace PyDealII void TriangulationWrapper::shift(boost::python::list &shift_list) { if (dim == 2) - { - // Extract the shift vector from the python list - dealii::Tensor<1,2> shift_vector; - for (int i=0; i(shift_list[i]); - - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - dealii::GridTools::shift(shift_vector, *tria); - } + internal::shift<2>(shift_list, triangulation); else - { - dealii::Tensor<1,3> shift_vector; - for (int i=0; i(shift_list[i]); - - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - dealii::GridTools::shift(shift_vector, *tria); - } + internal::shift<3>(shift_list, triangulation); } @@ -285,31 +314,9 @@ namespace PyDealII dealii::ExcMessage("Triangulation_1 and Triangulation_2 should have the same dimension.")); if (triangulation_1.get_dim() == 2) - { - dealii::Triangulation<2> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::Triangulation<2> *tria_1 = - static_cast*>(triangulation_1.get_triangulation()); - dealii::Triangulation<2> *tria_2 = - static_cast*>(triangulation_2.get_triangulation()); - dealii::GridGenerator::merge_triangulations(*tria_1, *tria_2, *tria); - // We need to reassign tria to triangulation because tria was cleared - // inside merge_triangulations. - triangulation = tria; - } + internal::merge_triangulations<2>(triangulation_1, triangulation_2, triangulation); else - { - dealii::Triangulation<3> *tria = - static_cast*>(triangulation); - tria->clear(); - dealii::Triangulation<3> *tria_1 = - static_cast*>(triangulation_1.get_triangulation()); - dealii::Triangulation<3> *tria_2 = - static_cast*>(triangulation_2.get_triangulation()); - dealii::GridGenerator::merge_triangulations(*tria_1, *tria_2, *tria); - triangulation = tria; - } + internal::merge_triangulations<3>(triangulation_1, triangulation_2, triangulation); } -- 2.39.5