QUDA  1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
deflated_invert_test.cpp
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <time.h>
4 #include <math.h>
5 #include <string.h>
6 #include <algorithm>
7 
8 #include <util_quda.h>
9 #include <test_util.h>
10 #include <dslash_util.h>
11 #include <blas_reference.h>
14 #include "misc.h"
15 
16 #if defined(QMP_COMMS)
17 #include <qmp.h>
18 #elif defined(MPI_COMMS)
19 #include <mpi.h>
20 #endif
21 
22 #include <qio_field.h>
23 
24 // In a typical application, quda.h is the only QUDA header required.
25 #include <quda.h>
26 
27 // Wilson, clover-improved Wilson, twisted mass, and domain wall are supported.
29 //extern bool tune;
30 extern int device;
31 extern int xdim;
32 extern int ydim;
33 extern int zdim;
34 extern int tdim;
35 extern int Lsdim;
36 extern int gridsize_from_cmdline[];
38 extern QudaPrecision prec;
45 extern double mass;
46 extern double kappa;
47 extern double mu;
48 extern double anisotropy;
49 extern double epsilon;
50 extern double tol; // tolerance for inverter
51 extern double tol_hq; // heavy-quark tolerance for inverter
52 extern char latfile[];
53 extern bool unit_gauge;
54 extern int Nsrc; // number of spinors to apply to simultaneously
55 extern int niter;
56 extern int nvec[];
57 
60 
63 
64 extern char eig_vec_infile[];
65 extern char eig_vec_outfile[];
66 
67 //Twisted mass flavor type
69 
70 extern void usage(char** );
71 
72 extern double clover_coeff;
73 extern bool compute_clover;
74 
75 extern int nev;
76 extern int max_search_dim;
77 extern int deflation_grid;
78 extern double tol_restart;
79 
80 extern int eigcg_max_restarts;
81 extern int max_restart_num;
82 extern double inc_tol;
83 extern double eigenval_tol;
84 
87 
90 
91 extern QudaMassNormalization normalization; // mass normalization of Dirac operators
93 
94 namespace quda {
95  extern void setTransferGPU(bool);
96 }
97 
98 void
100 {
101  printfQuda("running the following test:\n");
102 
103  printfQuda("prec prec_sloppy matpc_type recon recon_sloppy S_dimension T_dimension Ls_dimension dslash_type "
104  " normalization\n");
105  printfQuda("%6s %6s %12s %2s %2s %3d/%3d/%3d %3d %2d %14s %8s\n",
109 
110  printfQuda("Grid partition info: X Y Z T\n");
111  printfQuda(" %d %d %d %d\n", dimPartitioned(0), dimPartitioned(1), dimPartitioned(2),
112  dimPartitioned(3));
113 
114  printfQuda("Deflation space info: location mem_type\n");
117 
118  return ;
119 }
120 
127 
129  gauge_param.X[0] = xdim;
130  gauge_param.X[1] = ydim;
131  gauge_param.X[2] = zdim;
132  gauge_param.X[3] = tdim;
133 
134  gauge_param.anisotropy = anisotropy;
135  gauge_param.type = QUDA_WILSON_LINKS;
136  gauge_param.gauge_order = QUDA_QDP_GAUGE_ORDER;
137  gauge_param.t_boundary = QUDA_PERIODIC_T;
138 
139  gauge_param.cpu_prec = cpu_prec;
140 
141  gauge_param.cuda_prec = cuda_prec;
142  gauge_param.reconstruct = link_recon;
143 
144  gauge_param.cuda_prec_sloppy = cuda_prec_sloppy;
146 
149 
152 
153  gauge_param.gauge_fix = QUDA_GAUGE_FIXED_NO;
154 
155  gauge_param.ga_pad = 0;
156  // For multi-GPU, ga_pad must be large enough to store a time-slice
157 #ifdef MULTI_GPU
158  int x_face_size = gauge_param.X[1]*gauge_param.X[2]*gauge_param.X[3]/2;
159  int y_face_size = gauge_param.X[0]*gauge_param.X[2]*gauge_param.X[3]/2;
160  int z_face_size = gauge_param.X[0]*gauge_param.X[1]*gauge_param.X[3]/2;
161  int t_face_size = gauge_param.X[0]*gauge_param.X[1]*gauge_param.X[2]/2;
162  int pad_size =std::max(x_face_size, y_face_size);
163  pad_size = std::max(pad_size, z_face_size);
164  pad_size = std::max(pad_size, t_face_size);
165  gauge_param.ga_pad = pad_size;
166 #endif
167 }
168 
169 
171  inv_param.Ls = 1;
172 
173  inv_param.sp_pad = 0;
174  inv_param.cl_pad = 0;
175 
176  inv_param.cpu_prec = cpu_prec;
177  inv_param.cuda_prec = cuda_prec;
180 
184  inv_param.dirac_order = QUDA_DIRAC_ORDER;
185 
187  inv_param.clover_cpu_prec = cpu_prec;
188  inv_param.clover_cuda_prec = cuda_prec;
192  }
193 
196 
197 // inv_param.tune = tune ? QUDA_TUNE_YES : QUDA_TUNE_NO;
198 
199  inv_param.dslash_type = dslash_type;
200 
201  if (kappa == -1.0) {
202  inv_param.mass = mass;
203  inv_param.kappa = 1.0 / (2.0 * (1 + 3/anisotropy + mass));
204  } else {
205  inv_param.kappa = kappa;
206  inv_param.mass = 0.5/kappa - (1 + 3/anisotropy);
207  }
208 
210  inv_param.mu = mu;
211  inv_param.twist_flavor = twist_flavor;
212  inv_param.Ls = (inv_param.twist_flavor == QUDA_TWIST_NONDEG_DOUBLET) ? 2 : 1;
213 
215  printfQuda("Twisted-mass doublet non supported (yet)\n");
216  exit(0);
217  }
218  }
219 
220  inv_param.clover_coeff = clover_coeff;
221 
222  inv_param.dagger = QUDA_DAG_NO;
223  inv_param.mass_normalization = normalization;
224 
225  // do we want full solution or single-parity solution
226  inv_param.solution_type = QUDA_MAT_SOLUTION;
227  // inv_param.solution_type = QUDA_MATPC_SOLUTION;
228 
229  // do we want to use an even-odd preconditioned solve or not
230  inv_param.solve_type = solve_type;
231  inv_param.matpc_type = matpc_type;
232 
234  errorQuda("Unknown deflated solver type %d.", inv_type);
235 
237  inv_param.inv_type = inv_type;
238  inv_param.tol = tol;
239  inv_param.tol_hq = tol_hq; // specify a tolerance for the residual for heavy quark residual
240 
241  inv_param.rhs_idx = 0;
242 
243  inv_param.nev = nev;
244  inv_param.max_search_dim = max_search_dim;
245  inv_param.deflation_grid = deflation_grid;
246  inv_param.tol_restart = tol_restart;
248  inv_param.max_restart_num = max_restart_num;
249  inv_param.inc_tol = inc_tol;
250  inv_param.eigenval_tol = eigenval_tol;
251 
252 
253  if(inv_param.inv_type == QUDA_EIGCG_INVERTER || inv_param.inv_type == QUDA_INC_EIGCG_INVERTER ){
254  inv_param.solve_type = QUDA_NORMOP_PC_SOLVE;
255  }else if(inv_param.inv_type == QUDA_GMRESDR_INVERTER) {
256  inv_param.solve_type = QUDA_DIRECT_PC_SOLVE;
257  inv_param.tol_restart = 0.0;//restart is not requested...
258  }
259 
260  inv_param.cuda_prec_ritz = cuda_prec_ritz;
261  inv_param.verbosity = verbosity;
262  inv_param.verbosity_precondition = verbosity;
263 
265  inv_param.gcrNkrylov = 6;
266 
267  // require both L2 relative and heavy quark residual to determine convergence
268  inv_param.residual_type = static_cast<QudaResidualType>(QUDA_L2_RELATIVE_RESIDUAL);
269  // these can be set individually
270  for (int i=0; i<inv_param.num_offset; i++) {
271  inv_param.tol_offset[i] = inv_param.tol;
272  inv_param.tol_hq_offset[i] = inv_param.tol_hq;
273  }
274  inv_param.maxiter = niter;
275  inv_param.reliable_delta = 1e-1;
276 
277  // domain decomposition preconditioner parameters
279  inv_param.precondition_cycle = 1;
280  inv_param.tol_precondition = 1e-2;
281  inv_param.maxiter_precondition = 10;
282  inv_param.omega = 1.0;
283 
284  inv_param.extlib_type = solver_ext_lib;
285 }
286 
288 
290  df_param.run_verify = QUDA_BOOLEAN_FALSE;
291 
292  df_param.nk = df_param.invert_param->nev;
293  df_param.np = df_param.invert_param->nev*df_param.invert_param->deflation_grid;
294  df_param.extlib_type = deflation_ext_lib;
295 
296  df_param.cuda_prec_ritz = prec_ritz;
297  df_param.location = location_ritz;
298  df_param.mem_type_ritz = mem_type_ritz;
299 
300  // set file i/o parameters
301  strcpy(df_param.vec_infile, eig_vec_infile);
302  strcpy(df_param.vec_outfile, eig_vec_outfile);
303 }
304 
305 int main(int argc, char **argv)
306 {
307 
308  for (int i = 1; i < argc; i++){
309  if(process_command_line_option(argc, argv, &i) == 0){
310  continue;
311  }
312  printf("ERROR: Invalid option:%s\n", argv[i]);
313  usage(argv);
314  }
315 
322 
323  // initialize QMP/MPI, QUDA comms grid and RNG (test_util.cpp)
324  initComms(argc, argv, gridsize_from_cmdline);
325 
326  // call srand() with a rank-dependent seed
327  initRand();
328 
330 
331  // *** QUDA parameters begin here.
332 
337  printfQuda("dslash_type %d not supported\n", dslash_type);
338  exit(0);
339  }
340 
342  setGaugeParam(gauge_param);
343 
344 
346  setInvertParam(inv_param);
347 
348  double kappa5 = 0.0;
349 
351  inv_param.epsilon = epsilon;
352  inv_param.twist_flavor = twist_flavor;
353  inv_param.Ls = (inv_param.twist_flavor == QUDA_TWIST_NONDEG_DOUBLET) ? 2 : 1;
356  inv_param.m5 = -1.8;
357  kappa5 = 0.5 / (5 + inv_param.m5);
358  inv_param.Ls = Lsdim;
359  for (int k = 0; k < Lsdim; k++) // for mobius only
360  {
361  // b5[k], c[k] values are chosen for arbitrary values,
362  // but the difference of them are same as 1.0
363  inv_param.b_5[k] = 1.452;
364  inv_param.c_5[k] = 0.452;
365  }
366  }
367 
368  QudaEigParam df_param = newQudaEigParam();
369  df_param.invert_param = &inv_param;
370  setDeflationParam(df_param);
371 
372  // *** Everything between here and the call to initQuda() is
373  // *** application-specific.
374 
375  // set parameters for the reference Dslash, and prepare fields to be loaded
378  dw_setDims(gauge_param.X, inv_param.Ls);
379  } else {
380  setDims(gauge_param.X);
381  }
382 
383  setSpinorSiteSize(24);
384 
385  size_t gSize = (gauge_param.cpu_prec == QUDA_DOUBLE_PRECISION) ? sizeof(double) : sizeof(float);
386  size_t sSize = (inv_param.cpu_prec == QUDA_DOUBLE_PRECISION) ? sizeof(double) : sizeof(float);
387 
388  void *gauge[4], *clover=0, *clover_inv=0;
389 
390  for (int dir = 0; dir < 4; dir++) {
391  gauge[dir] = malloc(V*gaugeSiteSize*gSize);
392  }
393 
394  if (strcmp(latfile,"")) { // load in the command line supplied gauge field
395  read_gauge_field(latfile, gauge, gauge_param.cpu_prec, gauge_param.X, argc, argv);
396  construct_gauge_field(gauge, 2, gauge_param.cpu_prec, &gauge_param);
397  } else { // else generate an SU(3) field
398  if (unit_gauge) {
399  // unit SU(3) field
400  construct_gauge_field(gauge, 0, gauge_param.cpu_prec, &gauge_param);
401  } else {
402  // random SU(3) field
403  construct_gauge_field(gauge, 1, gauge_param.cpu_prec, &gauge_param);
404  }
405  }
406 
408  double norm = 0.1; // clover components are random numbers in the range (-norm, norm)
409  double diag = 1.0; // constant added to the diagonal
410 
411  size_t cSize = inv_param.clover_cpu_prec;
412  clover = malloc(V*cloverSiteSize*cSize);
413  clover_inv = malloc(V*cloverSiteSize*cSize);
414  if (!compute_clover) construct_clover_field(clover, norm, diag, inv_param.clover_cpu_prec);
415 
416  inv_param.compute_clover = compute_clover;
417  if (compute_clover) inv_param.return_clover = 1;
418  inv_param.compute_clover_inverse = 1;
419  inv_param.return_clover_inverse = 1;
420  }
421 
422  void *spinorIn = malloc(V*spinorSiteSize*sSize*inv_param.Ls);
423  void *spinorCheck = malloc(V*spinorSiteSize*sSize*inv_param.Ls);
424 
425  void *spinorOut = NULL;
426  spinorOut = malloc(V*spinorSiteSize*sSize*inv_param.Ls);
427 
428  // start the timer
429  double time0 = -((double)clock());
430 
431  // initialize the QUDA library
432  initQuda(device);
433 
434  // load the gauge field
435  loadGaugeQuda((void*)gauge, &gauge_param);
436 
437  // this line ensure that if we need to construct the clover inverse (in either the smoother or the solver) we do so
438  if (dslash_type == QUDA_CLOVER_WILSON_DSLASH || dslash_type == QUDA_TWISTED_CLOVER_DSLASH) loadCloverQuda(clover, clover_inv, &inv_param);
439 
440  void *df_preconditioner = newDeflationQuda(&df_param);
441  inv_param.deflation_op = df_preconditioner;
442 
443  for (int i=0; i<Nsrc; i++) {
444  // create a point source at 0 (in each subvolume... FIXME)
445  memset(spinorIn, 0, inv_param.Ls*V*spinorSiteSize*sSize);
446  memset(spinorCheck, 0, inv_param.Ls*V*spinorSiteSize*sSize);
447  memset(spinorOut, 0, inv_param.Ls*V*spinorSiteSize*sSize);
448 
449  if (inv_param.cpu_prec == QUDA_SINGLE_PRECISION) {
450  //((float*)spinorIn)[i] = 1.0;
451  for (int i=0; i<inv_param.Ls*V*spinorSiteSize; i++) ((float*)spinorIn)[i] = rand() / (float)RAND_MAX;
452  } else {
453  //((double*)spinorIn)[i] = 1.0;
454  for (int i=0; i<inv_param.Ls*V*spinorSiteSize; i++) ((double*)spinorIn)[i] = rand() / (double)RAND_MAX;
455  }
456 
457  invertQuda(spinorOut, spinorIn, &inv_param);
458  printfQuda("\nDone for %d rhs.\n", inv_param.rhs_idx);
459  }
460 
461  destroyDeflationQuda(df_preconditioner);
462 
463  // stop the timer
464  time0 += clock();
465  time0 /= CLOCKS_PER_SEC;
466 
467  // printfQuda("\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
468  // inv_param.iter, inv_param.secs, inv_param.gflops/inv_param.secs, time0);
469  printfQuda("\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n", inv_param.iter, inv_param.secs,
470  inv_param.gflops / inv_param.secs, 0.0);
471 
472  if (inv_param.solution_type == QUDA_MAT_SOLUTION) {
473 
475  wil_mat(spinorCheck, gauge, spinorOut, inv_param.kappa, 0, inv_param.cpu_prec, gauge_param);
476 
477  } else if (dslash_type == QUDA_DOMAIN_WALL_DSLASH) {
478  dw_mat(spinorCheck, gauge, spinorOut, kappa5, inv_param.dagger, inv_param.cpu_prec, gauge_param, inv_param.mass);
479  } else if (dslash_type == QUDA_DOMAIN_WALL_4D_DSLASH) {
480  dw_4d_mat(spinorCheck, gauge, spinorOut, kappa5, inv_param.dagger, inv_param.cpu_prec, gauge_param, inv_param.mass);
481  } else if (dslash_type == QUDA_MOBIUS_DWF_DSLASH) {
482  double _Complex *kappa_b = (double _Complex *)malloc(Lsdim * sizeof(double _Complex));
483  double _Complex *kappa_c = (double _Complex *)malloc(Lsdim * sizeof(double _Complex));
484  for (int xs = 0; xs < Lsdim; xs++) {
485  kappa_b[xs] = 1.0 / (2 * (inv_param.b_5[xs] * (4.0 + inv_param.m5) + 1.0));
486  kappa_c[xs] = 1.0 / (2 * (inv_param.c_5[xs] * (4.0 + inv_param.m5) - 1.0));
487  }
488  mdw_mat(spinorCheck, gauge, spinorOut, kappa_b, kappa_c, inv_param.dagger, inv_param.cpu_prec, gauge_param,
489  inv_param.mass, inv_param.b_5, inv_param.c_5);
490  free(kappa_b);
491  free(kappa_c);
492  } else {
494  if(inv_param.twist_flavor == QUDA_TWIST_SINGLET) {
495  tm_mat(spinorCheck, gauge, spinorOut, inv_param.kappa, inv_param.mu, inv_param.twist_flavor, 0, inv_param.cpu_prec, gauge_param);
496  } else {
497  printfQuda("Unsupported dslash_type\n");
498  exit(-1);
499  }
500  }
501  }
502 
503  if (inv_param.mass_normalization == QUDA_MASS_NORMALIZATION) {
506  ax(0.5 / kappa5, spinorCheck, V * spinorSiteSize * inv_param.Ls, inv_param.cpu_prec);
508  ax(0.5 / inv_param.kappa, spinorCheck, 2 * V * spinorSiteSize, inv_param.cpu_prec);
509  } else {
510  ax(0.5 / inv_param.kappa, spinorCheck, V * spinorSiteSize, inv_param.cpu_prec);
511  }
512  }
513 
514  } else if(inv_param.solution_type == QUDA_MATPC_SOLUTION) {
515 
517  wil_matpc(spinorCheck, gauge, spinorOut, inv_param.kappa, inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param);
518  } else if (dslash_type == QUDA_DOMAIN_WALL_DSLASH) {
519  dw_matpc(spinorCheck, gauge, spinorOut, kappa5, inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param,
520  inv_param.mass);
521  } else if (dslash_type == QUDA_DOMAIN_WALL_4D_DSLASH) {
522  dw_4d_matpc(spinorCheck, gauge, spinorOut, kappa5, inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param,
523  inv_param.mass);
524  } else if (dslash_type == QUDA_MOBIUS_DWF_DSLASH) {
525  double _Complex *kappa_b = (double _Complex *)malloc(Lsdim * sizeof(double _Complex));
526  double _Complex *kappa_c = (double _Complex *)malloc(Lsdim * sizeof(double _Complex));
527  for (int xs = 0; xs < Lsdim; xs++) {
528  kappa_b[xs] = 1.0 / (2 * (inv_param.b_5[xs] * (4.0 + inv_param.m5) + 1.0));
529  kappa_c[xs] = 1.0 / (2 * (inv_param.c_5[xs] * (4.0 + inv_param.m5) - 1.0));
530  }
531  mdw_matpc(spinorCheck, gauge, spinorOut, kappa_b, kappa_c, inv_param.matpc_type, 0, inv_param.cpu_prec,
532  gauge_param, inv_param.mass, inv_param.b_5, inv_param.c_5);
533  free(kappa_b);
534  free(kappa_c);
535  } else {
537  if (inv_param.twist_flavor == QUDA_TWIST_SINGLET) {
538  tm_matpc(spinorCheck, gauge, spinorOut, inv_param.kappa, inv_param.mu, inv_param.twist_flavor,
539  inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param);
540  } else {
541  printfQuda("Unsupported dslash_type\n");
542  exit(-1);
543  }
544  }
545  }
546 
547  if (inv_param.mass_normalization == QUDA_MASS_NORMALIZATION) {
550  ax(0.25 / (kappa5 * kappa5), spinorCheck, V * spinorSiteSize * inv_param.Ls, inv_param.cpu_prec);
551  } else {
552  ax(0.25 / (inv_param.kappa * inv_param.kappa), spinorCheck, Vh * spinorSiteSize, inv_param.cpu_prec);
553  }
554  }
555  }
556 
557  int vol = inv_param.solution_type == QUDA_MAT_SOLUTION ? V : Vh;
558  mxpy(spinorIn, spinorCheck, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
559  double nrm2 = norm_2(spinorCheck, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
560  double src2 = norm_2(spinorIn, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
561  double l2r = sqrt(nrm2 / src2);
562 
563  printfQuda("Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
564  inv_param.tol, inv_param.true_res, l2r, inv_param.tol_hq, inv_param.true_res_hq);
565 
566 
567  freeGaugeQuda();
569 
570  // finalize the QUDA library
571  endQuda();
572 
573  // finalize the communications layer
574  finalizeComms();
575 
577  if (clover) free(clover);
578  if (clover_inv) free(clover_inv);
579  }
580 
581  for (int dir = 0; dir<4; dir++) free(gauge[dir]);
582 
583  return 0;
584 }
int maxiter_precondition
Definition: quda.h:292
int niter
Definition: test_util.cpp:1629
QudaReconstructType link_recon
Definition: test_util.cpp:1605
static size_t gSize
double secs
Definition: quda.h:251
int dimPartitioned(int dim)
Definition: test_util.cpp:1776
QudaDiracFieldOrder dirac_order
Definition: quda.h:219
int deflation_grid
Definition: test_util.cpp:1709
QudaMassNormalization mass_normalization
Definition: quda.h:208
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:182
enum QudaMassNormalization_s QudaMassNormalization
QudaReconstructType reconstruct_sloppy
Definition: quda.h:53
double anisotropy
Definition: quda.h:38
void freeCloverQuda(void)
void mdw_matpc(void *out, void **gauge, void *in, double _Complex *kappa_b, double _Complex *kappa_c, QudaMatPCType matpc_type, int dagger, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm, double _Complex *b5, double _Complex *c5)
void dw_4d_matpc(void *out, void **gauge, void *in, double kappa, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
void endQuda(void)
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
Definition: test_util.cpp:1047
double mu
Definition: test_util.cpp:1648
QudaSolveType solve_type
Definition: quda.h:205
QudaVerbosity verbosity_precondition
Definition: quda.h:286
enum QudaPrecision_s QudaPrecision
double tol_hq
Definition: test_util.cpp:1657
int ga_pad
Definition: quda.h:63
double_complex c_5[QUDA_MAX_DWF_LS]
Definition: quda.h:112
void destroyDeflationQuda(void *df_instance)
void mdw_mat(void *out, void **gauge, void *in, double _Complex *kappa_b, double _Complex *kappa_c, int dagger, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm, double _Complex *b5, double _Complex *c5)
void dw_setDims(int *X, const int L5)
Definition: test_util.cpp:187
QudaExtLibType extlib_type
Definition: quda.h:371
int Lsdim
Definition: test_util.cpp:1619
double mu
Definition: quda.h:114
QudaSolveType solve_type
Definition: test_util.cpp:1663
QudaGaugeFixed gauge_fix
Definition: quda.h:61
QudaSchwarzType schwarz_type
Definition: quda.h:310
__host__ __device__ ValueType norm(const complex< ValueType > &z)
Returns the magnitude of z squared.
double eigenval_tol
Definition: test_util.cpp:1715
void tm_mat(void *out, void **gauge, void *in, double kappa, double mu, QudaTwistFlavorType flavor, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaVerbosity verbosity
Definition: test_util.cpp:1614
enum QudaResidualType_s QudaResidualType
double tol_restart
Definition: test_util.cpp:1710
QudaInverterType inv_type_precondition
Definition: quda.h:270
QudaDslashType dslash_type
Definition: test_util.cpp:1621
double kappa
Definition: test_util.cpp:1647
QudaLinkType type
Definition: quda.h:42
double kappa
Definition: quda.h:106
QudaPrecision cuda_prec_ritz
Definition: quda.h:324
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
#define errorQuda(...)
Definition: util_quda.h:121
double tol
Definition: quda.h:121
QudaDslashType dslash_type
Definition: quda.h:102
int zdim
Definition: test_util.cpp:1617
QudaReconstructType reconstruct_precondition
Definition: quda.h:59
QudaInverterType inv_type
Definition: quda.h:103
QudaPrecision cuda_prec
Definition: quda.h:214
#define cloverSiteSize
Definition: test_util.h:9
int return_clover_inverse
Definition: quda.h:242
void setGaugeParam(QudaGaugeParam &gauge_param)
const char * get_memory_type_str(QudaMemoryType type)
Definition: misc.cpp:1523
enum QudaSolveType_s QudaSolveType
__host__ __device__ ValueType sqrt(ValueType x)
Definition: complex_quda.h:120
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
QudaExtLibType deflation_ext_lib
Definition: test_util.cpp:1718
double epsilon
Definition: test_util.cpp:1649
QudaPrecision cpu_prec
Definition: quda.h:213
void setDeflationParam(QudaEigParam &df_param)
QudaPrecision prec
Definition: test_util.cpp:1608
int process_command_line_option(int argc, char **argv, int *idx)
Definition: test_util.cpp:2019
double inc_tol
Definition: test_util.cpp:1714
bool compute_clover
Definition: test_util.cpp:1654
int ydim
Definition: test_util.cpp:1616
QudaDagType dagger
Definition: quda.h:207
QudaPrecision & cuda_prec_refinement_sloppy
const char * get_matpc_str(QudaMatPCType type)
Definition: misc.cpp:1121
void finalizeComms()
Definition: test_util.cpp:128
double anisotropy
Definition: test_util.cpp:1650
QudaGaugeParam gauge_param
QudaPrecision cuda_prec_refinement_sloppy
Definition: quda.h:216
const char * get_ritz_location_str(QudaFieldLocation type)
Definition: misc.cpp:1491
QudaGaugeFieldOrder gauge_order
Definition: quda.h:43
void dw_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
double true_res
Definition: quda.h:126
void tm_matpc(void *outEven, void **gauge, void *inEven, double kappa, double mu, QudaTwistFlavorType flavor, QudaMatPCType matpc_type, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
const char * get_prec_str(QudaPrecision prec)
Definition: misc.cpp:701
void loadCloverQuda(void *h_clover, void *h_clovinv, QudaInvertParam *inv_param)
QudaPrecision & cuda_prec_precondition
int return_clover
Definition: quda.h:241
#define spinorSiteSize
QudaPrecision clover_cuda_prec_sloppy
Definition: quda.h:226
void setDims(int *)
Definition: test_util.cpp:151
QudaFieldLocation input_location
Definition: quda.h:99
void freeGaugeQuda(void)
QudaInverterType inv_type
Definition: test_util.cpp:1640
double reliable_delta
Definition: quda.h:129
QudaPrecision prec_sloppy
Definition: test_util.cpp:1609
double_complex b_5[QUDA_MAX_DWF_LS]
Definition: quda.h:111
void setInvertParam(QudaInvertParam &inv_param)
QudaSolutionType solution_type
Definition: quda.h:204
QudaPrecision & cuda_prec_ritz
QudaMemoryType mem_type_ritz
Definition: quda.h:450
QudaPrecision clover_cuda_prec
Definition: quda.h:225
int precondition_cycle
Definition: quda.h:307
QudaInvertParam * invert_param
Definition: quda.h:381
void initQuda(int device)
void dw_matpc(void *out, void **gauge, void *in, double kappa, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
void ax(const double &a, GaugeField &u)
Scale the gauge field by the scalar a.
double tol
Definition: test_util.cpp:1656
QudaFieldLocation output_location
Definition: quda.h:100
QudaPrecision clover_cuda_prec_precondition
Definition: quda.h:228
QudaInvertParam inv_param
Definition: covdev_test.cpp:37
QudaPrecision & cuda_prec_sloppy
QudaMassNormalization normalization
Definition: test_util.cpp:1661
QudaBoolean run_verify
Definition: quda.h:456
void setTransferGPU(bool)
double m5
Definition: quda.h:108
void * newDeflationQuda(QudaEigParam *param)
QudaPrecision prec_refinement_sloppy
Definition: test_util.cpp:1610
QudaPrecision cuda_prec_sloppy
Definition: quda.h:215
QudaVerbosity verbosity
Definition: quda.h:244
void setSpinorSiteSize(int n)
Definition: test_util.cpp:211
const char * get_mass_normalization_str(QudaMassNormalization type)
Definition: misc.cpp:1077
double tol_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:179
QudaInvertParam newQudaInvertParam(void)
double gflops
Definition: quda.h:250
int eigcg_max_restarts
Definition: quda.h:340
const char * get_recon_str(QudaReconstructType recon)
Definition: misc.cpp:768
QudaPrecision cuda_prec_precondition
Definition: quda.h:58
QudaCloverFieldOrder clover_order
Definition: quda.h:230
void dw_4d_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
int max_search_dim
Definition: test_util.cpp:1708
double tol_hq
Definition: quda.h:123
enum QudaMatPCType_s QudaMatPCType
cpuColorSpinorField * spinorOut
Definition: covdev_test.cpp:41
int main(int argc, char **argv)
double true_res_hq
Definition: quda.h:127
QudaGammaBasis gamma_basis
Definition: quda.h:221
QudaPrecision & cpu_prec
QudaPrecision cuda_prec_sloppy
Definition: quda.h:52
int max_search_dim
Definition: quda.h:332
const char * get_dslash_str(QudaDslashType type)
Definition: misc.cpp:910
int eigcg_max_restarts
Definition: test_util.cpp:1712
double tol_precondition
Definition: quda.h:289
QudaReconstructType link_recon_precondition
Definition: test_util.cpp:1607
int max_restart_num
Definition: test_util.cpp:1713
double mass
Definition: test_util.cpp:1646
QudaReconstructType reconstruct
Definition: quda.h:50
QudaPrecision cuda_prec
Definition: quda.h:49
QudaMatPCType matpc_type
Definition: test_util.cpp:1662
int X[4]
Definition: quda.h:36
double mass
Definition: quda.h:105
QudaBoolean import_vectors
Definition: quda.h:444
QudaExtLibType solver_ext_lib
Definition: test_util.cpp:1717
QudaFieldLocation location
Definition: quda.h:453
int gcrNkrylov
Definition: quda.h:259
QudaPrecision cuda_prec_refinement_sloppy
Definition: quda.h:55
int V
Definition: test_util.cpp:27
double norm_2(void *v, int len, QudaPrecision precision)
int compute_clover_inverse
Definition: quda.h:240
QudaPrecision prec_precondition
Definition: test_util.cpp:1611
void * memset(void *s, int c, size_t n)
void construct_clover_field(void *clover, double norm, double diag, QudaPrecision precision)
Definition: test_util.cpp:1167
QudaPrecision & cuda_prec
char vec_outfile[256]
Definition: quda.h:462
enum QudaFieldLocation_s QudaFieldLocation
void usage(char **)
Definition: test_util.cpp:1783
int Nsrc
Definition: test_util.cpp:1627
void wil_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaPrecision cuda_prec_precondition
Definition: quda.h:217
int deflation_grid
Definition: quda.h:336
QudaPrecision prec_ritz
Definition: test_util.cpp:1613
double tol_restart
Definition: quda.h:122
double clover_coeff
Definition: test_util.cpp:1653
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
int xdim
Definition: test_util.cpp:1615
int nev
Definition: test_util.cpp:1707
int device
Definition: test_util.cpp:1602
void initRand()
Definition: test_util.cpp:138
char eig_vec_outfile[]
Definition: test_util.cpp:1743
char latfile[]
Definition: test_util.cpp:1623
QudaExtLibType extlib_type
Definition: quda.h:471
QudaMemoryType mem_type_ritz
Definition: test_util.cpp:1720
#define printfQuda(...)
Definition: util_quda.h:115
QudaInverterType precon_type
Definition: test_util.cpp:1641
QudaTboundary t_boundary
Definition: quda.h:45
char eig_vec_infile[]
Definition: test_util.cpp:1742
QudaTwistFlavorType twist_flavor
Definition: quda.h:117
int nvec[]
Definition: test_util.cpp:1637
int max_restart_num
Definition: quda.h:342
enum QudaDslashType_s QudaDslashType
QudaTwistFlavorType twist_flavor
Definition: test_util.cpp:1660
QudaFieldLocation location_ritz
Definition: test_util.cpp:1719
void mxpy(ColorSpinorField &x, ColorSpinorField &y)
Definition: blas_quda.h:34
QudaResidualType residual_type
Definition: quda.h:320
int gridsize_from_cmdline[]
Definition: test_util.cpp:49
void wil_matpc(void *outEven, void **gauge, void *inEven, double kappa, QudaMatPCType matpc_type, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
double inc_tol
Definition: quda.h:344
int num_offset
Definition: quda.h:169
enum QudaVerbosity_s QudaVerbosity
int compute_clover
Definition: quda.h:239
int tdim
Definition: test_util.cpp:1618
double epsilon
Definition: quda.h:115
double omega
Definition: quda.h:295
void display_test_info()
void initComms(int argc, char **argv, int *const commDims)
Definition: test_util.cpp:88
void read_gauge_field(const char *filename, void *gauge[], QudaPrecision prec, const int *X, int argc, char *argv[])
Definition: qio_field.h:14
void * deflation_op
Definition: quda.h:276
double eigenval_tol
Definition: quda.h:338
QudaPrecision clover_cpu_prec
Definition: quda.h:224
QudaPrecision cuda_prec_ritz
Definition: quda.h:447
QudaMatPCType matpc_type
Definition: quda.h:206
QudaEigParam newQudaEigParam(void)
char vec_infile[256]
Definition: quda.h:459
enum QudaInverterType_s QudaInverterType
enum QudaMemoryType_s QudaMemoryType
double kappa5
QudaReconstructType reconstruct_refinement_sloppy
Definition: quda.h:56
QudaPrecision cpu_prec
Definition: quda.h:47
enum QudaExtLibType_s QudaExtLibType
#define gaugeSiteSize
Definition: face_gauge.cpp:34
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source
Definition: quda.h:211
bool unit_gauge
Definition: test_util.cpp:1624
double clover_coeff
Definition: quda.h:233
int Vh
Definition: test_util.cpp:28
enum QudaTwistFlavorType_s QudaTwistFlavorType
QudaReconstructType link_recon_sloppy
Definition: test_util.cpp:1606