dune-fem  2.4.1-rc
diagonalpreconditioner.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_DIAGONALPRECONDITIONER_HH
2 #define DUNE_FEM_DIAGONALPRECONDITIONER_HH
3 
6 
7 #if HAVE_DUNE_ISTL
8 #include <dune/istl/bvector.hh>
9 #endif
10 
11 namespace Dune
12 {
13 
14  namespace Fem
15  {
16 
17  // DiagonalPreconditionerBase (default non-assembled)
18  // --------------------------------------------------
19  template< class DFImp, class OperatorImp, bool assembled >
21  : public Operator< DFImp, DFImp >
22  {
23  public:
24  typedef DFImp DiscreteFunctionType;
25  typedef OperatorImp OperatorType;
26 
27  typedef typename DiscreteFunctionType :: DofIteratorType DofIteratorType;
28  typedef typename DiscreteFunctionType :: ConstDofIteratorType ConstDofIteratorType;
29 
30  public:
31  DiagonalPreconditionerBase(const OperatorType &op) {}
32 
33  virtual void operator()(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
34  {
35  DUNE_THROW(NotImplemented,"preconditioning not possible for non-assembled operators");
36  }
37 
38 #if HAVE_DUNE_ISTL
39  template < class YBlock, class XBlock >
41  void applyToISTLBlockVector( const BlockVector< YBlock >& d,
42  BlockVector< XBlock >& v ) const
43  {
44  DUNE_THROW(NotImplemented,"preconditioning not possible for non-assembled operators");
45  }
46 #endif
47 
48  protected:
49  void apply( const DiscreteFunctionType& u, DiscreteFunctionType& res ) const
50  {
51  DUNE_THROW(NotImplemented,"preconditioning not possible for non-assembled operators");
52  }
53  };
54 
55 
56  // DiagonalPreconditionerBase (assembled version)
57  // ----------------------------------------------
58  template< class DFImp, class OperatorImp >
59  class DiagonalPreconditionerBase< DFImp, OperatorImp, true >
60  : public Operator< DFImp, DFImp >
61  {
62  public:
63  typedef DFImp DiscreteFunctionType;
64  typedef OperatorImp OperatorType;
65 
66  typedef typename DiscreteFunctionType :: DofType DofType;
67  typedef typename Dune::FieldTraits< DofType >::real_type RealType;
68  typedef typename DiscreteFunctionType :: DofIteratorType DofIteratorType;
69  typedef typename DiscreteFunctionType :: ConstDofIteratorType ConstDofIteratorType;
70 
71  protected:
72  DiscreteFunctionType diagonalInv_;
73 
74  public:
75  DiagonalPreconditionerBase( const OperatorType& assembledOperator )
76  : diagonalInv_( "diag-preconditioning", assembledOperator.systemMatrix().rangeSpace() )
77  {
78  // estract diagonal elements form matrix object
79  assembledOperator.systemMatrix().extractDiagonal( diagonalInv_ );
80 
81  // make consistent at border dofs
82  diagonalInv_.communicate();
83 
84  // In general: store 1/diag
85  //
86  // note: We set near-zero entries to 1 to avoid NaNs. Such entries occur
87  // if DoFs are excluded from matrix setup
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);
92  }
93 
94  virtual void operator()(const DiscreteFunctionType &u, DiscreteFunctionType &res) const
95  {
96  apply(u, res);
97  }
98 
99 #if HAVE_DUNE_ISTL
100  template < class YBlock, class XBlock >
102  void applyToISTLBlockVector( const BlockVector< YBlock >& d,
103  BlockVector< XBlock >& v ) const
104  {
105  DiscreteFunctionType vTmp("diag-precon::X", diagonalInv_.space(), v );
106  DiscreteFunctionType dTmp("diag-precon::Y", diagonalInv_.space(), d );
107 
108  // apply 1/diagonal
109  apply( dTmp, vTmp );
110  }
111 #endif
112 
113 
114  protected:
115  void apply( const DiscreteFunctionType& u, DiscreteFunctionType& res ) const
116  {
117  ConstDofIteratorType uIt = u.dbegin();
118  ConstDofIteratorType diagInv = diagonalInv_.dbegin();
119 
120  const DofIteratorType resEnd = res.dend();
121 
122  // apply 1/diagonal
123  for(DofIteratorType resIt = res.dbegin();
124  resIt != resEnd; ++ resIt, ++diagInv, ++ uIt )
125  {
126  assert( diagInv != diagonalInv_.dend() );
127  assert( uIt != u.dend() );
128  (*resIt) = (*uIt) * (*diagInv);
129  }
130  }
131 
132  };
133 
134 
135  // DiagonalPreconditioner
136  // ----------------------
147  template< class DFImp, class Operator>
149  : public DiagonalPreconditionerBase< DFImp, Operator, IsBaseOf< AssembledOperator< DFImp, DFImp >, Operator > :: value >
150  {
152  BaseType;
153  public:
155  DiagonalPreconditioner(const OperatorType &op)
156  : BaseType( op )
157  {}
158  };
159 
160  } // namespace Fem
161 
162 } // namespace Dune
163 
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