]> https://gitweb.dealii.org/ - dealii.git/commitdiff
In case we can't deduce locally_owned_elements, set the size of owned_elements to...
authorDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Mon, 29 Aug 2016 14:58:24 +0000 (16:58 +0200)
committerDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Fri, 16 Sep 2016 12:43:08 +0000 (14:43 +0200)
include/deal.II/lac/trilinos_vector.h
source/lac/trilinos_vector.cc

index e2225accc161c549ea8abcef1596a1fba6363f25..6cb27c126bfbf34a489698bcd96616fd65dcb589 100644 (file)
@@ -511,6 +511,10 @@ namespace TrilinosWrappers
        * or may not have ghost elements. See the general documentation of this
        * class for more information.
        *
+       * In case the provided IndexSet forms an overlapping partitioning,
+       * it it not clear which elements are owned by which process and
+       * locally_owned_elements will return an IndexSet of size zero.
+       *
        * @see
        * @ref GlossGhostedVector "vectors with ghost elements"
        */
index cfae13069ac6b731996336fc7d96ac8357ea1dc5..836f8c2b2061ca514f880c3715820d3277cd1e1e 100644 (file)
@@ -208,28 +208,35 @@ namespace TrilinosWrappers
 
       has_ghosts = vector->Map().UniqueGIDs()==false;
 
-      {
-        owned_elements.clear();
-        owned_elements.set_size(size());
+      // If the IndexSets are overlapping, we don't really know
+      // which process owns what. So we decide that no process
+      // owns anything in that case. In particular asking for
+      // the locally owned elements is not allowed.
+      owned_elements.clear();
+      if (has_ghosts)
+        owned_elements.set_size(0);
+      else
+        {
+          owned_elements.set_size(size());
 
-        // easy case: local range is contiguous
-        if (vector->Map().LinearMap())
-          {
-            const std::pair<size_type, size_type> x = local_range();
-            owned_elements.add_range (x.first, x.second);
-          }
-        else if (vector->Map().NumMyElements() > 0)
-          {
-            const size_type n_indices = vector->Map().NumMyElements();
+          // easy case: local range is contiguous
+          if (vector->Map().LinearMap())
+            {
+              const std::pair<size_type, size_type> x = local_range();
+              owned_elements.add_range (x.first, x.second);
+            }
+          else if (vector->Map().NumMyElements() > 0)
+            {
+              const size_type n_indices = vector->Map().NumMyElements();
 #ifndef DEAL_II_WITH_64BIT_INDICES
-            unsigned int *vector_indices = (unsigned int *)vector->Map().MyGlobalElements();
+              unsigned int *vector_indices = (unsigned int *)vector->Map().MyGlobalElements();
 #else
-            size_type *vector_indices = (size_type *)vector->Map().MyGlobalElements64();
+              size_type *vector_indices = (size_type *)vector->Map().MyGlobalElements64();
 #endif
-            owned_elements.add_indices(vector_indices, vector_indices+n_indices);
-            owned_elements.compress();
-          }
-      }
+              owned_elements.add_indices(vector_indices, vector_indices+n_indices);
+              owned_elements.compress();
+            }
+        }
 #ifdef DEBUG
       const MPI_Comm mpi_communicator
         = dynamic_cast<const Epetra_MpiComm *>(&(vector->Comm()))->Comm();
@@ -260,11 +267,12 @@ namespace TrilinosWrappers
 
       // If the IndexSets are overlapping, we don't really know
       // which process owns what. So we decide that no process
-      // owns anything in that case.
+      // owns anything in that case. In particular asking for
+      // the locally owned elements is not allowed.
       if (has_ghosts)
         {
           owned_elements.clear();
-          owned_elements.set_size(parallel_partitioner.size());
+          owned_elements.set_size(0);
         }
       else
         owned_elements = parallel_partitioner;

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.