From: Wolfgang Bangerth Date: Fri, 30 Jun 2017 16:02:36 +0000 (-0600) Subject: Refactor DoFHandlerPolicy::Implementation::renumber_mg_dofs(). X-Git-Tag: v9.0.0-rc1~1456^2~2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5a05e1096424a90f43aa7515d642cdf6d3cc2f26;p=dealii.git Refactor DoFHandlerPolicy::Implementation::renumber_mg_dofs(). This works in exactly the same way as the commit two up in the chain for the renumber_dofs() function. While there, also parallelize the function the same way as done for renumber_dofs(). --- diff --git a/source/dofs/dof_handler_policy.cc b/source/dofs/dof_handler_policy.cc index 49618a6051..ddfefe2960 100644 --- a/source/dofs/dof_handler_policy.cc +++ b/source/dofs/dof_handler_policy.cc @@ -625,6 +625,7 @@ namespace internal } + /* --------------------- renumber_dofs functionality ---------------- */ @@ -820,19 +821,28 @@ namespace internal - template + /* --------------------- renumber_mg_dofs functionality ---------------- */ + + /** + * The part of the renumber_mg_dofs() functionality that is dimension + * independent because it renumbers the DoF indices on vertex interiors + * (which exist for all dimensions). + * + * See renumber_mg_dofs() for the meaning of the arguments. + */ + template static void - renumber_mg_dofs (const std::vector &new_numbers, - const IndexSet &indices, - DoFHandler<1,spacedim> &dof_handler, - const unsigned int level, - const bool check_validity) + renumber_vertex_mg_dofs (const std::vector &new_numbers, + const IndexSet &indices, + DoFHandler &dof_handler, + const unsigned int level, + const bool check_validity) { Assert (level::MGVertexDoFs>::iterator + for (typename std::vector::MGVertexDoFs>::iterator i=dof_handler.mg_vertex_dofs.begin(); i!=dof_handler.mg_vertex_dofs.end(); ++i) @@ -851,8 +861,25 @@ namespace internal (new_numbers[idx]) : (new_numbers[indices.index_within_set(idx)])); } + } + + /** + * The part of the renumber_dofs() functionality that is dimension + * independent because it renumbers the DoF indices on cell interiors + * (which exist for all dimensions). + * + * See renumber_mg_dofs() for the meaning of the arguments. + */ + template + static + void + renumber_cell_mg_dofs (const std::vector &new_numbers, + const IndexSet &indices, + DoFHandler &dof_handler, + const unsigned int level) + { for (std::vector::iterator i=dof_handler.mg_levels[level]->dof_object.dofs.begin(); i!=dof_handler.mg_levels[level]->dof_object.dofs.end(); @@ -870,36 +897,36 @@ namespace internal + /** + * The part of the renumber_mg_dofs() functionality that operates on faces. + * This part is dimension dependent and so needs to be implemented in + * three separate specializations of the function. + * + * See renumber_mg_dofs() for the meaning of the arguments. + */ template static void - renumber_mg_dofs (const std::vector &new_numbers, - const IndexSet &indices, - DoFHandler<2,spacedim> &dof_handler, - const unsigned int level, - const bool check_validity) + renumber_face_mg_dofs (const std::vector &/*new_numbers*/, + const IndexSet &/*indices*/, + DoFHandler<1,spacedim> &/*dof_handler*/, + const unsigned int /*level*/, + const bool /*check_validity*/) { - Assert (level::MGVertexDoFs>::iterator i=dof_handler.mg_vertex_dofs.begin(); - i!=dof_handler.mg_vertex_dofs.end(); ++i) - // if the present vertex lives on the present level - if ((i->get_coarsest_level() <= level) && - (i->get_finest_level() >= level)) - for (unsigned int d=0; dget_index (level, d); - if (check_validity) - Assert(idx != numbers::invalid_dof_index, ExcInternalError ()); - if (idx != numbers::invalid_dof_index) - i->set_index (level, d/*, dof_handler.get_fe().dofs_per_vertex*/, - ((indices.size() == 0) ? - new_numbers[idx] : - new_numbers[indices.index_within_set(idx)])); - } + template + static + void + renumber_face_mg_dofs (const std::vector &new_numbers, + const IndexSet &indices, + DoFHandler<2,spacedim> &dof_handler, + const unsigned int level, + const bool check_validity) + { if (dof_handler.get_fe().dofs_per_line > 0) { // save user flags as they will be modified @@ -938,18 +965,6 @@ namespace internal // finally, restore user flags const_cast &>(dof_handler.get_triangulation()).load_user_flags (user_flags); } - - for (std::vector::iterator i=dof_handler.mg_levels[level]->dof_object.dofs.begin(); - i!=dof_handler.mg_levels[level]->dof_object.dofs.end(); ++i) - { - if (*i != numbers::invalid_dof_index) - { - Assert(*i static void - renumber_mg_dofs (const std::vector &new_numbers, - const IndexSet &indices, - DoFHandler<3,spacedim> &dof_handler, - const unsigned int level, - const bool check_validity) + renumber_face_mg_dofs (const std::vector &new_numbers, + const IndexSet &indices, + DoFHandler<3,spacedim> &dof_handler, + const unsigned int level, + const bool check_validity) { - Assert (level::MGVertexDoFs>::iterator i=dof_handler.mg_vertex_dofs.begin(); - i!=dof_handler.mg_vertex_dofs.end(); ++i) - // if the present vertex lives on the present level - if ((i->get_coarsest_level() <= level) && - (i->get_finest_level() >= level)) - for (unsigned int d=0; dget_index (level, d); - if (check_validity) - Assert(idx != numbers::invalid_dof_index, ExcInternalError ()); - - if (idx != numbers::invalid_dof_index) - i->set_index (level, d, - ((indices.size() == 0) ? - new_numbers[idx] : - new_numbers[indices.index_within_set(idx)])); - } - if (dof_handler.get_fe().dofs_per_line > 0 || dof_handler.get_fe().dofs_per_quad > 0) { @@ -1049,18 +1043,39 @@ namespace internal // finally, restore user flags const_cast &>(dof_handler.get_triangulation()).load_user_flags (user_flags); } + } - for (std::vector::iterator i=dof_handler.mg_levels[level]->dof_object.dofs.begin(); - i!=dof_handler.mg_levels[level]->dof_object.dofs.end(); ++i) - { - if (*i != numbers::invalid_dof_index) - { - Assert(*i + static + void + renumber_mg_dofs (const std::vector &new_numbers, + const IndexSet &indices, + DoFHandler &dof_handler, + const unsigned int level, + const bool check_validity) + { + Assert (level tasks; + tasks += Threads::new_task ([&]() + { + renumber_vertex_mg_dofs (new_numbers, indices, dof_handler, level, check_validity); + }); + tasks += Threads::new_task ([&]() + { + renumber_face_mg_dofs (new_numbers, indices, dof_handler, level, check_validity); + }); + tasks += Threads::new_task ([&]() + { + renumber_cell_mg_dofs (new_numbers, indices, dof_handler, level); + }); + tasks.join_all (); }