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 "SampleProblemCommon.h"
42template <
class Backend,
class Matrix>
43void test_solver(
const Matrix& A,
44 std::shared_ptr<typename Backend::vector>
const& f,
45 std::shared_ptr<typename Backend::vector>& x,
46 Alina::eSolverType solver,
47 Alina::eRelaxationType relaxation,
48 Alina::eCoarserningType coarsening,
50 bool test_null_space =
false)
53 prm.put(
"precond.coarse_enough", 500);
54 prm.put(
"precond.coarsening.type", coarsening);
55 prm.put(
"precond.relax.type", relaxation);
56 prm.put(
"solver.type", solver);
58 typedef typename Backend::value_type value_type;
59 std::vector<double> null;
62 Int64 n = Alina::backend::nbRow(*A);
65 prm.put(
"precond.coarsening.nullspace.cols", 1);
66 prm.put(
"precond.coarsening.nullspace.rows", n);
67 prm.put(
"precond.coarsening.nullspace.B", &null[0]);
74 std::cout << solve.precond() << std::endl;
76 Alina::backend::clear(*x);
80 std::cout <<
"Iterations: " << r.nbIteration() << std::endl
81 <<
"Error: " << r.residual() << std::endl
84 ASSERT_NEAR(r.residual(), 0.0, 1e-4);
88template <
class Backend,
class Matrix>
89void test_rap(
const Matrix& A,
90 std::shared_ptr<typename Backend::vector>
const& f,
91 std::shared_ptr<typename Backend::vector>& x,
92 Alina::eSolverType solver,
93 Alina::eRelaxationType relaxation,
97 prm.put(
"precond.type", relaxation);
98 prm.put(
"solver.type", solver);
104 std::cout <<
"Using " << relaxation <<
" as preconditioner" << std::endl;
106 Alina::backend::clear(*x);
110 std::cout <<
"Iterations: " << r.nbIteration() << std::endl
111 <<
"Error: " << r.residual() << std::endl;
113 ASSERT_NEAR(r.residual(), 0.0, 1e-4);
116template <
class Backend,
class value_type,
class col_type,
class ptr_type,
class rhs_type>
117void test_problem(
size_t n,
118 std::vector<ptr_type> ptr,
119 std::vector<col_type> col,
120 std::vector<value_type> val,
121 std::vector<rhs_type> rhs,
124 Alina::eCoarserningType coarsening[] = {
125 Alina::eCoarserningType::aggregation,
126 Alina::eCoarserningType::smoothed_aggregation,
127 Alina::eCoarserningType::smoothed_aggr_emin,
128 Alina::eCoarserningType::ruge_stuben
131 Alina::eRelaxationType relaxation[] = {
132 Alina::eRelaxationType::spai0,
133 Alina::eRelaxationType::spai1,
134 Alina::eRelaxationType::damped_jacobi,
135 Alina::eRelaxationType::gauss_seidel,
136 Alina::eRelaxationType::ilu0,
137 Alina::eRelaxationType::iluk,
138 Alina::eRelaxationType::ilup,
139 Alina::eRelaxationType::ilut,
140 Alina::eRelaxationType::chebyshev
143 Alina::eSolverType solver[] = {
144 Alina::eSolverType::cg,
145 Alina::eSolverType::bicgstab,
146 Alina::eSolverType::bicgstabl,
147 Alina::eSolverType::gmres,
148 Alina::eSolverType::lgmres,
149 Alina::eSolverType::fgmres,
150 Alina::eSolverType::idrs
155 auto y = Backend::copy_vector(rhs, prm);
156 auto x = Backend::create_vector(n, prm);
159 for (Alina::eSolverType s : solver) {
160 std::cout <<
"Solver: " << s << std::endl;
162 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
163 y, x, s, relaxation[0], coarsening[0], bprm);
165 catch (
const std::logic_error&) {
170 for (Alina::eRelaxationType r : relaxation) {
171 std::cout <<
"Relaxation: " << r << std::endl;
173 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
174 y, x, solver[0], r, coarsening[0], bprm);
176 catch (
const std::logic_error&) {
180 std::cout <<
"Relaxation as preconditioner: " << r << std::endl;
182 test_rap<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
183 y, x, solver[0], r, bprm);
185 catch (
const std::logic_error&) {
190 for (Alina::eCoarserningType c : coarsening) {
191 std::cout <<
"Coarsening: " << c << std::endl;
194 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
195 y, x, solver[0], relaxation[0], c, bprm);
197 catch (
const std::logic_error&) {
201 case Alina::eCoarserningType::aggregation:
202 case Alina::eCoarserningType::smoothed_aggregation:
203 case Alina::eCoarserningType::smoothed_aggr_emin:
204 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
205 y, x, solver[0], relaxation[0], c, bprm,
true);
213template <
class Backend>
216 typedef typename Backend::value_type value_type;
217 typedef typename Backend::col_type col_type;
218 typedef typename Backend::ptr_type ptr_type;
219 typedef typename Alina::math::rhs_of<value_type>::type rhs_type;
223 std::vector<ptr_type> ptr;
224 std::vector<col_type> col;
225 std::vector<value_type> val;
226 std::vector<rhs_type> rhs;
228 size_t n = sample_problem(24, val, col, ptr, rhs);
230 test_problem<Backend>(n, ptr, col, val, rhs, bprm);
235 std::vector<ptr_type> ptr;
236 std::vector<col_type> col;
237 std::vector<value_type> val;
238 std::vector<rhs_type> rhs;
240 val.push_back(Alina::math::identity<value_type>());
241 val.push_back(Alina::math::identity<value_type>());
247 rhs.push_back(Alina::math::constant<rhs_type>(1.0));
248 rhs.push_back(Alina::math::zero<rhs_type>());
250 size_t n = rhs.size();
252 test_problem<Backend>(n, ptr, col, val, rhs, bprm);
259#if defined(ARCCORE_HAS_ACCELERATOR_THREAD)
260#define ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func) \
261 TEST(name1, name2##_task4) \
266#define ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func)
269#define ARCCORE_ALINA_TEST_DO_TEST_SEQUENTIAL(name1, name2, func) \
276#define ARCCORE_ALINA_TEST_DO_TEST_ACCELERATOR(name1, name2, func) \
277 ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func); \
278 ARCCORE_ALINA_TEST_DO_TEST_SEQUENTIAL(name1, name2, func);
Convenience class that bundles together a preconditioner and an iterative solver.
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.