22 #ifndef __HERMES_COMMON_MUMPS_SOLVER_H_
23 #define __HERMES_COMMON_MUMPS_SOLVER_H_
26 #include "linear_matrix_solver.h"
31 #include <mumps_c_types.h>
44 template <
typename Scalar>
class MumpsSolver;
52 template <
typename Scalar>
struct mumps_type;
56 struct mumps_type<std::complex<double> >
59 typedef ZMUMPS_STRUC_C mumps_struct;
61 typedef ZMUMPS_COMPLEX mumps_Scalar;
66 struct mumps_type<double>
69 typedef DMUMPS_STRUC_C mumps_struct;
71 typedef double mumps_Scalar;
75 template <
typename Scalar>
76 class MumpsMatrix :
public SparseMatrix<Scalar>
80 virtual ~MumpsMatrix();
84 virtual Scalar
get(
unsigned int m,
unsigned int n);
86 virtual void add(
unsigned int m,
unsigned int n, Scalar v);
87 virtual void add_to_diagonal(Scalar v);
88 virtual void add(
unsigned int m,
unsigned int n, Scalar **mat,
int *rows,
int *cols);
90 virtual unsigned int get_matrix_size()
const;
91 virtual unsigned int get_nnz()
const;
92 virtual double get_fill_in()
const;
95 virtual void add_matrix(MumpsMatrix* mat);
99 virtual void add_to_diagonal_blocks(
int num_stages, MumpsMatrix* mat);
100 virtual void add_sparse_to_diagonal_blocks(
int num_stages, SparseMatrix<Scalar>* mat);
105 virtual void add_as_block(
unsigned int i,
unsigned int j, MumpsMatrix* mat);
108 void multiply_with_vector(Scalar* vector_in, Scalar* vector_out);
110 void multiply_with_Scalar(Scalar value);
112 void create(
unsigned int size,
unsigned int nnz,
int* ap,
int* ai, Scalar* ax);
114 MumpsMatrix* duplicate();
121 typename mumps_type<Scalar>::mumps_Scalar *Ax;
125 friend class Solvers::MumpsSolver<Scalar>;
126 template<
typename T>
friend SparseMatrix<T>*
create_matrix();
130 template <
typename Scalar>
131 class MumpsVector :
public Vector<Scalar>
135 virtual ~MumpsVector();
137 virtual void alloc(
unsigned int ndofs);
139 virtual Scalar
get(
unsigned int idx);
140 virtual void extract(Scalar *v)
const;
142 virtual void change_sign();
143 virtual void set(
unsigned int idx, Scalar y);
144 virtual void add(
unsigned int idx, Scalar y);
145 virtual void add(
unsigned int n,
unsigned int *idx, Scalar *y);
146 virtual void add_vector(Vector<Scalar>* vec);
147 virtual void add_vector(Scalar* vec);
155 friend class Solvers::MumpsSolver<Scalar>;
163 template <
typename Scalar>
164 class HERMES_API MumpsSolver :
public DirectSolver<Scalar>
170 MumpsSolver(MumpsMatrix<Scalar> *m, MumpsVector<Scalar> *rhs);
171 virtual ~MumpsSolver();
173 virtual bool solve();
174 virtual int get_matrix_size();
177 MumpsMatrix<Scalar> *m;
179 MumpsVector<Scalar> *rhs;
182 bool setup_factorization();
185 typename mumps_type<Scalar>::mumps_struct param;
197 void mumps_c(
typename mumps_type<Scalar>::mumps_struct * param);