16 #ifndef dealii_vector_h 17 #define dealii_vector_h 20 #include <deal.II/base/config.h> 22 #include <deal.II/base/exceptions.h> 23 #include <deal.II/base/index_set.h> 24 #include <deal.II/base/logstream.h> 25 #include <deal.II/base/subscriptor.h> 27 #include <deal.II/differentiation/ad/ad_number_traits.h> 29 #include <deal.II/lac/vector_operation.h> 30 #include <deal.II/lac/vector_type_traits.h> 34 #include <boost/version.hpp> 35 #if BOOST_VERSION >= 106400 36 # include <boost/serialization/array_wrapper.hpp> 38 # include <boost/serialization/array.hpp> 40 #include <boost/serialization/split_member.hpp> 47 DEAL_II_NAMESPACE_OPEN
50 #ifdef DEAL_II_WITH_PETSC 57 #ifdef DEAL_II_WITH_TRILINOS 67 template <
typename number>
109 template <
typename Number>
117 "The Vector class does not support auto-differentiable numbers.");
160 Vector(
const Vector<Number> &v);
166 Vector(Vector<Number> &&v) noexcept;
180 template <typename OtherNumber>
181 explicit Vector(const Vector<OtherNumber> &v);
183 #ifdef DEAL_II_WITH_PETSC 198 #ifdef DEAL_II_WITH_TRILINOS 225 explicit Vector(
const size_type n);
231 template <
typename InputIterator>
232 Vector(
const InputIterator first,
const InputIterator last);
238 virtual ~Vector()
override =
default;
273 reinit(
const size_type N,
const bool omit_zeroing_entries =
false);
299 grow_or_shrink(
const size_type N);
308 template <
typename Number2>
310 reinit(
const Vector<Number2> &V,
const bool omit_zeroing_entries =
false);
328 swap(Vector<Number> &v);
344 operator=(
const Number s);
352 operator=(
const Vector<Number> &v);
360 operator=(Vector<Number> &&v) noexcept;
367 template <typename Number2>
369 operator=(const Vector<Number2> &v);
377 #ifdef DEAL_II_WITH_PETSC 394 #ifdef DEAL_II_WITH_TRILINOS 419 template <
typename Number2>
421 operator==(
const Vector<Number2> &v)
const;
428 template <
typename Number2>
430 operator!=(
const Vector<Number2> &v)
const;
453 template <
typename Number2>
454 Number
operator*(
const Vector<Number2> &V)
const;
539 add_and_dot(
const Number a,
const Vector<Number> &V,
const Vector<Number> &W);
580 operator()(
const size_type i)
const;
586 operator()(
const size_type i);
593 Number operator[](
const size_type i)
const;
600 Number &operator[](
const size_type i);
617 template <
typename OtherNumber>
619 extract_subvector_to(
const std::vector<size_type> &indices,
620 std::vector<OtherNumber> & values)
const;
649 template <
typename ForwardIterator,
typename OutputIterator>
651 extract_subvector_to(ForwardIterator indices_begin,
652 const ForwardIterator indices_end,
653 OutputIterator values_begin)
const;
668 operator+=(
const Vector<Number> &V);
676 operator-=(
const Vector<Number> &V);
682 template <
typename OtherNumber>
684 add(
const std::vector<size_type> & indices,
685 const std::vector<OtherNumber> &values);
691 template <
typename OtherNumber>
693 add(
const std::vector<size_type> &indices,
const Vector<OtherNumber> &values);
700 template <
typename OtherNumber>
702 add(
const size_type n_elements,
703 const size_type * indices,
704 const OtherNumber *values);
722 const Vector<Number> &V,
724 const Vector<Number> &W);
732 add(
const Number a,
const Vector<Number> &V);
740 sadd(
const Number s,
const Vector<Number> &V);
748 sadd(
const Number s,
const Number a,
const Vector<Number> &V);
756 operator*=(
const Number factor);
764 operator/=(
const Number factor);
774 scale(
const Vector<Number> &scaling_factors);
781 template <
typename Number2>
783 scale(
const Vector<Number2> &scaling_factors);
791 equ(
const Number a,
const Vector<Number> &u);
796 template <
typename Number2>
798 equ(
const Number a,
const Vector<Number2> &u);
814 ratio(
const Vector<Number> &a,
const Vector<Number> &b);
821 update_ghost_values()
const;
837 print(
const char *format =
nullptr)
const;
846 print(std::ostream & out,
847 const unsigned int precision = 3,
848 const bool scientific =
true,
849 const bool across =
true)
const;
862 const unsigned int width = 6,
863 const bool across =
true)
const;
871 block_write(std::ostream &out)
const;
885 block_read(std::istream &in);
891 template <
class Archive>
893 save(Archive &ar,
const unsigned int version)
const;
899 template <
class Archive>
901 load(Archive &ar,
const unsigned int version);
903 BOOST_SERIALIZATION_SPLIT_MEMBER()
920 in_local_range(const size_type global_index) const;
938 locally_owned_elements() const;
964 is_non_negative() const;
971 memory_consumption() const;
987 size_type max_vec_size;
996 std::unique_ptr<Number[], decltype(&free)> values;
1003 thread_loop_partitioner;
1008 template <typename Number2>
1009 friend class Vector;
1014 template <typename Number2>
1029 allocate(const size_type copy_n_el = 0);
1047 template <
typename Number>
1051 , values(nullptr, &free)
1061 template <
typename Number>
1062 template <
typename InputIterator>
1066 , values(nullptr, &free)
1070 reinit(std::distance(first, last),
true);
1071 std::copy(first, last,
begin());
1076 template <
typename Number>
1080 , values(nullptr, &free)
1090 template <
typename Number>
1091 inline typename Vector<Number>::size_type
1098 template <
typename Number>
1107 template <
typename Number>
1108 inline typename Vector<Number>::iterator
1111 return values.get();
1116 template <
typename Number>
1117 inline typename Vector<Number>::const_iterator
1120 return values.get();
1125 template <
typename Number>
1126 inline typename Vector<Number>::iterator
1134 template <
typename Number>
1135 inline typename Vector<Number>::const_iterator
1143 template <
typename Number>
1153 template <
typename Number>
1157 Assert(i < vec_size, ExcIndexRangeType<size_type>(i, 0, vec_size));
1163 template <
typename Number>
1171 template <
typename Number>
1179 template <
typename Number>
1180 template <
typename OtherNumber>
1183 std::vector<OtherNumber> & values)
const 1185 for (size_type i = 0; i < indices.size(); ++i)
1186 values[i] =
operator()(indices[i]);
1191 template <
typename Number>
1192 template <
typename ForwardIterator,
typename OutputIterator>
1195 const ForwardIterator indices_end,
1196 OutputIterator values_begin)
const 1198 while (indices_begin != indices_end)
1208 template <
typename Number>
1209 inline Vector<Number> &
1221 template <
typename Number>
1222 template <
typename OtherNumber>
1225 const std::vector<OtherNumber> &values)
1227 Assert(indices.size() == values.size(),
1229 add(indices.size(), indices.data(), values.data());
1234 template <
typename Number>
1235 template <
typename OtherNumber>
1238 const Vector<OtherNumber> & values)
1240 Assert(indices.size() == values.size(),
1242 add(indices.size(), indices.data(), values.values.get());
1247 template <
typename Number>
1248 template <
typename OtherNumber>
1251 const size_type * indices,
1252 const OtherNumber *values)
1254 for (size_type i = 0; i < n_indices; ++i)
1260 "The given value is not finite but either infinite or Not A Number (NaN)"));
1262 this->values[indices[i]] += values[i];
1268 template <
typename Number>
1269 template <
typename Number2>
1273 return !(*
this == v);
1278 template <
typename Number>
1284 template <
typename Number>
1294 template <
typename Number>
1299 std::swap(max_vec_size, v.max_vec_size);
1305 template <
typename Number>
1306 template <
class Archive>
1314 ar & boost::serialization::make_array(values.get(),
max_vec_size);
1319 template <
typename Number>
1320 template <
class Archive>
1332 ar &boost::serialization::make_array(values.get(),
max_vec_size);
1351 template <
typename Number>
1362 template <
typename number>
1363 inline std::ostream &
1364 operator<<(std::ostream &os, const Vector<number> &v)
1373 template <
typename number>
1375 operator<<(LogStream &os, const Vector<number> &v)
1389 template <
typename Number>
1394 DEAL_II_NAMESPACE_CLOSE
real_type lp_norm(const real_type p) const
void load(Archive &ar, const unsigned int version)
typename numbers::NumberTraits< typename VectorType::value_type >::real_type real_type
void swap(VectorBase &u, VectorBase &v)
bool in_local_range(const size_type global_index) const
void compress(::VectorOperation::values operation=::VectorOperation::unknown) const
void update_ghost_values() const
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
SymmetricTensor< rank_, dim, Number > operator*(const SymmetricTensor< rank_, dim, Number > &t, const Number &factor)
unsigned long long int global_dof_index
bool is_finite(const double x)
void allocate(const size_type copy_n_el=0)
void add(const std::vector< size_type > &indices, const std::vector< OtherNumber > &values)
static::ExceptionBase & ExcMessage(std::string arg1)
typename VectorType::value_type value_type
#define Assert(cond, exc)
static::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
Number operator[](const size_type i) const
bool operator!=(const Vector< Number2 > &v) const
Vector< Number > & operator*=(const Number factor)
void swap(Vector< Number > &u, Vector< Number > &v)
virtual void swap(Vector< Number > &v)
Vector< Number > & operator/=(const Number factor)
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< OtherNumber > &values) const
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
void save(Archive &ar, const unsigned int version) const
Number operator()(const size_type i) const
static::ExceptionBase & ExcZero()
#define AssertIsFinite(number)