3 #ifndef DUNE_ISTL_TWOLEVELMETHOD_HH 4 #define DUNE_ISTL_TWOLEVELMETHOD_HH 13 #include<dune/common/unused.hh> 36 template<
class FO,
class CO>
140 template<
class O,
class C>
156 prolongDamp_ = criterion_.getProlongationDampingFactor();
161 MatrixGraph mg(fineOperator.getmat());
162 PropertiesGraph pg(mg,Dune::IdentityMap(),Dune::IdentityMap());
163 typedef NegateSet<typename ParallelInformation::OwnerSet> OverlapFlags;
165 aggregatesMap_.reset(
new AggregatesMap(pg.maxVertex()+1));
167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
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;
174 typedef std::vector<bool>::iterator Iterator;
175 typedef Dune::IteratorPropertyMap<Iterator, Dune::IdentityMap> VisitedMap;
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,
182 std::vector<bool>& visited=excluded;
184 typedef std::vector<bool>::iterator Iterator;
186 for(Iterator iter= visited.begin(), end=visited.end();
189 matrix_.reset(productBuilder.
build(mg, vm,
194 productBuilder.
calculate(fineOperator.getmat(), *aggregatesMap_, *matrix_, pinfo, OverlapFlags());
195 this->
lhs_.resize(this->matrix_->M());
196 this->
rhs_.resize(this->matrix_->N());
211 prolongDamp_, ParallelInformation());
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_;
232 template<
class O,
class S,
class C>
239 typedef typename O::range_type
X;
254 : smootherArgs_(args), criterion_(c)
258 : coarseOperator_(other.coarseOperator_), smootherArgs_(other.smootherArgs_),
259 criterion_(other.criterion_)
271 const Criterion& crit,
273 : amg_(op, crit,args), first_(
true)
278 DUNE_UNUSED_PARAMETER(reduction);
279 DUNE_UNUSED_PARAMETER(res);
291 return apply(x,b,1e-8,res);
297 return amg_.category();
300 ~AMGInverseOperator()
305 AMGInverseOperator(
const AMGInverseOperator& other)
306 : x_(other.x_), amg_(other.amg_), first_(other.first_)
329 coarseOperator_=transferPolicy.getCoarseLevelOperator();
330 AMGInverseOperator* inv =
new AMGInverseOperator(*coarseOperator_,
340 std::shared_ptr<Operator> coarseOperator_;
342 SmootherArgs smootherArgs_;
344 Criterion criterion_;
352 template<
class FO,
class CSP,
class S>
354 public Preconditioner<typename FO::domain_type, typename FO::range_type>
407 std::shared_ptr<SmootherType> smoother,
409 CoarseOperatorType>& policy,
410 CoarseLevelSolverPolicy& coarsePolicy,
411 std::size_t preSteps=1, std::size_t postSteps=1)
413 preSteps_(preSteps), postSteps_(postSteps)
415 policy_ = policy.clone();
416 policy_->createCoarseLevelSystem(*
operator_);
417 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);
421 :
operator_(other.
operator_), coarseSolver_(new CoarseLevelSolver(*other.coarseSolver_)),
422 smoother_(other.smoother_), policy_(other.policy_->
clone()),
423 preSteps_(other.preSteps_), postSteps_(other.postSteps_)
430 delete coarseSolver_;
433 void pre(FineDomainType& x, FineRangeType& b)
440 DUNE_UNUSED_PARAMETER(x);
443 void apply(FineDomainType& v,
const FineRangeType& d)
446 FineRangeType rhs(d);
447 LevelContext context;
452 context.smoother=smoother_;
458 policy_->moveToCoarseLevel(*context.rhs);
460 coarseSolver_->apply(policy_->getCoarseLevelLhs(), policy_->getCoarseLevelRhs(), res);
462 policy_->moveToFineLevel(*context.lhs);
463 *context.update += *context.lhs;
482 typedef S SmootherType;
484 std::shared_ptr<SmootherType> smoother;
498 FineDomainType* update;
506 const FineOperatorType* matrix;
510 CoarseLevelSolver* coarseSolver_;
512 std::shared_ptr<S> smoother_;
516 std::size_t preSteps_;
518 std::size_t postSteps_;
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition: twolevelmethod.hh:52
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition: smoother.hh:476
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:44
O::range_type X
The type of the range and domain of the operator.
Definition: twolevelmethod.hh:239
CoarseRangeType & getCoarseLevelRhs()
Get the coarse level right hand side.
Definition: twolevelmethod.hh:78
OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)
Copy constructor.
Definition: twolevelmethod.hh:257
static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, const Vector &fine, T &comm)
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition: twolevelmethod.hh:373
Definition: allocator.hh:7
virtual void moveToFineLevel(FineDomainType &fineLhs)=0
Updates the fine level linear system after the correction of the coarse levels system.
void post(FineDomainType &x)
Definition: twolevelmethod.hh:438
CSP::Operator CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:378
std::shared_ptr< CoarseOperatorType > operator_
the coarse level linear operator.
Definition: twolevelmethod.hh:132
void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)
Updates the fine level linear system after the correction of the coarse levels system.
Definition: twolevelmethod.hh:207
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition: twolevelmethod.hh:386
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition: twolevelmethod.hh:48
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition: twolevelmethod.hh:369
CO CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:57
Define general, extensible interface for inverse operators.
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition: twolevelmethod.hh:65
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O ©)
Calculate the galerkin product.
Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs
The type of the arguments used for constructing the smoother.
Definition: twolevelmethod.hh:245
std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()
Get the coarse level operator.
Definition: twolevelmethod.hh:70
S SmootherType
The type of the fine level smoother.
Definition: twolevelmethod.hh:390
void apply(FineDomainType &v, const FineRangeType &d)
Definition: twolevelmethod.hh:443
Operator Operator
The matrix operator type.
Definition: amg.hh:67
The default class for the smoother arguments.
Definition: smoother.hh:35
SequentialInformation ParallelInformation
Definition: twolevelmethod.hh:148
AggregationLevelTransferPolicy * clone() const
Clone the current object.
Definition: twolevelmethod.hh:214
Abstract base class for transfer between levels and creation of the coarse level system.
Definition: twolevelmethod.hh:37
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:406
C Criterion
The type of the crition used for the aggregation within AMG.
Definition: twolevelmethod.hh:241
TwoLevelMethod(const TwoLevelMethod &other)
Definition: twolevelmethod.hh:420
~TwoLevelMethod()
Definition: twolevelmethod.hh:426
The (undirected) graph of a matrix.
Definition: graph.hh:48
virtual LevelTransferPolicy * clone() const =0
Clone the current object.
Definition: galerkin.hh:115
C Criterion
Definition: twolevelmethod.hh:147
Attaches properties to the edges and vertices of a graph.
Definition: graph.hh:975
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition: smoother.hh:454
AggregationLevelTransferPolicy(const Criterion &crit)
Definition: twolevelmethod.hh:150
A policy class for solving the coarse level system using one step of AMG.
Definition: twolevelmethod.hh:233
Define general, extensible interface for operators. The available implementation wraps a matrix...
AMGInverseOperator CoarseLevelSolver
The type of solver constructed for the coarse level.
Definition: twolevelmethod.hh:317
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:365
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())
virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0
Algebraically creates the coarse level system.
S Smoother
The type of the smoother used in AMG.
Definition: twolevelmethod.hh:243
Class providing information about the mapping of the vertices onto aggregates.
Definition: aggregates.hh:542
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition: twolevelmethod.hh:382
void pre(FineDomainType &x, FineRangeType &b)
Definition: twolevelmethod.hh:433
Abstract base class for all solvers.
Definition: solver.hh:91
virtual ~LevelTransferPolicy()
Destructor.
Definition: twolevelmethod.hh:124
CoarseDomainType lhs_
The coarse level lhs.
Definition: twolevelmethod.hh:130
Provides a class for building the galerkin product based on a aggregation scheme. ...
Category
Definition: solvercategory.hh:21
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition: twolevelmethod.hh:61
Class representing a node in the matrix graph.
Definition: dependency.hh:125
Definition: indicescoarsener.hh:34
Definition: twolevelmethod.hh:353
G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation &pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::Matrix::size_type &size, const Set ©)
Calculates the coarse matrix via a Galerkin product.
Definition: galerkin.hh:564
void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)
Definition: twolevelmethod.hh:200
LevelTransferPolicy< O, O > FatherType
Definition: twolevelmethod.hh:146
void createCoarseLevelSystem(const O &fineOperator)
Algebraically creates the coarse level system.
Definition: twolevelmethod.hh:154
CSP CoarseLevelSolverPolicy
The type of the policy for constructing the coarse level solver.
Definition: twolevelmethod.hh:358
A LeveTransferPolicy that used aggregation to construct the coarse level system.
Definition: twolevelmethod.hh:141
CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver
The type of the coarse level solver.
Definition: twolevelmethod.hh:360
CoarseDomainType & getCoarseLevelLhs()
Get the coarse level left hand side.
Definition: twolevelmethod.hh:87
virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0
Transfers the data to the coarse level.
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition: amg.hh:94
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition: twolevelmethod.hh:470
Class representing the properties of an ede in the matrix graph.
Definition: dependency.hh:37
Statistics about the application of an inverse operator.
Definition: solver.hh:40
Category for sequential solvers.
Definition: solvercategory.hh:23
Base class for matrix free definition of preconditioners.
Definition: preconditioner.hh:30
CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)
Constructs a coarse level solver.
Definition: twolevelmethod.hh:327
CoarseRangeType rhs_
The coarse level rhs.
Definition: twolevelmethod.hh:128
OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)
Constructs the coarse solver policy.
Definition: twolevelmethod.hh:253
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