+ 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,