Dune Core Modules (2.5.0)

twolevelmethod.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH
4#define DUNE_ISTL_TWOLEVELMETHOD_HH
5
6#include <tuple>
7
9#include"amg.hh"
10#include"galerkin.hh"
11#include<dune/istl/solver.hh>
12
14
22namespace Dune
23{
24namespace Amg
25{
26
36template<class FO, class CO>
38{
39public:
44 typedef FO FineOperatorType;
48 typedef typename FineOperatorType::range_type FineRangeType;
52 typedef typename FineOperatorType::domain_type FineDomainType;
61 typedef typename CoarseOperatorType::range_type CoarseRangeType;
65 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
70 std::shared_ptr<CoarseOperatorType>& getCoarseLevelOperator()
71 {
72 return operator_;
73 }
79 {
80 return rhs_;
81 }
82
88 {
89 return lhs_;
90 }
100 virtual void moveToCoarseLevel(const FineRangeType& fineRhs)=0;
110 virtual void moveToFineLevel(FineDomainType& fineLhs)=0;
118 virtual void createCoarseLevelSystem(const FineOperatorType& fineOperator)=0;
119
121 virtual LevelTransferPolicy* clone() const =0;
122
125
126 protected:
132 std::shared_ptr<CoarseOperatorType> operator_;
133};
134
140template<class O, class C>
142 : public LevelTransferPolicy<O,O>
143{
145public:
147 typedef C Criterion;
148 typedef SequentialInformation ParallelInformation;
149
150 AggregationLevelTransferPolicy(const Criterion& crit)
151 : criterion_(crit)
152 {}
153
154 void createCoarseLevelSystem(const O& fineOperator)
155 {
156 prolongDamp_ = criterion_.getProlongationDampingFactor();
157 GalerkinProduct<ParallelInformation> productBuilder;
161 MatrixGraph mg(fineOperator.getmat());
164
165 aggregatesMap_.reset(new AggregatesMap(pg.maxVertex()+1));
166
167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
168
169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =
170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_, true);
171 std::cout<<"no aggregates="<<noAggregates<<" iso="<<isoAggregates<<" one="<<oneAggregates<<" skipped="<<skippedAggregates<<std::endl;
172 // misuse coarsener to renumber aggregates
173 Dune::Amg::IndicesCoarsener<Dune::Amg::SequentialInformation,int> renumberer;
174 typedef std::vector<bool>::iterator Iterator;
176 std::vector<bool> excluded(fineOperator.getmat().N(), false);
177 VisitedMap vm(excluded.begin(), Dune::IdentityMap());
178 ParallelInformation pinfo;
179 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,
180 *aggregatesMap_, pinfo,
181 noAggregates);
182 std::vector<bool>& visited=excluded;
183
184 typedef std::vector<bool>::iterator Iterator;
185
186 for(Iterator iter= visited.begin(), end=visited.end();
187 iter != end; ++iter)
188 *iter=false;
189 matrix_.reset(productBuilder.build(mg, vm,
190 SequentialInformation(),
191 *aggregatesMap_,
192 aggregates,
193 OverlapFlags()));
194 productBuilder.calculate(fineOperator.getmat(), *aggregatesMap_, *matrix_, pinfo, OverlapFlags());
195 this->lhs_.resize(this->matrix_->M());
196 this->rhs_.resize(this->matrix_->N());
197 this->operator_.reset(new O(*matrix_));
198 }
199
200 void moveToCoarseLevel(const typename FatherType::FineRangeType& fineRhs)
201 {
202 Transfer<std::size_t,typename FatherType::FineRangeType,ParallelInformation>
203 ::restrictVector(*aggregatesMap_, this->rhs_, fineRhs, ParallelInformation());
204 this->lhs_=0;
205 }
206
208 {
209 Transfer<std::size_t,typename FatherType::FineRangeType,ParallelInformation>
210 ::prolongateVector(*aggregatesMap_, this->lhs_, fineLhs,
211 prolongDamp_, ParallelInformation());
212 }
213
215 {
216 return new AggregationLevelTransferPolicy(*this);
217 }
218
219private:
220 typename O::matrix_type::field_type prolongDamp_;
221 std::shared_ptr<AggregatesMap> aggregatesMap_;
222 Criterion criterion_;
223 std::shared_ptr<typename O::matrix_type> matrix_;
224};
225
232template<class O, class S, class C>
234{
235public:
237 typedef O Operator;
239 typedef typename O::range_type X;
241 typedef C Criterion;
243 typedef S Smoother;
254 : smootherArgs_(args), criterion_(c)
255 {}
258 : coarseOperator_(other.coarseOperator_), smootherArgs_(other.smootherArgs_),
259 criterion_(other.criterion_)
260 {}
261private:
268 struct AMGInverseOperator : public InverseOperator<X,X>
269 {
270 AMGInverseOperator(const typename AMGType::Operator& op,
271 const Criterion& crit,
272 const typename AMGType::SmootherArgs& args)
273 : amg_(op, crit,args), first_(true)
274 {}
275
276 void apply(X& x, X& b, double reduction, InverseOperatorResult& res)
277 {
278 DUNE_UNUSED_PARAMETER(reduction);
280 if(first_)
281 {
282 amg_.pre(x,b);
283 first_=false;
284 x_=x;
285 }
286 amg_.apply(x,b);
287 }
288
289 void apply(X& x, X& b, InverseOperatorResult& res)
290 {
291 return apply(x,b,1e-8,res);
292 }
293
294 ~AMGInverseOperator()
295 {
296 if(!first_)
297 amg_.post(x_);
298 }
299 AMGInverseOperator(const AMGInverseOperator& other)
300 : x_(other.x_), amg_(other.amg_), first_(other.first_)
301 {
302 }
303 private:
304 X x_;
305 AMGType amg_;
306 bool first_;
307 };
308
309public:
311 typedef AMGInverseOperator CoarseLevelSolver;
312
320 template<class P>
322 {
323 coarseOperator_=transferPolicy.getCoarseLevelOperator();
324 AMGInverseOperator* inv = new AMGInverseOperator(*coarseOperator_,
325 criterion_,
326 smootherArgs_);
327
328 return inv; //std::shared_ptr<InverseOperator<X,X> >(inv);
329
330 }
331
332private:
334 std::shared_ptr<Operator> coarseOperator_;
336 SmootherArgs smootherArgs_;
338 Criterion criterion_;
339};
340
346template<class FO, class CSP, class S>
348 public Preconditioner<typename FO::domain_type, typename FO::range_type>
349{
350public:
354 typedef typename CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver;
363 typedef typename FineOperatorType::range_type FineRangeType;
367 typedef typename FineOperatorType::domain_type FineDomainType;
372 typedef typename CSP::Operator CoarseOperatorType;
376 typedef typename CoarseOperatorType::range_type CoarseRangeType;
380 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
384 typedef S SmootherType;
385 // define the category
386 enum {
389 };
390
406 std::shared_ptr<SmootherType> smoother,
408 CoarseOperatorType>& policy,
409 CoarseLevelSolverPolicy& coarsePolicy,
410 std::size_t preSteps=1, std::size_t postSteps=1)
411 : operator_(&op), smoother_(smoother),
412 preSteps_(preSteps), postSteps_(postSteps)
413 {
414 policy_ = policy.clone();
415 policy_->createCoarseLevelSystem(*operator_);
416 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);
417 }
418
419 TwoLevelMethod(const TwoLevelMethod& other)
420 : operator_(other.operator_), coarseSolver_(new CoarseLevelSolver(*other.coarseSolver_)),
421 smoother_(other.smoother_), policy_(other.policy_->clone()),
422 preSteps_(other.preSteps_), postSteps_(other.postSteps_)
423 {}
424
425 ~TwoLevelMethod()
426 {
427 // Each instance has its own policy.
428 delete policy_;
429 delete coarseSolver_;
430 }
431
432 void pre(FineDomainType& x, FineRangeType& b)
433 {
434 smoother_->pre(x,b);
435 }
436
437 void post(FineDomainType& x)
438 {
440 }
441
442 void apply(FineDomainType& v, const FineRangeType& d)
443 {
444 FineDomainType u(v);
445 FineRangeType rhs(d);
446 LevelContext context;
447 SequentialInformation info;
448 context.pinfo=&info;
449 context.lhs=&u;
450 context.update=&v;
451 context.smoother=smoother_;
452 context.rhs=&rhs;
453 context.matrix=operator_;
454 // Presmoothing
455 presmooth(context, preSteps_);
456 //Coarse grid correction
457 policy_->moveToCoarseLevel(*context.rhs);
458 InverseOperatorResult res;
459 coarseSolver_->apply(policy_->getCoarseLevelLhs(), policy_->getCoarseLevelRhs(), res);
460 *context.lhs=0;
461 policy_->moveToFineLevel(*context.lhs);
462 *context.update += *context.lhs;
463 // Postsmoothing
464 postsmooth(context, postSteps_);
465
466 }
467
468private:
472 struct LevelContext
473 {
475 typedef S SmootherType;
477 std::shared_ptr<SmootherType> smoother;
479 FineDomainType* lhs;
480 /*
481 * @brief The right hand side holding the current residual.
482 *
483 * This is passed to the smoother as the right hand side.
484 */
485 FineRangeType* rhs;
491 FineDomainType* update;
493 SequentialInformation* pinfo;
499 const FineOperatorType* matrix;
500 };
501 const FineOperatorType* operator_;
503 CoarseLevelSolver* coarseSolver_;
505 std::shared_ptr<S> smoother_;
507 LevelTransferPolicy<FO,typename CSP::Operator>* policy_;
509 std::size_t preSteps_;
511 std::size_t postSteps_;
512};
513}// end namespace Amg
514}// end namespace Dune
515
517#endif
The AMG preconditioner.
Class providing information about the mapping of the vertices onto aggregates.
Definition: aggregates.hh:543
A LeveTransferPolicy that used aggregation to construct the coarse level system.
Definition: twolevelmethod.hh:143
AggregationLevelTransferPolicy * clone() const
Clone the current object.
Definition: twolevelmethod.hh:214
void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)
Updates the fine level linear system after the correction of the coarse levels system.
Definition: twolevelmethod.hh:207
void createCoarseLevelSystem(const O &fineOperator)
Algebraically creates the coarse level system.
Definition: twolevelmethod.hh:154
Class representing the properties of an ede in the matrix graph.
Definition: dependency.hh:38
Abstract base class for transfer between levels and creation of the coarse level system.
Definition: twolevelmethod.hh:38
CO CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:57
virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0
Transfers the data to the coarse level.
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition: twolevelmethod.hh:48
virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0
Algebraically creates the coarse level system.
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition: twolevelmethod.hh:61
virtual ~LevelTransferPolicy()
Destructor.
Definition: twolevelmethod.hh:124
CoarseDomainType lhs_
The coarse level lhs.
Definition: twolevelmethod.hh:130
virtual LevelTransferPolicy * clone() const =0
Clone the current object.
CoarseDomainType & getCoarseLevelLhs()
Get the coarse level left hand side.
Definition: twolevelmethod.hh:87
std::shared_ptr< CoarseOperatorType > operator_
the coarse level linear operator.
Definition: twolevelmethod.hh:132
CoarseRangeType rhs_
The coarse level rhs.
Definition: twolevelmethod.hh:128
virtual void moveToFineLevel(FineDomainType &fineLhs)=0
Updates the fine level linear system after the correction of the coarse levels system.
std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()
Get the coarse level operator.
Definition: twolevelmethod.hh:70
CoarseRangeType & getCoarseLevelRhs()
Get the coarse level right hand side.
Definition: twolevelmethod.hh:78
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:44
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition: twolevelmethod.hh:65
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition: twolevelmethod.hh:52
The (undirected) graph of a matrix.
Definition: graph.hh:49
A policy class for solving the coarse level system using one step of AMG.
Definition: twolevelmethod.hh:234
OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)
Constructs the coarse solver policy.
Definition: twolevelmethod.hh:253
AMGInverseOperator CoarseLevelSolver
The type of solver constructed for the coarse level.
Definition: twolevelmethod.hh:311
OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)
Copy constructor.
Definition: twolevelmethod.hh:257
O::range_type X
The type of the range and domain of the operator.
Definition: twolevelmethod.hh:239
C Criterion
The type of the crition used for the aggregation within AMG.
Definition: twolevelmethod.hh:241
Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs
The type of the arguments used for constructing the smoother.
Definition: twolevelmethod.hh:245
O Operator
The type of the linear operator used.
Definition: twolevelmethod.hh:237
AMG< Operator, X, Smoother > AMGType
The type of the AMG construct on the coarse level.
Definition: twolevelmethod.hh:247
CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)
Constructs a coarse level solver.
Definition: twolevelmethod.hh:321
S Smoother
The type of the smoother used in AMG.
Definition: twolevelmethod.hh:243
Attaches properties to the edges and vertices of a graph.
Definition: graph.hh:976
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
Definition: twolevelmethod.hh:349
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition: twolevelmethod.hh:376
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition: twolevelmethod.hh:367
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:359
CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver
The type of the coarse level solver.
Definition: twolevelmethod.hh:354
CSP CoarseLevelSolverPolicy
The type of the policy for constructing the coarse level solver.
Definition: twolevelmethod.hh:352
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition: twolevelmethod.hh:380
@ category
The category the preconditioner is part of.
Definition: twolevelmethod.hh:388
TwoLevelMethod(const FineOperatorType &op, std::shared_ptr< SmootherType > smoother, const LevelTransferPolicy< FineOperatorType, CoarseOperatorType > &policy, CoarseLevelSolverPolicy &coarsePolicy, std::size_t preSteps=1, std::size_t postSteps=1)
Constructs a two level method.
Definition: twolevelmethod.hh:405
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition: twolevelmethod.hh:363
CSP::Operator CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:372
S SmootherType
The type of the fine level smoother.
Definition: twolevelmethod.hh:384
Class representing a node in the matrix graph.
Definition: dependency.hh:125
Abstract base class for all solvers.
Definition: solver.hh:79
virtual void apply(X &x, X &b, InverseOperatorResult &res)=0
Apply inverse operator,.
Adapter to turn a random access iterator into a property map.
Definition: propertymap.hh:106
The negation of a set. An item is contained in the set if and only if it is not contained in the nega...
Definition: enumset.hh:95
Base class for matrix free definition of preconditioners.
Definition: preconditioner.hh:26
Provides a class for building the galerkin product based on a aggregation scheme.
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition: amg.hh:91
Operator Operator
The matrix operator type.
Definition: amg.hh:64
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition: smoother.hh:408
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition: smoother.hh:430
Dune namespace.
Definition: alignment.hh:11
Define general, extensible interface for operators. The available implementation wraps a matrix.
Define general, extensible interface for inverse operators.
The default class for the smoother arguments.
Definition: smoother.hh:36
A property map that applies the identity function to integers.
Definition: propertymap.hh:291
Statistics about the application of an inverse operator.
Definition: solver.hh:32
@ sequential
Category for sequential solvers.
Definition: solvercategory.hh:21
Definition of the DUNE_UNUSED macro for the case that config.h is not available.
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentionally unused function parameters with.
Definition: unused.hh:18
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)