]> https://gitweb.dealii.org/ - dealii.git/commitdiff
DoFHandlerPolicy: Speed up function renumber_face_mg_dofs
authorMartin Kronbichler <martin.kronbichler@uni-a.de>
Sun, 26 Jun 2022 06:33:20 +0000 (08:33 +0200)
committerMartin Kronbichler <martin.kronbichler@uni-a.de>
Mon, 27 Jun 2022 15:53:28 +0000 (17:53 +0200)
source/dofs/dof_handler_policy.cc

index 78f243930672acc4a3bbd8c74e2b753c1782bf6b..382f585eeb4ac6727a9ee9c9808186d5227ebc59 100644 (file)
@@ -2608,82 +2608,73 @@ namespace internal
           if (dof_handler.get_fe().n_dofs_per_line() > 0 ||
               dof_handler.get_fe().max_dofs_per_quad() > 0)
             {
-              // flag all lines adjacent to cells of the current
-              // level, as those lines logically belong to the same
+              // visit all lines/quads adjacent to cells of the current level
+              // exactly once, as those lines/quads logically belong to the same
               // level as the cell, at least for isotropic refinement
-              std::vector<bool> line_marked(
+              std::vector<bool> line_touched(
                 dof_handler.get_triangulation().n_raw_lines());
-              for (const auto &cell :
-                   dof_handler.cell_iterators_on_level(level))
-                if (cell->level_subdomain_id() !=
-                    numbers::artificial_subdomain_id)
-                  for (const auto line : cell->line_indices())
-                    line_marked[cell->line(line)->index()] = true;
-
-              for (const auto &cell :
-                   dof_handler.cell_iterators_on_level(level))
-                for (const auto l : cell->line_indices())
-                  if (line_marked[cell->line(l)->index()])
-                    {
-                      for (unsigned int d = 0;
-                           d < dof_handler.get_fe().n_dofs_per_line();
-                           ++d)
-                        {
-                          const dealii::types::global_dof_index idx =
-                            cell->line(l)->mg_dof_index(level, d);
-                          if (check_validity)
-                            Assert(idx != numbers::invalid_dof_index,
-                                   ExcInternalError());
-
-                          if (idx != numbers::invalid_dof_index)
-                            cell->line(l)->set_mg_dof_index(
-                              level,
-                              d,
-                              ((indices_we_care_about.size() == 0) ?
-                                 new_numbers[idx] :
-                                 new_numbers[indices_we_care_about
-                                               .index_within_set(idx)]));
-                        }
-                      line_marked[cell->line(l)->index()] = false;
-                    }
-
-              // flag all quads adjacent to cells of the current level, as
-              // those quads logically belong to the same level as the cell,
-              // at least for isotropic refinement
-              std::vector<bool> quad_marked(
+              std::vector<bool> quad_touched(
                 dof_handler.get_triangulation().n_raw_quads());
               for (const auto &cell :
                    dof_handler.cell_iterators_on_level(level))
                 if (cell->level_subdomain_id() !=
                     numbers::artificial_subdomain_id)
-                  for (const auto quad : cell->face_indices())
-                    quad_marked[cell->quad(quad)->index()] = true;
+                  {
+                    // lines
+                    for (const auto l : cell->line_indices())
+                      {
+                        const auto line = cell->line(l);
+                        if (!line_touched[line->index()])
+                          {
+                            const unsigned int dofs_per_line =
+                              dof_handler.get_fe().n_dofs_per_line();
+                            for (unsigned int d = 0; d < dofs_per_line; ++d)
+                              {
+                                const dealii::types::global_dof_index idx =
+                                  line->mg_dof_index(level, d);
+                                if (check_validity)
+                                  Assert(idx != numbers::invalid_dof_index,
+                                         ExcInternalError());
+
+                                if (idx != numbers::invalid_dof_index)
+                                  line->set_mg_dof_index(
+                                    level,
+                                    d,
+                                    ((indices_we_care_about.size() == 0) ?
+                                       new_numbers[idx] :
+                                       new_numbers[indices_we_care_about
+                                                     .index_within_set(idx)]));
+                              }
+                            line_touched[line->index()] = true;
+                          }
+                      }
 
-              for (const auto &cell : dof_handler.cell_iterators())
-                for (const auto l : cell->face_indices())
-                  if (quad_marked[cell->quad(l)->index()])
-                    {
-                      for (unsigned int d = 0;
-                           d < dof_handler.get_fe().n_dofs_per_quad(l);
-                           ++d)
+                    // quads
+                    for (const auto quad : cell->face_indices())
+                      if (!quad_touched[cell->quad(quad)->index()])
                         {
-                          const dealii::types::global_dof_index idx =
-                            cell->quad(l)->mg_dof_index(level, d);
-                          if (check_validity)
-                            Assert(idx != numbers::invalid_dof_index,
-                                   ExcInternalError());
-
-                          if (idx != numbers::invalid_dof_index)
-                            cell->quad(l)->set_mg_dof_index(
-                              level,
-                              d,
-                              ((indices_we_care_about.size() == 0) ?
-                                 new_numbers[idx] :
-                                 new_numbers[indices_we_care_about
-                                               .index_within_set(idx)]));
+                          const unsigned int dofs_per_quad =
+                            dof_handler.get_fe().n_dofs_per_quad(quad);
+                          for (unsigned int d = 0; d < dofs_per_quad; ++d)
+                            {
+                              const dealii::types::global_dof_index idx =
+                                cell->quad(quad)->mg_dof_index(level, d);
+                              if (check_validity)
+                                Assert(idx != numbers::invalid_dof_index,
+                                       ExcInternalError());
+
+                              if (idx != numbers::invalid_dof_index)
+                                cell->quad(quad)->set_mg_dof_index(
+                                  level,
+                                  d,
+                                  ((indices_we_care_about.size() == 0) ?
+                                     new_numbers[idx] :
+                                     new_numbers[indices_we_care_about
+                                                   .index_within_set(idx)]));
+                            }
+                          quad_touched[cell->quad(quad)->index()] = true;
                         }
-                      quad_marked[cell->quad(l)->index()] = false;
-                    }
+                  }
             }
         }
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.