15#ifndef dealii_read_write_vector_h
16#define dealii_read_write_vector_h
36#ifdef DEAL_II_WITH_TRILINOS
43# include <Epetra_MultiVector.h>
61 template <
typename,
typename>
66# ifdef DEAL_II_WITH_PETSC
76# ifdef DEAL_II_WITH_TRILINOS
127 template <
typename Number>
196 template <
typename Number2>
199 const bool omit_zeroing_entries =
false);
212 const bool omit_zeroing_entries =
false);
215#ifdef DEAL_II_WITH_TRILINOS
244 template <
typename Functor>
272 template <
typename Number2>
294 const ::Vector<Number> &vec,
296 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
297 &communication_pattern = {});
304 import(const ::Vector<Number> &V,
306 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
307 &communication_pattern = {})
320 template <
typename MemorySpace>
325 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
326 &communication_pattern = {});
331 template <
typename MemorySpace>
335 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
336 &communication_pattern = {})
342#ifdef DEAL_II_WITH_PETSC
355 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
356 &communication_pattern = {});
365 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
366 &communication_pattern = {})
372#ifdef DEAL_II_WITH_TRILINOS
387 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
388 &communication_pattern = {});
397 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
398 &communication_pattern = {})
403# ifdef DEAL_II_TRILINOS_WITH_TPETRA
412 template <
typename MemorySpace,
typename Dummy = Number>
413 std::enable_if_t<std::is_same_v<Dummy, Number> &&
418 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
419 &communication_pattern = {});
424 template <
typename MemorySpace,
typename Dummy = Number>
429 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
430 &communication_pattern = {})
448 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
449 &communication_pattern = {});
458 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
459 &communication_pattern = {})
576 template <
typename Number2>
579 std::vector<Number2> &
values)
const;
616 template <
typename ForwardIterator,
typename OutputIterator>
619 const ForwardIterator indices_end,
620 OutputIterator values_begin)
const;
659 template <
typename Number2>
661 add(
const std::vector<size_type> &indices,
662 const std::vector<Number2> &
values);
668 template <
typename Number2>
670 add(
const std::vector<size_type> &indices,
678 template <
typename Number2>
689 const unsigned int precision = 3,
690 const bool scientific =
true)
const;
700#ifdef DEAL_II_WITH_TRILINOS
701# ifdef DEAL_II_TRILINOS_WITH_TPETRA
707 template <
typename MemorySpace,
typename Dummy = Number>
708 std::enable_if_t<std::is_same_v<Dummy, Number> &&
714 const IndexSet &locally_owned_elements,
717 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
718 &communication_pattern);
728 const Epetra_MultiVector &multivector,
729 const IndexSet &locally_owned_elements,
732 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
733 &communication_pattern);
742#ifdef DEAL_II_WITH_TRILINOS
743# ifdef DEAL_II_TRILINOS_WITH_TPETRA
748 template <
typename MemorySpace = ::MemorySpace::Host>
777 std::shared_ptr<Utilities::MPI::CommunicationPatternBase>
comm_pattern;
788 mutable std::shared_ptr<::parallel::internal::TBBPartitioner>
792 template <
typename Number2>
801 template <
typename Functor>
837 template <
typename Number>
848 template <
typename Number>
850 const ReadWriteVector<Number> &v)
857 template <
typename Number>
868 template <
typename Number>
870 const IndexSet &locally_stored_indices)
880 template <
typename Number>
884 return stored_elements.size();
889 template <
typename Number>
893 return stored_elements.n_elements();
898 template <
typename Number>
899 inline const IndexSet &
902 return stored_elements;
907 template <
typename Number>
916 template <
typename Number>
925 template <
typename Number>
934 template <
typename Number>
943 template <
typename Number>
947 return values[global_to_local(global_index)];
952 template <
typename Number>
956 return values[global_to_local(global_index)];
961 template <
typename Number>
965 return operator()(global_index);
970 template <
typename Number>
974 return operator()(global_index);
979 template <
typename Number>
980 template <
typename Number2>
983 const std::vector<size_type> &indices,
984 std::vector<Number2> &extracted_values)
const
986 for (size_type i = 0; i < indices.size(); ++i)
987 extracted_values[i] =
operator()(indices[i]);
992 template <
typename Number>
995 const ArrayView<const types::global_dof_index> &indices,
996 const ArrayView<Number> &entries)
const
999 for (
unsigned int i = 0; i < indices.
size(); ++i)
1000 entries[i] = (*
this)[indices[i]];
1005 template <
typename Number>
1006 template <
typename ForwardIterator,
typename OutputIterator>
1009 ForwardIterator indices_begin,
1010 const ForwardIterator indices_end,
1011 OutputIterator values_begin)
const
1013 while (indices_begin != indices_end)
1015 *values_begin = operator()(*indices_begin);
1023 template <
typename Number>
1029 return values[local_index];
1034 template <
typename Number>
1040 return values[local_index];
1045 template <
typename Number>
1046 template <
typename Number2>
1049 const std::vector<Number2> &values)
1052 add(indices.size(), indices.data(),
values.data());
1057 template <
typename Number>
1058 template <
typename Number2>
1064 for (size_type i = 0; i < size; ++i)
1069 "The given value is not finite but either infinite or Not A Number (NaN)"));
1070 this->operator()(indices[i]) +=
values[indices[i]];
1076 template <
typename Number>
1077 template <
typename Number2>
1080 const size_type *indices,
1081 const Number2 *values_to_add)
1083 for (size_type i = 0; i < n_indices; ++i)
1088 "The given value is not finite but either infinite or Not A Number (NaN)"));
1089 this->operator()(indices[i]) += values_to_add[i];
1095 template <
typename Number>
1102 return static_cast<unsigned int>(
1103 stored_elements.index_within_set(global_index));
1108 template <
typename Number>
1109 template <
typename Functor>
1112 const Functor &functor)
1119 template <
typename Number>
1120 template <
typename Functor>
1127 functor(parent.values[i]);
1143template <
typename Number>
FunctorTemplate(ReadWriteVector< Number > &parent, const Functor &functor)
virtual void operator()(const size_type begin, const size_type end)
void import_elements(const ::Vector< Number > &vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
void reinit(const ReadWriteVector< Number2 > &in_vector, const bool omit_zeroing_entries=false)
Number & operator()(const size_type global_index)
ReadWriteVector(const ReadWriteVector< Number > &in_vector)
ReadWriteVector(const size_type size)
void import_elements(const TrilinosWrappers::MPI::Vector &trilinos_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
friend class ReadWriteVector
size_type size() const override
void add(const std::vector< size_type > &indices, const std::vector< Number2 > &values)
Number operator()(const size_type global_index) const
void apply(const Functor &func)
std::size_t memory_consumption() const
Number & operator[](const size_type global_index)
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true) const
void add(const std::vector< size_type > &indices, const ReadWriteVector< Number2 > &values)
std::enable_if_t< std::is_same_v< Dummy, Number > &&::is_tpetra_type< Number >::value > import_elements(const TpetraWrappers::Vector< Number, MemorySpace > &tpetra_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
Number & local_element(const size_type local_index)
void import_elements(const EpetraWrappers::Vector &epetra_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
AlignedVector< Number > values
unsigned int global_to_local(const types::global_dof_index global_index) const
virtual void extract_subvector_to(const ArrayView< const types::global_dof_index > &indices, const ArrayView< Number > &entries) const override
Number operator[](const size_type global_index) const
Number local_element(const size_type local_index) const
std::enable_if_t< std::is_same_v< Dummy, Number > &&::is_tpetra_type< Number >::value > import_elements(const Tpetra::Vector< Number, int, types::signed_global_dof_index, MemorySpace > &tpetra_vector, const IndexSet &locally_owned_elements, VectorOperation::values operation, const MPI_Comm mpi_comm, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern)
void add(const size_type n_elements, const size_type *indices, const Number2 *values)
TpetraWrappers::CommunicationPattern< MemorySpace > create_tpetra_comm_pattern(const IndexSet &source_index_set, const MPI_Comm mpi_comm)
void import_elements(const PETScWrappers::MPI::Vector &petsc_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
ReadWriteVector< Number > & operator=(const Number s)
void reinit(const TrilinosWrappers::MPI::Vector &trilinos_vec)
virtual void reinit(const IndexSet &locally_stored_indices, const bool omit_zeroing_entries=false)
const value_type * const_pointer
void extract_subvector_to(ForwardIterator indices_begin, const ForwardIterator indices_end, OutputIterator values_begin) const
virtual void reinit(const size_type size, const bool omit_zeroing_entries=false)
size_type locally_owned_size() const
const_iterator end() const
ReadWriteVector< Number > & operator=(const ReadWriteVector< Number > &in_vector)
IndexSet source_stored_elements
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< Number2 > &values) const
void swap(ReadWriteVector< Number > &v) noexcept
const value_type * const_iterator
const_iterator begin() const
const value_type & const_reference
~ReadWriteVector() override=default
ReadWriteVector(const IndexSet &locally_stored_indices)
EpetraWrappers::CommunicationPattern create_epetra_comm_pattern(const IndexSet &source_index_set, const MPI_Comm mpi_comm)
types::global_dof_index size_type
const IndexSet & get_stored_elements() const
ReadWriteVector< Number > & operator=(const ReadWriteVector< Number2 > &in_vector)
void import_elements(const distributed::Vector< Number, MemorySpace > &vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
std::shared_ptr< Utilities::MPI::CommunicationPatternBase > comm_pattern
std::shared_ptr<::parallel::internal::TBBPartitioner > thread_loop_partitioner
typename numbers::NumberTraits< Number >::real_type real_type
void import_elements(const Epetra_MultiVector &multivector, const IndexSet &locally_owned_elements, VectorOperation::values operation, const MPI_Comm mpi_comm, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern)
void swap(LinearAlgebra::ReadWriteVector< Number > &u, LinearAlgebra::ReadWriteVector< Number > &v) noexcept
#define DEAL_II_DEPRECATED
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
types::global_dof_index size_type
bool is_finite(const double x)
unsigned int global_dof_index