20 Solver(invParam, profile), mat(mat), matSloppy(matSloppy)
34 const double b2 =
norm2(b);
37 printfQuda(
"Warning: inverting on zero-field source\n");
83 const bool use_heavy_quark_res =
92 double heavy_quark_res = 0.0;
94 int heavy_quark_check = 10;
96 double alpha=0.0, beta=0.0;
100 double rNorm = sqrt(r2);
101 double r0Norm = rNorm;
102 double maxrx = rNorm;
103 double maxrr = rNorm;
114 int steps_since_reliable = 1;
118 matSloppy(Ap, p, tmp, tmp2);
122 bool breakdown =
false;
126 r2 = triplet.x;
double Ap2 = triplet.y; pAp = triplet.z;
130 sigma = alpha*(alpha * Ap2 - pAp);
131 if (sigma < 0.0 || steps_since_reliable==0) {
146 sigma = imag(cg_norm) >= 0.0 ? imag(cg_norm) : r2;
151 if (rNorm > maxrx) maxrx = rNorm;
152 if (rNorm > maxrr) maxrr = rNorm;
153 int updateX = (rNorm < delta*r0Norm && r0Norm <= maxrx) ? 1 : 0;
154 int updateR = ((rNorm < delta*maxrr && r0Norm <= maxrr) || updateX) ? 1 : 0;
159 if ( !(updateR || updateX)) {
161 beta = sigma / r2_old;
166 if (use_heavy_quark_res && k%heavy_quark_check==0) {
171 steps_since_reliable++;
184 static int resIncrease = 0;
185 if (sqrt(r2) > r0Norm && updateX) {
186 warningQuda(
"CG: new reliable residual norm %e is greater than previous reliable residual norm %e", sqrt(r2), r0Norm);
189 if (++resIncrease > 2)
break;
209 steps_since_reliable = 0;
234 printfQuda(
"CG: Reliable updates = %d\n", rUpdate);
239 #if (__COMPUTE_CAPABILITY__ >= 200)
255 if (&tmp2 != &tmp)
delete tmp2_p;