19#ifdef DEAL_II_WITH_AMG4PSBLAS
23namespace PSCToolkitWrappers
26 PreconditionAMG::PreconditionAMG()
28 psblas_preconditioner = amg_c_dprec_new();
34 const AdditionalData &additional_data)
37 ExcMessage(
"Matrix has not been initialized."));
40 psblas_descriptor =
matrix.psblas_descriptor;
42 int err = amg_c_dprecinit(*InitFinalize::get_psblas_context(),
43 psblas_preconditioner,
47 " while initializing AMG preconditioner."));
49 amg_c_dprecsetc(psblas_preconditioner,
51 additional_data.cycle_type);
52 amg_c_dprecseti(psblas_preconditioner,
54 additional_data.n_cycles);
55 amg_c_dprecsetr(psblas_preconditioner,
57 additional_data.aggregation_threshold);
58 amg_c_dprecsetc(psblas_preconditioner,
60 additional_data.parallel_aggr_algorithm);
61 amg_c_dprecsetc(psblas_preconditioner,
63 additional_data.aggregation_type);
64 amg_c_dprecseti(psblas_preconditioner,
66 additional_data.aggregation_size);
67 amg_c_dprecsetc(psblas_preconditioner,
69 additional_data.aggr_prol);
70 amg_c_dprecsetc(psblas_preconditioner,
72 additional_data.aggr_filter);
73 amg_c_dprecsetc(psblas_preconditioner,
75 additional_data.smoother_type);
80 if (std::strcmp(additional_data.smoother_type,
"POLY") == 0)
81 amg_c_dprecseti(psblas_preconditioner,
83 additional_data.smoother_sweeps);
85 amg_c_dprecseti(psblas_preconditioner,
87 additional_data.smoother_sweeps);
88 amg_c_dprecsetc(psblas_preconditioner,
90 additional_data.coarse_type);
93 err = amg_c_dhierarchy_build(
matrix.psblas_sparse_matrix,
94 psblas_descriptor.get(),
95 psblas_preconditioner);
98 " while building AMG hierarchy."));
100 err = amg_c_dsmoothers_build(
matrix.psblas_sparse_matrix,
101 psblas_descriptor.get(),
102 psblas_preconditioner);
105 " while building AMG smoothers."));
107 if (additional_data.output_details ==
true)
109 err = amg_c_ddescr(psblas_preconditioner);
112 " while printing AMG description."));
117 PreconditionAMG::~PreconditionAMG()
119 if (psblas_preconditioner)
131 PreconditionAMG::clear()
133 int err = amg_c_dprecfree(psblas_preconditioner);
134 Assert(err == 0, ExcCallingPSBLASFunction(err,
"amg_c_dprecfree"));
135 psblas_preconditioner =
nullptr;
141 PreconditionAMG::get_psblas_preconditioner()
143 return psblas_preconditioner;
149 PreconditionAMG::vmult(
Vector &dst,
const Vector &src)
const
152 int err = amg_c_dprecapply(psblas_preconditioner,
155 psblas_descriptor.get());
157 ExcMessage(
"Failure while applying preconditioner on a vector."));
163 PreconditionAMG::Tvmult(
Vector &dst,
const Vector &src)
const
virtual size_type size() const override
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ matrix
Contents is actually a matrix.