80 bool using_fallback =
false;
82 psi.Checkerboard() = src.Checkerboard();
85 RealD cp, c, a, d, b, ssq, qq, b_pred;
93 assert(std::isnan(guess) == 0);
95 Linop_d.HermOpAndNorm(psi, mmp, d, b);
104 std::cout <<
GridLogIterative << std::setprecision(4) <<
"ConjugateGradientReliableUpdate: guess " << guess << std::endl;
105 std::cout <<
GridLogIterative << std::setprecision(4) <<
"ConjugateGradientReliableUpdate: src " << ssq << std::endl;
106 std::cout <<
GridLogIterative << std::setprecision(4) <<
"ConjugateGradientReliableUpdate: mp " << d << std::endl;
107 std::cout <<
GridLogIterative << std::setprecision(4) <<
"ConjugateGradientReliableUpdate: mmp " << b << std::endl;
108 std::cout <<
GridLogIterative << std::setprecision(4) <<
"ConjugateGradientReliableUpdate: cp,r " << cp << std::endl;
109 std::cout <<
GridLogIterative << std::setprecision(4) <<
"ConjugateGradientReliableUpdate: p " << a << std::endl;
115 std::cout <<
GridLogMessage <<
"ConjugateGradientReliableUpdate guess was REALLY good\n";
116 std::cout <<
GridLogMessage <<
"\tComputed residual " << std::sqrt(cp / ssq)<<std::endl;
125 r_f.Checkerboard() = r.Checkerboard();
134 RealD MaxResidSinceLastRelUp = cp;
137 <<
"ConjugateGradient: k=0 residual " << cp <<
" target " << rsq << std::endl;
158 b_pred = a * (a * qq - d) / c;
164 psi_f = a * p_f + psi_f;
169 std::cout <<
GridLogIterative <<
"ConjugateGradientReliableUpdate: Iteration " << k
170 <<
" residual " << cp <<
" target " << rsq << std::endl;
171 std::cout <<
GridLogDebug <<
"a = "<< a <<
" b_pred = "<< b_pred <<
" b = "<< b << std::endl;
172 std::cout <<
GridLogDebug <<
"qq = "<< qq <<
" d = "<< d <<
" c = "<< c << std::endl;
174 if(cp > MaxResidSinceLastRelUp){
175 std::cout <<
GridLogIterative <<
"ConjugateGradientReliableUpdate: updating MaxResidSinceLastRelUp : " << MaxResidSinceLastRelUp <<
" -> " << cp << std::endl;
176 MaxResidSinceLastRelUp = cp;
182 PrecChangeTimer.
Start();
184 PrecChangeTimer.
Stop();
189 Linop_d.HermOpAndNorm(psi, mmp, d, qq);
194 RealD true_residual = resnorm / srcnorm;
196 std::cout <<
GridLogMessage <<
"ConjugateGradientReliableUpdate Converged on iteration " << k <<
" after " << l <<
" reliable updates" << std::endl;
197 std::cout <<
GridLogMessage <<
"\tComputed residual " << std::sqrt(cp / ssq)<<std::endl;
198 std::cout <<
GridLogMessage <<
"\tTrue residual " << true_residual<<std::endl;
206 std::cout <<
GridLogMessage <<
"\tPrecChange avg time " << PrecChangeTimer.
Elapsed()/(2*l+1) <<std::endl;
214 std::cout <<
GridLogMessage <<
"ConjugateGradientReliableUpdate performing final cleanup.\n";
222 std::cout <<
GridLogMessage <<
"ConjugateGradientReliableUpdate complete.\n";
225 else if(cp <
Delta * MaxResidSinceLastRelUp) {
227 << cp <<
"(residual) < " <<
Delta <<
"(Delta) * " << MaxResidSinceLastRelUp <<
"(MaxResidSinceLastRelUp) on iteration " << k <<
" : performing reliable update\n";
228 PrecChangeTimer.
Start();
230 PrecChangeTimer.
Stop();
234 Linop_d.HermOpAndNorm(psi, mmp, d, qq);
240 PrecChangeTimer.
Start();
242 PrecChangeTimer.
Stop();
244 MaxResidSinceLastRelUp = cp;
248 std::cout <<
GridLogMessage <<
"ConjugateGradientReliableUpdate new residual " << cp << std::endl;
256 std::cout <<
GridLogMessage <<
"ConjugateGradientReliableUpdate switching to fallback linear operator on iteration " << k <<
" at residual " << cp << std::endl;
258 using_fallback =
true;
263 std::cout <<
GridLogMessage <<
"ConjugateGradientReliableUpdate did NOT converge"