16 #ifndef dealii__trilinos_vector_base_h 17 #define dealii__trilinos_vector_base_h 20 #include <deal.II/base/config.h> 22 #ifdef DEAL_II_WITH_TRILINOS 24 #include <deal.II/base/utilities.h> 25 # include <deal.II/base/std_cxx11/shared_ptr.h> 26 # include <deal.II/base/subscriptor.h> 27 # include <deal.II/lac/exceptions.h> 28 # include <deal.II/lac/vector.h> 34 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
35 # define TrilinosScalar double 36 # include "Epetra_ConfigDefs.h" 37 # ifdef DEAL_II_WITH_MPI // only if MPI is installed 39 # include "Epetra_MpiComm.h" 41 # include "Epetra_SerialComm.h" 43 # include "Epetra_FEVector.h" 46 DEAL_II_NAMESPACE_OPEN
49 template <
typename number>
class Vector;
76 typedef ::types::global_dof_index
size_type;
94 VectorReference (VectorBase &vector,
95 const size_type index);
110 const VectorReference &
111 operator = (
const VectorReference &r)
const;
116 const VectorReference &
117 operator = (
const VectorReference &r);
122 const VectorReference &
123 operator = (
const TrilinosScalar &s)
const;
128 const VectorReference &
129 operator += (
const TrilinosScalar &s)
const;
134 const VectorReference &
135 operator -= (
const TrilinosScalar &s)
const;
140 const VectorReference &
141 operator *= (
const TrilinosScalar &s)
const;
146 const VectorReference &
147 operator /= (
const TrilinosScalar &s)
const;
153 operator TrilinosScalar ()
const;
160 <<
"An error with error number " << arg1
161 <<
" occurred while calling a Trilinos function");
172 const size_type index;
178 friend class ::TrilinosWrappers::VectorBase;
225 typedef TrilinosScalar real_type;
226 typedef ::types::global_dof_index size_type;
227 typedef value_type *iterator;
228 typedef const value_type *const_iterator;
229 typedef internal::VectorReference reference;
230 typedef const internal::VectorReference const_reference;
267 const bool omit_zeroing_entries =
false);
285 void compress (::VectorOperation::values operation);
308 operator = (const TrilinosScalar s);
326 template <typename Number>
328 operator = (const ::
Vector<Number> &v);
347 size_type size () const;
360 size_type local_size () const;
383 std::pair<size_type, size_type> local_range () const;
392 bool in_local_range (const size_type index) const;
407 IndexSet locally_owned_elements () const;
416 bool has_ghost_elements() const;
422 TrilinosScalar operator * (const
VectorBase &vec) const;
427 real_type norm_sqr () const;
432 TrilinosScalar mean_value () const;
444 TrilinosScalar min () const;
449 TrilinosScalar max () const;
454 real_type l1_norm () const;
460 real_type l2_norm () const;
466 real_type lp_norm (const TrilinosScalar p) const;
471 real_type linfty_norm () const;
488 TrilinosScalar add_and_dot (const TrilinosScalar a,
497 bool all_zero () const;
504 bool is_non_negative () const;
523 operator () (const size_type index);
535 operator () (const size_type index) const;
543 operator [] (const size_type index);
551 operator [] (const size_type index) const;
559 void extract_subvector_to (const
std::vector<size_type> &indices,
560 std::vector<TrilinosScalar> &values) const;
566 template <typename ForwardIterator, typename OutputIterator>
567 void extract_subvector_to (ForwardIterator indices_begin,
568 const ForwardIterator indices_end,
569 OutputIterator values_begin) const;
581 TrilinosScalar el (const size_type index) const DEAL_II_DEPRECATED;
599 const_iterator begin () const;
611 const_iterator end () const;
627 void set (const
std::vector<size_type> &indices,
628 const
std::vector<TrilinosScalar> &values);
634 void set (const
std::vector<size_type> &indices,
635 const ::
Vector<TrilinosScalar> &values);
642 void set (const size_type n_elements,
643 const size_type *indices,
644 const TrilinosScalar *values);
650 void add (const
std::vector<size_type> &indices,
651 const
std::vector<TrilinosScalar> &values);
657 void add (const
std::vector<size_type> &indices,
658 const ::
Vector<TrilinosScalar> &values);
665 void add (const size_type n_elements,
666 const size_type *indices,
667 const TrilinosScalar *values);
672 VectorBase &operator *= (const TrilinosScalar factor);
677 VectorBase &operator /= (const TrilinosScalar factor);
693 void add (const TrilinosScalar s);
708 const
bool allow_different_maps = false);
713 void add (const TrilinosScalar a,
719 void add (const TrilinosScalar a,
721 const TrilinosScalar b,
728 void sadd (const TrilinosScalar s,
734 void sadd (const TrilinosScalar s,
735 const TrilinosScalar a,
743 void sadd (const TrilinosScalar s,
744 const TrilinosScalar a,
746 const TrilinosScalar b,
755 void sadd (const TrilinosScalar s,
756 const TrilinosScalar a,
758 const TrilinosScalar b,
760 const TrilinosScalar c,
768 void scale (const
VectorBase &scaling_factors);
773 void equ (const TrilinosScalar a,
781 void equ (const TrilinosScalar a,
783 const TrilinosScalar b,
810 const Epetra_MultiVector &trilinos_vector () const;
816 Epetra_FEVector &trilinos_vector ();
822 const Epetra_Map &vector_partitioner () const;
830 void print (const
char *format = 0) const DEAL_II_DEPRECATED;
839 void print (
std::ostream &out,
840 const
unsigned int precision = 3,
841 const
bool scientific = true,
842 const
bool across = true) const;
862 std::
size_t memory_consumption () const;
868 const MPI_Comm &get_mpi_communicator () const;
881 << "An error with error number " << arg1
882 << " occurred while calling a Trilinos function");
888 size_type, size_type, size_type, size_type,
889 << "You tried to access element " << arg1
890 << " of a distributed vector, but this element is not stored "
891 << "on the current processor. Note: There are "
892 << arg2 << " elements stored "
893 << "on the current processor from within the range "
894 << arg3 << " through " << arg4
895 << " but Trilinos vectors need not store contiguous "
896 << "ranges on each processor, and not every element in "
897 << "this range may in fact be stored locally.");
912 Epetra_CombineMode last_action;
938 std_cxx11::shared_ptr<Epetra_MultiVector> nonlocal_vector;
945 friend class MPI::Vector;
973 VectorReference::VectorReference (
VectorBase &vector,
974 const size_type index)
982 const VectorReference &
983 VectorReference::operator = (
const VectorReference &r)
const 989 *
this =
static_cast<TrilinosScalar
> (r);
997 const VectorReference &
998 VectorReference::operator = (
const VectorReference &r)
1001 *
this =
static_cast<TrilinosScalar
> (r);
1008 const VectorReference &
1009 VectorReference::operator = (
const TrilinosScalar &value)
const 1011 vector.
set (1, &index, &value);
1018 const VectorReference &
1019 VectorReference::operator += (
const TrilinosScalar &value)
const 1021 vector.
add (1, &index, &value);
1028 const VectorReference &
1029 VectorReference::operator -= (
const TrilinosScalar &value)
const 1031 TrilinosScalar new_value = -value;
1032 vector.
add (1, &index, &new_value);
1039 const VectorReference &
1040 VectorReference::operator *= (
const TrilinosScalar &value)
const 1042 TrilinosScalar new_value =
static_cast<TrilinosScalar
>(*this) * value;
1043 vector.
set (1, &index, &new_value);
1050 const VectorReference &
1051 VectorReference::operator /= (
const TrilinosScalar &value)
const 1053 TrilinosScalar new_value =
static_cast<TrilinosScalar
>(*this) / value;
1054 vector.
set (1, &index, &new_value);
1074 std::pair<size_type, size_type> range = local_range();
1076 return ((index >= range.first) && (index < range.second));
1088 if (vector->Map().LinearMap())
1090 const std::pair<size_type, size_type> x = local_range();
1093 else if (vector->Map().NumMyElements() > 0)
1095 const size_type n_indices = vector->Map().NumMyElements();
1096 #ifndef DEAL_II_WITH_64BIT_INDICES 1097 unsigned int *vector_indices = (
unsigned int *)vector->Map().MyGlobalElements();
1099 size_type *vector_indices = (size_type *)vector->Map().MyGlobalElements64();
1101 is.
add_indices(vector_indices, vector_indices+n_indices);
1120 internal::VectorReference
1123 return internal::VectorReference (*
this, index);
1129 internal::VectorReference
1132 return operator() (index);
1140 return operator() (index);
1147 std::vector<TrilinosScalar> &values)
const 1149 for (size_type i = 0; i < indices.size(); ++i)
1150 values[i] =
operator()(indices[i]);
1155 template <
typename ForwardIterator,
typename OutputIterator>
1158 const ForwardIterator indices_end,
1159 OutputIterator values_begin)
const 1161 while (indices_begin != indices_end)
1163 *values_begin = operator()(*indices_begin);
1172 VectorBase::iterator
1175 return (*vector)[0];
1181 VectorBase::iterator
1184 return (*vector)[0]+local_size();
1190 VectorBase::const_iterator
1193 return (*vector)[0];
1199 VectorBase::const_iterator
1202 return (*vector)[0]+local_size();
1210 const bool omit_zeroing_entries)
1212 Assert (vector.get() != 0,
1213 ExcMessage(
"Vector has not been constructed properly."));
1215 if (omit_zeroing_entries ==
false ||
1217 vector.reset (
new Epetra_FEVector(*v.
vector));
1220 nonlocal_vector.reset(
new Epetra_MultiVector(v.
nonlocal_vector->Map(), 1));
1231 const int ierr = vector->PutScalar(s);
1235 if (nonlocal_vector.get() != 0)
1236 nonlocal_vector->PutScalar(0.);
1246 const std::vector<TrilinosScalar> &values)
1250 Assert (!has_ghost_elements(), ExcGhostsPresent());
1252 Assert (indices.size() == values.size(),
1253 ExcDimensionMismatch(indices.size(),values.size()));
1255 set (indices.size(), &indices[0], &values[0]);
1263 const ::Vector<TrilinosScalar> &values)
1267 Assert (!has_ghost_elements(), ExcGhostsPresent());
1269 Assert (indices.size() == values.size(),
1270 ExcDimensionMismatch(indices.size(),values.size()));
1272 set (indices.size(), &indices[0], values.begin());
1280 const size_type *indices,
1281 const TrilinosScalar *values)
1285 Assert (!has_ghost_elements(), ExcGhostsPresent());
1287 if (last_action == Add)
1288 vector->GlobalAssemble(Add);
1290 if (last_action != Insert)
1291 last_action = Insert;
1293 for (size_type i=0; i<n_elements; ++i)
1295 const size_type row = indices[i];
1296 const TrilinosWrappers::types::int_type local_row = vector->Map().LID(static_cast<TrilinosWrappers::types::int_type>(row));
1297 if (local_row != -1)
1298 (*vector)[0][local_row] = values[i];
1301 const int ierr = vector->ReplaceGlobalValues (1,
1302 (
const TrilinosWrappers::types::int_type *)(&row),
1320 const std::vector<TrilinosScalar> &values)
1324 Assert (!has_ghost_elements(), ExcGhostsPresent());
1325 Assert (indices.size() == values.size(),
1326 ExcDimensionMismatch(indices.size(),values.size()));
1328 add (indices.size(), &indices[0], &values[0]);
1336 const ::Vector<TrilinosScalar> &values)
1340 Assert (!has_ghost_elements(), ExcGhostsPresent());
1341 Assert (indices.size() == values.size(),
1342 ExcDimensionMismatch(indices.size(),values.size()));
1344 add (indices.size(), &indices[0], values.begin());
1352 const size_type *indices,
1353 const TrilinosScalar *values)
1357 Assert (!has_ghost_elements(), ExcGhostsPresent());
1359 if (last_action != Add)
1361 if (last_action == Insert)
1362 vector->GlobalAssemble(Insert);
1366 for (size_type i=0; i<n_elements; ++i)
1368 const size_type row = indices[i];
1369 const TrilinosWrappers::types::int_type local_row = vector->Map().LID(static_cast<TrilinosWrappers::types::int_type>(row));
1370 if (local_row != -1)
1371 (*vector)[0][local_row] += values[i];
1372 else if (nonlocal_vector.get() == 0)
1374 const int ierr = vector->SumIntoGlobalValues (1,
1375 (
const TrilinosWrappers::types::int_type *)(&row),
1384 const TrilinosWrappers::types::int_type my_row = nonlocal_vector->Map().LID(static_cast<TrilinosWrappers::types::int_type>(row));
1386 ExcMessage(
"Attempted to write into off-processor vector entry " 1387 "that has not be specified as being writable upon " 1389 (*nonlocal_vector)[0][my_row] += values[i];
1398 VectorBase::size_type
1401 #ifndef DEAL_II_WITH_64BIT_INDICES 1402 return (size_type) (vector->Map().MaxAllGID() + 1 - vector->Map().MinAllGID());
1404 return (size_type) (vector->Map().MaxAllGID64() + 1 - vector->Map().MinAllGID64());
1411 VectorBase::size_type
1414 return (size_type) vector->Map().NumMyElements();
1420 std::pair<VectorBase::size_type, VectorBase::size_type>
1423 #ifndef DEAL_II_WITH_64BIT_INDICES 1424 const TrilinosWrappers::types::int_type begin = vector->Map().MinMyGID();
1425 const TrilinosWrappers::types::int_type end = vector->Map().MaxMyGID()+1;
1427 const TrilinosWrappers::types::int_type begin = vector->Map().MinMyGID64();
1428 const TrilinosWrappers::types::int_type end = vector->Map().MaxMyGID64()+1;
1431 Assert (end-begin == vector->Map().NumMyElements(),
1432 ExcMessage (
"This function only makes sense if the elements that this " 1433 "vector stores on the current processor form a contiguous range. " 1434 "This does not appear to be the case for the current vector."));
1436 return std::make_pair (begin, end);
1446 ExcDifferentParallelPartitioning());
1447 Assert (!has_ghost_elements(), ExcGhostsPresent());
1449 TrilinosScalar result;
1451 const int ierr = vector->Dot(*(vec.
vector), &result);
1460 VectorBase::real_type
1463 const TrilinosScalar d = l2_norm();
1473 Assert (!has_ghost_elements(), ExcGhostsPresent());
1475 TrilinosScalar mean;
1476 const int ierr = vector->MeanValue (&mean);
1497 TrilinosScalar min_value;
1498 const int ierr = vector->MinValue (&min_value);
1510 TrilinosScalar max_value;
1511 const int ierr = vector->MaxValue (&max_value);
1520 VectorBase::real_type
1523 Assert (!has_ghost_elements(), ExcGhostsPresent());
1526 const int ierr = vector->Norm1 (&d);
1535 VectorBase::real_type
1538 Assert (!has_ghost_elements(), ExcGhostsPresent());
1541 const int ierr = vector->Norm2 (&d);
1550 VectorBase::real_type
1553 Assert (!has_ghost_elements(), ExcGhostsPresent());
1555 TrilinosScalar norm = 0;
1556 TrilinosScalar sum=0;
1557 const size_type n_local = local_size();
1561 for (size_type i=0; i<n_local; i++)
1562 sum += std::pow(std::fabs((*vector)[0][i]), p);
1564 norm = std::pow(sum, static_cast<TrilinosScalar>(1./p));
1572 VectorBase::real_type
1581 const int ierr = vector->NormInf (&d);
1612 const int ierr = vector->Scale(a);
1626 const TrilinosScalar factor = 1./a;
1630 const int ierr = vector->Scale(factor);
1643 ExcDimensionMismatch(size(), v.
size()));
1645 ExcDifferentParallelPartitioning());
1647 const int ierr = vector->Update (1.0, *(v.
vector), 1.0);
1660 ExcDimensionMismatch(size(), v.
size()));
1662 ExcDifferentParallelPartitioning());
1664 const int ierr = vector->Update (-1.0, *(v.
vector), 1.0);
1678 Assert (!has_ghost_elements(), ExcGhostsPresent());
1681 size_type n_local = local_size();
1682 for (size_type i=0; i<n_local; i++)
1683 (*vector)[0][i] += s;
1695 Assert (!has_ghost_elements(), ExcGhostsPresent());
1697 ExcDimensionMismatch(local_size(), v.
local_size()));
1701 const int ierr = vector->Update(a, *(v.
vector), 1.);
1711 const TrilinosScalar b,
1716 Assert (!has_ghost_elements(), ExcGhostsPresent());
1718 ExcDimensionMismatch(local_size(), v.
local_size()));
1720 ExcDimensionMismatch(local_size(), w.
local_size()));
1725 const int ierr = vector->Update(a, *(v.
vector), b, *(w.
vector), 1.);
1739 Assert (!has_ghost_elements(), ExcGhostsPresent());
1741 ExcDimensionMismatch (size(), v.
size()));
1749 Assert (this->vector->Map().SameAs(v.
vector->Map())==
true,
1750 ExcDifferentParallelPartitioning());
1751 const int ierr = vector->Update(1., *(v.
vector), s);
1766 const TrilinosScalar a,
1771 Assert (!has_ghost_elements(), ExcGhostsPresent());
1773 ExcDimensionMismatch (size(), v.
size()));
1781 Assert (this->vector->Map().SameAs(v.
vector->Map())==
true,
1782 ExcDifferentParallelPartitioning());
1783 const int ierr = vector->Update(a, *(v.
vector), s);
1791 this->add(tmp,
true);
1800 const TrilinosScalar a,
1802 const TrilinosScalar b,
1807 Assert (!has_ghost_elements(), ExcGhostsPresent());
1809 ExcDimensionMismatch (size(), v.
size()));
1811 ExcDimensionMismatch (size(), w.
size()));
1821 Assert (this->vector->Map().SameAs(v.
vector->Map())==
true,
1822 ExcDifferentParallelPartitioning());
1823 Assert (this->vector->Map().SameAs(w.
vector->Map())==
true,
1824 ExcDifferentParallelPartitioning());
1825 const int ierr = vector->Update(a, *(v.
vector), b, *(w.
vector), s);
1830 this->sadd( s, a, v);
1831 this->sadd(1., b, w);
1840 const TrilinosScalar a,
1842 const TrilinosScalar b,
1844 const TrilinosScalar c,
1849 Assert (!has_ghost_elements(), ExcGhostsPresent());
1851 ExcDimensionMismatch (size(), v.
size()));
1853 ExcDimensionMismatch (size(), w.
size()));
1855 ExcDimensionMismatch (size(), x.
size()));
1867 Assert (this->vector->Map().SameAs(v.
vector->Map())==
true,
1868 ExcDifferentParallelPartitioning());
1869 Assert (this->vector->Map().SameAs(w.
vector->Map())==
true,
1870 ExcDifferentParallelPartitioning());
1871 Assert (this->vector->Map().SameAs(x.
vector->Map())==
true,
1872 ExcDifferentParallelPartitioning());
1877 const int ierr = vector->Update(a, *(v.
vector), b, *(w.
vector), s);
1880 const int jerr = vector->Update(c, *(x.
vector), 1.);
1881 Assert (jerr == 0, ExcTrilinosError(jerr));
1886 this->sadd( s, a, v);
1887 this->sadd(1., b, w);
1888 this->sadd(1., c, x);
1900 Assert (!has_ghost_elements(), ExcGhostsPresent());
1902 ExcDimensionMismatch(local_size(), factors.
local_size()));
1904 const int ierr = vector->Multiply (1.0, *(factors.
vector), *vector, 0.0);
1917 Assert (!has_ghost_elements(), ExcGhostsPresent());
1921 if (vector->Map().SameAs(v.
vector->Map())==
false)
1923 this->sadd(0., a, v);
1928 int ierr = vector->Update(a, *v.
vector, 0.0);
1946 ExcDimensionMismatch (local_size(), w.
local_size()));
1948 const int ierr = vector->ReciprocalMultiply(1.0, *(w.
vector),
1957 const Epetra_MultiVector &
1960 return static_cast<const Epetra_MultiVector &
>(*vector);
1978 return static_cast<const Epetra_Map &
>(vector->Map());
1987 static MPI_Comm comm;
1989 #ifdef DEAL_II_WITH_MPI 1991 const Epetra_MpiComm *mpi_comm
1992 =
dynamic_cast<const Epetra_MpiComm *
>(&vector->Map().Comm());
1993 comm = mpi_comm->Comm();
1997 comm = MPI_COMM_SELF;
2012 DEAL_II_NAMESPACE_CLOSE
2014 #endif // DEAL_II_WITH_TRILINOS types::global_dof_index size_type
reference operator()(const size_type index)
void sadd(const TrilinosScalar s, const VectorBase &V)
::ExceptionBase & ExcMessage(std::string arg1)
real_type l1_norm() const
void swap(Vector &u, Vector &v)
std_cxx11::shared_ptr< Epetra_MultiVector > nonlocal_vector
std::pair< size_type, size_type > local_range() const
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
void scale(const VectorBase &scaling_factors)
reference operator[](const size_type index)
void reinit(const VectorBase &v, const bool omit_zeroing_entries=false)
#define AssertThrow(cond, exc)
bool is_compressed() const DEAL_II_DEPRECATED
void set(const std::vector< size_type > &indices, const std::vector< TrilinosScalar > &values)
VectorBase & operator+=(const VectorBase &V)
BlockDynamicSparsityPattern BlockCompressedSparsityPattern DEAL_II_DEPRECATED
void add(const std::vector< size_type > &indices, const std::vector< TrilinosScalar > &values)
real_type linfty_norm() const
#define DeclException1(Exception1, type1, outsequence)
VectorBase & operator/=(const TrilinosScalar factor)
std_cxx11::shared_ptr< Epetra_FEVector > vector
#define Assert(cond, exc)
const Epetra_Map & vector_partitioner() const
#define DeclException0(Exception0)
TrilinosScalar value_type
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< TrilinosScalar > &values) const
bool has_ghost_elements() const
VectorBase & operator-=(const VectorBase &V)
TrilinosScalar operator*(const VectorBase &vec) const
void add_range(const size_type begin, const size_type end)
TrilinosScalar mean_value() const
real_type norm_sqr() const
VectorBase & operator=(const TrilinosScalar s)
TrilinosScalar minimal_value() const DEAL_II_DEPRECATED
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
TrilinosScalar max() const
const MPI_Comm & get_mpi_communicator() const
const Epetra_MultiVector & trilinos_vector() const
bool in_local_range(const size_type index) const
TrilinosScalar add_and_dot(const TrilinosScalar a, const VectorBase &V, const VectorBase &W)
real_type lp_norm(const TrilinosScalar p) const
IndexSet locally_owned_elements() const
VectorBase & operator*=(const TrilinosScalar factor)
#define AssertIsFinite(number)
size_type local_size() const
TrilinosScalar min() const
real_type l2_norm() const
void ratio(const VectorBase &a, const VectorBase &b) DEAL_II_DEPRECATED
void equ(const TrilinosScalar a, const VectorBase &V)