deal.II version GIT relicensing-6809-ge913b9bb34 2026-09-25 17:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
vector.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 1999 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_vector_h
14#define dealii_vector_h
15
16
17#include <deal.II/base/config.h>
18
23
28
29#include <boost/serialization/split_member.hpp>
30
31#include <algorithm>
32#include <initializer_list>
33#include <iosfwd>
34#include <vector>
35
37
38
39// Forward declarations
40#ifndef DOXYGEN
41# ifdef DEAL_II_WITH_PETSC
42namespace PETScWrappers
43{
44 class VectorBase;
45}
46# endif
47
48template <typename number>
50
51template <typename>
52class BlockVector;
53
54namespace parallel
55{
56 namespace internal
57 {
58 class TBBPartitioner;
59 }
60} // namespace parallel
61#endif
62
63
95template <typename Number>
96class Vector : public ReadVector<Number>
97{
98public:
106 static_assert(
107 std::is_arithmetic_v<typename numbers::NumberTraits<Number>::real_type>,
108 "The Vector class only supports basic numeric types. In particular, it "
109 "does not support automatically differentiated numbers.");
110
115 using value_type = Number;
117 using const_pointer = const value_type *;
119 using const_iterator = const value_type *;
123
134
143
154
159 Vector(Vector<Number> &&v) noexcept = default;
160
169 template <typename OtherNumber>
170 explicit Vector(const Vector<OtherNumber> &v);
171
187 template <typename OtherNumber>
188 explicit Vector(const std::initializer_list<OtherNumber> &v);
189
190#ifdef DEAL_II_WITH_PETSC
203#endif
204
205#ifdef DEAL_II_TRILINOS_WITH_EPETRA
221#endif
222
223#ifdef DEAL_II_TRILINOS_WITH_TPETRA
238 template <typename OtherNumber, typename MemorySpace>
239 explicit Vector(
241#endif
242
252 explicit Vector(const size_type n);
253
258 template <typename InputIterator>
259 Vector(const InputIterator first, const InputIterator last);
260
265 virtual ~Vector() override = default;
266
267
271 bool
272 empty() const;
273
287 void
289
305 virtual void
306 reinit(const size_type N, const bool omit_zeroing_entries = false);
307
331 void
333
341 void
342 apply_givens_rotation(const std::array<Number, 3> &csr,
343 const size_type i,
344 const size_type k);
345
353 template <typename Number2>
354 void
355 reinit(const Vector<Number2> &V, const bool omit_zeroing_entries = false);
356
372 virtual void
373 swap(Vector<Number> &v) noexcept;
374
386 operator=(const Number s);
387
395
402 operator=(Vector<Number> &&v) noexcept = default;
403
409 template <typename Number2>
412
418
419#ifdef DEAL_II_WITH_PETSC
433#endif
434
435
436#ifdef DEAL_II_TRILINOS_WITH_EPETRA
454#endif
455
456#ifdef DEAL_II_TRILINOS_WITH_TPETRA
472 template <typename OtherNumber, typename MemorySpace>
476#endif
477
483 template <typename Number2>
484 bool
486
492 template <typename Number2>
493 bool
495
517 template <typename Number2>
518 Number
519 operator*(const Vector<Number2> &V) const;
520
529 norm_sqr() const;
530
538 Number
539 mean_value() const;
540
549 l1_norm() const;
550
560 l2_norm() const;
561
571 lp_norm(const real_type p) const;
572
577 linfty_norm() const;
578
603 Number
604 add_and_dot(const Number a, const Vector<Number> &V, const Vector<Number> &W);
605
617 pointer
619
624 data() const;
625
633
638 begin() const;
639
645
651 end() const;
652
656 Number
657 operator()(const size_type i) const;
658
662 Number &
664
670 Number
671 operator[](const size_type i) const;
672
678 Number &
680
696 template <typename OtherNumber>
697 void
698 extract_subvector_to(const std::vector<size_type> &indices,
699 std::vector<OtherNumber> &values) const;
700
704 virtual void
706 const ArrayView<Number> &elements) const override;
707
735 template <typename ForwardIterator, typename OutputIterator>
736 void
737 extract_subvector_to(ForwardIterator indices_begin,
738 const ForwardIterator indices_end,
739 OutputIterator values_begin) const;
755
763
768 template <typename OtherNumber>
769 void
770 add(const std::vector<size_type> &indices,
771 const std::vector<OtherNumber> &values);
772
777 template <typename OtherNumber>
778 void
779 add(const std::vector<size_type> &indices, const Vector<OtherNumber> &values);
780
786 template <typename OtherNumber>
787 void
788 add(const size_type n_elements,
789 const size_type *indices,
790 const OtherNumber *values);
791
798 void
799 add(const Number s);
800
806 void
807 add(const Number a,
808 const Vector<Number> &V,
809 const Number b,
810 const Vector<Number> &W);
811
817 void
818 add(const Number a, const Vector<Number> &V);
819
825 void
826 sadd(const Number s, const Vector<Number> &V);
827
833 void
834 sadd(const Number s, const Number a, const Vector<Number> &V);
835
842 operator*=(const Number factor);
843
850 operator/=(const Number factor);
851
859 void
860 scale(const Vector<Number> &scaling_factors);
861
867 template <typename Number2>
868 void
869 scale(const Vector<Number2> &scaling_factors);
870
876 void
877 equ(const Number a, const Vector<Number> &u);
878
882 template <typename Number2>
883 void
884 equ(const Number a, const Vector<Number2> &u);
885
890 void
905 void
906 print(std::ostream &out,
907 const unsigned int precision = 3,
908 const bool scientific = true,
909 const bool across = true) const;
910
916 void
917 block_write(std::ostream &out) const;
918
930 void
931 block_read(std::istream &in);
932
938 template <class Archive>
939 void
940 save(Archive &ar, const unsigned int version) const;
941
947 template <class Archive>
948 void
949 load(Archive &ar, const unsigned int version);
950
951#ifdef DOXYGEN
957 template <class Archive>
958 void
959 serialize(Archive &archive, const unsigned int version);
960#else
961 // This macro defines the serialize() method that is compatible with
962 // the templated save() and load() method that have been implemented.
963 BOOST_SERIALIZATION_SPLIT_MEMBER()
964#endif
965
980 bool
981 in_local_range(const size_type global_index) const;
982
1000
1004 virtual size_type
1005 size() const override;
1006
1014 size_type
1016
1022 bool
1023 all_zero() const;
1024
1034 bool
1036
1041 std::size_t
1043
1049 bool
1051
1057 void
1059
1067 MPI_Comm
1071private:
1076
1082 void
1084
1088 void
1089 do_reinit(const size_type new_size,
1090 const bool omit_zeroing_entries,
1091 const bool reset_partitioner);
1092
1097 mutable std::shared_ptr<parallel::internal::TBBPartitioner>
1099
1100 // Make all other vector types friends.
1101 template <typename Number2>
1102 friend class Vector;
1103};
1104
1106/*----------------------- Inline functions ----------------------------------*/
1107
1108
1109#ifndef DOXYGEN
1110
1111
1112//------------------------ declarations for explicit specializations
1113template <>
1115Vector<int>::lp_norm(const real_type) const;
1116
1117
1118//------------------------ inline functions
1119
1120template <typename Number>
1122{
1123 // virtual functions called in constructors and destructors never use the
1124 // override in a derived class
1125 // for clarity be explicit on which function is called
1127}
1128
1129
1130
1131template <typename Number>
1132template <typename OtherNumber>
1133Vector<Number>::Vector(const std::initializer_list<OtherNumber> &v)
1134 : Vector(v.begin(), v.end())
1135{}
1136
1137
1138
1139template <typename Number>
1140template <typename InputIterator>
1141Vector<Number>::Vector(const InputIterator first, const InputIterator last)
1142{
1143 // allocate memory. do not initialize it, as we will copy over to it in a
1144 // second
1145 reinit(std::distance(first, last), true);
1146 std::copy(first, last, begin());
1147}
1148
1149
1150
1151template <typename Number>
1152inline Vector<Number>::Vector(const size_type n)
1153{
1154 // virtual functions called in constructors and destructors never use the
1155 // override in a derived class
1156 // for clarity be explicit on which function is called
1157 Vector<Number>::reinit(n, false);
1158}
1159
1160
1161
1162template <typename Number>
1163inline typename Vector<Number>::size_type
1165{
1166 return values.size();
1167}
1168
1169
1170
1171template <typename Number>
1172inline typename Vector<Number>::size_type
1174{
1175 return values.size();
1176}
1177
1178
1179
1180template <typename Number>
1181inline bool
1183{
1184 return true;
1185}
1186
1187
1188
1189template <typename Number>
1190inline typename Vector<Number>::pointer
1192{
1193 return values.data();
1194}
1195
1196
1197
1198template <typename Number>
1199inline typename Vector<Number>::const_pointer
1201{
1202 return values.data();
1203}
1204
1205
1206
1207template <typename Number>
1208inline typename Vector<Number>::iterator
1210{
1211 return values.begin();
1212}
1213
1214
1215
1216template <typename Number>
1217inline typename Vector<Number>::const_iterator
1219{
1220 return values.begin();
1221}
1222
1223
1224
1225template <typename Number>
1226inline typename Vector<Number>::iterator
1228{
1229 return values.end();
1230}
1231
1232
1233
1234template <typename Number>
1235inline typename Vector<Number>::const_iterator
1236Vector<Number>::end() const
1237{
1238 return values.end();
1239}
1240
1241
1242
1243template <typename Number>
1244inline Number
1246{
1247 AssertIndexRange(i, size());
1248 return values[i];
1249}
1250
1251
1252
1253template <typename Number>
1254inline Number &
1256{
1257 AssertIndexRange(i, size());
1258 return values[i];
1259}
1260
1261
1262
1263template <typename Number>
1264inline Number
1266{
1267 return operator()(i);
1268}
1269
1270
1271
1272template <typename Number>
1273inline Number &
1275{
1276 return operator()(i);
1277}
1278
1279
1280
1281template <typename Number>
1282template <typename OtherNumber>
1283inline void
1284Vector<Number>::extract_subvector_to(const std::vector<size_type> &indices,
1285 std::vector<OtherNumber> &values) const
1286{
1287 for (size_type i = 0; i < indices.size(); ++i)
1288 values[i] = operator()(indices[i]);
1289}
1290
1291
1292
1293template <typename Number>
1294template <typename ForwardIterator, typename OutputIterator>
1295inline void
1296Vector<Number>::extract_subvector_to(ForwardIterator indices_begin,
1297 const ForwardIterator indices_end,
1298 OutputIterator values_begin) const
1299{
1300 while (indices_begin != indices_end)
1301 {
1302 *values_begin = operator()(*indices_begin);
1303 ++indices_begin;
1304 ++values_begin;
1305 }
1306}
1307
1308
1309
1310template <typename Number>
1311inline Vector<Number> &
1312Vector<Number>::operator/=(const Number factor)
1313{
1314 AssertIsFinite(factor);
1315 Assert(factor != Number(0.), ExcZero());
1316
1317 this->operator*=(Number(1.) / factor);
1318 return *this;
1319}
1320
1321
1322
1323template <typename Number>
1324template <typename OtherNumber>
1325inline void
1326Vector<Number>::add(const std::vector<size_type> &indices,
1327 const std::vector<OtherNumber> &values)
1328{
1329 Assert(indices.size() == values.size(),
1330 ExcDimensionMismatch(indices.size(), values.size()));
1331 add(indices.size(), indices.data(), values.data());
1332}
1333
1334
1335
1336template <typename Number>
1337template <typename OtherNumber>
1338inline void
1339Vector<Number>::add(const std::vector<size_type> &indices,
1341{
1342 Assert(indices.size() == values.size(),
1343 ExcDimensionMismatch(indices.size(), values.size()));
1344 add(indices.size(), indices.data(), values.values.begin());
1345}
1346
1347
1348
1349template <typename Number>
1350template <typename OtherNumber>
1351inline void
1352Vector<Number>::add(const size_type n_indices,
1353 const size_type *indices,
1354 const OtherNumber *values)
1355{
1356 for (size_type i = 0; i < n_indices; ++i)
1357 {
1358 AssertIndexRange(indices[i], size());
1359 Assert(
1361 ExcMessage(
1362 "The given value is not finite but either infinite or Not A Number (NaN)"));
1363
1364 this->values[indices[i]] += values[i];
1365 }
1366}
1367
1368
1369
1370template <typename Number>
1371template <typename Number2>
1372inline bool
1374{
1375 return !(*this == v);
1376}
1377
1378
1379template <typename Number>
1380inline bool
1382{
1383 return this->size() == 0;
1384}
1385
1386template <typename Number>
1387inline void
1389{}
1390
1391
1392
1393template <typename Number>
1394inline bool
1396{
1397 return false;
1398}
1399
1400
1401
1402template <typename Number>
1403inline void
1405{}
1406
1407
1408
1409template <typename Number>
1410inline void
1412{}
1413
1414
1415
1416template <typename Number>
1417inline MPI_Comm
1419{
1420 return MPI_COMM_SELF;
1421}
1422
1423
1424template <typename Number>
1425template <typename Number2>
1426inline void
1428 const bool omit_zeroing_entries)
1429{
1430 // go to actual reinit functions in case we need to change something with
1431 // the vector, else there is nothing to be done
1432 if (!omit_zeroing_entries || size() != v.size())
1433 {
1434 do_reinit(v.size(), omit_zeroing_entries, false);
1436 }
1437}
1438
1439
1440
1441// Moved from vector.templates.h as an inline function by Luca Heltai
1442// on 2009/04/12 to prevent strange compiling errors, after making
1443// swap virtual.
1444template <typename Number>
1445inline void
1447{
1448 values.swap(v.values);
1450}
1451
1452
1453
1454template <typename Number>
1455template <class Archive>
1456inline void
1457Vector<Number>::save(Archive &ar, const unsigned int) const
1458{
1459 // forward to serialization function in the base class.
1460 ar &static_cast<const EnableObserverPointer &>(*this);
1461 ar &values;
1462}
1463
1464
1465
1466template <typename Number>
1467template <class Archive>
1468inline void
1469Vector<Number>::load(Archive &ar, const unsigned int)
1470{
1471 // the load stuff again from the archive
1472 ar &static_cast<EnableObserverPointer &>(*this);
1473 ar &values;
1475}
1476
1477#endif
1478
1479
1493template <typename Number>
1494inline void
1496{
1497 u.swap(v);
1498}
1499
1500
1508template <typename number>
1509inline std::ostream &
1510operator<<(std::ostream &out, const Vector<number> &v)
1511{
1512 Assert(v.size() != 0, ExcEmptyObject());
1513 AssertThrow(out.fail() == false, ExcIO());
1514
1515 for (typename Vector<number>::size_type i = 0; i < v.size() - 1; ++i)
1516 out << v(i) << ' ';
1517 out << v(v.size() - 1);
1518
1519 AssertThrow(out.fail() == false, ExcIO());
1520
1521 return out;
1522}
1523
1532template <typename Number>
1533struct is_serial_vector<Vector<Number>> : std::true_type
1534{};
1535
1536
1538
1539#endif
*  iterator end()
*  *  iterator begin()
*  *  Point< dim > operator()(const Point< dim > &p) const * 
iterator end()
iterator begin()
pointer data()
void swap(AlignedVector< T > &vec) noexcept
size_type size() const
Vector< Number > & operator=(const PETScWrappers::VectorBase &v)
typename numbers::NumberTraits< Number >::real_type real_type
Definition vector.h:133
Number & operator[](const size_type i)
void extract_subvector_to(ForwardIterator indices_begin, const ForwardIterator indices_end, OutputIterator values_begin) const
bool operator!=(const Vector< Number2 > &v) const
const value_type * const_pointer
Definition vector.h:117
void scale(const Vector< Number2 > &scaling_factors)
bool has_ghost_elements() const
void add(const std::vector< size_type > &indices, const std::vector< OtherNumber > &values)
void add(const Number a, const Vector< Number > &V, const Number b, const Vector< Number > &W)
Vector(const TrilinosWrappers::MPI::Vector &v)
Number & operator()(const size_type i)
Vector< Number > & operator=(const TrilinosWrappers::MPI::Vector &v)
bool in_local_range(const size_type global_index) const
Vector< Number > & operator=(const Number s)
Number operator*(const Vector< Number2 > &V) const
const_pointer data() const
void do_reinit(const size_type new_size, const bool omit_zeroing_entries, const bool reset_partitioner)
void add(const Number s)
Vector< Number > & operator=(const BlockVector< Number > &v)
void sadd(const Number s, const Number a, const Vector< Number > &V)
Vector(const size_type n)
Vector< Number > & operator=(Vector< Number > &&v) noexcept=default
const value_type * const_iterator
Definition vector.h:119
void block_write(std::ostream &out) const
Number mean_value() const
Number add_and_dot(const Number a, const Vector< Number > &V, const Vector< Number > &W)
void load(Archive &ar, const unsigned int version)
const value_type & const_reference
Definition vector.h:121
MPI_Comm get_mpi_communicator() const
pointer data()
void reinit(const Vector< Number2 > &V, const bool omit_zeroing_entries=false)
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
Vector(const Vector< Number > &v)
std::shared_ptr< parallel::internal::TBBPartitioner > thread_loop_partitioner
Definition vector.h:1098
void block_read(std::istream &in)
types::global_dof_index size_type
Definition vector.h:122
Number operator[](const size_type i) const
Vector< Number > & operator*=(const Number factor)
virtual size_type size() const override
void equ(const Number a, const Vector< Number > &u)
void zero_out_ghost_values() const
void serialize(Archive &archive, const unsigned int version)
Vector(const PETScWrappers::VectorBase &v)
bool empty() const
real_type lp_norm(const real_type p) const
const_iterator begin() const
void sadd(const Number s, const Vector< Number > &V)
bool operator==(const Vector< Number2 > &v) const
iterator end()
friend class Vector
Definition vector.h:1102
Vector(const LinearAlgebra::TpetraWrappers::Vector< OtherNumber, MemorySpace > &v)
real_type l2_norm() const
value_type * pointer
Definition vector.h:116
virtual void extract_subvector_to(const ArrayView< const types::global_dof_index > &indices, const ArrayView< Number > &elements) const override
void grow_or_shrink(const size_type N)
virtual ~Vector() override=default
Vector(const Vector< OtherNumber > &v)
void save(Archive &ar, const unsigned int version) const
real_type linfty_norm() const
Vector< Number > & operator=(const Vector< Number > &v)
Vector< Number > & operator+=(const Vector< Number > &V)
void scale(const Vector< Number > &scaling_factors)
void maybe_reset_thread_partitioner()
IndexSet locally_owned_elements() const
real_type norm_sqr() const
void add(const Number a, const Vector< Number > &V)
AlignedVector< Number > values
Definition vector.h:1075
void equ(const Number a, const Vector< Number2 > &u)
Vector< Number > & operator=(const Vector< Number2 > &v)
void apply_givens_rotation(const std::array< Number, 3 > &csr, const size_type i, const size_type k)
const_iterator end() const
Vector(Vector< Number > &&v) noexcept=default
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
value_type * iterator
Definition vector.h:118
void add(const size_type n_elements, const size_type *indices, const OtherNumber *values)
size_type locally_owned_size() const
Number operator()(const size_type i) const
virtual void swap(Vector< Number > &v) noexcept
void compress(VectorOperation::values operation=VectorOperation::unknown) const
bool is_non_negative() const
value_type & reference
Definition vector.h:120
Vector< Number > & operator-=(const Vector< Number > &V)
Vector< Number > & operator=(const LinearAlgebra::TpetraWrappers::Vector< OtherNumber, MemorySpace > &v)
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< OtherNumber > &values) const
void update_ghost_values() const
bool all_zero() const
std::size_t memory_consumption() const
real_type l1_norm() const
void add(const std::vector< size_type > &indices, const Vector< OtherNumber > &values)
Number value_type
Definition vector.h:115
iterator begin()
Vector(const InputIterator first, const InputIterator last)
Vector(const std::initializer_list< OtherNumber > &v)
Vector< Number > & operator/=(const Number factor)
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
Point< 2 > first
Definition grid_out.cc:4639
static ::ExceptionBase & ExcIO()
static ::ExceptionBase & ExcZero()
static ::ExceptionBase & ExcEmptyObject()
#define Assert(cond, exc)
#define AssertIsFinite(number)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
std::ostream & operator<<(std::ostream &out, const Vector< number > &v)
Definition vector.h:1510
void swap(Vector< Number > &u, Vector< Number > &v) noexcept
Definition vector.h:1495
std::size_t size
Definition mpi.cc:733
*  *  *  RotationFunction< dim, Number >::RotationFunction Number(dim)
bool is_finite(const double x)
Definition numbers.h:508
unsigned int global_dof_index
Definition types.h:92