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 <boost/assign/std/vector.hpp>
32using namespace boost::assign;
34#include "SampleProblemCommon.h"
45template <
class Backend,
class Matrix>
46void test_solver(
const Matrix& A,
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)
56 prm.put(
"precond.coarse_enough", 500);
57 prm.put(
"precond.coarsening.type", coarsening);
58 prm.put(
"precond.relax.type", relaxation);
59 prm.put(
"solver.type", solver);
61 typedef typename Backend::value_type value_type;
62 std::vector<double> null;
65 Int64 n = Alina::backend::nbRow(*A);
68 prm.put(
"precond.coarsening.nullspace.cols", 1);
69 prm.put(
"precond.coarsening.nullspace.rows", n);
70 prm.put(
"precond.coarsening.nullspace.B", &null[0]);
77 std::cout << solve.precond() << std::endl;
79 Alina::backend::clear(*x);
83 std::cout <<
"Iterations: " << r.nbIteration() << std::endl
84 <<
"Error: " << r.residual() << std::endl
87 ASSERT_NEAR(r.residual(), 0.0, 1e-4);
91template <
class Backend,
class Matrix>
92void test_rap(
const Matrix& A,
93 std::shared_ptr<typename Backend::vector>
const& f,
94 std::shared_ptr<typename Backend::vector>& x,
95 Alina::eSolverType solver,
96 Alina::eRelaxationType relaxation,
100 prm.put(
"precond.type", relaxation);
101 prm.put(
"solver.type", solver);
107 std::cout <<
"Using " << relaxation <<
" as preconditioner" << std::endl;
109 Alina::backend::clear(*x);
113 std::cout <<
"Iterations: " << r.nbIteration() << std::endl
114 <<
"Error: " << r.residual() << std::endl;
116 ASSERT_NEAR(r.residual(), 0.0, 1e-4);
119template <
class Backend,
class value_type,
class col_type,
class ptr_type,
class rhs_type>
120void test_problem(
size_t n,
121 std::vector<ptr_type> ptr,
122 std::vector<col_type> col,
123 std::vector<value_type> val,
124 std::vector<rhs_type> rhs,
127 Alina::eCoarserningType coarsening[] = {
128 Alina::eCoarserningType::aggregation,
129 Alina::eCoarserningType::smoothed_aggregation,
130 Alina::eCoarserningType::smoothed_aggr_emin,
131 Alina::eCoarserningType::ruge_stuben
134 Alina::eRelaxationType relaxation[] = {
135 Alina::eRelaxationType::spai0,
136 Alina::eRelaxationType::spai1,
137 Alina::eRelaxationType::damped_jacobi,
138 Alina::eRelaxationType::gauss_seidel,
139 Alina::eRelaxationType::ilu0,
140 Alina::eRelaxationType::iluk,
141 Alina::eRelaxationType::ilup,
142 Alina::eRelaxationType::ilut,
143 Alina::eRelaxationType::chebyshev
146 Alina::eSolverType solver[] = {
147 Alina::eSolverType::cg,
148 Alina::eSolverType::bicgstab,
149 Alina::eSolverType::bicgstabl,
150 Alina::eSolverType::gmres,
151 Alina::eSolverType::lgmres,
152 Alina::eSolverType::fgmres,
153 Alina::eSolverType::idrs
158 auto y = Backend::copy_vector(rhs, prm);
159 auto x = Backend::create_vector(n, prm);
162 for (Alina::eSolverType s : solver) {
163 std::cout <<
"Solver: " << s << std::endl;
165 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
166 y, x, s, relaxation[0], coarsening[0], bprm);
168 catch (
const std::logic_error&) {
173 for (Alina::eRelaxationType r : relaxation) {
174 std::cout <<
"Relaxation: " << r << std::endl;
176 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
177 y, x, solver[0], r, coarsening[0], bprm);
179 catch (
const std::logic_error&) {
183 std::cout <<
"Relaxation as preconditioner: " << r << std::endl;
185 test_rap<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
186 y, x, solver[0], r, bprm);
188 catch (
const std::logic_error&) {
193 for (Alina::eCoarserningType c : coarsening) {
194 std::cout <<
"Coarsening: " << c << std::endl;
197 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
198 y, x, solver[0], relaxation[0], c, bprm);
200 catch (
const std::logic_error&) {
204 case Alina::eCoarserningType::aggregation:
205 case Alina::eCoarserningType::smoothed_aggregation:
206 case Alina::eCoarserningType::smoothed_aggr_emin:
207 test_solver<Backend>(Alina::adapter::zero_copy_direct(n, ptr.data(), col.data(), val.data()),
208 y, x, solver[0], relaxation[0], c, bprm,
true);
216template <
class Backend>
219 typedef typename Backend::value_type value_type;
220 typedef typename Backend::col_type col_type;
221 typedef typename Backend::ptr_type ptr_type;
222 typedef typename Alina::math::rhs_of<value_type>::type rhs_type;
226 std::vector<ptr_type> ptr;
227 std::vector<col_type> col;
228 std::vector<value_type> val;
229 std::vector<rhs_type> rhs;
231 size_t n = sample_problem(24, val, col, ptr, rhs);
233 test_problem<Backend>(n, ptr, col, val, rhs, bprm);
238 std::vector<ptr_type> ptr;
239 std::vector<col_type> col;
240 std::vector<value_type> val;
241 std::vector<rhs_type> rhs;
243 val += Alina::math::identity<value_type>(), Alina::math::identity<value_type>();
246 rhs += Alina::math::constant<rhs_type>(1.0), Alina::math::zero<rhs_type>();
248 size_t n = rhs.size();
250 test_problem<Backend>(n, ptr, col, val, rhs, bprm);
257#if defined(ARCCORE_HAS_ACCELERATOR_THREAD)
258#define ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func) \
259 TEST(name1, name2##_task4) \
264#define ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func)
267#define ARCCORE_ALINA_TEST_DO_TEST_SEQUENTIAL(name1, name2, func) \
274#define ARCCORE_ALINA_TEST_DO_TEST_ACCELERATOR(name1, name2, func) \
275 ARCCORE_ALINA_TEST_DO_TEST_TASK(name1, name2, func); \
276 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.