DOLFIN
DOLFIN C++ interface
TpetraVector.h
1 // Copyright (C) 2014
2 //
3 // This file is part of DOLFIN.
4 //
5 // DOLFIN is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // DOLFIN is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
17 //
18 
19 #ifndef __TPETRA_VECTOR_H
20 #define __TPETRA_VECTOR_H
21 
22 #ifdef HAS_TRILINOS
23 
24 #include <cstdint>
25 #include <map>
26 #include <memory>
27 #include <string>
28 #include <unordered_map>
29 #include <utility>
30 
31 #include <Teuchos_GlobalMPISession.hpp>
32 #include <Teuchos_oblackholestream.hpp>
33 #include <Tpetra_DefaultPlatform.hpp>
34 #include <Tpetra_MultiVector.hpp>
35 #include <Tpetra_Version.hpp>
36 
37 #include <dolfin/common/types.h>
38 #include "GenericVector.h"
39 
40 namespace dolfin
41 {
42 
43  template<typename T> class Array;
44 
52 
53  class TpetraVector : public GenericVector
54  {
55  public:
56 
58  typedef Tpetra::MultiVector<>::node_type node_type;
60  typedef Tpetra::Map<int, dolfin::la_index, node_type> map_type;
62  typedef Tpetra::MultiVector<double, int, dolfin::la_index, node_type>
64 
66  TpetraVector(MPI_Comm comm=MPI_COMM_WORLD);
67 
69  TpetraVector(MPI_Comm comm, std::size_t N);
70 
72  TpetraVector(const TpetraVector& x);
73 
75  //explicit TpetraVector(Teuchos::RCP<vector_type> x);
76 
78  virtual ~TpetraVector();
79 
80  //--- Implementation of the GenericTensor interface ---
81 
83  virtual void zero();
84 
86  virtual void apply(std::string mode);
87 
89  virtual MPI_Comm mpi_comm() const;
90 
92  virtual std::string str(bool verbose) const;
93 
94  //--- Implementation of the GenericVector interface ---
95 
97  virtual std::shared_ptr<GenericVector> copy() const;
98 
100  virtual void init(std::size_t N);
101 
103  virtual void init(std::pair<std::size_t, std::size_t> range);
104 
107  virtual void init(std::pair<std::size_t, std::size_t> range,
108  const std::vector<std::size_t>& local_to_global_map,
109  const std::vector<la_index>& ghost_indices);
110 
111  // Bring init function from GenericVector into scope
112  using GenericVector::init;
113 
115  virtual bool empty() const;
116 
118  virtual std::size_t size() const;
119 
121  virtual std::size_t local_size() const;
122 
124  virtual std::pair<std::int64_t, std::int64_t> local_range() const;
125 
127  virtual bool owns_index(std::size_t i) const;
128 
131  virtual void get(double* block, std::size_t m,
132  const dolfin::la_index* rows) const;
133 
134 
136  virtual void get_local(double* block, std::size_t m,
137  const dolfin::la_index* rows) const;
138 
140  virtual void set(const double* block, std::size_t m,
141  const dolfin::la_index* rows);
142 
144  virtual void set_local(const double* block, std::size_t m,
145  const dolfin::la_index* rows);
146 
148  virtual void add(const double* block, std::size_t m,
149  const dolfin::la_index* rows);
150 
152  virtual void add_local(const double* block, std::size_t m,
153  const dolfin::la_index* rows);
154 
156  virtual void get_local(std::vector<double>& values) const;
157 
159  virtual void set_local(const std::vector<double>& values);
160 
162  virtual void add_local(const Array<double>& values);
163 
168  virtual void gather(GenericVector& y,
169  const std::vector<dolfin::la_index>& indices) const;
170 
173  virtual void gather(std::vector<double>& x,
174  const std::vector<dolfin::la_index>& indices) const;
175 
178  virtual void gather_on_zero(std::vector<double>& x) const;
179 
181  virtual void axpy(double a, const GenericVector& x);
182 
184  virtual void abs();
185 
187  virtual double inner(const GenericVector& v) const;
188 
190  virtual double norm(std::string norm_type) const;
191 
193  virtual double min() const;
194 
196  virtual double max() const;
197 
199  virtual double sum() const;
200 
202  virtual double sum(const Array<std::size_t>& rows) const;
203 
205  virtual const TpetraVector& operator*= (double a);
206 
208  virtual const TpetraVector& operator*= (const GenericVector& x);
209 
211  virtual const TpetraVector& operator/= (double a);
212 
214  virtual const TpetraVector& operator+= (const GenericVector& x);
215 
217  virtual const TpetraVector& operator+= (double a);
218 
220  virtual const TpetraVector& operator-= (const GenericVector& x);
221 
223  virtual const TpetraVector& operator-= (double a);
224 
226  virtual const GenericVector& operator= (const GenericVector& x);
227 
229  virtual const TpetraVector& operator= (double a);
230 
232  virtual void update_ghost_values();
233 
234  //--- Special functions ---
235 
237  virtual GenericLinearAlgebraFactory& factory() const;
238 
239  //--- Special Tpetra functions ---
240 
242  Teuchos::RCP<vector_type> vec() const;
243 
245  const TpetraVector& operator= (const TpetraVector& x);
246 
248  static void mapdump(Teuchos::RCP<const map_type> xmap,
249  const std::string desc);
250 
252  void mapdump(const std::string desc);
253 
254  friend class TpetraMatrix;
255 
256  private:
257 
258  // Initialise Tpetra vector
259  void _init(std::pair<std::int64_t, std::int64_t> range,
260  const std::vector<dolfin::la_index>& local_to_global);
261 
262  // Tpetra multivector - actually a view into the ghosted vector,
263  // below
264  Teuchos::RCP<vector_type> _x;
265 
266  // Tpetra multivector with extra rows for ghost values
267  Teuchos::RCP<vector_type> _x_ghosted;
268 
269  // MPI Communicator
270  Teuchos::RCP<const Teuchos::MpiComm<int>> _comm;
271 
272  };
273 
274 }
275 
276 #endif
277 
278 #endif
virtual double max() const
Return maximum value of vector.
Definition: TpetraVector.cpp:485
virtual std::string str(bool verbose) const
Return informal string representation (pretty-print)
Definition: TpetraVector.cpp:129
virtual void add(const double *block, std::size_t m, const dolfin::la_index *rows)
Add block of values using global indices.
Definition: TpetraVector.cpp:293
virtual void init(const TensorLayout &tensor_layout)
Definition: GenericVector.h:58
virtual const GenericVector & operator=(const GenericVector &x)
Assignment operator.
Definition: TpetraVector.cpp:588
Definition: adapt.h:29
virtual void gather_on_zero(std::vector< double > &x) const
Definition: TpetraVector.cpp:407
virtual bool empty() const
Return true if vector is empty.
Definition: TpetraVector.cpp:171
TpetraVector(MPI_Comm comm=MPI_COMM_WORLD)
Create empty vector.
Definition: TpetraVector.cpp:37
Definition: Array.h:41
Tpetra::Map< int, dolfin::la_index, node_type > map_type
TpetraVector map type (local index, global index)
Definition: TpetraVector.h:60
virtual bool owns_index(std::size_t i) const
Determine whether global vector index is owned by this process.
Definition: TpetraVector.cpp:199
virtual double sum() const
Return sum of values of vector.
Definition: TpetraVector.cpp:494
virtual double inner(const GenericVector &v) const
Return inner product with given vector.
Definition: TpetraVector.cpp:445
virtual void update_ghost_values()
Update ghost values in vector.
Definition: TpetraVector.cpp:225
virtual double min() const
Return minimum value of vector.
Definition: TpetraVector.cpp:476
virtual GenericLinearAlgebraFactory & factory() const
Return linear algebra backend factory.
Definition: TpetraVector.cpp:634
virtual const TpetraVector & operator*=(double a)
Multiply vector by given number.
Definition: TpetraVector.cpp:533
Tpetra::MultiVector::node_type node_type
Node type.
Definition: TpetraVector.h:58
Definition: TpetraMatrix.h:58
Tpetra::MultiVector< double, int, dolfin::la_index, node_type > vector_type
TpetraVector vector type (scalar, local index, global index, node)
Definition: TpetraVector.h:63
virtual MPI_Comm mpi_comm() const
Return MPI communicator.
Definition: TpetraVector.cpp:117
virtual const TpetraVector & operator+=(const GenericVector &x)
Add given vector.
Definition: TpetraVector.cpp:557
virtual const TpetraVector & operator/=(double a)
Divide vector by given number.
Definition: TpetraVector.cpp:548
Base class for LinearAlgebra factories.
Definition: GenericLinearAlgebraFactory.h:46
virtual void abs()
Replace all entries in the vector by their absolute values.
Definition: TpetraVector.cpp:438
virtual std::pair< std::int64_t, std::int64_t > local_range() const
Return ownership range of a vector.
Definition: TpetraVector.cpp:192
virtual void zero()
Set all entries to zero and keep any sparse structure.
Definition: TpetraVector.cpp:73
virtual std::size_t size() const
Return size of vector.
Definition: TpetraVector.cpp:176
virtual void gather(GenericVector &y, const std::vector< dolfin::la_index > &indices) const
Definition: TpetraVector.cpp:369
virtual std::shared_ptr< GenericVector > copy() const
Return copy of vector.
Definition: TpetraVector.cpp:143
virtual const TpetraVector & operator-=(const GenericVector &x)
Subtract given vector.
Definition: TpetraVector.cpp:574
Definition: TpetraVector.h:53
virtual ~TpetraVector()
Create vector wrapper of Tpetra Vec pointer.
Definition: TpetraVector.cpp:68
static void mapdump(Teuchos::RCP< const map_type > xmap, const std::string desc)
output map for debugging
Definition: TpetraVector.cpp:688
PetscInt la_index
Index type for compatibility with linear algebra backend(s)
Definition: types.h:32
virtual std::size_t local_size() const
Return local size of vector.
Definition: TpetraVector.cpp:184
Teuchos::RCP< vector_type > vec() const
Return pointer to Tpetra vector object.
Definition: TpetraVector.cpp:678
virtual void get_local(double *block, std::size_t m, const dolfin::la_index *rows) const
Get block of values using local indices.
Definition: TpetraVector.cpp:245
virtual void add_local(const double *block, std::size_t m, const dolfin::la_index *rows)
Add block of values using local indices.
Definition: TpetraVector.cpp:309
virtual void init(std::size_t N)
Initialize vector to global size N.
Definition: TpetraVector.cpp:148
This class defines a common interface for vectors.
Definition: GenericVector.h:47
virtual void apply(std::string mode)
Finalize assembly of tensor.
Definition: TpetraVector.cpp:79
virtual void set_local(const double *block, std::size_t m, const dolfin::la_index *rows)
Set block of values using local indices.
Definition: TpetraVector.cpp:280
virtual void axpy(double a, const GenericVector &x)
Add multiple of given vector (AXPY operation)
Definition: TpetraVector.cpp:430
virtual double norm(std::string norm_type) const
Return norm of vector.
Definition: TpetraVector.cpp:459