16 #include <deal.II/lac/trilinos_vector.h> 18 #ifdef DEAL_II_WITH_TRILINOS 20 # include <deal.II/lac/trilinos_sparse_matrix.h> 21 # include <deal.II/lac/trilinos_block_vector.h> 23 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
24 # include <Epetra_Import.h> 25 # include <Epetra_Vector.h> 31 DEAL_II_NAMESPACE_OPEN
37 #ifndef DEAL_II_WITH_64BIT_INDICES 42 int n_global_elements (
const Epetra_BlockMap &map)
44 return map.NumGlobalElements();
51 int *my_global_elements(
const Epetra_BlockMap &map)
53 return map.MyGlobalElements();
58 int global_length(
const Epetra_FEVector &vector)
60 return vector.GlobalLength();
67 long long int n_global_elements (
const Epetra_BlockMap &map)
69 return map.NumGlobalElements64();
76 long long int *my_global_elements(
const Epetra_BlockMap &map)
78 return map.MyGlobalElements64();
83 long long int global_length(
const Epetra_FEVector &vector)
85 return vector.GlobalLength64();
104 reinit (parallel_partitioning);
110 const MPI_Comm &communicator)
112 reinit (parallel_partitioning, communicator);
122 vector.reset (
new Epetra_FEVector(*v.vector));
128 #ifdef DEAL_II_WITH_CXX11 147 ExcDimensionMismatch (n_global_elements(input_map),
148 n_global_elements(v.
vector->Map())));
152 if (input_map.SameAs(v.
vector->Map()) ==
true)
153 vector.reset (
new Epetra_FEVector(*v.
vector));
156 vector.reset (
new Epetra_FEVector(input_map));
165 const MPI_Comm &communicator)
171 ExcDimensionMismatch (parallel_partitioner.
size(),
172 n_global_elements(v.
vector->Map())));
176 vector.reset (
new Epetra_FEVector
184 const MPI_Comm &communicator)
188 IndexSet parallel_partitioning = local;
190 reinit(parallel_partitioning, communicator);
202 const bool omit_zeroing_entries)
206 if (vector->Map().SameAs(input_map)==
false)
207 vector.reset (
new Epetra_FEVector(input_map));
208 else if (omit_zeroing_entries ==
false)
210 const int ierr = vector->PutScalar(0.);
212 Assert (ierr == 0, ExcTrilinosError(ierr));
215 has_ghosts = vector->Map().UniqueGIDs()==
false;
223 const MPI_Comm &communicator,
224 const bool omit_zeroing_entries)
230 reinit (map, omit_zeroing_entries);
237 const bool omit_zeroing_entries,
238 const bool allow_different_maps)
245 if (allow_different_maps ==
false)
247 if (vector->Map().SameAs(v.
vector->Map()) ==
false)
249 vector.reset (
new Epetra_FEVector(v.
vector->Map()));
253 else if (omit_zeroing_entries ==
false)
263 Assert (ierr == 0, ExcTrilinosError(ierr));
265 ierr = vector->PutScalar(0.0);
266 Assert (ierr == 0, ExcTrilinosError(ierr));
278 Assert (omit_zeroing_entries ==
false,
279 ExcMessage (
"It is not possible to exchange data with the " 280 "option 'omit_zeroing_entries' set, which would not write " 284 ExcDimensionMismatch (
size(), v.
size()));
286 Epetra_Import data_exchange (vector->Map(), v.
vector->Map());
288 const int ierr = vector->Import(*v.
vector, data_exchange, Insert);
300 const bool import_data)
312 size_type n_elements = 0, added_elements = 0, block_offset = 0;
314 n_elements += v.
block(block).local_size();
315 std::vector<TrilinosWrappers::types::int_type> global_ids (n_elements, -1);
318 TrilinosWrappers::types::int_type *glob_elements =
319 my_global_elements(v.
block(block).vector_partitioner());
321 global_ids[added_elements++] = glob_elements[i] + block_offset;
325 Assert (n_elements == added_elements, ExcInternalError());
326 Epetra_Map new_map (v.
size(), n_elements, &global_ids[0], 0,
327 v.
block(0).vector_partitioner().Comm());
329 std_cxx11::shared_ptr<Epetra_FEVector> actual_vec;
330 if ( import_data ==
true )
331 actual_vec.reset (
new Epetra_FEVector (new_map));
334 vector.reset (
new Epetra_FEVector (new_map));
338 TrilinosScalar *entries = (*actual_vec)[0];
342 v.
block(block).trilinos_vector().ExtractCopy (entries, 0);
343 entries += v.
block(block).local_size();
346 if (import_data ==
true)
348 AssertThrow (static_cast<size_type>(global_length(*actual_vec))
350 ExcDimensionMismatch (global_length(*actual_vec),
353 Epetra_Import data_exchange (vector->Map(), actual_vec->Map());
355 const int ierr = vector->Import(*actual_vec, data_exchange, Insert);
366 const MPI_Comm &communicator,
367 const bool vector_writable)
370 if (vector_writable ==
false)
372 IndexSet parallel_partitioning = locally_owned_entries;
374 reinit(parallel_partitioning, communicator);
381 ExcMessage(
"A writable vector must not have ghost entries in " 382 "its parallel partitioning"));
385 IndexSet nonlocal_entries(ghost_entries);
389 Epetra_Map nonlocal_map =
404 if (vector->Map().SameAs(v.vector->Map()))
407 if (v.nonlocal_vector.get() != 0)
408 nonlocal_vector.reset(
new Epetra_MultiVector(v.nonlocal_vector->Map(), 1));
416 (v.vector->Map().UniqueGIDs() || vector->Map().UniqueGIDs()))
424 vector.reset (
new Epetra_FEVector(*v.vector));
429 if (v.nonlocal_vector.get() != 0)
430 nonlocal_vector.reset(
new Epetra_MultiVector(v.nonlocal_vector->Map(), 1));
437 #ifdef DEAL_II_WITH_CXX11 454 Epetra_Import data_exchange (vector->Map(), v.vector->Map());
455 const int ierr = vector->Import(*v.vector, data_exchange, Insert);
472 "Cannot find exchange information!"));
473 Assert (v.vector->Map().UniqueGIDs() ==
true,
474 ExcMessage (
"The input vector has overlapping data, " 475 "which is not allowed."));
479 vector.reset (
new Epetra_FEVector(
484 Epetra_Import data_exchange (vector->Map(), v.vector->Map());
485 const int ierr = vector->Import(*v.vector, data_exchange, Insert);
501 vector.reset (
new Epetra_FEVector(map));
510 vector.reset (
new Epetra_FEVector (map));
518 Epetra_LocalMap map (n_global_elements(input_map),
519 input_map.IndexBase(),
521 vector.reset (
new Epetra_FEVector(map));
527 const MPI_Comm &communicator)
530 Epetra_LocalMap map (static_cast<TrilinosWrappers::types::int_type>(partitioning.
size()),
532 #ifdef DEAL_II_WITH_MPI
533 Epetra_MpiComm(communicator));
535 Epetra_SerialComm());
538 vector.reset (
new Epetra_FEVector(map));
546 Epetra_LocalMap map (n_global_elements(v.
vector->Map()),
547 v.
vector->Map().IndexBase(),
549 vector.reset (
new Epetra_FEVector(map));
551 if (vector->Map().SameAs(v.
vector->Map()) ==
true)
553 const int ierr = vector->Update(1.0, *v.
vector, 0.0);
565 const bool omit_zeroing_entries)
569 Epetra_LocalMap map ((TrilinosWrappers::types::int_type)n, 0,
571 vector.reset (
new Epetra_FEVector (map));
573 else if (omit_zeroing_entries ==
false)
578 Assert (ierr == 0, ExcTrilinosError(ierr));
580 ierr = vector->PutScalar(0.0);
581 Assert (ierr == 0, ExcTrilinosError(ierr));
591 const bool omit_zeroing_entries)
593 if (n_global_elements(vector->Map()) != n_global_elements(input_map))
595 Epetra_LocalMap map (n_global_elements(input_map),
596 input_map.IndexBase(),
598 vector.reset (
new Epetra_FEVector (map));
600 else if (omit_zeroing_entries ==
false)
605 Assert (ierr == 0, ExcTrilinosError(ierr));
607 ierr = vector->PutScalar(0.0);
608 Assert (ierr == 0, ExcTrilinosError(ierr));
618 const MPI_Comm &communicator,
619 const bool omit_zeroing_entries)
621 if (n_global_elements(vector->Map()) !=
622 static_cast<TrilinosWrappers::types::int_type>(partitioning.
size()))
624 Epetra_LocalMap map (static_cast<TrilinosWrappers::types::int_type>(partitioning.
size()),
626 #ifdef DEAL_II_WITH_MPI
627 Epetra_MpiComm(communicator));
629 Epetra_SerialComm());
632 vector.reset (
new Epetra_FEVector(map));
634 else if (omit_zeroing_entries ==
false)
639 Assert (ierr == 0, ExcTrilinosError(ierr));
641 ierr = vector->PutScalar(0.0);
642 Assert (ierr == 0, ExcTrilinosError(ierr));
652 const bool omit_zeroing_entries,
653 const bool allow_different_maps)
662 (void)omit_zeroing_entries;
663 if (allow_different_maps ==
false)
667 Epetra_LocalMap map (global_length(*(v.
vector)),
668 v.
vector->Map().IndexBase(),
670 vector.reset (
new Epetra_FEVector(map));
676 ExcMessage (
"The Epetra maps in the assignment operator =" 677 " do not match, even though the local_range " 678 " seems to be the same. Check vector setup!"));
682 Assert (ierr == 0, ExcTrilinosError(ierr));
684 ierr = vector->PutScalar(0.0);
685 Assert (ierr == 0, ExcTrilinosError(ierr));
698 Assert (omit_zeroing_entries ==
false,
699 ExcMessage (
"It is not possible to exchange data with the " 700 "option 'omit_zeroing_entries' set, which would not write " 704 ExcDimensionMismatch (
size(), v.
size()));
706 Epetra_Import data_exchange (vector->Map(), v.
vector->Map());
708 const int ierr = vector->Import(*v.
vector, data_exchange, Insert);
723 Epetra_LocalMap map (n_global_elements(v.vector->Map()),
724 v.vector->Map().IndexBase(),
726 vector.reset (
new Epetra_FEVector(map));
740 Epetra_LocalMap map (n_global_elements(v.vector->Map()),
741 v.vector->Map().IndexBase(),
743 vector.reset (
new Epetra_FEVector(map));
746 const int ierr = vector->Update(1.0, *v.vector, 0.0);
747 Assert (ierr == 0, ExcTrilinosError(ierr));
755 DEAL_II_NAMESPACE_CLOSE
757 #endif // DEAL_II_WITH_TRILINOS Vector & operator=(const TrilinosScalar s)
::types::global_dof_index size_type
::ExceptionBase & ExcMessage(std::string arg1)
std_cxx11::shared_ptr< Epetra_MultiVector > nonlocal_vector
std::pair< size_type, size_type > local_range() const
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
#define AssertThrow(cond, exc)
const Epetra_Comm & comm_self()
void reinit(const VectorBase &v, const bool omit_zeroing_entries=false, const bool allow_different_maps=false)
Epetra_Map make_trilinos_map(const MPI_Comm &communicator=MPI_COMM_WORLD, const bool overlapping=false) const
std_cxx11::shared_ptr< Epetra_FEVector > vector
void subtract_set(const IndexSet &other)
#define Assert(cond, exc)
void swap(Vector &u, Vector &v)
const Epetra_CrsMatrix & trilinos_matrix() const
void import_nonlocal_data_for_fe(const ::TrilinosWrappers::SparseMatrix &matrix, const Vector &vector)
unsigned int n_mpi_processes(const MPI_Comm &mpi_communicator)
unsigned int n_blocks() const
Epetra_CombineMode last_action
::types::global_dof_index size_type
BlockType & block(const unsigned int i)