]> https://gitweb.dealii.org/ - dealii.git/commitdiff
remove deprecated stuff in MGConstrainedDoFs 2001/head
authorTimo Heister <timo.heister@gmail.com>
Mon, 21 Dec 2015 17:34:41 +0000 (12:34 -0500)
committerTimo Heister <timo.heister@gmail.com>
Mon, 21 Dec 2015 23:07:26 +0000 (18:07 -0500)
Also introduce the replacement have_boundary_indices() for
set_boundary_values() and make sure it works correctly.

include/deal.II/multigrid/mg_constrained_dofs.h
source/multigrid/mg_transfer_block.cc
source/multigrid/mg_transfer_prebuilt.cc
tests/mpi/multigrid_adaptive.cc
tests/mpi/multigrid_uniform.cc
tests/multigrid/constrained_dofs_01.cc
tests/multigrid/step-16-02.cc
tests/multigrid/step-16-bdry1.cc
tests/multigrid/step-16.cc

index 0718e0e5ac82ed392ac0bde78f49784a6282382e..39530bd35d7b3366e8823edb08ce9a17ef1ac585 100644 (file)
@@ -84,15 +84,6 @@ public:
   bool at_refinement_edge (const unsigned int level,
                            const types::global_dof_index index) const;
 
-  /**
-   * Return the indices of dofs for each level that are subject to boundary
-   * constraints.
-   *
-   * @deprecated: use get_boundary_indices(const unsigned int) instead.
-   */
-  const std::vector<std::set<types::global_dof_index> > &
-  get_boundary_indices () const DEAL_II_DEPRECATED;
-
   /**
    * Return the indices of level dofs on the given level that are subject to
    * Dirichlet boundary conditions (as set by the @p function_map parameter in
@@ -102,42 +93,19 @@ public:
   const IndexSet &
   get_boundary_indices (const unsigned int level) const;
 
-  /**
-   * @deprecated Use at_refinement_edge() if possible, else
-   * get_refinement_edge_indices(unsigned int).
-   *
-   * Return the indices of dofs for each level that lie on the refinement edge
-   * (i.e. are on faces between cells of this level and cells on the level
-   * below).
-   */
-  const std::vector<std::vector<bool> > &
-  get_refinement_edge_indices () const DEAL_II_DEPRECATED;
 
   /**
    * Return the indices of dofs on the given level that lie on an refinement
-   * edge (dofs on faces to neighbors that are coarser)
+   * edge (dofs on faces to neighbors that are coarser).
    */
   const IndexSet &
   get_refinement_edge_indices (unsigned int level) const;
 
-  /**
-   * @deprecated Use at_refinement_edge_boundary() if possible, else use
-   * get_refinement_edge_boundary_indices().
-   *
-   * Return the indices of dofs for each level that are in the intersection of
-   * the sets returned by get_boundary_indices() and
-   * get_refinement_edge_indices().
-   */
-  const std::vector<std::vector<bool> > &
-  get_refinement_edge_boundary_indices () const DEAL_II_DEPRECATED;
 
   /**
-   * @deprecated The function is_boundary_index() now returns false if no
-   * boundary values are set.
-   *
-   * Return if boundary_indices need to be set or not.
+   * Return if Dirichlet boundary indices are set in initialize().
    */
-  bool set_boundary_values () const DEAL_II_DEPRECATED;
+  bool have_boundary_indices () const;
 
 private:
 
@@ -146,29 +114,11 @@ private:
    */
   std::vector<IndexSet> boundary_indices;
 
-  /**
-   * Old data structure that is only filled on demand from @p boundary_indices
-   * for deprecated get_boundary_indices().
-   */
-  mutable std::vector<std::set<types::global_dof_index> > boundary_indices_old;
-
   /**
    * The degrees of freedom on a given level that live on the refinement edge
    * between the level and cells on a coarser level.
    */
   std::vector<IndexSet> refinement_edge_indices;
-
-  /**
-   * Old data structure that is only filled on demand for deprecated
-   * get_refinement_edge_boundary_indices().
-   */
-  mutable std::vector<std::vector<bool> > refinement_edge_boundary_indices_old;
-
-  /**
-   * Old data structure that is only filled on demand for deprecated
-   * get_refinement_edge_indices().
-   */
-  mutable std::vector<std::vector<bool> > refinement_edge_indices_old;
 };
 
 
@@ -177,19 +127,13 @@ inline
 void
 MGConstrainedDoFs::initialize(const DoFHandler<dim,spacedim> &dof)
 {
-  const unsigned int nlevels = dof.get_triangulation().n_global_levels();
+  boundary_indices.clear();
 
-  boundary_indices.resize(nlevels);
+  const unsigned int nlevels = dof.get_triangulation().n_global_levels();
 
   refinement_edge_indices.resize(nlevels);
-  refinement_edge_indices_old.clear();
-  refinement_edge_boundary_indices_old.clear();
   for (unsigned int l=0; l<nlevels; ++l)
-    {
-      boundary_indices[l].clear();
-
-      refinement_edge_indices[l] = IndexSet(dof.n_dofs(l));
-    }
+    refinement_edge_indices[l] = IndexSet(dof.n_dofs(l));
 
   MGTools::extract_inner_interface_dofs (dof, refinement_edge_indices);
 }
@@ -204,6 +148,11 @@ MGConstrainedDoFs::initialize(const DoFHandler<dim,spacedim> &dof,
 {
   initialize (dof);
 
+  // allocate an IndexSet for each global level. Contents will be
+  // overwritten inside make_boundary_list.
+  const unsigned int n_levels = dof.get_triangulation().n_global_levels();
+  boundary_indices.resize(n_levels);
+
   MGTools::make_boundary_list (dof,
                                function_map,
                                boundary_indices,
@@ -215,15 +164,8 @@ inline
 void
 MGConstrainedDoFs::clear()
 {
-  for (unsigned int l=0; l<boundary_indices.size(); ++l)
-    boundary_indices[l].clear();
-
-  for (unsigned int l=0; l<refinement_edge_indices.size(); ++l)
-    refinement_edge_indices[l].clear();
-
-  refinement_edge_indices_old.clear();
-  refinement_edge_boundary_indices_old.clear();
-  boundary_indices_old.clear();
+  boundary_indices.clear();
+  refinement_edge_indices.clear();
 }
 
 
@@ -250,22 +192,6 @@ MGConstrainedDoFs::at_refinement_edge (const unsigned int level,
 }
 
 
-inline
-const std::vector<std::set<types::global_dof_index> > &
-MGConstrainedDoFs::get_boundary_indices () const
-{
-  if (boundary_indices_old.size()!=boundary_indices.size())
-    {
-      boundary_indices_old.resize(boundary_indices.size());
-      for (unsigned int l=0; l<boundary_indices.size(); ++l)
-        {
-          std::vector<types::global_dof_index> tmp;
-          boundary_indices[l].fill_index_vector(tmp);
-          boundary_indices_old[l].insert(tmp.begin(), tmp.end());
-        }
-    }
-  return boundary_indices_old;
-}
 
 
 inline
@@ -277,23 +203,6 @@ MGConstrainedDoFs::get_boundary_indices (const unsigned int level) const
 }
 
 
-inline
-const std::vector<std::vector<bool> > &
-MGConstrainedDoFs::get_refinement_edge_indices () const
-{
-  if (refinement_edge_indices_old.size()!=refinement_edge_indices.size())
-    {
-      unsigned int n_levels = refinement_edge_indices.size();
-      refinement_edge_indices_old.resize(n_levels);
-      for (unsigned int l=0; l<n_levels; ++l)
-        {
-          refinement_edge_indices_old[l].resize(refinement_edge_indices[l].size(), false);
-          refinement_edge_indices[l].fill_binary_vector(refinement_edge_indices_old[l]);
-        }
-    }
-
-  return refinement_edge_indices_old;
-}
 
 inline
 const IndexSet &
@@ -304,35 +213,13 @@ MGConstrainedDoFs::get_refinement_edge_indices (unsigned int level) const
 }
 
 
-inline
-const std::vector<std::vector<bool> > &
-MGConstrainedDoFs::get_refinement_edge_boundary_indices () const
-{
-  if (refinement_edge_boundary_indices_old.size()==0)
-    {
-      unsigned int n_levels = refinement_edge_indices.size();
-      refinement_edge_boundary_indices_old.resize(n_levels);
-      for (unsigned int l=0; l<n_levels; ++l)
-        {
-          refinement_edge_boundary_indices_old[l].resize(refinement_edge_indices[l].size());
-          for (IndexSet::ElementIterator it = refinement_edge_indices[l].begin();
-               it != refinement_edge_indices[l].end();
-               ++it)
-            refinement_edge_boundary_indices_old[l][*it] = this->is_boundary_index(l, *it);
-        }
-    }
-
-  return refinement_edge_boundary_indices_old;
-}
 
 
 inline
 bool
-MGConstrainedDoFs::set_boundary_values () const
+MGConstrainedDoFs::have_boundary_indices () const
 {
-  const bool boundary_values_need_to_be_set
-    = boundary_indices.size()!=0;
-  return boundary_values_need_to_be_set;
+  return boundary_indices.size()!=0;
 }
 
 
index 673594da84cabcec63d9f49ea7d6af12da32c407..67a97e29dee848ccc71a52d4dee0f1fe3671d1b0 100644 (file)
@@ -410,52 +410,51 @@ void MGTransferBlockBase::build_matrices (
   // impose boundary conditions
   // but only in the column of
   // the prolongation matrix
-  if (mg_constrained_dofs != 0)
-    if (mg_constrained_dofs->set_boundary_values())
-      {
-        std::vector<types::global_dof_index> constrain_indices;
-        std::vector<std::vector<bool> > constraints_per_block (n_blocks);
-        for (int level=n_levels-2; level>=0; --level)
-          {
-            if (mg_constrained_dofs->get_boundary_indices()[level].size() == 0)
-              continue;
-
-            // need to delete all the columns in the
-            // matrix that are on the boundary. to achieve
-            // this, create an array as long as there are
-            // matrix columns, and find which columns we
-            // need to filter away.
-            constrain_indices.resize (0);
-            constrain_indices.resize (prolongation_matrices[level]->n(), 0);
-            std::set<types::global_dof_index>::const_iterator dof
-            = mg_constrained_dofs->get_boundary_indices()[level].begin(),
-            endd = mg_constrained_dofs->get_boundary_indices()[level].end();
-            for (; dof != endd; ++dof)
-              constrain_indices[*dof] = 1;
-
-            unsigned int index = 0;
-            for (unsigned int block=0; block<n_blocks; ++block)
-              {
-                const types::global_dof_index n_dofs = prolongation_matrices[level]->block(block, block).m();
-                constraints_per_block[block].resize(0);
-                constraints_per_block[block].resize(n_dofs, 0);
-                for (types::global_dof_index i=0; i<n_dofs; ++i, ++index)
-                  constraints_per_block[block][i] = (constrain_indices[index] == 1);
-
-                for (types::global_dof_index i=0; i<n_dofs; ++i)
-                  {
-                    SparseMatrix<double>::iterator
-                    start_row = prolongation_matrices[level]->block(block, block).begin(i),
-                    end_row   = prolongation_matrices[level]->block(block, block).end(i);
-                    for (; start_row != end_row; ++start_row)
-                      {
-                        if (constraints_per_block[block][start_row->column()])
-                          start_row->value() = 0.;
-                      }
-                  }
-              }
-          }
-      }
+  if (mg_constrained_dofs != 0 && mg_constrained_dofs->have_boundary_indices())
+    {
+      std::vector<types::global_dof_index> constrain_indices;
+      std::vector<std::vector<bool> > constraints_per_block (n_blocks);
+      for (int level=n_levels-2; level>=0; --level)
+        {
+          if (mg_constrained_dofs->get_boundary_indices(level).n_elements() == 0)
+            continue;
+
+          // need to delete all the columns in the
+          // matrix that are on the boundary. to achieve
+          // this, create an array as long as there are
+          // matrix columns, and find which columns we
+          // need to filter away.
+          constrain_indices.resize (0);
+          constrain_indices.resize (prolongation_matrices[level]->n(), 0);
+          IndexSet::ElementIterator dof
+          = mg_constrained_dofs->get_boundary_indices(level).begin(),
+          endd = mg_constrained_dofs->get_boundary_indices(level).end();
+          for (; dof != endd; ++dof)
+            constrain_indices[*dof] = 1;
+
+          unsigned int index = 0;
+          for (unsigned int block=0; block<n_blocks; ++block)
+            {
+              const types::global_dof_index n_dofs = prolongation_matrices[level]->block(block, block).m();
+              constraints_per_block[block].resize(0);
+              constraints_per_block[block].resize(n_dofs, 0);
+              for (types::global_dof_index i=0; i<n_dofs; ++i, ++index)
+                constraints_per_block[block][i] = (constrain_indices[index] == 1);
+
+              for (types::global_dof_index i=0; i<n_dofs; ++i)
+                {
+                  SparseMatrix<double>::iterator
+                  start_row = prolongation_matrices[level]->block(block, block).begin(i),
+                  end_row   = prolongation_matrices[level]->block(block, block).end(i);
+                  for (; start_row != end_row; ++start_row)
+                    {
+                      if (constraints_per_block[block][start_row->column()])
+                        start_row->value() = 0.;
+                    }
+                }
+            }
+        }
+    }
 }
 
 
index 9e82e15632d7363e007e7f7c96cc3ce740bfb743..f7f7c08d008a5939bae06627e29fc87ec88dede0 100644 (file)
@@ -235,7 +235,7 @@ void MGTransferPrebuilt<VectorType>::build_matrices
                   = mg_dof.get_fe().get_prolongation_matrix (child,
                                                              cell->refinement_case());
 
-                if (mg_constrained_dofs != 0 && mg_constrained_dofs->set_boundary_values())
+                if (mg_constrained_dofs != 0 && mg_constrained_dofs->have_boundary_indices())
                   for (unsigned int j=0; j<dofs_per_cell; ++j)
                     if (mg_constrained_dofs->is_boundary_index(level, dof_indices_parent[j]))
                       for (unsigned int i=0; i<dofs_per_cell; ++i)
index 2561b3b6860c8dad35a742b0cfffb9be6f8af25f..233c81abc22a03ff15dfc5b3ebe965d1886bb44c 100644 (file)
@@ -309,17 +309,12 @@ namespace Step50
     const Coefficient<dim> coefficient;
     std::vector<double>    coefficient_values (n_q_points);
 
-    std::vector<std::vector<bool> > interface_dofs
-      = mg_constrained_dofs.get_refinement_edge_indices ();
-    std::vector<std::vector<bool> > boundary_interface_dofs
-      = mg_constrained_dofs.get_refinement_edge_boundary_indices ();
-
     std::vector<ConstraintMatrix> boundary_constraints (triangulation.n_levels());
     ConstraintMatrix empty_constraints;
     for (unsigned int level=0; level<triangulation.n_levels(); ++level)
       {
-        boundary_constraints[level].add_lines (interface_dofs[level]);
-        boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices()[level]);
+        boundary_constraints[level].add_lines (mg_constrained_dofs.get_refinement_edge_indices(level));
+        boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices(level));
         boundary_constraints[level].close ();
       }
 
@@ -353,9 +348,9 @@ namespace Step50
 
           for (unsigned int i=0; i<dofs_per_cell; ++i)
             for (unsigned int j=0; j<dofs_per_cell; ++j)
-              if (interface_dofs[lvl][local_dof_indices[i]]   // at_refinement_edge(i)
+              if (mg_constrained_dofs.at_refinement_edge(lvl, local_dof_indices[i])
                   &&
-                  !interface_dofs[lvl][local_dof_indices[j]]   // !at_refinement_edge(j)
+                  ! mg_constrained_dofs.at_refinement_edge(lvl, local_dof_indices[j])
                   &&
                   (
                     (!mg_constrained_dofs.is_boundary_index(lvl, local_dof_indices[i])
index 0e57badefca58226435846a3929140322c084439..a1dfd2957a74a168de495d2cbe5f798c3873ed71 100644 (file)
@@ -309,21 +309,16 @@ namespace Step50
     const Coefficient<dim> coefficient;
     std::vector<double>    coefficient_values (n_q_points);
 
-    std::vector<std::vector<bool> > interface_dofs
-      = mg_constrained_dofs.get_refinement_edge_indices ();
-    std::vector<std::vector<bool> > boundary_interface_dofs
-      = mg_constrained_dofs.get_refinement_edge_boundary_indices ();
-
     std::vector<ConstraintMatrix> boundary_constraints (triangulation.n_levels());
     std::vector<ConstraintMatrix> boundary_interface_constraints (triangulation.n_levels());
     for (unsigned int level=0; level<triangulation.n_levels(); ++level)
       {
-        boundary_constraints[level].add_lines (interface_dofs[level]);
-        boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices()[level]);
+        boundary_constraints[level].add_lines (mg_constrained_dofs.get_refinement_edge_indices(level));
+        boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices(level));
         boundary_constraints[level].close ();
 
         boundary_interface_constraints[level]
-        .add_lines (boundary_interface_dofs[level]);
+        .add_lines (mg_constrained_dofs.get_refinement_edge_indices(level));
         boundary_interface_constraints[level].close ();
       }
 
@@ -356,8 +351,12 @@ namespace Step50
 
           for (unsigned int i=0; i<dofs_per_cell; ++i)
             for (unsigned int j=0; j<dofs_per_cell; ++j)
-              if ( !(interface_dofs[cell->level()][local_dof_indices[i]]==true &&
-                     interface_dofs[cell->level()][local_dof_indices[j]]==false))
+              if (
+                !mg_constrained_dofs.at_refinement_edge(cell->level(),
+                                                        local_dof_indices[i])
+                || mg_constrained_dofs.at_refinement_edge(cell->level(),
+                                                          local_dof_indices[j])
+              )
                 cell_matrix(i,j) = 0;
 
           boundary_interface_constraints[cell->level()]
index 77464a83f896f3dd611ce85294abb5e7c943019d..062d4be507b26c86e23cb74d072e97753ca372b1 100644 (file)
@@ -140,22 +140,6 @@ void check_fe(FiniteElement<dim> &fe)
       deallog << "get_boundary_indices:" << std::endl;
       bi.print(deallog);
 
-      {
-        // check that refinement_edge_boundary_indices (deprecated) is really
-        // the intersection of the sets above:
-        IndexSet intersect = rei & bi;
-        std::vector<bool> ref = mg_constrained_dofs.get_refinement_edge_boundary_indices()[level];
-
-        unsigned int idx = 0;
-        for (std::vector<bool>::iterator it = ref.begin(); it != ref.end(); ++it, ++idx)
-          {
-            if ((*it == true) != intersect.is_element(idx))
-              deallog << "mismatch idx=" << idx << " "
-                      << (*it == true) << " " << intersect.is_element(idx) << std::endl;
-          }
-      }
-
-
       IndexSet relevant;
       DoFTools::extract_locally_relevant_level_dofs (dofh,
                                                      level,
index f6939b2da1ce87599707463158e93c4d02546dc3..6bd45e9ef4e1e723feddca3ca502d41daf3a02fe 100644 (file)
@@ -389,21 +389,20 @@ void LaplaceProblem<dim>::assemble_multigrid (const bool &use_mw)
       const Coefficient<dim> coefficient;
       std::vector<double>    coefficient_values (n_q_points);
 
-      std::vector<std::vector<bool> > interface_dofs
-        = mg_constrained_dofs.get_refinement_edge_indices ();
-      std::vector<std::vector<bool> > boundary_interface_dofs
-        = mg_constrained_dofs.get_refinement_edge_boundary_indices ();
-
       std::vector<ConstraintMatrix> boundary_constraints (triangulation.n_levels());
       std::vector<ConstraintMatrix> boundary_interface_constraints (triangulation.n_levels());
       for (unsigned int level=0; level<triangulation.n_levels(); ++level)
         {
-          boundary_constraints[level].add_lines (interface_dofs[level]);
-          boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices()[level]);
+          boundary_constraints[level].add_lines (mg_constrained_dofs.get_refinement_edge_indices(level));
+          boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices(level));
           boundary_constraints[level].close ();
 
+          IndexSet idx =
+            mg_constrained_dofs.get_refinement_edge_indices(level)
+            & mg_constrained_dofs.get_boundary_indices(level);
+
           boundary_interface_constraints[level]
-          .add_lines (boundary_interface_dofs[level]);
+          .add_lines (idx);
           boundary_interface_constraints[level].close ();
         }
 
@@ -435,8 +434,12 @@ void LaplaceProblem<dim>::assemble_multigrid (const bool &use_mw)
 
           for (unsigned int i=0; i<dofs_per_cell; ++i)
             for (unsigned int j=0; j<dofs_per_cell; ++j)
-              if ( !(interface_dofs[cell->level()][local_dof_indices[i]]==true &&
-                     interface_dofs[cell->level()][local_dof_indices[j]]==false))
+              if (
+                !mg_constrained_dofs.at_refinement_edge(cell->level(),
+                                                        local_dof_indices[i])
+                || mg_constrained_dofs.at_refinement_edge(cell->level(),
+                                                          local_dof_indices[j])
+              )
                 cell_matrix(i,j) = 0;
 
           boundary_interface_constraints[cell->level()]
index 56197d9c2bf5998cb3ef907068eed82fc08a85bd..7bc563b4250b1b2dce3c31ab3d6f23f05450a4d0 100644 (file)
@@ -394,16 +394,13 @@ void LaplaceProblem<dim>::assemble_multigrid (bool use_mw)
       const Coefficient<dim> coefficient;
       std::vector<double>    coefficient_values (n_q_points);
 
-      std::vector<std::vector<bool> > interface_dofs
-        = mg_constrained_dofs.get_refinement_edge_indices ();
-
       std::vector<ConstraintMatrix> boundary_constraints (triangulation.n_levels());
       ConstraintMatrix empty_constraints;
 
       for (unsigned int level=0; level<triangulation.n_levels(); ++level)
         {
-          boundary_constraints[level].add_lines (interface_dofs[level]);
-          boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices()[level]);
+          boundary_constraints[level].add_lines (mg_constrained_dofs.get_refinement_edge_indices(level));
+          boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices(level));
           boundary_constraints[level].close ();
         }
 
@@ -437,9 +434,9 @@ void LaplaceProblem<dim>::assemble_multigrid (bool use_mw)
 
           for (unsigned int i=0; i<dofs_per_cell; ++i)
             for (unsigned int j=0; j<dofs_per_cell; ++j)
-              if (interface_dofs[lvl][local_dof_indices[i]]   // at_refinement_edge(i)
+              if (mg_constrained_dofs.at_refinement_edge(lvl, local_dof_indices[i])
                   &&
-                  !interface_dofs[lvl][local_dof_indices[j]]   // !at_refinement_edge(j)
+                  ! mg_constrained_dofs.at_refinement_edge(lvl, local_dof_indices[j])
                   &&
                   (
                     (!mg_constrained_dofs.is_boundary_index(lvl, local_dof_indices[i])
index b17a2ad68c826d5f4bde19aed3739b4b7d9d66bd..2172e5a0245cc657673993301fbcd2999483a596 100644 (file)
@@ -293,15 +293,12 @@ void LaplaceProblem<dim>::assemble_multigrid ()
   const Coefficient<dim> coefficient;
   std::vector<double>    coefficient_values (n_q_points);
 
-  std::vector<std::vector<bool> > interface_dofs
-    = mg_constrained_dofs.get_refinement_edge_indices ();
-
   std::vector<ConstraintMatrix> boundary_constraints (triangulation.n_levels());
   ConstraintMatrix empty_constraints;
   for (unsigned int level=0; level<triangulation.n_levels(); ++level)
     {
-      boundary_constraints[level].add_lines (interface_dofs[level]);
-      boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices()[level]);
+      boundary_constraints[level].add_lines (mg_constrained_dofs.get_refinement_edge_indices(level));
+      boundary_constraints[level].add_lines (mg_constrained_dofs.get_boundary_indices(level));
       boundary_constraints[level].close ();
     }
 
@@ -380,9 +377,9 @@ void LaplaceProblem<dim>::assemble_multigrid ()
 
       for (unsigned int i=0; i<dofs_per_cell; ++i)
         for (unsigned int j=0; j<dofs_per_cell; ++j)
-          if (interface_dofs[lvl][local_dof_indices[i]]   // at_refinement_edge(i)
+          if (mg_constrained_dofs.at_refinement_edge(lvl, local_dof_indices[i])
               &&
-              !interface_dofs[lvl][local_dof_indices[j]]   // !at_refinement_edge(j)
+              ! mg_constrained_dofs.at_refinement_edge(lvl, local_dof_indices[j])
               &&
               (
                 (!mg_constrained_dofs.is_boundary_index(lvl, local_dof_indices[i])

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.