1#ifndef DUNE_FEM_DIAGONALPRECONDITIONER_HH
2#define DUNE_FEM_DIAGONALPRECONDITIONER_HH
10#include <dune/istl/bvector.hh>
21 template<
class DFImp,
class OperatorImp,
bool assembled >
37 DUNE_THROW(NotImplemented,
"preconditioning not possible for non-assembled operators");
42 template <
class YBlock,
class XBlock >
43 void applyToISTLBlockVector(
const BlockVector< YBlock >& d,
44 BlockVector< XBlock >& v )
const
46 DUNE_THROW(NotImplemented,
"preconditioning not possible for non-assembled operators");
53 DUNE_THROW(NotImplemented,
"preconditioning not possible for non-assembled operators");
60 template<
class DFImp,
class OperatorImp >
68 typedef typename DiscreteFunctionType :: DofType
DofType;
69 typedef typename Dune::FieldTraits< DofType >::real_type
RealType;
78 : diagonalInv_(
"diag-preconditioning", assembledOperator.rangeSpace() )
81 assembledOperator.extractDiagonal( diagonalInv_ );
84 diagonalInv_.communicate();
90 const RealType eps = 16.*std::numeric_limits< RealType >::epsilon();
103 template <
class YBlock,
class XBlock >
104 void applyToISTLBlockVector(
const BlockVector< YBlock >& d,
105 BlockVector< XBlock >& v )
const
126 resIt != resEnd; ++ resIt, ++diagInv, ++ uIt )
128 assert( diagInv != diagonalInv_.dend() );
129 assert( uIt != u.dend() );
130 (*resIt) = (*uIt) * (*diagInv);
149 template<
class DFImp,
class Operator>
151 :
public DiagonalPreconditionerBase< DFImp, Operator, std::is_base_of< AssembledOperator< DFImp, DFImp >, Operator > :: value >
Dune::Fem::Double abs(const Dune::Fem::Double &a)
Definition: double.hh:942
Definition: bindguard.hh:11
abstract operator
Definition: operator.hh:34
Definition: diagonalpreconditioner.hh:24
DFImp DiscreteFunctionType
Definition: diagonalpreconditioner.hh:26
void apply(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
Definition: diagonalpreconditioner.hh:51
DiagonalPreconditionerBase(const OperatorType &op)
Definition: diagonalpreconditioner.hh:33
virtual void operator()(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
application operator
Definition: diagonalpreconditioner.hh:35
DiscreteFunctionType::ConstDofIteratorType ConstDofIteratorType
Definition: diagonalpreconditioner.hh:30
DiscreteFunctionType::DofIteratorType DofIteratorType
Definition: diagonalpreconditioner.hh:29
OperatorImp OperatorType
Definition: diagonalpreconditioner.hh:27
DiscreteFunctionType::ConstDofIteratorType ConstDofIteratorType
Definition: diagonalpreconditioner.hh:71
DiagonalPreconditionerBase(const OperatorType &assembledOperator)
Definition: diagonalpreconditioner.hh:77
DFImp DiscreteFunctionType
Definition: diagonalpreconditioner.hh:65
OperatorImp OperatorType
Definition: diagonalpreconditioner.hh:66
DiscreteFunctionType::DofType DofType
Definition: diagonalpreconditioner.hh:68
DiscreteFunctionType::DofIteratorType DofIteratorType
Definition: diagonalpreconditioner.hh:70
virtual void operator()(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
application operator
Definition: diagonalpreconditioner.hh:96
Dune::FieldTraits< DofType >::real_type RealType
Definition: diagonalpreconditioner.hh:69
DiscreteFunctionType diagonalInv_
Definition: diagonalpreconditioner.hh:74
void apply(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
Definition: diagonalpreconditioner.hh:117
Precondtioner, multiplies with inverse of the diagonal works with.
Definition: diagonalpreconditioner.hh:152
Operator OperatorType
Definition: diagonalpreconditioner.hh:156
DiagonalPreconditioner(const OperatorType &op)
Definition: diagonalpreconditioner.hh:157