13#ifndef dealii_trilinos_tpetra_vector_h
14#define dealii_trilinos_tpetra_vector_h
23#ifdef DEAL_II_TRILINOS_WITH_TPETRA
34# include <Teuchos_Comm.hpp>
35# include <Teuchos_OrdinalTraits.hpp>
36# include <Tpetra_Core.hpp>
37# include <Tpetra_Vector.hpp>
38# include <Tpetra_Version.hpp>
49#ifdef DEAL_II_TRILINOS_WITH_TPETRA
55template <
typename Number>
59# ifdef DEAL_II_TRILINOS_WITH_TPETRA_INST_FLOAT
65# ifdef DEAL_II_TRILINOS_WITH_TPETRA_INST_DOUBLE
71# ifdef DEAL_II_WITH_COMPLEX_VALUES
72# ifdef DEAL_II_TRILINOS_WITH_TPETRA_INST_COMPLEX_FLOAT
78# ifdef DEAL_II_TRILINOS_WITH_TPETRA_INST_COMPLEX_DOUBLE
89 template <
typename Number>
90 class ReadWriteVector;
107 namespace TpetraWrappers
146 template <
typename Number,
148 class VectorReference
156 const size_type index);
162 VectorReference(
const VectorReference &) =
default;
175 const VectorReference &
176 operator=(
const VectorReference &r)
const;
182 operator=(
const VectorReference &r);
187 const VectorReference &
188 operator=(
const Number &s)
const;
193 const VectorReference &
194 operator+=(
const Number &s)
const;
199 const VectorReference &
200 operator-=(
const Number &s)
const;
205 const VectorReference &
206 operator*=(
const Number &s)
const;
211 const VectorReference &
212 operator/=(
const Number &s)
const;
218 operator Number()
const;
225 <<
"An error with error number " << arg1
226 <<
" occurred while calling a Trilinos function");
234 ExcAccessToNonLocalElement,
239 <<
"You are trying to access element " << arg1
240 <<
" of a distributed vector, but this element is not stored "
241 <<
"on the current processor. Note: There are " << arg2
242 <<
" elements stored "
243 <<
"on the current processor from within the range [" << arg3 <<
','
244 << arg4 <<
"] but Trilinos vectors need not store contiguous "
245 <<
"ranges on each processor, and not every element in "
246 <<
"this range may in fact be stored locally."
248 <<
"A common source for this kind of problem is that you "
249 <<
"are passing a 'fully distributed' vector into a function "
250 <<
"that needs read access to vector elements that correspond "
251 <<
"to degrees of freedom on ghost cells (or at least to "
252 <<
"'locally active' degrees of freedom that are not also "
253 <<
"'locally owned'). You need to pass a vector that has these "
254 <<
"elements as ghost entries.");
265 const size_type index;
289 template <
typename Number,
typename MemorySpace = ::MemorySpace::Host>
299 using reference = internal::VectorReference<Number, MemorySpace>;
301 const internal::VectorReference<Number, MemorySpace>;
334 const MPI_Comm communicator = MPI_COMM_WORLD);
353 const bool vector_writable =
false);
370 const MPI_Comm communicator = MPI_COMM_WORLD,
371 const bool omit_zeroing_entries =
false);
389 const IndexSet &locally_relevant_or_ghost_entries,
390 const MPI_Comm communicator = MPI_COMM_WORLD,
391 const bool vector_writable =
false);
399 const bool omit_zeroing_entries =
false);
464 template <
typename OtherNumber>
496 const Teuchos::RCP<const Utilities::MPI::CommunicationPatternBase>
497 &communication_pattern);
612 const bool allow_different_maps =
false);
636 add(
const std::vector<size_type> &indices,
637 const std::vector<Number> &values);
648 const Number *values);
675 const Number *values);
684 set(
const std::vector<size_type> &indices,
685 const std::vector<Number> &values);
866 std::pair<size_type, size_type>
966 Teuchos::RCP<const TpetraTypes::VectorType<Number, MemorySpace>>
973 Teuchos::RCP<TpetraTypes::VectorType<Number, MemorySpace>>
981 const unsigned int precision = 3,
982 const bool scientific =
true,
983 const bool across =
true)
const;
1026 <<
"You are trying to access element " << arg1
1027 <<
" of a distributed vector, but this element is not stored "
1028 <<
"on the current processor. Note: There are " << arg2
1029 <<
" elements stored "
1030 <<
"on the current processor from within the range [" << arg3 <<
','
1031 << arg4 <<
"] but Trilinos vectors need not store contiguous "
1032 <<
"ranges on each processor, and not every element in "
1033 <<
"this range may in fact be stored locally."
1035 <<
"A common source for this kind of problem is that you "
1036 <<
"are passing a 'fully distributed' vector into a function "
1037 <<
"that needs read access to vector elements that correspond "
1038 <<
"to degrees of freedom on ghost cells (or at least to "
1039 <<
"'locally active' degrees of freedom that are not also "
1040 <<
"'locally owned'). You need to pass a vector that has these "
1041 <<
"elements as ghost entries.");
1049 "To compress a vector, a locally_relevant_dofs "
1050 "index set, and a locally_owned_dofs index set "
1051 "must be provided. These index sets must be "
1052 "provided either when the vector is initialized "
1053 "or when compress is called. See the documentation "
1054 "of compress() for more information.");
1063 <<
"An error with error number " << arg1
1064 <<
" occurred while calling a Trilinos function");
1103 Teuchos::RCP<TpetraTypes::VectorType<Number, MemorySpace>>
vector;
1110 Teuchos::RCP<TpetraTypes::VectorType<Number, MemorySpace>>
1129 std::remove_const_t<
decltype(Kokkos::ALL)>,
1175 Teuchos::RCP<const TpetraWrappers::CommunicationPattern<MemorySpace>>
1179 friend class internal::VectorReference<Number,
MemorySpace>;
1185 template <
typename Number,
typename MemorySpace>
1194 template <
typename Number,
typename MemorySpace>
1203 template <
typename Number,
typename MemorySpace>
1212 template <
typename Number,
typename MemorySpace>
1232 template <
typename Number,
typename MemorySpace>
1235 const bool allow_different_maps)
1243 template <
typename Number,
typename MemorySpace>
1246 const std::vector<Number> &values)
1252 add(indices.size(), indices.data(), values.data());
1257 template <
typename Number,
typename MemorySpace>
1261 const Number *values)
1272 "Cannot mix add and insert operations on a Tpetra vector "
1273 "with non-locally owned entries without calling compress() in between."));
1283# ifndef HAVE_TEUCHOS_THREAD_SAFE
1285 std::scoped_lock lock(
mutex);
1288 vector_map =
vector->getMap().ptr();
1293 auto vector_2d_view =
1294 vector->template getLocalView<Kokkos::HostSpace>(
1295 Tpetra::Access::ReadWriteStruct{});
1297 vector_1d_view = Kokkos::subview(vector_2d_view, Kokkos::ALL(), 0);
1302 auto nonlocal_vector_2d_view =
1304 Tpetra::Access::ReadWriteStruct{});
1307 Kokkos::subview(nonlocal_vector_2d_view, Kokkos::ALL(), 0);
1311 for (
size_type i = 0; i < n_elements; ++i)
1319 vector_map->getLocalElement(row);
1320 local_row != Teuchos::OrdinalTraits<int>::invalid())
1322 (*vector_1d_view)(local_row) += values[i];
1332# ifndef HAVE_TEUCHOS_THREAD_SAFE
1334 std::scoped_lock lock(
mutex);
1347# ifndef HAVE_TEUCHOS_THREAD_SAFE
1349 std::scoped_lock lock(
mutex);
1359# if DEAL_II_TRILINOS_VERSION_GTE(14, 0, 0)
1360 Assert(nonlocal_row != Teuchos::OrdinalTraits<int>::invalid(),
1363 vector->getMap()->getLocalNumElements(),
1364 vector->getMap()->getMinLocalIndex(),
1365 vector->getMap()->getMaxLocalIndex()));
1367 Assert(nonlocal_row != Teuchos::OrdinalTraits<int>::invalid(),
1370 vector->getMap()->getNodeNumElements(),
1371 vector->getMap()->getMinLocalIndex(),
1372 vector->getMap()->getMaxLocalIndex()));
1376 (*nonlocal_vector_1d_view)(nonlocal_row) += values[i];
1384 template <
typename Number,
typename MemorySpace>
1387 const std::vector<Number> &values)
1390 set(indices.size(), indices.data(), values.data());
1395 template <
typename Number,
typename MemorySpace>
1399 const Number *values)
1410 "Cannot mix add and insert operations on a Tpetra vector "
1411 "with non-locally owned entries without calling compress() in between."));
1421# ifndef HAVE_TEUCHOS_THREAD_SAFE
1423 std::scoped_lock lock(
mutex);
1426 vector_map =
vector->getMap().ptr();
1431 auto vector_2d_view =
1432 vector->template getLocalView<Kokkos::HostSpace>(
1433 Tpetra::Access::ReadWriteStruct{});
1435 vector_1d_view = Kokkos::subview(vector_2d_view, Kokkos::ALL(), 0);
1440 auto nonlocal_vector_2d_view =
1442 Tpetra::Access::ReadWriteStruct{});
1445 Kokkos::subview(nonlocal_vector_2d_view, Kokkos::ALL(), 0);
1449 for (
size_type i = 0; i < n_elements; ++i)
1457 vector_map->getLocalElement(row);
1458 local_row != Teuchos::OrdinalTraits<int>::invalid())
1460 (*vector_1d_view)(local_row) = values[i];
1470# ifndef HAVE_TEUCHOS_THREAD_SAFE
1472 std::scoped_lock lock(
mutex);
1485# ifndef HAVE_TEUCHOS_THREAD_SAFE
1487 std::scoped_lock lock(
mutex);
1497# if DEAL_II_TRILINOS_VERSION_GTE(14, 0, 0)
1498 Assert(nonlocal_row != Teuchos::OrdinalTraits<int>::invalid(),
1501 vector->getMap()->getLocalNumElements(),
1502 vector->getMap()->getMinLocalIndex(),
1503 vector->getMap()->getMaxLocalIndex()));
1505 Assert(nonlocal_row != Teuchos::OrdinalTraits<int>::invalid(),
1508 vector->getMap()->getNodeNumElements(),
1509 vector->getMap()->getMinLocalIndex(),
1510 vector->getMap()->getMaxLocalIndex()));
1514 (*nonlocal_vector_1d_view)(nonlocal_row) = values[i];
1522 template <
typename Number,
typename MemorySpace>
1523 inline internal::VectorReference<Number, MemorySpace>
1526 return internal::VectorReference(*
this, index);
1529 template <
typename Number,
typename MemorySpace>
1530 inline internal::VectorReference<Number, MemorySpace>
1536 template <
typename Number,
typename MemorySpace>
1548 template <
typename Number,
typename MemorySpace>
1549 inline VectorReference<Number, MemorySpace>::VectorReference(
1551 const size_type index)
1558 template <
typename Number,
typename MemorySpace>
1559 inline const VectorReference<Number, MemorySpace> &
1560 VectorReference<Number, MemorySpace>::operator=(
1561 const VectorReference<Number, MemorySpace> &r)
const
1567 *
this =
static_cast<Number
>(r);
1574 template <
typename Number,
typename MemorySpace>
1575 inline VectorReference<Number, MemorySpace> &
1576 VectorReference<Number, MemorySpace>::operator=(
1577 const VectorReference<Number, MemorySpace> &r)
1580 *
this =
static_cast<Number
>(r);
1587 template <
typename Number,
typename MemorySpace>
1588 inline const VectorReference<Number, MemorySpace> &
1589 VectorReference<Number, MemorySpace>::operator=(
const Number &
value)
const
1593 vector.set(1, &index, &
value);
1600 template <
typename Number,
typename MemorySpace>
1601 inline const VectorReference<Number, MemorySpace> &
1602 VectorReference<Number, MemorySpace>::operator+=(
1603 const Number &
value)
const
1607 vector.add(1, &index, &
value);
1614 template <
typename Number,
typename MemorySpace>
1615 inline const VectorReference<Number, MemorySpace> &
1616 VectorReference<Number, MemorySpace>::operator-=(
1617 const Number &
value)
const
1622 vector.add(1, &index, &new_value);
1629 template <
typename Number,
typename MemorySpace>
1630 inline const VectorReference<Number, MemorySpace> &
1631 VectorReference<Number, MemorySpace>::operator*=(
1632 const Number &
value)
const
1637 vector.set(1, &index, &new_value);
1644 template <
typename Number,
typename MemorySpace>
1645 inline const VectorReference<Number, MemorySpace> &
1646 VectorReference<Number, MemorySpace>::operator/=(
1647 const Number &
value)
const
1652 vector.set(1, &index, &new_value);
1679 template <
typename Number,
typename MemorySpace>
1684 template <
typename Matrix>
1687 const Matrix &matrix,
1689 bool omit_zeroing_entries)
1691 v.
reinit(matrix.locally_owned_range_indices(),
1692 matrix.get_mpi_communicator(),
1693 omit_zeroing_entries);
1696 template <
typename Matrix>
1699 const Matrix &matrix,
1701 bool omit_zeroing_entries)
1703 v.
reinit(matrix.locally_owned_domain_indices(),
1704 matrix.get_mpi_communicator(),
1705 omit_zeroing_entries);
1715template <
typename Number,
typename MemorySpace>
1717 LinearAlgebra::TpetraWrappers::Vector<Number, MemorySpace>> : std::false_type
* x_component_mask set(0, true)
* * Point< dim > operator()(const Point< dim > &p) const *
types::global_dof_index size_type
const TpetraTypes::MapType< MemorySpace > & trilinos_partitioner() const
void reinit(const Vector< Number, MemorySpace > &V, const bool omit_zeroing_entries=false)
void equ(const Number a, const Vector< Number, MemorySpace > &V)
Teuchos::RCP< const TpetraWrappers::CommunicationPattern< MemorySpace > > tpetra_comm_pattern
void reinit(const IndexSet &locally_owned_entries, const IndexSet &locally_relevant_or_ghost_entries, const MPI_Comm communicator=MPI_COMM_WORLD, const bool vector_writable=false)
void add(const Number a, const Vector< Number, MemorySpace > &V, const Number b, const Vector< Number, MemorySpace > &W)
bool is_non_negative() const
std::optional< array_view_type > nonlocal_vector_1d_view
Number add_and_dot(const Number a, const Vector< Number, MemorySpace > &V, const Vector< Number, MemorySpace > &W)
TpetraTypes::VectorType< Number, MemorySpace > & trilinos_vector()
void reinit(const IndexSet ¶llel_partitioner, const MPI_Comm communicator=MPI_COMM_WORLD, const bool omit_zeroing_entries=false)
MPI_Comm get_mpi_communicator() const
Teuchos::RCP< TpetraTypes::VectorType< NumberType, MemorySpace > > vector
std::optional< array_view_type > vector_1d_view
void sadd(const Number s, const Vector< Number, MemorySpace > &V)
typename dual_view_type::t_host host_view_type
Number operator[](const size_type index) const
bool operator==(const Vector< Number, MemorySpace > &v) const
void scale(const Vector< Number, MemorySpace > &scaling_factors)
void set(const std::vector< size_type > &indices, const std::vector< Number > &values)
Vector(const IndexSet ¶llel_partitioner, const MPI_Comm communicator=MPI_COMM_WORLD)
void set(const size_type n_elements, const size_type *indices, const Number *values)
MPI_Comm mpi_comm() const
Vector(const Teuchos::RCP< TpetraTypes::VectorType< Number, MemorySpace > > V)
internal::VectorReference< Number, MemorySpace > reference
size_type locally_owned_size() const
reference operator()(const size_type index)
virtual void swap(Vector &v) noexcept
void update_ghost_values() const
virtual void extract_subvector_to(const ArrayView< const types::global_dof_index > &indices, const ArrayView< Number > &elements) const override
void compress(const VectorOperation::values operation)
std::vector< NumberType > nonlocal_cached_values
bool is_compressed() const
const internal::VectorReference< Number, MemorySpace > const_reference
VectorOperation::values last_action
bool operator!=(const Vector< Number, MemorySpace > &v) const
Number operator()(const size_type index) const
Vector & operator/=(const Number factor)
std::pair< size_type, size_type > local_range() const
::IndexSet source_stored_elements
void sadd(const Number s, const Number a, const Vector< Number, MemorySpace > &V)
reference operator[](const size_type index)
void add(const Number a, const Vector< Number, MemorySpace > &V)
Vector & operator*=(const Number factor)
typename TpetraTypes::VectorType< Number, MemorySpace >::dual_view_type dual_view_type
void add(const Vector< Number, MemorySpace > &V, const bool allow_different_maps=false)
void add(const size_type n_elements, const size_type *indices, const Number *values)
void import_elements(const ReadWriteVector< Number > &V, VectorOperation::values operation, const Teuchos::RCP< const Utilities::MPI::CommunicationPatternBase > &communication_pattern)
real_type l2_norm() const
void add(const std::vector< size_type > &indices, const std::vector< Number > &values)
typename numbers::NumberTraits< Number >::real_type real_type
Vector & operator-=(const Vector< Number, MemorySpace > &V)
Vector & operator=(const ::Vector< OtherNumber > &V)
::IndexSet locally_owned_elements() const
Vector & operator=(const Vector &V)
Vector & operator=(const Number s)
Vector & operator+=(const Vector< Number, MemorySpace > &V)
const TpetraTypes::VectorType< Number, MemorySpace > & trilinos_vector() const
real_type linfty_norm() const
real_type norm_sqr() const
virtual size_type size() const override
void import_elements(const ReadWriteVector< Number > &V, VectorOperation::values operation)
void create_tpetra_comm_pattern(const IndexSet &source_index_set, const MPI_Comm mpi_comm)
real_type l1_norm() const
Kokkos::Subview< host_view_type, std::remove_const_t< decltype(Kokkos::ALL)>, unsigned > array_view_type
std::vector< types::global_dof_index > nonlocal_cached_indices
Teuchos::RCP< const TpetraTypes::VectorType< Number, MemorySpace > > trilinos_rcp() const
Number operator*(const Vector< Number, MemorySpace > &V) const
Number mean_value() const
std::size_t memory_consumption() const
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
bool has_ghost_elements() const
bool in_local_range(const size_type index) const
Vector(const IndexSet &locally_owned_entries, const IndexSet &ghost_entries, const MPI_Comm communicator, const bool vector_writable=false)
Teuchos::RCP< TpetraTypes::VectorType< NumberType, MemorySpace > > nonlocal_vector
Teuchos::RCP< TpetraTypes::VectorType< Number, MemorySpace > > trilinos_rcp()
types::global_dof_index size_type
static void reinit_range_vector(const Matrix &matrix, LinearAlgebra::TpetraWrappers::Vector< Number, MemorySpace > &v, bool omit_zeroing_entries)
static void reinit_domain_vector(const Matrix &matrix, LinearAlgebra::TpetraWrappers::Vector< Number, MemorySpace > &v, bool omit_zeroing_entries)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DeclException0(Exception0)
static ::ExceptionBase & ExcGhostsPresent()
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
static ::ExceptionBase & ExcVectorTypeNotCompatible()
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcAccessToNonLocalElement(size_type arg1, size_type arg2, size_type arg3, size_type arg4)
#define Assert(cond, exc)
static ::ExceptionBase & ExcMissingIndexSet()
#define AssertDimension(dim1, dim2)
#define DeclExceptionMsg(Exception, defaulttext)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcDifferentParallelPartitioning()
static ::ExceptionBase & ExcMessage(std::string arg1)
static ::ExceptionBase & ExcTrilinosError(int arg1)
const bool IsBlockVector< VectorType >::value
Tpetra::Vector< Number, LO, GO, NodeType< MemorySpace > > VectorType
Tpetra::Map< LO, GO, NodeType< MemorySpace > > MapType
void swap(Vector< Number, MemorySpace > &u, Vector< Number, MemorySpace > &v) noexcept
* * * RotationFunction< dim, Number >::RotationFunction Number(dim)
unsigned int global_dof_index