41 typedef dealii::PreconditionChebyshev<Operator, VectorType, JacobiPreconditioner<Operator>>
43 typedef dealii::PreconditionChebyshev<Operator, VectorType, BlockJacobiPreconditioner<Operator>>
46 PreconditionChebyshev<Operator, VectorType, AdditiveSchwarzPreconditioner<Operator>>
47 ChebyshevAdditiveSchwarz;
49 ChebyshevSmoother() : underlying_operator(
nullptr)
59 : preconditioner(PreconditionerSmoother::PointJacobi),
62 iterations_eigenvalue_estimation(20)
67 PreconditionerSmoother preconditioner;
70 double smoothing_range;
76 unsigned int iterations_eigenvalue_estimation;
82 if(data.preconditioner == PreconditionerSmoother::PointJacobi)
84 chebyshev_point_jacobi->vmult(dst, src);
86 else if(data.preconditioner == PreconditionerSmoother::BlockJacobi)
88 chebyshev_block_jacobi->vmult(dst, src);
90 else if(data.preconditioner == PreconditionerSmoother::AdditiveSchwarz)
92 chebyshev_additive_schwarz->vmult(dst, src);
96 AssertThrow(
false, dealii::ExcNotImplemented());
101 step(VectorType & dst, VectorType
const & src)
const final
103 if(data.preconditioner == PreconditionerSmoother::PointJacobi)
105 chebyshev_point_jacobi->step(dst, src);
107 else if(data.preconditioner == PreconditionerSmoother::BlockJacobi)
109 chebyshev_block_jacobi->step(dst, src);
111 else if(data.preconditioner == PreconditionerSmoother::AdditiveSchwarz)
113 chebyshev_additive_schwarz->step(dst, src);
117 AssertThrow(
false, dealii::ExcNotImplemented());
124 AssertThrow(underlying_operator !=
nullptr,
125 dealii::ExcMessage(
"Pointer underlying_operator is uninitialized."));
127 if(data.preconditioner == PreconditionerSmoother::PointJacobi)
129 preconditioner_point_jacobi->update();
130 chebyshev_point_jacobi->initialize(*underlying_operator, additional_data_point);
132 else if(data.preconditioner == PreconditionerSmoother::BlockJacobi)
134 preconditioner_block_jacobi->update();
135 chebyshev_block_jacobi->initialize(*underlying_operator, additional_data_block);
137 else if(data.preconditioner == PreconditionerSmoother::AdditiveSchwarz)
139 preconditioner_additive_schwarz->update();
140 chebyshev_additive_schwarz->initialize(*underlying_operator,
141 additional_data_additive_schwarz);
145 AssertThrow(
false, dealii::ExcNotImplemented());
150 setup(Operator
const & operator_in,
151 bool const initialize_preconditioner,
154 underlying_operator = &operator_in;
155 data = additional_data;
157 if(data.preconditioner == PreconditionerSmoother::PointJacobi)
159 preconditioner_point_jacobi =
160 std::make_shared<JacobiPreconditioner<Operator>>(*underlying_operator,
161 initialize_preconditioner);
163 additional_data_point.preconditioner = preconditioner_point_jacobi;
164 additional_data_point.smoothing_range = data.smoothing_range;
165 additional_data_point.degree = data.degree;
166 additional_data_point.eig_cg_n_iterations = data.iterations_eigenvalue_estimation;
168 chebyshev_point_jacobi = std::make_shared<ChebyshevPointJacobi>();
170 if(initialize_preconditioner)
171 chebyshev_point_jacobi->initialize(*underlying_operator, additional_data_point);
173 else if(data.preconditioner == PreconditionerSmoother::BlockJacobi)
175 preconditioner_block_jacobi =
176 std::make_shared<BlockJacobiPreconditioner<Operator>>(*underlying_operator,
177 initialize_preconditioner);
179 additional_data_block.preconditioner = preconditioner_block_jacobi;
180 additional_data_block.smoothing_range = data.smoothing_range;
181 additional_data_block.degree = data.degree;
182 additional_data_block.eig_cg_n_iterations = data.iterations_eigenvalue_estimation;
184 chebyshev_block_jacobi = std::make_shared<ChebyshevBlockJacobi>();
186 if(initialize_preconditioner)
187 chebyshev_block_jacobi->initialize(*underlying_operator, additional_data_block);
189 else if(data.preconditioner == PreconditionerSmoother::AdditiveSchwarz)
191 preconditioner_additive_schwarz =
192 std::make_shared<AdditiveSchwarzPreconditioner<Operator>>(*underlying_operator,
193 initialize_preconditioner);
195 additional_data_additive_schwarz.preconditioner = preconditioner_additive_schwarz;
196 additional_data_additive_schwarz.smoothing_range = data.smoothing_range;
197 additional_data_additive_schwarz.degree = data.degree;
198 additional_data_additive_schwarz.eig_cg_n_iterations = data.iterations_eigenvalue_estimation;
200 chebyshev_additive_schwarz = std::make_shared<ChebyshevAdditiveSchwarz>();
202 if(initialize_preconditioner)
203 chebyshev_additive_schwarz->initialize(*underlying_operator,
204 additional_data_additive_schwarz);
208 AssertThrow(
false, dealii::ExcNotImplemented());
213 Operator
const * underlying_operator;
216 std::shared_ptr<ChebyshevPointJacobi> chebyshev_point_jacobi;
217 std::shared_ptr<ChebyshevBlockJacobi> chebyshev_block_jacobi;
218 std::shared_ptr<ChebyshevAdditiveSchwarz> chebyshev_additive_schwarz;
220 std::shared_ptr<JacobiPreconditioner<Operator>> preconditioner_point_jacobi;
221 std::shared_ptr<BlockJacobiPreconditioner<Operator>> preconditioner_block_jacobi;
222 std::shared_ptr<AdditiveSchwarzPreconditioner<Operator>> preconditioner_additive_schwarz;
224 typename ChebyshevPointJacobi::AdditionalData additional_data_point;
225 typename ChebyshevBlockJacobi::AdditionalData additional_data_block;
226 typename ChebyshevAdditiveSchwarz::AdditionalData additional_data_additive_schwarz;