22#include "arccore/alina/BuiltinBackend.h"
23#include "arccore/alina/RelaxationRuntime.h"
24#include "arccore/alina/CoarseningRuntime.h"
25#include "arccore/alina/SolverRuntime.h"
26#include "arccore/alina/PreconditionerRuntime.h"
27#include "arccore/alina/DeflatedSolver.h"
28#include "arccore/alina/AMG.h"
29#include "arccore/alina/Adapters.h"
30#include "arccore/alina/IO.h"
31#include "arccore/alina/Profiler.h"
33#include "arccore/common/internal/ProgramOptions.h"
37using Alina::precondition;
40int main(
int argc,
char* argv[])
42 auto& prof = Alina::Profiler::globalProfiler();
44 namespace po = Arcane::ProgramOptions;
45 namespace io = Alina::IO;
52 desc.add_options()(
"help,h",
"Affiche cette aide.")(
"prm-file,P",
54 "Fichier de paramètres au format json. ")(
56 po::value<vector<string>>()->multitoken(),
57 "Paramètres spécifiés sous forme de paires nom=valeur. "
58 "Peut être fourni plusieurs fois. Exemples:\n"
59 " -p solver.tol=1e-3\n"
60 " -p precond.coarse_enough=300")(
"matrix,A",
61 po::value<string>()->required(),
62 "Matrice du système au format MatrixMarket.")(
65 "Le vecteur RHS au format MatrixMarket. "
66 "S'il est omis, un vecteur de uns est utilisé par défaut. "
67 "Ne doit être fourni qu'avec une matrice de système. ")(
70 "Les vecteurs de l'espace nul proche au format MatrixMarket. ")(
73 "Matrice de coordonnées où le nombre de lignes correspond au nombre de nœuds de grille "
74 "et le nombre de colonnes correspond à la dimensionnalité du problème (2 ou 3). "
75 "Sera utilisée pour construire des vecteurs de l'espace nul proche en tant que modes de corps rigide. ")(
77 po::bool_switch()->default_value(
false),
78 "Lorsqu'il est spécifié, traite les fichiers d'entrée comme binaires au lieu de MatrixMarket. "
79 "Il est supposé que les fichiers ont été convertis au format binaire avec l'utilitaire mm2bin. ")(
81 po::bool_switch()->default_value(
false),
82 "Lorsqu'il est spécifié, la hiérarchie AMG n'est pas construite. "
83 "Au lieu de cela, le problème est résolu en utilisant un lisseur de niveau unique comme préconditionneur. ")(
86 "Fichier de sortie. Sera enregistré au format MatrixMarket. "
87 "S'il est omis, la solution n'est pas enregistrée. ");
96 if (vm.count(
"help")) {
97 std::cout << desc << std::endl;
101 for (
int i = 0; i < argc; ++i) {
104 std::cout << argv[i];
106 std::cout << std::endl;
109 if (vm.count(
"prm-file")) {
110 prm.read_json(vm[
"prm-file"].as<string>());
113 if (vm.count(
"prm")) {
114 for (
const string& v : vm[
"prm"].as<vector<string>>()) {
119 if (!vm.count(
"defvec") && !vm.count(
"coords")) {
120 std::cerr <<
"Soit defvec soit coords doit être fourni" << std::endl;
125 vector<ptrdiff_t> ptr, col;
126 vector<double> val, rhs, z;
129 auto t = prof.scoped_tic(
"reading");
131 string Afile = vm[
"matrix"].as<
string>();
132 bool binary = vm[
"binary"].as<
bool>();
135 io::read_crs(Afile, rows, ptr, col, val);
139 std::tie(rows, cols) = io::mm_reader(Afile)(ptr, col, val);
140 precondition(rows == cols,
"Matrice de système non carrée");
143 if (vm.count(
"rhs")) {
144 string bfile = vm[
"rhs"].as<
string>();
149 io::read_dense(bfile, n, m, rhs);
152 std::tie(n, m) = io::mm_reader(bfile)(rhs);
155 precondition(n == rows && m == 1,
"Le vecteur RHS a une taille incorrecte");
158 rhs.resize(rows, 1.0);
161 if (vm.count(
"defvec")) {
162 string nfile = vm[
"defvec"].as<
string>();
163 std::vector<double> N;
168 io::read_dense(nfile, m, nv, N);
171 std::tie(m, nv) = io::mm_reader(nfile)(N);
174 precondition(m == rows,
"Les vecteurs de déflation ont une taille incorrecte");
177 for (ptrdiff_t i = 0; i < rows; ++i)
178 for (ptrdiff_t j = 0; j < nv; ++j)
179 z[i + j * rows] = N[i * nv + j];
181 else if (vm.count(
"coords")) {
182 string cfile = vm[
"coords"].as<
string>();
183 std::vector<double> coo;
188 io::read_dense(cfile, m, ndim, coo);
191 std::tie(m, ndim) = io::mm_reader(cfile)(coo);
194 precondition(m * ndim == rows && (ndim == 2 || ndim == 3),
"La matrice de coordonnées a une taille incorrecte");
196 nv = Alina::rigid_body_modes(ndim, coo, z,
true);
200 prm.put(
"vec", z.data());
203 std::vector<double> x(rows, 0);
205 if (vm[
"single-level"].as<bool>())
206 prm.put(
"precond.class",
"relaxation");
213 auto A = std::tie(rows, ptr, col, val);
216 Solver solve(A, prm);
223 if (vm.count(
"output")) {
224 auto t = prof.scoped_tic(
"write");
225 Alina::IO::mm_write(vm[
"output"].as<string>(), x.data(), x.size());
228 std::vector<double> r(rows);
229 Alina::backend::residual(rhs, A, x, r);
231 std::cout <<
"Itérations: " << result.nbIteration() << std::endl
232 <<
"Erreur: " << result.residual() << std::endl
233 <<
"Erreur réelle: " <<
sqrt(Alina::backend::inner_product(r, r)) /
sqrt(Alina::backend::inner_product(rhs, rhs))
234 << prof << std::endl;
Iterative preconditioned solver with deflation.
Classe pour stocker les paramètres sous forme d'arbre hiérarchique clé/valeur.
Constructeur d'analyseur d'arguments en ligne de commande fluide.
Décrit un ensemble d'options en ligne de commande.
Décrit les arguments positionnels (non-options).
Stocke les valeurs d'options analysées.
apfloat sqrt(apfloat v)
Racine carrée de v.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Runtime-configurable wrappers around iterative solvers.