17 #ifndef __deal2__parallel_vector_h
18 #define __deal2__parallel_vector_h
20 #include <deal.II/base/config.h>
21 #include <deal.II/base/index_set.h>
22 #include <deal.II/base/mpi.h>
23 #include <deal.II/base/template_constraints.h>
24 #include <deal.II/base/types.h>
25 #include <deal.II/base/utilities.h>
26 #include <deal.II/base/memory_consumption.h>
27 #include <deal.II/base/partitioner.h>
28 #include <deal.II/base/thread_management.h>
29 #include <deal.II/lac/vector_view.h>
34 DEAL_II_NAMESPACE_OPEN
104 template <
typename Number>
171 const MPI_Comm communicator);
177 const MPI_Comm communicator);
185 Vector (
const std_cxx1x::shared_ptr<const Utilities::MPI::Partitioner> &
partitioner);
197 const bool fast =
false);
208 template <
typename Number2>
210 const bool fast =
false);
227 const MPI_Comm communicator);
233 const MPI_Comm communicator);
241 void reinit (
const std_cxx1x::shared_ptr<const Utilities::MPI::Partitioner> &
partitioner);
271 template <
typename Number2>
280 const bool call_update_ghost_values =
false);
312 void compress (::VectorOperation::values operation);
353 void compress_start (const
unsigned int communication_channel = 0,
448 template <typename Number2>
449 bool operator == (const
Vector<Number2> &v) const;
454 template <typename Number2>
455 bool operator != (const
Vector<Number2> &v) const;
460 template <typename Number2>
461 Number operator * (const
Vector<Number2> &V) const;
491 real_type
lp_norm (const real_type p) const;
503 size_type
size () const;
516 std::pair<size_type, size_type>
local_range () const;
557 bool is_ghost_entry (const types::global_dof_index global_index) const;
572 const_iterator begin () const;
584 const_iterator end () const;
602 Number operator () (const size_type global_index) const;
613 Number &operator () (const size_type global_index);
622 Number operator [] (const size_type global_index) const;
631 Number &operator [] (const size_type global_index);
643 template <typename OtherNumber>
645 std::vector<OtherNumber> &values) const;
651 template <typename ForwardIterator, typename OutputIterator>
653 const ForwardIterator indices_end,
654 OutputIterator values_begin) const;
697 template <typename OtherNumber>
698 void add (const std::vector<size_type> &indices,
699 const std::vector<OtherNumber> &values);
705 template <typename OtherNumber>
706 void add (const std::vector<size_type> &indices,
707 const ::
Vector<OtherNumber> &values);
714 template <typename OtherNumber>
715 void add (const size_type n_elements,
716 const size_type *indices,
717 const OtherNumber *values);
723 void add (const Number s);
728 void add (const
Vector<Number> &V);
734 void add (const Number a, const
Vector<Number> &V);
739 void add (const Number a, const
Vector<Number> &V,
740 const Number b, const
Vector<Number> &W);
746 void sadd (const Number s,
752 void sadd (const Number s,
759 void sadd (const Number s,
769 void sadd (const Number s,
784 void scale (const Number factor) DEAL_II_DEPRECATED;
789 Vector<Number> &operator *= (const Number factor);
794 Vector<Number> &operator /= (const Number factor);
801 void scale (const
Vector<Number> &scaling_factors);
808 template <typename Number2>
809 void scale (const
Vector<Number2> &scaling_factors);
814 void equ (const Number a, const
Vector<Number> &u);
819 template <typename Number2>
820 void equ (const Number a, const
Vector<Number2> &u);
825 void equ (const Number a, const
Vector<Number> &u,
826 const Number b, const
Vector<Number> &v);
831 void equ (const Number a, const
Vector<Number> &u,
832 const Number b, const
Vector<Number> &v,
833 const Number c, const
Vector<Number> &w);
876 void print (std::ostream &out,
877 const
unsigned int precision = 3,
878 const
bool scientific = true,
879 const
bool across = true) const;
901 template <typename Number2>
907 template <typename Number2>
940 std_cxx1x::shared_ptr<const Utilities::MPI::Partitioner>
partitioner;
974 #ifdef DEAL_II_WITH_MPI
1008 void resize_val (
const size_type new_allocated_size);
1013 template <
typename Number2>
friend class Vector;
1028 template <
typename Number>
1032 partitioner (new Utilities::MPI::Partitioner()),
1036 vector_is_ghosted (false),
1037 vector_view (0, static_cast<Number *>(0))
1042 template <
typename Number>
1050 vector_is_ghosted (false),
1051 vector_view (0, static_cast<Number *>(0))
1059 template <
typename Number>
1063 const MPI_Comm communicator)
1068 vector_is_ghosted (false),
1069 vector_view (0, static_cast<Number *>(0))
1071 reinit (local_range, ghost_indices, communicator);
1076 template <
typename Number>
1079 const MPI_Comm communicator)
1084 vector_is_ghosted (false),
1085 vector_view (0, static_cast<Number *>(0))
1088 reinit (local_range, ghost_indices, communicator);
1093 template <
typename Number>
1100 vector_is_ghosted (false),
1101 vector_view (0, static_cast<Number *>(0))
1108 template <
typename Number>
1111 Vector (
const std_cxx1x::shared_ptr<const Utilities::MPI::Partitioner> &partitioner)
1116 vector_is_ghosted (false),
1117 vector_view (0, static_cast<Number *>(0))
1124 template <
typename Number>
1132 if (import_data != 0)
1133 delete[] import_data;
1136 clear_mpi_requests();
1141 template <
typename Number>
1151 bool must_update_ghost_values =
true;
1156 if (partitioner.get() == 0)
1158 else if (partitioner.get() != c.partitioner.get())
1160 size_type local_ranges_different_loc = (local_range() !=
1162 if ((partitioner->n_mpi_processes() > 1 &&
1164 partitioner->get_communicator()) != 0)
1166 local_ranges_different_loc)
1170 must_update_ghost_values = vector_is_ghosted || c.vector_is_ghosted;
1172 vector_view = c.vector_view;
1173 if (must_update_ghost_values)
1180 template <
typename Number>
1181 template <
typename Number2>
1191 if (partitioner.get() == 0)
1193 else if (partitioner.get() != c.partitioner.get())
1195 size_type local_ranges_different_loc = (local_range() !=
1197 if ((partitioner->n_mpi_processes() > 1 &&
1199 partitioner->get_communicator()) != 0)
1201 local_ranges_different_loc)
1204 vector_view.reinit (partitioner->local_size(), val);
1206 if (partitioner->local_size())
1207 vector_view.equ (1., c.vector_view);
1209 if (vector_is_ghosted || c.vector_is_ghosted)
1216 template <
typename Number>
1221 compress_start (0, operation);
1222 compress_finish(operation);
1227 template <
typename Number>
1232 compress(VectorOperation::unknown);
1237 template <
typename Number>
1243 compress_finish(VectorOperation::add);
1245 compress_finish(VectorOperation::insert);
1250 template <
typename Number>
1255 update_ghost_values_start ();
1256 update_ghost_values_finish ();
1261 template <
typename Number>
1266 std::fill_n (&val[partitioner->local_size()],
1267 partitioner->n_ghost_indices(),
1269 vector_is_ghosted =
false;
1274 template <
typename Number>
1279 return vector_is_ghosted;
1284 template <
typename Number>
1289 return partitioner->local_size()>0 ? vector_view.all_zero () :
true;
1294 template <
typename Number>
1304 int local_result = -
static_cast<int>(all_zero_local());
1305 if (partitioner->n_mpi_processes() > 1)
1307 partitioner->get_communicator());
1309 return -local_result;
1314 template <
typename Number>
1319 return partitioner->local_size()>0 ? vector_view.is_non_negative () :
true;
1324 template <
typename Number>
1329 int local_result = -
static_cast<int>(is_non_negative_local());
1330 if (partitioner->n_mpi_processes() > 1)
1332 partitioner->get_communicator());
1334 return -local_result;
1339 template <
typename Number>
1340 template <
typename Number2>
1345 return partitioner->local_size()>0 ?
1346 vector_view.template
operator == <Number2>(v.vector_view)
1352 template <
typename Number>
1353 template <
typename Number2>
1360 unsigned int local_result =
static_cast<int>(!vectors_equal_local(v));
1361 unsigned int result =
1362 partitioner->n_mpi_processes() > 1
1372 template <
typename Number>
1373 template <
typename Number2>
1383 template <
typename Number>
1384 template <
typename Number2>
1391 return (partitioner->local_size()>0 ?
1392 vector_view.operator* (V.vector_view)
1398 template <
typename Number>
1399 template <
typename Number2>
1404 Number local_result = inner_product_local(V);
1405 if (partitioner->n_mpi_processes() > 1)
1407 partitioner->get_communicator());
1409 return local_result;
1414 template <
typename Number>
1419 return partitioner->local_size()>0 ? vector_view.norm_sqr() : real_type();
1424 template <
typename Number>
1429 real_type local_result = norm_sqr_local();
1430 if (partitioner->n_mpi_processes() > 1)
1432 partitioner->get_communicator());
1434 return local_result;
1439 template <
typename Number>
1445 return (partitioner->local_size() ?
1446 vector_view.mean_value()
1452 template <
typename Number>
1457 Number local_result = mean_value_local();
1458 if (partitioner->n_mpi_processes() > 1)
1460 (real_type)partitioner->local_size(),
1461 partitioner->get_communicator())
1462 /(real_type)partitioner->size();
1464 return local_result;
1469 template <
typename Number>
1474 return partitioner->local_size() ? vector_view.l1_norm() : real_type();
1479 template <
typename Number>
1484 real_type local_result = l1_norm_local();
1485 if (partitioner->n_mpi_processes() > 1)
1487 partitioner->get_communicator());
1489 return local_result;
1494 template <
typename Number>
1504 template <
typename Number>
1509 return partitioner->local_size() ? vector_view.lp_norm(p) : real_type();
1514 template <
typename Number>
1519 const real_type local_result = lp_norm_local(p);
1520 if (partitioner->n_mpi_processes() > 1)
1522 partitioner->get_communicator()),
1523 static_cast<real_type>(1.0/p));
1525 return local_result;
1530 template <
typename Number>
1535 return partitioner->local_size() ? vector_view.linfty_norm() : real_type();
1540 template <
typename Number>
1545 const real_type local_result = linfty_norm_local();
1546 if (partitioner->n_mpi_processes() > 1)
1548 partitioner->get_communicator());
1550 return local_result;
1555 template <
typename Number>
1560 return partitioner->size();
1565 template <
typename Number>
1570 return partitioner->local_size();
1575 template <
typename Number>
1577 std::pair<typename Vector<Number>::size_type,
1581 return partitioner->local_range();
1586 template <
typename Number>
1592 return partitioner->in_local_range (global_index);
1597 template <
typename Number>
1604 is.add_range (local_range().first, local_range().second);
1611 template <
typename Number>
1616 return partitioner->n_ghost_indices();
1621 template <
typename Number>
1626 return partitioner->ghost_indices();
1631 template <
typename Number>
1636 return partitioner->is_ghost_entry (global_index);
1641 template <
typename Number>
1646 return vector_view.begin();
1651 template <
typename Number>
1656 return vector_view.begin();
1661 template <
typename Number>
1666 return vector_view.end();
1671 template <
typename Number>
1676 return vector_view.end();
1681 template <
typename Number>
1688 ExcMessage(
"You tried to read a ghost element of this vector, "
1689 "but it has not imported its ghost values."));
1690 return val[partitioner->global_to_local(global_index)];
1695 template <
typename Number>
1706 return val[partitioner->global_to_local (global_index)];
1711 template <
typename Number>
1721 template <
typename Number>
1731 template <
typename Number>
1732 template <
typename OtherNumber>
1735 std::vector<OtherNumber> &values)
const
1737 for (
size_type i = 0; i < indices.size(); ++i)
1738 values[i] =
operator()(indices[i]);
1743 template <
typename Number>
1744 template <
typename ForwardIterator,
typename OutputIterator>
1747 const ForwardIterator indices_end,
1748 OutputIterator values_begin)
const
1750 while (indices_begin != indices_end)
1760 template <
typename Number>
1766 partitioner->local_size()+
1767 partitioner->n_ghost_indices());
1769 Assert (local_index < local_size() || vector_is_ghosted ==
true,
1770 ExcMessage(
"You tried to read a ghost element of this vector, "
1771 "but it has not imported its ghost values."));
1772 return val[local_index];
1777 template <
typename Number>
1783 partitioner->local_size()+
1784 partitioner->n_ghost_indices());
1785 return val[local_index];
1790 template <
typename Number>
1797 if (partitioner->local_size() > 0)
1807 template <
typename Number>
1817 vector_view += v.vector_view;
1819 if (vector_is_ghosted)
1827 template <
typename Number>
1837 vector_view -= v.vector_view;
1839 if (vector_is_ghosted)
1847 template <
typename Number>
1848 template <
typename OtherNumber>
1852 const std::vector<OtherNumber> &values)
1855 add (indices.size(), &indices[0], &values[0]);
1860 template <
typename Number>
1861 template <
typename OtherNumber>
1865 const ::Vector<OtherNumber> &values)
1868 add (indices.size(), &indices[0], values.begin());
1873 template <
typename Number>
1874 template <
typename OtherNumber>
1879 const OtherNumber *values)
1884 ExcMessage(
"The given value is not finite but either infinite or Not A Number (NaN)"));
1891 template <
typename Number>
1899 vector_view.add (a);
1901 if (vector_is_ghosted)
1907 template <
typename Number>
1915 vector_view.add (v.vector_view);
1917 if (vector_is_ghosted)
1923 template <
typename Number>
1932 vector_view.add (a, v.vector_view);
1934 if (vector_is_ghosted)
1940 template <
typename Number>
1951 vector_view.add (a, v.vector_view, b, w.vector_view);
1953 if (vector_is_ghosted)
1959 template <
typename Number>
1968 vector_view.sadd (x, v.vector_view);
1970 if (vector_is_ghosted)
1976 template <
typename Number>
1986 vector_view.sadd (x, a, v.vector_view);
1988 if (vector_is_ghosted)
1994 template <
typename Number>
2006 vector_view.sadd (x, a, v.vector_view, b, w.vector_view);
2008 if (vector_is_ghosted)
2014 template <
typename Number>
2028 vector_view.sadd (s, a, v.vector_view, b, w.vector_view,
2031 if (vector_is_ghosted)
2037 template <
typename Number>
2047 template <
typename Number>
2055 vector_view *= factor;
2057 if (vector_is_ghosted)
2065 template <
typename Number>
2076 template <
typename Number>
2084 vector_view.scale (scaling_factors.vector_view);
2086 if (vector_is_ghosted)
2092 template <
typename Number>
2093 template <
typename Number2>
2099 vector_view.template scale<Number2> (scaling_factors.vector_view);
2101 if (vector_is_ghosted)
2107 template <
typename Number>
2116 vector_view.equ (a, v.vector_view);
2118 if (vector_is_ghosted)
2124 template <
typename Number>
2125 template <
typename Number2>
2134 vector_view.equ (a, v.vector_view);
2136 if (vector_is_ghosted)
2142 template <
typename Number>
2153 vector_view.equ (a, v.vector_view, b, w.vector_view);
2155 if (vector_is_ghosted)
2161 template <
typename Number>
2174 vector_view.equ (a, v.vector_view, b, w.vector_view,
2177 if (vector_is_ghosted)
2183 template <
typename Number>
2192 vector_view.ratio (a.vector_view, b.vector_view);
2194 if (vector_is_ghosted)
2200 template <
typename Number>
2205 return partitioner->get_communicator();
2210 template <
typename Number>
2216 return partitioner->is_compatible (part);
2219 #endif // ifndef DOXYGEN
2235 template <
typename Number>
2244 DEAL_II_NAMESPACE_CLOSE
void scale(const Number factor) DEAL_II_DEPRECATED
#define AssertDimension(dim1, dim2)
void compress_start(const unsigned int communication_channel=0,::VectorOperation::values operation=VectorOperation::add)
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< OtherNumber > &values) const
types::global_dof_index size() const
void swap(Vector< Number > &v)
real_type linfty_norm_local() const
void compress_finish(::VectorOperation::values operation)
real_type l1_norm_local() const
::ExceptionBase & ExcMessage(std::string arg1)
void reinit(const size_type size, const bool fast=false)
#define AssertIndexRange(index, range)
const IndexSet & ghost_elements() const
bool in_local_range(const size_type global_index) const
void resize_val(const size_type new_allocated_size)
bool all_zero_local() const
std::vector< MPI_Request > update_ghost_values_requests
std_cxx1x::shared_ptr< const Utilities::MPI::Partitioner > partitioner
real_type l2_norm() const
Vector< Number > & operator+=(const Vector< Number > &V)
void compress() DEAL_II_DEPRECATED
Number operator()(const size_type global_index) const
bool operator==(const BlockVectorBase< VectorType2 > &v) const
bool is_finite(const double x)
Vector< Number > & operator*=(const Number factor)
Number mean_value() const
void reinit(const unsigned int num_blocks, const size_type block_size=0, const bool fast=false)
BlockVectorBase & operator*=(const value_type factor)
void sadd(const Number s, const Vector< Number > &V)
void update_ghost_values() const
bool operator!=(const Vector< Number2 > &v) const
bool operator==(const Vector< Number2 > &v) const
real_type norm_sqr() const
bool is_ghost_entry(const types::global_dof_index global_index) const
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
Vector< Number > & operator=(const Vector< Number > &in_vector)
void compress() DEAL_II_DEPRECATED
size_type n_ghost_entries() const
void equ(const Number a, const Vector< Number > &u)
T sum(const T &t, const MPI_Comm &mpi_communicator)
unsigned int global_dof_index
bool is_non_negative_local() const
real_type norm_sqr_local() const
#define Assert(cond, exc)
::ExceptionBase & ExcEmptyObject()
std::pair< size_type, size_type > local_range() const
bool has_ghost_elements() const
Vector< Number > & operator/=(const Number factor)
size_type local_size() const
bool is_non_negative() const
void update_ghost_values() const
void update_ghost_values_finish() const
Number operator*(const Vector< Number2 > &V) const
real_type norm_sqr() const
void ratio(const Vector< Number > &a, const Vector< Number > &b)
value_type operator()(const size_type i) const
BlockCompressedSparsityPattern CompressedBlockSparsityPattern DEAL_II_DEPRECATED
void swap(parallel::distributed::Vector< Number > &u, parallel::distributed::Vector< Number > &v)
void update_ghost_values_start(const unsigned int communication_channel=0) const
void add(const std::vector< size_type > &indices, const std::vector< Number > &values)
bool in_local_range(const size_type global_index) const
Number operator[](const size_type global_index) const
Number mean_value_local() const
real_type lp_norm(const real_type p) const
void clear_mpi_requests()
std::vector< MPI_Request > compress_requests
real_type l1_norm() const
bool partitioners_are_compatible(const Utilities::MPI::Partitioner &part) const
void add(const std::vector< size_type > &indices, const std::vector< OtherNumber > &values)
IndexSet locally_owned_elements() const
VectorView< Number > vector_view
bool vectors_equal_local(const Vector< Number2 > &v) const
real_type linfty_norm() const
::ExceptionBase & ExcNotInitialized()
static const bool supports_distributed_data
void copy_from(const Vector< Number > &in_vector, const bool call_update_ghost_values=false)
std::size_t memory_consumption() const
Number local_element(const size_type local_index) const
Vector< Number > & operator-=(const Vector< Number > &V)
Number inner_product_local(const Vector< Number2 > &V) const
const MPI_Comm & get_mpi_communicator() const
T max(const T &t, const MPI_Comm &mpi_communicator)
real_type lp_norm_local(const real_type p) const