]> https://gitweb.dealii.org/ - dealii.git/commitdiff
united extract_dofs() for DoFHandler and hp::DoFHandler, drawback: auto deduction...
authorMathias Anselmann <mathias.anselmann@posteo.de>
Thu, 6 Jun 2019 15:14:54 +0000 (17:14 +0200)
committerMathias Anselmann <mathias.anselmann@posteo.de>
Thu, 6 Jun 2019 15:18:30 +0000 (17:18 +0200)
13 files changed:
include/deal.II/dofs/dof_tools.h
source/dofs/dof_tools.cc
source/dofs/dof_tools.inst.in
source/dofs/dof_tools_constraints.cc
tests/dofs/dof_tools_12.cc
tests/dofs/dof_tools_12a.cc
tests/dofs/dof_tools_13a.cc
tests/dofs/extract_dofs_by_component_01.cc
tests/dofs/extract_dofs_by_component_01_hp.cc
tests/dofs/extract_dofs_by_component_01x.cc
tests/dofs/extract_dofs_by_component_01y.cc
tests/dofs/extract_dofs_by_component_02.cc
tests/dofs/extract_dofs_by_component_02_hp.cc

index d25d74f20e0cfe928341c873b0aacfea32e81e6d..bc8a88c4d749aaf21f1eec3053e9b494c167bc57 100644 (file)
@@ -1351,20 +1351,11 @@ namespace DoFTools
    * first have to be mapped to the global degrees of freedom, to correspond
    * with them.
    */
-  template <int dim, int spacedim>
-  void
-  extract_dofs(const DoFHandler<dim, spacedim> &dof_handler,
-               const ComponentMask &            component_mask,
-               std::vector<bool> &              selected_dofs);
-
-  /**
-   * The same function as above, but for a hp::DoFHandler.
-   */
-  template <int dim, int spacedim>
+  template <int dim, int spacedim, typename DoFHandlerType>
   void
-  extract_dofs(const hp::DoFHandler<dim, spacedim> &dof_handler,
-               const ComponentMask &                component_mask,
-               std::vector<bool> &                  selected_dofs);
+  extract_dofs(const DoFHandlerType &dof_handler,
+               const ComponentMask & component_mask,
+               std::vector<bool> &   selected_dofs);
 
   /**
    * This function is the equivalent to the DoFTools::extract_dofs() functions
@@ -1390,20 +1381,11 @@ namespace DoFTools
    *   sequential computations of course equals DoFHandler::n_dofs(). The
    * previous contents of this array are overwritten.
    */
-  template <int dim, int spacedim>
-  void
-  extract_dofs(const DoFHandler<dim, spacedim> &dof_handler,
-               const BlockMask &                block_mask,
-               std::vector<bool> &              selected_dofs);
-
-  /**
-   * The same function as above, but for a hp::DoFHandler.
-   */
-  template <int dim, int spacedim>
+  template <int dim, int spacedim, typename DoFHandlerType>
   void
-  extract_dofs(const hp::DoFHandler<dim, spacedim> &dof_handler,
-               const BlockMask &                    block_mask,
-               std::vector<bool> &                  selected_dofs);
+  extract_dofs(const DoFHandlerType &dof_handler,
+               const BlockMask &     block_mask,
+               std::vector<bool> &   selected_dofs);
 
   /**
    * Do the same thing as the corresponding extract_dofs() function for one
index c7665b4a25e10da469a3f132ed6233f4f888b458..9607414e561dfd651ce7653ada08da0c85061c59 100644 (file)
@@ -397,59 +397,11 @@ namespace DoFTools
 
 
 
-  template <int dim, int spacedim>
-  void
-  extract_dofs(const DoFHandler<dim, spacedim> &dof,
-               const ComponentMask &            component_mask,
-               std::vector<bool> &              selected_dofs)
-  {
-    const FiniteElement<dim, spacedim> &fe = dof.get_fe();
-    (void)fe;
-
-    Assert(component_mask.represents_n_components(fe.n_components()),
-           ExcMessage(
-             "The given component mask is not sized correctly to represent the "
-             "components of the given finite element."));
-    Assert(selected_dofs.size() == dof.n_locally_owned_dofs(),
-           ExcDimensionMismatch(selected_dofs.size(),
-                                dof.n_locally_owned_dofs()));
-
-    // two special cases: no component is selected, and all components are
-    // selected; both rather stupid, but easy to catch
-    if (component_mask.n_selected_components(n_components(dof)) == 0)
-      {
-        std::fill_n(selected_dofs.begin(), dof.n_locally_owned_dofs(), false);
-        return;
-      }
-    else if (component_mask.n_selected_components(n_components(dof)) ==
-             n_components(dof))
-      {
-        std::fill_n(selected_dofs.begin(), dof.n_locally_owned_dofs(), true);
-        return;
-      }
-
-
-    // preset all values by false
-    std::fill_n(selected_dofs.begin(), dof.n_locally_owned_dofs(), false);
-
-    // get the component association of each DoF and then select the ones
-    // that match the given set of blocks
-    std::vector<unsigned char> dofs_by_component(dof.n_locally_owned_dofs());
-    internal::get_component_association(dof, component_mask, dofs_by_component);
-
-    for (types::global_dof_index i = 0; i < dof.n_locally_owned_dofs(); ++i)
-      if (component_mask[dofs_by_component[i]] == true)
-        selected_dofs[i] = true;
-  }
-
-
-  // TODO: Unify the following two functions with the non-hp case
-
-  template <int dim, int spacedim>
+  template <int dim, int spacedim, typename DoFHandlerType>
   void
-  extract_dofs(const hp::DoFHandler<dim, spacedim> &dof,
-               const ComponentMask &                component_mask,
-               std::vector<bool> &                  selected_dofs)
+  extract_dofs(const DoFHandlerType &dof,
+               const ComponentMask & component_mask,
+               std::vector<bool> &   selected_dofs)
   {
     Assert(component_mask.represents_n_components(
              dof.get_fe_collection().n_components()),
@@ -492,26 +444,15 @@ namespace DoFTools
 
 
 
-  template <int dim, int spacedim>
-  void
-  extract_dofs(const DoFHandler<dim, spacedim> &dof,
-               const BlockMask &                block_mask,
-               std::vector<bool> &              selected_dofs)
-  {
-    // simply forward to the function that works based on a component mask
-    extract_dofs(dof, dof.get_fe().component_mask(block_mask), selected_dofs);
-  }
-
-
-
-  template <int dim, int spacedim>
+  template <int dim, int spacedim, typename DoFHandlerType>
   void
-  extract_dofs(const hp::DoFHandler<dim, spacedim> &dof,
-               const BlockMask &                    block_mask,
-               std::vector<bool> &                  selected_dofs)
+  extract_dofs(const DoFHandlerType &dof,
+               const BlockMask &     block_mask,
+               std::vector<bool> &   selected_dofs)
   {
     // simply forward to the function that works based on a component mask
-    extract_dofs(dof, dof.get_fe().component_mask(block_mask), selected_dofs);
+    extract_dofs<dim, spacedim, DoFHandlerType>(
+      dof, dof.get_fe_collection().component_mask(block_mask), selected_dofs);
   }
 
 
index 5866a24787d677ffc219e3921c65a93db89bc9c5..39bb4fcbbd0f7919e70bc4d95fb6879c1b41cd83 100644 (file)
@@ -689,25 +689,33 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : DIMENSIONS)
           &patch);
 
       template void
-      extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+      extract_dofs<deal_II_dimension,
+                   deal_II_space_dimension,
+                   DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
         const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
         const ComponentMask &,
         std::vector<bool> &);
 
       template void
-      extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+      extract_dofs<deal_II_dimension,
+                   deal_II_space_dimension,
+                   DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
         const DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
         const BlockMask &,
         std::vector<bool> &);
 
       template void
-      extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+      extract_dofs<deal_II_dimension,
+                   deal_II_space_dimension,
+                   hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
         const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
         const ComponentMask &,
         std::vector<bool> &);
 
       template void
-      extract_dofs<deal_II_dimension, deal_II_space_dimension>(
+      extract_dofs<deal_II_dimension,
+                   deal_II_space_dimension,
+                   hp::DoFHandler<deal_II_dimension, deal_II_space_dimension>>(
         const hp::DoFHandler<deal_II_dimension, deal_II_space_dimension> &,
         const BlockMask &,
         std::vector<bool> &);
index ee6727dc52c5c40882276240e3e4da25c5c20b8d..c97405c77818b87f89a436ac95d6ec3637fd6fdf 100644 (file)
@@ -3133,7 +3133,8 @@ namespace DoFTools
       {
         std::vector<bool> mask(coarse_grid.get_fe(0).n_components(), false);
         mask[coarse_component] = true;
-        extract_dofs(coarse_grid, ComponentMask(mask), coarse_dof_is_parameter);
+        extract_dofs<dim, spacedim, DoFHandler<dim, spacedim>>(
+          coarse_grid, ComponentMask(mask), coarse_dof_is_parameter);
       }
 
     // now we know that the weights in each row constitute a constraint. enter
index d6f3c4e6dc74ca636b8fb9bc7b98ec2c18b654e8..fa922baac2d72be8525e36b32514744b900ae37b 100644 (file)
@@ -31,11 +31,15 @@ check_this(const DoFHandler<dim> &dof_handler)
 
   // only select first component
   mask[0] = true;
-  DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+  DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(dof_handler,
+                                                    ComponentMask(mask),
+                                                    selected_dofs);
   output_bool_vector(selected_dofs);
 
   // also select last component
   mask.back() = true;
-  DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+  DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(dof_handler,
+                                                    ComponentMask(mask),
+                                                    selected_dofs);
   output_bool_vector(selected_dofs);
 }
index 39be28d6a935bc86b3b2f8a21ead74cedab494c9..bb25d2ae6311f63762506b5de1befa244bf6d3c9 100644 (file)
@@ -63,12 +63,16 @@ check_this(const DoFHandlerType &dof_handler)
 
   // only select first component
   mask[0] = true;
-  DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+  DoFTools::extract_dofs<dim, dim, DoFHandlerType>(dof_handler,
+                                                   ComponentMask(mask),
+                                                   selected_dofs);
   output_bool_vector(selected_dofs);
 
   // also select last component
   mask.back() = true;
-  DoFTools::extract_dofs(dof_handler, ComponentMask(mask), selected_dofs);
+  DoFTools::extract_dofs<dim, dim, DoFHandlerType>(dof_handler,
+                                                   ComponentMask(mask),
+                                                   selected_dofs);
   output_bool_vector(selected_dofs);
 }
 
index e16739853b44248296cfbdf59d90e3d8bc499465..3d797bf78fdcda0e28b2b7dc9aca86a1358cecef 100644 (file)
@@ -56,9 +56,8 @@ check_this(const DoFHandler<dim> &dof_handler)
     std::vector<bool> component_mask(dof_handler.get_fe().n_components(),
                                      false);
     component_mask[0] = true;
-    DoFTools::extract_dofs(dof_handler,
-                           ComponentMask(component_mask),
-                           component_dofs);
+    DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+      dof_handler, ComponentMask(component_mask), component_dofs);
 
     for (unsigned int i = 0; i < dof_data.size(); ++i)
       if (component_dofs[i] == true)
@@ -91,9 +90,8 @@ check_this(const DoFHandler<dim> &dof_handler)
     std::vector<bool> component_mask(dof_handler.get_fe().n_components(),
                                      false);
     component_mask.back() = true;
-    DoFTools::extract_dofs(dof_handler,
-                           ComponentMask(component_mask),
-                           component_dofs);
+    DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+      dof_handler, ComponentMask(component_mask), component_dofs);
     for (unsigned int i = 0; i < dof_data.size(); ++i)
       if (component_dofs[i] == true)
         dof_data(i) = i + 1;
index d0f8587d2e6e73669181021259f4c83af541e467..ee1b4cce7c0417d1c90c2cf27fbdb12a36ab86ff 100644 (file)
@@ -70,7 +70,8 @@ check()
         component_mask[c] = (int_mask & (1 << c));
 
       std::vector<bool> dofs(dof.n_dofs());
-      DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+      DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+        dof, ComponentMask(component_mask), dofs);
 
       for (unsigned int d = 0; d < dof.n_dofs(); ++d)
         deallog << dofs[d];
index 92de6e06983e9384a1c079b6e9ae2a274af0b245..9ddd85cafcbc0f45ff67d068ea6f202f9a97d31f 100644 (file)
@@ -71,7 +71,8 @@ check()
         component_mask[c] = (int_mask & (1 << c));
 
       std::vector<bool> dofs(dof.n_dofs());
-      DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+      DoFTools::extract_dofs<dim, dim, hp::DoFHandler<dim>>(
+        dof, ComponentMask(component_mask), dofs);
 
       for (unsigned int d = 0; d < dof.n_dofs(); ++d)
         deallog << dofs[d];
index e5f5726f1f80628527b57f09a8f47f64fde23bbb..0c52237192659ab1ca7617d281a4dc03fc207f3a 100644 (file)
@@ -63,7 +63,8 @@ check()
   component_mask[0] = true;
 
   std::vector<bool> dofs(dof.n_dofs());
-  DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+  DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+    dof, ComponentMask(component_mask), dofs);
 
   for (unsigned int d = 0; d < dof.n_dofs(); ++d)
     deallog << dofs[d];
index 3b0a516a7f90d7d61ad26250bc6fe16f7e0264a2..9f537c577f1d575b9efd1ece2bd097e58a7d747d 100644 (file)
@@ -67,7 +67,8 @@ check()
       component_mask[comp] = true;
 
       std::vector<bool> dofs(dof.n_dofs());
-      DoFTools::extract_dofs(dof, ComponentMask(component_mask), dofs);
+      DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+        dof, ComponentMask(component_mask), dofs);
 
       for (unsigned int d = 0; d < dof.n_dofs(); ++d)
         deallog << dofs[d];
index 9b72031d372255bbe4fc924e4c634b1b4aac547a..4bbae112487e75ccb478360419f89e4912c11aca 100644 (file)
@@ -70,7 +70,8 @@ check()
         component_mask[c] = (int_mask & (1 << c));
 
       std::vector<bool> dofs(dof.n_dofs());
-      DoFTools::extract_dofs(dof, BlockMask(component_mask), dofs);
+      DoFTools::extract_dofs<dim, dim, DoFHandler<dim>>(
+        dof, BlockMask(component_mask), dofs);
 
       for (unsigned int d = 0; d < dof.n_dofs(); ++d)
         deallog << dofs[d];
index 20e88da1a34436348a5824082d9f3db4807b00c8..6762eeb656a6cc1249a20e13f668cbf80a6adecc 100644 (file)
@@ -71,7 +71,8 @@ check()
         component_mask[c] = (int_mask & (1 << c));
 
       std::vector<bool> dofs(dof.n_dofs());
-      DoFTools::extract_dofs(dof, BlockMask(component_mask), dofs);
+      DoFTools::extract_dofs<dim, dim, hp::DoFHandler<dim>>(
+        dof, BlockMask(component_mask), dofs);
 
       for (unsigned int d = 0; d < dof.n_dofs(); ++d)
         deallog << dofs[d];

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.