DOLFIN
DOLFIN C++ interface
Loading...
Searching...
No Matches
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
43namespace dolfin
44{
45
46 class PETScVector;
47 class TensorLayout;
48 class VectorSpaceBasis;
49
57
59 {
60 public:
61
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
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
Base class for LinearAlgebra factories.
Definition GenericLinearAlgebraFactory.h:47
This class defines a common interface for matrices.
Definition GenericMatrix.h:47
This class defines a common interface for vectors.
Definition GenericVector.h:48
Definition PETScBaseMatrix.h:50
std::pair< std::int64_t, std::int64_t > size() const
Definition PETScBaseMatrix.cpp:79
void init_vector(GenericVector &z, std::size_t dim) const
Definition PETScBaseMatrix.cpp:106
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
Definition PETScMatrix.h:59
virtual void set_diagonal(const GenericVector &x)
Set diagonal of a matrix.
Definition PETScMatrix.cpp:517
virtual void mult(const GenericVector &x, GenericVector &y) const
Compute matrix-vector product y = Ax.
Definition PETScMatrix.cpp:442
double norm(std::string norm_type) const
Return norm of matrix.
Definition PETScMatrix.cpp:534
std::pair< std::int64_t, std::int64_t > local_range(std::size_t dim) const
Return local ownership range.
Definition PETScMatrix.h:97
virtual void transpmult(const GenericVector &x, GenericVector &y) const
Definition PETScMatrix.cpp:471
virtual void get_diagonal(GenericVector &x) const
Get diagonal of a matrix.
Definition PETScMatrix.cpp:500
virtual const GenericMatrix & operator=(const GenericMatrix &A)
Assignment operator.
Definition PETScMatrix.cpp:622
void set_nest(std::vector< Mat > mats)
Initialize or update a nested matrix from the list of its blocks.
Definition PETScMatrix.cpp:229
virtual GenericLinearAlgebraFactory & factory() const
Return linear algebra backend factory.
Definition PETScMatrix.cpp:637
virtual ~PETScMatrix()
Destructor.
Definition PETScMatrix.cpp:90
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
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
virtual bool is_symmetric(double tol) const
Test if matrix is symmetric.
Definition PETScMatrix.cpp:628
PETScMatrix()
Create empty matrix (on MPI_COMM_WORLD)
Definition PETScMatrix.cpp:57
void binary_dump(std::string file_name) const
Dump matrix to PETSc binary format.
Definition PETScMatrix.cpp:731
virtual std::string str(bool verbose) const
Return informal string representation (pretty-print)
Definition PETScMatrix.cpp:747
bool is_nest()
Check is the matrix as nest type.
Definition PETScMatrix.cpp:221
void convert_to_aij()
Convert matrix to AIJ format.
Definition PETScMatrix.cpp:804
virtual const PETScMatrix & operator/=(double a)
Divide matrix by given number.
Definition PETScMatrix.cpp:615
std::size_t size(std::size_t dim) const
Return size of given dimension.
Definition PETScMatrix.h:93
virtual void init_vector(GenericVector &z, std::size_t dim) const
Definition PETScMatrix.h:133
std::size_t nnz() const
Return number of non-zero entries in matrix (collective)
Definition PETScMatrix.cpp:593
virtual void apply(std::string mode)
Definition PETScMatrix.cpp:553
bool empty() const
Return true if empty.
Definition PETScMatrix.cpp:245
void init(const TensorLayout &tensor_layout)
Initialize zero tensor using tensor layout.
Definition PETScMatrix.cpp:100
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
void set_options_prefix(std::string options_prefix)
Definition PETScMatrix.cpp:642
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
virtual std::shared_ptr< GenericMatrix > copy() const
Return copy of matrix.
Definition PETScMatrix.cpp:95
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
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
virtual const PETScMatrix & operator*=(double a)
Multiply matrix by given number.
Definition PETScMatrix.cpp:607
void set_nullspace(const VectorSpaceBasis &nullspace)
Definition PETScMatrix.cpp:703
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
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
MPI_Comm mpi_comm() const
Return MPI communicator.
Definition PETScMatrix.cpp:588
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
void set_near_nullspace(const VectorSpaceBasis &nullspace)
Definition PETScMatrix.cpp:717
virtual void zero()
Set all entries to zero and keep any sparse structure.
Definition PETScMatrix.cpp:600
void set_from_options()
Call PETSc function MatSetFromOptions on the PETSc Mat object.
Definition PETScMatrix.cpp:656
std::string get_options_prefix() const
Definition PETScMatrix.cpp:648
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
virtual void axpy(double a, const GenericMatrix &A, bool same_nonzero_pattern)
Add multiple of given matrix (AXPY operation)
Definition PETScMatrix.cpp:302
Definition TensorLayout.h:42
Definition VectorSpaceBasis.h:34
Definition adapt.h:30
PetscInt la_index
Index type for compatibility with linear algebra backend(s)
Definition types.h:32