1#ifndef DUNE_FEM_CGINVERSEOPERATOR_HH
2#define DUNE_FEM_CGINVERSEOPERATOR_HH
8#include <dune/fem/io/parameter.hh>
9#include <dune/fem/function/common/discretefunction.hh>
10#include <dune/fem/operator/common/operator.hh>
11#include <dune/fem/solver/diagonalpreconditioner.hh>
12#include <dune/fem/solver/parameter.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,
69 : epsilon_( epsilon ),
70 maxIterations_( maxIterations ),
71 errorMeasure_( errorMeasure ),
72 verbose_( verbose && Fem::
Parameter::verbose() ),
73 averageCommTime_( 0.0 ),
77 unsigned int maxIterations,
79 const ParameterReader ¶meter = Parameter::container() )
80 : epsilon_( epsilon ),
81 maxIterations_( maxIterations ),
83 verbose_( verbose && Fem::
Parameter::verbose() ),
84 averageCommTime_( 0.0 ),
94 unsigned int maxIterations,
95 const ParameterReader ¶meter = Parameter::container() )
96 : epsilon_( epsilon ),
97 maxIterations_( maxIterations ),
99 verbose_( parameter.getValue< bool >(
"fem.solver.verbose", false ) ),
100 averageCommTime_( 0.0 ),
140 void setMaxIterations (
unsigned int maxIterations ) { maxIterations_ = maxIterations; }
146 return averageCommTime_;
150 const RealType epsilon_;
151 unsigned int maxIterations_;
154 mutable double averageCommTime_;
155 mutable unsigned int realCount_;
169 template<
class DiscreteFunction >
184 typedef typename Dune::FieldTraits< RangeFieldType >::real_type RealType;
201 unsigned int maxIter,
bool verbose,
202 const ParameterReader ¶meter = Parameter::container() )
203 : solver_( absLimit, maxIter, verbose, parameter ),
204 parameter_( parameter )
207 CGInverseOperator (
const SolverParameter& param = SolverParameter(Parameter::container() ) )
208 : solver_( param.tolerance(),
209 param.maxIterations(),
210 param.errorMeasure(),
224 unsigned int maxIter,
225 const ParameterReader ¶meter = Parameter::container() )
226 : solver_( absLimit, maxIter, parameter ),
227 parameter_( parameter )
231 const ParameterReader ¶meter = Parameter::container() )
244 RealType redEps, RealType absLimit,
245 unsigned int maxIter,
bool verbose,
246 const ParameterReader ¶meter = Parameter::container() )
261 RealType redEps, RealType absLimit,
262 unsigned int maxIter,
263 const ParameterReader ¶meter = Parameter::container() )
270 RealType redEps, RealType absLimit,
271 const ParameterReader ¶meter = Parameter::container() )
288 RealType redEps, RealType absLimit,
289 unsigned int maxIter,
bool verbose,
290 const ParameterReader ¶meter = Parameter::container() )
306 RealType redEps, RealType absLimit,
307 const ParameterReader ¶meter = Parameter::container() )
314 const PreconditionerType &precond,
315 RealType redEps, RealType absLimit,
316 unsigned int maxIter,
317 const ParameterReader ¶meter = Parameter::container() )
323 void bind (
const OperatorType &op ) { operator_ = &op; preconditioner_ =
nullptr; }
324 void bind (
const OperatorType &op,
const PreconditionerType &precond )
327 preconditioner_ = &precond;
329 void unbind () { operator_ =
nullptr; preconditioner_ =
nullptr; }
339 virtual void operator()(
const DomainFunctionType &arg, RangeFunctionType &dest )
const
346 template<
typename... A>
347 inline void prepare(A... )
const
358 virtual void apply(
const DomainFunctionType &arg, RangeFunctionType &dest )
const
362 solver_.
solve( *operator_, *preconditioner_, arg, dest );
364 solver_.
solve( *operator_, arg, dest );
373 void setMaxIterations (
unsigned int maxIter ) { solver_.setMaxIterations( maxIter ); }
381 SolverParameter& parameter ()
const
387 const OperatorType *operator_ =
nullptr;
388 const PreconditionerType *preconditioner_ =
nullptr;
390 mutable SolverParameter parameter_;
404 template<
class DiscreteFunction,
405 class Op = Fem::Operator< DiscreteFunction, DiscreteFunction > >
412 using BaseType::bind;
414 typedef SolverParameter SolverParameterType;
418 typedef DomainFunctionType DestinationType;
424 typedef typename Dune::FieldTraits< RangeFieldType >::real_type RealType;
429 CGInverseOperator (
const SolverParameter& param = SolverParameter(Parameter::container()) )
442 unsigned int maxIter,
bool verbose,
443 const ParameterReader ¶meter = Parameter::container() )
444 :
BaseType( redEps, absLimit, maxIter, verbose, parameter )
454 unsigned int maxIter,
455 const ParameterReader ¶meter = Parameter::container() )
456 :
BaseType( redEps, absLimit, maxIter, parameter )
460 const ParameterReader ¶meter = Parameter::container() )
461 : BaseType( redEps, absLimit, parameter )
472 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
474 RealType redEps, RealType absLimit,
475 unsigned int maxIter,
bool verbose,
476 const ParameterReader ¶meter = Parameter::container() )
477 :
BaseType( redEps, absLimit, maxIter, verbose, parameter )
489 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
491 RealType redEps, RealType absLimit,
492 unsigned int maxIter,
493 const ParameterReader ¶meter = Parameter::container() )
494 :
BaseType( redEps, absLimit, maxIter, parameter )
499 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
501 RealType redEps, RealType absLimit,
502 const ParameterReader ¶meter = Parameter::container() )
503 : BaseType( redEps, absLimit, parameter )
518 RealType redEps, RealType absLimit,
519 unsigned int maxIter,
bool verbose,
520 const ParameterReader ¶meter = Parameter::container() )
521 :
BaseType( op, precond, redEps, absLimit, maxIter, verbose, parameter )
534 RealType redEps, RealType absLimit,
535 unsigned int maxIter,
536 const ParameterReader ¶meter = Parameter::container() )
537 :
BaseType( op, precond, redEps, absLimit, maxIter, parameter )
541 const PreconditioningType &precond,
542 RealType redEps, RealType absLimit,
543 const ParameterReader ¶meter = Parameter::container() )
544 : BaseType( op, precond, redEps, absLimit, parameter )
548 template< class LinearOperator, std::enable_if_t< std::is_base_of< OperatorType, LinearOperator >::value,
int > = 0 >
551 BaseType::bind( op );
552 checkPreconditioning( op );
562 template<
class LinearOperator >
563 void checkPreconditioning(
const LinearOperator &linearOp )
565 bool preconditioning =
false;
566 if (!parameter_.parameter().exists(parameter_.keyPrefix()+
"preconditioning.method") &&
567 parameter_.parameter().exists(
"fem.preconditioning"))
569 preconditioning = parameter_.parameter().template getValue< bool >(
"fem.preconditioning",
false );
570 std::cout <<
"WARNING: using deprecated parameter `fem.preconditioning` use "
571 << parameter_.keyPrefix() <<
"preconditioning.method instead\n";
574 preconditioning = parameter_.preconditionMethod(
577 SolverParameter::jacobi
579 if( preconditioning && std::is_base_of< AssembledOperator< DomainFunctionType, DomainFunctionType > ,LinearOperator > :: value )
582 precondObj_.reset(
new DiagonalPreconditioner< DomainFunctionType, LinearOperator >( linearOp ) );
583 preconditioner_ = precondObj_.get();
587 using BaseType::preconditioner_;
588 using BaseType::parameter_;
589 std::unique_ptr< PreconditioningType > precondObj_;
595 template<
class Operator >
600 RealType tolerance = (epsilon_ * epsilon_);
601 if (errorMeasure_ == 1)
602 tolerance *= b.normSquaredDofs( );
604 averageCommTime_ = 0.0;
615 RealType prevResiduum = 0;
616 RealType residuum = r.normSquaredDofs( );
618 for( realCount_ = 0; (residuum > tolerance) && (realCount_ < maxIterations_); ++realCount_ )
622 assert( residuum/prevResiduum == residuum/prevResiduum );
623 p *= (residuum / prevResiduum);
631 assert( alpha == alpha );
635 prevResiduum = residuum;
636 residuum = r.normSquaredDofs( );
638 double exchangeTime = h.space().communicator().exchangeTime();
641 std::cout <<
"CG-Iteration: " << realCount_ <<
", Residuum: " << std::sqrt(residuum)
642 <<
", Tolerance: " << std::sqrt(tolerance) << std::endl;
644 if( b.space().gridPart().comm().size() > 1 )
645 std::cout <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
648 averageCommTime_ += exchangeTime;
653 template<
class Operator >
657 RealType tolerance = (epsilon_ * epsilon_);
658 if (errorMeasure_ == 1)
659 tolerance *= b.normSquaredDofs( );
661 averageCommTime_ = 0.0;
684 for( realCount_ = 0; (std::real(residuum) > tolerance) && (realCount_ < maxIterations_); ++realCount_ )
688 assert( residuum/prevResiduum == residuum/prevResiduum );
698 assert( alpha == alpha );
705 prevResiduum = residuum;
707 residuum = p.scalarProductDofs( s );
709 double exchangeTime = h.space().communicator().exchangeTime();
712 std::cout <<
"CG-Iteration: " << realCount_ <<
", Residuum: " << std::sqrt(residuum)
713 <<
", Tolerance: " << std::sqrt(tolerance) << std::endl;
715 if( b.space().gridPart().comm().size() > 1 )
716 std::cout <<
"Communication needed: " << exchangeTime <<
" s" << std::endl;
719 averageCommTime_ += exchangeTime;
Inverse operator base on CG method. Uses a runtime parameter fem.preconditioning which enables diagon...
Definition: cginverseoperator.hh:408
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:441
Op OperatorType
type of operator
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:490
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:453
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:516
CGInverseOperator(const LinearOperator &op, RealType redEps, RealType absLimit, unsigned int maxIter, bool verbose, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:473
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:532
linear solver using the CG algorithm
Definition: cginverseoperator.hh:31
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:597
double averageCommTime() const
return average communication time during last solve
Definition: cginverseoperator.hh:144
void solve(const OperatorType &op, const PreconditionerType &p, const RangeFunctionType &b, DomainFunctionType &x) const
solve
Definition: cginverseoperator.hh:655
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
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
OperatorType::DomainFunctionType DomainFunctionType
type of the operator's domain vectors
Definition: cginverseoperator.hh:45
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
Container for User Specified Parameters.
Definition: parameter.hh:191
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
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
CGInverseOperator(const OperatorType &op, const PreconditionerType &precond, RealType redEps, RealType absLimit, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:304
CGInverseOperator(RealType redEps, RealType absLimit, unsigned int maxIter, const ParameterReader ¶meter=Parameter::container())
constructor of CGInverseOperator
Definition: cginverseoperator.hh:223
unsigned int iterations() const
number of iterations needed for last solve
Definition: cginverseoperator.hh:368
virtual void apply(const DomainFunctionType &arg, RangeFunctionType &dest) const
application operator
Definition: cginverseoperator.hh:358
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
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
A linear operator.
Definition: operators.hh:69
constexpr GeometryType none(unsigned int dim)
Returns a GeometryType representing a singular of dimension dim.
Definition: type.hh:471
constexpr auto max
Function object that returns the greater of the given values.
Definition: hybridutilities.hh:484
Dune namespace.
Definition: alignedallocator.hh:13
abstract affine-linear operator
Definition: operator.hh:90
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