31#ifndef GRID_CONJUGATE_GRADIENT_H
32#define GRID_CONJUGATE_GRADIENT_H
65 std::cout <<
"ConjugageGradient::LogBegin() "<<std::endl;
77 PreambleTimer.
Start();
78 psi.Checkerboard() = src.Checkerboard();
82 RealD cp, c, a, d, b, ssq, qq;
86 ConstructTimer.
Start();
88 Field mmp(src.Grid());
90 ConstructTimer.
Stop();
97 assert(std::isnan(guess) == 0);
120 std::cout <<
GridLogIterative << std::setprecision(8) <<
"ConjugateGradient: guess " << guess << std::endl;
121 std::cout <<
GridLogIterative << std::setprecision(8) <<
"ConjugateGradient: src " << ssq << std::endl;
122 std::cout <<
GridLogIterative << std::setprecision(8) <<
"ConjugateGradient: mp " << d << std::endl;
123 std::cout <<
GridLogIterative << std::setprecision(8) <<
"ConjugateGradient: mmp " << b << std::endl;
124 std::cout <<
GridLogIterative << std::setprecision(8) <<
"ConjugateGradient: cp,r " << cp << std::endl;
125 std::cout <<
GridLogIterative << std::setprecision(8) <<
"ConjugateGradient: p " << a << std::endl;
132 std::cout <<
GridLogMessage <<
"ConjugateGradient guess is converged already " << std::endl;
138 <<
"ConjugateGradient: k=0 residual " << cp <<
" target " << rsq << std::endl;
140 PreambleTimer.
Stop();
154 IterationTimer.
Start();
169 AxpyNormTimer.
Start();
171 AxpyNormTimer.
Stop();
174 LinearCombTimer.
Start();
180 coalescedWrite(psi_v[ss], a * p_v(ss) + psi_v(ss));
181 coalescedWrite(p_v[ss] , b * p_v(ss) + r_v (ss));
184 LinearCombTimer.
Stop();
188 IterationTimer.
Stop();
189 if ( (k % 500) == 0 ) {
190 std::cout <<
GridLogMessage <<
"ConjugateGradient: Iteration " << k
191 <<
" residual " <<
sqrt(cp/ssq) <<
" target " <<
Tolerance << std::endl;
194 <<
" residual " <<
sqrt(cp/ssq) <<
" target " <<
Tolerance <<
" took " << IterationTimer.
Elapsed() << std::endl;
205 + (8+4+8+4+4)*12*grid->
gSites()*k;
208 RealD true_residual = resnorm / srcnorm;
209 std::cout <<
GridLogMessage <<
"ConjugateGradient Converged on iteration " << k
210 <<
"\tComputed residual " << std::sqrt(cp / ssq)
211 <<
"\tTrue residual " << true_residual
212 <<
"\tTarget " <<
Tolerance << std::endl;
223 std::cout <<
GridLogDebug <<
"\tMobius flop rate " << DwfFlops/ usecs<<
" Gflops " <<std::endl;
240 <<
" residual "<< std::sqrt(cp / ssq)<< std::endl;
261template <
class Field>
265 std::vector<double>
ak;
266 std::vector<double>
bk;
278 Field tmp(src.Grid());
279 Field AtoN(src.Grid());
290 Field Ap(src.Grid());
296 x.Checkerboard()=src.Checkerboard();
297 for(
int k=0;k<
ak.size();k++){
311 std::cout <<
"ConjugageGradientPolynomial::LogBegin() "<<std::endl;
343 std::cout <<
"ConjugageGradientPolynomial::LogIteration() "<<k<<std::endl;
349 for(
int i=0;i<k;i++){
356 for(
int i=0;i<k;i++){
365 for(
int i=0;i<k+1;i++){
#define accelerator_for(iterator, num, nsimd,...)
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)
ComplexD innerProduct(const Lattice< vobj > &left, const Lattice< vobj > &right)
RealD norm2(const Lattice< vobj > &arg)
#define autoView(l_v, l, mode)
GridLogger GridLogIterative(1, "Iterative", GridLogColours, "BLUE")
GridLogger GridLogPerformance(1, "Performance", GridLogColours, "GREEN")
GridLogger GridLogDebug(1, "Debug", GridLogColours, "PURPLE")
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
std::complex< RealD > ComplexD
std::vector< double > poly_r
void Solve(LinearOperatorBase< Field > &Linop, const Field &src, Field &psi)
ConjugateGradientPolynomial(RealD tol, Integer maxit, bool err_on_no_conv=true)
std::vector< double > poly_p
void CGsequenceHermOp(LinearOperatorBase< Field > &Linop, const Field &src, Field &x)
void PolyHermOp(LinearOperatorBase< Field > &Linop, const Field &src, Field &psi)
virtual void LogIteration(int k, RealD a, RealD b)
std::vector< double > poly_Ap
virtual void LogBegin(void)
std::vector< double > polynomial
virtual void LogBegin(void)
Integer IterationsToComplete
void operator()(LinearOperatorBase< Field > &Linop, const Field &src, Field &psi)
ConjugateGradient(RealD tol, Integer maxit, bool err_on_no_conv=true)
virtual void LogIteration(int k, RealD a, RealD b)
int64_t gSites(void) const
GridTime Elapsed(void) const
virtual void HermOp(const Field &in, Field &out)=0
virtual void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)=0