29#ifndef GRID_PREC_GCR_NON_HERM_H
30#define GRID_PREC_GCR_NON_HERM_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)
115 GCRLogLevel<<
"Variable Preconditioned GCR did not converge"<<std::endl;
138 std::vector<Field> q(
mmax,grid);
139 std::vector<Field> p(
mmax,grid);
140 std::vector<RealD> qq(
mmax);
185 for(
int k=0;k<
nstep;k++){
190 int peri_k = k %
mmax;
191 int peri_kp= kp%
mmax;
197 axpy(psi,a,p[peri_k],psi);
202 GCRLogLevel<<
"PGCR step["<<
steps<<
"] resid " << cp <<
" target " <<rsq<<std::endl;
204 if((k==
nstep-1)||(cp<rsq)){
224 int northog = ((kp)>(
mmax-1))?(
mmax-1):(kp);
225 for(
int back=0;back<northog;back++){
227 int peri_back=(k-back)%
mmax; assert((k-back)>=0);
230 p[peri_kp]=p[peri_kp]+b*p[peri_back];
231 q[peri_kp]=q[peri_kp]+b*q[peri_back];
234 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)
std::complex< RealD > ComplexD
GridTime Elapsed(void) const
PrecGeneralisedConjugateResidualNonHermitian(RealD tol, Integer maxit, LinearOperatorBase< Field > &_Linop, LinearFunction< Field > &Prec, int _mmax, int _nstep)
void operator()(const Field &src, Field &psi)
LinearOperatorBase< Field > & Linop
RealD GCRnStep(const Field &src, Field &psi, RealD rsq)
LinearFunction< Field > & Preconditioner
GridStopWatch LinalgTimer