QUDA  0.9.0
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;
21 #if 0
23  report("Implicitly restarted Lanczos");
24  eig_solver = new ImpRstLanczos(ritz_mat, param, profile);
25  break;
26 #endif
27  default:
28  errorQuda("Invalid eig solver type");
29  }
30 
31  return eig_solver;
32  }
33 
34  bool Eig_Solver::convergence(const double &r2, const double &hq2, const double &r2_tol,
35  const double &hq_tol) {
36 
37  return true;
38  }
39 
40  void Eig_Solver::PrintStats(const char* name, int k, const double &r2,
41  const double &b2, const double &hq2) {
42  }
43 
44  void Eig_Solver::PrintSummary(const char *name, int k, const double &r2, const double &b2) {
45  }
46 
48  Complex xp(0.0,0.0);
49  for(int i = 0; i<Nvec; ++i)
50  {
51  xp = blas::cDotProduct(*(Eig_Vec[i]), psi);
52 
53  if (getVerbosity() >= QUDA_VERBOSE) {
54  if(fabs(xp.real()) > 1e-13 || fabs(xp.imag()) > 1e-13)
55  printf("[%d] %e %e\n", i, xp.real(),xp.imag());
56  }
57 
58  xp *= -1.0;
59  blas::caxpy(xp, *(Eig_Vec[i]), psi);
60 
61  if(i==Nvec-1 && delta) *delta = xp.real(); // Re ( vec[Nvec-1], psi ) needed for Lanczos' delta
62  }
63  }
64 } // namespace quda
QudaVerbosity getVerbosity()
Definition: util_quda.cpp:20
#define errorQuda(...)
Definition: util_quda.h:90
Complex cDotProduct(ColorSpinorField &, ColorSpinorField &)
Definition: reduce_quda.cu:500
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:40
QudaGaugeParam param
Definition: pack_test.cpp:17
bool convergence(const double &r2, const double &hq2, const double &r2_tol, const double &hq_tol)
Definition: eig_solver.cpp:34
static unsigned int delta
int printf(const char *,...) __attribute__((__format__(__printf__
void GrandSchm_test(cudaColorSpinorField &psi, cudaColorSpinorField **Eig_Vec, int Nvec, double *delta)
Definition: eig_solver.cpp:47
TimeProfile & profile
Definition: lanczos_quda.h:20
static Eig_Solver * create(QudaEigParam &param, RitzMat &ritz_mat, TimeProfile &profile)
Definition: eig_solver.cpp:12
void caxpy(const Complex &a, ColorSpinorField &x, ColorSpinorField &y)
Definition: blas_quda.cu:246
static void report(const char *type)
Definition: eig_solver.cpp:7
#define printfQuda(...)
Definition: util_quda.h:84
void PrintSummary(const char *name, int k, const double &r2, const double &b2)
Definition: eig_solver.cpp:44
double fabs(double)