23 #ifdef WITH_PARALUTION
31 template<
typename Scalar>
33 :
CSRMatrix<Scalar>(), paralutionMatrixType(type)
37 template<
typename Scalar>
40 this->paralutionMatrix.Clear();
46 template<
typename Scalar>
49 this->paralutionMatrix.Clear();
56 template<
typename Scalar>
62 template<
typename Scalar>
65 return this->paralutionMatrix;
68 template<
typename Scalar>
72 this->paralutionMatrix.SetDataPtrCSR(&this->Ap, &this->Ai, &this->Ax,
"paralutionMatrix", this->nnz, this->size, this->size);
75 template<
typename Scalar>
80 template<
typename Scalar>
84 this->paralutionVector->SetDataPtr(&this->
v,
"paralutionVector", this->size);
87 template<
typename Scalar>
91 this->paralutionVector->Clear();
92 this->paralutionVector->SetDataPtr(&this->v,
"vector", this->size);
95 template<
typename Scalar>
107 template<
typename Scalar>
110 this->paralutionVector->Clear();
115 template<
typename Scalar>
118 return this->paralutionVector;
121 template<
typename Scalar>
124 memset(this->v, 0, this->size *
sizeof(Scalar));
132 template<
typename Scalar>
139 template<
typename Scalar>
146 template<
typename Scalar>
152 template<
typename Scalar>
155 if (this->paralutionSolver)
156 delete this->paralutionSolver;
157 this->paralutionSolver =
nullptr;
161 template<
typename Scalar>
164 if (this->paralutionSolver)
165 delete this->paralutionSolver;
166 this->paralutionSolver =
nullptr;
169 template<
typename Scalar>
172 this->solve(
nullptr);
175 template<
typename Scalar>
180 this->reset_internal_solver();
181 this->init_internal_solver();
184 if (this->get_verbose_output())
185 this->paralutionSolver->Verbose(10);
187 this->paralutionSolver->Verbose(0);
190 switch (this->toleranceType)
192 case AbsoluteTolerance:
193 paralutionSolver->InitTol(this->tolerance, 0., std::numeric_limits<Scalar>::max());
195 case RelativeTolerance:
196 paralutionSolver->InitTol(0., this->tolerance, std::numeric_limits<Scalar>::max());
198 case DivergenceTolerance:
199 paralutionSolver->InitTol(0., 0., this->tolerance);
204 paralutionSolver->InitMaxIter(this->max_iters);
207 template<
typename Scalar>
211 if (this->sln && this->sln != initial_guess)
212 free_with_check(this->sln);
213 this->sln = malloc_with_check<AbstractParalutionLinearMatrixSolver<Scalar>, Scalar>(this->get_matrix_size(),
this);
217 memcpy(this->sln, initial_guess, this->get_matrix_size() *
sizeof(Scalar));
219 memset(this->sln, 0, this->get_matrix_size() *
sizeof(Scalar));
221 paralution::LocalVector<Scalar> x;
222 x.SetDataPtr(&this->sln,
"Initial guess", matrix->get_size());
225 if (std::abs(rhs->get_paralutionVector()->Norm()) < Hermes::HermesEpsilon)
227 x.LeaveDataPtr(&this->sln);
232 this->presolve_init();
237 this->paralutionSolver->MoveToAccelerator();
238 this->matrix->get_paralutionMatrix().MoveToAccelerator();
239 this->rhs->get_paralutionVector()->MoveToAccelerator();
240 x.MoveToAccelerator();
244 paralutionSolver->Solve(*rhs->get_paralutionVector(), &x);
247 num_iters = paralutionSolver->GetIterationCount();
250 final_residual = paralutionSolver->GetCurrentResidual();
253 x.LeaveDataPtr(&this->sln);
256 template<
typename Scalar>
259 return matrix->get_size();
262 template<
typename Scalar>
265 return this->num_iters;
268 template<
typename Scalar>
271 return final_residual;
274 template<
typename Scalar>
280 template<
typename Scalar>
285 delete preconditioner;
286 preconditioner =
nullptr;
291 template<
typename Scalar>
297 template<
typename Scalar>
302 delete preconditioner;
303 preconditioner =
nullptr;
307 template<
typename Scalar>
311 this->reset_internal_solver();
314 template<
typename Scalar>
315 paralution::IterativeLinearSolver<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>*
322 return new paralution::CG<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
327 return new paralution::GMRES<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
332 return new paralution::BiCGStab<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
335 #if __PARALUTION_VER >= 500
338 return new paralution::CR<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
343 return new paralution::IDR<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
353 template<
typename Scalar>
357 if (!this->paralutionSolver)
359 this->paralutionSolver = this->return_paralutionSolver(this->iterSolverType);
362 if (this->preconditioner)
363 this->paralutionSolver->SetPreconditioner(this->preconditioner->get_paralutionPreconditioner());
364 this->paralutionSolver->SetOperator(this->matrix->get_paralutionMatrix());
365 this->paralutionSolver->Build();
369 template<
typename Scalar>
372 if (this->preconditioner)
373 delete this->preconditioner;
376 if (paralutionPreconditioner)
377 this->preconditioner = paralutionPreconditioner;
382 template<
typename Scalar>
387 template<
typename Scalar>
393 template<
typename Scalar>
398 template<
typename Scalar>
402 if (!this->paralutionSolver)
404 paralution::AMG<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* AMG_solver;
405 this->paralutionSolver = AMG_solver =
new paralution::AMG<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
406 AMG_solver->SetManualSmoothers(
true);
407 AMG_solver->SetOperator(this->matrix->get_paralutionMatrix());
408 AMG_solver->BuildHierarchy();
411 int levels = AMG_solver->GetNumLevels();
412 paralution::IterativeLinearSolver<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar >** smoothers = malloc_with_check<AMGParalutionLinearMatrixSolver<Scalar>, paralution::IterativeLinearSolver<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar >*>(levels - 1,
this);
413 paralution::Preconditioner<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar >** preconditioners = malloc_with_check<AMGParalutionLinearMatrixSolver<Scalar>, paralution::Preconditioner<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar >*>(levels - 1,
this);
415 for (
int i = 0; i < levels - 1; ++i)
420 smoothers[i]->SetPreconditioner(*preconditioners[i]);
421 if (this->get_verbose_output())
422 smoothers[i]->Verbose(10);
424 smoothers[i]->Verbose(0);
427 AMG_solver->SetSmoother(smoothers);
428 AMG_solver->SetSmootherPreIter(3);
429 AMG_solver->SetSmootherPostIter(3);
439 namespace Preconditioners
441 template<
typename Scalar>
444 switch (preconditionerType)
447 this->paralutionPreconditioner =
new paralution::Jacobi<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
450 this->paralutionPreconditioner =
new paralution::ILU<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
452 case MultiColoredILU:
453 this->paralutionPreconditioner =
new paralution::MultiColoredILU<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
455 case MultiColoredSGS:
456 this->paralutionPreconditioner =
new paralution::MultiColoredSGS<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
459 this->paralutionPreconditioner =
new paralution::IC<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
462 this->paralutionPreconditioner =
new paralution::AIChebyshev<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
464 #if __PARALUTION_VER >= 500
465 case MultiElimination:
467 this->mcilu_p =
new paralution::MultiColoredILU < paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar > ;
470 paralution::MultiElimination<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* multiEliminationPreconditioner =
471 new paralution::MultiElimination<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
472 multiEliminationPreconditioner->Set(*mcilu_p, 2, 0.4);
473 this->paralutionPreconditioner = multiEliminationPreconditioner;
478 paralution::DiagJacobiSaddlePointPrecond<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* saddlePointPrecond =
479 new paralution::DiagJacobiSaddlePointPrecond<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
480 this->saddlePoint_p_k =
new paralution::FSAI < paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar > ;
481 this->saddlePoint_p_s =
new paralution::SPAI < paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar > ;
482 saddlePointPrecond->Set(*this->saddlePoint_p_k, *this->saddlePoint_p_s);
483 this->paralutionPreconditioner = saddlePointPrecond;
492 template<
typename Scalar>
495 #if __PARALUTION_VER >= 500
497 paralution::DiagJacobiSaddlePointPrecond<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>* saddlePointPrecond =
498 dynamic_cast<paralution::DiagJacobiSaddlePointPrecond<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar
>*>(this->paralutionPreconditioner);
499 if (saddlePointPrecond)
500 saddlePointPrecond->Set(*this->saddlePoint_p_k, *this->saddlePoint_p_s);
502 return (*this->paralutionPreconditioner);
505 template<
typename Scalar>
511 return new paralution::Jacobi<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
514 return new paralution::ILU<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
516 case MultiColoredILU:
517 return new paralution::MultiColoredILU<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
519 case MultiColoredSGS:
520 return new paralution::MultiColoredSGS<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
523 return new paralution::IC<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
526 return new paralution::AIChebyshev<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
528 #if __PARALUTION_VER >= 500
529 case MultiElimination:
530 return new paralution::MultiElimination<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
533 return new paralution::DiagJacobiSaddlePointPrecond<paralution::LocalMatrix<Scalar>, paralution::LocalVector<Scalar>, Scalar>();
AMGParalutionLinearMatrixSolver(ParalutionMatrix< Scalar > *m, ParalutionVector< Scalar > *rhs)
virtual void zero()
Utility method.
IterativeParalutionLinearMatrixSolver()
General namespace for the Hermes library.
Exception interface Basically a std::exception, but with a constructor with string and with print_msg...
virtual void set_smoother(IterSolverType solverType, PreconditionerType preconditionerType)
Set smoother (an iterative linear matrix solver).
virtual void alloc(unsigned int ndofs)
Abstract class to define interface for preconditioners.
PARALUTION solver interface.
General CSR Matrix class. (can be used in umfpack, in that case use the CSCMatrix subclass...
Encapsulation of PARALUTION AMG linear solver.
virtual void free()
Utility method.
virtual void alloc(unsigned int ndofs)
virtual void alloc()
Allocate utility storage (row, column indices, etc.).
File containing common definitions, and basic global enums etc. for HermesCommon. ...
PreconditionerType
The preconditioner type.
virtual int get_matrix_size()
Utility.
virtual void zero()
Zero the vector.
Abstract class for defining interface for Algebraic Multigrid solvers. Internal, though utilizable fo...
virtual void zero()
Utility method.
ParalutionMatrix(ParalutionMatrixType type=ParalutionMatrixTypeCSR)
Default constructor.
Vector used with MUMPS solver.
AbstractParalutionLinearMatrixSolver()
A PARALUTION preconditioner.
HERMES_COMMON_API Hermes::Api HermesCommonApi
Global instance used inside Hermes which is also accessible to users.
virtual int get_num_iters()
Get number of iterations.
virtual void set_tolerance(double tol)
virtual void free()
free the memory
virtual void init_internal_solver()
Set internal solver for the current solution.
virtual void set_max_iters(int iters)
void free()
Free this instance.
Abstract middle-class for solvers that work in a loop of a kind (iterative, multigrid, ...)
General Paralution matrix.
factorization / operator.
ParalutionVector()
Default constructor.
Abstract class for defining interface for iterative solvers. Internal, though utilizable for defining...
virtual void init_internal_solver()
Set internal solver for the current solution.
virtual void free()
Free this instance.
virtual void set_precond(Precond< Scalar > *pc)
Set preconditioner.
void set_solver_type(IterSolverType iterSolverType)
virtual double get_residual_norm()
Get the residual value.
virtual void set_smoother(IterSolverType solverType, PreconditionerType preconditionerType)
Set smoother (an iterative linear matrix solver).
ABSTRACT class containing common functionality of both PARALUTION iterative and AMG linear solver...
ParalutionPrecond(PreconditionerType preconditionerType)
void reset_internal_solver()
Internal solver is not reusable and will have to be re-created.
Class representing the vector for UMFPACK.
virtual void free()
free the memory
Encapsulation of PARALUTION iterative linear solver.
virtual void free()
Utility method.
virtual void alloc()
Allocate utility storage (row, column indices, etc.).
void set_solver_type(IterSolverType iterSolverType)