QUDA  0.9.0
multigrid.h
Go to the documentation of this file.
1 #ifndef _MG_QUDA_H
2 #define _MG_QUDA_H
3 
4 #include <invert_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 
51  MG *fine;
52 
54  std::vector<ColorSpinorField*> &B;
55 
57  int nu_pre;
58 
60  int nu_post;
61 
63  double smoother_tol;
64 
67 
70 
73 
76 
79 
82 
86 
89 
92 
94  char filename[100];
95 
100  std::vector<ColorSpinorField*> &B,
104  int level=0) :
105  SolverParam(*(param.invert_param)),
106  mg_global(param),
107  level(level),
108  Nlevel(param.n_level),
109  spinBlockSize(param.spin_block_size[level]),
110  Nvec(param.n_vec[level]),
111  B(B),
124  {
125  // set the block size
126  for (int i=0; i<QUDA_MAX_DIM; i++) geoBlockSize[i] = param.geo_block_size[level][i];
127 
128  // set the smoother relaxation factor
129  omega = param.omega[level];
130  }
131 
133  std::vector<ColorSpinorField*> &B,
137  int level=0) :
140  level(level),
142  spinBlockSize(param.mg_global.spin_block_size[level]),
143  Nvec(param.mg_global.n_vec[level]),
145  fine(param.fine),
146  B(B),
159  {
160  // set the block size
161  for (int i=0; i<QUDA_MAX_DIM; i++) geoBlockSize[i] = param.mg_global.geo_block_size[level][i];
162 
163  // set the smoother relaxation factor
164  omega = param.mg_global.omega[level];
165  }
166 
167  };
168 
172  class MG : public Solver {
173 
174  private:
177 
180 
183 
186 
189 
191  char prefix[128];
192 
194  char coarse_prefix[128];
195 
198 
201 
204 
207 
210 
213 
216 
218  std::vector<ColorSpinorField*> *B;
219 
221  std::vector<ColorSpinorField*> *B_coarse;
222 
225 
228 
231 
234 
237 
240 
243 
246 
249 
252 
255 
256  public:
263 
268  virtual ~MG();
269 
273  void createSmoother();
274 
278  void destroySmoother();
279 
287  void reset();
288 
295  void verify();
296 
303 
308  void loadVectors(std::vector<ColorSpinorField*> &B);
309 
314  void saveVectors(std::vector<ColorSpinorField*> &B);
315 
320  void generateNullVectors(std::vector<ColorSpinorField*> B);
321 
325  double flops() const;
326 
327  };
328 
329  void ApplyCoarse(ColorSpinorField &out, const ColorSpinorField &inA, const ColorSpinorField &inB,
330  const GaugeField &Y, const GaugeField &X, double kappa, int parity = QUDA_INVALID_PARITY,
331  bool dslash=true, bool clover=true, bool dagger=false);
332 
350  void CoarseOp(GaugeField &Y, GaugeField &X, GaugeField &Xinv, GaugeField &Yhat, const Transfer &T,
351  const cudaGaugeField &gauge, const cudaCloverField *clover,
352  double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc);
353 
372  void CoarseCoarseOp(GaugeField &Y, GaugeField &X, GaugeField &Xinv, GaugeField &Yhat, const Transfer &T,
373  const GaugeField &gauge, const GaugeField &clover, const GaugeField &cloverInv,
374  double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc);
375 
386 
390 
391  std::vector<ColorSpinorField*> B;
392 
394 
395  MG *mg;
397 
399 
401  {
402  profile.TPSTART(QUDA_PROFILE_FREE);
403  if (mg) delete mg;
404 
405  if (mgParam) delete mgParam;
406 
407  for (unsigned int i=0; i<B.size(); i++) delete B[i];
408 
409  if (m) delete m;
410  if (mSmooth) delete mSmooth;
411  if (mSmoothSloppy) delete mSmoothSloppy;
412 
413  if (d) delete d;
414  if (dSmooth) delete dSmooth;
416  profile.TPSTOP(QUDA_PROFILE_FREE);
417  }
418  };
419 
420 } // namespace quda
421 
422 #endif // _MG_QUDA_H
DiracMatrix * matSmoothSloppy
Definition: multigrid.h:78
MG * fine
Definition: multigrid.h:200
QudaBoolean global_reduction
Definition: multigrid.h:69
QudaMultigridParam & mg_global
Definition: multigrid.h:30
SolverParam * param_coarse_solver
Definition: multigrid.h:215
double mu
Definition: test_util.cpp:1643
std::vector< ColorSpinorField * > & B
Definition: multigrid.h:54
MGParam * param_coarse
Definition: multigrid.h:206
QudaFieldLocation location
Definition: multigrid.h:91
void saveVectors(std::vector< ColorSpinorField *> &B)
Save the null space vectors in from file.
Definition: multigrid.cpp:708
MGParam(const MGParam &param, std::vector< ColorSpinorField *> &B, DiracMatrix *matResidual, DiracMatrix *matSmooth, DiracMatrix *matSmoothSloppy, int level=0)
Definition: multigrid.h:132
void verify()
Definition: multigrid.cpp:327
TimeProfile & profile_global
Definition: multigrid.h:185
void createSmoother()
Create the smoothers.
Definition: multigrid.cpp:213
ColorSpinorField * b_tilde
Definition: multigrid.h:227
void destroySmoother()
Free the smoothers.
Definition: multigrid.cpp:254
double mu_factor[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1659
enum QudaSolveType_s QudaSolveType
Dirac * diracCoarseSmoother
Definition: multigrid.h:242
DiracMatrix * matCoarseSmootherSloppy
Definition: multigrid.h:254
SolverParam * param_presmooth
Definition: multigrid.h:209
ColorSpinorField * r
Definition: multigrid.h:224
void reset()
Definition: multigrid.cpp:203
MGParam & param
Definition: multigrid.h:176
void loadVectors(std::vector< ColorSpinorField *> &B)
Load the null space vectors in from file.
Definition: multigrid.cpp:648
int spinBlockSize
Definition: multigrid.h:42
virtual ~multigrid_solver()
Definition: multigrid.h:400
QudaSolveType smoother_solve_type
Definition: multigrid.h:88
Solver * presmoother
Definition: multigrid.h:182
void operator()(ColorSpinorField &out, ColorSpinorField &in)
Definition: multigrid.cpp:530
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:251
ColorSpinorField * tmp_coarse
Definition: multigrid.h:236
VOLATILE spinorFloat kappa
SolverParam * param_postsmooth
Definition: multigrid.h:212
char prefix[128]
Definition: multigrid.h:191
multigrid_solver(QudaMultigridParam &mg_param, TimeProfile &profile)
QudaInverterType smoother
Definition: multigrid.h:81
cpuColorSpinorField * in
TimeProfile & profile
Definition: multigrid.h:396
enum QudaMatPCType_s QudaMatPCType
DiracMatrix * matSmooth
Definition: multigrid.h:75
int geoBlockSize[QUDA_MAX_DIM]
Definition: multigrid.h:39
Dirac * diracCoarseResidual
Definition: multigrid.h:239
enum QudaSolutionType_s QudaSolutionType
std::vector< ColorSpinorField * > * B_coarse
Definition: multigrid.h:221
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)
char coarse_prefix[128]
Definition: multigrid.h:194
ColorSpinorField * r_coarse
Definition: multigrid.h:230
void CoarseCoarseOp(GaugeField &Y, GaugeField &X, GaugeField &Xinv, GaugeField &Yhat, const Transfer &T, const GaugeField &gauge, const GaugeField &clover, const GaugeField &cloverInv, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc)
Coarse operator construction from an intermediate-grid operator (Coarse)
DiracMatrix * matCoarseResidual
Definition: multigrid.h:248
std::vector< ColorSpinorField * > * B
Definition: multigrid.h:218
Dirac * diracCoarseSmootherSloppy
Definition: multigrid.h:245
enum QudaBoolean_s QudaBoolean
char filename[100]
Definition: multigrid.h:94
MGParam(QudaMultigridParam &param, std::vector< ColorSpinorField *> &B, DiracMatrix *matResidual, DiracMatrix *matSmooth, DiracMatrix *matSmoothSloppy, int level=0)
Definition: multigrid.h:99
double smoother_tol
Definition: multigrid.h:63
enum QudaFieldLocation_s QudaFieldLocation
GaugeCovDev * dirac
Definition: covdev_test.cpp:75
cpuColorSpinorField * out
TimeProfile profile
Definition: multigrid.h:188
virtual ~MG()
Definition: multigrid.cpp:268
double flops() const
Return the total flops done on this and all coarser levels.
Definition: multigrid.cpp:303
enum QudaMultigridCycleType_s QudaMultigridCycleType
std::vector< ColorSpinorField * > B
Definition: multigrid.h:391
Transfer * transfer
Definition: multigrid.h:179
Solver * postsmoother
Definition: multigrid.h:182
void CoarseOp(GaugeField &Y, GaugeField &X, GaugeField &Xinv, GaugeField &Yhat, 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:170
#define QUDA_MAX_DIM
Maximum number of dimensions supported by QUDA. In practice, no routines make use of more than 5...
MG(MGParam &param, TimeProfile &profile)
Definition: multigrid.cpp:13
void generateNullVectors(std::vector< ColorSpinorField *> B)
Generate the null-space vectors.
Definition: multigrid.cpp:744
QudaSolutionType coarse_grid_solution_type
Definition: multigrid.h:85
MG * coarse
Definition: multigrid.h:197
QudaParity parity
Definition: covdev_test.cpp:53
Solver * coarse_solver
Definition: multigrid.h:203
QudaMultigridCycleType cycle_type
Definition: multigrid.h:66
enum QudaInverterType_s QudaInverterType
DiracMatrix * matResidual
Definition: multigrid.h:72
ColorSpinorField * x_coarse
Definition: multigrid.h:233
enum QudaDiracType_s QudaDiracType