21 namespace ChebyshevDetail
23 double chebyshev(
double x,
size_t m)
28 double n0 = 1, n1 = x;
30 for(
size_t i=2; i<m+1; ++i)
32 double n = 2*x*n1 - n0;
52 template <
class Operator,
bool isPreconditioner=false>
56 typedef typename Operator::Domain
Domain;
57 typedef typename Operator::Range
Range;
60 : A(A_), jac(A), a(0), b(0), eta(0), tolerance(tol), maxSteps(steps), verbose(verbose_), isInitialized(false)
72 std::cerr <<
"In file " << __FILE__ <<
": line " << __LINE__;
73 std::cerr <<
": No spectral bounds have been provided for chebyshev semi-iteration. Aborting." << std::endl;
79 Domain x0(x), x1(x); x1 *= 0;
80 Range r(y), jr(y), tmp(y), res0(y), res1(y); res1 *= 0;
81 A.applyscaleadd(-1.,x,tmp);
83 double initialResidual = res0*tmp, currentResidual = 0, desiredResidual = tolerance*tolerance*initialResidual;
84 if(verbose > 1) std::cout <<
"initial residual: " << initialResidual << std::endl;
85 for(
size_t i=0; i<maxSteps; ++i)
94 if(i==1) beta = -0.5*b*b/a;
95 else beta = 0.25*b*b*gammainv;
96 gammainv = -1./(a+beta);
110 A.applyscaleadd(-1.,x,r);
113 currentResidual = r*jr;
114 if((currentResidual < desiredResidual) && (isPreconditioner==
false))
118 std::cout <<
"Terminating chebyshev semi iteration after " << i <<
" iterations with final residual: " << currentResidual <<
"." << std::endl;
119 std::cout <<
"Residual reduction: " << currentResidual/initialResidual <<
" (initialResidual=" << initialResidual <<
")" << std::endl;
140 isInitialized =
true;
148 double a, b, eta, tolerance;
149 size_t maxSteps, verbose;
158 template <
class Operator>
Preconditioner based on the Chebyshev semi-iteration. In order to provide a linear preconditioner the...
ChebyshevPreconditioner(Operator const &A, size_t steps, size_t verbose=0)
Preconditioned chebyshev semi iteration.
void setSteps(size_t steps)
void initForMassMatrix_TetrahedralQ1Elements()
Init spectral bounds for the mass matrix arising from tetrahedral discretization of the domain and li...
ChebyshevSemiIteration(Operator const &A_, double tol, size_t steps, size_t verbose_=0)
virtual void pre(Domain &, Range &)
virtual void apply(Domain &x, Range const &y)
virtual ~ChebyshevSemiIteration()
virtual void post(Domain &)