Reference documentation for deal.II version 8.4.2
vector.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1999 - 2016 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__vector_h
17 #define dealii__vector_h
18 
19 
20 #include <deal.II/base/config.h>
21 #include <deal.II/base/logstream.h>
22 #include <deal.II/base/exceptions.h>
23 #include <deal.II/base/subscriptor.h>
24 #include <deal.II/base/index_set.h>
25 #include <boost/serialization/array.hpp>
26 #include <boost/serialization/split_member.hpp>
27 
28 #include <cstdio>
29 #include <iostream>
30 #include <cstring>
31 #include <vector>
32 
33 DEAL_II_NAMESPACE_OPEN
34 
35 
36 #ifdef DEAL_II_WITH_PETSC
37 namespace PETScWrappers
38 {
39  class Vector;
40  namespace MPI
41  {
42  class Vector;
43  }
44 }
45 #endif
46 
47 #ifdef DEAL_II_WITH_TRILINOS
48 namespace TrilinosWrappers
49 {
50  namespace MPI
51  {
52  class Vector;
53  }
54  class Vector;
55 }
56 #endif
57 
58 template<typename number> class LAPACKFullMatrix;
59 
60 template <typename> class BlockVector;
61 
62 template <typename> class VectorView;
63 
64 
65 
66 
83 {
84  enum values { unknown, insert, add };
85 };
86 
87 
108 template <typename Number>
109 class Vector : public Subscriptor
110 {
111 public:
116  typedef Number value_type;
117  typedef value_type *pointer;
118  typedef const value_type *const_pointer;
119  typedef value_type *iterator;
120  typedef const value_type *const_iterator;
121  typedef value_type &reference;
122  typedef const value_type &const_reference;
123  typedef types::global_dof_index size_type;
124 
135 
145  static const bool supports_distributed_data = false;
146 
147 public:
148 
156  Vector ();
157 
165  Vector (const Vector<Number> &v);
166 
167 #ifdef DEAL_II_WITH_CXX11
168 
175  Vector (Vector<Number> &&v);
176 #endif
177 
178 
179 #ifndef DEAL_II_EXPLICIT_CONSTRUCTOR_BUG
180 
192  template <typename OtherNumber>
193  explicit
194  Vector (const Vector<OtherNumber> &v);
195 #endif
196 
197 #ifdef DEAL_II_WITH_PETSC
198 
203  Vector (const PETScWrappers::Vector &v);
204 
216 #endif
217 
218 #ifdef DEAL_II_WITH_TRILINOS
219 
231 
237  Vector (const TrilinosWrappers::Vector &v);
238 #endif
239 
249  explicit Vector (const size_type n);
250 
255  template <typename InputIterator>
256  Vector (const InputIterator first,
257  const InputIterator last);
258 
263  virtual ~Vector ();
264 
278  void compress (::VectorOperation::values operation
279  =::VectorOperation::unknown) const;
280 
296  virtual void reinit (const size_type N,
297  const bool omit_zeroing_entries=false);
298 
306  template <typename Number2>
307  void reinit (const Vector<Number2> &V,
308  const bool omit_zeroing_entries=false);
309 
324  virtual void swap (Vector<Number> &v);
325 
339  Vector<Number> &operator= (const Number s);
340 
346  Vector<Number> &operator= (const Vector<Number> &v);
347 
348 #ifdef DEAL_II_WITH_CXX11
349 
356  Vector<Number> &operator= (Vector<Number> &&v);
357 #endif
358 
364  template <typename Number2>
365  Vector<Number> &operator= (const Vector<Number2> &v);
366 
370  Vector<Number> &operator= (const BlockVector<Number> &v);
371 
372 #ifdef DEAL_II_WITH_PETSC
373 
379  operator= (const PETScWrappers::Vector &v);
380 
392  operator= (const PETScWrappers::MPI::Vector &v);
393 #endif
394 
395 
396 #ifdef DEAL_II_WITH_TRILINOS
397 
409  operator= (const TrilinosWrappers::MPI::Vector &v);
410 
417  operator= (const TrilinosWrappers::Vector &v);
418 #endif
419 
425  template <typename Number2>
426  bool operator== (const Vector<Number2> &v) const;
427 
433  template <typename Number2>
434  bool operator != (const Vector<Number2> &v) const;
435 
437 
438 
443 
457  template <typename Number2>
458  Number operator * (const Vector<Number2> &V) const;
459 
467  real_type norm_sqr () const;
468 
476  Number mean_value () const;
477 
485  real_type l1_norm () const;
486 
495  real_type l2_norm () const;
496 
505  real_type lp_norm (const real_type p) const;
506 
510  real_type linfty_norm () const;
511 
532  Number add_and_dot (const Number a,
533  const Vector<Number> &V,
534  const Vector<Number> &W);
535 
537 
538 
543 
549  iterator begin ();
550 
554  const_iterator begin () const;
555 
559  iterator end ();
560 
565  const_iterator end () const;
566 
570  Number operator() (const size_type i) const;
571 
575  Number &operator() (const size_type i);
576 
582  Number operator[] (const size_type i) const;
583 
589  Number &operator[] (const size_type i);
590 
597  template <typename OtherNumber>
598  void extract_subvector_to (const std::vector<size_type> &indices,
599  std::vector<OtherNumber> &values) const;
600 
605  template <typename ForwardIterator, typename OutputIterator>
606  void extract_subvector_to (ForwardIterator indices_begin,
607  const ForwardIterator indices_end,
608  OutputIterator values_begin) const;
610 
611 
616 
622  Vector<Number> &operator += (const Vector<Number> &V);
623 
629  Vector<Number> &operator -= (const Vector<Number> &V);
630 
635  template <typename OtherNumber>
636  void add (const std::vector<size_type> &indices,
637  const std::vector<OtherNumber> &values);
638 
643  template <typename OtherNumber>
644  void add (const std::vector<size_type> &indices,
645  const Vector<OtherNumber> &values);
646 
652  template <typename OtherNumber>
653  void add (const size_type n_elements,
654  const size_type *indices,
655  const OtherNumber *values);
656 
663  void add (const Number s);
664 
672  void add (const Vector<Number> &V) DEAL_II_DEPRECATED;
673 
674 
680  void add (const Number a, const Vector<Number> &V,
681  const Number b, const Vector<Number> &W);
682 
688  void add (const Number a, const Vector<Number> &V);
689 
695  void sadd (const Number s,
696  const Vector<Number> &V);
697 
703  void sadd (const Number s,
704  const Number a,
705  const Vector<Number> &V);
706 
714  void sadd (const Number s,
715  const Number a,
716  const Vector<Number> &V,
717  const Number b,
718  const Vector<Number> &W) DEAL_II_DEPRECATED;
719 
728  void sadd (const Number s,
729  const Number a,
730  const Vector<Number> &V,
731  const Number b,
732  const Vector<Number> &W,
733  const Number c,
734  const Vector<Number> &X) DEAL_II_DEPRECATED;
735 
741  Vector<Number> &operator *= (const Number factor);
742 
748  Vector<Number> &operator /= (const Number factor);
749 
757  void scale (const Vector<Number> &scaling_factors);
758 
764  template <typename Number2>
765  void scale (const Vector<Number2> &scaling_factors);
766 
772  void equ (const Number a, const Vector<Number> &u);
773 
777  template <typename Number2>
778  void equ (const Number a, const Vector<Number2> &u);
779 
787  void equ (const Number a, const Vector<Number> &u,
788  const Number b, const Vector<Number> &v) DEAL_II_DEPRECATED;
789 
797  void equ (const Number a, const Vector<Number> &u,
798  const Number b, const Vector<Number> &v,
799  const Number c, const Vector<Number> &w) DEAL_II_DEPRECATED;
800 
813  void ratio (const Vector<Number> &a,
814  const Vector<Number> &b) DEAL_II_DEPRECATED;
815 
827  void update_ghost_values () const;
829 
830 
841  void print (const char *format = 0) const DEAL_II_DEPRECATED;
842 
849  void print (std::ostream &out,
850  const unsigned int precision = 3,
851  const bool scientific = true,
852  const bool across = true) const;
853 
862  void print (LogStream &out,
863  const unsigned int width = 6,
864  const bool across = true) const DEAL_II_DEPRECATED;
865 
871  void block_write (std::ostream &out) const;
872 
884  void block_read (std::istream &in);
885 
890  template <class Archive>
891  void save (Archive &ar, const unsigned int version) const;
892 
897  template <class Archive>
898  void load (Archive &ar, const unsigned int version);
899 
900  BOOST_SERIALIZATION_SPLIT_MEMBER()
901 
910 
916  bool in_local_range (const size_type global_index) const;
917 
933  IndexSet locally_owned_elements () const;
934 
938  std::size_t size () const;
939 
945  bool all_zero () const;
946 
956  bool is_non_negative () const;
957 
962  std::size_t memory_consumption () const;
964 
965 protected:
966 
971  size_type vec_size;
972 
979  size_type max_vec_size;
980 
984  Number *val;
985 
989  template <typename Number2> friend class Vector;
990 
994  template <typename Number2> friend class LAPACKFullMatrix;
995 
999  friend class VectorView<Number>;
1000 
1001 private:
1002 
1007  void allocate();
1008 
1012  void deallocate();
1013 };
1014 
1016 /*----------------------- Inline functions ----------------------------------*/
1017 
1018 
1019 #ifndef DOXYGEN
1020 
1021 
1022 template <typename Number>
1023 inline
1025  :
1026  vec_size(0),
1027  max_vec_size(0),
1028  val(0)
1029 {}
1030 
1031 
1032 
1033 template <typename Number>
1034 template <typename InputIterator>
1035 Vector<Number>::Vector (const InputIterator first, const InputIterator last)
1036  :
1037  vec_size (0),
1038  max_vec_size (0),
1039  val (0)
1040 {
1041  // allocate memory. do not initialize it, as we will copy over to it in a
1042  // second
1043  reinit (std::distance (first, last), true);
1044  std::copy (first, last, begin());
1045 }
1046 
1047 
1048 
1049 template <typename Number>
1050 inline
1051 Vector<Number>::Vector (const size_type n)
1052  :
1053  vec_size(0),
1054  max_vec_size(0),
1055  val(0)
1056 {
1057  reinit (n, false);
1058 }
1059 
1060 
1061 
1062 template <typename Number>
1063 inline
1065 {
1066  if (val)
1067  {
1068  deallocate();
1069  val=0;
1070  }
1071 }
1072 
1073 
1074 
1075 template <typename Number>
1076 inline
1077 void Vector<Number>::reinit (const size_type n,
1078  const bool omit_zeroing_entries)
1079 {
1080  if (n==0)
1081  {
1082  if (val) deallocate();
1083  val = 0;
1084  max_vec_size = vec_size = 0;
1085  return;
1086  };
1087 
1088  if (n>max_vec_size)
1089  {
1090  if (val) deallocate();
1091  max_vec_size = n;
1092  allocate();
1093  };
1094  vec_size = n;
1095  if (omit_zeroing_entries == false)
1096  *this = static_cast<Number>(0);
1097 }
1098 
1099 
1100 
1101 // declare function that is implemented in vector.templates.h
1102 namespace internal
1103 {
1104  namespace Vector
1105  {
1106  template <typename T, typename U>
1107  void copy_vector (const ::Vector<T> &src,
1108  ::Vector<U> &dst);
1109  }
1110 }
1111 
1112 
1113 
1114 template <typename Number>
1115 inline
1118 {
1119  ::internal::Vector::copy_vector (v, *this);
1120  return *this;
1121 }
1122 
1123 
1124 
1125 #ifdef DEAL_II_WITH_CXX11
1126 template <typename Number>
1127 inline
1130 {
1131  swap(v);
1132 
1133  return *this;
1134 }
1135 #endif
1136 
1137 
1138 
1139 template <typename Number>
1140 template <typename Number2>
1141 inline
1144 {
1145  internal::Vector::copy_vector (v, *this);
1146  return *this;
1147 }
1148 
1149 
1150 
1151 template <typename Number>
1152 inline
1153 std::size_t Vector<Number>::size () const
1154 {
1155  return vec_size;
1156 }
1157 
1158 
1159 template <typename Number>
1160 inline
1162 (const size_type) const
1163 {
1164  return true;
1165 }
1166 
1167 
1168 
1169 template <typename Number>
1170 inline
1171 typename Vector<Number>::iterator
1173 {
1174  return &val[0];
1175 }
1176 
1177 
1178 
1179 template <typename Number>
1180 inline
1181 typename Vector<Number>::const_iterator
1182 Vector<Number>::begin () const
1183 {
1184  return &val[0];
1185 }
1186 
1187 
1188 
1189 template <typename Number>
1190 inline
1191 typename Vector<Number>::iterator
1193 {
1194  return &val[vec_size];
1195 }
1196 
1197 
1198 
1199 template <typename Number>
1200 inline
1201 typename Vector<Number>::const_iterator
1202 Vector<Number>::end () const
1203 {
1204  return &val[vec_size];
1205 }
1206 
1207 
1208 
1209 template <typename Number>
1210 inline
1211 Number Vector<Number>::operator() (const size_type i) const
1212 {
1213  Assert (i<vec_size, ExcIndexRange(i,0,vec_size));
1214  return val[i];
1215 }
1216 
1217 
1218 
1219 template <typename Number>
1220 inline
1221 Number &Vector<Number>::operator() (const size_type i)
1222 {
1223  Assert (i<vec_size, ExcIndexRangeType<size_type>(i,0,vec_size));
1224  return val[i];
1225 }
1226 
1227 
1228 
1229 template <typename Number>
1230 inline
1231 Number Vector<Number>::operator[] (const size_type i) const
1232 {
1233  return operator()(i);
1234 }
1235 
1236 
1237 
1238 template <typename Number>
1239 inline
1240 Number &Vector<Number>::operator[] (const size_type i)
1241 {
1242  return operator()(i);
1243 }
1244 
1245 
1246 
1247 template <typename Number>
1248 template <typename OtherNumber>
1249 inline
1250 void Vector<Number>::extract_subvector_to (const std::vector<size_type> &indices,
1251  std::vector<OtherNumber> &values) const
1252 {
1253  for (size_type i = 0; i < indices.size(); ++i)
1254  values[i] = operator()(indices[i]);
1255 }
1256 
1257 
1258 
1259 template <typename Number>
1260 template <typename ForwardIterator, typename OutputIterator>
1261 inline
1262 void Vector<Number>::extract_subvector_to (ForwardIterator indices_begin,
1263  const ForwardIterator indices_end,
1264  OutputIterator values_begin) const
1265 {
1266  while (indices_begin != indices_end)
1267  {
1268  *values_begin = operator()(*indices_begin);
1269  indices_begin++;
1270  values_begin++;
1271  }
1272 }
1273 
1274 
1275 
1276 template <typename Number>
1277 inline
1279 Vector<Number>::operator /= (const Number factor)
1280 {
1281  AssertIsFinite(factor);
1282  Assert (factor != Number(0.), ExcZero() );
1283 
1284  this->operator *= (Number(1.)/factor);
1285  return *this;
1286 }
1287 
1288 
1289 
1290 template <typename Number>
1291 template <typename OtherNumber>
1292 inline
1293 void
1294 Vector<Number>::add (const std::vector<size_type> &indices,
1295  const std::vector<OtherNumber> &values)
1296 {
1297  Assert (indices.size() == values.size(),
1298  ExcDimensionMismatch(indices.size(), values.size()));
1299  add (indices.size(), &indices[0], &values[0]);
1300 }
1301 
1302 
1303 
1304 template <typename Number>
1305 template <typename OtherNumber>
1306 inline
1307 void
1308 Vector<Number>::add (const std::vector<size_type> &indices,
1309  const Vector<OtherNumber> &values)
1310 {
1311  Assert (indices.size() == values.size(),
1312  ExcDimensionMismatch(indices.size(), values.size()));
1313  add (indices.size(), &indices[0], values.val);
1314 }
1315 
1316 
1317 
1318 template <typename Number>
1319 template <typename OtherNumber>
1320 inline
1321 void
1322 Vector<Number>::add (const size_type n_indices,
1323  const size_type *indices,
1324  const OtherNumber *values)
1325 {
1326  for (size_type i=0; i<n_indices; ++i)
1327  {
1328  Assert (indices[i] < vec_size, ExcIndexRange(indices[i],0,vec_size));
1329  Assert (numbers::is_finite(values[i]),
1330  ExcMessage("The given value is not finite but either infinite or Not A Number (NaN)"));
1331 
1332  val[indices[i]] += values[i];
1333  }
1334 }
1335 
1336 
1337 
1338 template <typename Number>
1339 template <typename Number2>
1340 inline
1341 bool
1343 {
1344  return ! (*this == v);
1345 }
1346 
1347 
1348 
1349 template <typename Number>
1350 inline
1351 void
1352 Vector<Number>::compress (::VectorOperation::values) const
1353 {}
1354 
1355 
1356 
1357 template <typename Number>
1358 inline
1359 void
1361 {}
1362 
1363 
1364 
1365 // Moved from vector.templates.h as an inline function by Luca Heltai
1366 // on 2009/04/12 to prevent strange compiling errors, after making
1367 // swap virtual.
1368 template <typename Number>
1369 inline
1370 void
1372 {
1373  std::swap (vec_size, v.vec_size);
1374  std::swap (max_vec_size, v.max_vec_size);
1375  std::swap (val, v.val);
1376 }
1377 
1378 
1379 
1380 template <typename Number>
1381 template <class Archive>
1382 inline
1383 void
1384 Vector<Number>::save (Archive &ar, const unsigned int) const
1385 {
1386  // forward to serialization function in the base class.
1387  ar &static_cast<const Subscriptor &>(*this);
1388 
1389  ar &vec_size &max_vec_size ;
1390  ar &boost::serialization::make_array(val, max_vec_size);
1391 }
1392 
1393 
1394 
1395 template <typename Number>
1396 template <class Archive>
1397 inline
1398 void
1399 Vector<Number>::load (Archive &ar, const unsigned int)
1400 {
1401  // get rid of previous content
1402  deallocate();
1403 
1404  // the load stuff again from the archive
1405  ar &static_cast<Subscriptor &>(*this);
1406  ar &vec_size &max_vec_size ;
1407 
1408  allocate();
1409  ar &boost::serialization::make_array(val, max_vec_size);
1410 }
1411 
1412 #endif
1413 
1414 
1428 template <typename Number>
1429 inline
1431 {
1432  u.swap (v);
1433 }
1434 
1435 
1439 template <typename number>
1440 inline
1441 std::ostream &
1442 operator << (std::ostream &os, const Vector<number> &v)
1443 {
1444  v.print(os);
1445  return os;
1446 }
1447 
1451 template <typename number>
1452 inline
1453 LogStream &
1454 operator << (LogStream &os, const Vector<number> &v)
1455 {
1456  v.print(os);
1457  return os;
1458 }
1459 
1460 
1463 DEAL_II_NAMESPACE_CLOSE
1464 
1465 #endif
void update_ghost_values() const
Number value_type
Definition: vector.h:116
Number operator[](const size_type i) const
bool operator!=(const Vector< Number2 > &v) const
void load(Archive &ar, const unsigned int version)
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< OtherNumber > &values) const
Number operator()(const size_type i) const
::ExceptionBase & ExcMessage(std::string arg1)
STL namespace.
iterator end()
Vector< Number > & operator=(const Number s)
void allocate()
bool is_finite(const double x)
Definition: numbers.h:255
size_type max_vec_size
Definition: vector.h:979
BlockDynamicSparsityPattern BlockCompressedSparsityPattern DEAL_II_DEPRECATED
void add(const std::vector< size_type > &indices, const std::vector< OtherNumber > &values)
numbers::NumberTraits< Number >::real_type real_type
Definition: vector.h:134
bool in_local_range(const size_type global_index) const
unsigned int global_dof_index
Definition: types.h:88
#define Assert(cond, exc)
Definition: exceptions.h:294
std::size_t size() const
virtual ~Vector()
Vector< Number > & operator*=(const Number factor)
iterator begin()
void print(const char *format=0) const DEAL_II_DEPRECATED
void deallocate()
void swap(Vector< Number > &u, Vector< Number > &v)
Definition: vector.h:1430
virtual void swap(Vector< Number > &v)
Vector< Number > & operator/=(const Number factor)
void save(Archive &ar, const unsigned int version) const
void compress(::VectorOperation::values operation=::VectorOperation::unknown) const
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
size_type vec_size
Definition: vector.h:971
Number * val
Definition: vector.h:984
#define AssertIsFinite(number)
Definition: exceptions.h:1096