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;