]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Patch by Denis Davydov: Triangulation::has_hanging_nodes() and similar in parallel...
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Sun, 15 Jun 2014 13:31:37 +0000 (13:31 +0000)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Sun, 15 Jun 2014 13:31:37 +0000 (13:31 +0000)
git-svn-id: https://svn.dealii.org/trunk@33042 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/doc/news/changes.h
deal.II/include/deal.II/distributed/tria.h
deal.II/include/deal.II/grid/tria.h
deal.II/source/distributed/tria.cc
deal.II/source/grid/tria.cc

index de4f3e3f36d86d7c7233ae591985823976c5b99e..9cbe16bcddcc304c7859f42e04cdc2dbf5f6646e 100644 (file)
@@ -148,6 +148,12 @@ inconvenience this causes.
 <h3>Specific improvements</h3>
 
 <ol>
+  <li> New: There are now functions Triangulation::has_hanging_nodes()
+  and parallel::distributed::Triangulation::has_hanging_nodes().
+  <br>
+  (Denis Davydov, 2014/06/15)
+  </li>
+
   <li> New: There is now a class FEEvaluationQ_DG0 that does
   optimized matrix-free evaluation for FE_Q_DG0 elements.
   <br>
index e48384738c25ab0fb659f1b6e75d3e832776bc8e..f2c696d740b61d852c597a62bc4db9e265126f29 100644 (file)
@@ -1,7 +1,7 @@
 // ---------------------------------------------------------------------
 // $Id$
 //
-// Copyright (C) 2008 - 2013 by the deal.II authors
+// Copyright (C) 2008 - 2014 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
@@ -499,6 +499,25 @@ namespace parallel
        */
       virtual unsigned int n_global_levels () const;
 
+      /**
+       * Returns true if the triangulation has hanging nodes.
+       *
+       * In the context of parallel distributed triangulations, every
+       * processor stores only that part of the triangulation it
+       * locally owns. However, it also stores the entire coarse
+       * mesh, and to guarantee the 2:1 relationship between cells,
+       * this may mean that there are hanging nodes between cells that
+       * are not locally owned or ghost cells (i.e., between ghost cells
+       * and artificial cells, or between artificial and artificial cells;
+       * see @ref GlossArtificialCell "the glossary").
+       * One is not typically interested in this case, so the function
+       * returns whether there are hanging nodes between any two cells
+       * of the "global" mesh, i.e., the union of locally owned cells
+       * on all processors.
+       */
+      virtual
+      bool has_hanging_nodes() const;
+
       /**
        * Return the number of active cells owned by each of the MPI
        * processes that contribute to this triangulation. The element
index 8828bfe184089fe60187d8520cce0e90a297d03d..86d7789683edc34ccf68fff58ff79eb46b4df171 100644 (file)
@@ -1,7 +1,7 @@
 // ---------------------------------------------------------------------
 // $Id$
 //
-// Copyright (C) 1998 - 2013 by the deal.II authors
+// Copyright (C) 1998 - 2014 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
@@ -2896,7 +2896,20 @@ public:
    * n_levels() over all processors for a parallel::distributed::Triangulation
    * and therefore can be larger than n_levels().
    */
-  virtual unsigned int n_global_levels () const;
+  virtual
+  unsigned int n_global_levels () const;
+
+  /**
+   * Return true if the triangulation has hanging nodes.
+   *
+   * The function is made virtual since the result can be interpreted in different
+   * ways, depending on whether the triangulation lives only on a single processor,
+   * or may be distributed as done in the parallel::distributed::Triangulation
+   * class (see there for a description of what the function is supposed to do in the
+   * parallel context).
+   */
+  virtual
+  bool has_hanging_nodes() const;
 
   /**
    * Return the total number of
index dd92694d7f3b12fda87340e0ed5b172677553f27..c1ec69b62e18bf3cc7314791bbf1345095b1e73a 100644 (file)
@@ -1,7 +1,7 @@
 // ---------------------------------------------------------------------
 // $Id$
 //
-// Copyright (C) 2008 - 2013 by the deal.II authors
+// Copyright (C) 2008 - 2014 by the deal.II authors
 //
 // This file is part of the deal.II library.
 //
@@ -2133,6 +2133,32 @@ namespace parallel
       update_number_cache ();
     }
 
+    template <int dim, int spacedim>
+    bool
+    Triangulation<dim,spacedim>::has_hanging_nodes () const
+    {
+      // if there are any active cells with level less than n_global_levels()-1, then
+      // there is obviously also one with level n_global_levels()-1, and
+      // consequently there must be a hanging node somewhere.
+      //
+      // the problem is that we cannot just ask for the first active cell, but
+      // instead need to filter over locally owned cells
+      bool res_local = false;
+      for (typename Triangulation<dim, spacedim>::active_cell_iterator cell = this->begin_active();
+          (cell != this->end()) && (cell->level() < (int)(n_global_levels()-1));
+          cell++)
+       if (cell->is_locally_owned())
+         {
+           res_local = true;
+           break;
+         }
+
+      // reduce over MPI
+      bool res;
+      MPI_Allreduce(&res_local, &res, 1, MPI::BOOL, MPI_LOR, mpi_communicator);
+      return res;
+    }
+
 
 
     template <int dim, int spacedim>
index 4decbf788604f8f6d55e5df96f7509fc5aea961e..2193762bea52bb7cc25dd55b94747df0378dcbc4 100644 (file)
@@ -11571,6 +11571,16 @@ unsigned int Triangulation<dim, spacedim>::n_active_cells (const unsigned int le
 }
 
 
+template <int dim, int spacedim>
+bool Triangulation<dim, spacedim>::has_hanging_nodes () const
+{
+  for (unsigned int lvl = 0; lvl<n_global_levels()-1;lvl++)
+    if (n_active_cells(lvl) != 0)
+      return true;
+
+  return false;
+}
+
 
 template <int dim, int spacedim>
 unsigned int Triangulation<dim, spacedim>::n_lines () const

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.