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 = {});
373# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
386 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
387 &communication_pattern = {});
502 template <
typename Number2>
505 std::vector<Number2> &
values)
const;
542 template <
typename ForwardIterator,
typename OutputIterator>
545 const ForwardIterator indices_end,
546 OutputIterator values_begin)
const;
585 template <
typename Number2>
587 add(
const std::vector<size_type> &indices,
588 const std::vector<Number2> &
values);
594 template <
typename Number2>
596 add(
const std::vector<size_type> &indices,
604 template <
typename Number2>
615 const unsigned int precision = 3,
616 const bool scientific =
true)
const;
626#ifdef DEAL_II_WITH_TRILINOS
627# ifdef DEAL_II_TRILINOS_WITH_TPETRA
633 template <
typename MemorySpace,
typename OtherNumber>
634 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
639 const
IndexSet &locally_owned_elements,
643 &communication_pattern);
646# ifdef DEAL_II_TRILINOS_WITH_EPETRA
654 const Epetra_MultiVector &multivector,
655 const IndexSet &locally_owned_elements,
658 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
659 &communication_pattern);
669#ifdef DEAL_II_WITH_TRILINOS
670# ifdef DEAL_II_TRILINOS_WITH_TPETRA
675 template <
typename MemorySpace = ::MemorySpace::Host>
681# ifdef DEAL_II_TRILINOS_WITH_EPETRA
706 std::shared_ptr<Utilities::MPI::CommunicationPatternBase>
comm_pattern;
717 mutable std::shared_ptr<::parallel::internal::TBBPartitioner>
721 template <
typename Number2>
730 template <
typename Functor>
766 template <
typename Number>
777 template <
typename Number>
779 const ReadWriteVector<Number> &v)
786 template <
typename Number>
797 template <
typename Number>
799 const IndexSet &locally_stored_indices)
809 template <
typename Number>
813 return stored_elements.size();
818 template <
typename Number>
822 return stored_elements.n_elements();
827 template <
typename Number>
831 return stored_elements;
836 template <
typename Number>
845 template <
typename Number>
854 template <
typename Number>
863 template <
typename Number>
872 template <
typename Number>
876 return values[global_to_local(global_index)];
881 template <
typename Number>
885 return values[global_to_local(global_index)];
890 template <
typename Number>
899 template <
typename Number>
908 template <
typename Number>
909 template <
typename Number2>
912 const std::vector<size_type> &indices,
913 std::vector<Number2> &extracted_values)
const
915 for (size_type i = 0; i < indices.size(); ++i)
916 extracted_values[i] =
operator()(indices[i]);
921 template <
typename Number>
928 for (
unsigned int i = 0; i < indices.
size(); ++i)
929 entries[i] = (*
this)[indices[i]];
934 template <
typename Number>
935 template <
typename ForwardIterator,
typename OutputIterator>
938 ForwardIterator indices_begin,
939 const ForwardIterator indices_end,
940 OutputIterator values_begin)
const
942 while (indices_begin != indices_end)
952 template <
typename Number>
958 return values[local_index];
963 template <
typename Number>
969 return values[local_index];
974 template <
typename Number>
975 template <
typename Number2>
978 const std::vector<Number2> &values)
981 add(indices.size(), indices.data(),
values.data());
986 template <
typename Number>
987 template <
typename Number2>
990 const ReadWriteVector<Number2> &values)
993 for (size_type i = 0; i <
size; ++i)
998 "The given value is not finite but either infinite or Not A Number (NaN)"));
1005 template <
typename Number>
1006 template <
typename Number2>
1009 const size_type *indices,
1010 const Number2 *values_to_add)
1012 for (size_type i = 0; i < n_indices; ++i)
1017 "The given value is not finite but either infinite or Not A Number (NaN)"));
1018 this->
operator()(indices[i]) += values_to_add[i];
1024 template <
typename Number>
1031 return static_cast<unsigned int>(
1032 stored_elements.index_within_set(global_index));
1037 template <
typename Number>
1038 template <
typename Functor>
1040 ReadWriteVector<Number> &parent,
1041 const Functor &functor)
1048 template <
typename Number>
1049 template <
typename Functor>
1056 functor(parent.values[i]);
1072template <
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={})
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