35#include "arccore/alina/BuiltinBackend.h"
36#include "arccore/alina/StaticMatrix.h"
37#include "arccore/alina/Adapters.h"
38#include "arccore/alina/PreconditionedSolver.h"
39#include "arccore/alina/AMG.h"
40#include "arccore/alina/Coarsening.h"
41#include "arccore/alina/Relaxation.h"
42#include "arccore/alina/ConjugateGradientSolver.h"
44#include "arccore/alina/IO.h"
45#include "arccore/alina/Profiler.h"
49int main(
int argc,
char* argv[])
53 std::cerr <<
"Usage: " << argv[0] <<
" <A.mtx> <b.mtx> <coo.mtx>" << std::endl;
57 auto& prof = Alina::Profiler::globalProfiler();
60 ptrdiff_t rows, cols, ndim, ncoo;
61 std::vector<ptrdiff_t> ptr, col;
62 std::vector<double> val, rhs, coo;
70 Alina::precondition(ncoo * ndim == rows && (ndim == 2 || ndim == 3),
71 "The coordinate file has wrong dimensions");
73 std::cout <<
"Matrix " << argv[1] <<
": " << rows <<
"x" << rows << std::endl;
74 std::cout <<
"RHS " << argv[2] <<
": " << rows <<
"x" << cols << std::endl;
75 std::cout <<
"Coords " << argv[3] <<
": " << ncoo <<
"x" << ndim << std::endl;
92 prm.solver.maxiter = 500;
93 prm.precond.coarsening.aggr.eps_strong = 0;
99 prm.precond.coarsening.nullspace.cols = Alina::rigid_body_modes(ndim, coo, prm.precond.coarsening.nullspace.B);
102 auto A = std::tie(rows, ptr, col, val);
103 auto Ab = Alina::adapter::block_matrix<DBlock>(A);
107 Solver solve(Ab, prm);
111 std::cout << solve << std::endl;
114 std::vector<double> x(rows, 0.0);
117 auto F = Alina::backend::reinterpret_as_rhs<DBlock>(rhs);
118 auto X = Alina::backend::reinterpret_as_rhs<DBlock>(x);
126 std::cout <<
"Iters: " << r.nbIteration() << std::endl
127 <<
"Error: " << r.residual() << std::endl
128 << prof << std::endl;
Algebraic multigrid method.
Conjugate Gradients solver.
Convenience class that bundles together a preconditioner and an iterative solver.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-