3 #ifndef DUNE_ISTL_TWOLEVELMETHOD_HH
4 #define DUNE_ISTL_TWOLEVELMETHOD_HH
34 template<
class FO,
class CO>
138 template<
class O,
class C>
154 prolongDamp_ = criterion_.getProlongationDampingFactor();
161 typedef NegateSet<typename ParallelInformation::OwnerSet> OverlapFlags;
163 aggregatesMap_ = std::make_shared<AggregatesMap>(pg.
maxVertex()+1);
165 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
167 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =
168 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_,
true);
169 std::cout<<
"no aggregates="<<noAggregates<<
" iso="<<isoAggregates<<
" one="<<oneAggregates<<
" skipped="<<skippedAggregates<<std::endl;
172 typedef std::vector<bool>::iterator Iterator;
173 typedef Dune::IteratorPropertyMap<Iterator, Dune::IdentityMap> VisitedMap;
174 std::vector<bool> excluded(fineOperator.getmat().N(),
false);
175 VisitedMap vm(excluded.begin(), Dune::IdentityMap());
177 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,
178 *aggregatesMap_, pinfo,
180 std::vector<bool>& visited=excluded;
182 typedef std::vector<bool>::iterator Iterator;
184 for(Iterator iter= visited.begin(), end=visited.end();
187 matrix_.reset(productBuilder.
build(mg, vm,
192 productBuilder.
calculate(fineOperator.getmat(), *aggregatesMap_, *matrix_, pinfo, OverlapFlags());
193 this->
lhs_.resize(this->matrix_->M());
194 this->
rhs_.resize(this->matrix_->N());
195 this->
operator_ = std::make_shared<O>(*matrix_);
218 typename O::matrix_type::field_type prolongDamp_;
219 std::shared_ptr<AggregatesMap> aggregatesMap_;
221 std::shared_ptr<typename O::matrix_type> matrix_;
230 template<
class O,
class S,
class C>
237 typedef typename O::range_type
X;
252 : smootherArgs_(args), criterion_(c)
256 : coarseOperator_(other.coarseOperator_), smootherArgs_(other.smootherArgs_),
257 criterion_(other.criterion_)
271 : amg_(op, crit,args), first_(true)
285 void apply(
X& x,
X& b, InverseOperatorResult& res)
287 return apply(x,b,1e-8,res);
293 return amg_.category();
296 ~AMGInverseOperator()
301 AMGInverseOperator(
const AMGInverseOperator& other)
302 : x_(other.x_), amg_(other.amg_), first_(other.first_)
325 coarseOperator_=transferPolicy.getCoarseLevelOperator();
326 AMGInverseOperator* inv =
new AMGInverseOperator(*coarseOperator_,
336 std::shared_ptr<Operator> coarseOperator_;
348 template<
class FO,
class CSP,
class S>
350 public Preconditioner<typename FO::domain_type, typename FO::range_type>
403 std::shared_ptr<SmootherType> smoother,
407 std::size_t preSteps=1, std::size_t postSteps=1)
408 : operator_(&op), smoother_(smoother),
409 preSteps_(preSteps), postSteps_(postSteps)
411 policy_ = policy.
clone();
413 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);
417 : operator_(other.operator_), coarseSolver_(new
CoarseLevelSolver(*other.coarseSolver_)),
418 smoother_(other.smoother_), policy_(other.policy_->clone()),
419 preSteps_(other.preSteps_), postSteps_(other.postSteps_)
426 delete coarseSolver_;
441 LevelContext context;
446 context.smoother=smoother_;
448 context.matrix=operator_;
457 *context.update += *context.lhs;
478 std::shared_ptr<SmootherType> smoother;
506 std::shared_ptr<S> smoother_;
508 LevelTransferPolicy<FO,typename CSP::Operator>* policy_;
510 std::size_t preSteps_;
512 std::size_t postSteps_;
Define general, extensible interface for operators. The available implementation wraps a matrix.
Provides a class for building the galerkin product based on a aggregation scheme.
Define general, extensible interface for inverse operators.
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:561
SmootherTraits< Smoother >::Arguments SmootherArgs
The argument type for the construction of the smoother.
Definition: amg.hh:98
Operator Operator
The matrix operator type.
Definition: amg.hh:71
void presmooth(LevelContext &levelContext, size_t steps)
Apply pre smoothing on the current level.
Definition: smoother.hh:404
void postsmooth(LevelContext &levelContext, size_t steps)
Apply post smoothing on the current level.
Definition: smoother.hh:426
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O ©)
Calculate the galerkin product.
Definition: allocator.hh:9
Class providing information about the mapping of the vertices onto aggregates.
Definition: aggregates.hh:558
Class representing the properties of an ede in the matrix graph.
Definition: dependency.hh:37
Class representing a node in the matrix graph.
Definition: dependency.hh:124
Definition: galerkin.hh:116
The (undirected) graph of a matrix.
Definition: graph.hh:49
Attaches properties to the edges and vertices of a graph.
Definition: graph.hh:976
VertexDescriptor maxVertex() const
Get the maximal vertex descriptor.
Definition: indicescoarsener.hh:34
The default class for the smoother arguments.
Definition: smoother.hh:36
static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, const Vector &fine, T &comm)
static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())
Abstract base class for transfer between levels and creation of the coarse level system.
Definition: twolevelmethod.hh:36
CO CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:55
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:46
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:59
CoarseRangeType & getCoarseLevelRhs()
Get the coarse level right hand side.
Definition: twolevelmethod.hh:76
virtual ~LevelTransferPolicy()
Destructor.
Definition: twolevelmethod.hh:122
CoarseDomainType lhs_
The coarse level lhs.
Definition: twolevelmethod.hh:128
std::shared_ptr< CoarseOperatorType > operator_
the coarse level linear operator.
Definition: twolevelmethod.hh:130
CoarseRangeType rhs_
The coarse level rhs.
Definition: twolevelmethod.hh:126
std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()
Get the coarse level operator.
Definition: twolevelmethod.hh:68
virtual void moveToFineLevel(FineDomainType &fineLhs)=0
Updates the fine level linear system after the correction of the coarse levels system.
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:42
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition: twolevelmethod.hh:63
CoarseDomainType & getCoarseLevelLhs()
Get the coarse level left hand side.
Definition: twolevelmethod.hh:85
virtual LevelTransferPolicy * clone() const =0
Clone the current object.
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition: twolevelmethod.hh:50
A LeveTransferPolicy that used aggregation to construct the coarse level system.
Definition: twolevelmethod.hh:141
C Criterion
Definition: twolevelmethod.hh:145
AggregationLevelTransferPolicy * clone() const
Clone the current object.
Definition: twolevelmethod.hh:212
AggregationLevelTransferPolicy(const Criterion &crit)
Definition: twolevelmethod.hh:148
void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)
Updates the fine level linear system after the correction of the coarse levels system.
Definition: twolevelmethod.hh:205
void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)
Definition: twolevelmethod.hh:198
SequentialInformation ParallelInformation
Definition: twolevelmethod.hh:146
LevelTransferPolicy< O, O > FatherType
Definition: twolevelmethod.hh:144
void createCoarseLevelSystem(const O &fineOperator)
Algebraically creates the coarse level system.
Definition: twolevelmethod.hh:152
A policy class for solving the coarse level system using one step of AMG.
Definition: twolevelmethod.hh:232
OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)
Constructs the coarse solver policy.
Definition: twolevelmethod.hh:251
AMGInverseOperator CoarseLevelSolver
The type of solver constructed for the coarse level.
Definition: twolevelmethod.hh:313
OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)
Copy constructor.
Definition: twolevelmethod.hh:255
O::range_type X
The type of the range and domain of the operator.
Definition: twolevelmethod.hh:237
C Criterion
The type of the crition used for the aggregation within AMG.
Definition: twolevelmethod.hh:239
Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs
The type of the arguments used for constructing the smoother.
Definition: twolevelmethod.hh:243
O Operator
The type of the linear operator used.
Definition: twolevelmethod.hh:235
CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)
Constructs a coarse level solver.
Definition: twolevelmethod.hh:323
AMG< Operator, X, Smoother > AMGType
The type of the AMG construct on the coarse level.
Definition: twolevelmethod.hh:245
S Smoother
The type of the smoother used in AMG.
Definition: twolevelmethod.hh:241
Definition: twolevelmethod.hh:351
CoarseOperatorType::range_type CoarseRangeType
The type of the range of the coarse level operator.
Definition: twolevelmethod.hh:378
FineOperatorType::domain_type FineDomainType
The type of the domain of the fine level operator.
Definition: twolevelmethod.hh:369
TwoLevelMethod(const TwoLevelMethod &other)
Definition: twolevelmethod.hh:416
void pre(FineDomainType &x, FineRangeType &b)
Definition: twolevelmethod.hh:429
FO FineOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:361
CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver
The type of the coarse level solver.
Definition: twolevelmethod.hh:356
void apply(FineDomainType &v, const FineRangeType &d)
Definition: twolevelmethod.hh:437
CSP CoarseLevelSolverPolicy
The type of the policy for constructing the coarse level solver.
Definition: twolevelmethod.hh:354
CoarseOperatorType::domain_type CoarseDomainType
The type of the domain of the coarse level operator.
Definition: twolevelmethod.hh:382
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:402
virtual SolverCategory::Category category() const
Category of the preconditioner (see SolverCategory::Category)
Definition: twolevelmethod.hh:464
FineOperatorType::range_type FineRangeType
The type of the range of the fine level operator.
Definition: twolevelmethod.hh:365
~TwoLevelMethod()
Definition: twolevelmethod.hh:422
CSP::Operator CoarseOperatorType
The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
Definition: twolevelmethod.hh:374
void post([[maybe_unused]] FineDomainType &x)
Definition: twolevelmethod.hh:434
S SmootherType
The type of the fine level smoother.
Definition: twolevelmethod.hh:386
Base class for matrix free definition of preconditioners.
Definition: preconditioner.hh:30
Statistics about the application of an inverse operator.
Definition: solver.hh:46
Abstract base class for all solvers.
Definition: solver.hh:97
virtual void apply(X &x, X &b, InverseOperatorResult &res)=0
Apply inverse operator,.
Category
Definition: solvercategory.hh:21
@ sequential
Category for sequential solvers.
Definition: solvercategory.hh:23