DOLFIN
DOLFIN C++ interface
PETScMatrix.h
1 // Copyright (C) 2004-2012 Johan Hoffman, Johan Jansson, Anders Logg
2 // and Garth N. Wells
3 //
4 // This file is part of DOLFIN.
5 //
6 // DOLFIN is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU Lesser General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // DOLFIN is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public License
17 // along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
18 //
19 // Modified by Andy R. Terrel 2005
20 // Modified by Garth N. Wells 2006-2009
21 // Modified by Kent-Andre Mardal 2008
22 // Modified by Ola Skavhaug 2008
23 // Modified by Fredrik Valdmanis 2011
24 //
25 // First added: 2004-01-01
26 // Last changed: 2012-08-22
27 
28 #ifndef __PETSC_MATRIX_H
29 #define __PETSC_MATRIX_H
30 
31 #ifdef HAS_PETSC
32 
33 #include <map>
34 #include <memory>
35 #include <string>
36 
37 #include <petscmat.h>
38 #include <petscsys.h>
39 
40 #include "GenericMatrix.h"
41 #include "PETScBaseMatrix.h"
42 
43 namespace dolfin
44 {
45 
46  class PETScVector;
47  class TensorLayout;
48  class VectorSpaceBasis;
49 
57 
58  class PETScMatrix : public GenericMatrix, public PETScBaseMatrix
59  {
60  public:
61 
63  PETScMatrix();
64 
66  explicit PETScMatrix(MPI_Comm comm);
67 
70  explicit PETScMatrix(Mat A);
71 
73  PETScMatrix(const PETScMatrix& A);
74 
76  virtual ~PETScMatrix();
77 
78  //--- Implementation of the GenericTensor interface ---
79 
81  void init(const TensorLayout& tensor_layout);
82 
84  bool is_nest();
85 
87  void set_nest(std::vector<Mat> mats);
88 
90  bool empty() const;
91 
93  std::size_t size(std::size_t dim) const
94  { return PETScBaseMatrix::size(dim); }
95 
97  std::pair<std::int64_t, std::int64_t> local_range(std::size_t dim) const
98  { return PETScBaseMatrix::local_range(dim); }
99 
101  std::size_t nnz() const;
102 
104  virtual void zero();
105 
112  virtual void apply(std::string mode);
113 
115  MPI_Comm mpi_comm() const;
116 
118  virtual std::string str(bool verbose) const;
119 
120  //--- Implementation of the GenericMatrix interface --
121 
123  virtual std::shared_ptr<GenericMatrix> copy() const;
124 
133  virtual void init_vector(GenericVector& z, std::size_t dim) const
134  { PETScBaseMatrix::init_vector(z, dim); }
135 
137  virtual void get(double* block,
138  std::size_t m, const dolfin::la_index* rows,
139  std::size_t n, const dolfin::la_index* cols) const;
140 
142  virtual void set(const double* block,
143  std::size_t m, const dolfin::la_index* rows,
144  std::size_t n, const dolfin::la_index* cols);
145 
147  virtual void set_local(const double* block,
148  std::size_t m, const dolfin::la_index* rows,
149  std::size_t n, const dolfin::la_index* cols);
150 
152  virtual void add(const double* block,
153  std::size_t m, const dolfin::la_index* rows,
154  std::size_t n, const dolfin::la_index* cols);
155 
157  virtual void add_local(const double* block,
158  std::size_t m, const dolfin::la_index* rows,
159  std::size_t n, const dolfin::la_index* cols);
160 
162  virtual void axpy(double a, const GenericMatrix& A,
163  bool same_nonzero_pattern);
164 
166  double norm(std::string norm_type) const;
167 
169  virtual void getrow(std::size_t row,
170  std::vector<std::size_t>& columns,
171  std::vector<double>& values) const;
172 
174  virtual void setrow(std::size_t row,
175  const std::vector<std::size_t>& columns,
176  const std::vector<double>& values);
177 
179  virtual void zero(std::size_t m, const dolfin::la_index* rows);
180 
182  virtual void zero_local(std::size_t m, const dolfin::la_index* rows);
183 
185  virtual void ident(std::size_t m, const dolfin::la_index* rows);
186 
188  virtual void ident_local(std::size_t m, const dolfin::la_index* rows);
189 
190  // Matrix-vector product, y = Ax
191  virtual void mult(const GenericVector& x, GenericVector& y) const;
192 
193  // Matrix-vector product, y = A^T x
194  virtual void transpmult(const GenericVector& x, GenericVector& y) const;
195 
197  virtual void get_diagonal(GenericVector& x) const;
198 
200  virtual void set_diagonal(const GenericVector& x);
201 
203  virtual const PETScMatrix& operator*= (double a);
204 
206  virtual const PETScMatrix& operator/= (double a);
207 
209  virtual const GenericMatrix& operator= (const GenericMatrix& A);
210 
212  virtual bool is_symmetric(double tol) const;
213 
214  //--- Special functions ---
215 
217  virtual GenericLinearAlgebraFactory& factory() const;
218 
219  //--- Special PETSc Functions ---
220 
223  void set_options_prefix(std::string options_prefix);
224 
227  std::string get_options_prefix() const;
228 
230  void set_from_options();
231 
233  const PETScMatrix& operator= (const PETScMatrix& A);
234 
237  void set_nullspace(const VectorSpaceBasis& nullspace);
238 
241  void set_near_nullspace(const VectorSpaceBasis& nullspace);
242 
244  void binary_dump(std::string file_name) const;
245 
247  void convert_to_aij();
248 
249  private:
250 
251  // Create PETSc nullspace object
252  MatNullSpace create_petsc_nullspace(const VectorSpaceBasis& nullspace) const;
253 
254  // PETSc norm types
255  static const std::map<std::string, NormType> norm_types;
256 
257  };
258 
259 }
260 
261 #endif
262 
263 #endif
dolfin::GenericMatrix
This class defines a common interface for matrices.
Definition: GenericMatrix.h:47
dolfin::PETScMatrix::convert_to_aij
void convert_to_aij()
Convert matrix to AIJ format.
Definition: PETScMatrix.cpp:804
dolfin::PETScMatrix::transpmult
virtual void transpmult(const GenericVector &x, GenericVector &y) const
Definition: PETScMatrix.cpp:471
dolfin::PETScMatrix::zero_local
virtual void zero_local(std::size_t m, const dolfin::la_index *rows)
Set given rows (local row indices) to zero.
Definition: PETScMatrix.cpp:397
dolfin::PETScMatrix::setrow
virtual void setrow(std::size_t row, const std::vector< std::size_t > &columns, const std::vector< double > &values)
Set values for given row.
Definition: PETScMatrix.cpp:362
dolfin::PETScMatrix::mult
virtual void mult(const GenericVector &x, GenericVector &y) const
Compute matrix-vector product y = Ax.
Definition: PETScMatrix.cpp:442
dolfin::PETScMatrix::PETScMatrix
PETScMatrix()
Create empty matrix (on MPI_COMM_WORLD)
Definition: PETScMatrix.cpp:57
dolfin::PETScMatrix::set_from_options
void set_from_options()
Call PETSc function MatSetFromOptions on the PETSc Mat object.
Definition: PETScMatrix.cpp:656
dolfin::PETScMatrix::get_diagonal
virtual void get_diagonal(GenericVector &x) const
Get diagonal of a matrix.
Definition: PETScMatrix.cpp:500
dolfin::PETScMatrix::init
void init(const TensorLayout &tensor_layout)
Initialize zero tensor using tensor layout.
Definition: PETScMatrix.cpp:100
dolfin::PETScMatrix::add_local
virtual void add_local(const double *block, std::size_t m, const dolfin::la_index *rows, std::size_t n, const dolfin::la_index *cols)
Add block of values using local indices.
Definition: PETScMatrix.cpp:292
dolfin::PETScMatrix::operator*=
virtual const PETScMatrix & operator*=(double a)
Multiply matrix by given number.
Definition: PETScMatrix.cpp:607
dolfin::PETScMatrix::copy
virtual std::shared_ptr< GenericMatrix > copy() const
Return copy of matrix.
Definition: PETScMatrix.cpp:95
dolfin::PETScBaseMatrix
Definition: PETScBaseMatrix.h:50
dolfin::PETScMatrix::mpi_comm
MPI_Comm mpi_comm() const
Return MPI communicator.
Definition: PETScMatrix.cpp:588
dolfin::PETScMatrix::is_nest
bool is_nest()
Check is the matrix as nest type.
Definition: PETScMatrix.cpp:221
dolfin::PETScMatrix::set_diagonal
virtual void set_diagonal(const GenericVector &x)
Set diagonal of a matrix.
Definition: PETScMatrix.cpp:517
dolfin::PETScMatrix::operator=
virtual const GenericMatrix & operator=(const GenericMatrix &A)
Assignment operator.
Definition: PETScMatrix.cpp:622
dolfin::PETScMatrix::binary_dump
void binary_dump(std::string file_name) const
Dump matrix to PETSc binary format.
Definition: PETScMatrix.cpp:731
dolfin::PETScMatrix::operator/=
virtual const PETScMatrix & operator/=(double a)
Divide matrix by given number.
Definition: PETScMatrix.cpp:615
dolfin::la_index
PetscInt la_index
Index type for compatibility with linear algebra backend(s)
Definition: types.h:32
dolfin::PETScMatrix::set_near_nullspace
void set_near_nullspace(const VectorSpaceBasis &nullspace)
Definition: PETScMatrix.cpp:717
dolfin::PETScMatrix::~PETScMatrix
virtual ~PETScMatrix()
Destructor.
Definition: PETScMatrix.cpp:90
dolfin::PETScMatrix::ident_local
virtual void ident_local(std::size_t m, const dolfin::la_index *rows)
Set given rows (local row indices) to identity matrix.
Definition: PETScMatrix.cpp:425
dolfin::PETScMatrix::nnz
std::size_t nnz() const
Return number of non-zero entries in matrix (collective)
Definition: PETScMatrix.cpp:593
dolfin::PETScMatrix
Definition: PETScMatrix.h:59
dolfin::PETScMatrix::local_range
std::pair< std::int64_t, std::int64_t > local_range(std::size_t dim) const
Return local ownership range.
Definition: PETScMatrix.h:97
dolfin::PETScMatrix::set_nest
void set_nest(std::vector< Mat > mats)
Initialize or update a nested matrix from the list of its blocks.
Definition: PETScMatrix.cpp:229
dolfin::PETScBaseMatrix::size
std::pair< std::int64_t, std::int64_t > size() const
Definition: PETScBaseMatrix.cpp:79
dolfin::PETScMatrix::apply
virtual void apply(std::string mode)
Definition: PETScMatrix.cpp:553
dolfin::GenericVector
This class defines a common interface for vectors.
Definition: GenericVector.h:48
dolfin::PETScMatrix::is_symmetric
virtual bool is_symmetric(double tol) const
Test if matrix is symmetric.
Definition: PETScMatrix.cpp:628
dolfin::PETScMatrix::init_vector
virtual void init_vector(GenericVector &z, std::size_t dim) const
Definition: PETScMatrix.h:133
dolfin::PETScMatrix::factory
virtual GenericLinearAlgebraFactory & factory() const
Return linear algebra backend factory.
Definition: PETScMatrix.cpp:637
dolfin::PETScBaseMatrix::init_vector
void init_vector(GenericVector &z, std::size_t dim) const
Definition: PETScBaseMatrix.cpp:106
dolfin::PETScMatrix::size
std::size_t size(std::size_t dim) const
Return size of given dimension.
Definition: PETScMatrix.h:93
dolfin::PETScMatrix::norm
double norm(std::string norm_type) const
Return norm of matrix.
Definition: PETScMatrix.cpp:534
dolfin::TensorLayout
Definition: TensorLayout.h:42
dolfin::PETScMatrix::getrow
virtual void getrow(std::size_t row, std::vector< std::size_t > &columns, std::vector< double > &values) const
Get non-zero values of given row.
Definition: PETScMatrix.cpp:342
dolfin::PETScMatrix::add
virtual void add(const double *block, std::size_t m, const dolfin::la_index *rows, std::size_t n, const dolfin::la_index *cols)
Add block of values using global indices.
Definition: PETScMatrix.cpp:282
dolfin::PETScMatrix::empty
bool empty() const
Return true if empty.
Definition: PETScMatrix.cpp:245
dolfin::PETScMatrix::ident
virtual void ident(std::size_t m, const dolfin::la_index *rows)
Set given rows (global row indices) to identity matrix.
Definition: PETScMatrix.cpp:408
dolfin::PETScMatrix::set
virtual void set(const double *block, std::size_t m, const dolfin::la_index *rows, std::size_t n, const dolfin::la_index *cols)
Set block of values using global indices.
Definition: PETScMatrix.cpp:262
dolfin::PETScMatrix::zero
virtual void zero()
Set all entries to zero and keep any sparse structure.
Definition: PETScMatrix.cpp:600
dolfin::PETScMatrix::set_options_prefix
void set_options_prefix(std::string options_prefix)
Definition: PETScMatrix.cpp:642
dolfin::PETScMatrix::str
virtual std::string str(bool verbose) const
Return informal string representation (pretty-print)
Definition: PETScMatrix.cpp:747
dolfin::PETScMatrix::set_local
virtual void set_local(const double *block, std::size_t m, const dolfin::la_index *rows, std::size_t n, const dolfin::la_index *cols)
Set block of values using local indices.
Definition: PETScMatrix.cpp:272
dolfin::PETScBaseMatrix::local_range
std::pair< std::int64_t, std::int64_t > local_range(std::size_t dim) const
Return local range along dimension dim.
Definition: PETScBaseMatrix.cpp:89
dolfin::PETScMatrix::set_nullspace
void set_nullspace(const VectorSpaceBasis &nullspace)
Definition: PETScMatrix.cpp:703
dolfin::VectorSpaceBasis
Definition: VectorSpaceBasis.h:34
dolfin::PETScMatrix::axpy
virtual void axpy(double a, const GenericMatrix &A, bool same_nonzero_pattern)
Add multiple of given matrix (AXPY operation)
Definition: PETScMatrix.cpp:302
dolfin::PETScMatrix::get_options_prefix
std::string get_options_prefix() const
Definition: PETScMatrix.cpp:648
dolfin::PETScMatrix::get
virtual void get(double *block, std::size_t m, const dolfin::la_index *rows, std::size_t n, const dolfin::la_index *cols) const
Get block of values.
Definition: PETScMatrix.cpp:252
dolfin
Definition: adapt.h:30
dolfin::GenericLinearAlgebraFactory
Base class for LinearAlgebra factories.
Definition: GenericLinearAlgebraFactory.h:47