Arcane  4.2.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
AlinaLib.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* AlinaLib.h (C) 2000-2026 */
9/* */
10/* API publique pour Alina. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_ALINA_ALINALIB_H
13#define ARCCORE_ALINA_ALINALIB_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16/*
17 * Ce fichier est basé sur le travail effectué sur la bibliothèque AMGCL (version mars 2026)
18 * qui peut être trouvée à https://github.com/ddemidov/amgcl.
19 *
20 * Copyright (c) 2012-2022 Denis Demidov <dennis.demidov@gmail.com>
21 * SPDX-License-Identifier: MIT
22 */
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26#include "arccore/alina/AlinaGlobal.h"
27
28#include <mpi.h>
29
30// Convergence info
31struct ARCCORE_ALINA_EXPORT AlinaConvergenceInfo
32{
33 int iterations;
34 double residual;
35};
36
37typedef double(* AlinaDefVecFunction)(int vec, ptrdiff_t coo, void* data);
38
40struct AlinaParameters;
41
44
47
50
51class ARCCORE_ALINA_EXPORT AlinaLib
52{
53 public:
54
55 // Définit un paramètre entier dans une liste de paramètres.
56 static void params_set_int(AlinaParameters* prm, const char* name, int value);
57
58 // Définit un paramètre flottant dans une liste de paramètres.
59 static void params_set_float(AlinaParameters* prm, const char* name, float value);
60
61 // Définit un paramètre flottant dans une liste de paramètres.
62 static void params_set_string(AlinaParameters* prm, const char* name, const char* value);
63
64 // Lit les paramètres à partir d'un fichier JSON
65 static void params_read_json(AlinaParameters* prm, const char* fname);
66
67 // Détruit la liste de paramètres.
68 static void params_destroy(AlinaParameters* prm);
69
70 // Crée la liste de paramètres.
71 static AlinaParameters* params_create();
72
73 // Crée le préconditionneur AMG.
74 static AlinaPreconditioner* preconditioner_create(int n,
75 const int* ptr,
76 const int* col,
77 const double* val,
78 AlinaParameters* parameters);
79
80 // Applique le préconditionneur AMG (x = M^(-1) * rhs).
81 static void preconditioner_apply(AlinaPreconditioner* amg, const double* rhs, double* x);
82
83 // Affiche la structure du préconditionneur
84 static void preconditioner_report(AlinaPreconditioner* amg);
85
86 // Détruit le préconditionneur AMG
87 static void preconditioner_destroy(AlinaPreconditioner* amg);
88
89 // Crée le solveur itératif préconditionné par AMG.
90 static AlinaSequentialSolver* solver_create(int n,
91 const int* ptr,
92 const int* col,
93 const double* val,
94 AlinaParameters* parameters);
95
96 // Résoud le problème pour le côté droit donné.
97 static AlinaConvergenceInfo solver_solve(AlinaSequentialSolver* solver,
98 double const* rhs,
99 double* x);
100
101 // Résoud le problème pour la matrice et le côté droit donnés.
102 static AlinaConvergenceInfo solver_solve_matrix(AlinaSequentialSolver* solver,
103 int const* A_ptr,
104 int const* A_col,
105 double const* A_val,
106 double const* rhs,
107 double* x);
108
109 // Affiche la structure du solveur
110 static void solver_report(AlinaSequentialSolver* solver);
111
112 // Détruit le solveur itératif.
113 static void solver_destroy(AlinaSequentialSolver* solver);
114
115 // Crée le solveur distribué.
116 static AlinaDistributedSolver* solver_mpi_create(MPI_Comm comm,
117 ptrdiff_t n,
118 const int* ptr,
119 const int* col,
120 const double* val,
121 int n_def_vec,
122 AlinaDefVecFunction def_vec_func,
123 void* def_vec_data,
124 AlinaParameters* params);
125
126 // Trouve la solution pour le côté droit donné.
127 static AlinaConvergenceInfo solver_mpi_solve(AlinaDistributedSolver* solver,
128 double const* rhs,
129 double* x);
130
131 // Détruit le solveur distribué.
132 static void solver_mpi_destroy(AlinaDistributedSolver* solver);
133};
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138#endif
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/