3 #ifndef DUNE_AMG_KAMG_HH
4 #define DUNE_AMG_KAMG_HH
30 :
public Preconditioner<typename AMG::Domain,typename AMG::Range>
58 DUNE_UNUSED_PARAMETER(x); DUNE_UNUSED_PARAMETER(b);
64 DUNE_UNUSED_PARAMETER(x);
71 *levelContext_->update=0;
72 *levelContext_->rhs = d;
73 *levelContext_->lhs = v;
75 presmooth(*levelContext_, amg_.preSteps_);
76 bool processFineLevel =
77 amg_.moveToCoarseLevel(*levelContext_);
79 if(processFineLevel) {
83 coarseSolver_->apply(x, b, res);
84 *levelContext_->update=x;
87 amg_.moveToFineLevel(*levelContext_, processFineLevel);
90 v=*levelContext_->update;
119 std::shared_ptr<InverseOperator<Domain,Range> > coarseSolver_;
121 std::shared_ptr<typename AMG::LevelContext> levelContext_;
139 template<
class M,
class X,
class S,
class PI=SequentialInformation,
188 std::size_t preSmoothingSteps=1, std::size_t postSmoothingSteps=1,
189 std::size_t maxLevelKrylovSteps=3,
double minDefectReduction=1e-1) DUNE_DEPRECATED;
204 std::
size_t maxLevelKrylovSteps=3,
double minDefectReduction=1e-1);
229 std::
size_t preSmoothingSteps=1, std::
size_t postSmoothingSteps=1,
230 std::
size_t maxLevelKrylovSteps=3,
double minDefectReduction=1e-1,
249 std::
size_t maxLevelKrylovSteps=3,
double minDefectReduction=1e-1,
266 std::
size_t maxLevelKrylovSteps;
269 double levelDefectReduction;
278 template<class M, class X, class S, class P, class K, class A>
281 std::
size_t gamma, std::
size_t preSmoothingSteps,
282 std::
size_t postSmoothingSteps,
283 std::
size_t ksteps,
double reduction)
284 : amg(matrices, coarseSolver, smootherArgs, gamma, preSmoothingSteps,
285 postSmoothingSteps), maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
288 template<
class M,
class X,
class S,
class P,
class K,
class A>
291 std::size_t ksteps,
double reduction)
292 : amg(matrices, coarseSolver, smootherArgs, params),
293 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
296 template<
class M,
class X,
class S,
class P,
class K,
class A>
300 std::size_t preSmoothingSteps, std::size_t postSmoothingSteps,
301 std::size_t ksteps,
double reduction,
303 : amg(fineOperator, criterion, smootherArgs, gamma, preSmoothingSteps,
304 postSmoothingSteps, false, pinfo), maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
307 template<
class M,
class X,
class S,
class P,
class K,
class A>
311 std::size_t ksteps,
double reduction,
313 : amg(fineOperator, criterion, smootherArgs, pinfo),
314 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
318 template<
class M,
class X,
class S,
class P,
class K,
class A>
322 scalarproducts.reserve(amg.levels());
323 ksolvers.reserve(amg.levels());
325 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator
326 matrix = amg.matrices_->matrices().coarsest();
328 pinfo = amg.matrices_->parallelInformation().coarsest();
329 bool hasCoarsest=(amg.levels()==amg.maxlevels());
332 if(matrix==amg.matrices_->matrices().finest())
340 std::ostringstream s;
342 if(matrix!=amg.matrices_->matrices().finest())
344 scalarproducts.push_back(createScalarProduct<X>(*pinfo,category()));
345 std::shared_ptr<InverseOperator<Domain,Range> > ks =
346 std::shared_ptr<InverseOperator<Domain,Range> >(
new KrylovSolver(*matrix, *(scalarproducts.back()),
347 *(ksolvers.back()), levelDefectReduction,
348 maxLevelKrylovSteps, 0));
352 if(matrix==amg.matrices_->matrices().finest())
358 template<
class M,
class X,
class S,
class P,
class K,
class A>
365 template<
class M,
class X,
class S,
class P,
class K,
class A>
368 if(ksolvers.size()==0)
372 amg.solver_->apply(v,td,res);
375 typedef typename Amg::LevelContext LevelContext;
376 std::shared_ptr<LevelContext> levelContext(
new LevelContext);
377 amg.initIteratorsWithFineLevel(*levelContext);
378 typedef typename std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > >::iterator Iter;
379 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver)
380 (*solver)->setLevelContext(levelContext);
381 ksolvers.back()->apply(v,d);
385 template<
class M,
class X,
class S,
class P,
class K,
class A>
388 return amg.maxlevels();