Arcane  4.2.2.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"
29
30#include <memory>
31
32#include <mpi.h>
33
34// Convergence info
35struct ARCCORE_ALINA_EXPORT AlinaConvergenceInfo
36{
37 int iterations = 0;
38 double residual = 0.0;
39};
40
41typedef double (*AlinaDefVecFunction)(int vec, ptrdiff_t coo, void* data);
42
43class AlinaLib;
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
59class ARCCORE_ALINA_EXPORT AlinaParameters
60{
61 friend AlinaLib;
62 friend AlinaPreconditioner;
63 friend AlinaSequentialSolver;
64 friend AlinaDistributedSolver;
65
66 public:
67
68 AlinaParameters();
69
70 public:
71
73 void setInt32(const char* name, Arcane::Int32 value);
74
76 void setInt64(const char* name, Arcane::Int64 value);
77
79 void setReal(const char* name, Arcane::Real value);
80
82 void setString(const char* name, const char* value);
83
85 void readFromJSON(const char* fname);
86
87 private:
88
89 std::shared_ptr<AlinaParametersImpl> m_p;
90};
91
92/*---------------------------------------------------------------------------*/
93/*---------------------------------------------------------------------------*/
97class ARCCORE_ALINA_EXPORT AlinaCSRMatrixView
98{
99 public:
100
101 using Int32 = Arcane::Int32;
102
103 public:
104
105 AlinaCSRMatrixView(Int32 nb_row, const Int32* row_indexes, const Int32* columns, const double* values)
106 : m_nb_row(nb_row)
107 , m_row_indexes(row_indexes, nb_row + 1)
108 , m_columns(columns, row_indexes[nb_row])
109 , m_values(values, row_indexes[nb_row])
110 {}
111 AlinaCSRMatrixView(Arcane::SmallSpan<const Int32> row_indexes,
113 : m_nb_row(row_indexes.size() - 1)
114 , m_row_indexes(row_indexes)
115 , m_columns(columns)
116 , m_values(values)
117 {}
118
119 public:
120
121 constexpr Int32 nbRow() const { return m_nb_row; }
122 constexpr Arcane::SmallSpan<const Int32> rowIndexes() const { return m_row_indexes; }
123 constexpr Arcane::SmallSpan<const Int32> columns() const { return m_columns; }
124 constexpr Arcane::SmallSpan<const double> values() const { return m_values; }
125
126 public:
127
134 void checkSizes() const;
135
136 private:
137
138 Int32 m_nb_row = 0;
139 Arcane::SmallSpan<const Int32> m_row_indexes;
142};
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
151class ARCCORE_ALINA_EXPORT AlinaPreconditioner
152{
153 friend AlinaLib;
154
155 public:
156
157 AlinaPreconditioner(int n,
158 const int* ptr,
159 const int* col,
160 const double* val,
161 const AlinaParameters* prm);
162
163 public:
164
166 void apply(const double* rhs, double* x);
167
169 void report();
170
171 private:
172
173 std::shared_ptr<AlinaPreconditionerImpl> m_p;
174};
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
181class ARCCORE_ALINA_EXPORT AlinaSequentialSolver
182{
183 public:
184
192 AlinaSequentialSolver(const AlinaCSRMatrixView& matrix_view,
193 const AlinaParameters* parameters);
194
195 public:
196
200
205
207 void report();
208
209 private:
210
211 std::shared_ptr<AlinaSequentialSolverImpl> m_p;
212};
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
219class ARCCORE_ALINA_EXPORT AlinaDistributedSolver
220{
221 public:
222
229 AlinaDistributedSolver(MPI_Comm comm,
230 const AlinaCSRMatrixView& matrix_view,
231 int n_def_vec,
232 AlinaDefVecFunction def_vec_func,
233 void* def_vec_data,
234 const AlinaParameters& params);
235
239
240 public:
241
242 std::shared_ptr<AlinaDistributedSolverImpl> m_p;
243};
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
248#endif
249
250/*---------------------------------------------------------------------------*/
251/*---------------------------------------------------------------------------*/
Types and functions associated with the classes SpanImpl, SmallSpan and Span.
CSR Matrix view used in AlinaLib.
Definition AlinaLib.h:98
void checkSizes() const
Check that sizes are valid:
Definition AlinaLib.cc:117
Distributed solver.
Definition AlinaLib.h:220
AlinaConvergenceInfo solve(Arcane::SmallSpan< const double > rhs, Arcane::SmallSpan< double > x)
Find solution for the given RHS.
Definition AlinaLib.cc:364
AlinaDistributedSolver(MPI_Comm comm, const AlinaCSRMatrixView &matrix_view, int n_def_vec, AlinaDefVecFunction def_vec_func, void *def_vec_data, const AlinaParameters &params)
Create distributed solver.
Definition AlinaLib.cc:334
Handle parameters for Alina.
Definition AlinaLib.h:60
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:152
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:182
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
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.