16 #ifndef dealii_trilinos_tpetra_vector_h
17 #define dealii_trilinos_tpetra_vector_h
22 #ifdef DEAL_II_TRILINOS_WITH_TPETRA
33 # include <Teuchos_Comm.hpp>
34 # include <Teuchos_OrdinalTraits.hpp>
35 # include <Tpetra_Core.hpp>
36 # include <Tpetra_Vector.hpp>
37 # include <Tpetra_Version.hpp>
48 template <
typename Number>
52 # ifdef HAVE_TPETRA_INST_FLOAT
58 # ifdef HAVE_TPETRA_INST_DOUBLE
64 # ifdef DEAL_II_WITH_COMPLEX_VALUES
65 # ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
71 # ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
82 template <
typename Number>
83 class ReadWriteVector;
100 namespace TpetraWrappers
128 template <
typename Number>
129 class VectorReference
142 VectorReference(
const VectorReference &) =
default;
155 const VectorReference &
156 operator=(
const VectorReference &r)
const;
162 operator=(
const VectorReference &r);
167 const VectorReference &
168 operator=(
const Number &s)
const;
173 const VectorReference &
174 operator+=(
const Number &s)
const;
179 const VectorReference &
180 operator-=(
const Number &s)
const;
185 const VectorReference &
186 operator*=(
const Number &s)
const;
191 const VectorReference &
192 operator/=(
const Number &s)
const;
198 operator Number()
const;
205 <<
"An error with error number " << arg1
206 <<
" occurred while calling a Trilinos function");
221 friend class Vector<Number>;
249 template <
typename Number>
260 using MapType = Tpetra::Map<int, ::types::signed_global_dof_index>;
262 Tpetra::Vector<Number, int, ::types::signed_global_dof_index>;
293 const MPI_Comm communicator);
303 const MPI_Comm communicator,
304 const bool omit_zeroing_entries =
false);
323 const IndexSet &locally_relevant_or_ghost_entries,
324 const MPI_Comm communicator = MPI_COMM_WORLD);
368 const Teuchos::RCP<const Utilities::MPI::CommunicationPatternBase>
369 &communication_pattern);
379 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
380 &communication_pattern);
399 std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
400 communication_pattern = {})
490 add(
const std::vector<size_type> &indices,
491 const std::vector<TrilinosScalar> &
values);
678 const Tpetra::Vector<Number, int, types::signed_global_dof_index> &
685 Tpetra::Vector<Number, int, types::signed_global_dof_index> &
693 const Tpetra::Vector<Number, int, types::signed_global_dof_index>>
700 Teuchos::RCP<Tpetra::Vector<Number, int, types::signed_global_dof_index>>
708 const unsigned int precision = 3,
709 const bool scientific =
true,
710 const bool across =
true)
const;
749 <<
"An error with error number " << arg1
750 <<
" occurred while calling a Trilinos function");
776 Teuchos::RCP<const TpetraWrappers::CommunicationPattern>
780 friend class internal::VectorReference<Number>;
786 template <
typename Number>
795 template <
typename Number>
798 const std::vector<TrilinosScalar> &
values)
804 add(indices.size(), indices.data(),
values.data());
809 template <
typename Number>
815 # if DEAL_II_TRILINOS_VERSION_GTE(13, 2, 0)
816 auto vector_2d = vector->template getLocalView<Kokkos::HostSpace>(
817 Tpetra::Access::ReadWrite);
819 vector->template sync<Kokkos::HostSpace>();
820 auto vector_2d = vector->template getLocalView<Kokkos::HostSpace>();
822 auto vector_1d = Kokkos::subview(vector_2d, Kokkos::ALL(), 0);
823 # if !DEAL_II_TRILINOS_VERSION_GTE(13, 2, 0)
824 vector->template modify<Kokkos::HostSpace>();
827 for (
size_type i = 0; i < n_elements; ++i)
831 vector->getMap()->getLocalElement(row);
834 vector_1d(local_row) +=
values[i];
837 # if !DEAL_II_TRILINOS_VERSION_GTE(13, 2, 0)
838 vector->template sync<
839 typename Tpetra::Vector<Number, int, types::signed_global_dof_index>::
840 device_type::memory_space>();
846 template <
typename Number>
852 # if DEAL_II_TRILINOS_VERSION_GTE(13, 2, 0)
853 auto vector_2d = vector->template getLocalView<Kokkos::HostSpace>(
854 Tpetra::Access::ReadWrite);
856 vector->template sync<Kokkos::HostSpace>();
857 auto vector_2d = vector->template getLocalView<Kokkos::HostSpace>();
859 auto vector_1d = Kokkos::subview(vector_2d, Kokkos::ALL(), 0);
860 # if !DEAL_II_TRILINOS_VERSION_GTE(13, 2, 0)
861 vector->template modify<Kokkos::HostSpace>();
864 for (
size_type i = 0; i < n_elements; ++i)
868 vector->getMap()->getLocalElement(row);
871 vector_1d(local_row) =
values[i];
874 # if !DEAL_II_TRILINOS_VERSION_GTE(13, 2, 0)
875 vector->template sync<
876 typename Tpetra::Vector<Number, int, types::signed_global_dof_index>::
877 device_type::memory_space>();
883 template <
typename Number>
884 inline internal::VectorReference<Number>
887 return internal::VectorReference(*
this, index);
895 template <
typename Number>
896 inline VectorReference<Number>::VectorReference(
Vector<Number> &vector,
904 template <
typename Number>
905 inline const VectorReference<Number> &
906 VectorReference<Number>::operator=(
const VectorReference<Number> &r)
const
912 *
this =
static_cast<Number
>(r);
919 template <
typename Number>
920 inline VectorReference<Number> &
921 VectorReference<Number>::operator=(
const VectorReference<Number> &r)
924 *
this =
static_cast<Number
>(r);
931 template <
typename Number>
932 inline const VectorReference<Number> &
933 VectorReference<Number>::operator=(
const Number &value)
const
935 vector.set(1, &index, &value);
941 template <
typename Number>
942 inline const VectorReference<Number> &
943 VectorReference<Number>::operator+=(
const Number &value)
const
945 vector.add(1, &index, &value);
951 template <
typename Number>
952 inline const VectorReference<Number> &
953 VectorReference<Number>::operator-=(
const Number &value)
const
955 Number new_value = -
value;
956 vector.add(1, &index, &new_value);
962 template <
typename Number>
963 inline const VectorReference<Number> &
964 VectorReference<Number>::operator*=(
const Number &value)
const
966 Number new_value =
static_cast<Number
>(*this) *
value;
967 vector.set(1, &index, &new_value);
973 template <
typename Number>
974 inline const VectorReference<Number> &
975 VectorReference<Number>::operator/=(
const Number &value)
const
977 Number new_value =
static_cast<Number
>(*this) /
value;
978 vector.set(1, &index, &new_value);
994 template <
typename Number>
Vector & operator-=(const Vector< Number > &V)
Number operator*(const Vector< Number > &V) const
real_type linfty_norm() const
void create_tpetra_comm_pattern(const IndexSet &source_index_set, const MPI_Comm mpi_comm)
bool has_ghost_elements() const
Teuchos::RCP< const TpetraWrappers::CommunicationPattern > tpetra_comm_pattern
Vector & operator=(const Vector &V)
virtual size_type size() const override
Teuchos::RCP< VectorType > vector
Teuchos::RCP< const Tpetra::Vector< Number, int, types::signed_global_dof_index > > trilinos_rcp() const
void reinit(const IndexSet &locally_owned_entries, const IndexSet &locally_relevant_or_ghost_entries, const MPI_Comm communicator=MPI_COMM_WORLD)
void add(const Number a, const Vector< Number > &V)
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
std::size_t memory_consumption() const
Vector & operator/=(const Number factor)
Vector & operator=(const Number s)
MPI_Comm mpi_comm() const
MPI_Comm get_mpi_communicator() const
real_type l1_norm() const
Vector & operator*=(const Number factor)
void compress(const VectorOperation::values operation)
void import_elements(const ReadWriteVector< Number > &V, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern)
Tpetra::Vector< Number, int, types::signed_global_dof_index > & trilinos_vector()
Tpetra::Vector< Number, int, ::types::signed_global_dof_index > VectorType
types::global_dof_index size_type
void equ(const Number a, const Vector< Number > &V)
Vector & operator+=(const Vector< Number > &V)
void import_elements(const ReadWriteVector< Number > &V, VectorOperation::values operation, const Teuchos::RCP< const Utilities::MPI::CommunicationPatternBase > &communication_pattern)
size_type locally_owned_size() const
void sadd(const Number s, const Number a, const Vector< Number > &V)
Tpetra::Map< int, ::types::signed_global_dof_index > MapType
typename numbers::NumberTraits< Number >::real_type real_type
void reinit(const IndexSet ¶llel_partitioner, const MPI_Comm communicator, const bool omit_zeroing_entries=false)
reference operator()(const size_type index)
virtual void extract_subvector_to(const ArrayView< const types::global_dof_index > &indices, ArrayView< Number > &elements) const override
Teuchos::RCP< Tpetra::Vector< Number, int, types::signed_global_dof_index > > trilinos_rcp()
void scale(const Vector< Number > &scaling_factors)
Number mean_value() const
void import_elements(const ReadWriteVector< Number > &V, VectorOperation::values operation)
::IndexSet locally_owned_elements() const
const Tpetra::Vector< Number, int, types::signed_global_dof_index > & trilinos_vector() const
Number add_and_dot(const Number a, const Vector< Number > &V, const Vector< Number > &W)
void reinit(const Vector< Number > &V, const bool omit_zeroing_entries=false)
Vector(const IndexSet ¶llel_partitioner, const MPI_Comm communicator)
void add(const Number a, const Vector< Number > &V, const Number b, const Vector< Number > &W)
real_type l2_norm() const
void set(const size_type n_elements, const size_type *indices, const Number *values)
internal::VectorReference< Number > reference
::IndexSet source_stored_elements
Vector(const Teuchos::RCP< VectorType > V)
types::global_dof_index size_type
#define DEAL_II_DEPRECATED
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DeclException0(Exception0)
static ::ExceptionBase & ExcDifferentParallelPartitioning()
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcTrilinosError(int arg1)
#define AssertDimension(dim1, dim2)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcVectorTypeNotCompatible()
types::global_dof_index size_type
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
unsigned int global_dof_index