16 #ifndef dealii_trilinos_vector_h 17 #define dealii_trilinos_vector_h 22 #ifdef DEAL_II_WITH_TRILINOS 33 # include <Epetra_ConfigDefs.h> 38 # ifdef DEAL_II_WITH_MPI // only if MPI is installed 39 # include <Epetra_MpiComm.h> 42 # include <Epetra_SerialComm.h> 44 # include <Epetra_FEVector.h> 45 # include <Epetra_LocalMap.h> 46 # include <Epetra_Map.h> 55 template <
typename Number>
56 class ReadWriteVector;
100 class VectorReference
107 VectorReference(
MPI::Vector &vector,
const size_type index);
121 const VectorReference &
122 operator=(
const VectorReference &r)
const;
128 operator=(
const VectorReference &r);
133 const VectorReference &
139 const VectorReference &
145 const VectorReference &
151 const VectorReference &
157 const VectorReference &
171 <<
"An error with error number " << arg1
172 <<
" occurred while calling a Trilinos function");
183 const size_type index;
194 # ifndef DEAL_II_WITH_64BIT_INDICES 199 gid(
const Epetra_BlockMap &map,
int i)
208 gid(
const Epetra_BlockMap &map,
int i)
451 const MPI_Comm &communicator = MPI_COMM_WORLD);
466 const MPI_Comm &communicator = MPI_COMM_WORLD);
484 const MPI_Comm &communicator = MPI_COMM_WORLD);
498 template <
typename Number>
500 const ::Vector<Number> &v,
501 const MPI_Comm & communicator = MPI_COMM_WORLD);
512 ~
Vector()
override =
default;
546 const bool omit_zeroing_entries =
false,
547 const bool allow_different_maps =
false);
573 const MPI_Comm &communicator = MPI_COMM_WORLD,
574 const bool omit_zeroing_entries =
false);
604 const MPI_Comm &communicator = MPI_COMM_WORLD,
605 const bool vector_writable =
false);
653 operator=(
const Vector &v);
660 operator=(
Vector &&v) noexcept;
669 template <
typename Number>
671 operator=(const ::Vector<Number> &v);
691 import_nonlocal_data_for_fe(
763 std::pair<size_type, size_type>
774 in_local_range(
const size_type index)
const;
790 locally_owned_elements()
const;
800 has_ghost_elements()
const;
809 update_ghost_values()
const;
962 extract_subvector_to(
const std::vector<size_type> &indices,
963 std::vector<TrilinosScalar> & values)
const;
992 template <
typename ForwardIterator,
typename OutputIterator>
994 extract_subvector_to(ForwardIterator indices_begin,
995 const ForwardIterator indices_end,
996 OutputIterator values_begin)
const;
1047 set(
const std::vector<size_type> & indices,
1048 const std::vector<TrilinosScalar> &values);
1055 set(
const std::vector<size_type> & indices,
1056 const ::Vector<TrilinosScalar> &values);
1073 add(
const std::vector<size_type> & indices,
1074 const std::vector<TrilinosScalar> &values);
1081 add(
const std::vector<size_type> & indices,
1082 const ::Vector<TrilinosScalar> &values);
1138 add(
const Vector &
V,
const bool allow_different_maps =
false);
1192 const Epetra_MultiVector &
1193 trilinos_vector()
const;
1206 const Epetra_BlockMap &
1207 trilinos_partitioner()
const;
1217 print(std::ostream & out,
1218 const unsigned int precision = 3,
1219 const bool scientific =
true,
1220 const bool across =
true)
const;
1249 get_mpi_communicator()
const;
1262 <<
"An error with error number " << arg1
1263 <<
" occurred while calling a Trilinos function");
1269 ExcAccessToNonLocalElement,
1274 <<
"You tried to access element " << arg1
1275 <<
" of a distributed vector, but this element is not stored " 1276 <<
"on the current processor. Note: There are " << arg2
1277 <<
" elements stored " 1278 <<
"on the current processor from within the range " << arg3
1279 <<
" through " << arg4
1280 <<
" but Trilinos vectors need not store contiguous " 1281 <<
"ranges on each processor, and not every element in " 1282 <<
"this range may in fact be stored locally.");
1330 friend class internal::VectorReference;
1357 inline VectorReference::VectorReference(
MPI::Vector & vector,
1364 inline const VectorReference &
1365 VectorReference::operator=(
const VectorReference &r)
const 1378 inline VectorReference &
1379 VectorReference::operator=(
const VectorReference &r)
1388 inline const VectorReference &
1391 vector.
set(1, &index, &value);
1397 inline const VectorReference &
1400 vector.
add(1, &index, &value);
1406 inline const VectorReference &
1410 vector.
add(1, &index, &new_value);
1416 inline const VectorReference &
1420 vector.
set(1, &index, &new_value);
1426 inline const VectorReference &
1430 vector.
set(1, &index, &new_value);
1440 std::pair<size_type, size_type> range = local_range();
1442 return ((index >= range.first) && (index < range.second));
1450 Assert(owned_elements.size() == size(),
1452 "The locally owned elements have not been properly initialized!" 1453 " This happens for example if this object has been initialized" 1454 " with exactly one overlapping IndexSet."));
1455 return owned_elements;
1474 inline internal::VectorReference
1477 return internal::VectorReference(*
this, index);
1484 return operator()(index);
1491 return operator()(index);
1498 std::vector<TrilinosScalar> & values)
const 1500 for (
size_type i = 0; i < indices.size(); ++i)
1501 values[i] =
operator()(indices[i]);
1506 template <
typename ForwardIterator,
typename OutputIterator>
1509 const ForwardIterator indices_end,
1510 OutputIterator values_begin)
const 1512 while (indices_begin != indices_end)
1514 *values_begin = operator()(*indices_begin);
1525 return (*vector)[0];
1533 return (*vector)[0] + local_size();
1541 return (*vector)[0];
1549 return (*vector)[0] + local_size();
1555 Vector::set(
const std::vector<size_type> & indices,
1556 const std::vector<TrilinosScalar> &values)
1562 Assert(indices.size() == values.size(),
1565 set(indices.size(), indices.data(), values.data());
1571 Vector::set(
const std::vector<size_type> & indices,
1572 const ::Vector<TrilinosScalar> &values)
1578 Assert(indices.size() == values.size(),
1581 set(indices.size(), indices.data(), values.begin());
1595 if (last_action == Add)
1597 const int ierr = vector->GlobalAssemble(Add);
1601 if (last_action != Insert)
1602 last_action = Insert;
1604 for (
size_type i = 0; i < n_elements; ++i)
1608 vector->Map().LID(row);
1609 if (local_row != -1)
1610 (*vector)[0][local_row] = values[i];
1613 const int ierr = vector->ReplaceGlobalValues(1, &row, &values[i]);
1628 Vector::add(
const std::vector<size_type> & indices,
1629 const std::vector<TrilinosScalar> &values)
1634 Assert(indices.size() == values.size(),
1637 add(indices.size(), indices.data(), values.data());
1643 Vector::add(
const std::vector<size_type> & indices,
1644 const ::Vector<TrilinosScalar> &values)
1649 Assert(indices.size() == values.size(),
1652 add(indices.size(), indices.data(), values.begin());
1666 if (last_action != Add)
1668 if (last_action == Insert)
1670 const int ierr = vector->GlobalAssemble(Insert);
1676 for (
size_type i = 0; i < n_elements; ++i)
1680 static_cast<TrilinosWrappers::types::int_type>(row));
1681 if (local_row != -1)
1682 (*vector)[0][local_row] += values[i];
1683 else if (nonlocal_vector.get() ==
nullptr)
1685 const int ierr = vector->SumIntoGlobalValues(
1687 reinterpret_cast<const TrilinosWrappers::types::int_type *>(
1698 nonlocal_vector->Map().LID(
1699 static_cast<TrilinosWrappers::types::int_type>(row));
1702 "Attempted to write into off-processor vector entry " 1703 "that has not be specified as being writable upon " 1705 (*nonlocal_vector)[0][my_row] += values[i];
1716 # ifndef DEAL_II_WITH_64BIT_INDICES 1717 return vector->Map().MaxAllGID() + 1 - vector->Map().MinAllGID();
1719 return vector->Map().MaxAllGID64() + 1 - vector->Map().MinAllGID64();
1726 Vector::local_size()
const 1728 return vector->Map().NumMyElements();
1733 inline std::pair<Vector::size_type, Vector::size_type>
1734 Vector::local_range()
const 1736 # ifndef DEAL_II_WITH_64BIT_INDICES 1739 vector->Map().MaxMyGID() + 1;
1742 vector->Map().MinMyGID64();
1744 vector->Map().MaxMyGID64() + 1;
1748 end - begin == vector->Map().NumMyElements(),
1750 "This function only makes sense if the elements that this " 1751 "vector stores on the current processor form a contiguous range. " 1752 "This does not appear to be the case for the current vector."));
1754 return std::make_pair(begin, end);
1762 ExcDifferentParallelPartitioning());
1767 const int ierr = vector->Dot(*(vec.
vector), &result);
1790 const int ierr = vector->MeanValue(&mean);
1802 const int ierr = vector->MinValue(&min_value);
1814 const int ierr = vector->MaxValue(&max_value);
1828 const int ierr = vector->Norm1(&d);
1842 const int ierr = vector->Norm2(&d);
1862 sum += std::pow(
std::fabs((*vector)[0][i]), p);
1864 norm = std::pow(sum, static_cast<TrilinosScalar>(1. / p));
1880 const int ierr = vector->NormInf(&d);
1909 const int ierr = vector->Scale(a);
1926 const int ierr = vector->Scale(factor);
1939 ExcDifferentParallelPartitioning());
1941 const int ierr = vector->Update(1.0, *(v.
vector), 1.0);
1954 ExcDifferentParallelPartitioning());
1956 const int ierr = vector->Update(-1.0, *(v.
vector), 1.0);
1974 (*vector)[0][i] += s;
1990 const int ierr = vector->Update(a, *(v.
vector), 1.);
2013 const int ierr = vector->Update(a, *(v.
vector), b, *(w.
vector), 1.);
2034 Assert(this->vector->Map().SameAs(v.
vector->Map()) ==
true,
2035 ExcDifferentParallelPartitioning());
2036 const int ierr = vector->Update(1., *(v.
vector), s);
2064 Assert(this->vector->Map().SameAs(v.
vector->Map()) ==
true,
2065 ExcDifferentParallelPartitioning());
2066 const int ierr = vector->Update(a, *(v.
vector), s);
2074 this->add(tmp,
true);
2089 const int ierr = vector->Multiply(1.0, *(factors.
vector), *vector, 0.0);
2104 if (vector->Map().SameAs(v.
vector->Map()) ==
false)
2106 this->
sadd(0., a, v);
2111 int ierr = vector->Update(a, *v.
vector, 0.0);
2120 inline const Epetra_MultiVector &
2121 Vector::trilinos_vector()
const 2123 return static_cast<const Epetra_MultiVector &
>(*vector);
2128 inline Epetra_FEVector &
2129 Vector::trilinos_vector()
2136 inline const Epetra_BlockMap &
2137 Vector::trilinos_partitioner()
const 2139 return vector->Map();
2144 inline const MPI_Comm &
2145 Vector::get_mpi_communicator()
const 2147 static MPI_Comm comm;
2149 # ifdef DEAL_II_WITH_MPI 2151 const Epetra_MpiComm *mpi_comm =
2152 dynamic_cast<const Epetra_MpiComm *
>(&vector->Map().Comm());
2153 comm = mpi_comm->Comm();
2157 comm = MPI_COMM_SELF;
2164 template <
typename number>
2166 const ::Vector<number> &v,
2167 const MPI_Comm & communicator)
2171 owned_elements = parallel_partitioner;
2181 int ierr = vector->PutScalar(s);
2184 if (nonlocal_vector.get() !=
nullptr)
2186 ierr = nonlocal_vector->PutScalar(0.);
2203 namespace LinearOperatorImplementation
2216 template <
typename Matrix>
2220 bool omit_zeroing_entries)
2222 v.
reinit(matrix.locally_owned_range_indices(),
2223 matrix.get_mpi_communicator(),
2224 omit_zeroing_entries);
2227 template <
typename Matrix>
2231 bool omit_zeroing_entries)
2233 v.
reinit(matrix.locally_owned_domain_indices(),
2234 matrix.get_mpi_communicator(),
2235 omit_zeroing_entries);
2256 #endif // DEAL_II_WITH_TRILINOS 2260 #endif // dealii_trilinos_vector_h
std::unique_ptr< Epetra_MultiVector > nonlocal_vector
static ::ExceptionBase & ExcTrilinosError(int arg1)
void update_ghost_values() const
int gid(const Epetra_BlockMap &map, int i)
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
Number operator[](const size_type global_index) const
virtual VectorSpaceVector< Number >::real_type linfty_norm() const override
::types::global_dof_index size_type
Contents is actually a matrix.
types::global_dof_index size_type
static void reinit_range_vector(const Matrix &matrix, TrilinosWrappers::MPI::Vector &v, bool omit_zeroing_entries)
bool operator!=(const AlignedVector< T > &lhs, const AlignedVector< T > &rhs)
std::vector< value_type > l2_norm(const typename ::Triangulation< dim, spacedim >::cell_iterator &parent, const value_type parent_value)
void reinit(const Vector &v, const bool omit_zeroing_entries=false, const bool allow_different_maps=false)
virtual void add(const Number a) override
void add(const std::vector< size_type > &indices, const std::vector< TrilinosScalar > &values)
__global__ void add_and_dot(Number *res, Number *v1, const Number *v2, const Number *v3, const Number a, const size_type N)
const internal::VectorReference const_reference
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim >>> &Du)
Vector< Number > & operator=(const Vector< Number > &in_vector)
virtual Vector< Number > & operator*=(const Number factor) override
#define AssertThrow(cond, exc)
virtual Number operator*(const VectorSpaceVector< Number > &V) const override
virtual Vector< Number > & operator+=(const VectorSpaceVector< Number > &V) override
bool operator==(const AlignedVector< T > &lhs, const AlignedVector< T > &rhs)
virtual void equ(const Number a, const VectorSpaceVector< Number > &V) override
Epetra_Map make_trilinos_map(const MPI_Comm &communicator=MPI_COMM_WORLD, const bool overlapping=false) const
virtual ::IndexSet locally_owned_elements() const override
static void reinit_domain_vector(const Matrix &matrix, TrilinosWrappers::MPI::Vector &v, bool omit_zeroing_entries)
virtual Vector< Number > & operator-=(const VectorSpaceVector< Number > &V) override
virtual void sadd(const Number s, const Number a, const VectorSpaceVector< Number > &V) override
static ::ExceptionBase & ExcMessage(std::string arg1)
std::string compress(const std::string &input)
bool in_local_range(const size_type global_index) const
void set(const std::vector< size_type > &indices, const std::vector< TrilinosScalar > &values)
#define DeclException1(Exception1, type1, outsequence)
T sum(const T &t, const MPI_Comm &mpi_communicator)
#define Assert(cond, exc)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
std::unique_ptr< Epetra_FEVector > vector
real_type lp_norm(const real_type p) const
Number operator()(const size_type global_index) const
void swap(Vector &u, Vector &v)
Number linfty_norm(const Tensor< 2, dim, Number > &t)
#define DeclException0(Exception0)
#define DEAL_II_NAMESPACE_CLOSE
virtual Vector< Number > & operator/=(const Number factor) override
virtual void scale(const VectorSpaceVector< Number > &scaling_factors) override
bool is_non_negative(const T &t)
VectorType::value_type * end(VectorType &V)
virtual size_type size() const override
Expression fabs(const Expression &x)
bool has_ghost_elements() const
__global__ void equ(Number *val, const Number a, const Number *V_val, const size_type N)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
SparseMatrix< double > SparseMatrix
__global__ void sadd(const Number s, Number *val, const Number a, const Number *V_val, const size_type N)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
static ::ExceptionBase & ExcGhostsPresent()
Tensor< 2, dim, Number > w(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
unsigned int global_dof_index
__global__ void set(Number *val, const Number s, const size_type N)
virtual VectorSpaceVector< Number >::real_type l1_norm() const override
size_type local_size() const
virtual VectorSpaceVector< Number >::real_type l2_norm() const override
internal::VectorReference reference
#define DEAL_II_NAMESPACE_OPEN
VectorType::value_type * begin(VectorType &V)
T min(const T &t, const MPI_Comm &mpi_communicator)
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
Number l1_norm(const Tensor< 2, dim, Number > &t)
virtual value_type mean_value() const override
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< Number2 > &values) const
real_type norm_sqr() const
Epetra_CombineMode last_action
std::enable_if< std::is_floating_point< T >::value &&std::is_floating_point< U >::value, typename ProductType< std::complex< T >, std::complex< U > >::type >::type operator*(const std::complex< T > &left, const std::complex< U > &right)
virtual Number add_and_dot(const Number a, const VectorSpaceVector< Number > &V, const VectorSpaceVector< Number > &W) override
bool has_ghost_elements() const
#define AssertIsFinite(number)
T max(const T &t, const MPI_Comm &mpi_communicator)
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)