Reference documentation for deal.II version 9.0.0
la_parallel_vector.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2011 - 2018 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE at
12 // the top level of the deal.II distribution.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_la_parallel_vector_h
17 #define dealii_la_parallel_vector_h
18 
19 #include <deal.II/base/config.h>
20 #include <deal.II/base/mpi.h>
21 #include <deal.II/base/numbers.h>
22 #include <deal.II/base/partitioner.h>
23 #include <deal.II/base/thread_management.h>
24 #include <deal.II/lac/vector_operation.h>
25 #include <deal.II/lac/vector_space_vector.h>
26 #include <deal.II/lac/vector_type_traits.h>
27 
28 #include <iomanip>
29 #include <memory>
30 
31 DEAL_II_NAMESPACE_OPEN
32 
33 namespace LinearAlgebra
34 {
35  namespace distributed
36  {
37  template <typename> class BlockVector;
38  }
39 }
40 
41 namespace LinearAlgebra
42 {
43  template <typename> class ReadWriteVector;
44 }
45 
46 #ifdef DEAL_II_WITH_PETSC
47 namespace PETScWrappers
48 {
49  namespace MPI
50  {
51  class Vector;
52  }
53 }
54 #endif
55 
56 #ifdef DEAL_II_WITH_TRILINOS
57 namespace TrilinosWrappers
58 {
59  namespace MPI
60  {
61  class Vector;
62  }
63 }
64 #endif
65 
66 namespace LinearAlgebra
67 {
68  namespace distributed
69  {
176  template <typename Number>
178  public Subscriptor
179  {
180  public:
181  typedef Number value_type;
182  typedef value_type *pointer;
183  typedef const value_type *const_pointer;
184  typedef value_type *iterator;
185  typedef const value_type *const_iterator;
186  typedef value_type &reference;
187  typedef const value_type &const_reference;
188  typedef types::global_dof_index size_type;
189  typedef typename numbers::NumberTraits<Number>::real_type real_type;
190 
198  Vector ();
199 
203  Vector (const Vector<Number> &in_vector);
204 
209  Vector (const size_type size);
210 
227  Vector (const IndexSet &local_range,
228  const IndexSet &ghost_indices,
229  const MPI_Comm communicator);
230 
234  Vector (const IndexSet &local_range,
235  const MPI_Comm communicator);
236 
243  Vector (const std::shared_ptr<const Utilities::MPI::Partitioner> &partitioner);
244 
248  virtual ~Vector () override;
249 
254  void reinit (const size_type size,
255  const bool omit_zeroing_entries = false);
256 
267  template <typename Number2>
268  void reinit(const Vector<Number2> &in_vector,
269  const bool omit_zeroing_entries = false);
270 
287  void reinit (const IndexSet &local_range,
288  const IndexSet &ghost_indices,
289  const MPI_Comm communicator);
290 
294  void reinit (const IndexSet &local_range,
295  const MPI_Comm communicator);
296 
303  void reinit (const std::shared_ptr<const Utilities::MPI::Partitioner> &partitioner);
304 
320  void swap (Vector<Number> &v);
321 
334  operator = (const Vector<Number> &in_vector);
335 
347  template <typename Number2>
349  operator = (const Vector<Number2> &in_vector);
350 
351 #ifdef DEAL_II_WITH_PETSC
352 
362  DEAL_II_DEPRECATED
364  operator = (const PETScWrappers::MPI::Vector &petsc_vec);
365 #endif
366 
367 #ifdef DEAL_II_WITH_TRILINOS
368 
379  DEAL_II_DEPRECATED
381  operator = (const TrilinosWrappers::MPI::Vector &trilinos_vec);
382 #endif
383 
384 
411  virtual void compress (::VectorOperation::values operation) override;
412 
434  void update_ghost_values () const;
435 
450  void compress_start (const unsigned int communication_channel = 0,
452 
468  void compress_finish (::VectorOperation::values operation);
469 
484  void update_ghost_values_start (const unsigned int communication_channel = 0) const;
485 
486 
494  void update_ghost_values_finish () const;
495 
504  void zero_out_ghosts () const;
505 
517  bool has_ghost_elements() const;
518 
533  template <typename Number2>
535 
537 
542 
547  virtual void reinit(const VectorSpaceVector<Number> &V,
548  const bool omit_zeroing_entries = false) override;
549 
553  virtual Vector<Number> &operator*= (const Number factor) override;
554 
558  virtual Vector<Number> &operator/= (const Number factor) override;
559 
563  virtual Vector<Number> &operator+= (const VectorSpaceVector<Number> &V) override;
564 
568  virtual Vector<Number> &operator-= (const VectorSpaceVector<Number> &V) override;
569 
578  virtual void import(const LinearAlgebra::ReadWriteVector<Number> &V,
579  VectorOperation::values operation,
580  std::shared_ptr<const CommunicationPatternBase> communication_pattern =
581  std::shared_ptr<const CommunicationPatternBase> ()) override;
582 
586  virtual Number operator* (const VectorSpaceVector<Number> &V) const override;
587 
591  virtual void add(const Number a) override;
592 
596  virtual void add(const Number a, const VectorSpaceVector<Number> &V) override;
597 
601  virtual void add(const Number a, const VectorSpaceVector<Number> &V,
602  const Number b, const VectorSpaceVector<Number> &W) override;
603 
608  virtual void add (const std::vector<size_type> &indices,
609  const std::vector<Number> &values);
610 
615  virtual void sadd(const Number s, const Number a,
616  const VectorSpaceVector<Number> &V) override;
617 
623  virtual void scale(const VectorSpaceVector<Number> &scaling_factors) override;
624 
628  virtual void equ(const Number a, const VectorSpaceVector<Number> &V) override;
629 
634  virtual real_type l1_norm() const override;
635 
640  virtual real_type l2_norm() const override;
641 
645  real_type norm_sqr() const;
646 
651  virtual real_type linfty_norm() const override;
652 
672  virtual Number add_and_dot(const Number a,
673  const VectorSpaceVector<Number> &V,
674  const VectorSpaceVector<Number> &W) override;
675 
680  virtual size_type size() const override;
681 
693  virtual ::IndexSet locally_owned_elements() const override;
694 
698  virtual void print(std::ostream &out,
699  const unsigned int precision=3,
700  const bool scientific=true,
701  const bool across=true) const override;
702 
706  virtual std::size_t memory_consumption() const override;
708 
713 
719  virtual Vector<Number> &operator = (const Number s) override;
720 
725  template <typename OtherNumber>
726  void add (const std::vector<size_type> &indices,
727  const ::Vector<OtherNumber> &values);
728 
733  template <typename OtherNumber>
734  void add (const size_type n_elements,
735  const size_type *indices,
736  const OtherNumber *values);
737 
742  void sadd (const Number s,
743  const Vector<Number> &V);
744 
750  DEAL_II_DEPRECATED
751  void sadd (const Number s,
752  const Number a,
753  const Vector<Number> &V,
754  const Number b,
755  const Vector<Number> &W);
756 
762  DEAL_II_DEPRECATED
763  void equ (const Number a, const Vector<Number> &u,
764  const Number b, const Vector<Number> &v);
765 
767 
768 
773 
778  size_type local_size() const;
779 
787  DEAL_II_DEPRECATED
788  std::pair<size_type, size_type> local_range () const;
789 
796  DEAL_II_DEPRECATED
797  bool in_local_range (const size_type global_index) const;
798 
804  DEAL_II_DEPRECATED
805  size_type n_ghost_entries () const;
806 
814  DEAL_II_DEPRECATED
815  const IndexSet &ghost_elements() const;
816 
824  DEAL_II_DEPRECATED
825  bool is_ghost_entry (const types::global_dof_index global_index) const;
826 
834  iterator begin ();
835 
840  const_iterator begin () const;
841 
846  iterator end ();
847 
852  const_iterator end () const;
853 
863  Number operator () (const size_type global_index) const;
864 
874  Number &operator () (const size_type global_index);
875 
883  Number operator [] (const size_type global_index) const;
891  Number &operator [] (const size_type global_index);
892 
901  Number local_element (const size_type local_index) const;
902 
911  Number &local_element (const size_type local_index);
912 
928  template <typename OtherNumber>
929  void extract_subvector_to (const std::vector<size_type> &indices,
930  std::vector<OtherNumber> &values) const;
931 
959  template <typename ForwardIterator, typename OutputIterator>
960  void extract_subvector_to (ForwardIterator indices_begin,
961  const ForwardIterator indices_end,
962  OutputIterator values_begin) const;
968  virtual bool all_zero () const override;
969 
973  virtual Number mean_value () const override;
974 
979  real_type lp_norm (const real_type p) const;
981 
986 
991  const MPI_Comm &get_mpi_communicator () const;
992 
999  const std::shared_ptr<const Utilities::MPI::Partitioner> &
1000  get_partitioner () const;
1001 
1011  bool
1013 
1027  bool
1030 
1037 
1042  Number, Number, unsigned int,
1043  << "Called compress(VectorOperation::insert), but"
1044  << " the element received from a remote processor, value "
1045  << std::setprecision(16) << arg1
1046  << ", does not match with the value "
1047  << std::setprecision(16) << arg2
1048  << " on the owner processor " << arg3);
1049 
1054  size_type, size_type, size_type, size_type,
1055  << "You tried to access element " << arg1
1056  << " of a distributed vector, but this element is not "
1057  << "stored on the current processor. Note: The range of "
1058  << "locally owned elements is " << arg2 << " to "
1059  << arg3 << ", and there are " << arg4 << " ghost elements "
1060  << "that this vector can access.");
1061 
1062  private:
1063 
1068  void add_local(const Number a, const VectorSpaceVector<Number> &V);
1069 
1074  void sadd_local(const Number s, const Number a,
1075  const VectorSpaceVector<Number> &V);
1076 
1080  bool all_zero_local () const;
1081 
1085  template <typename Number2>
1086  Number inner_product_local (const Vector<Number2> &V) const;
1087 
1091  real_type norm_sqr_local () const;
1092 
1096  Number mean_value_local () const;
1097 
1101  real_type l1_norm_local () const;
1102 
1106  real_type lp_norm_local (const real_type p) const;
1107 
1111  real_type linfty_norm_local () const;
1112 
1118  Number add_and_dot_local (const Number a,
1119  const Vector<Number> &V,
1120  const Vector<Number> &W);
1121 
1127  std::shared_ptr<const Utilities::MPI::Partitioner> partitioner;
1128 
1132  size_type allocated_size;
1133 
1141  std::unique_ptr<Number[], decltype(&free)> values;
1142 
1147  mutable std::shared_ptr< ::parallel::internal::TBBPartitioner> thread_loop_partitioner;
1148 
1154  mutable std::unique_ptr<Number[]> import_data;
1155 
1163  mutable bool vector_is_ghosted;
1164 
1165 #ifdef DEAL_II_WITH_MPI
1166 
1174  std::vector<MPI_Request> compress_requests;
1175 
1180  mutable std::vector<MPI_Request> update_ghost_values_requests;
1181 #endif
1182 
1189 
1194  void clear_mpi_requests ();
1195 
1199  void resize_val (const size_type new_allocated_size);
1200 
1201  /*
1202  * Make all other vector types friends.
1203  */
1204  template <typename Number2> friend class Vector;
1205 
1209  template <typename Number2> friend class BlockVector;
1210  };
1214  /*----------------------- Inline functions ----------------------------------*/
1215 
1216 #ifndef DOXYGEN
1217 
1218 
1219  template <typename Number>
1220  inline
1221  bool
1223  {
1224  return vector_is_ghosted;
1225  }
1226 
1227 
1228 
1229  template <typename Number>
1230  inline
1231  typename Vector<Number>::size_type
1232  Vector<Number>::size () const
1233  {
1234  return partitioner->size();
1235  }
1236 
1237 
1238 
1239  template <typename Number>
1240  inline
1241  typename Vector<Number>::size_type
1243  {
1244  return partitioner->local_size();
1245  }
1246 
1247 
1248 
1249  template <typename Number>
1250  inline
1251  std::pair<typename Vector<Number>::size_type,
1252  typename Vector<Number>::size_type>
1254  {
1255  return partitioner->local_range();
1256  }
1257 
1258 
1259 
1260  template <typename Number>
1261  inline
1262  bool
1264  (const size_type global_index) const
1265  {
1266  return partitioner->in_local_range (global_index);
1267  }
1268 
1269 
1270 
1271  template <typename Number>
1272  inline
1273  IndexSet
1275  {
1276  IndexSet is (size());
1277 
1278  is.add_range (partitioner->local_range().first,
1279  partitioner->local_range().second);
1280 
1281  return is;
1282  }
1283 
1284 
1285 
1286  template <typename Number>
1287  inline
1288  typename Vector<Number>::size_type
1290  {
1291  return partitioner->n_ghost_indices();
1292  }
1293 
1294 
1295 
1296  template <typename Number>
1297  inline
1298  const IndexSet &
1300  {
1301  return partitioner->ghost_indices();
1302  }
1303 
1304 
1305 
1306  template <typename Number>
1307  inline
1308  bool
1309  Vector<Number>::is_ghost_entry (const size_type global_index) const
1310  {
1311  return partitioner->is_ghost_entry (global_index);
1312  }
1313 
1314 
1315 
1316  template <typename Number>
1317  inline
1318  typename Vector<Number>::iterator
1320  {
1321  return values.get();
1322  }
1323 
1324 
1325 
1326  template <typename Number>
1327  inline
1328  typename Vector<Number>::const_iterator
1329  Vector<Number>::begin () const
1330  {
1331  return values.get();
1332  }
1333 
1334 
1335 
1336  template <typename Number>
1337  inline
1338  typename Vector<Number>::iterator
1340  {
1341  return values.get()+partitioner->local_size();
1342  }
1343 
1344 
1345 
1346  template <typename Number>
1347  inline
1348  typename Vector<Number>::const_iterator
1349  Vector<Number>::end () const
1350  {
1351  return values.get()+partitioner->local_size();
1352  }
1353 
1354 
1355 
1356  template <typename Number>
1357  inline
1358  Number
1359  Vector<Number>::operator() (const size_type global_index) const
1360  {
1361  Assert (partitioner->in_local_range (global_index) ||
1362  partitioner->ghost_indices().is_element(global_index),
1363  ExcAccessToNonLocalElement(global_index, partitioner->local_range().first,
1364  partitioner->local_range().second,
1365  partitioner->ghost_indices().n_elements()));
1366  // do not allow reading a vector which is not in ghost mode
1367  Assert (partitioner->in_local_range (global_index) || vector_is_ghosted == true,
1368  ExcMessage("You tried to read a ghost element of this vector, "
1369  "but it has not imported its ghost values."));
1370  return values[partitioner->global_to_local(global_index)];
1371  }
1372 
1373 
1374 
1375  template <typename Number>
1376  inline
1377  Number &
1378  Vector<Number>::operator() (const size_type global_index)
1379  {
1380  Assert (partitioner->in_local_range (global_index) ||
1381  partitioner->ghost_indices().is_element(global_index),
1382  ExcAccessToNonLocalElement(global_index, partitioner->local_range().first,
1383  partitioner->local_range().second,
1384  partitioner->ghost_indices().n_elements()));
1385  // we would like to prevent reading ghosts from a vector that does not
1386  // have them imported, but this is not possible because we might be in a
1387  // part of the code where the vector has enabled ghosts but is non-const
1388  // (then, the compiler picks this method according to the C++ rule book
1389  // even if a human would pick the const method when this subsequent use
1390  // is just a read)
1391  return values[partitioner->global_to_local (global_index)];
1392  }
1393 
1394 
1395 
1396  template <typename Number>
1397  inline
1398  Number
1399  Vector<Number>::operator[] (const size_type global_index) const
1400  {
1401  return operator()(global_index);
1402  }
1403 
1404 
1405 
1406  template <typename Number>
1407  inline
1408  Number &
1409  Vector<Number>::operator[] (const size_type global_index)
1410  {
1411  return operator()(global_index);
1412  }
1413 
1414 
1415 
1416  template <typename Number>
1417  inline
1418  Number
1419  Vector<Number>::local_element (const size_type local_index) const
1420  {
1421  AssertIndexRange (local_index,
1422  partitioner->local_size()+
1423  partitioner->n_ghost_indices());
1424  // do not allow reading a vector which is not in ghost mode
1425  Assert (local_index < local_size() || vector_is_ghosted == true,
1426  ExcMessage("You tried to read a ghost element of this vector, "
1427  "but it has not imported its ghost values."));
1428  return values[local_index];
1429  }
1430 
1431 
1432 
1433  template <typename Number>
1434  inline
1435  Number &
1436  Vector<Number>::local_element (const size_type local_index)
1437  {
1438  AssertIndexRange (local_index,
1439  partitioner->local_size()+
1440  partitioner->n_ghost_indices());
1441  return values[local_index];
1442  }
1443 
1444 
1445 
1446  template <typename Number>
1447  template <typename OtherNumber>
1448  inline
1449  void Vector<Number>::extract_subvector_to (const std::vector<size_type> &indices,
1450  std::vector<OtherNumber> &values) const
1451  {
1452  for (size_type i = 0; i < indices.size(); ++i)
1453  values[i] = operator()(indices[i]);
1454  }
1455 
1456 
1457 
1458  template <typename Number>
1459  template <typename ForwardIterator, typename OutputIterator>
1460  inline
1461  void Vector<Number>::extract_subvector_to (ForwardIterator indices_begin,
1462  const ForwardIterator indices_end,
1463  OutputIterator values_begin) const
1464  {
1465  while (indices_begin != indices_end)
1466  {
1467  *values_begin = operator()(*indices_begin);
1468  indices_begin++;
1469  values_begin++;
1470  }
1471  }
1472 
1473 
1474 
1475  template <typename Number>
1476  template <typename OtherNumber>
1477  inline
1478  void
1479  Vector<Number>::add (const std::vector<size_type> &indices,
1480  const ::Vector<OtherNumber> &values)
1481  {
1482  AssertDimension (indices.size(), values.size());
1483  for (size_type i=0; i<indices.size(); ++i)
1484  {
1485  Assert (numbers::is_finite(values[i]),
1486  ExcMessage("The given value is not finite but either infinite or Not A Number (NaN)"));
1487  this->operator()(indices[i]) += values(i);
1488  }
1489  }
1490 
1491 
1492 
1493  template <typename Number>
1494  template <typename OtherNumber>
1495  inline
1496  void
1497  Vector<Number>::add (const size_type n_elements,
1498  const size_type *indices,
1499  const OtherNumber *values)
1500  {
1501  for (size_type i=0; i<n_elements; ++i, ++indices, ++values)
1502  {
1503  Assert (numbers::is_finite(*values),
1504  ExcMessage("The given value is not finite but either infinite or Not A Number (NaN)"));
1505  this->operator()(*indices) += *values;
1506  }
1507  }
1508 
1509 
1510 
1511  template <typename Number>
1512  inline
1513  const MPI_Comm &
1515  {
1516  return partitioner->get_mpi_communicator();
1517  }
1518 
1519 
1520 
1521  template <typename Number>
1522  inline
1523  const std::shared_ptr<const Utilities::MPI::Partitioner> &
1525  {
1526  return partitioner;
1527  }
1528 
1529 #endif
1530 
1531  }
1532 }
1533 
1534 
1543 template <typename Number>
1544 inline
1547 {
1548  u.swap (v);
1549 }
1550 
1551 
1557 template <typename Number>
1558 struct is_serial_vector< LinearAlgebra::distributed::Vector< Number > > : std::false_type
1559 {
1560 };
1561 
1562 
1563 namespace internal
1564 {
1565  namespace LinearOperatorImplementation
1566  {
1567  template <typename> class ReinitHelper;
1568 
1573  template <typename Number>
1574  class ReinitHelper<LinearAlgebra::distributed::Vector<Number>>
1575  {
1576  public:
1577  template <typename Matrix>
1578  static
1579  void reinit_range_vector (const Matrix &matrix,
1581  bool omit_zeroing_entries)
1582  {
1583  matrix.initialize_dof_vector(v);
1584  if (!omit_zeroing_entries)
1585  v = Number();
1586  }
1587 
1588  template <typename Matrix>
1589  static
1590  void reinit_domain_vector(const Matrix &matrix,
1592  bool omit_zeroing_entries)
1593  {
1594  matrix.initialize_dof_vector(v);
1595  if (!omit_zeroing_entries)
1596  v = Number();
1597  }
1598  };
1599 
1600  } /* namespace LinearOperator */
1601 } /* namespace internal */
1602 
1603 
1604 DEAL_II_NAMESPACE_CLOSE
1605 
1606 #endif
void reinit(const size_type size, const bool omit_zeroing_entries=false)
#define AssertDimension(dim1, dim2)
Definition: exceptions.h:1248
const IndexSet & ghost_elements() const
std::vector< MPI_Request > compress_requests
void copy_locally_owned_data_from(const Vector< Number2 > &src)
Number inner_product_local(const Vector< Number2 > &V) const
virtual Vector< Number > & operator*=(const Number factor) override
real_type lp_norm(const real_type p) const
void swap(LinearAlgebra::distributed::Vector< Number > &u, LinearAlgebra::distributed::Vector< Number > &v)
virtual void equ(const Number a, const VectorSpaceVector< Number > &V) override
std::unique_ptr< Number[]> import_data
#define AssertIndexRange(index, range)
Definition: exceptions.h:1284
void add_local(const Number a, const VectorSpaceVector< Number > &V)
virtual void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const override
virtual Vector< Number > & operator-=(const VectorSpaceVector< Number > &V) override
static ::ExceptionBase & ExcVectorTypeNotCompatible()
static void reinit_range_vector(const Matrix &matrix, Vector &v, bool omit_zeroing_entries)
bool is_finite(const double x)
Definition: numbers.h:405
std::vector< MPI_Request > update_ghost_values_requests
static void reinit_domain_vector(const Matrix &matrix, Vector &v, bool omit_zeroing_entries)
bool in_local_range(const size_type global_index) const
virtual Vector< Number > & operator/=(const Number factor) override
virtual real_type l1_norm() const override
virtual Number add_and_dot(const Number a, const VectorSpaceVector< Number > &V, const VectorSpaceVector< Number > &W) override
void swap(Vector< Number > &v)
static ::ExceptionBase & ExcMessage(std::string arg1)
unsigned int global_dof_index
Definition: types.h:88
virtual size_type size() const override
#define Assert(cond, exc)
Definition: exceptions.h:1142
void resize_val(const size_type new_allocated_size)
virtual std::size_t memory_consumption() const override
std::unique_ptr< Number[], decltype(&free)> values
virtual void add(const Number a) override
Number operator[](const size_type global_index) const
#define DeclException0(Exception0)
Definition: exceptions.h:323
virtual ::IndexSet locally_owned_elements() const override
const std::shared_ptr< const Utilities::MPI::Partitioner > & get_partitioner() const
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< OtherNumber > &values) const
virtual void compress(::VectorOperation::values operation) override
const MPI_Comm & get_mpi_communicator() const
virtual Number operator*(const VectorSpaceVector< Number > &V) const override
virtual Number mean_value() const override
Number add_and_dot_local(const Number a, const Vector< Number > &V, const Vector< Number > &W)
Vector< Number > & operator=(const Vector< Number > &in_vector)
void compress_start(const unsigned int communication_channel=0, ::VectorOperation::values operation=VectorOperation::add)
virtual bool all_zero() const override
std::pair< size_type, size_type > local_range() const
void compress_finish(::VectorOperation::values operation)
std::shared_ptr< const Utilities::MPI::Partitioner > partitioner
Number operator()(const size_type global_index) const
bool partitioners_are_globally_compatible(const Utilities::MPI::Partitioner &part) const
#define DeclException4(Exception4, type1, type2, type3, type4, outsequence)
Definition: exceptions.h:382
static ::ExceptionBase & ExcNonMatchingElements(Number arg1, Number arg2, unsigned int arg3)
value_type operator()(const size_type i) const
bool partitioners_are_compatible(const Utilities::MPI::Partitioner &part) const
real_type lp_norm_local(const real_type p) const
Number local_element(const size_type local_index) const
bool is_ghost_entry(const types::global_dof_index global_index) const
virtual real_type l2_norm() const override
static ::ExceptionBase & ExcAccessToNonLocalElement(size_type arg1, size_type arg2, size_type arg3, size_type arg4)
#define DeclException3(Exception3, type1, type2, type3, outsequence)
Definition: exceptions.h:370
virtual real_type linfty_norm() const override
virtual void sadd(const Number s, const Number a, const VectorSpaceVector< Number > &V) override
virtual Vector< Number > & operator+=(const VectorSpaceVector< Number > &V) override
virtual void scale(const VectorSpaceVector< Number > &scaling_factors) override
void sadd_local(const Number s, const Number a, const VectorSpaceVector< Number > &V)
std::shared_ptr< ::parallel::internal::TBBPartitioner > thread_loop_partitioner
void update_ghost_values_start(const unsigned int communication_channel=0) const