QUDA  1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
eigensolve_quda.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <quda.h>
4 #include <quda_internal.h>
5 #include <dirac_quda.h>
6 #include <color_spinor_field.h>
7 
8 namespace quda
9 {
10 
12  {
13 
14 protected:
17 
18  // Problem parameters
19  //------------------
20  int nEv;
21  int nKr;
22  int nConv;
23  double tol;
24  bool reverse;
25  char spectrum[3];
27  // Algorithm variables
28  //--------------------
29  bool converged;
33  int iter;
36  int iter_keep;
39  int num_keep;
40 
41  double *residua;
42 
43  // Device side vector workspace
44  std::vector<ColorSpinorField *> r;
45  std::vector<ColorSpinorField *> d_vecs_tmp;
46 
49 
51 
52 public:
58  EigenSolver(QudaEigParam *eig_param, TimeProfile &profile);
59 
63  virtual ~EigenSolver();
64 
70  virtual void operator()(std::vector<ColorSpinorField *> &kSpace, std::vector<Complex> &evals) = 0;
71 
78  static EigenSolver *create(QudaEigParam *eig_param, const DiracMatrix &mat, TimeProfile &profile);
79 
88 
97 
106  Complex blockOrthogonalize(std::vector<ColorSpinorField *> v, std::vector<ColorSpinorField *> r, int j);
107 
115  void deflate(std::vector<ColorSpinorField *> vec_defl, std::vector<ColorSpinorField *> vec,
116  std::vector<ColorSpinorField *> evecs, std::vector<Complex> evals);
117 
125  void deflateSVD(std::vector<ColorSpinorField *> vec_defl, std::vector<ColorSpinorField *> vec,
126  std::vector<ColorSpinorField *> evecs, std::vector<Complex> evals);
127 
134  void computeSVD(const DiracMatrix &mat, std::vector<ColorSpinorField *> &evecs, std::vector<Complex> &evals);
135 
143  void computeEvals(const DiracMatrix &mat, std::vector<ColorSpinorField *> &evecs, std::vector<Complex> &evals, int k);
144 
150  static void loadVectors(std::vector<ColorSpinorField *> &eig_vecs, std::string file);
151 
157  static void saveVectors(const std::vector<ColorSpinorField *> &eig_vecs, std::string file);
158 
165  void loadFromFile(const DiracMatrix &mat, std::vector<ColorSpinorField *> &eig_vecs, std::vector<Complex> &evals);
166  };
167 
171  class TRLM : public EigenSolver
172  {
173 
174 public:
175  const DiracMatrix &mat;
183 
187  virtual ~TRLM();
188 
189  // Variable size matrix
190  std::vector<double> ritz_mat;
191 
192  // Tridiagonal/Arrow matrix, fixed size.
193  double *alpha;
194  double *beta;
195 
196  // Used to clone vectors and resize arrays.
198 
204  void operator()(std::vector<ColorSpinorField *> &kSpace, std::vector<Complex> &evals);
205 
211  void lanczosStep(std::vector<ColorSpinorField *> v, int j);
212 
217  void reorder(std::vector<ColorSpinorField *> &kSpace);
218 
224  void eigensolveFromArrowMat(int nLocked, int arror_pos);
225 
230  void computeKeptRitz(std::vector<ColorSpinorField *> &kSpace);
231 
232  };
233 
249  void arpack_solve(std::vector<ColorSpinorField *> &h_evecs, std::vector<Complex> &h_evals, const DiracMatrix &mat,
251 
252 } // namespace quda
void deflate(std::vector< ColorSpinorField *> vec_defl, std::vector< ColorSpinorField *> vec, std::vector< ColorSpinorField *> evecs, std::vector< Complex > evals)
Deflate vector with Eigenvectors.
void chebyOp(const DiracMatrix &mat, ColorSpinorField &out, const ColorSpinorField &in)
Promoted the specified matVec operation: M, Mdag, MMdag, MdagM to a Chebyshev polynomial.
static void loadVectors(std::vector< ColorSpinorField *> &eig_vecs, std::string file)
Load vectors from file.
std::vector< ColorSpinorField * > d_vecs_tmp
static void saveVectors(const std::vector< ColorSpinorField *> &eig_vecs, std::string file)
Save vectors to file.
void deflateSVD(std::vector< ColorSpinorField *> vec_defl, std::vector< ColorSpinorField *> vec, std::vector< ColorSpinorField *> evecs, std::vector< Complex > evals)
Deflate vector with both left and Right singular vectors.
const DiracMatrix & mat
ColorSpinorField * tmp1
static EigenSolver * create(QudaEigParam *eig_param, const DiracMatrix &mat, TimeProfile &profile)
Creates the eigensolver using the parameters given and the matrix.
double * beta
void arpack_solve(std::vector< ColorSpinorField *> &h_evecs, std::vector< Complex > &h_evals, const DiracMatrix &mat, QudaEigParam *eig_param, TimeProfile &profile)
The QUDA interface function. One passes two allocated arrays to hold the the eigenmode data...
void loadFromFile(const DiracMatrix &mat, std::vector< ColorSpinorField *> &eig_vecs, std::vector< Complex > &evals)
Load and check eigenpairs from file.
cpuColorSpinorField * in
ColorSpinorParam csParam
void matVec(const DiracMatrix &mat, ColorSpinorField &out, const ColorSpinorField &in)
Applies the specified matVec operation: M, Mdag, MMdag, MdagM.
std::vector< double > ritz_mat
void computeSVD(const DiracMatrix &mat, std::vector< ColorSpinorField *> &evecs, std::vector< Complex > &evals)
Computes Left/Right SVD from pre computed Right/Left.
std::complex< double > Complex
Definition: quda_internal.h:46
TimeProfile & profile
virtual void operator()(std::vector< ColorSpinorField *> &kSpace, std::vector< Complex > &evals)=0
Computes the eigen decomposition for the operator passed to create.
Complex blockOrthogonalize(std::vector< ColorSpinorField *> v, std::vector< ColorSpinorField *> r, int j)
Orthogonalise input vector r against vector space v using block-BLAS.
ColorSpinorField * tmp2
double * alpha
cpuColorSpinorField * out
Main header file for the QUDA library.
std::vector< ColorSpinorField * > r
void computeEvals(const DiracMatrix &mat, std::vector< ColorSpinorField *> &evecs, std::vector< Complex > &evals, int k)
Compute eigenvalues and their residiua.
void mat(void *out, void **link, void *in, int dagger_bit, int mu, QudaPrecision sPrecision, QudaPrecision gPrecision)
EigenSolver(QudaEigParam *eig_param, TimeProfile &profile)
Constructor for base Eigensolver class.
QudaEigParam * eig_param
Thick Restarted Lanczos Method.