1 #ifndef DUNE_FEM_CGINVERSEOPERATOR_HH 2 #define DUNE_FEM_CGINVERSEOPERATOR_HH 4 #include <dune/common/typetraits.hh> 27 template<
class Operator>
40 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
52 static_assert( (Conversion< DomainFunctionType, RangeFunctionType >::sameType),
53 "DomainFunctionType must equal RangeFunctionType." );
63 unsigned int maxIterations,
80 unsigned int maxIterations,
84 verbose_( parameter.getValue< bool >(
"fem.solver.verbose", false ) ),
102 void solve (
const OperatorType &op,
const RangeFunctionType &b, DomainFunctionType &x )
const;
116 void solve (
const OperatorType &op,
const PreconditionerType &p,
117 const RangeFunctionType &b, DomainFunctionType &x )
const;
150 template<
class DiscreteFunction >
164 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
179 RealType redEps, RealType absLimit,
180 unsigned int maxIter,
bool verbose,
183 preconditioner_ ( 0 ),
184 solver_( absLimit, maxIter, verbose, parameter ),
185 parameter_( parameter )
197 RealType redEps, RealType absLimit,
198 unsigned int maxIter,
201 preconditioner_ ( 0 ),
202 solver_( absLimit, maxIter, parameter ),
203 parameter_( parameter )
207 RealType redEps, RealType absLimit,
210 preconditioner_ ( 0 ),
211 solver_( absLimit,
std::numeric_limits< unsigned int >::
max(), parameter ),
212 parameter_( parameter )
224 const PreconditionerType &precond,
225 RealType redEps, RealType absLimit,
228 preconditioner_( &precond ),
229 solver_( absLimit,
std::numeric_limits< unsigned int >::
max(), parameter ),
230 parameter_( parameter )
234 const PreconditionerType &precond,
235 RealType redEps, RealType absLimit,
236 unsigned int maxIter,
239 preconditioner_( &precond ),
240 solver_( absLimit, maxIter, parameter ),
241 parameter_( parameter )
252 virtual void operator()(
const DomainFunctionType &arg, RangeFunctionType &dest )
const 259 template<
typename... A>
274 virtual void apply(
const DomainFunctionType &arg, RangeFunctionType &dest )
const 277 solver_.solve( operator_, *preconditioner_, arg, dest );
279 solver_.solve(operator_,arg,dest);
285 return solver_.iterations();
291 return solver_.averageCommTime();
312 template<
class DiscreteFunction,
329 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
342 template <
class LinearOperator>
344 RealType redEps, RealType absLimit,
345 unsigned int maxIter,
bool verbose,
347 : BaseType( op, redEps, absLimit, maxIter, verbose, parameter ),
350 checkPreconditioning( op );
360 template <
class LinearOperator>
362 RealType redEps, RealType absLimit,
363 unsigned int maxIter,
365 : BaseType( op, redEps, absLimit, maxIter, parameter ),
368 checkPreconditioning( op );
371 template <
class LinearOperator>
373 RealType redEps, RealType absLimit,
375 : BaseType( op, redEps, absLimit,
std::numeric_limits< unsigned int >::
max(), parameter ),
378 checkPreconditioning( op );
390 const PreconditioningType &precond,
391 RealType redEps, RealType absLimit,
392 unsigned int maxIter,
394 : BaseType( op, precond, redEps, absLimit, maxIter, parameter ),
399 const PreconditioningType &precond,
400 RealType redEps, RealType absLimit,
402 : BaseType( op, precond, redEps, absLimit,
std::numeric_limits< unsigned int >::
max(), parameter ),
414 template<
class LinearOperator >
417 const bool preconditioning = parameter_.template getValue< bool >(
"fem.preconditioning", false );
422 preconditioner_ = precondObj_;
426 using BaseType::preconditioner_;
427 using BaseType::parameter_;
434 template<
class Operator >
436 ::solve (
const OperatorType &op,
const RangeFunctionType &b, DomainFunctionType &x )
const 438 const bool verbose = (
verbose_ && (b.space().gridPart().comm().rank() == 0));
444 RangeFunctionType h( b );
447 RangeFunctionType r( h );
450 RangeFunctionType p( b );
453 RealType prevResiduum = 0;
454 RealType residuum = r.normSquaredDofs( );
460 assert( residuum/prevResiduum == residuum/prevResiduum );
461 p *= (residuum / prevResiduum);
467 RangeFieldType pdoth = p.scalarProductDofs( h );
468 const RangeFieldType alpha = residuum / pdoth;
469 assert( alpha == alpha );
473 prevResiduum = residuum;
474 residuum = r.normSquaredDofs( );
476 double exchangeTime = h.space().communicator().exchangeTime();
479 std::cerr <<
"CG-Iteration: " <<
realCount_ <<
", sqr(Residuum): " << residuum << std::endl;
481 if( b.space().gridPart().comm().size() > 1 )
482 std::cerr <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
490 template<
class Operator >
492 ::solve (
const OperatorType &op,
const PreconditionerType &precond,
const RangeFunctionType &b, DomainFunctionType &x )
const 494 const bool verbose = (
verbose_ && (b.space().gridPart().comm().rank() == 0));
500 RangeFunctionType h( b );
505 RangeFunctionType r( h );
509 RangeFunctionType p( b );
513 RangeFunctionType q ( b );
516 RangeFunctionType s (q);
518 RangeFieldType prevResiduum = 0;
519 RangeFieldType residuum = p.scalarProductDofs( q );
525 assert( residuum/prevResiduum == residuum/prevResiduum );
526 const RangeFieldType beta=residuum/prevResiduum;
533 RangeFieldType qdoth = q.scalarProductDofs( h );
534 const RangeFieldType alpha = residuum / qdoth;
535 assert( alpha == alpha );
542 prevResiduum = residuum;
544 residuum = p.scalarProductDofs( s );
546 double exchangeTime = h.space().communicator().exchangeTime();
549 std::cerr <<
"CG-Iteration: " <<
realCount_ <<
", Residuum: " << residuum << std::endl;
551 if( b.space().gridPart().comm().size() > 1 )
552 std::cerr <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
563 #endif // #ifndef DUNE_FEM_CGINVERSEOPERATOR_HH RangeFunction RangeFunctionType
type of discrete function in the operator's range
Definition: operator.hh:30
Inverse operator base on CG method. This is the base class for the cg solver and does not imvolve any...
Definition: cginverseoperator.hh:151
const PreconditionerType * preconditioner_
Definition: cginverseoperator.hh:296
ConjugateGradientSolver(RealType epsilon, unsigned int maxIterations, const ParameterReader ¶meter=Parameter::container())
constructor
Definition: cginverseoperator.hh:79
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:372
CGInverseOperator(const OperatorType &op, const PreconditioningType &precond, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:389
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:329
unsigned int iterations() const
number of iterations needed for last solve
Definition: cginverseoperator.hh:120
void solve(const OperatorType &op, const RangeFunctionType &b, DomainFunctionType &x) const
solve
Definition: cginverseoperator.hh:436
OperatorType::RangeFieldType RangeFieldType
Definition: cginverseoperator.hh:328
linear solver using the CG algorithm
Definition: cginverseoperator.hh:28
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:206
double averageCommTime_
Definition: cginverseoperator.hh:135
Fem::Operator< RangeFunctionType, DomainFunctionType > PreconditioningType
Definition: cginverseoperator.hh:332
unsigned int iterations() const
number of iterations needed for last solve
Definition: cginverseoperator.hh:283
ParameterReader parameter_
Definition: cginverseoperator.hh:298
static double max(const Double &v, const double p)
Definition: double.hh:387
virtual void apply(const DomainFunctionType &arg, RangeFunctionType &dest) const
application operator
Definition: cginverseoperator.hh:274
void prepare(A...) const
Definition: cginverseoperator.hh:260
void checkPreconditioning(const LinearOperator &linearOp)
Definition: cginverseoperator.hh:415
double averageCommTime() const
return average communication time during last solve
Definition: cginverseoperator.hh:289
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:233
BaseType::DomainFunctionType DomainFunctionType
Definition: cginverseoperator.hh:320
Fem::Operator< RangeFunctionType, DomainFunctionType > PreconditionerType
type of the preconditioner, maps from the range of the operator (the dual space) in it's domain ...
Definition: cginverseoperator.hh:48
unsigned int realCount_
Definition: cginverseoperator.hh:136
abstract operator
Definition: operator.hh:25
const RealType epsilon_
Definition: cginverseoperator.hh:132
double averageCommTime() const
return average communication time during last solve
Definition: cginverseoperator.hh:126
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:178
Op OperatorType
type of operator
Definition: cginverseoperator.hh:326
OperatorType::DomainFieldType DomainFieldType
field type of the operator's domain vectors
Definition: cginverseoperator.hh:37
BaseType::DomainFunctionType DomainFunctionType
Definition: cginverseoperator.hh:157
Definition: coordinate.hh:4
~CGInverseOperator()
destructor
Definition: cginverseoperator.hh:407
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:164
Fem::Operator< DomainFunctionType, RangeFunctionType > OperatorType
Definition: cginverseoperator.hh:160
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:223
static ParameterContainer & container()
Definition: io/parameter.hh:190
virtual void operator()(const DomainFunctionType &arg, RangeFunctionType &dest) const
application operator
Definition: cginverseoperator.hh:252
Fem::Operator< RangeFunctionType, DomainFunctionType > PreconditionerType
Definition: cginverseoperator.hh:161
DomainFunction::RangeFieldType DomainFieldType
field type of the operator's domain
Definition: operator.hh:33
const unsigned int maxIterations_
Definition: cginverseoperator.hh:133
RangeFunction::RangeFieldType RangeFieldType
field type of the operator's range
Definition: operator.hh:35
abstract affine-linear operator
Definition: operator.hh:70
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:361
Inverse operator base on CG method. Uses a runtime parameter fem.preconditioning which enables diagon...
Definition: cginverseoperator.hh:314
double real(const std::complex< Double > &x)
Definition: double.hh:890
OperatorType::RangeFieldType RangeFieldType
field type of the operator's range vectors
Definition: cginverseoperator.hh:39
BaseType::RangeFunctionType RangeFunctionType
Definition: cginverseoperator.hh:158
CGInverseOperator(const OperatorType &op, const PreconditioningType &precond, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:398
OperatorType::RangeFieldType RangeFieldType
Definition: cginverseoperator.hh:163
abstract matrix operator
Definition: operator.hh:106
DomainFunctionType DestinationType
Definition: cginverseoperator.hh:323
Operator OperatorType
type of the operators to invert
Definition: cginverseoperator.hh:34
BaseType::RangeFunctionType RangeFunctionType
Definition: cginverseoperator.hh:321
OperatorType::RangeFunctionType RangeFunctionType
type of the operator's range vectors
Definition: cginverseoperator.hh:45
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:40
Precondtioner, multiplies with inverse of the diagonal works with.
Definition: diagonalpreconditioner.hh:148
PreconditioningType * precondObj_
Definition: cginverseoperator.hh:428
void finalize() const
Definition: cginverseoperator.hh:263
OperatorType::DomainFunctionType DomainFunctionType
type of the operator's domain vectors
Definition: cginverseoperator.hh:43
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:343
SolverType solver_
Definition: cginverseoperator.hh:297
ConjugateGradientSolver(const RealType &epsilon, unsigned int maxIterations, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor
Definition: cginverseoperator.hh:62
const OperatorType & operator_
Definition: cginverseoperator.hh:295
DomainFunction DomainFunctionType
type of discrete function in the operator's domain
Definition: operator.hh:28
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:196
const bool verbose_
Definition: cginverseoperator.hh:134