7 static void report(
const char *type) {
20 solver =
new CG(mat, matSloppy, param, profile);
24 solver =
new BiCGstab(mat, matSloppy, matPrecon, param, profile);
28 solver =
new GCR(mat, matSloppy, matPrecon, param, profile);
32 solver =
new MR(mat, param, profile);
36 solver =
new SD(mat, param, profile);
41 solver =
new XSD(mat, param, profile);
43 errorQuda(
"Extended Steepest Descent is multi-gpu only");
48 solver =
new PreconCG(mat, matSloppy, matPrecon, param, profile);
52 solver =
new MPCG(mat, param, profile);
71 double lowest = (b2 < 1.0) ? b2 : 1.0;
72 stop = lowest*tol*tol;
73 }
else if (residual_type & QUDA_L2_ABSOLUTE_RESIDUAL) {
83 const double &hq_tol) {
100 const double &hq_tol) {
111 const double &hq_tol) {
123 const double &b2,
const double &hq2) {
126 printfQuda(
"%s: %d iterations, <r,r> = %e, |r|/|b| = %e, heavy-quark residual = %e\n",
127 name, k, r2,
sqrt(r2/b2), hq2);
129 printfQuda(
"%s: %d iterations, <r,r> = %e, |r|/|b| = %e\n",
130 name, k, r2,
sqrt(r2/b2));
134 if (std::isnan(r2))
errorQuda(
"Solver appears to have diverged");
142 printfQuda(
"%s: Convergence at %d iterations, L2 relative residual: iterated = %e, true = %e\n",
155 report(
"Incremental EIGCG");
156 solver =
new IncEigCG(mat, matSloppy, matCGSloppy, matDeflate, param, profile);
165 const double &hq_tol) {
180 const double &b2,
const double &hq2) {
183 printfQuda(
"%s: %d iterations, <r,r> = %e, |r|/|b| = %e, heavy-quark residual = %e\n",
184 name, k, r2,
sqrt(r2/b2), hq2);
186 printfQuda(
"%s: %d iterations, <r,r> = %e, |r|/|b| = %e\n",
187 name, k, r2,
sqrt(r2/b2));
191 if (std::isnan(r2))
errorQuda(
"Solver appears to have diverged");
199 printfQuda(
"%s: Convergence at %d iterations, L2 relative residual: iterated = %e, true = %e\n",
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
static double stopping(const double &tol, const double &b2, QudaResidualType residual_type)
enum QudaResidualType_s QudaResidualType
QudaInverterType inv_type
QudaVerbosity getVerbosity()
__host__ __device__ ValueType sqrt(ValueType x)
bool convergenceL2(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
void mat(void *out, void **fatlink, void **longlink, void *in, double kappa, int dagger_bit, QudaPrecision sPrecision, QudaPrecision gPrecision)
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
QudaResidualType residual_type
static Solver * create(SolverParam ¶m, DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matPrecon, TimeProfile &profile)
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
static DeflatedSolver * create(SolverParam ¶m, DiracMatrix &mat, DiracMatrix &matSloppy, DiracMatrix &matCGSloppy, DiracMatrix &matDeflate, TimeProfile &profile)
void PrintStats(const char *, int k, const double &r2, const double &b2, const double &hq2)
void PrintStats(const char *, int k, const double &r2, const double &b2, const double &hq2)
bool convergenceHQ(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)