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
37struct ARCCORE_ALINA_EXPORT AlinaConvergenceInfo
38{
39 int iterations = 0;
40 double residual = 0.0;
41};
42
43typedef double (*AlinaDefVecFunction)(int vec, ptrdiff_t coo, void* data);
44
45class AlinaLib;
53
54/*---------------------------------------------------------------------------*/
55/*---------------------------------------------------------------------------*/
61class ARCCORE_ALINA_EXPORT AlinaParameters
62{
63 friend AlinaLib;
64 friend AlinaPreconditioner;
65 friend AlinaSequentialSolver;
66 friend AlinaDistributedSolver;
67
68 public:
69
70 AlinaParameters();
71
72 public:
73
75 void setInt32(const char* name, Arcane::Int32 value);
76
78 void setInt64(const char* name, Arcane::Int64 value);
79
81 void setReal(const char* name, Arcane::Real value);
82
84 void setString(const char* name, const char* value);
85
87 void readFromJSON(const char* fname);
88
89 private:
90
91 std::shared_ptr<AlinaParametersImpl> m_p;
92};
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
99class ARCCORE_ALINA_EXPORT AlinaCSRMatrixView
100{
101 public:
102
103 using Int32 = Arcane::Int32;
104
105 public:
106
107 AlinaCSRMatrixView(Int32 nb_row, const Int32* row_indexes, const Int32* columns, const double* values)
108 : m_nb_row(nb_row)
109 , m_row_indexes(row_indexes, nb_row + 1)
110 , m_columns(columns, row_indexes[nb_row])
111 , m_values(values, row_indexes[nb_row])
112 {}
113 AlinaCSRMatrixView(Arcane::SmallSpan<const Int32> row_indexes,
115 : m_nb_row(row_indexes.size() - 1)
116 , m_row_indexes(row_indexes)
117 , m_columns(columns)
118 , m_values(values)
119 {}
120
121 public:
122
123 constexpr Int32 nbRow() const { return m_nb_row; }
124 constexpr Arcane::SmallSpan<const Int32> rowIndexes() const { return m_row_indexes; }
125 constexpr Arcane::SmallSpan<const Int32> columns() const { return m_columns; }
126 constexpr Arcane::SmallSpan<const double> values() const { return m_values; }
127
128 public:
129
136 void checkSizes() const;
137
138 private:
139
140 Int32 m_nb_row = 0;
141 Arcane::SmallSpan<const Int32> m_row_indexes;
144};
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
153class ARCCORE_ALINA_EXPORT AlinaPreconditioner
154{
155 friend AlinaLib;
156
157 public:
158
159 AlinaPreconditioner(int n,
160 const int* ptr,
161 const int* col,
162 const double* val,
163 const AlinaParameters* prm);
164
165 public:
166
168 void apply(const double* rhs, double* x);
169
171 void report();
172
173 private:
174
175 std::shared_ptr<AlinaPreconditionerImpl> m_p;
176};
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
183class ARCCORE_ALINA_EXPORT AlinaSequentialSolver
184{
185 public:
186
194 AlinaSequentialSolver(const AlinaCSRMatrixView& matrix_view,
195 const AlinaParameters* parameters);
196
197 public:
198
202
207
209 void report();
210
211 private:
212
213 std::shared_ptr<AlinaSequentialSolverImpl> m_p;
214};
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
221class ARCCORE_ALINA_EXPORT AlinaDistributedSolver
222{
223 public:
224
232 const AlinaCSRMatrixView& matrix_view,
233 const AlinaParameters& params);
234
238
239 public:
240
241 std::shared_ptr<AlinaDistributedSolverImpl> m_p;
242};
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
247#endif
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
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:100
void checkSizes() const
Check that sizes are valid:
Definition AlinaLib.cc:117
Distributed solver.
Definition AlinaLib.h:222
AlinaDistributedSolver(Arcane::MessagePassing::IMessagePassingMng *comm, const AlinaCSRMatrixView &matrix_view, const AlinaParameters &params)
Create distributed solver.
Definition AlinaLib.cc:342
AlinaConvergenceInfo solve(Arcane::SmallSpan< const double > rhs, Arcane::SmallSpan< double > x)
Find solution for the given RHS.
Definition AlinaLib.cc:370
Handle parameters for Alina.
Definition AlinaLib.h:62
void setInt64(const char *name, Arcane::Int64 value)
Set Int64 parameter in the parameter list.
Definition AlinaLib.cc:89
void setInt32(const char *name, Arcane::Int32 value)
Set Int32 parameter in the parameter list.
Definition AlinaLib.cc:83
void setReal(const char *name, Arcane::Real value)
Set floating point parameter in the parameter list.
Definition AlinaLib.cc:95
void readFromJSON(const char *fname)
Read parameters from a JSON file.
Definition AlinaLib.cc:107
void setString(const char *name, const char *value)
Set floating point parameter in the parameter list.
Definition AlinaLib.cc:101
Handle preconditioner for a solver.
Definition AlinaLib.h:154
void report()
Printout preconditioner structure.
Definition AlinaLib.cc:194
void apply(const double *rhs, double *x)
Apply AMG preconditioner (x = M^(-1) * rhs).
Definition AlinaLib.cc:178
Sequential solver.
Definition AlinaLib.h:184
void report()
Printout solver structure.
Definition AlinaLib.cc:245
AlinaConvergenceInfo solve(Arcane::SmallSpan< const double > rhs, Arcane::SmallSpan< double > x)
Solve the problem for the given right-hand side.
Definition AlinaLib.cc:256
AlinaSequentialSolver(const AlinaCSRMatrixView &matrix_view, const AlinaParameters *parameters)
Build a solver for matrix matrix.
Definition AlinaLib.cc:221
AlinaConvergenceInfo solveMatrix(const AlinaCSRMatrixView &matrix_view, Arcane::SmallSpan< const double > rhs, Arcane::SmallSpan< double > x)
Solve the problem for the given matrix and the right-hand side.
Definition AlinaLib.cc:269
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.
Convergence info.
Definition AlinaLib.h:38