22 #ifndef __HERMES_COMMON_PETSC_SOLVER_H_
23 #define __HERMES_COMMON_PETSC_SOLVER_H_
26 #include "linear_matrix_solver.h"
38 template <
typename Scalar>
class PetscLinearMatrixSolver;
47 template <
typename Scalar>
52 virtual ~PetscMatrix();
56 virtual void finish();
57 virtual Scalar
get(
unsigned int m,
unsigned int n);
59 virtual void add(
unsigned int m,
unsigned int n, Scalar v);
60 virtual void add_to_diagonal(Scalar v);
61 virtual void add(
unsigned int m,
unsigned int n, Scalar **mat,
int *rows,
int *cols);
63 virtual unsigned int get_matrix_size()
const;
64 virtual unsigned int get_nnz()
const;
65 virtual double get_fill_in()
const;
68 virtual void add_matrix(PetscMatrix* mat);
72 virtual void add_to_diagonal_blocks(
int num_stages, PetscMatrix* mat);
75 add_to_diagonal_blocks(num_stages,
dynamic_cast<PetscMatrix<Scalar>*
>(mat));
81 virtual void add_as_block(
unsigned int i,
unsigned int j, PetscMatrix* mat);
84 void multiply_with_vector(Scalar* vector_in, Scalar* vector_out);
87 void multiply_with_Scalar(Scalar value);
95 void create(
unsigned int size,
unsigned int nnz,
int* ap,
int* ai, Scalar* ax);
97 PetscMatrix* duplicate();
106 friend class Solvers::PetscLinearMatrixSolver<Scalar>;
111 template <
typename Scalar>
112 class PetscVector :
public Vector<Scalar>
116 virtual ~PetscVector();
118 virtual void alloc(
unsigned int ndofs);
121 virtual void finish();
122 virtual Scalar
get(
unsigned int idx);
123 virtual void extract(Scalar *v)
const;
125 virtual void change_sign();
126 virtual void set(
unsigned int idx, Scalar y);
127 virtual void add(
unsigned int idx, Scalar y);
128 virtual void add(
unsigned int n,
unsigned int *idx, Scalar *y);
130 virtual void add_vector(Scalar* vec);
139 friend class Solvers::PetscLinearMatrixSolver<Scalar>;
147 template <
typename Scalar>
148 class HERMES_API PetscLinearMatrixSolver :
public DirectSolver<Scalar>
151 PetscLinearMatrixSolver(PetscMatrix<Scalar> *mat, PetscVector<Scalar> *rhs);
152 virtual ~PetscLinearMatrixSolver();
154 virtual bool solve();
155 virtual int get_matrix_size();
158 PetscMatrix<Scalar> *m;
160 PetscVector<Scalar> *rhs;