22 #ifndef __HERMES_COMMON_UMFPACK_SOLVER_H_
23 #define __HERMES_COMMON_UMFPACK_SOLVER_H_
26 #include "linear_matrix_solver.h"
29 using namespace Hermes::Algebra;
35 template <
typename Scalar>
class HERMES_API UMFPackLinearMatrixSolver;
36 template <
typename Scalar>
class HERMES_API UMFPackIterator;
41 using namespace Hermes::Solvers;
45 template <
typename Scalar>
55 void create(
unsigned int size,
unsigned int nnz,
int* ap,
int* ai, Scalar* ax);
62 CSCMatrix(
unsigned int size);
66 virtual Scalar
get(
unsigned int m,
unsigned int n);
68 virtual void add(
unsigned int m,
unsigned int n, Scalar v);
69 virtual void add_to_diagonal(Scalar v);
72 virtual void add_matrix(CSCMatrix<Scalar>* mat);
76 virtual void add_to_diagonal_blocks(
int num_stages, CSCMatrix<Scalar>* mat);
82 virtual void add_as_block(
unsigned int i,
unsigned int j, CSCMatrix<Scalar>* mat);
83 virtual void add(
unsigned int m,
unsigned int n, Scalar **mat,
int *rows,
int *cols);
85 virtual unsigned int get_matrix_size()
const;
86 virtual unsigned int get_nnz()
const;
87 virtual double get_fill_in()
const;
90 void multiply_with_vector(Scalar* vector_in, Scalar* vector_out);
92 void multiply_with_Scalar(Scalar value);
95 CSCMatrix* duplicate();
116 template <
typename T>
friend class Hermes::Solvers::UMFPackLinearMatrixSolver;
117 template <
typename T>
friend class Hermes::Solvers::UMFPackIterator;
122 template <
typename Scalar>
123 class HERMES_API UMFPackMatrix :
public CSCMatrix<Scalar>
125 template <
typename T>
friend class Hermes::Solvers::UMFPackLinearMatrixSolver;
126 template <
typename T>
friend class Hermes::Solvers::UMFPackIterator;
131 template <
typename Scalar>
132 class HERMES_API UMFPackVector :
public Vector<Scalar>
138 UMFPackVector(
unsigned int size);
139 virtual ~UMFPackVector();
140 virtual void alloc(
unsigned int ndofs);
142 virtual Scalar
get(
unsigned int idx);
143 virtual void extract(Scalar *v)
const;
145 virtual void change_sign();
146 virtual void set(
unsigned int idx, Scalar y);
147 virtual void add(
unsigned int idx, Scalar y);
148 virtual void add(
unsigned int n,
unsigned int *idx, Scalar *y);
150 virtual void add_vector(Scalar* vec);
155 Scalar *get_c_array();
160 template <
typename T>
friend class Hermes::Solvers::UMFPackLinearMatrixSolver;
161 template <
typename T>
friend class Hermes::Solvers::UMFPackIterator;
170 template <
typename Scalar>
171 class HERMES_API UMFPackLinearMatrixSolver :
public DirectSolver<Scalar>
177 UMFPackLinearMatrixSolver(UMFPackMatrix<Scalar> *m, UMFPackVector<Scalar> *rhs);
178 virtual ~UMFPackLinearMatrixSolver();
179 virtual bool solve();
180 virtual int get_matrix_size();
183 UMFPackMatrix<Scalar> *m;
185 UMFPackVector<Scalar> *rhs;
193 void free_factorization_data();
195 bool setup_factorization();
196 template <
typename T>
friend class Hermes::Algebra::CSCMatrix;
197 template <
typename T>
friend class Hermes::Algebra::UMFPackMatrix;
198 template <
typename T>
friend class Hermes::Algebra::UMFPackVector;
200 void check_status(
const char *fn_name,
int status);
204 template <
typename Scalar>
205 class UMFPackIterator
208 UMFPackIterator(CSCMatrix<Scalar>* mat);
210 void get_current_position(
int& i,
int& j, Scalar& val);
211 bool move_to_position(
int i,
int j);
213 void add_to_current_position(Scalar val);
222 template <
typename T>
friend class Hermes::Algebra::CSCMatrix;
223 template <
typename T>
friend class Hermes::Algebra::UMFPackMatrix;
224 template <
typename T>
friend class Hermes::Algebra::UMFPackVector;