1#ifndef DUNE_FEM_CGINVERSEOPERATOR_HH
2#define DUNE_FEM_CGINVERSEOPERATOR_HH
29 template<
class Operator>
42 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
54 static_assert( (std::is_same< DomainFunctionType, RangeFunctionType >::value),
55 "DomainFunctionType must equal RangeFunctionType." );
66 unsigned int maxIterations,
77 unsigned int maxIterations,
94 unsigned int maxIterations,
99 verbose_( parameter.getValue< bool >(
"fem.solver.verbose", false ) ),
169 template<
class DiscreteFunction >
184 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
201 unsigned int maxIter,
bool verbose,
203 :
solver_( absLimit, maxIter, verbose, parameter ),
209 param.maxIterations(),
210 param.errorMeasure(),
224 unsigned int maxIter,
226 :
solver_( absLimit, maxIter, parameter ),
245 unsigned int maxIter,
bool verbose,
262 unsigned int maxIter,
289 unsigned int maxIter,
bool verbose,
316 unsigned int maxIter,
346 template<
typename... A>
399 template<
class DiscreteFunction,
417 typedef typename Dune::FieldTraits< RangeFieldType >::real_type
RealType;
435 unsigned int maxIter,
bool verbose,
437 :
BaseType( redEps, absLimit, maxIter, verbose, parameter )
447 unsigned int maxIter,
449 :
BaseType( redEps, absLimit, maxIter, parameter )
454 :
BaseType( redEps, absLimit, parameter )
465 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
468 unsigned int maxIter,
bool verbose,
470 :
BaseType( redEps, absLimit, maxIter, verbose, parameter )
482 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
485 unsigned int maxIter,
487 :
BaseType( redEps, absLimit, maxIter, parameter )
492 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
496 :
BaseType( redEps, absLimit, parameter )
512 unsigned int maxIter,
bool verbose,
514 :
BaseType( op, precond, redEps, absLimit, maxIter, verbose, parameter )
528 unsigned int maxIter,
530 :
BaseType( op, precond, redEps, absLimit, maxIter, parameter )
537 :
BaseType( op, precond, redEps, absLimit, parameter )
542 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
555 template<
class LinearOperator >
558 bool preconditioning =
false;
562 preconditioning =
parameter_.
parameter().template getValue< bool >(
"fem.preconditioning",
false );
563 std::cout <<
"WARNING: using deprecated parameter `fem.preconditioning` use "
588 template<
class Operator >
593 RealType tolerance = (epsilon_ * epsilon_);
594 if (errorMeasure_ == 1)
595 tolerance *= b.normSquaredDofs( );
597 averageCommTime_ = 0.0;
609 RealType residuum = r.normSquaredDofs( );
611 for( realCount_ = 0; (residuum > tolerance) && (realCount_ < maxIterations_); ++realCount_ )
615 assert( residuum/prevResiduum == residuum/prevResiduum );
616 p *= (residuum / prevResiduum);
624 assert( alpha == alpha );
628 prevResiduum = residuum;
629 residuum = r.normSquaredDofs( );
631 double exchangeTime = h.space().communicator().exchangeTime();
634 std::cout <<
"CG-Iteration: " << realCount_ <<
", Residuum: " <<
std::sqrt(residuum)
635 <<
", Tolerance: " <<
std::sqrt(tolerance) << std::endl;
637 if( b.space().gridPart().comm().size() > 1 )
638 std::cout <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
641 averageCommTime_ += exchangeTime;
646 template<
class Operator >
650 RealType tolerance = (epsilon_ * epsilon_);
651 if (errorMeasure_ == 1)
652 tolerance *= b.normSquaredDofs( );
654 averageCommTime_ = 0.0;
677 for( realCount_ = 0; (
std::real(residuum) > tolerance) && (realCount_ < maxIterations_); ++realCount_ )
681 assert( residuum/prevResiduum == residuum/prevResiduum );
691 assert( alpha == alpha );
698 prevResiduum = residuum;
700 residuum = p.scalarProductDofs( s );
702 double exchangeTime = h.space().communicator().exchangeTime();
705 std::cout <<
"CG-Iteration: " << realCount_ <<
", Residuum: " <<
std::sqrt(residuum)
706 <<
", Tolerance: " <<
std::sqrt(tolerance) << std::endl;
708 if( b.space().gridPart().comm().size() > 1 )
709 std::cout <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
712 averageCommTime_ += exchangeTime;
double sqrt(const Dune::Fem::Double &v)
Definition: double.hh:977
double real(const complex< Dune::Fem::Double > &x)
Definition: double.hh:983
Definition: bindguard.hh:11
static double max(const Double &v, const double p)
Definition: double.hh:398
Container for User Specified Parameters.
Definition: io/parameter.hh:191
static ParameterContainer & container()
Definition: io/parameter.hh:193
bool exists(const std::string &key) const
check, whether a parameter is defined
Definition: reader.hh:44
abstract operator
Definition: operator.hh:34
virtual void finalize()
finalization of operator
Definition: operator.hh:61
DomainFunction DomainFunctionType
type of discrete function in the operator's domain
Definition: operator.hh:36
RangeFunction::RangeFieldType RangeFieldType
field type of the operator's range
Definition: operator.hh:43
DomainFunction::RangeFieldType DomainFieldType
field type of the operator's domain
Definition: operator.hh:41
RangeFunction RangeFunctionType
type of discrete function in the operator's range
Definition: operator.hh:38
abstract affine-linear operator
Definition: operator.hh:87
abstract matrix operator
Definition: operator.hh:124
linear solver using the CG algorithm
Definition: cginverseoperator.hh:31
ConjugateGradientSolver(const RealType &epsilon, unsigned int maxIterations, bool verbose, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:76
OperatorType::RangeFunctionType RangeFunctionType
type of the operator's range vectors
Definition: cginverseoperator.hh:47
ConjugateGradientSolver(RealType epsilon, unsigned int maxIterations, const ParameterReader ¶meter=Parameter::container())
constructor
Definition: cginverseoperator.hh:93
unsigned int iterations() const
number of iterations needed for last solve
Definition: cginverseoperator.hh:135
void solve(const OperatorType &op, const RangeFunctionType &b, DomainFunctionType &x) const
solve
Definition: cginverseoperator.hh:590
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:42
double averageCommTime() const
return average communication time during last solve
Definition: cginverseoperator.hh:144
void setMaxIterations(unsigned int maxIterations)
Definition: cginverseoperator.hh:140
void solve(const OperatorType &op, const PreconditionerType &p, const RangeFunctionType &b, DomainFunctionType &x) const
solve
Definition: cginverseoperator.hh:648
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:50
const bool verbose_
Definition: cginverseoperator.hh:153
OperatorType::RangeFieldType RangeFieldType
field type of the operator's range vectors
Definition: cginverseoperator.hh:41
OperatorType::DomainFieldType DomainFieldType
field type of the operator's domain vectors
Definition: cginverseoperator.hh:39
double averageCommTime_
Definition: cginverseoperator.hh:154
OperatorType::DomainFunctionType DomainFunctionType
type of the operator's domain vectors
Definition: cginverseoperator.hh:45
const RealType epsilon_
Definition: cginverseoperator.hh:150
Operator OperatorType
type of the operators to invert
Definition: cginverseoperator.hh:36
ConjugateGradientSolver(const RealType &epsilon, unsigned int maxIterations, int errorMeasure, bool verbose)
constructor
Definition: cginverseoperator.hh:65
unsigned int realCount_
Definition: cginverseoperator.hh:155
int errorMeasure_
Definition: cginverseoperator.hh:152
unsigned int maxIterations_
Definition: cginverseoperator.hh:151
Inverse operator base on CG method. This is the base class for the cg solver and does not imvolve any...
Definition: cginverseoperator.hh:172
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:260
const PreconditionerType * preconditioner_
Definition: cginverseoperator.hh:383
void prepare(A...) const
Definition: cginverseoperator.hh:347
void unbind()
Definition: cginverseoperator.hh:329
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:200
virtual void operator()(const DomainFunctionType &arg, RangeFunctionType &dest) const
application operator
Definition: cginverseoperator.hh:339
const OperatorType * operator_
Definition: cginverseoperator.hh:382
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:304
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:184
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:269
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:223
Fem::Operator< DomainFunctionType, RangeFunctionType > OperatorType
Definition: cginverseoperator.hh:180
unsigned int iterations() const
number of iterations needed for last solve
Definition: cginverseoperator.hh:368
SolverParameter parameter_
Definition: cginverseoperator.hh:385
virtual void apply(const DomainFunctionType &arg, RangeFunctionType &dest) const
application operator
Definition: cginverseoperator.hh:358
void bind(const OperatorType &op, const PreconditionerType &precond)
Definition: cginverseoperator.hh:324
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:313
CGInverseOperator(RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:230
OperatorType::RangeFieldType RangeFieldType
Definition: cginverseoperator.hh:183
BaseType::DomainFunctionType DomainFunctionType
Definition: cginverseoperator.hh:177
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:286
double averageCommTime() const
return average communication time during last solve
Definition: cginverseoperator.hh:376
Fem::Operator< RangeFunctionType, DomainFunctionType > PreconditionerType
Definition: cginverseoperator.hh:181
BaseType::RangeFunctionType RangeFunctionType
Definition: cginverseoperator.hh:178
CGInverseOperator(const SolverParameter ¶m=SolverParameter(Parameter::container()))
Definition: cginverseoperator.hh:207
SolverType solver_
Definition: cginverseoperator.hh:384
void setMaxIterations(unsigned int maxIter)
Definition: cginverseoperator.hh:373
void bind(const OperatorType &op)
Definition: cginverseoperator.hh:323
CGInverseOperator(const OperatorType &op, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:243
Inverse operator base on CG method. Uses a runtime parameter fem.preconditioning which enables diagon...
Definition: cginverseoperator.hh:403
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:434
const PreconditionerType * preconditioner_
Definition: cginverseoperator.hh:383
CGInverseOperator(const OperatorType &op, const PreconditioningType &precond, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:533
Op OperatorType
type of operator
Definition: cginverseoperator.hh:414
CGInverseOperator(RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:452
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:483
SolverParameter SolverParameterType
Definition: cginverseoperator.hh:407
void bind(const LinearOperator &op)
Definition: cginverseoperator.hh:543
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:446
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
Definition: cginverseoperator.hh:493
SolverParameter parameter_
Definition: cginverseoperator.hh:385
Dune::FieldTraits< RangeFieldType >::real_type RealType
Definition: cginverseoperator.hh:417
OperatorType::RangeFieldType RangeFieldType
Definition: cginverseoperator.hh:416
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:509
Fem::Operator< RangeFunctionType, DomainFunctionType > PreconditioningType
Definition: cginverseoperator.hh:420
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:466
CGInverseOperator(const SolverParameter ¶m=SolverParameter(Parameter::container()))
Definition: cginverseoperator.hh:422
BaseType::RangeFunctionType RangeFunctionType
Definition: cginverseoperator.hh:409
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:525
DomainFunctionType DestinationType
Definition: cginverseoperator.hh:411
void checkPreconditioning(const LinearOperator &linearOp)
Definition: cginverseoperator.hh:556
BaseType::DomainFunctionType DomainFunctionType
Definition: cginverseoperator.hh:408
std::unique_ptr< PreconditioningType > precondObj_
Definition: cginverseoperator.hh:582
void unbind()
Definition: cginverseoperator.hh:548
Precondtioner, multiplies with inverse of the diagonal works with.
Definition: diagonalpreconditioner.hh:152
Definition: solver/parameter.hh:15
static const int none
Definition: solver/parameter.hh:40
virtual int preconditionMethod(const std::vector< int > standardMethods, const std::vector< std::string > &additionalMethods={}, int defaultMethod=0) const
Definition: solver/parameter.hh:185
const ParameterReader & parameter() const
Definition: solver/parameter.hh:68
static const int jacobi
Definition: solver/parameter.hh:45
const std::string & keyPrefix() const
Definition: solver/parameter.hh:66