Arcane  v4.1.10.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/* 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 <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 // Set integer parameter in a parameter list.
56 static void params_set_int(AlinaParameters* prm, const char* name, int value);
57
58 // Set floating point parameter in a parameter list.
59 static void params_set_float(AlinaParameters* prm, const char* name, float value);
60
61 // Set floating point parameter in a parameter list.
62 static void params_set_string(AlinaParameters* prm, const char* name, const char* value);
63
64 // Read parameters from a JSON file
65 static void params_read_json(AlinaParameters* prm, const char* fname);
66
67 // Destroy parameter list.
68 static void params_destroy(AlinaParameters* prm);
69
70 // Create parameter list.
71 static AlinaParameters* params_create();
72
73 // Create AMG preconditioner.
74 static AlinaPreconditioner* preconditioner_create(int n,
75 const int* ptr,
76 const int* col,
77 const double* val,
78 AlinaParameters* parameters);
79
80 // Apply AMG preconditioner (x = M^(-1) * rhs).
81 static void preconditioner_apply(AlinaPreconditioner* amg, const double* rhs, double* x);
82
83 // Printout preconditioner structure
84 static void preconditioner_report(AlinaPreconditioner* amg);
85
86 // Destroy AMG preconditioner
87 static void preconditioner_destroy(AlinaPreconditioner* amg);
88
89 // Create iterative solver preconditioned by 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 // Solve the problem for the given right-hand side.
97 static AlinaConvergenceInfo solver_solve(AlinaSequentialSolver* solver,
98 double const* rhs,
99 double* x);
100
101 // Solve the problem for the given matrix and the right-hand side.
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 // Printout solver structure
110 static void solver_report(AlinaSequentialSolver* solver);
111
112 // Destroy iterative solver.
113 static void solver_destroy(AlinaSequentialSolver* solver);
114
115 // Create distributed solver.
116 static AlinaDistributedSolver* solver_mpi_create(MPI_Comm comm,
117 ptrdiff_t n,
118 const ptrdiff_t* ptr,
119 const ptrdiff_t* 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 // Find solution for the given RHS.
127 static AlinaConvergenceInfo solver_mpi_solve(AlinaDistributedSolver* solver,
128 double const* rhs,
129 double* x);
130
131 // Destroy the distributed solver.
132 static void solver_mpi_destroy(AlinaDistributedSolver* solver);
133};
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138#endif
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/