1 #ifndef DUNE_FEM_DIAGONALPRECONDITIONER_HH 2 #define DUNE_FEM_DIAGONALPRECONDITIONER_HH 8 #include <dune/istl/bvector.hh> 19 template<
class DFImp,
class OperatorImp,
bool assembled >
33 virtual void operator()(
const DiscreteFunctionType &u, DiscreteFunctionType &res)
const 35 DUNE_THROW(NotImplemented,
"preconditioning not possible for non-assembled operators");
39 template <
class YBlock,
class XBlock >
41 void applyToISTLBlockVector(
const BlockVector< YBlock >& d,
42 BlockVector< XBlock >& v )
const 44 DUNE_THROW(NotImplemented,
"preconditioning not possible for non-assembled operators");
49 void apply(
const DiscreteFunctionType& u, DiscreteFunctionType& res )
const 51 DUNE_THROW(NotImplemented,
"preconditioning not possible for non-assembled operators");
58 template<
class DFImp,
class OperatorImp >
66 typedef typename DiscreteFunctionType :: DofType
DofType;
67 typedef typename Dune::FieldTraits< DofType >::real_type
RealType;
76 : diagonalInv_(
"diag-preconditioning", assembledOperator.systemMatrix().rangeSpace() )
79 assembledOperator.systemMatrix().extractDiagonal( diagonalInv_ );
82 diagonalInv_.communicate();
88 const RealType eps = 16.*std::numeric_limits< RealType >::epsilon();
89 const DofIteratorType dend = diagonalInv_.dend();
90 for( DofIteratorType dit = diagonalInv_.dbegin(); dit != dend; ++dit )
91 *dit = (
std::abs( *dit ) < eps ? DofType( 1. ) : DofType( 1. ) / *dit);
94 virtual void operator()(
const DiscreteFunctionType &u, DiscreteFunctionType &res)
const 100 template <
class YBlock,
class XBlock >
102 void applyToISTLBlockVector(
const BlockVector< YBlock >& d,
103 BlockVector< XBlock >& v )
const 105 DiscreteFunctionType vTmp(
"diag-precon::X", diagonalInv_.space(), v );
106 DiscreteFunctionType dTmp(
"diag-precon::Y", diagonalInv_.space(), d );
115 void apply(
const DiscreteFunctionType& u, DiscreteFunctionType& res )
const 117 ConstDofIteratorType uIt = u.dbegin();
118 ConstDofIteratorType diagInv = diagonalInv_.dbegin();
120 const DofIteratorType resEnd = res.dend();
123 for(DofIteratorType resIt = res.dbegin();
124 resIt != resEnd; ++ resIt, ++diagInv, ++ uIt )
126 assert( diagInv != diagonalInv_.dend() );
127 assert( uIt != u.dend() );
128 (*resIt) = (*uIt) * (*diagInv);
147 template<
class DFImp,
class Operator>
164 #endif // #ifndef DUNE_FEM_DIAGONALPRECONDITIONER_HH void apply(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
Definition: diagonalpreconditioner.hh:49
void apply(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
Definition: diagonalpreconditioner.hh:115
OperatorImp OperatorType
Definition: diagonalpreconditioner.hh:25
DiscreteFunctionType diagonalInv_
Definition: diagonalpreconditioner.hh:72
virtual void operator()(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
application operator
Definition: diagonalpreconditioner.hh:94
Operator OperatorType
Definition: diagonalpreconditioner.hh:154
DiagonalPreconditioner(const OperatorType &op)
Definition: diagonalpreconditioner.hh:155
DFImp DiscreteFunctionType
Definition: diagonalpreconditioner.hh:63
DiscreteFunctionType::DofIteratorType DofIteratorType
Definition: diagonalpreconditioner.hh:27
DiscreteFunctionType::ConstDofIteratorType ConstDofIteratorType
Definition: diagonalpreconditioner.hh:69
Double abs(const Double &a)
Definition: double.hh:860
abstract operator
Definition: operator.hh:25
DiscreteFunctionType::DofType DofType
Definition: diagonalpreconditioner.hh:66
DiagonalPreconditionerBase(const OperatorType &op)
Definition: diagonalpreconditioner.hh:31
virtual void operator()(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
application operator
Definition: diagonalpreconditioner.hh:33
Definition: coordinate.hh:4
DiscreteFunctionType::ConstDofIteratorType ConstDofIteratorType
Definition: diagonalpreconditioner.hh:28
Dune::FieldTraits< DofType >::real_type RealType
Definition: diagonalpreconditioner.hh:67
Definition: diagonalpreconditioner.hh:20
OperatorImp OperatorType
Definition: diagonalpreconditioner.hh:64
DFImp DiscreteFunctionType
Definition: diagonalpreconditioner.hh:24
DiscreteFunctionType::DofIteratorType DofIteratorType
Definition: diagonalpreconditioner.hh:68
Precondtioner, multiplies with inverse of the diagonal works with.
Definition: diagonalpreconditioner.hh:148
DiagonalPreconditionerBase(const OperatorType &assembledOperator)
Definition: diagonalpreconditioner.hh:75