Arcane  v4.1.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
core/matvec/Matrix.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/* Matrix.h (C) 2000-20265 */
9/* */
10/* Matrix d'algèbre linéraire. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MATVEC_MATRIX_H
13#define ARCANE_CORE_MATVEC_MATRIX_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18#include "arcane/utils/Numeric.h"
19
20#include "arcane/core/matvec/Vector.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::MatVec
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31class Vector;
32class MatrixImpl;
33class IPreconditioner;
34class AMG;
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
43class ARCANE_CORE_EXPORT Matrix
44{
45 public:
46
47 Matrix() = default;
48 Matrix(Integer nb_row, Integer nb_column);
49 Matrix(const Matrix& rhs);
50 ~Matrix();
51 void operator=(const Matrix& rhs);
52
53 private:
54
55 explicit Matrix(MatrixImpl* impl);
56
57 public:
58
60 Matrix clone() const;
61
62 public:
63
64 // Nombre de lignes de la matrice
65 Integer nbRow() const;
66 // Nombre de colonnes de la matrice
67 Integer nbColumn() const;
69 void setRowsSize(IntegerConstArrayView rows_size);
73 void dump(std::ostream& o) const;
87 void setValue(Integer row, Integer column, Real value);
89 Real value(Integer row, Integer column) const;
91 void sortDiagonale();
93 static Matrix read(const String& filename);
95 static Matrix readHypre(const String& filename);
96
97 private:
98
100 MatrixImpl* m_impl = nullptr;
101};
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
113class ARCANE_CORE_EXPORT IPreconditioner
114{
115 public:
116
117 virtual ~IPreconditioner() {}
118
119 public:
120
121 virtual void apply(Vector& out_vec, const Vector& vec) = 0;
122};
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126
127class ARCANE_CORE_EXPORT ConjugateGradientSolver
128{
129 public:
130
131 ConjugateGradientSolver() = default;
132 bool solve(const Matrix& a, const Vector& b, Vector& x, Real epsilon, IPreconditioner* p = 0);
133 Integer nbIteration() const { return m_nb_iteration; }
134 Real residualNorm() const { return m_residual_norm; }
135 void setMaxIteration(Integer max_iteration)
136 {
137 m_max_iteration = max_iteration;
138 }
139
140 private:
141
142 Integer m_nb_iteration = 0;
143 Real m_residual_norm = 0.0;
144 Integer m_max_iteration = 5000;
145
146 private:
147
148 void _applySolver(const Matrix& a, const Vector& b, Vector& x, Real epsilon, IPreconditioner* p);
149 void _applySolver2(const Matrix& a, const Vector& b, Vector& x, Real epsilon, IPreconditioner* precond);
150 void _applySolverAsHypre(const Matrix& a, const Vector& b, Vector& x, Real tol, IPreconditioner* precond);
151};
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
161class ARCANE_CORE_EXPORT DiagonalPreconditioner
162: public IPreconditioner
163{
164 public:
165
166 explicit DiagonalPreconditioner(const Matrix& matrix);
167
168 public:
169
170 virtual void apply(Vector& out_vec, const Vector& vec);
171
172 private:
173
174 Vector m_inverse_diagonal;
175};
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
179
180class ARCANE_CORE_EXPORT MatrixOperation
181{
182 public:
183
184 void matrixVectorProduct(const Matrix& mat, const Vector& vec, Vector& out_vec);
185 void matrixVectorProduct2(const Matrix& mat, const Vector& vec, Vector& out_vec);
186 Real dot(const Vector& vec);
187 Real dot(const Vector& vec1, const Vector& vec2);
188 void negateVector(Vector& vec);
189 void scaleVector(Vector& vec, Real mul);
190 void addVector(Vector& out_vec, const Vector& vec);
191};
192
193class ARCANE_CORE_EXPORT MatrixOperation2
194{
195 public:
196
197 Matrix matrixMatrixProduct(const Matrix& left_matrix, const Matrix& right_matrix);
198 Matrix matrixMatrixProductFast(const Matrix& left_matrix, const Matrix& right_matrix);
199 Matrix transpose(const Matrix& matrix);
200 Matrix transposeFast(const Matrix& matrix);
201 // Applique le produit de matrice L * M * R avec L = transpose(R)
202 Matrix applyGalerkinOperator(const Matrix& left_matrix, const Matrix& matrix, const Matrix& right_matrix);
203 Matrix applyGalerkinOperator2(const Matrix& left_matrix, const Matrix& matrix,
204 const Matrix& right_matrix);
205
206 private:
207
208 void _dumpColumnMatrix(std::ostream& o, IntegerConstArrayView columns_index,
210 RealConstArrayView values);
211};
212
213/*---------------------------------------------------------------------------*/
214/*---------------------------------------------------------------------------*/
215
216class ARCANE_CORE_EXPORT AMGPreconditioner
217: public IPreconditioner
218{
219 public:
220
221 explicit AMGPreconditioner(ITraceMng* tm)
222 : m_trace_mng(tm)
223 {}
224 ~AMGPreconditioner() override;
225
226 public:
227
228 virtual void build(const Matrix& matrix);
229
230 public:
231
232 void apply(Vector& out_vec, const Vector& vec) override;
233
234 private:
235
236 ITraceMng* m_trace_mng = nullptr;
237 AMG* m_amg = nullptr;
238};
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
243class ARCANE_CORE_EXPORT AMGSolver
244{
245 public:
246
247 AMGSolver(ITraceMng* tm)
248 : m_trace_mng(tm)
249 , m_amg(0)
250 {}
251 virtual ~AMGSolver();
252
253 public:
254
255 virtual void build(const Matrix& matrix);
256
257 public:
258
259 virtual void solve(const Vector& vector_b, Vector& vector_x);
260
261 private:
262
263 ITraceMng* m_trace_mng = nullptr;
264 AMG* m_amg = nullptr;
265};
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
275class ARCANE_CORE_EXPORT DirectSolver
276{
277 public:
278
279 void solve(const Matrix& matrix, const Vector& vector_b, Vector& vector_x);
280
281 private:
282
283 void _solve(RealArrayView mat_values, RealArrayView vec_values, Integer size);
284};
285
286/*---------------------------------------------------------------------------*/
287/*---------------------------------------------------------------------------*/
288
289} // namespace Arcane::MatVec
290
291/*---------------------------------------------------------------------------*/
292/*---------------------------------------------------------------------------*/
293
294#endif
Interface du gestionnaire de traces.
Solveur direct utilisant le pivot de gauss.
Interface d'un préconditionneur.
Matrice avec stockage CSR.
Definition Matrix.cc:39
Matrice avec stockage CSR.
MatrixImpl * m_impl
Implémentation.
static Matrix readHypre(const String &filename)
Lit la matrice au format Hypre.
Definition Matrix.cc:1151
void sortDiagonale()
Arrange le stockage pour que la diagonale soit le premier élément.
Definition Matrix.cc:196
IntegerConstArrayView rowsIndex() const
Indices des premiers éléments de chaque ligne.
Definition Matrix.cc:224
Real value(Integer row, Integer column) const
Retourne la valeur d'un élément de la matrice.
Definition Matrix.cc:251
void setRowsSize(IntegerConstArrayView rows_size)
Positionne le nombre d'éléments non nuls de chaque ligne.
Definition Matrix.cc:269
void setValues(IntegerConstArrayView columns, RealConstArrayView values)
Positionne les valeurs des éléments de la matrice.
Definition Matrix.cc:260
IntegerConstArrayView columns() const
Indices des colonnes des valeurs.
Definition Matrix.cc:314
void setValue(Integer row, Integer column, Real value)
Positionne la valeur d'un élément de la matrice.
Definition Matrix.cc:242
static Matrix read(const String &filename)
Lit la matrice au format X Y.
Definition Matrix.cc:1116
void dump(std::ostream &o) const
Imprime la matrice.
Definition Matrix.cc:233
RealConstArrayView values() const
Valeurs de la matrice.
Definition Matrix.cc:278
Matrix clone() const
Clone la matrice.
Definition Matrix.cc:214
Vecteur d'algèbre linéraire.
Chaîne de caractères unicode.
Int32 Integer
Type représentant un entier.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:457
double Real
Type représentant un réel.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:486
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
Definition UtilsTypes.h:459
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.
Definition UtilsTypes.h:488