19#ifndef TESTS_TEST_SOLVER_HPP
20#define TESTS_TEST_SOLVER_HPP
22#include "arccore/alina/AMG.h"
23#include "arccore/alina/SolverRuntime.h"
24#include "arccore/alina/CoarseningRuntime.h"
25#include "arccore/alina/RelaxationRuntime.h"
26#include "arccore/alina/Relaxation.h"
27#include "arccore/alina/PreconditionedSolver.h"
28#include "arccore/alina/Adapters.h"
29#include "arccore/alina/Profiler.h"
31#include "arccore/base/PlatformUtils.h"
33#include "SampleProblemCommon.h"
44template <
class Backend,
class Matrix>
47 std::shared_ptr<typename Backend::vector>
const& f,
48 std::shared_ptr<typename Backend::vector>& x,
49 Alina::eSolverType solver,
50 Alina::eRelaxationType relaxation,
51 Alina::eCoarserningType coarsening,
53 bool test_null_space =
false)
55 using namespace Arcane::Alina;
58 prm.put(
"precond.coarse_enough", 500);
59 prm.put(
"precond.coarsening.type", coarsening);
60 prm.put(
"precond.relax.type", relaxation);
61 prm.put(
"solver.type", solver);
63 typedef typename Backend::value_type value_type;
64 std::vector<double> null;
67 Int64 n = Alina::backend::nbRow(*A);
70 prm.put(
"precond.coarsening.nullspace.cols", 1);
71 prm.put(
"precond.coarsening.nullspace.rows", n);
72 prm.put(
"precond.coarsening.nullspace.B", &null[0]);
77 SolverType solve(context, A, prm, bprm);
80 std::cout << solve.precond() << std::endl;
82 Alina::backend::clear(*x);
88 std::cout <<
"SOLVE: "
89 << std::setw(10) << solver
90 << std::setw(15) << relaxation
91 << std::setw(22) << coarsening
92 <<
" Iterations: " << std::setw(5) << r.nbIteration()
93 <<
" Error: " << std::setw(15) << r.residual()
94 <<
" Time0: " << std::setw(12) << (t1-t0)
95 <<
" Time1: " << std::setw(12) << (t3-t2) <<
"\n"
98 ASSERT_NEAR(r.residual(), 0.0, 1e-4);
102template <
class Backend,
class Matrix>
105 std::shared_ptr<typename Backend::vector>
const& f,
106 std::shared_ptr<typename Backend::vector>& x,
107 Alina::eSolverType solver,
108 Alina::eRelaxationType relaxation,
112 prm.put(
"precond.type", relaxation);
113 prm.put(
"solver.type", solver);
117 solve(context, A, prm, bprm);
119 std::cout <<
"Using " << relaxation <<
" as preconditioner" << std::endl;
121 Alina::backend::clear(*x);
125 std::cout <<
"Iterations: " << r.nbIteration() << std::endl
126 <<
"Error: " << r.residual() << std::endl;
128 ASSERT_NEAR(r.residual(), 0.0, 1e-4);
131template <
class Backend,
class value_type,
class col_type,
class ptr_type,
class rhs_type>
133 bool do_all_relaxation,
135 std::vector<ptr_type> ptr,
136 std::vector<col_type> col,
137 std::vector<value_type> val,
138 std::vector<rhs_type> rhs,
141 Alina::eCoarserningType coarsening[] = {
142 Alina::eCoarserningType::aggregation,
143 Alina::eCoarserningType::smoothed_aggregation,
144 Alina::eCoarserningType::smoothed_aggr_emin,
145 Alina::eCoarserningType::ruge_stuben
148 Alina::eRelaxationType relaxation[] = {
149 Alina::eRelaxationType::spai0,
150 Alina::eRelaxationType::spai1,
151 Alina::eRelaxationType::damped_jacobi,
152 Alina::eRelaxationType::gauss_seidel,
153 Alina::eRelaxationType::ilu0,
154 Alina::eRelaxationType::iluk,
155 Alina::eRelaxationType::ilup,
156 Alina::eRelaxationType::ilut,
157 Alina::eRelaxationType::chebyshev
160 Alina::eSolverType solver[] = {
161 Alina::eSolverType::cg,
162 Alina::eSolverType::bicgstab,
163 Alina::eSolverType::bicgstabl,
164 Alina::eSolverType::gmres,
165 Alina::eSolverType::lgmres,
166 Alina::eSolverType::fgmres,
167 Alina::eSolverType::idrs
172 auto y = Backend::copy_vector(rhs, prm);
173 auto x = Backend::create_vector(n, prm);
176 for (Alina::eSolverType s : solver) {
177 std::cout <<
"Solver: " << s << std::endl;
179 test_solver<Backend>(context, Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
180 y, x, s, relaxation[0], coarsening[0], bprm);
182 catch (
const std::logic_error&) {
187 for (Alina::eRelaxationType r : relaxation) {
188 std::cout <<
"Relaxation: " << r << std::endl;
190 test_solver<Backend>(context, Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
191 y, x, solver[0], r, coarsening[0], bprm);
193 catch (
const std::logic_error&) {
197 std::cout <<
"Relaxation as preconditioner: " << r << std::endl;
199 test_rap<Backend>(context, Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
200 y, x, solver[0], r, bprm);
202 catch (
const std::logic_error&) {
207 for (Alina::eCoarserningType c : coarsening) {
208 std::cout <<
"Coarsening: " << c << std::endl;
210 for (Alina::eRelaxationType r : relaxation) {
211 std::cout <<
"Relaxation: " << r << std::endl;
213 test_solver<Backend>(context, Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
214 y, x, solver[0], r, c, bprm);
216 catch (
const std::logic_error&) {
220 case Alina::eCoarserningType::aggregation:
221 case Alina::eCoarserningType::smoothed_aggregation:
222 case Alina::eCoarserningType::smoothed_aggr_emin:
223 test_solver<Backend>(context, Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
224 y, x, solver[0], r, c, bprm,
true);
230 if (!do_all_relaxation)
238Int32 getTestBackendDefaultProblemSize();
240template <
class Backend>
241void test_backend(
const Alina::AlinaContext& context,
bool do_all_relaxation =
false, Int32 problem_size = 0,
244 typedef typename Backend::value_type value_type;
245 typedef typename Backend::col_type
col_type;
246 typedef typename Backend::ptr_type
ptr_type;
247 typedef typename Alina::math::rhs_of<value_type>::type rhs_type;
249 if (problem_size <= 0)
250 problem_size = getTestBackendDefaultProblemSize();
254 std::vector<ptr_type> ptr;
255 std::vector<col_type> col;
256 std::vector<value_type> val;
257 std::vector<rhs_type> rhs;
259 size_t n = Alina::PoissonProblemGenerator::createSequentialMatrix(problem_size, val, col, ptr, rhs);
261 test_problem<Backend>(context, do_all_relaxation, n, ptr, col, val, rhs, bprm);
266 std::vector<ptr_type> ptr;
267 std::vector<col_type> col;
268 std::vector<value_type> val;
269 std::vector<rhs_type> rhs;
271 val.push_back(Alina::math::identity<value_type>());
272 val.push_back(Alina::math::identity<value_type>());
278 rhs.push_back(Alina::math::constant<rhs_type>(1.0));
279 rhs.push_back(Alina::math::zero<rhs_type>());
281 size_t n = rhs.size();
283 test_problem<Backend>(context, do_all_relaxation, n, ptr, col, val, rhs, bprm);
290#if defined(ARCCORE_HAS_ACCELERATOR_THREAD)
291#define ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func) \
292 TEST(name1, name2##_task4) \
297#define ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func)
300#define ARCCORE_ALINA_TEST_DO_TEST_SEQUENTIAL(name1, name2, func) \
307#define ARCCORE_ALINA_TEST_DO_TEST_ACCELERATOR(name1, name2, func) \
308 ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func); \
309 ARCCORE_ALINA_TEST_DO_TEST_SEQUENTIAL(name1, name2, func);
Convenience class that bundles together a preconditioner and an iterative solver.
Class to store parameters as a hierarchical key/value tree.
Matrix class, to be used by user.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Alina::detail::empty_params params
Runtime-configurable wrappers around iterative solvers.
Number of rows for statically sized matrix types.