13#ifndef dealii_read_write_vector_h
14#define dealii_read_write_vector_h
30#ifdef DEAL_II_WITH_TRILINOS
38# ifdef DEAL_II_TRILINOS_WITH_EPETRA
39# include <Epetra_MultiVector.h>
58 template <
typename,
typename>
63# ifdef DEAL_II_WITH_PETSC
115 template <
typename Number>
184 template <
typename Number2>
187 const bool omit_zeroing_entries =
false);
200 const bool omit_zeroing_entries =
false);
203#ifdef DEAL_II_TRILINOS_WITH_EPETRA
232 template <
typename Functor>
260 template <
typename Number2>
282 const ::Vector<Number> &vec,
284 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
285 &communication_pattern = {});
295 template <
typename MemorySpace>
300 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
301 &communication_pattern = {});
304 template <
typename MemorySpace>
309#ifdef DEAL_II_WITH_PETSC
322 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
323 &communication_pattern = {});
330#if defined(DEAL_II_WITH_TRILINOS)
331# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
346 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
347 &communication_pattern = {});
354# ifdef DEAL_II_TRILINOS_WITH_TPETRA
363 template <
typename MemorySpace,
typename OtherNumber>
364 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
368 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
369 &communication_pattern = {});
376 template <
typename MemorySpace,
typename OtherNumber>
377 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
384# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
397 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
398 &communication_pattern = {});
513 template <
typename Number2>
516 std::vector<Number2> &
values)
const;
553 template <
typename ForwardIterator,
typename OutputIterator>
556 const ForwardIterator indices_end,
557 OutputIterator values_begin)
const;
596 template <
typename Number2>
598 add(
const std::vector<size_type> &indices,
599 const std::vector<Number2> &
values);
605 template <
typename Number2>
607 add(
const std::vector<size_type> &indices,
615 template <
typename Number2>
626 const unsigned int precision = 3,
627 const bool scientific =
true)
const;
637#ifdef DEAL_II_WITH_TRILINOS
638# ifdef DEAL_II_TRILINOS_WITH_TPETRA
644 template <
typename MemorySpace,
typename OtherNumber>
645 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
650 const
IndexSet &locally_owned_elements,
654 &communication_pattern);
657# ifdef DEAL_II_TRILINOS_WITH_EPETRA
665 const Epetra_MultiVector &multivector,
666 const IndexSet &locally_owned_elements,
669 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
670 &communication_pattern);
680#ifdef DEAL_II_WITH_TRILINOS
681# ifdef DEAL_II_TRILINOS_WITH_TPETRA
686 template <
typename MemorySpace = ::MemorySpace::Host>
692# ifdef DEAL_II_TRILINOS_WITH_EPETRA
717 std::shared_ptr<Utilities::MPI::CommunicationPatternBase>
comm_pattern;
728 mutable std::shared_ptr<::parallel::internal::TBBPartitioner>
732 template <
typename Number2>
741 template <
typename Functor>
777 template <
typename Number>
788 template <
typename Number>
790 const ReadWriteVector<Number> &v)
797 template <
typename Number>
808 template <
typename Number>
810 const IndexSet &locally_stored_indices)
820 template <
typename Number>
824 return stored_elements.size();
829 template <
typename Number>
833 return stored_elements.n_elements();
838 template <
typename Number>
842 return stored_elements;
847 template <
typename Number>
856 template <
typename Number>
865 template <
typename Number>
874 template <
typename Number>
883 template <
typename Number>
887 return values[global_to_local(global_index)];
892 template <
typename Number>
896 return values[global_to_local(global_index)];
901 template <
typename Number>
910 template <
typename Number>
919 template <
typename Number>
920 template <
typename Number2>
923 const std::vector<size_type> &indices,
924 std::vector<Number2> &extracted_values)
const
926 for (size_type i = 0; i < indices.size(); ++i)
927 extracted_values[i] =
operator()(indices[i]);
932 template <
typename Number>
939 for (
unsigned int i = 0; i < indices.
size(); ++i)
940 entries[i] = (*
this)[indices[i]];
945 template <
typename Number>
946 template <
typename ForwardIterator,
typename OutputIterator>
949 ForwardIterator indices_begin,
950 const ForwardIterator indices_end,
951 OutputIterator values_begin)
const
953 while (indices_begin != indices_end)
963 template <
typename Number>
969 return values[local_index];
974 template <
typename Number>
980 return values[local_index];
985 template <
typename Number>
986 template <
typename Number2>
989 const std::vector<Number2> &values)
992 add(indices.size(), indices.data(),
values.data());
997 template <
typename Number>
998 template <
typename Number2>
1001 const ReadWriteVector<Number2> &values)
1004 for (size_type i = 0; i <
size; ++i)
1009 "The given value is not finite but either infinite or Not A Number (NaN)"));
1016 template <
typename Number>
1017 template <
typename Number2>
1020 const size_type *indices,
1021 const Number2 *values_to_add)
1023 for (size_type i = 0; i < n_indices; ++i)
1028 "The given value is not finite but either infinite or Not A Number (NaN)"));
1029 this->
operator()(indices[i]) += values_to_add[i];
1035 template <
typename Number>
1042 return static_cast<unsigned int>(
1043 stored_elements.index_within_set(global_index));
1048 template <
typename Number>
1049 template <
typename Functor>
1051 ReadWriteVector<Number> &parent,
1052 const Functor &functor)
1059 template <
typename Number>
1060 template <
typename Functor>
1067 functor(parent.values[i]);
1083template <
typename Number>
* * Point< dim > operator()(const Point< dim > &p) const *
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={})
std::enable_if_t<::is_tpetra_type< OtherNumber >::value > import_elements(const TpetraWrappers::BlockVector< OtherNumber, MemorySpace > &src, const VectorOperation::values operation)
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)
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
std::enable_if_t<::is_tpetra_type< OtherNumber >::value > import_elements(const Tpetra::Vector< OtherNumber, 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)
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
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 import_elements(const TrilinosWrappers::MPI::BlockVector &src, const VectorOperation::values operation)
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
void import_elements(const PETScWrappers::MPI::BlockVector &src, const VectorOperation::values operation)
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
void import_elements(const distributed::BlockVector< Number, MemorySpace > &src, const VectorOperation::values operation)
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)
std::enable_if_t<::is_tpetra_type< OtherNumber >::value > import_elements(const TpetraWrappers::Vector< OtherNumber, MemorySpace > &tpetra_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
void swap(LinearAlgebra::ReadWriteVector< Number > &u, LinearAlgebra::ReadWriteVector< Number > &v) noexcept
#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 locally_owned_size
types::global_dof_index size_type
* * * RotationFunction< dim, Number >::RotationFunction Number(dim)
bool is_finite(const double x)
unsigned int global_dof_index