100 typedef coarsening_type::params coarsening_params;
101 typedef relax_type::params relax_params;
150 : ARCCORE_ALINA_PARAMS_IMPORT_CHILD(p,
coarsening)
151 , ARCCORE_ALINA_PARAMS_IMPORT_CHILD(p,
relax)
154 , ARCCORE_ALINA_PARAMS_IMPORT_VALUE(p,
max_levels)
155 , ARCCORE_ALINA_PARAMS_IMPORT_VALUE(p,
npre)
156 , ARCCORE_ALINA_PARAMS_IMPORT_VALUE(p,
npost)
157 , ARCCORE_ALINA_PARAMS_IMPORT_VALUE(p,
ncycle)
158 , ARCCORE_ALINA_PARAMS_IMPORT_VALUE(p,
pre_cycles)
161 p.check_params( {
"coarsening",
"relax",
"coarse_enough",
"direct_coarse",
"max_levels",
"npre",
"npost",
"ncycle",
"pre_cycles",
"allow_rebuild" });
163 precondition(
max_levels > 0,
"max_levels should be positive");
166 void get(
PropertyTree& p,
const std::string& path =
"")
const
168 ARCCORE_ALINA_PARAMS_EXPORT_CHILD(p, path,
coarsening);
169 ARCCORE_ALINA_PARAMS_EXPORT_CHILD(p, path,
relax);
172 ARCCORE_ALINA_PARAMS_EXPORT_VALUE(p, path,
max_levels);
173 ARCCORE_ALINA_PARAMS_EXPORT_VALUE(p, path,
npre);
174 ARCCORE_ALINA_PARAMS_EXPORT_VALUE(p, path,
npost);
175 ARCCORE_ALINA_PARAMS_EXPORT_VALUE(p, path,
ncycle);
176 ARCCORE_ALINA_PARAMS_EXPORT_VALUE(p, path,
pre_cycles);
246 precondition(prm.allow_rebuild,
"allow_rebuild is not set!");
247 precondition(backend::nbRow(*A) == backend::nbRow(system_matrix()) &&
248 backend::nbColumn(*A) == backend::nbRow(*A),
249 "Matrix dimensions differ from the original ones!");
251 ARCCORE_ALINA_TIC(
"rebuild");
252 coarsening_type C(prm.coarsening);
253 for (
auto& level : levels) {
254 A = level.rebuild(A, C, prm, bprm);
256 ARCCORE_ALINA_TOC(
"rebuild");
320 size_t m_nonzeros = 0;
322 std::shared_ptr<vector> f;
323 std::shared_ptr<vector> u;
324 std::shared_ptr<vector> t;
326 std::shared_ptr<matrix> A;
327 std::shared_ptr<matrix> P;
328 std::shared_ptr<matrix> R;
330 std::shared_ptr<build_matrix> bP;
331 std::shared_ptr<build_matrix> bR;
333 std::shared_ptr<typename Backend::direct_solver> solve;
335 std::shared_ptr<relax_type> relax;
342 b += backend::bytes(*f);
344 b += backend::bytes(*u);
346 b += backend::bytes(*t);
349 b += backend::bytes(*A);
351 b += backend::bytes(*P);
353 b += backend::bytes(*R);
356 b += backend::bytes(*solve);
358 b += backend::bytes(*relax);
363 AMGLevel() =
default;
366 : m_rows(backend::nbRow(*A))
367 , m_nonzeros(backend::nonzeros(*A))
369 ARCCORE_ALINA_TIC(
"move to backend");
370 f = Backend::create_vector(m_rows, bprm);
371 u = Backend::create_vector(m_rows, bprm);
372 t = Backend::create_vector(m_rows, bprm);
373 this->A = Backend::copy_matrix(A, bprm);
374 ARCCORE_ALINA_TOC(
"move to backend");
376 ARCCORE_ALINA_TIC(
"relaxation");
377 relax = std::make_shared<relax_type>(*A, prm.relax, bprm);
378 ARCCORE_ALINA_TOC(
"relaxation");
381 std::shared_ptr<build_matrix>
382 step_down(std::shared_ptr<build_matrix> A, coarsening_type& C,
385 ARCCORE_ALINA_TIC(
"transfer operators");
386 std::shared_ptr<build_matrix> P, R;
389 std::tie(P, R) = C.transfer_operators(*A);
392 ARCCORE_ALINA_TOC(
"transfer operators");
393 return std::shared_ptr<build_matrix>();
403 ARCCORE_ALINA_TOC(
"transfer operators");
405 ARCCORE_ALINA_TIC(
"move to backend");
406 this->P = Backend::copy_matrix(P, bprm);
407 this->R = Backend::copy_matrix(R, bprm);
408 ARCCORE_ALINA_TOC(
"move to backend");
410 ARCCORE_ALINA_TIC(
"coarse operator");
411 A = C.coarse_operator(*A, *P, *R);
413 ARCCORE_ALINA_TOC(
"coarse operator");
418 void create_coarse(std::shared_ptr<build_matrix> A,
421 m_rows = backend::nbRow(*A);
422 m_nonzeros = backend::nonzeros(*A);
424 u = Backend::create_vector(m_rows, bprm);
425 f = Backend::create_vector(m_rows, bprm);
427 solve = Backend::create_solver(A, bprm);
429 this->A = Backend::copy_matrix(A, bprm);
432 std::shared_ptr<build_matrix>
433 rebuild(std::shared_ptr<build_matrix> A,
434 const coarsening_type& C,
439 ARCCORE_ALINA_TIC(
"move to backend");
440 this->A = Backend::copy_matrix(A, bprm);
441 ARCCORE_ALINA_TOC(
"move to backend");
445 ARCCORE_ALINA_TIC(
"relaxation");
446 relax = std::make_shared<relax_type>(*A, prm.relax, bprm);
447 ARCCORE_ALINA_TOC(
"relaxation");
451 ARCCORE_ALINA_TIC(
"coarsest level");
452 solve = Backend::create_solver(A, bprm);
453 ARCCORE_ALINA_TOC(
"coarsest level");
457 ARCCORE_ALINA_TIC(
"coarse operator");
458 A = C.coarse_operator(*A, *bP, *bR);
460 ARCCORE_ALINA_TOC(
"coarse operator");
471 size_t nonzeros()
const