]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Restore an accidentally deleted definition
authorDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Tue, 9 May 2017 11:56:34 +0000 (13:56 +0200)
committerDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Tue, 9 May 2017 11:56:34 +0000 (13:56 +0200)
source/lac/trilinos_vector.cc

index 9fe2fd3ce33e00a70d493baf4687f964377fcb33..ac96692027deb8de5c6f8955c1fc33e6e48b9d1f 100644 (file)
@@ -284,6 +284,85 @@ namespace TrilinosWrappers
 
 
 
+    void
+    Vector::reinit (const BlockVector &v,
+                    const bool         import_data)
+    {
+      nonlocal_vector.reset();
+      owned_elements.clear();
+      owned_elements.set_size(v.size());
+
+      // In case we do not allow to have different maps, this call means that
+      // we have to reset the vector. So clear the vector, initialize our map
+      // with the map in v, and generate the vector.
+      if (v.n_blocks() == 0)
+        return;
+
+      // create a vector that holds all the elements contained in the block
+      // vector. need to manually create an Epetra_Map.
+      size_type n_elements = 0, added_elements = 0, block_offset = 0;
+      for (size_type block=0; block<v.n_blocks(); ++block)
+        n_elements += v.block(block).local_size();
+      std::vector<TrilinosWrappers::types::int_type> global_ids (n_elements, -1);
+      for (size_type block=0; block<v.n_blocks(); ++block)
+        {
+          TrilinosWrappers::types::int_type *glob_elements =
+            my_global_elements(v.block(block).vector_partitioner());
+          for (size_type i=0; i<v.block(block).local_size(); ++i)
+            global_ids[added_elements++] = glob_elements[i] + block_offset;
+          owned_elements.add_indices(v.block(block).owned_elements,
+                                     block_offset);
+          block_offset += v.block(block).size();
+        }
+
+      Assert (n_elements == added_elements, ExcInternalError());
+      Epetra_Map new_map (v.size(), n_elements, &global_ids[0], 0,
+                          v.block(0).vector_partitioner().Comm());
+
+      std::shared_ptr<Epetra_FEVector> actual_vec;
+      if ( import_data == true )
+        actual_vec.reset (new Epetra_FEVector (new_map));
+      else
+        {
+          vector.reset (new Epetra_FEVector (new_map));
+          actual_vec = vector;
+        }
+
+      TrilinosScalar *entries = (*actual_vec)[0];
+      block_offset = 0;
+      for (size_type block=0; block<v.n_blocks(); ++block)
+        {
+          v.block(block).trilinos_vector().ExtractCopy (entries, 0);
+          entries += v.block(block).local_size();
+        }
+
+      if (import_data == true)
+        {
+          AssertThrow (static_cast<size_type>(global_length(*actual_vec))
+                       == v.size(),
+                       ExcDimensionMismatch (global_length(*actual_vec),
+                                             v.size()));
+
+          Epetra_Import data_exchange (vector->Map(), actual_vec->Map());
+
+          const int ierr = vector->Import(*actual_vec, data_exchange, Insert);
+          AssertThrow (ierr == 0, ExcTrilinosError(ierr));
+
+          last_action = Insert;
+        }
+#if defined(DEBUG) && defined(DEAL_II_WITH_MPI)
+      const Epetra_MpiComm *comm_ptr
+        = dynamic_cast<const Epetra_MpiComm *>(&(vector->Comm()));
+      Assert (comm_ptr != nullptr, ExcInternalError());
+      const size_type n_elements_global
+        = Utilities::MPI::sum (owned_elements.n_elements(), comm_ptr->Comm());
+
+      Assert (has_ghosts || n_elements_global == size(), ExcInternalError());
+#endif
+    }
+
+
+
     void Vector::reinit(const IndexSet &locally_owned_entries,
                         const IndexSet &ghost_entries,
                         const MPI_Comm &communicator,

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.