1 #ifndef DUNE_FEM_CGINVERSEOPERATOR_HH
2 #define DUNE_FEM_CGINVERSEOPERATOR_HH
28 template<
class Operator>
41 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
53 static_assert( (std::is_same< DomainFunctionType, RangeFunctionType >::value),
54 "DomainFunctionType must equal RangeFunctionType." );
64 unsigned int maxIterations,
81 unsigned int maxIterations,
85 verbose_( parameter.getValue< bool >(
"fem.solver.verbose", false ) ),
154 template<
class DiscreteFunction >
168 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
182 unsigned int maxIter,
bool verbose,
184 :
solver_( absLimit, maxIter, verbose, parameter ),
196 unsigned int maxIter,
198 :
solver_( absLimit, maxIter, parameter ),
217 unsigned int maxIter,
bool verbose,
234 unsigned int maxIter,
261 unsigned int maxIter,
bool verbose,
288 unsigned int maxIter,
318 template<
typename... A>
374 template<
class DiscreteFunction,
391 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
404 unsigned int maxIter,
bool verbose,
406 :
BaseType( redEps, absLimit, maxIter, verbose, parameter )
416 unsigned int maxIter,
418 :
BaseType( redEps, absLimit, maxIter, parameter )
423 :
BaseType( redEps, absLimit, parameter )
434 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
437 unsigned int maxIter,
bool verbose,
439 :
BaseType( redEps, absLimit, maxIter, verbose, parameter )
451 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
454 unsigned int maxIter,
456 :
BaseType( redEps, absLimit, maxIter, parameter )
461 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
465 :
BaseType( redEps, absLimit, parameter )
481 unsigned int maxIter,
bool verbose,
483 :
BaseType( op, precond, redEps, absLimit, maxIter, verbose, parameter )
497 unsigned int maxIter,
499 :
BaseType( op, precond, redEps, absLimit, maxIter, parameter )
506 :
BaseType( op, precond, redEps, absLimit, parameter )
511 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
524 template<
class LinearOperator >
527 const bool preconditioning =
parameter_.template getValue< bool >(
"fem.preconditioning",
false );
544 template<
class Operator >
548 const bool verbose = (verbose_ && (b.space().gridPart().comm().rank() == 0));
550 const RealType tolerance = (epsilon_ * epsilon_) * b.normSquaredDofs( );
552 averageCommTime_ = 0.0;
564 RealType residuum = r.normSquaredDofs( );
566 for( realCount_ = 0; (residuum > tolerance) && (realCount_ < maxIterations_); ++realCount_ )
570 assert( residuum/prevResiduum == residuum/prevResiduum );
571 p *= (residuum / prevResiduum);
579 assert( alpha == alpha );
583 prevResiduum = residuum;
584 residuum = r.normSquaredDofs( );
586 double exchangeTime = h.space().communicator().exchangeTime();
589 std::cerr <<
"CG-Iteration: " << realCount_ <<
", sqr(Residuum): " << residuum << std::endl;
591 if( b.space().gridPart().comm().size() > 1 )
592 std::cerr <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
595 averageCommTime_ += exchangeTime;
600 template<
class Operator >
604 const bool verbose = (verbose_ && (b.space().gridPart().comm().rank() == 0));
606 const RealType tolerance = (epsilon_ * epsilon_) * b.normSquaredDofs( );
608 averageCommTime_ = 0.0;
631 for( realCount_ = 0; (
std::real(residuum) > tolerance) && (realCount_ < maxIterations_); ++realCount_ )
635 assert( residuum/prevResiduum == residuum/prevResiduum );
645 assert( alpha == alpha );
652 prevResiduum = residuum;
654 residuum = p.scalarProductDofs( s );
656 double exchangeTime = h.space().communicator().exchangeTime();
659 std::cerr <<
"CG-Iteration: " << realCount_ <<
", Residuum: " << residuum << std::endl;
661 if( b.space().gridPart().comm().size() > 1 )
662 std::cerr <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
665 averageCommTime_ += exchangeTime;
Definition: bindguard.hh:11
double real(const std::complex< Double > &x)
Definition: double.hh:907
static double max(const Double &v, const double p)
Definition: double.hh:399
static DUNE_EXPORT ParameterContainer & container()
Definition: io/parameter.hh:192
abstract operator
Definition: operator.hh:26
DomainFunction DomainFunctionType
type of discrete function in the operator's domain
Definition: operator.hh:28
RangeFunction::RangeFieldType RangeFieldType
field type of the operator's range
Definition: operator.hh:35
DomainFunction::RangeFieldType DomainFieldType
field type of the operator's domain
Definition: operator.hh:33
RangeFunction RangeFunctionType
type of discrete function in the operator's range
Definition: operator.hh:30
abstract affine-linear operator
Definition: operator.hh:73
abstract matrix operator
Definition: operator.hh:110
linear solver using the CG algorithm
Definition: cginverseoperator.hh:30
ConjugateGradientSolver(const RealType &epsilon, unsigned int maxIterations, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor
Definition: cginverseoperator.hh:63
OperatorType::RangeFunctionType RangeFunctionType
type of the operator's range vectors
Definition: cginverseoperator.hh:46
ConjugateGradientSolver(RealType epsilon, unsigned int maxIterations, const ParameterReader ¶meter=Parameter::container())
constructor
Definition: cginverseoperator.hh:80
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:41
unsigned int iterations() const
number of iterations needed for last solve
Definition: cginverseoperator.hh:121
void solve(const OperatorType &op, const RangeFunctionType &b, DomainFunctionType &x) const
solve
Definition: cginverseoperator.hh:546
double averageCommTime() const
return average communication time during last solve
Definition: cginverseoperator.hh:130
void setMaxIterations(unsigned int maxIterations)
Definition: cginverseoperator.hh:126
void solve(const OperatorType &op, const PreconditionerType &p, const RangeFunctionType &b, DomainFunctionType &x) const
solve
Definition: cginverseoperator.hh:602
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:49
const bool verbose_
Definition: cginverseoperator.hh:138
OperatorType::RangeFieldType RangeFieldType
field type of the operator's range vectors
Definition: cginverseoperator.hh:40
OperatorType::DomainFieldType DomainFieldType
field type of the operator's domain vectors
Definition: cginverseoperator.hh:38
double averageCommTime_
Definition: cginverseoperator.hh:139
OperatorType::DomainFunctionType DomainFunctionType
type of the operator's domain vectors
Definition: cginverseoperator.hh:44
const RealType epsilon_
Definition: cginverseoperator.hh:136
Operator OperatorType
type of the operators to invert
Definition: cginverseoperator.hh:35
unsigned int realCount_
Definition: cginverseoperator.hh:140
unsigned int maxIterations_
Definition: cginverseoperator.hh:137
Inverse operator base on CG method. This is the base class for the cg solver and does not imvolve any...
Definition: cginverseoperator.hh:157
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:232
const PreconditionerType * preconditioner_
Definition: cginverseoperator.hh:358
void prepare(A...) const
Definition: cginverseoperator.hh:319
void unbind()
Definition: cginverseoperator.hh:301
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:181
virtual void operator()(const DomainFunctionType &arg, RangeFunctionType &dest) const
application operator
Definition: cginverseoperator.hh:311
const OperatorType * operator_
Definition: cginverseoperator.hh:357
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:276
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:241
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:195
Fem::Operator< DomainFunctionType, RangeFunctionType > OperatorType
Definition: cginverseoperator.hh:164
unsigned int iterations() const
number of iterations needed for last solve
Definition: cginverseoperator.hh:343
virtual void apply(const DomainFunctionType &arg, RangeFunctionType &dest) const
application operator
Definition: cginverseoperator.hh:333
void bind(const OperatorType &op, const PreconditionerType &precond)
Definition: cginverseoperator.hh:296
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:285
CGInverseOperator(RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:202
OperatorType::RangeFieldType RangeFieldType
Definition: cginverseoperator.hh:167
ParameterReader parameter_
Definition: cginverseoperator.hh:360
BaseType::DomainFunctionType DomainFunctionType
Definition: cginverseoperator.hh:161
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:258
double averageCommTime() const
return average communication time during last solve
Definition: cginverseoperator.hh:351
Fem::Operator< RangeFunctionType, DomainFunctionType > PreconditionerType
Definition: cginverseoperator.hh:165
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:168
BaseType::RangeFunctionType RangeFunctionType
Definition: cginverseoperator.hh:162
SolverType solver_
Definition: cginverseoperator.hh:359
void setMaxIterations(unsigned int maxIter)
Definition: cginverseoperator.hh:348
void bind(const OperatorType &op)
Definition: cginverseoperator.hh:295
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:215
void finalize() const
Definition: cginverseoperator.hh:322
Inverse operator base on CG method. Uses a runtime parameter fem.preconditioning which enables diagon...
Definition: cginverseoperator.hh:378
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:403
CGInverseOperator(const OperatorType &op, const PreconditioningType &precond, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:502
Op OperatorType
type of operator
Definition: cginverseoperator.hh:388
CGInverseOperator(RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:421
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:452
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:391
void bind(const LinearOperator &op)
Definition: cginverseoperator.hh:512
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:415
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:462
OperatorType::RangeFieldType RangeFieldType
Definition: cginverseoperator.hh:390
CGInverseOperator(const OperatorType &op, const PreconditioningType &precond, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:478
Fem::Operator< RangeFunctionType, DomainFunctionType > PreconditioningType
Definition: cginverseoperator.hh:394
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:435
BaseType::RangeFunctionType RangeFunctionType
Definition: cginverseoperator.hh:383
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:494
DomainFunctionType DestinationType
Definition: cginverseoperator.hh:385
void checkPreconditioning(const LinearOperator &linearOp)
Definition: cginverseoperator.hh:525
BaseType::DomainFunctionType DomainFunctionType
Definition: cginverseoperator.hh:382
std::unique_ptr< PreconditioningType > precondObj_
Definition: cginverseoperator.hh:538
void unbind()
Definition: cginverseoperator.hh:517
Precondtioner, multiplies with inverse of the diagonal works with.
Definition: diagonalpreconditioner.hh:152