13#ifndef dealii_trilinos_vector_h
14#define dealii_trilinos_vector_h
19#ifndef DEAL_II_TRILINOS_WITH_EPETRA
25#ifdef DEAL_II_TRILINOS_WITH_EPETRA
37# include <Epetra_ConfigDefs.h>
38# include <Epetra_FEVector.h>
39# include <Epetra_LocalMap.h>
40# include <Epetra_Map.h>
41# include <Epetra_MpiComm.h>
52#ifdef DEAL_II_TRILINOS_WITH_EPETRA
58 template <
typename Number>
59 class ReadWriteVector;
108 class VectorReference
117 VectorReference(
MPI::Vector &vector,
const size_type index);
123 VectorReference(
const VectorReference &) =
default;
136 const VectorReference &
137 operator=(
const VectorReference &r)
const;
143 operator=(
const VectorReference &r);
148 const VectorReference &
154 const VectorReference &
160 const VectorReference &
166 const VectorReference &
172 const VectorReference &
186 <<
"An error with error number " << arg1
187 <<
" occurred while calling a Trilinos function");
198 const size_type index;
202 friend class ::TrilinosWrappers::MPI::Vector;
209# ifndef DEAL_II_WITH_64BIT_INDICES
214 gid(
const Epetra_BlockMap &map,
int i)
223 gid(
const Epetra_BlockMap &map,
int i)
463 const MPI_Comm communicator = MPI_COMM_WORLD);
478 const MPI_Comm communicator = MPI_COMM_WORLD);
496 const MPI_Comm communicator = MPI_COMM_WORLD);
510 template <
typename Number>
512 const ::Vector<Number> &v,
513 const MPI_Comm communicator = MPI_COMM_WORLD);
550 reinit(
const Vector &v,
const bool omit_zeroing_entries =
false);
575 const MPI_Comm communicator = MPI_COMM_WORLD,
576 const bool omit_zeroing_entries =
false);
614 const IndexSet &locally_relevant_or_ghost_entries,
615 const MPI_Comm communicator = MPI_COMM_WORLD,
616 const bool vector_writable =
false);
630 const std::shared_ptr<const Utilities::MPI::Partitioner> &partitioner,
631 const bool make_ghosted =
true,
632 const bool vector_writable =
false);
729 template <
typename Number>
752 const ::TrilinosWrappers::SparseMatrix &matrix,
816 std::pair<size_type, size_type>
1019 std::vector<TrilinosScalar> &values)
const;
1056 template <
typename ForwardIterator,
typename OutputIterator>
1059 const ForwardIterator indices_end,
1060 OutputIterator values_begin)
const;
1109 set(
const std::vector<size_type> &indices,
1110 const std::vector<TrilinosScalar> &values);
1117 set(
const std::vector<size_type> &indices,
1118 const ::Vector<TrilinosScalar> &values);
1135 add(
const std::vector<size_type> &indices,
1136 const std::vector<TrilinosScalar> &values);
1143 add(
const std::vector<size_type> &indices,
1144 const ::Vector<TrilinosScalar> &values);
1200 add(
const Vector &V,
const bool allow_different_maps =
false);
1254 const Epetra_MultiVector &
1268 const Epetra_BlockMap &
1279 print(std::ostream &out,
1280 const unsigned int precision = 3,
1281 const bool scientific =
true,
1282 const bool across =
true)
const;
1323 <<
"An error with error number " << arg1
1324 <<
" occurred while calling a Trilinos function");
1335 <<
"You are trying to access element " << arg1
1336 <<
" of a distributed vector, but this element is not stored "
1337 <<
"on the current processor. Note: There are " << arg2
1338 <<
" elements stored "
1339 <<
"on the current processor from within the range [" << arg3 <<
','
1340 << arg4 <<
"] but Trilinos vectors need not store contiguous "
1341 <<
"ranges on each processor, and not every element in "
1342 <<
"this range may in fact be stored locally."
1344 <<
"A common source for this kind of problem is that you "
1345 <<
"are passing a 'fully distributed' vector into a function "
1346 <<
"that needs read access to vector elements that correspond "
1347 <<
"to degrees of freedom on ghost cells (or at least to "
1348 <<
"'locally active' degrees of freedom that are not also "
1349 <<
"'locally owned'). You need to pass a vector that has these "
1350 <<
"elements as ghost entries.");
1424 inline VectorReference::VectorReference(
MPI::Vector &vector,
1425 const size_type index)
1431 inline const VectorReference &
1432 VectorReference::operator=(
const VectorReference &r)
const
1445 inline VectorReference &
1446 VectorReference::operator=(
const VectorReference &r)
1455 inline const VectorReference &
1460 vector.set(1, &index, &value);
1467 inline const VectorReference &
1472 vector.add(1, &index, &value);
1479 inline const VectorReference &
1485 vector.add(1, &index, &new_value);
1492 inline const VectorReference &
1499 vector.set(1, &index, &new_value);
1506 inline const VectorReference &
1513 vector.set(1, &index, &new_value);
1526 std::pair<size_type, size_type> range =
local_range();
1528 return ((index >= range.first) && (index < range.second));
1538 "The locally owned elements have not been properly initialized!"
1539 " This happens for example if this object has been initialized"
1540 " with exactly one overlapping IndexSet."));
1560 inline internal::VectorReference
1568 inline internal::VectorReference
1586 std::vector<TrilinosScalar> &values)
const
1588 for (
size_type i = 0; i < indices.size(); ++i)
1589 values[i] =
operator()(indices[i]);
1600 for (
unsigned int i = 0; i < indices.
size(); ++i)
1603 elements[i] = (*this)[indices[i]];
1609 template <
typename ForwardIterator,
typename OutputIterator>
1612 const ForwardIterator indices_end,
1613 OutputIterator values_begin)
const
1615 while (indices_begin != indices_end)
1658 Vector::set(
const std::vector<size_type> &indices,
1659 const std::vector<TrilinosScalar> &values)
1667 set(indices.size(), indices.data(),
values.data());
1673 Vector::set(
const std::vector<size_type> &indices,
1674 const ::Vector<TrilinosScalar> &values)
1682 set(indices.size(), indices.data(),
values.begin());
1689 const size_type *indices,
1698 const int ierr =
vector->GlobalAssemble(Add);
1705 for (
size_type i = 0; i < n_elements; ++i)
1710 if (local_row != -1)
1711 (*vector)[0][local_row] =
values[i];
1714 const int ierr =
vector->ReplaceGlobalValues(1, &row, &values[i]);
1729 Vector::add(
const std::vector<size_type> &indices,
1730 const std::vector<TrilinosScalar> &values)
1737 add(indices.size(), indices.data(),
values.data());
1743 Vector::add(
const std::vector<size_type> &indices,
1744 const ::Vector<TrilinosScalar> &values)
1751 add(indices.size(), indices.data(),
values.begin());
1758 const size_type *indices,
1769 const int ierr =
vector->GlobalAssemble(Insert);
1775 for (
size_type i = 0; i < n_elements; ++i)
1780 if (local_row != -1)
1781 (*vector)[0][local_row] +=
values[i];
1784 const int ierr =
vector->SumIntoGlobalValues(
1801 "Attempted to write into off-processor vector entry "
1802 "that has not be specified as being writable upon "
1804 (*nonlocal_vector)[0][my_row] +=
values[i];
1815# ifndef DEAL_II_WITH_64BIT_INDICES
1816 return vector->Map().MaxAllGID() + 1 -
vector->Map().MinAllGID();
1818 return vector->Map().MaxAllGID64() + 1 -
vector->Map().MinAllGID64();
1832 inline std::pair<Vector::size_type, Vector::size_type>
1835# ifndef DEAL_II_WITH_64BIT_INDICES
1838 vector->Map().MaxMyGID() + 1;
1841 vector->Map().MinMyGID64();
1843 vector->Map().MaxMyGID64() + 1;
1849 "This function only makes sense if the elements that this "
1850 "vector stores on the current processor form a contiguous range. "
1851 "This does not appear to be the case for the current vector."));
1867 const int ierr =
vector->Dot(*(vec.vector), &result);
1890 const int ierr =
vector->MeanValue(&mean);
1902 const int ierr =
vector->MinValue(&min_value);
1914 const int ierr =
vector->MaxValue(&max_value);
1928 const int ierr =
vector->Norm1(&d);
1942 const int ierr =
vector->Norm2(&d);
1980 const int ierr =
vector->NormInf(&d);
2016 const int ierr =
vector->Scale(a);
2036 const int ierr =
vector->Scale(factor);
2054 const int ierr =
vector->Update(1.0, *(v.vector), 1.0);
2072 const int ierr =
vector->Update(-1.0, *(v.vector), 1.0);
2105 const int ierr =
vector->Update(a, *(v.vector), 1.);
2126 const int ierr =
vector->Update(a, *(v.vector), b, *(
w.vector), 1.);
2148 Assert(this->
vector->Map().SameAs(v.vector->Map()) ==
true,
2150 const int ierr =
vector->Update(1., *(v.vector), s);
2179 Assert(this->
vector->Map().SameAs(v.vector->Map()) ==
true,
2181 const int ierr =
vector->Update(a, *(v.vector), s);
2216 const int ierr =
vector->Multiply(1.0, *(factors.vector), *
vector, 0.0);
2231 if (
vector->Map().SameAs(v.vector->Map()) ==
false)
2233 this->
sadd(0., a, v);
2238 int ierr =
vector->Update(a, *v.vector, 0.0);
2247 inline const Epetra_MultiVector &
2250 return static_cast<const Epetra_MultiVector &
>(*vector);
2255 inline Epetra_FEVector &
2263 inline const Epetra_BlockMap &
2274 const Epetra_MpiComm *mpi_comm =
2275 dynamic_cast<const Epetra_MpiComm *
>(&
vector->Map().Comm());
2276 return mpi_comm->Comm();
2281 template <
typename number>
2283 const ::Vector<number> &v,
2302 const int ierr =
vector->PutScalar(s);
2328 namespace LinearOperatorImplementation
2341 template <
typename Matrix>
2345 bool omit_zeroing_entries)
2347 v.
reinit(matrix.locally_owned_range_indices(),
2348 matrix.get_mpi_communicator(),
2349 omit_zeroing_entries);
2352 template <
typename Matrix>
2356 bool omit_zeroing_entries)
2358 v.
reinit(matrix.locally_owned_domain_indices(),
2359 matrix.get_mpi_communicator(),
2360 omit_zeroing_entries);
size_type n_elements() const
Epetra_Map make_trilinos_map(const MPI_Comm communicator=MPI_COMM_WORLD, const bool overlapping=false) const
real_type l1_norm() const
Vector & operator/=(const TrilinosScalar factor)
void compress(VectorOperation::values operation)
Vector(const IndexSet ¶llel_partitioning, const ::Vector< Number > &v, const MPI_Comm communicator=MPI_COMM_WORLD)
void sadd(const TrilinosScalar s, const Vector &V)
TrilinosScalar mean_value() const
void add(const size_type n_elements, const size_type *indices, const TrilinosScalar *values)
VectorTraits::size_type size_type
void add(const std::vector< size_type > &indices, const std::vector< TrilinosScalar > &values)
std::unique_ptr< Epetra_MultiVector > nonlocal_vector
void add(const TrilinosScalar s)
void import_elements(const LinearAlgebra::ReadWriteVector< double > &rwv, const VectorOperation::values operation)
void update_ghost_values() const
MPI_Comm get_mpi_communicator() const
void swap(Vector &v) noexcept
void reinit(const Vector &v, const bool omit_zeroing_entries=false)
const Epetra_BlockMap & trilinos_partitioner() const
reference operator()(const size_type index)
void import_nonlocal_data_for_fe(const ::TrilinosWrappers::SparseMatrix &matrix, const Vector &vector)
std::unique_ptr< Epetra_FEVector > vector
size_type size() const override
bool in_local_range(const size_type index) const
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
friend class internal::VectorReference
real_type lp_norm(const TrilinosScalar p) const
IndexSet locally_owned_elements() const
Vector & operator-=(const Vector &V)
real_type l2_norm() const
Vector & operator+=(const Vector &V)
const Epetra_MultiVector & trilinos_vector() const
const internal::VectorReference const_reference
bool has_ghost_elements() const
std::pair< size_type, size_type > local_range() const
real_type norm_sqr() const
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< TrilinosScalar > &values) const
bool operator!=(const Vector &v) const
~Vector() override=default
virtual void extract_subvector_to(const ArrayView< const size_type > &indices, const ArrayView< TrilinosScalar > &elements) const override
Epetra_FEVector & trilinos_vector()
const_iterator begin() const
real_type linfty_norm() const
internal::VectorReference reference
TrilinosScalar min() const
void set(const std::vector< size_type > &indices, const ::Vector< TrilinosScalar > &values)
void set(const size_type n_elements, const size_type *indices, const TrilinosScalar *values)
void scale(const Vector &scaling_factors)
void equ(const TrilinosScalar a, const Vector &V)
bool operator==(const Vector &v) const
void sadd(const TrilinosScalar s, const TrilinosScalar a, const Vector &V)
Epetra_CombineMode last_action
reference operator[](const size_type index)
const value_type * const_iterator
TrilinosScalar value_type
void swap(Vector &u, Vector &v) noexcept
size_type locally_owned_size() const
TrilinosScalar operator[](const size_type index) const
TrilinosScalar add_and_dot(const TrilinosScalar a, const Vector &V, const Vector &W)
Vector & operator=(const TrilinosScalar s)
Vector & operator*=(const TrilinosScalar factor)
bool is_non_negative() const
TrilinosScalar operator*(const Vector &vec) const
void add(const std::vector< size_type > &indices, const ::Vector< TrilinosScalar > &values)
void extract_subvector_to(ForwardIterator indices_begin, const ForwardIterator indices_end, OutputIterator values_begin) const
std::size_t memory_consumption() const
void add(const TrilinosScalar a, const Vector &V, const TrilinosScalar b, const Vector &W)
void add(const TrilinosScalar a, const Vector &V)
void set(const std::vector< size_type > &indices, const std::vector< TrilinosScalar > &values)
TrilinosScalar max() const
Vector & operator=(const ::Vector< Number > &v)
const_iterator end() const
::types::global_dof_index size_type
typename numbers::NumberTraits< Number >::real_type real_type
bool has_ghost_elements() const
const value_type * const_iterator
virtual size_type size() const override
size_type locally_owned_size() const
static void reinit_domain_vector(const Matrix &matrix, TrilinosWrappers::MPI::Vector &v, bool omit_zeroing_entries)
static void reinit_range_vector(const Matrix &matrix, TrilinosWrappers::MPI::Vector &v, bool omit_zeroing_entries)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
#define DeclException0(Exception0)
static ::ExceptionBase & ExcGhostsPresent()
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
static ::ExceptionBase & ExcDifferentParallelPartitioning()
static ::ExceptionBase & ExcAccessToNonLocalElement(size_type arg1, size_type arg2, size_type arg3, size_type arg4)
#define Assert(cond, exc)
#define AssertIsFinite(number)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcTrilinosError(int arg1)
#define DeclException1(Exception1, type1, outsequence)
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim > > > &Du)
Tensor< 2, dim, Number > w(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
int gid(const Epetra_BlockMap &map, int i)
T sum(const T &t, const MPI_Comm mpi_communicator)
::VectorizedArray< Number, width > pow(const ::VectorizedArray< Number, width > &, const Number p)
unsigned int global_dof_index