29#ifndef GRID_PREC_GCR_H
30#define GRID_PREC_GCR_H
41#define GCRLogLevel std::cout << GridLogMessage <<std::string(level,'\t')<< " Level "<<level<<" "
106 <<
" computed residual "<<
sqrt(cp/ssq)
107 <<
" true residual " <<
sqrt(tr/ssq)
120 GCRLogLevel<<
"Variable Preconditioned GCR did not converge"<<std::endl;
142 std::vector<Field> q(
mmax,grid);
143 std::vector<Field> p(
mmax,grid);
144 std::vector<RealD> qq(
mmax);
153 Linop.HermOpAndNorm(psi,Az,zAz,zAAz);
171 Linop.HermOpAndNorm(z,Az,zAz,zAAz);
184 for(
int k=0;k<
nstep;k++){
189 int peri_k = k %
mmax;
190 int peri_kp= kp%
mmax;
196 axpy(psi,a,p[peri_k],psi);
201 GCRLogLevel<<
"PGCR step["<<
steps<<
"] resid " << cp <<
" target " <<rsq<<std::endl;
203 if((k==
nstep-1)||(cp<rsq)){
213 Linop.HermOpAndNorm(z,Az,zAz,zAAz);
221 int northog = ((kp)>(
mmax-1))?(
mmax-1):(kp);
222 for(
int back=0;back<northog;back++){
224 int peri_back=(k-back)%
mmax; assert((k-back)>=0);
227 p[peri_kp]=p[peri_kp]+b*p[peri_back];
228 q[peri_kp]=q[peri_kp]+b*q[peri_back];
231 qq[peri_kp]=
norm2(q[peri_kp]);
accelerator_inline Grid_simd< S, V > sqrt(const Grid_simd< S, V > &r)
RealD axpy_norm(Lattice< vobj > &ret, sobj a, const Lattice< vobj > &x, const Lattice< vobj > &y)
void axpy(Lattice< vobj > &ret, sobj a, const Lattice< vobj > &x, const Lattice< vobj > &y)
Lattice< vobj > real(const Lattice< vobj > &lhs)
ComplexD innerProduct(const Lattice< vobj > &left, const Lattice< vobj > &right)
RealD norm2(const Lattice< vobj > &arg)
#define NAMESPACE_BEGIN(A)
GridTime Elapsed(void) const
PrecGeneralisedConjugateResidual(RealD tol, Integer maxit, LinearOperatorBase< Field > &_Linop, LinearFunction< Field > &Prec, int _mmax, int _nstep)
LinearFunction< Field > & Preconditioner
RealD GCRnStep(const Field &src, Field &psi, RealD rsq)
GridStopWatch LinalgTimer
void operator()(const Field &src, Field &psi)
LinearOperatorBase< Field > & Linop