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;
53 desc.add_options()(
"help,h",
"Affiche cette aide.");
54 desc.add_options()(
"prm-file,P",
56 "Fichier de paramètres au format json. ");
57 desc.add_options()(
"prm,p",
58 po::value<vector<string>>()->multitoken(),
59 "Paramètres spécifiés sous forme de paires nom=valeur. "
60 "Peut être fourni plusieurs fois. Exemples:\n"
61 " -p solver.tol=1e-3\n"
62 " -p precond.coarse_enough=300");
63 desc.add_options()(
"matrix,A",
64 po::value<string>()->required(),
65 "Matrice du système au format MatrixMarket.");
66 desc.add_options()(
"rhs,f",
68 "Le vecteur RHS au format MatrixMarket. "
69 "S'il est omis, un vecteur de uns est utilisé par défaut. "
70 "Ne doit être fourni qu'avec une matrice de système. ");
71 desc.add_options()(
"defvec,D",
73 "Les vecteurs de l'espace nul proche au format MatrixMarket. ");
74 desc.add_options()(
"coords,C",
76 "Matrice de coordonnées où le nombre de lignes correspond au nombre de nœuds de grille "
77 "et le nombre de colonnes correspond à la dimensionnalité du problème (2 ou 3). "
78 "Sera utilisée pour construire des vecteurs de l'espace nul proche en tant que modes de corps rigide. ");
79 desc.add_options()(
"binary,B",
80 po::bool_switch()->default_value(
false),
81 "Lorsqu'il est spécifié, traite les fichiers d'entrée comme binaires au lieu de MatrixMarket. "
82 "Il est supposé que les fichiers ont été convertis au format binaire avec l'utilitaire mm2bin. ");
83 desc.add_options()(
"single-level,1",
84 po::bool_switch()->default_value(
false),
85 "Lorsqu'il est spécifié, la hiérarchie AMG n'est pas construite. "
86 "Au lieu de cela, le problème est résolu en utilisant un lisseur de niveau unique comme préconditionneur. ");
87 desc.add_options()(
"output,o",
89 "Fichier de sortie. Sera enregistré au format MatrixMarket. "
90 "S'il est omis, la solution n'est pas enregistrée. ");
99 if (vm.count(
"help")) {
100 std::cout << desc << std::endl;
104 for (
int i = 0; i < argc; ++i) {
107 std::cout << argv[i];
109 std::cout << std::endl;
112 if (vm.count(
"prm-file")) {
113 prm.read_json(vm[
"prm-file"].as<string>());
116 if (vm.count(
"prm")) {
117 for (
const string& v : vm[
"prm"].as<vector<string>>()) {
122 if (!vm.count(
"defvec") && !vm.count(
"coords")) {
123 std::cerr <<
"Soit defvec soit coords doit être fourni" << std::endl;
128 vector<ptrdiff_t> ptr, col;
129 vector<double> val, rhs, z;
132 auto t = prof.scoped_tic(
"reading");
134 string Afile = vm[
"matrix"].as<
string>();
135 bool binary = vm[
"binary"].as<
bool>();
138 io::read_crs(Afile, rows, ptr, col, val);
142 std::tie(rows, cols) = io::mm_reader(Afile)(ptr, col, val);
143 precondition(rows == cols,
"Matrice de système non carrée");
146 if (vm.count(
"rhs")) {
147 string bfile = vm[
"rhs"].as<
string>();
152 io::read_dense(bfile, n, m, rhs);
155 std::tie(n, m) = io::mm_reader(bfile)(rhs);
158 precondition(n == rows && m == 1,
"Le vecteur RHS a une taille incorrecte");
161 rhs.resize(rows, 1.0);
164 if (vm.count(
"defvec")) {
165 string nfile = vm[
"defvec"].as<
string>();
166 std::vector<double> N;
171 io::read_dense(nfile, m, nv, N);
174 std::tie(m, nv) = io::mm_reader(nfile)(N);
177 precondition(m == rows,
"Les vecteurs de déflation ont une taille incorrecte");
180 for (ptrdiff_t i = 0; i < rows; ++i)
181 for (ptrdiff_t j = 0; j < nv; ++j)
182 z[i + j * rows] = N[i * nv + j];
184 else if (vm.count(
"coords")) {
185 string cfile = vm[
"coords"].as<
string>();
186 std::vector<double> coo;
191 io::read_dense(cfile, m, ndim, coo);
194 std::tie(m, ndim) = io::mm_reader(cfile)(coo);
197 precondition(m * ndim == rows && (ndim == 2 || ndim == 3),
"La matrice de coordonnées a une taille incorrecte");
199 nv = Alina::rigid_body_modes(ndim, coo, z,
true);
203 prm.put(
"vec", z.data());
206 std::vector<double> x(rows, 0);
208 if (vm[
"single-level"].as<bool>())
209 prm.put(
"precond.class",
"relaxation");
216 auto A = std::tie(rows, ptr, col, val);
219 Solver solve(context, A, prm);
226 if (vm.count(
"output")) {
227 auto t = prof.scoped_tic(
"write");
228 Alina::IO::mm_write(vm[
"output"].as<string>(), x.data(), x.size());
231 std::vector<double> r(rows);
232 Alina::backend::residual(rhs, A, x, r);
234 std::cout <<
"Itérations: " << result.nbIteration() << std::endl
235 <<
"Erreur: " << result.residual() << std::endl
236 <<
"Erreur réelle: " <<
sqrt(Alina::backend::inner_product(r, r)) /
sqrt(Alina::backend::inner_product(rhs, rhs))
237 << 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.