QUDA  v0.7.0
A library for QCD on GPUs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
eig_solver.cpp
Go to the documentation of this file.
1 #include <quda_internal.h>
2 #include <invert_quda.h>
3 #include <lanczos_quda.h>
4 
5 namespace quda {
6 
7  static void report(const char *type) {
8  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a %s Eig solver\n", type);
9  }
10 
11  // solver factory
13  {
14  Eig_Solver *eig_solver=0;
15 
16  switch (param.eig_type) {
17  case QUDA_LANCZOS:
18  report("Lanczos solver");
19  eig_solver = new Lanczos(ritz_mat, param, profile);
20  break;
22  report("BiCGstab");
23  eig_solver = new ImpRstLanczos(ritz_mat, param, profile);
24  break;
25  default:
26  errorQuda("Invalid eig solver type");
27  }
28 
29  return eig_solver;
30  }
31 
32  bool Eig_Solver::convergence(const double &r2, const double &hq2, const double &r2_tol,
33  const double &hq_tol) {
34 
35  return true;
36  }
37 
38  void Eig_Solver::PrintStats(const char* name, int k, const double &r2,
39  const double &b2, const double &hq2) {
40  }
41 
42  void Eig_Solver::PrintSummary(const char *name, int k, const double &r2, const double &b2) {
43  }
44 
45  void Eig_Solver::GrandSchm_test(cudaColorSpinorField &psi, cudaColorSpinorField **Eig_Vec, int Nvec, double *delta) {
46  Complex xp(0.0,0.0);
47  for(int i = 0; i<Nvec; ++i)
48  {
49  xp =cDotProductCuda(*(Eig_Vec[i]), psi);
50 
51  if (getVerbosity() >= QUDA_VERBOSE) {
52  if(fabs(xp.real()) > 1e-13 || fabs(xp.imag()) > 1e-13)
53  printf("[%d] %e %e\n", i, xp.real(),xp.imag());
54  }
55 
56  xp *= -1.0;
57  caxpyCuda(xp, *(Eig_Vec[i]), psi);
58 
59  if(i==Nvec-1 && delta) *delta = xp.real(); // Re ( vec[Nvec-1], psi ) needed for Lanczos' delta
60  }
61  }
62 } // namespace quda
void caxpyCuda(const Complex &a, cudaColorSpinorField &x, cudaColorSpinorField &y)
Definition: blas_quda.cu:207
QudaVerbosity getVerbosity()
Definition: util_quda.cpp:20
#define errorQuda(...)
Definition: util_quda.h:73
std::complex< double > Complex
Definition: eig_variables.h:13
void PrintStats(const char *, int k, const double &r2, const double &b2, const double &hq2)
Definition: eig_solver.cpp:38
QudaGaugeParam param
Definition: pack_test.cpp:17
QudaEigType eig_type
Definition: quda.h:264
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
Definition: eig_solver.cpp:32
Complex cDotProductCuda(cudaColorSpinorField &, cudaColorSpinorField &)
Definition: reduce_quda.cu:468
void GrandSchm_test(cudaColorSpinorField &psi, cudaColorSpinorField **Eig_Vec, int Nvec, double *delta)
Definition: eig_solver.cpp:45
static Eig_Solver * create(QudaEigParam &param, RitzMat &ritz_mat, TimeProfile &profile)
Definition: eig_solver.cpp:12
#define printfQuda(...)
Definition: util_quda.h:67
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
Definition: eig_solver.cpp:42