dune-fem 2.12-git
Loading...
Searching...
No Matches
krylovinverseoperators.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_SOLVER_INVERSEOPERATORS_HH
2#define DUNE_FEM_SOLVER_INVERSEOPERATORS_HH
3
8
11
16
18
19namespace Dune
20{
21
22 namespace Fem
23 {
24
25 // KrylovInverseOperator
26 // ---------------------
27
28 template< class DiscreteFunction, int method = -1 >
29 class KrylovInverseOperator;
30
31 template< class DiscreteFunction, int method >
44
45
46 template< class DiscreteFunction, int method >
48 : public InverseOperatorInterface< KrylovInverseOperatorTraits< DiscreteFunction, method > >
49 {
52
53 friend class InverseOperatorInterface< Traits >;
54 public:
60
61 using BaseType :: bind;
62 using BaseType :: unbind;
65
66 public:
72
73 KrylovInverseOperator ( const OperatorType &op, const PreconditionerType& preconditioner,
75 : KrylovInverseOperator( op, &preconditioner, parameter )
76 {}
77
83 method_( method < 0 ? parameter.solverMethod( supportedSolverMethods() ) : method ),
85 {
86 // assert( parameter_->errorMeasure() == 0 );
87 }
88
89 template <class Operator>
90 void bind ( const Operator &op )
91 {
93 {
95 }
96
97 if( precondObj_ )
99 else
100 BaseType::bind( op );
101 }
102
104 return std::vector< int > ({ SolverParameter::gmres, // default solver
105 SolverParameter::cg,
106 SolverParameter::bicgstab });
107 }
108
110 return std::vector< int > ({ SolverParameter::none,
111 SolverParameter::sor,
112 SolverParameter::ssor,
113 SolverParameter::gauss_seidel,
114 SolverParameter::jacobi } );
115 }
116
117 protected:
119 {
120 std::ostream* os = nullptr;
121 // only set output when general verbose mode is enabled
122 // (basically to avoid output on every rank)
123 if( verbose_ && Parameter :: verbose( Parameter::solverStatistics ) )
124 {
125 os = &std::cout;
126 if( method_ == SolverParameter::gmres )
127 std::cout << "Fem::GMRES";
128 else if ( method_ == SolverParameter::bicgstab )
129 std::cout << "Fem::BiCGstab";
130 else if ( method_ == SolverParameter::cg )
131 std::cout << "Fem::CG";
132
133 std::cout << " preconditioning=";
134 if ( precondMethod_ == SolverParameter::none && BaseType::preconditioner_ )
135 std::cout << "custom" << std::endl;
136 else
138 }
139
140 int numIter = 0;
141
142 if( method_ == SolverParameter::gmres )
143 {
144 if( v_.empty() )
145 {
146 const int extra = ( preconditioner_ ) ? 2 : 1 ;
147 v_.reserve( parameter_->gmresRestart()+extra );
148 for( int i=0; i<=parameter_->gmresRestart(); ++i )
149 {
150 v_.emplace_back( DiscreteFunction( "GMRes::v", u.space() ) );
151 }
152 if( preconditioner_ )
153 v_.emplace_back( DiscreteFunction( "GMRes::z", u.space() ) );
154 }
155
156 // if solver convergence failed numIter will be negative
158 v_, w, u, parameter_->gmresRestart(),
159 parameter_->tolerance(), parameter_->maxIterations(),
160 parameter_->errorMeasure(), os );
161 }
162 else if( method_ == SolverParameter::bicgstab )
163 {
164 if( v_.empty() )
165 {
166 v_.emplace_back( DomainFunctionType( "BiCGStab::r", u.space() ) );
167 v_.emplace_back( DomainFunctionType( "BiCGStab::r*", u.space() ) );
168 v_.emplace_back( DomainFunctionType( "BiCGStab::p", u.space() ) );
169 v_.emplace_back( DomainFunctionType( "BiCGStab::s", u.space() ) );
170 v_.emplace_back( DomainFunctionType( "BiCGStab::tmp", u.space() ) );
171 if( preconditioner_ )
172 v_.emplace_back( DomainFunctionType( "BiCGStab::z", u.space() ) );
173 }
174
175 // if solver convergence failed numIter will be negative
177 v_, w, u,
178 parameter_->tolerance(), parameter_->maxIterations(),
179 parameter_->errorMeasure(), os );
180 }
181 else if( method_ == SolverParameter::cg )
182 {
183 if( v_.empty() )
184 {
185 v_.emplace_back( DomainFunctionType( "CG::h", u.space() ) );
186 v_.emplace_back( DomainFunctionType( "CG::r", u.space() ) );
187 v_.emplace_back( DomainFunctionType( "CG::p", u.space() ) );
188
189 if( preconditioner_ )
190 {
191 v_.emplace_back( DomainFunctionType( "CG::s", u.space() ) );
192 v_.emplace_back( DomainFunctionType( "CG::q", u.space() ) );
193 }
194 }
195
196 // if solver convergence failed numIter will be negative
198 v_, w, u,
199 parameter_->tolerance(), parameter_->maxIterations(),
200 parameter_->errorMeasure(), os );
201 }
202 else
203 {
204 DUNE_THROW(InvalidStateException,"KrylovInverseOperator: invalid method " << method_ );
205 }
206
207 return numIter;
208 }
209
210 template <class LinearOperator>
212 const PreconditionerType *preconditioner,
215 {
216 if( preconditioner )
217 BaseType::bind( op, *preconditioner );
218 else
219 BaseType::bind( op );
220 }
221
222 protected:
223 template <class LinearOperator>
225 {
227 {
228 const int n = parameter_->preconditionerIteration();
229 const double w = parameter_->relaxation();
230
231 if( precondMethod_ == SolverParameter::jacobi )
232 {
233 // create diagonal preconditioner
235 }
236 else if( precondMethod_ == SolverParameter::gauss_seidel )
237 {
238 // create diagonal preconditioner
240 }
241 else if( precondMethod_ == SolverParameter::sor )
242 {
243 // create diagonal preconditioner
245 }
246 else if( precondMethod_ == SolverParameter::ssor )
247 {
248 // create diagonal preconditioner
250 }
251
252 // if preconditioner was created, set pointer
253 if( precondObj_ )
254 {
255 preconditioner_ = precondObj_.operator->();
256 }
257 }
258 }
259
260 using BaseType :: operator_;
261 using BaseType :: preconditioner_;
262
263 using BaseType :: parameter_;
264 using BaseType :: iterations_;
265
267
269
270 const bool verbose_;
271
272 const int method_;
273 const int precondMethod_;
274 };
275
276
277 // CgInverseOperator
278 // -----------------
279
280 template< class DiscreteFunction >
282
283
284 // BicgstabInverseOperator
285 // -----------------------
286
287 template< class DiscreteFunction >
289
290
291 // GmresInverseOperator
292 // --------------------
293
294 template< class DiscreteFunction >
296
297
298 // ParDGGeneralizedMinResInverseOperator
299 // -------------------------------------
300
301 template< class DiscreteFunction >
303
304 // ParDGBiCGStabInverseOperator
305 // ----------------------------
306
307 template< class DiscreteFunction >
309
310 template <class DiscreteFunctionType, class OpType >
312
313 template <class DiscreteFunctionType, class OpType >
315
316 template <class DiscreteFunctionType, class OpType >
318
319 template <class DiscreteFunctionType, class OpType >
321
322 template <class DiscreteFunctionType, class OpType >
324
325 } // namespace Fem
326
327} // namespace Dune
328
329#endif // DUNE_FEM_SOLVER_INVERSEOPERATORS_HH
#define DUNE_THROW(E,...)
int gmres(Operator &op, Preconditioner *preconditioner, std::vector< DiscreteFunction > &v, DiscreteFunction &u, const DiscreteFunction &b, const int m, const double tolerance, const int maxIterations, const int toleranceCriteria, std::ostream *os=nullptr)
Definition gmres.hh:117
int cg(Operator &op, Precoditioner *preconditioner, std::vector< DiscreteFunction > &tempMem, DiscreteFunction &x, const DiscreteFunction &b, const double epsilon, const int maxIterations, const int toleranceCriteria, std::ostream *os=nullptr)
Definition cg.hh:19
int bicgstab(Operator &op, Precoditioner *preconditioner, std::vector< DiscreteFunction > &tempMem, DiscreteFunction &x, const DiscreteFunction &b, const double tolerance, const int maxIterations, const int toleranceCriteria, std::ostream *os=nullptr)
Definition bicgstab.hh:64
static ParameterContainer & container()
Definition io/parameter.hh:199
static const int solverStatistics
Definition io/parameter.hh:193
abstract affine-linear operator
Definition operator.hh:90
abstract matrix operator
Definition operator.hh:133
Precondtioner, implementing Jacobi, Gauss-Seidel and SOR works with.
Definition fempreconditioning.hh:179
Definition inverseoperatorinterface.hh:37
virtual void setMaxIterations(const int iter)
Definition inverseoperatorinterface.hh:144
const PreconditionerType * preconditioner_
Definition inverseoperatorinterface.hh:230
SolverParameterType & parameter() const
Definition inverseoperatorinterface.hh:158
const OperatorType * operator_
Definition inverseoperatorinterface.hh:228
virtual void setMaxLinearIterations(const int iter)
set number of max linear iterations to be used before an exception is thrown
Definition inverseoperatorinterface.hh:139
void unbind()
reset all pointers and internal temporary memory
Definition inverseoperatorinterface.hh:128
Traits::AssembledOperatorType AssembledOperatorType
Definition inverseoperatorinterface.hh:51
std::shared_ptr< SolverParameterType > parameter_
Definition inverseoperatorinterface.hh:226
Traits::PreconditionerType PreconditionerType
Definition inverseoperatorinterface.hh:52
BaseType::DomainFunctionType DomainFunctionType
Definition inverseoperatorinterface.hh:46
void bind(const OperatorType &op)
store pointer to linear operator
Definition inverseoperatorinterface.hh:109
Traits::OperatorType OperatorType
Definition inverseoperatorinterface.hh:50
BaseType::RangeFunctionType RangeFunctionType
Definition inverseoperatorinterface.hh:47
Definition krylovinverseoperators.hh:49
int apply(const DomainFunctionType &u, RangeFunctionType &w) const
Definition krylovinverseoperators.hh:118
BaseType::AssembledOperatorType AssembledOperatorType
Definition krylovinverseoperators.hh:59
BaseType::RangeFunctionType RangeFunctionType
Definition krylovinverseoperators.hh:56
void bind(const Operator &op)
Definition krylovinverseoperators.hh:90
BaseType::DomainFunctionType DomainFunctionType
Definition krylovinverseoperators.hh:55
BaseType::PreconditionerType PreconditionerType
Definition krylovinverseoperators.hh:58
BaseType::OperatorType OperatorType
Definition krylovinverseoperators.hh:57
const int method_
Definition krylovinverseoperators.hh:272
void createPreconditioner(const LinearOperator &op)
Definition krylovinverseoperators.hh:224
KrylovInverseOperator(const SolverParameter &parameter=SolverParameter(Parameter::container()))
main constructor
Definition krylovinverseoperators.hh:79
KrylovInverseOperator(const LinearOperator &op, const PreconditionerType *preconditioner, const SolverParameter &parameter=SolverParameter(Parameter::container()))
Definition krylovinverseoperators.hh:211
std::unique_ptr< PreconditionerType > precondObj_
Definition krylovinverseoperators.hh:266
KrylovInverseOperator(const OperatorType &op, const SolverParameter &parameter=SolverParameter(Parameter::container()))
Definition krylovinverseoperators.hh:67
std::vector< DomainFunctionType > v_
Definition krylovinverseoperators.hh:268
const bool verbose_
Definition krylovinverseoperators.hh:270
KrylovInverseOperator(const OperatorType &op, const PreconditionerType &preconditioner, const SolverParameter &parameter=SolverParameter(Parameter::container()))
Definition krylovinverseoperators.hh:73
static std::vector< int > supportedPreconditionMethods()
Definition krylovinverseoperators.hh:109
const int precondMethod_
Definition krylovinverseoperators.hh:273
static std::vector< int > supportedSolverMethods()
Definition krylovinverseoperators.hh:103
Definition krylovinverseoperators.hh:33
KrylovInverseOperator< DiscreteFunction, method > InverseOperatorType
Definition krylovinverseoperators.hh:41
DiscreteFunction DiscreteFunctionType
Definition krylovinverseoperators.hh:34
OperatorType PreconditionerType
Definition krylovinverseoperators.hh:36
SolverParameter SolverParameterType
Definition krylovinverseoperators.hh:42
OperatorType AssembledOperatorType
Definition krylovinverseoperators.hh:38
Operator< DiscreteFunction, DiscreteFunction > OperatorType
Definition krylovinverseoperators.hh:35
DiscreteFunction SolverDiscreteFunctionType
Definition krylovinverseoperators.hh:39
Definition solver/parameter.hh:25
static const std::string preconditionMethodTable(int id)
Definition solver/parameter.hh:66
T emplace_back(T... args)
T empty(T... args)
T endl(T... args)
T reserve(T... args)
T reset(T... args)