Arcane  4.2.3.0
Developer documentation
Loading...
Searching...
No Matches
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/* Public API for Alina. . */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_ALINA_ALINALIB_H
13#define ARCCORE_ALINA_ALINALIB_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16/*
17 * This file is based on the work on AMGCL library (version march 2026)
18 * which can be found at 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 "arccore/base/Span.h"
30
31#include <memory>
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane::AlinaLib
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
43struct ARCCORE_ALINA_EXPORT AlinaConvergenceInfo
44{
45 int iterations = 0;
46 double residual = 0.0;
47};
48
58class AlinaSolver;
59// For compatibility
60using AlinaDistributedSolver = AlinaSolver;
61using AlinaSequentialSolver = AlinaSolver;
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
67enum class eAlinaSolverType
68{
69 ConjugateGradient,
70 BiCGStab,
71 GMRES
72};
73
75enum class eAlinaPreconditionerType
76{
77 AMG,
78 Diagonal
79};
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
88class ARCCORE_ALINA_EXPORT AlinaParameters
89{
90 friend AlinaPreconditioner;
91 friend AlinaSequentialSolver;
92 friend AlinaDistributedSolver;
93 friend AlinaSequentialSolverImpl;
94 friend AlinaDistributedSolverImpl;
95
96 public:
97
98 AlinaParameters();
99
100 public:
101
103 void setInt32(const char* name, Int32 value);
104
106 void setInt64(const char* name, Int64 value);
107
109 void setReal(const char* name, Real value);
110
112 void setString(const char* name, const char* value);
113
115 void readFromJSON(const char* fname);
116
117 private:
118
119 std::shared_ptr<AlinaParametersImpl> m_p;
120};
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
129class ARCCORE_ALINA_EXPORT AlinaSolverParameters
130{
131 friend AlinaSolver;
132 friend AlinaSequentialSolverImpl;
133 friend AlinaDistributedSolverImpl;
134
135 public:
136
139
148
149 public:
150
152 void setInt32(const char* name, Int32 value);
153
155 void setInt64(const char* name, Int64 value);
156
158 void setReal(const char* name, Real value);
159
161 void setString(const char* name, const char* value);
162
164 void readFromJSON(const char* fname);
165
166 public:
167
168 // Options specific to solvers
169 void setSolverAbsoluteTolerance(Real value);
170 void setSolverRelativeTolerance(Real value);
171 void setSolverMaxIteration(Int32 value);
172 void setSolverVerbosity(Int32 value);
173
174 void setSolverPreconditioner(eAlinaPreconditionerType v);
175 void setSolverType(eAlinaSolverType v);
176
177 public:
178
179 ITraceMng* traceMng() const;
180
181 private:
182
183 std::shared_ptr<AlinaSolverParametersImpl> m_p;
184};
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
191class ARCCORE_ALINA_EXPORT AlinaCSRMatrixView
192{
193 public:
194
195 AlinaCSRMatrixView(Int32 nb_row, const Int32* row_indexes, const Int32* columns, const double* values)
196 : m_nb_row(nb_row)
197 , m_row_indexes(row_indexes, nb_row + 1)
198 , m_columns(columns, row_indexes[nb_row])
199 , m_values(values, row_indexes[nb_row])
200 {}
201 AlinaCSRMatrixView(SmallSpan<const Int32> row_indexes,
203 : m_nb_row(row_indexes.size() - 1)
204 , m_row_indexes(row_indexes)
205 , m_columns(columns)
206 , m_values(values)
207 {}
208
209 public:
210
211 constexpr Int32 nbRow() const { return m_nb_row; }
212 constexpr SmallSpan<const Int32> rowIndexes() const { return m_row_indexes; }
213 constexpr SmallSpan<const Int32> columns() const { return m_columns; }
214 constexpr SmallSpan<const double> values() const { return m_values; }
215
216 public:
217
218 void dump(std::ostream& o) const;
219
220 public:
221
228 void checkSizes() const;
229
230 private:
231
232 Int32 m_nb_row = 0;
233 SmallSpan<const Int32> m_row_indexes;
234 SmallSpan<const Int32> m_columns;
236};
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
245class ARCCORE_ALINA_EXPORT AlinaPreconditioner
246{
247 public:
248
249 AlinaPreconditioner(int n,
250 const int* ptr,
251 const int* col,
252 const double* val,
253 const AlinaParameters* prm);
254
255 public:
256
258 void apply(const double* rhs, double* x);
259
261 void report();
262
263 private:
264
265 std::shared_ptr<AlinaPreconditionerImpl> m_p;
266};
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
273class ARCCORE_ALINA_EXPORT AlinaSolver
274{
275 public:
276
286 const AlinaCSRMatrixView& matrix_view);
287
288 public:
289
293
298
300 void report();
301
302 public:
303
304 std::shared_ptr<IAlinaSolverImpl> m_p;
305};
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
310} // namespace Arcane::AlinaLib
311
312/*---------------------------------------------------------------------------*/
313/*---------------------------------------------------------------------------*/
314
315#endif
316
317/*---------------------------------------------------------------------------*/
318/*---------------------------------------------------------------------------*/
General declarations for the 'message_passing' component.
Types and functions associated with the classes SpanImpl, SmallSpan and Span.
CSR Matrix view used in AlinaLib.
Definition AlinaLib.h:192
void checkSizes() const
Check that sizes are valid:
Definition AlinaLib.cc:315
Implementation for a distributed solver.
Definition AlinaLib.cc:497
Handle parameters for Alina.
Definition AlinaLib.h:89
void setInt64(const char *name, Int64 value)
Set Int64 parameter in the parameter list.
Definition AlinaLib.cc:130
void setString(const char *name, const char *value)
Set floating point parameter in the parameter list.
Definition AlinaLib.cc:142
void setInt32(const char *name, Int32 value)
Set Int32 parameter in the parameter list.
Definition AlinaLib.cc:124
void readFromJSON(const char *fname)
Read parameters from a JSON file.
Definition AlinaLib.cc:148
void setReal(const char *name, Real value)
Set floating point parameter in the parameter list.
Definition AlinaLib.cc:136
Handle preconditioner for a solver.
Definition AlinaLib.h:246
void report()
Printout preconditioner structure.
Definition AlinaLib.cc:396
void apply(const double *rhs, double *x)
Apply AMG preconditioner (x = M^(-1) * rhs).
Definition AlinaLib.cc:380
Implementation for a sequential solver.
Definition AlinaLib.cc:430
Handle parameters for solvers.
Definition AlinaLib.h:130
void readFromJSON(const char *fname)
Read parameters from a JSON file.
Definition AlinaLib.cc:240
void setString(const char *name, const char *value)
Set floating point parameter in the parameter list.
Definition AlinaLib.cc:234
void setInt32(const char *name, Int32 value)
Set Int32 parameter in the parameter list.
Definition AlinaLib.cc:216
void setReal(const char *name, Real value)
Set floating point parameter in the parameter list.
Definition AlinaLib.cc:228
void setInt64(const char *name, Int64 value)
Set Int64 parameter in the parameter list.
Definition AlinaLib.cc:222
AlinaSolverParameters()
Create a sequential solver.
Definition AlinaLib.cc:181
Linear system solver.
Definition AlinaLib.h:274
AlinaSolver(const AlinaSolverParameters &params, const AlinaCSRMatrixView &matrix_view)
Create a solver.
Definition AlinaLib.cc:561
void report()
Printout solver structure.
Definition AlinaLib.cc:575
AlinaConvergenceInfo solveMatrix(const AlinaCSRMatrixView &matrix_view, SmallSpan< const double > rhs, SmallSpan< double > x)
Solve the problem for the given matrix and the right-hand side.
Definition AlinaLib.cc:593
AlinaConvergenceInfo solve(SmallSpan< const double > rhs, SmallSpan< double > x)
Find solution for the given RHS.
Definition AlinaLib.cc:584
Interface of the message passing manager.
View of an array of elements of type T.
Definition Span.h:803
std::int64_t Int64
Signed integer type of 64 bits.
double Real
Type representing a real number.
std::int32_t Int32
Signed integer type of 32 bits.