Reference documentation for deal.II version 9.1.0-pre
la_vector.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2015 - 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.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_la_vector_h
17 #define dealii_la_vector_h
18 
19 
20 #include <deal.II/base/config.h>
21 
22 #include <deal.II/base/exceptions.h>
23 #include <deal.II/base/index_set.h>
24 #include <deal.II/base/logstream.h>
25 
26 #include <deal.II/lac/read_write_vector.h>
27 #include <deal.II/lac/vector_operation.h>
28 #include <deal.II/lac/vector_space_vector.h>
29 #include <deal.II/lac/vector_type_traits.h>
30 
31 // boost::serialization::make_array used to be in array.hpp, but was
32 // moved to a different file in BOOST 1.64
33 #include <boost/version.hpp>
34 #if BOOST_VERSION >= 106400
35 # include <boost/serialization/array_wrapper.hpp>
36 #else
37 # include <boost/serialization/array.hpp>
38 #endif
39 #include <boost/serialization/split_member.hpp>
40 
41 #include <cstdio>
42 #include <cstring>
43 #include <iostream>
44 #include <vector>
45 
46 
47 DEAL_II_NAMESPACE_OPEN
48 
49 namespace LinearAlgebra
50 {
64  template <typename Number>
65  class Vector : public ReadWriteVector<Number>,
66  public VectorSpaceVector<Number>
67  {
68  public:
69  using size_type = types::global_dof_index;
70  using value_type = typename ReadWriteVector<Number>::value_type;
71 
75  Vector() = default;
76 
81  Vector(const Vector<Number> &V);
82 
93  explicit Vector(const size_type n);
94 
99  template <typename InputIterator>
100  Vector(const InputIterator first, const InputIterator last);
101 
110  virtual void
111  reinit(const size_type size,
112  const bool omit_zeroing_entries = false) override;
113 
122  template <typename Number2>
123  void
124  reinit(const ReadWriteVector<Number2> &in_vector,
125  const bool omit_zeroing_entries = false);
126 
136  virtual void
137  reinit(const IndexSet &locally_stored_indices,
138  const bool omit_zeroing_entries = false) override;
139 
140 
145  virtual void
147  const bool omit_zeroing_entries = false) override;
148 
153  operator=(const Vector<Number> &in_vector);
154 
158  template <typename Number2>
160  operator=(const Vector<Number2> &in_vector);
161 
166  virtual Vector<Number> &
167  operator=(const Number s) override;
168 
172  virtual Vector<Number> &
173  operator*=(const Number factor) override;
174 
178  virtual Vector<Number> &
179  operator/=(const Number factor) override;
180 
184  virtual Vector<Number> &
185  operator+=(const VectorSpaceVector<Number> &V) override;
186 
190  virtual Vector<Number> &
191  operator-=(const VectorSpaceVector<Number> &V) override;
192 
196  virtual Number operator*(const VectorSpaceVector<Number> &V) const override;
197 
201  virtual void
202  import(
203  const ReadWriteVector<Number> & V,
204  VectorOperation::values operation,
205  std::shared_ptr<const CommunicationPatternBase> communication_pattern =
206  std::shared_ptr<const CommunicationPatternBase>()) override;
207 
211  virtual void
212  add(const Number a) override;
213 
217  virtual void
218  add(const Number a, const VectorSpaceVector<Number> &V) override;
219 
224  virtual void
225  add(const Number a,
226  const VectorSpaceVector<Number> &V,
227  const Number b,
228  const VectorSpaceVector<Number> &W) override;
229 
234  virtual void
235  sadd(const Number s,
236  const Number a,
237  const VectorSpaceVector<Number> &V) override;
238 
244  virtual void
245  scale(const VectorSpaceVector<Number> &scaling_factors) override;
246 
250  virtual void
251  equ(const Number a, const VectorSpaceVector<Number> &V) override;
252 
256  virtual bool
257  all_zero() const override;
258 
262  virtual value_type
263  mean_value() const override;
264 
269  virtual typename VectorSpaceVector<Number>::real_type
270  l1_norm() const override;
271 
276  virtual typename VectorSpaceVector<Number>::real_type
277  l2_norm() const override;
278 
283  virtual typename VectorSpaceVector<Number>::real_type
284  linfty_norm() const override;
285 
306  virtual Number
307  add_and_dot(const Number a,
308  const VectorSpaceVector<Number> &V,
309  const VectorSpaceVector<Number> &W) override;
310 
315  virtual size_type
316  size() const override;
317 
329  virtual ::IndexSet
330  locally_owned_elements() const override;
331 
335  virtual void
336  print(std::ostream & out,
337  const unsigned int precision = 3,
338  const bool scientific = true,
339  const bool across = true) const override;
340 
346  void
347  block_write(std::ostream &out) const;
348 
360  void
361  block_read(std::istream &in);
362 
366  virtual std::size_t
367  memory_consumption() const override;
368 
375 
376  private:
382  template <typename Archive>
383  void
384  serialize(Archive &ar, const unsigned int version);
385 
386  friend class boost::serialization::access;
387 
391  template <typename Number2>
392  friend class Vector;
393  };
394 
396  /*--------------------------- Inline functions ----------------------------*/
397 
398  template <typename Number>
400  : ReadWriteVector<Number>(V)
401  {}
402 
403 
404 
405  template <typename Number>
406  inline Vector<Number>::Vector(const size_type n)
407  : ReadWriteVector<Number>(n)
408  {}
409 
410 
411 
412  template <typename Number>
413  template <typename InputIterator>
414  inline Vector<Number>::Vector(const InputIterator first,
415  const InputIterator last)
416  {
417  this->reinit(complete_index_set(std::distance(first, last)), true);
418  std::copy(first, last, this->begin());
419  }
420 
421 
422 
423  template <typename Number>
424  inline typename Vector<Number>::size_type
426  {
428  }
429 
430 
431 
432  template <typename Number>
433  inline ::IndexSet
435  {
437  }
438 
439 
440 
441  template <typename Number>
442  inline void
443  Vector<Number>::print(std::ostream & out,
444  const unsigned int precision,
445  const bool scientific,
446  const bool) const
447  {
448  ReadWriteVector<Number>::print(out, precision, scientific);
449  }
450 
451 
452 
453  template <typename Number>
454  template <typename Archive>
455  inline void
456  Vector<Number>::serialize(Archive &ar, const unsigned int)
457  {
458  size_type current_size = this->size();
459  ar &static_cast<Subscriptor &>(*this);
460  ar & this->stored_elements;
461  // If necessary, resize the vector during a read operation
462  if (this->size() != current_size)
463  this->reinit(this->size());
464  ar &boost::serialization::make_array(this->values.get(), this->size());
465  }
466 
467 
468 
469  template <typename Number>
470  inline std::size_t
472  {
474  }
475 } // end of namespace LinearAlgebra
476 
477 
483 template <typename Number>
484 struct is_serial_vector<LinearAlgebra::Vector<Number>> : std::true_type
485 {};
486 
487 
488 DEAL_II_NAMESPACE_CLOSE
489 
490 #ifdef DEAL_II_MSVC
491 # include <deal.II/lac/la_vector.templates.h>
492 #endif
493 
494 #endif
virtual VectorSpaceVector< Number >::real_type linfty_norm() const override
virtual void add(const Number a) override
std::size_t memory_consumption() const
Vector< Number > & operator=(const Vector< Number > &in_vector)
virtual Vector< Number > & operator*=(const Number factor) override
virtual std::size_t memory_consumption() const override
Definition: la_vector.h:471
virtual Number operator*(const VectorSpaceVector< Number > &V) const override
virtual Vector< Number > & operator+=(const VectorSpaceVector< Number > &V) override
static::ExceptionBase & ExcVectorTypeNotCompatible()
unsigned long long int global_dof_index
Definition: types.h:72
virtual void equ(const Number a, const VectorSpaceVector< Number > &V) override
void block_write(std::ostream &out) const
virtual ::IndexSet locally_owned_elements() const override
Definition: la_vector.h:434
virtual Vector< Number > & operator-=(const VectorSpaceVector< Number > &V) override
virtual void sadd(const Number s, const Number a, const VectorSpaceVector< Number > &V) override
std::unique_ptr< Number[], decltype(free)* > values
virtual void reinit(const size_type size, const bool omit_zeroing_entries=false) override
virtual void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const override
Definition: la_vector.h:443
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true) const
#define DeclException0(Exception0)
Definition: exceptions.h:385
virtual Vector< Number > & operator/=(const Number factor) override
virtual void scale(const VectorSpaceVector< Number > &scaling_factors) override
virtual bool all_zero() const override
virtual size_type size() const override
Definition: la_vector.h:425
virtual VectorSpaceVector< Number >::real_type l1_norm() const override
virtual VectorSpaceVector< Number >::real_type l2_norm() const override
void block_read(std::istream &in)
virtual value_type mean_value() const override
virtual Number add_and_dot(const Number a, const VectorSpaceVector< Number > &V, const VectorSpaceVector< Number > &W) override
void serialize(Archive &ar, const unsigned int version)
Definition: la_vector.h:456