Loading [MathJax]/extensions/TeX/newcommand.js
 Reference documentation for deal.II version 9.1.1
\newcommand{\dealcoloneq}{\mathrel{\vcenter{:}}=}
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
trilinos_tpetra_vector.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2018 - 2019 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_trilinos_tpetra_vector_h
17 #define dealii_trilinos_tpetra_vector_h
18 
19 
20 #include <deal.II/base/config.h>
21 
22 #if defined(DEAL_II_TRILINOS_WITH_TPETRA) && defined(DEAL_II_WITH_MPI)
23 
24 # include <deal.II/base/index_set.h>
25 # include <deal.II/base/subscriptor.h>
26 
27 # include <deal.II/lac/trilinos_tpetra_communication_pattern.h>
28 # include <deal.II/lac/vector_operation.h>
29 # include <deal.II/lac/vector_space_vector.h>
30 # include <deal.II/lac/vector_type_traits.h>
31 
32 # include <Teuchos_Comm.hpp>
33 # include <Teuchos_OrdinalTraits.hpp>
34 # include <Tpetra_Core.hpp>
35 # include <Tpetra_Vector.hpp>
36 # include <Tpetra_Version.hpp>
37 # include <mpi.h>
38 
39 # include <memory>
40 
41 DEAL_II_NAMESPACE_OPEN
42 
43 namespace LinearAlgebra
44 {
45  // Forward declaration
46  template <typename Number>
47  class ReadWriteVector;
48 
49  namespace TpetraWrappers
50  {
74  template <typename Number>
75  class Vector : public VectorSpaceVector<Number>, public Subscriptor
76  {
77  public:
78  using value_type = Number;
79 
80  using size_type = typename VectorSpaceVector<Number>::size_type;
81 
85  Vector();
86 
91  Vector(const Vector &V);
92 
99  explicit Vector(const IndexSet &parallel_partitioner,
100  const MPI_Comm &communicator);
101 
108  void
109  reinit(const IndexSet &parallel_partitioner,
110  const MPI_Comm &communicator,
111  const bool omit_zeroing_entries = false);
112 
117  virtual void
118  reinit(const VectorSpaceVector<Number> &V,
119  const bool omit_zeroing_entries = false) override;
120 
126  Vector &
127  operator=(const Vector &V);
128 
133  virtual Vector &
134  operator=(const Number s) override;
135 
144  virtual void
145  import(
146  const ReadWriteVector<Number> & V,
147  VectorOperation::values operation,
148  std::shared_ptr<const CommunicationPatternBase> communication_pattern =
149  std::shared_ptr<const CommunicationPatternBase>()) override;
150 
154  virtual Vector &
155  operator*=(const Number factor) override;
156 
160  virtual Vector &
161  operator/=(const Number factor) override;
162 
166  virtual Vector &
167  operator+=(const VectorSpaceVector<Number> &V) override;
168 
172  virtual Vector &
173  operator-=(const VectorSpaceVector<Number> &V) override;
174 
179  virtual Number
180  operator*(const VectorSpaceVector<Number> &V) const override;
181 
185  virtual void
186  add(const Number a) override;
187 
192  virtual void
193  add(const Number a, const VectorSpaceVector<Number> &V) override;
194 
199  virtual void
200  add(const Number a,
201  const VectorSpaceVector<Number> &V,
202  const Number b,
203  const VectorSpaceVector<Number> &W) override;
204 
209  virtual void
210  sadd(const Number s,
211  const Number a,
212  const VectorSpaceVector<Number> &V) override;
213 
220  virtual void
221  scale(const VectorSpaceVector<Number> &scaling_factors) override;
222 
226  virtual void
227  equ(const Number a, const VectorSpaceVector<Number> &V) override;
228 
232  virtual bool
233  all_zero() const override;
234 
238  virtual Number
239  mean_value() const override;
240 
245  virtual typename LinearAlgebra::VectorSpaceVector<Number>::real_type
246  l1_norm() const override;
247 
252  virtual typename LinearAlgebra::VectorSpaceVector<Number>::real_type
253  l2_norm() const override;
254 
259  virtual typename LinearAlgebra::VectorSpaceVector<Number>::real_type
260  linfty_norm() const override;
261 
284  virtual Number
285  add_and_dot(const Number a,
286  const VectorSpaceVector<Number> &V,
287  const VectorSpaceVector<Number> &W) override;
292  bool
293  has_ghost_elements() const;
294 
299  virtual size_type
300  size() const override;
301 
305  MPI_Comm
306  get_mpi_communicator() const;
307 
319  virtual ::IndexSet
320  locally_owned_elements() const override;
321 
326  const Tpetra::Vector<Number, int, types::global_dof_index> &
327  trilinos_vector() const;
328 
333  Tpetra::Vector<Number, int, types::global_dof_index> &
334  trilinos_vector();
335 
339  virtual void
340  print(std::ostream & out,
341  const unsigned int precision = 3,
342  const bool scientific = true,
343  const bool across = true) const override;
344 
348  virtual std::size_t
349  memory_consumption() const override;
350 
355  DeclException0(ExcDifferentParallelPartitioning);
356 
362  DeclException0(ExcVectorTypeNotCompatible);
363 
370  int,
371  << "An error with error number " << arg1
372  << " occurred while calling a Trilinos function");
373 
374  private:
380  void
381  create_tpetra_comm_pattern(const IndexSet &source_index_set,
382  const MPI_Comm &mpi_comm);
383 
387  std::unique_ptr<Tpetra::Vector<Number, int, types::global_dof_index>>
388  vector;
389 
393  ::IndexSet source_stored_elements;
394 
399  std::shared_ptr<const TpetraWrappers::CommunicationPattern>
400  tpetra_comm_pattern;
401  };
402 
403 
404  template <typename Number>
405  inline bool
407  {
408  return false;
409  }
410  } // namespace TpetraWrappers
411 } // namespace LinearAlgebra
412 
413 
417 template <typename Number>
419  : std::false_type
420 {};
421 
422 DEAL_II_NAMESPACE_CLOSE
423 
424 #endif
425 
426 #endif
static ::ExceptionBase & ExcTrilinosError(int arg1)
__global__ void add_and_dot(Number *res, Number *v1, const Number *v2, const Number *v3, const Number a, const size_type N)
SymmetricTensor< rank_, dim, Number > operator*(const SymmetricTensor< rank_, dim, Number > &t, const Number &factor)
LinearAlgebra::distributed::Vector< Number > Vector
__global__ void scale(Number *val, const Number *V_val, const size_type N)
#define DeclException1(Exception1, type1, outsequence)
Definition: exceptions.h:518
#define DeclException0(Exception0)
Definition: exceptions.h:473
__global__ void equ(Number *val, const Number a, const Number *V_val, const size_type N)
__global__ void sadd(const Number s, Number *val, const Number a, const Number *V_val, const size_type N)
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)