dune-fem  2.8-git
preconditionedinverseoperator.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_SOLVER_PRECONDITIONEDINVERSEOPERATOR_HH
2 #define DUNE_FEM_SOLVER_PRECONDITIONEDINVERSEOPERATOR_HH
3 
4 #include <limits>
5 #include <memory>
6 
8 
9 namespace Dune
10 {
11 
12  namespace Fem
13  {
14 
15  // PreconditionedInverseOperator
16  // -----------------------------
17 
18  template< class Preconditioner, class InverseOperator >
20  : public Operator< typename Preconditioner::RangeFunctionType >
21  {
24 
25  public:
28 
29  typedef typename InverseOperator::OperatorType OperatorType;
30 
31  PreconditionedInverseOperator ( double redEps, double absLimit, unsigned int maxIterations, bool verbose )
32  : inverseOperator_( redEps, absLimit, maxIterations, verbose )
33  {}
34 
35  PreconditionedInverseOperator ( double redEps, double absLimit,
36  unsigned int maxIterations = std::numeric_limits< unsigned int >::max() )
37  : inverseOperator_( redEps, absLimit, maxIterations )
38  {}
39 
40  PreconditionedInverseOperator ( const OperatorType &op, double redEps, double absLimit,
41  unsigned int maxIterations, bool verbose )
42  : inverseOperator_( redEps, absLimit, maxIterations, verbose )
43  {
44  bind( op );
45  }
46 
47  PreconditionedInverseOperator ( const OperatorType &op, double redEps, double absLimit,
48  unsigned int maxIterations = std::numeric_limits< unsigned int >::max() )
49  : inverseOperator_( redEps, absLimit, maxIterations )
50  {
51  bind( op );
52  }
53 
54  void bind ( const OperatorType &op )
55  {
56  preconditioner_.reset( new Preconditioner( op ) );
57  asssert( preconditioner_ );
58  inverseOperator_.bind( op, *preconditioner_ );
59  }
60  void unbind() { inverseOperator_.unbind(); preconditioner_.reset(); }
61 
63  {
64  assert( preconditioner_ );
65  inverseOperator_( u, w );
66  }
67 
68  unsigned int iterations () const { return inverseOperator_.iterations(); }
69  void setMaxIterations ( unsigned int maxIterations ) const { inverseOperator_.setMaxIterations( maxIterations ); }
70 
71  private:
72  InverseOperator inverseOperator_;
73  std::unique_ptr< Preconditioner > preconditioner_;
74  };
75 
76  } // namespace Fem
77 
78 } // namespace Dune
79 
80 #endif // #ifndef DUNE_FEM_SOLVER_PRECONDITIONEDINVERSEOPERATOR_HH
Definition: bindguard.hh:11
static constexpr T max(T a)
Definition: utility.hh:77
abstract operator
Definition: operator.hh:34
DomainFunction DomainFunctionType
type of discrete function in the operator's domain
Definition: operator.hh:36
Definition: preconditionedinverseoperator.hh:21
PreconditionedInverseOperator(double redEps, double absLimit, unsigned int maxIterations=std::numeric_limits< unsigned int >::max())
Definition: preconditionedinverseoperator.hh:35
void operator()(const DomainFunctionType &u, RangeFunctionType &w) const
Definition: preconditionedinverseoperator.hh:62
void setMaxIterations(unsigned int maxIterations) const
Definition: preconditionedinverseoperator.hh:69
BaseType::DomainFunctionType RangeFunctionType
Definition: preconditionedinverseoperator.hh:27
InverseOperator::OperatorType OperatorType
Definition: preconditionedinverseoperator.hh:29
void unbind()
Definition: preconditionedinverseoperator.hh:60
PreconditionedInverseOperator(const OperatorType &op, double redEps, double absLimit, unsigned int maxIterations, bool verbose)
Definition: preconditionedinverseoperator.hh:40
unsigned int iterations() const
Definition: preconditionedinverseoperator.hh:68
PreconditionedInverseOperator(double redEps, double absLimit, unsigned int maxIterations, bool verbose)
Definition: preconditionedinverseoperator.hh:31
void bind(const OperatorType &op)
Definition: preconditionedinverseoperator.hh:54
PreconditionedInverseOperator(const OperatorType &op, double redEps, double absLimit, unsigned int maxIterations=std::numeric_limits< unsigned int >::max())
Definition: preconditionedinverseoperator.hh:47
BaseType::DomainFunctionType DomainFunctionType
Definition: preconditionedinverseoperator.hh:26