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);
244 precondition(prm.allow_rebuild,
"allow_rebuild is not set!");
245 precondition(backend::nbRow(*A) == backend::nbRow(system_matrix()) &&
246 backend::nbColumn(*A) == backend::nbRow(*A),
247 "Matrix dimensions differ from the original ones!");
249 ARCCORE_ALINA_TIC(
"rebuild");
250 coarsening_type C(prm.coarsening);
251 for (
auto& level : levels) {
252 A = level.rebuild(A, C, prm, bprm);
254 ARCCORE_ALINA_TOC(
"rebuild");
318 size_t m_nonzeros = 0;
320 std::shared_ptr<vector> f;
321 std::shared_ptr<vector> u;
322 std::shared_ptr<vector> t;
324 std::shared_ptr<matrix> A;
325 std::shared_ptr<matrix> P;
326 std::shared_ptr<matrix> R;
328 std::shared_ptr<build_matrix> bP;
329 std::shared_ptr<build_matrix> bR;
331 std::shared_ptr<typename Backend::direct_solver> solve;
333 std::shared_ptr<relax_type> relax;
340 b += backend::bytes(*f);
342 b += backend::bytes(*u);
344 b += backend::bytes(*t);
347 b += backend::bytes(*A);
349 b += backend::bytes(*P);
351 b += backend::bytes(*R);
354 b += backend::bytes(*solve);
356 b += backend::bytes(*relax);
361 AMGLevel() =
default;
364 : m_rows(backend::nbRow(*A))
365 , m_nonzeros(backend::nonzeros(*A))
367 ARCCORE_ALINA_TIC(
"move to backend");
368 f = Backend::create_vector(m_rows, bprm);
369 u = Backend::create_vector(m_rows, bprm);
370 t = Backend::create_vector(m_rows, bprm);
371 this->A = Backend::copy_matrix(A, bprm);
372 ARCCORE_ALINA_TOC(
"move to backend");
374 ARCCORE_ALINA_TIC(
"relaxation");
375 relax = std::make_shared<relax_type>(*A, prm.relax, bprm);
376 ARCCORE_ALINA_TOC(
"relaxation");
379 std::shared_ptr<build_matrix>
380 step_down(std::shared_ptr<build_matrix> A, coarsening_type& C,
383 ARCCORE_ALINA_TIC(
"transfer operators");
384 std::shared_ptr<build_matrix> P, R;
387 std::tie(P, R) = C.transfer_operators(*A);
390 ARCCORE_ALINA_TOC(
"transfer operators");
391 return std::shared_ptr<build_matrix>();
401 ARCCORE_ALINA_TOC(
"transfer operators");
403 ARCCORE_ALINA_TIC(
"move to backend");
404 this->P = Backend::copy_matrix(P, bprm);
405 this->R = Backend::copy_matrix(R, bprm);
406 ARCCORE_ALINA_TOC(
"move to backend");
408 ARCCORE_ALINA_TIC(
"coarse operator");
409 A = C.coarse_operator(*A, *P, *R);
411 ARCCORE_ALINA_TOC(
"coarse operator");
416 void create_coarse(std::shared_ptr<build_matrix> A,
419 m_rows = backend::nbRow(*A);
420 m_nonzeros = backend::nonzeros(*A);
422 u = Backend::create_vector(m_rows, bprm);
423 f = Backend::create_vector(m_rows, bprm);
425 solve = Backend::create_solver(A, bprm);
427 this->A = Backend::copy_matrix(A, bprm);
430 std::shared_ptr<build_matrix>
431 rebuild(std::shared_ptr<build_matrix> A,
432 const coarsening_type& C,
437 ARCCORE_ALINA_TIC(
"move to backend");
438 this->A = Backend::copy_matrix(A, bprm);
439 ARCCORE_ALINA_TOC(
"move to backend");
443 ARCCORE_ALINA_TIC(
"relaxation");
444 relax = std::make_shared<relax_type>(*A, prm.relax, bprm);
445 ARCCORE_ALINA_TOC(
"relaxation");
449 ARCCORE_ALINA_TIC(
"coarsest level");
450 solve = Backend::create_solver(A, bprm);
451 ARCCORE_ALINA_TOC(
"coarsest level");
455 ARCCORE_ALINA_TIC(
"coarse operator");
456 A = C.coarse_operator(*A, *bP, *bR);
458 ARCCORE_ALINA_TOC(
"coarse operator");
469 size_t nonzeros()
const