dune-fem 2.8.0
Loading...
Searching...
No Matches
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
9namespace 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
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