15#define MPI_COMM_SUB (*(MPI_Comm*)(m_kernel->subParallelMng(m_index)->getMPICommunicator()))
16#define OMPI_SKIP_MPICXX
17#ifndef MPICH_SKIP_MPICXX
18#define MPICH_SKIP_MPICXX
21#include <HYPRE_utilities.h>
22#include <HYPRE_IJ_mv.h>
23#include <HYPRE_parcsr_mv.h>
24#include <HYPRE_parcsr_ls.h>
25#include <_hypre_parcsr_mv.h>
29#define ItacRegion(a, x)
32#include "arcane/aleph/AlephArcane.h"
35#if HYPRE_RELEASE_NUMBER < 21600
36using HYPRE_BigInt = HYPRE_Int;
60check(
const char* hypre_func, HYPRE_Int error_code)
65 HYPRE_DescribeError(error_code, buf);
66 cout <<
"\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
67 <<
"\nHYPRE ERROR in function "
69 <<
"\nError_code=" << error_code
70 <<
"\nMessage=" << buf
71 <<
"\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
74 throw Exception(
"HYPRE Check", hypre_func);
79_allocHypre(Integer size)
81 size_t s =
sizeof(T) * size;
82 return reinterpret_cast<T*
>(hypre_TAlloc(
char, s, HYPRE_MEMORY_HOST));
87_callocHypre(Integer size)
89 size_t s =
sizeof(T) * size;
90 return reinterpret_cast<T*
>(hypre_CTAlloc(
char, s, HYPRE_MEMORY_HOST));
94hypreCheck(
const char* hypre_func, HYPRE_Int error_code)
96 check(hypre_func, error_code);
97 HYPRE_Int r = HYPRE_GetError();
99 cout <<
"HYPRE GET ERROR r=" << r
100 <<
" error_code=" << error_code <<
" func=" << hypre_func <<
'\n';
114 , m_hypre_ijvector(0)
115 , m_hypre_parvector(0)
120 debug() <<
"[AlephVectorHypre::AlephVectorHypre] new SolverVectorHypre";
133 void AlephVectorCreate(
void)
135 debug() <<
"[AlephVectorHypre::AlephVectorCreate] HYPRE VectorCreate";
139 if (m_kernel->rank() != m_kernel->solverRanks(m_index)[
iCpu])
141 debug() <<
"[AlephVectorHypre::AlephVectorCreate] adding contibution of core #" <<
iCpu;
143 jLower = m_kernel->topology()->gathered_nb_row(
iCpu);
144 jUpper = m_kernel->topology()->gathered_nb_row(
iCpu + 1) - 1;
147 debug() <<
"[AlephVectorHypre::AlephVectorCreate] jLower=" << jLower <<
", jupper=" << jUpper;
149 jSize = jUpper - jLower + 1;
157 debug() <<
"[AlephVectorHypre::AlephVectorCreate] HYPRE IJVectorSetObjectType";
160 debug() <<
"[AlephVectorHypre::AlephVectorCreate] HYPRE IJVectorInitialize";
165 debug() <<
"[AlephVectorHypre::AlephVectorCreate] done";
172 debug() <<
"[AlephVectorHypre::AlephVectorSet] size=" << size;
178 int AlephVectorAssemble(
void)
180 debug() <<
"[AlephVectorHypre::AlephVectorAssemble]";
190 debug() <<
"[AlephVectorHypre::AlephVectorGet] size=" << size;
212 normInf = m_kernel->subParallelMng(m_index)->
reduce(Parallel::ReduceMax, normInf);
218 void writeToFile(
const String filename)
221 debug() <<
"[AlephVectorHypre::writeToFile]";
246 , m_hypre_ijmatrix(0)
248 debug() <<
"[AlephMatrixHypre] new AlephMatrixHypre";
253 debug() <<
"[~AlephMatrixHypre]";
268 void AlephMatrixCreate(
void)
270 debug() <<
"[AlephMatrixHypre::AlephMatrixCreate] HYPRE MatrixCreate idx:" << m_index;
275 if (m_kernel->rank() != m_kernel->solverRanks(m_index)[
iCpu])
278 ilower = m_kernel->topology()->gathered_nb_row(
iCpu);
279 iupper = m_kernel->topology()->gathered_nb_row(
iCpu + 1) - 1;
281 debug() <<
"[AlephMatrixHypre::AlephMatrixCreate] ilower=" <<
ilower <<
", iupper=" <<
iupper;
285 debug() <<
"[AlephMatrixHypre::AlephMatrixCreate] jlower=" <<
jlower <<
", jupper=" <<
jupper;
293 debug() <<
"[AlephMatrixHypre::AlephMatrixCreate] HYPRE IJMatrixSetObjectType";
295 debug() <<
"[AlephMatrixHypre::AlephMatrixCreate] HYPRE IJMatrixSetRowSizes";
297 debug() <<
"[AlephMatrixHypre::AlephMatrixCreate] HYPRE IJMatrixInitialize";
305 void AlephMatrixSetFilled(
bool) {}
309 int AlephMatrixAssemble(
void)
311 debug() <<
"[AlephMatrixHypre::AlephMatrixAssemble]";
321 debug() <<
"[AlephMatrixHypre::AlephMatrixFill] size=" << size;
324 for (
int i = 0; i < size; i++) {
329 debug() <<
"[AlephMatrixHypre::AlephMatrixFill] done";
345 const Real
res0 =
b->norm_max();
348 info() <<
"analyse convergence : norme max du second membre res0 : " <<
res0;
355 info() <<
"analyse convergence : le second membre du système linéaire est inférieur à : " <<
considered_as_null;
359 if (params->xoUser()) {
375 info() <<
"analyse convergence : x0 est déjà solution du système.";
383 info() <<
"analyse convergence : résidu initial : " <<
residu
384 <<
" --- residu relatif initial (residu/res0) : " <<
residu /
res0;
388 info() <<
"analyse convergence : X est déjà solution du système";
405 solver_param->setAmgCoarseningMethod(TypesSolver::AMG_COARSENING_AUTO);
406 const String func_name(
"SolverMatrixHypre::solve");
431 debug() <<
"[AlephMatrixHypre::AlephMatrixSolve] isAlreadySolved !";
444 case TypesSolver::PCG:
447 case TypesSolver::BiCGStab:
450 case TypesSolver::GMRES:
461 case TypesSolver::NONE:
463 case TypesSolver::DIAGONAL:
466 case TypesSolver::ILU:
469 case TypesSolver::SPAIstat:
472 case TypesSolver::AMG:
475 case TypesSolver::AINV:
477 case TypesSolver::SPAIdyn:
479 case TypesSolver::ILUp:
481 case TypesSolver::IC:
483 case TypesSolver::POLY:
494 case TypesSolver::PCG:
497 case TypesSolver::BiCGStab:
500 case TypesSolver::GMRES:
524 case TypesSolver::NONE:
526 case TypesSolver::DIAGONAL:
528 case TypesSolver::ILU:
531 case TypesSolver::SPAIstat:
534 case TypesSolver::AMG:
542 info() <<
"\n============================================================";
543 info() <<
"\nCette erreur est retournée après " << iteration <<
"\n";
544 info() <<
"\nOn a atteind le nombre max d'itérations du solveur.";
545 info() <<
"\nIl est possible de demander au code de ne pas tenir compte de cette erreur.";
546 info() <<
"\nVoir la documentation du jeu de données concernant le service solveur.";
547 info() <<
"\n======================================================";
548 throw Exception(
"AlephMatrixHypre::Solve",
"On a atteind le nombre max d'itérations du solveur");
555 void writeToFile(
const String filename)
564 const String func_name =
"SolverMatrixHypre::initSolverPCG";
580 const String func_name =
"SolverMatrixHypre::initSolverBiCGStab";
595 const String func_name =
"SolverMatrixHypre::initSolverGMRES";
610 void setDiagonalPreconditioner(
const TypesSolver::eSolverMethod
solver_method,
614 const String func_name =
"SolverMatrixHypre::setDiagonalPreconditioner";
616 case TypesSolver::PCG:
622 case TypesSolver::BiCGStab:
628 case TypesSolver::GMRES:
635 throw ArgumentException(func_name,
"solveur inconnu pour preconditionnement 'Diagonal'");
641 void setILUPreconditioner(
const TypesSolver::eSolverMethod
solver_method,
645 const String func_name =
"SolverMatrixHypre::setILUPreconditioner";
647 case TypesSolver::PCG:
648 throw ArgumentException(func_name,
"solveur PCG indisponible avec le preconditionnement 'ILU'");
650 case TypesSolver::BiCGStab:
657 case TypesSolver::GMRES:
666 throw ArgumentException(func_name,
"solveur inconnu pour preconditionnement ILU\n");
672 void setSpaiStatPreconditioner(
const TypesSolver::eSolverMethod
solver_method,
686 case TypesSolver::PCG:
689 case TypesSolver::BiCGStab:
690 throw ArgumentException(
"AlephMatrixHypre::setSpaiStatPreconditioner",
"solveur 'BiCGStab' invalide pour preconditionnement 'SPAIstat'");
692 case TypesSolver::GMRES:
698 throw ArgumentException(
"AlephMatrixHypre::setSpaiStatPreconditioner",
"solveur inconnu pour preconditionnement 'SPAIstat'\n");
705 void setAMGPreconditioner(
const TypesSolver::eSolverMethod
solver_method,
777 for (
int i = 0; i < 2 *
num_sweep; i += 2) {
786 for (
int i = 0; i < 2 *
num_sweep; i += 2) {
795 for (
int i = 0; i < 2 *
num_sweep; i += 2) {
826 case TypesSolver::PCG:
832 case TypesSolver::BiCGStab:
838 case TypesSolver::GMRES:
845 throw ArgumentException(
"AlephMatrixHypre::setAMGPreconditioner",
"solveur inconnu pour preconditionnement 'AMG'\n");
859 const String func_name =
"SolverMatrixHypre::solvePCG";
888 const String func_name =
"SolverMatrixHypre::solveBiCGStab";
914 const String func_name =
"SolverMatrixHypre::solveGMRES";
948 for (
auto* v : m_IAlephVectors )
950 for (
auto* v : m_IAlephMatrixs )
956 void initialize()
override
961#if HYPRE_RELEASE_NUMBER >= 22900
963 info() <<
"Initializing HYPRE";
966#elif HYPRE_RELEASE_NUMBER >= 22700
967 info() <<
"Initializing HYPRE";
971#if HYPRE_RELEASE_NUMBER >= 22700
980 Integer nb_row_size)
override
983 ARCANE_UNUSED(kernel);
984 ARCANE_UNUSED(index);
985 ARCANE_UNUSED(nb_row_size);
991 Integer index)
override
1000 Integer index)
override
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_REGISTER_APPLICATION_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Classe de base d'un service.
Paramètres d'un système linéraire.
Vecteur d'un système linéaire.
Interface d'une fabrique d'implémentation pour Aleph.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Structure contenant les informations pour créer un service.
Exception lorsqu'un argument est invalide.
Classe de base d'une exception.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
int AlephInt
Type par défaut pour indexer les lignes et les colonnes des matrices et vecteurs.