40 CGSmoother() : underlying_operator(
nullptr), preconditioner(
nullptr)
46 delete preconditioner;
47 preconditioner =
nullptr;
50 CGSmoother(CGSmoother
const &) =
delete;
53 operator=(CGSmoother
const &) =
delete;
60 AdditionalData() : preconditioner(PreconditionerSmoother::None), number_of_iterations(5)
65 PreconditionerSmoother preconditioner;
68 unsigned int number_of_iterations;
72 setup(Operator
const & operator_in,
73 bool const initialize_preconditioner,
74 AdditionalData
const & additional_data_in)
76 underlying_operator = &operator_in;
77 data = additional_data_in;
79 if(data.preconditioner == PreconditionerSmoother::PointJacobi)
84 else if(data.preconditioner == PreconditionerSmoother::BlockJacobi)
87 new BlockJacobiPreconditioner<Operator>(*underlying_operator, initialize_preconditioner);
91 AssertThrow(data.preconditioner == PreconditionerSmoother::None,
92 dealii::ExcMessage(
"Specified preconditioner not implemented for CG smoother"));
99 if(preconditioner !=
nullptr)
100 preconditioner->update();
105 vmult(VectorType & dst, VectorType
const & src)
const final
112 step(VectorType & dst, VectorType
const & src)
const final
114 dealii::IterationNumberControl control(data.number_of_iterations, 1.e-20);
116 dealii::SolverCG<VectorType> solver(control);
118 if(preconditioner !=
nullptr)
119 solver.solve(*underlying_operator, dst, src, *preconditioner);
121 solver.solve(*underlying_operator, dst, src, dealii::PreconditionIdentity());
125 Operator
const * underlying_operator;
128 PreconditionerBase<typename Operator::value_type> * preconditioner;