QUDA  1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
multigrid.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <invert_quda.h>
4 //#include <eigensolve_quda.h>
5 #include <transfer.h>
6 #include <vector>
7 #include <complex_quda.h>
8 
9 // at the moment double-precision multigrid is only enabled when debugging
10 #ifdef HOST_DEBUG
11 #define GPU_MULTIGRID_DOUBLE
12 #endif
13 
14 namespace quda {
15 
16  // forward declarations
17  class MG;
18  class DiracCoarse;
19 
26  struct MGParam : SolverParam {
27 
31 
33  int level;
34 
36  int Nlevel;
37 
40 
43 
45  int Nvec;
46 
49 
52 
54  MG *fine;
55 
57  std::vector<ColorSpinorField*> &B;
58 
60  std::vector<Complex> evals;
61 
63  int nu_pre;
64 
66  int nu_post;
67 
69  double smoother_tol;
70 
73 
76 
79 
82 
85 
88 
92 
95 
98 
101 
103  char filename[100];
104 
108  MGParam(QudaMultigridParam &param, std::vector<ColorSpinorField *> &B, DiracMatrix *matResidual,
109  DiracMatrix *matSmooth, DiracMatrix *matSmoothSloppy, int level = 0) :
110  SolverParam(*(param.invert_param)),
111  mg_global(param),
112  level(level),
113  Nlevel(param.n_level),
114  spinBlockSize(param.spin_block_size[level]),
115  Nvec(param.n_vec[level]),
116  NblockOrtho(param.n_block_ortho[level]),
117  B(B),
118  nu_pre(param.nu_pre[level]),
119  nu_post(param.nu_post[level]),
120  smoother_tol(param.smoother_tol[level]),
121  cycle_type(param.cycle_type[level]),
122  global_reduction(param.global_reduction[level]),
123  matResidual(matResidual),
124  matSmooth(matSmooth),
125  matSmoothSloppy(matSmoothSloppy),
126  smoother(param.smoother[level]),
127  coarse_grid_solution_type(param.coarse_grid_solution_type[level]),
128  smoother_solve_type(param.smoother_solve_type[level]),
129  location(param.location[level]),
130  setup_location(param.setup_location[level])
131  {
132  // set the block size
133  for (int i = 0; i < QUDA_MAX_DIM; i++) geoBlockSize[i] = param.geo_block_size[level][i];
134 
135  // set the smoother relaxation factor
136  omega = param.omega[level];
137  }
138 
139  MGParam(const MGParam &param, std::vector<ColorSpinorField *> &B, std::vector<Complex> evals,
140  DiracMatrix *matResidual, DiracMatrix *matSmooth, DiracMatrix *matSmoothSloppy, int level = 0) :
141  SolverParam(param),
142  mg_global(param.mg_global),
143  level(level),
144  Nlevel(param.Nlevel),
145  spinBlockSize(param.mg_global.spin_block_size[level]),
146  Nvec(param.mg_global.n_vec[level]),
147  NblockOrtho(param.mg_global.n_block_ortho[level]),
148  coarse(param.coarse),
149  fine(param.fine),
150  B(B),
151  evals(evals),
152  nu_pre(param.mg_global.nu_pre[level]),
153  nu_post(param.mg_global.nu_post[level]),
154  smoother_tol(param.mg_global.smoother_tol[level]),
155  cycle_type(param.mg_global.cycle_type[level]),
156  global_reduction(param.mg_global.global_reduction[level]),
157  matResidual(matResidual),
158  matSmooth(matSmooth),
159  matSmoothSloppy(matSmoothSloppy),
160  smoother(param.mg_global.smoother[level]),
161  coarse_grid_solution_type(param.mg_global.coarse_grid_solution_type[level]),
162  smoother_solve_type(param.mg_global.smoother_solve_type[level]),
163  location(param.mg_global.location[level]),
164  setup_location(param.mg_global.setup_location[level])
165  {
166  // set the block size
167  for (int i = 0; i < QUDA_MAX_DIM; i++) geoBlockSize[i] = param.mg_global.geo_block_size[level][i];
168 
169  // set the smoother relaxation factor
170  omega = param.mg_global.omega[level];
171  }
172  };
173 
177  class MG : public Solver {
178 
179  private:
182 
185 
188 
190  Solver *presmoother, *postsmoother;
191 
194 
197 
199  char prefix[128];
200 
202  char coarse_prefix[128];
203 
206 
209 
212 
215 
218 
221 
223  std::vector<ColorSpinorField*> *B_coarse;
224 
227 
230 
233 
236 
239 
242 
245 
248 
251 
254 
257 
260 
263 
266 
269 
272 
277  void pushLevel(int level) const;
278 
283  void popLevel(int level) const;
284 
285 public:
291  MG(MGParam &param, TimeProfile &profile);
292 
297  virtual ~MG();
298 
303  void reset(bool refresh=false);
304 
308  void dumpNullVectors() const;
309 
313  void createSmoother();
314 
318  void destroySmoother();
319 
323  void createCoarseDirac();
324 
328  void createCoarseSolver();
329 
333  void destroyCoarseSolver();
334 
341  void verify();
342 
348  void operator()(ColorSpinorField &out, ColorSpinorField &in);
349 
354  void loadVectors(std::vector<ColorSpinorField *> &B);
355 
360  void saveVectors(const std::vector<ColorSpinorField *> &B) const;
361 
367  void generateNullVectors(std::vector<ColorSpinorField*> &B, bool refresh=false);
368 
372  void generateEigenVectors();
373 
378  void buildFreeVectors(std::vector<ColorSpinorField*> &B);
379 
383  double flops() const;
384 
385  };
386 
404  void ApplyCoarse(ColorSpinorField &out, const ColorSpinorField &inA, const ColorSpinorField &inB,
405  const GaugeField &Y, const GaugeField &X, double kappa, int parity = QUDA_INVALID_PARITY,
406  bool dslash=true, bool clover=true, bool dagger=false, const int *commDim=0,
407  QudaPrecision halo_precision=QUDA_INVALID_PRECISION);
408 
424  void CoarseOp(GaugeField &Y, GaugeField &X, const Transfer &T,
425  const cudaGaugeField &gauge, const cudaCloverField *clover,
426  double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc);
427 
447  void CoarseCoarseOp(GaugeField &Y, GaugeField &X, const Transfer &T, const GaugeField &gauge,
448  const GaugeField &clover, const GaugeField &cloverInv, double kappa, double mu, double mu_factor,
449  QudaDiracType dirac, QudaMatPCType matpc, bool need_bidirectional);
450 
458  void calculateYhat(GaugeField &Yhat, GaugeField &Xinv, const GaugeField &Y, const GaugeField &X);
459 
470 
474 
475  std::vector<ColorSpinorField*> B;
476  std::vector<Complex> evals;
477 
479 
480  MG *mg;
482 
483  multigrid_solver(QudaMultigridParam &mg_param, TimeProfile &profile);
484 
486  {
487  profile.TPSTART(QUDA_PROFILE_FREE);
488  if (mg) delete mg;
489 
490  if (mgParam) delete mgParam;
491 
492  for (unsigned int i=0; i<B.size(); i++) delete B[i];
493 
494  if (m) delete m;
495  if (mSmooth) delete mSmooth;
496  if (mSmoothSloppy) delete mSmoothSloppy;
497 
498  if (d) delete d;
499  if (dSmooth) delete dSmooth;
500  if (dSmoothSloppy && dSmoothSloppy != dSmooth) delete dSmoothSloppy;
501  profile.TPSTOP(QUDA_PROFILE_FREE);
502  }
503  };
504 
505 } // namespace quda
DiracMatrix * matSmoothSloppy
Definition: multigrid.h:84
QudaBoolean global_reduction
Definition: multigrid.h:75
QudaMultigridParam & mg_global
Definition: multigrid.h:30
void ApplyCoarse(ColorSpinorField &out, const ColorSpinorField &inA, const ColorSpinorField &inB, const GaugeField &Y, const GaugeField &X, double kappa, int parity=QUDA_INVALID_PARITY, bool dslash=true, bool clover=true, bool dagger=false, const int *commDim=0, QudaPrecision halo_precision=QUDA_INVALID_PRECISION)
Apply the coarse dslash stencil. This single driver accounts for all variations with and without the ...
SolverParam * param_coarse_solver
Definition: multigrid.h:220
double mu
Definition: test_util.cpp:1648
std::vector< ColorSpinorField * > & B
Definition: multigrid.h:57
MGParam(const MGParam &param, std::vector< ColorSpinorField *> &B, std::vector< Complex > evals, DiracMatrix *matResidual, DiracMatrix *matSmooth, DiracMatrix *matSmoothSloppy, int level=0)
Definition: multigrid.h:139
enum QudaPrecision_s QudaPrecision
void CoarseCoarseOp(GaugeField &Y, GaugeField &X, const Transfer &T, const GaugeField &gauge, const GaugeField &clover, const GaugeField &cloverInv, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc, bool need_bidirectional)
Coarse operator construction from an intermediate-grid operator (Coarse)
MGParam * param_coarse
Definition: multigrid.h:211
QudaFieldLocation location
Definition: multigrid.h:97
TimeProfile & profile_global
Definition: multigrid.h:193
std::vector< Complex > evals
Definition: multigrid.h:476
const Dirac * diracResidual
Definition: multigrid.h:244
double kappa
Definition: test_util.cpp:1647
QudaFieldLocation setup_location
Definition: multigrid.h:100
ColorSpinorField * b_tilde
Definition: multigrid.h:229
enum QudaSolveType_s QudaSolveType
Dirac * diracCoarseSmoother
Definition: multigrid.h:256
DiracMatrix * matCoarseSmootherSloppy
Definition: multigrid.h:268
SolverParam * param_presmooth
Definition: multigrid.h:214
void CoarseOp(GaugeField &Y, GaugeField &X, const Transfer &T, const cudaGaugeField &gauge, const cudaCloverField *clover, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc)
Coarse operator construction from a fine-grid operator (Wilson / Clover)
Definition: coarse_op.cu:201
ColorSpinorField * r
Definition: multigrid.h:226
MGParam & param
Definition: multigrid.h:181
int spinBlockSize
Definition: multigrid.h:42
virtual ~multigrid_solver()
Definition: multigrid.h:485
QudaSolveType smoother_solve_type
Definition: multigrid.h:94
Solver * presmoother
Definition: multigrid.h:190
const Dirac * diracSmootherSloppy
Definition: multigrid.h:250
QudaGaugeParam param
Definition: pack_test.cpp:17
void matpc(void *outEven, void **gauge, void *inEven, double kappa, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision sPrecision, QudaPrecision gPrecision, double mferm)
DiracMatrix * matCoarseSmoother
Definition: multigrid.h:265
ColorSpinorField * tmp_coarse
Definition: multigrid.h:238
SolverParam * param_postsmooth
Definition: multigrid.h:217
const Dirac * diracSmoother
Definition: multigrid.h:247
std::vector< Complex > evals
Definition: multigrid.h:60
QudaInverterType smoother
Definition: multigrid.h:87
cpuColorSpinorField * in
TimeProfile & profile
Definition: multigrid.h:481
Class declaration to initialize and hold CURAND RNG states.
Definition: random_quda.h:23
double omega[QUDA_MAX_MG_LEVEL]
Definition: quda.h:573
enum QudaMatPCType_s QudaMatPCType
DiracMatrix * matSmooth
Definition: multigrid.h:81
int geoBlockSize[QUDA_MAX_DIM]
Definition: multigrid.h:39
Dirac * diracCoarseResidual
Definition: multigrid.h:253
enum QudaSolutionType_s QudaSolutionType
int X[4]
Definition: covdev_test.cpp:70
std::vector< ColorSpinorField * > * B_coarse
Definition: multigrid.h:223
ColorSpinorField * tmp2_coarse
Definition: multigrid.h:241
ColorSpinorField * r_coarse
Definition: multigrid.h:232
bool resetTransfer
Definition: multigrid.h:187
DiracMatrix * matCoarseResidual
Definition: multigrid.h:262
void calculateYhat(GaugeField &Yhat, GaugeField &Xinv, const GaugeField &Y, const GaugeField &X)
Calculate preconditioned coarse links and coarse clover inverse field.
Dirac * diracCoarseSmootherSloppy
Definition: multigrid.h:259
enum QudaBoolean_s QudaBoolean
char filename[100]
Definition: multigrid.h:103
MGParam(QudaMultigridParam &param, std::vector< ColorSpinorField *> &B, DiracMatrix *matResidual, DiracMatrix *matSmooth, DiracMatrix *matSmoothSloppy, int level=0)
Definition: multigrid.h:108
double smoother_tol
Definition: multigrid.h:69
enum QudaFieldLocation_s QudaFieldLocation
GaugeCovDev * dirac
Definition: covdev_test.cpp:73
static int commDim[QUDA_MAX_DIM]
Definition: dslash_pack.cuh:9
cpuColorSpinorField * out
TimeProfile profile
Definition: multigrid.h:196
int geo_block_size[QUDA_MAX_MG_LEVEL][QUDA_MAX_DIM]
Definition: quda.h:486
enum QudaMultigridCycleType_s QudaMultigridCycleType
RNG * rng
Definition: multigrid.h:271
std::vector< ColorSpinorField * > B
Definition: multigrid.h:475
int NblockOrtho
Definition: multigrid.h:48
unsigned long long flops
Definition: blas_quda.cu:22
Transfer * transfer
Definition: multigrid.h:184
double mu_factor[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1674
#define QUDA_MAX_DIM
Maximum number of dimensions supported by QUDA. In practice, no routines make use of more than 5...
int n_block_ortho[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1673
QudaSolutionType coarse_grid_solution_type
Definition: multigrid.h:91
QudaDagType dagger
Definition: test_util.cpp:1620
MG * coarse
Definition: multigrid.h:205
QudaParity parity
Definition: covdev_test.cpp:54
Solver * coarse_solver
Definition: multigrid.h:208
QudaMultigridCycleType cycle_type
Definition: multigrid.h:72
enum QudaInverterType_s QudaInverterType
DiracMatrix * matResidual
Definition: multigrid.h:78
ColorSpinorField * x_coarse
Definition: multigrid.h:235
enum QudaDiracType_s QudaDiracType