HermesCommon  3.0
paralution_solver.h
Go to the documentation of this file.
1 // This file is part of HermesCommon
2 //
3 // Copyright (c) 2009 hp-FEM group at the University of Nevada, Reno (UNR).
4 // Email: hpfem-group@unr.edu, home page: http://www.hpfem.org/.
5 //
6 // Hermes2D is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published
8 // by the Free Software Foundation; either version 2 of the License,
9 // or (at your option) any later version.
10 //
11 // Hermes2D 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 General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with Hermes2D; if not, write to the Free Software
18 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #ifndef __HERMES_COMMON_PARALUTION_SOLVER_H_
23 #define __HERMES_COMMON_PARALUTION_SOLVER_H_
24 #include "config.h"
25 #ifdef WITH_PARALUTION
27 #include "algebra/cs_matrix.h"
28 
29 #include "paralution.hpp"
30 #include "solvers/precond.h"
31 
32 using namespace Hermes::Algebra;
33 
34 namespace Hermes
35 {
36  namespace Algebra
37  {
38  using namespace Hermes::Solvers;
39 
42  {
43  ParalutionMatrixTypeCSR,
44  // ParalutionMatrixTypeBCSR,
45  // ParalutionMatrixTypeMCSR,
46  // ParalutionMatrixTypeCOO,
47  // ParalutionMatrixTypeDIA,
48  // ParalutionMatrixTypeELL,
49  // ParalutionMatrixTypeHYB,
50  // ParalutionMatrixTypeDENSE
51  };
52 
54  template <typename Scalar>
55  class HERMES_API ParalutionMatrix : public CSRMatrix < Scalar >
56  {
57  public:
59  ParalutionMatrix(ParalutionMatrixType type = ParalutionMatrixTypeCSR);
60  virtual ~ParalutionMatrix();
61 
62  virtual void free();
63  virtual void zero();
64  virtual void alloc();
65 
66  paralution::LocalMatrix<Scalar>& get_paralutionMatrix();
67 
68  private:
69  paralution::LocalMatrix<Scalar> paralutionMatrix;
70  ParalutionMatrixType paralutionMatrixType;
71 
72  // Friends.
73  template<typename T> friend SparseMatrix<T>* create_matrix();
74  };
75 
77  template <typename Scalar>
78  class HERMES_API ParalutionVector : public SimpleVector < Scalar >
79  {
80  public:
85  ParalutionVector(unsigned int size);
86  virtual ~ParalutionVector();
87  virtual void alloc(unsigned int ndofs);
88  virtual void free();
89  virtual void zero();
90 
91  paralution::LocalVector<Scalar>* get_paralutionVector();
92 
93  private:
94  paralution::LocalVector<Scalar>* paralutionVector;
95  };
96  }
97 
98  namespace Preconditioners
99  {
102  template <typename Scalar>
104  {
105  public:
108  ParalutionPrecond(PreconditionerType preconditionerType);
109 
110  paralution::Preconditioner<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>& get_paralutionPreconditioner();
111  static paralution::Preconditioner<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* return_paralutionPreconditioner(PreconditionerType preconditionerType);
112  private:
114  paralution::Preconditioner<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* paralutionPreconditioner;
115 
116 #if __PARALUTION_VER >= 500
117  paralution::FSAI<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* saddlePoint_p_k;
120  paralution::SPAI<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* saddlePoint_p_s;
122  paralution::MultiColoredILU<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar >* mcilu_p;
123 #endif
124  };
125  }
126 
127  namespace Solvers
128  {
132  {
133  public:
134  static void init_paralution()
135  {
136  paralution::init_paralution();
137  paralution::set_omp_threads_paralution(HermesCommonApi.get_integral_param_value(numThreads));
138  paralution::info_paralution();
139  }
140 
141  static void set_threads_paralution()
142  {
143  if (HermesCommonApi.get_integral_param_value(matrixSolverType) == SOLVER_PARALUTION_AMG || HermesCommonApi.get_integral_param_value(matrixSolverType) == SOLVER_PARALUTION_ITERATIVE)
144  {
145  paralution::set_omp_threads_paralution(HermesCommonApi.get_integral_param_value(numThreads));
146  paralution::info_paralution();
147  }
148  }
149 
150  static void deinit_paralution()
151  {
152  paralution::stop_paralution();
153  }
154  };
155 
158  template <typename Scalar>
159  class HERMES_API AbstractParalutionLinearMatrixSolver : public virtual LoopSolver < Scalar >
160  {
161  public:
162  virtual void solve(Scalar* initial_guess);
163  virtual void solve();
164 
166  virtual int get_num_iters();
167 
169  virtual double get_residual_norm();
170 
172  virtual int get_matrix_size();
173 
175  virtual void free();
176 
177  protected:
184 
186  void reset_internal_solver();
187 
189  virtual void init_internal_solver() = 0;
190 
193 
196 
197  // Store num_iters.
198  int num_iters;
199 
200  // Store final_residual.
201  double final_residual;
202 
204  paralution::IterativeLinearSolver<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* paralutionSolver;
205 
206  private:
208  void presolve_init();
209 
210  template<typename T> friend LinearMatrixSolver<T>* create_linear_solver(Matrix<T>* matrix, Vector<T>* rhs, bool use_direct_solver);
211  template<typename T> friend class AMGParalutionLinearMatrixSolver;
212  };
213 
216  template <typename Scalar>
217  class HERMES_API IterativeParalutionLinearMatrixSolver : public AbstractParalutionLinearMatrixSolver<Scalar>, public virtual IterSolver < Scalar >
218  {
219  public:
226 
229  void set_solver_type(IterSolverType iterSolverType);
230 
232  virtual void init_internal_solver();
233 
235  void free();
236 
237  virtual void set_precond(Precond<Scalar> *pc);
238 
239  // Linear Solver creation.
240  static paralution::IterativeLinearSolver<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* return_paralutionSolver(IterSolverType type);
241 
242  private:
245  };
246 
249  template <typename Scalar>
250  class HERMES_API AMGParalutionLinearMatrixSolver : public AbstractParalutionLinearMatrixSolver<Scalar>, public virtual AMGSolver < Scalar >
251  {
252  public:
258 
260  virtual void set_smoother(IterSolverType solverType, PreconditionerType preconditionerType);
261 
263  virtual void init_internal_solver();
264  };
265  }
266 }
267 #endif
268 #endif
General (abstract) matrix representation in Hermes.
Definition: matrix.h:36
General namespace for the Hermes library.
Linear matrix solver functionality.
General (abstract) vector representation in Hermes.
Abstract class to define interface for preconditioners.
Definition: precond.h:57
HERMES_API SparseMatrix< Scalar > * create_matrix(bool use_direct_solver=false)
Function returning a matrix according to the users's choice.
Definition: matrix.cpp:298
General CSR Matrix class. (can be used in umfpack, in that case use the CSCMatrix subclass...
Definition: cs_matrix.h:161
Encapsulation of PARALUTION AMG linear solver.
Namespace containing classes for vector / matrix operations.
PreconditionerType
The preconditioner type.
Definition: precond.h:42
General (abstract) sparse matrix representation in Hermes.
Abstract class for defining interface for Algebraic Multigrid solvers. Internal, though utilizable fo...
Basic cs (Compressed sparse) matrix classes and operations.
Vector used with MUMPS solver.
Definition: vector.h:116
ParalutionMatrix< Scalar > * matrix
Matrix to solve.
HERMES_COMMON_API Hermes::Api HermesCommonApi
Global instance used inside Hermes which is also accessible to users.
Definition: api.cpp:158
Namespace for linear / nonlinear / iterative solvers.
Definition: amesos_solver.h:34
Abstract middle-class for solvers that work in a loop of a kind (iterative, multigrid, ...)
HERMES_API LinearMatrixSolver< Scalar > * create_linear_solver(Matrix< Scalar > *matrix, Vector< Scalar > *rhs, bool use_direct_solver=false)
Function returning a solver according to the users's choice.
General Paralution matrix.
Abstract class for defining solver interface.
paralution::IterativeLinearSolver< paralution::LocalMatrix< Scalar >, paralution::LocalVector< Scalar >, Scalar > * paralutionSolver
Internal solver.
Abstract class for defining interface for iterative solvers. Internal, though utilizable for defining...
General functionality for preconditioners. Contains class Precond.
ABSTRACT class containing common functionality of both PARALUTION iterative and AMG linear solver...
Class representing the vector for UMFPACK.
Encapsulation of PARALUTION iterative linear solver.
ParalutionVector< Scalar > * rhs
Right hand side vector.