17#ifdef DEAL_II_WITH_AMG4PSBLAS
21namespace PSCToolkitWrappers
24 PreconditionAMG::PreconditionAMG()
26 psblas_preconditioner = amg_c_dprec_new();
32 const AdditionalData &additional_data)
35 ExcMessage(
"Matrix has not been initialized."));
38 psblas_descriptor =
matrix.psblas_descriptor;
40 int err = amg_c_dprecinit(*InitFinalize::get_psblas_context(),
41 psblas_preconditioner,
45 " while initializing AMG preconditioner."));
47 amg_c_dprecsetc(psblas_preconditioner,
49 additional_data.cycle_type);
50 amg_c_dprecseti(psblas_preconditioner,
52 additional_data.n_cycles);
53 amg_c_dprecsetr(psblas_preconditioner,
55 additional_data.aggregation_threshold);
56 amg_c_dprecsetc(psblas_preconditioner,
58 additional_data.parallel_aggr_algorithm);
59 amg_c_dprecsetc(psblas_preconditioner,
61 additional_data.aggregation_type);
62 amg_c_dprecseti(psblas_preconditioner,
64 additional_data.aggregation_size);
65 amg_c_dprecsetc(psblas_preconditioner,
67 additional_data.aggr_prol);
68 amg_c_dprecsetc(psblas_preconditioner,
70 additional_data.aggr_filter);
71 amg_c_dprecsetc(psblas_preconditioner,
73 additional_data.smoother_type);
78 if (std::strcmp(additional_data.smoother_type,
"POLY") == 0)
79 amg_c_dprecseti(psblas_preconditioner,
81 additional_data.smoother_sweeps);
83 amg_c_dprecseti(psblas_preconditioner,
85 additional_data.smoother_sweeps);
86 amg_c_dprecsetc(psblas_preconditioner,
88 additional_data.coarse_type);
91 err = amg_c_dhierarchy_build(
matrix.psblas_sparse_matrix,
92 psblas_descriptor.get(),
93 psblas_preconditioner);
96 " while building AMG hierarchy."));
98 err = amg_c_dsmoothers_build(
matrix.psblas_sparse_matrix,
99 psblas_descriptor.get(),
100 psblas_preconditioner);
103 " while building AMG smoothers."));
105 if (additional_data.output_details ==
true)
107 err = amg_c_ddescr(psblas_preconditioner);
110 " while printing AMG description."));
115 PreconditionAMG::~PreconditionAMG()
117 if (psblas_preconditioner)
129 PreconditionAMG::clear()
131 int err = amg_c_dprecfree(psblas_preconditioner);
132 Assert(err == 0, ExcCallingPSBLASFunction(err,
"amg_c_dprecfree"));
133 psblas_preconditioner =
nullptr;
139 PreconditionAMG::get_psblas_preconditioner()
141 return psblas_preconditioner;
147 PreconditionAMG::vmult(
Vector &dst,
const Vector &src)
const
150 int err = amg_c_dprecapply(psblas_preconditioner,
153 psblas_descriptor.get());
155 ExcMessage(
"Failure while applying preconditioner on a vector."));
161 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.