19 CG3::CG3(DiracMatrix &
mat, SolverParam &
param, TimeProfile &profile) :
20 Solver(param, profile), mat(mat)
27 void CG3::operator()(cudaColorSpinorField &
x, cudaColorSpinorField &b)
31 const double b2 =
norm2(b);
34 printfQuda(
"Warning: inverting on zero-field source\n");
37 param.true_res_hq = 0.0;
45 cudaColorSpinorField x_prev(b,
csParam);
46 cudaColorSpinorField r_prev(b,
csParam);
47 cudaColorSpinorField temp(b,
csParam);
49 cudaColorSpinorField r(b);
50 cudaColorSpinorField w(b);
55 PrintStats(
"CG3", 0, r2, b2, 0.0);
58 double stop = stopping(
param.tol, b2,
param.residual_type);
59 if(convergence(r2, 0.0, stop, 0.0))
return;
64 double gamma_prev = 0.0;
65 double gamma = r2/rAr;
68 cudaColorSpinorField x_new(x);
69 cudaColorSpinorField r_new(r);
79 while(!convergence(r2, 0.0, stop, 0.0) && k<
param.maxiter){
80 x_prev =
x; x = x_new;
81 r_prev = r; r = r_new;
88 PrintStats(
"CG3", k, r2, b2, 0.0);
92 rho = 1.0/(1. - (gamma/gamma_prev)*(r2/r2_prev)*(1.0/rho));
114 if(k ==
param.maxiter)
121 PrintSummary(
"CG3", k, r2, b2);
__host__ __device__ ValueType sqrt(ValueType x)
void mat(void *out, void **fatlink, void **longlink, void *in, double kappa, int dagger_bit, QudaPrecision sPrecision, QudaPrecision gPrecision)
void axpyCuda(const double &a, cudaColorSpinorField &x, cudaColorSpinorField &y)
double reDotProductCuda(cudaColorSpinorField &a, cudaColorSpinorField &b)
void axCuda(const double &a, cudaColorSpinorField &x)
double norm2(const ColorSpinorField &)
double xmyNormCuda(cudaColorSpinorField &a, cudaColorSpinorField &b)