QUDA  1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
multigrid_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 <limits>
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 #include <qio_field.h>
17 #include <color_spinor_field.h>
18 
19 #define MAX(a,b) ((a)>(b)?(a):(b))
20 
21 // In a typical application, quda.h is the only QUDA header required.
22 #include <quda.h>
23 
24 // Wilson, clover-improved Wilson, twisted mass, and domain wall are supported.
26 extern int device;
27 extern int xdim;
28 extern int ydim;
29 extern int zdim;
30 extern int tdim;
31 extern int Lsdim;
32 extern int gridsize_from_cmdline[];
34 extern QudaPrecision prec;
40 extern double mass;
41 extern double kappa; // kappa of Dirac operator
42 extern double mu;
43 extern double epsilon;
44 extern double anisotropy;
45 extern double tol; // tolerance for inverter
46 extern double tol_hq; // heavy-quark tolerance for inverter
47 extern double reliable_delta;
48 extern char latfile[];
49 extern bool unit_gauge;
50 extern int Nsrc; // number of spinors to apply to simultaneously
51 extern int niter;
52 extern int gcrNkrylov; // number of inner iterations for GCR, or l for BiCGstab-l
53 extern int pipeline; // length of pipeline for fused operations in GCR or BiCGstab-l
54 extern int nvec[];
55 extern int mg_levels;
56 
57 extern bool generate_nullspace;
58 extern bool generate_all_levels;
59 extern int nu_pre[QUDA_MAX_MG_LEVEL];
60 extern int nu_post[QUDA_MAX_MG_LEVEL];
62 extern QudaSolveType coarse_solve_type[QUDA_MAX_MG_LEVEL]; // type of solve to use in the smoothing on each level
63 extern QudaSolveType smoother_solve_type[QUDA_MAX_MG_LEVEL]; // type of solve to use in the smoothing on each level
65 extern double mu_factor[QUDA_MAX_MG_LEVEL];
66 
68 
71 
74 extern double setup_tol[QUDA_MAX_MG_LEVEL];
80 
82 extern bool pre_orthonormalize;
83 extern bool post_orthonormalize;
84 extern double omega;
92 
93 extern double smoother_tol[QUDA_MAX_MG_LEVEL];
95 
99 
102 
103 extern char mg_vec_infile[QUDA_MAX_MG_LEVEL][256];
104 extern char mg_vec_outfile[QUDA_MAX_MG_LEVEL][256];
105 
106 //Twisted mass flavor type
108 
109 extern void usage(char** );
110 
111 extern double clover_coeff;
112 extern bool compute_clover;
113 
114 extern bool verify_results;
115 
116 // Eigensolver params for MG
117 extern bool low_mode_check;
118 extern bool oblique_proj_check;
119 
120 // The coarsest grid params are for deflation,
121 // all others are for PR vectors.
122 extern bool mg_eig[QUDA_MAX_MG_LEVEL];
123 extern int mg_eig_nEv[QUDA_MAX_MG_LEVEL];
124 extern int mg_eig_nKr[QUDA_MAX_MG_LEVEL];
128 extern double mg_eig_tol[QUDA_MAX_MG_LEVEL];
131 extern double mg_eig_amin[QUDA_MAX_MG_LEVEL];
132 extern double mg_eig_amax[QUDA_MAX_MG_LEVEL];
137 extern bool mg_eig_coarse_guess;
138 
139 extern char eig_QUDA_logfile[];
140 
141 namespace quda {
142  extern void setTransferGPU(bool);
143 }
144 
145 void
147 {
148  printfQuda("running the following test:\n");
149 
150  printfQuda("prec sloppy_prec link_recon sloppy_link_recon S_dimension T_dimension Ls_dimension\n");
151  printfQuda("%s %s %s %s %d/%d/%d %d %d\n", get_prec_str(prec),
153  tdim, Lsdim);
154 
155  printfQuda("MG parameters\n");
156  printfQuda(" - number of levels %d\n", mg_levels);
157  for (int i=0; i<mg_levels-1; i++) {
158  printfQuda(" - level %d number of null-space vectors %d\n", i+1, nvec[i]);
159  printfQuda(" - level %d number of pre-smoother applications %d\n", i+1, nu_pre[i]);
160  printfQuda(" - level %d number of post-smoother applications %d\n", i+1, nu_post[i]);
161  }
162 
163  printfQuda("Outer solver paramers\n");
164  printfQuda(" - pipeline = %d\n", pipeline);
165 
166  printfQuda("Eigensolver parameters\n");
167  for (int i = 0; i < mg_levels; i++) {
168  if (low_mode_check || mg_eig[i]) {
169  printfQuda(" - level %d solver mode %s\n", i + 1, get_eig_type_str(mg_eig_type[i]));
170  printfQuda(" - level %d spectrum requested %s\n", i + 1, get_eig_spectrum_str(mg_eig_spectrum[i]));
171  printfQuda(" - level %d number of eigenvectors requested nConv %d\n", i + 1, nvec[i]);
172  printfQuda(" - level %d size of eigenvector search space %d\n", i + 1, mg_eig_nEv[i]);
173  printfQuda(" - level %d size of Krylov space %d\n", i + 1, mg_eig_nKr[i]);
174  printfQuda(" - level %d solver tolerance %e\n", i + 1, mg_eig_tol[i]);
175  printfQuda(" - level %d convergence required (%s)\n", i + 1, mg_eig_require_convergence[i] ? "true" : "false");
176  printfQuda(" - level %d Operator: daggered (%s) , norm-op (%s)\n", i + 1, mg_eig_use_dagger[i] ? "true" : "false",
177  mg_eig_use_normop[i] ? "true" : "false");
178  if (mg_eig_use_poly_acc[i]) {
179  printfQuda(" - level %d Chebyshev polynomial degree %d\n", i + 1, mg_eig_poly_deg[i]);
180  printfQuda(" - level %d Chebyshev polynomial minumum %e\n", i + 1, mg_eig_amin[i]);
181  printfQuda(" - level %d Chebyshev polynomial maximum %e\n", i + 1, mg_eig_amax[i]);
182  }
183  }
184  printfQuda("\n");
185  }
186  printfQuda("Grid partition info: X Y Z T\n");
187  printfQuda(" %d %d %d %d\n", dimPartitioned(0), dimPartitioned(1), dimPartitioned(2),
188  dimPartitioned(3));
189  return ;
190 }
191 
196 
198 {
199  gauge_param.X[0] = xdim;
200  gauge_param.X[1] = ydim;
201  gauge_param.X[2] = zdim;
202  gauge_param.X[3] = tdim;
203 
204  gauge_param.anisotropy = anisotropy;
205  gauge_param.type = QUDA_WILSON_LINKS;
206  gauge_param.gauge_order = QUDA_QDP_GAUGE_ORDER;
207  gauge_param.t_boundary = QUDA_PERIODIC_T;
208 
209  gauge_param.cpu_prec = cpu_prec;
210 
211  gauge_param.cuda_prec = cuda_prec;
212  gauge_param.reconstruct = link_recon;
213 
214  gauge_param.cuda_prec_sloppy = cuda_prec_sloppy;
216 
219 
220  gauge_param.gauge_fix = QUDA_GAUGE_FIXED_NO;
221 
222  gauge_param.ga_pad = 0;
223  // For multi-GPU, ga_pad must be large enough to store a time-slice
224 #ifdef MULTI_GPU
225  int x_face_size = gauge_param.X[1]*gauge_param.X[2]*gauge_param.X[3]/2;
226  int y_face_size = gauge_param.X[0]*gauge_param.X[2]*gauge_param.X[3]/2;
227  int z_face_size = gauge_param.X[0]*gauge_param.X[1]*gauge_param.X[3]/2;
228  int t_face_size = gauge_param.X[0]*gauge_param.X[1]*gauge_param.X[2]/2;
229  int pad_size =MAX(x_face_size, y_face_size);
230  pad_size = MAX(pad_size, z_face_size);
231  pad_size = MAX(pad_size, t_face_size);
232  gauge_param.ga_pad = pad_size;
233 #endif
234 }
235 
236 // Parameters defining the eigensolver
237 void setEigParam(QudaEigParam &mg_eig_param, int level)
238 {
239  mg_eig_param.eig_type = mg_eig_type[level];
240  mg_eig_param.spectrum = mg_eig_spectrum[level];
243  errorQuda("Only real spectrum type (LR or SR) can be passed to the a Lanczos type solver");
244  }
245 
246  mg_eig_param.nEv = mg_eig_nEv[level];
247  mg_eig_param.nKr = mg_eig_nKr[level];
248  mg_eig_param.nConv = nvec[level];
250 
251  mg_eig_param.tol = mg_eig_tol[level];
252  mg_eig_param.check_interval = mg_eig_check_interval[level];
253  mg_eig_param.max_restarts = mg_eig_max_restarts[level];
254  mg_eig_param.cuda_prec_ritz = cuda_prec;
255 
256  mg_eig_param.compute_svd = QUDA_BOOLEAN_FALSE;
259 
261  mg_eig_param.poly_deg = mg_eig_poly_deg[level];
262  mg_eig_param.a_min = mg_eig_amin[level];
263  mg_eig_param.a_max = mg_eig_amax[level];
264 
265  // set file i/o parameters
266  // Give empty strings, Multigrid will handle IO.
267  strcpy(mg_eig_param.vec_infile, "");
268  strcpy(mg_eig_param.vec_outfile, "");
269 
270  strcpy(mg_eig_param.QUDA_logfile, eig_QUDA_logfile);
271 }
272 
274 {
276 
277  inv_param.Ls = 1;
278 
279  inv_param.sp_pad = 0;
280  inv_param.cl_pad = 0;
281 
282  inv_param.cpu_prec = cpu_prec;
283  inv_param.cuda_prec = cuda_prec;
288  inv_param.dirac_order = QUDA_DIRAC_ORDER;
289 
291  inv_param.clover_cpu_prec = cpu_prec;
292  inv_param.clover_cuda_prec = cuda_prec;
297  inv_param.clover_coeff = clover_coeff;
298  }
299 
302 
303  inv_param.dslash_type = dslash_type;
304 
305  if (kappa == -1.0) {
306  inv_param.mass = mass;
307  inv_param.kappa = 1.0 / (2.0 * (1 + 3/anisotropy + mass));
308  } else {
309  inv_param.kappa = kappa;
310  inv_param.mass = 0.5/kappa - (1 + 3/anisotropy);
311  }
312 
314  inv_param.mu = mu;
315  inv_param.epsilon = epsilon;
316  inv_param.twist_flavor = twist_flavor;
317  inv_param.Ls = (inv_param.twist_flavor == QUDA_TWIST_NONDEG_DOUBLET) ? 2 : 1;
318 
320  printfQuda("Twisted-mass doublet non supported (yet)\n");
321  exit(0);
322  }
323  }
324 
325  inv_param.dagger = QUDA_DAG_NO;
327 
328  inv_param.matpc_type = matpc_type;
329  inv_param.solution_type = QUDA_MAT_SOLUTION;
330 
331  inv_param.solve_type = QUDA_DIRECT_SOLVE;
332 
333  mg_param.invert_param = &inv_param;
334  mg_param.n_level = mg_levels;
335  for (int i=0; i<mg_param.n_level; i++) {
336  for (int j=0; j<QUDA_MAX_DIM; j++) {
337  // if not defined use 4
338  mg_param.geo_block_size[i][j] = geo_block_size[i][j] ? geo_block_size[i][j] : 4;
339  }
341  mg_param.verbosity[i] = mg_verbosity[i];
342  mg_param.setup_inv_type[i] = setup_inv[i];
343  mg_param.num_setup_iter[i] = num_setup_iter[i];
344  mg_param.setup_tol[i] = setup_tol[i];
345  mg_param.setup_maxiter[i] = setup_maxiter[i];
346 
347  // Basis to use for CA-CGN(E/R) setup
348  mg_param.setup_ca_basis[i] = setup_ca_basis[i];
349 
350  // Basis size for CACG setup
351  mg_param.setup_ca_basis_size[i] = setup_ca_basis_size[i];
352 
353  // Minimum and maximum eigenvalue for Chebyshev CA basis setup
354  mg_param.setup_ca_lambda_min[i] = setup_ca_lambda_min[i];
355  mg_param.setup_ca_lambda_max[i] = setup_ca_lambda_max[i];
356 
357  mg_param.spin_block_size[i] = 1;
358  mg_param.n_vec[i] = nvec[i] == 0 ? 24 : nvec[i]; // default to 24 vectors if not set
359  mg_param.n_block_ortho[i] = n_block_ortho[i]; // number of times to Gram-Schmidt
360  mg_param.precision_null[i] = prec_null; // precision to store the null-space basis
361  mg_param.smoother_halo_precision[i] = smoother_halo_prec; // precision of the halo exchange in the smoother
362  mg_param.nu_pre[i] = nu_pre[i];
363  mg_param.nu_post[i] = nu_post[i];
364  mg_param.mu_factor[i] = mu_factor[i];
365 
366  mg_param.cycle_type[i] = QUDA_MG_CYCLE_RECURSIVE;
367 
368  // set the coarse solver wrappers including bottom solver
369  mg_param.coarse_solver[i] = coarse_solver[i];
370  mg_param.coarse_solver_tol[i] = coarse_solver_tol[i];
372 
373  // Basis to use for CA-CGN(E/R) coarse solver
375 
376  // Basis size for CACG coarse solver/
378 
379  // Minimum and maximum eigenvalue for Chebyshev CA basis
382 
383  mg_param.smoother[i] = smoother_type[i];
384 
385  // set the smoother / bottom solver tolerance (for MR smoothing this will be ignored)
386  mg_param.smoother_tol[i] = smoother_tol[i];
387 
388  // set to QUDA_DIRECT_SOLVE for no even/odd preconditioning on the smoother
389  // set to QUDA_DIRECT_PC_SOLVE for to enable even/odd preconditioning on the smoother
390  mg_param.smoother_solve_type[i] = smoother_solve_type[i];
391 
392  // set to QUDA_ADDITIVE_SCHWARZ for Additive Schwarz precondioned smoother (presently only impelemented for MR)
393  mg_param.smoother_schwarz_type[i] = schwarz_type[i];
394 
395  // if using Schwarz preconditioning then use local reductions only
397 
398  // set number of Schwarz cycles to apply
399  mg_param.smoother_schwarz_cycle[i] = schwarz_cycle[i];
400 
401  // Set set coarse_grid_solution_type: this defines which linear
402  // system we are solving on a given level
403  // * QUDA_MAT_SOLUTION - we are solving the full system and inject
404  // a full field into coarse grid
405  // * QUDA_MATPC_SOLUTION - we are solving the e/o-preconditioned
406  // system, and only inject single parity field into coarse grid
407  //
408  // Multiple possible scenarios here
409  //
410  // 1. **Direct outer solver and direct smoother**: here we use
411  // full-field residual coarsening, and everything involves the
412  // full system so coarse_grid_solution_type = QUDA_MAT_SOLUTION
413  //
414  // 2. **Direct outer solver and preconditioned smoother**: here,
415  // only the smoothing uses e/o preconditioning, so
416  // coarse_grid_solution_type = QUDA_MAT_SOLUTION_TYPE.
417  // We reconstruct the full residual prior to coarsening after the
418  // pre-smoother, and then need to project the solution for post
419  // smoothing.
420  //
421  // 3. **Preconditioned outer solver and preconditioned smoother**:
422  // here we use single-parity residual coarsening throughout, so
423  // coarse_grid_solution_type = QUDA_MATPC_SOLUTION. This is a bit
424  // questionable from a theoretical point of view, since we don't
425  // coarsen the preconditioned operator directly, rather we coarsen
426  // the full operator and preconditioned that, but it just works.
427  // This is the optimal combination in general for Wilson-type
428  // operators: although there is an occasional increase in
429  // iteration or two), by working completely in the preconditioned
430  // space, we save the cost of reconstructing the full residual
431  // from the preconditioned smoother, and re-projecting for the
432  // subsequent smoother, as well as reducing the cost of the
433  // ancillary blas operations in the coarse-grid solve.
434  //
435  // Note, we cannot use preconditioned outer solve with direct
436  // smoother
437  //
438  // Finally, we have to treat the top level carefully: for all
439  // other levels the entry into and out of the grid will be a
440  // full-field, which we can then work in Schur complement space or
441  // not (e.g., freedom to choose coarse_grid_solution_type). For
442  // the top level, if the outer solver is for the preconditioned
443  // system, then we must use preconditoning, e.g., option 3.) above.
444 
445  if (i == 0) { // top-level treatment
446  if (coarse_solve_type[0] != solve_type)
447  errorQuda("Mismatch between top-level MG solve type %d and outer solve type %d", coarse_solve_type[0], solve_type);
448 
449  if (solve_type == QUDA_DIRECT_SOLVE) {
451  } else if (solve_type == QUDA_DIRECT_PC_SOLVE) {
453  } else {
454  errorQuda("Unexpected solve_type = %d\n", solve_type);
455  }
456 
457  } else {
458 
461  } else if (coarse_solve_type[i] == QUDA_DIRECT_PC_SOLVE) {
463  } else {
464  errorQuda("Unexpected solve_type = %d\n", coarse_solve_type[i]);
465  }
466 
467  }
468 
469  mg_param.omega[i] = omega; // over/under relaxation factor
470 
471  mg_param.location[i] = solver_location[i];
472  mg_param.setup_location[i] = setup_location[i];
473  }
474 
475  // whether to run GPU setup but putting temporaries into mapped (slow CPU) memory
477 
478  // only coarsen the spin on the first restriction
479  mg_param.spin_block_size[0] = 2;
480 
481  mg_param.setup_type = setup_type;
484 
487 
489 
493 
494  // set file i/o parameters
495  for (int i = 0; i < mg_param.n_level; i++) {
496  strcpy(mg_param.vec_infile[i], mg_vec_infile[i]);
497  strcpy(mg_param.vec_outfile[i], mg_vec_outfile[i]);
498  if (strcmp(mg_param.vec_infile[i], "") != 0) mg_param.vec_load[i] = QUDA_BOOLEAN_TRUE;
499  if (strcmp(mg_param.vec_outfile[i], "") != 0) mg_param.vec_store[i] = QUDA_BOOLEAN_TRUE;
500  }
501 
503 
504  // these need to tbe set for now but are actually ignored by the MG setup
505  // needed to make it pass the initialization test
506  inv_param.inv_type = QUDA_GCR_INVERTER;
507  inv_param.tol = 1e-10;
508  inv_param.maxiter = 1000;
509  inv_param.reliable_delta = 1e-10;
510  inv_param.gcrNkrylov = 10;
511 
512  inv_param.verbosity = QUDA_SUMMARIZE;
514 }
515 
517  inv_param.Ls = 1;
518 
519  inv_param.sp_pad = 0;
520  inv_param.cl_pad = 0;
521 
522  inv_param.cpu_prec = cpu_prec;
523  inv_param.cuda_prec = cuda_prec;
525 
529  inv_param.dirac_order = QUDA_DIRAC_ORDER;
530 
532  inv_param.clover_cpu_prec = cpu_prec;
533  inv_param.clover_cuda_prec = cuda_prec;
538  }
539 
542 
543  inv_param.dslash_type = dslash_type;
544 
545  if (kappa == -1.0) {
546  inv_param.mass = mass;
547  inv_param.kappa = 1.0 / (2.0 * (1 + 3/anisotropy + mass));
548  } else {
549  inv_param.kappa = kappa;
550  inv_param.mass = 0.5/kappa - (1 + 3/anisotropy);
551  }
552 
554  inv_param.mu = mu;
555  inv_param.epsilon = epsilon;
556  inv_param.twist_flavor = twist_flavor;
557  inv_param.Ls = (inv_param.twist_flavor == QUDA_TWIST_NONDEG_DOUBLET) ? 2 : 1;
558 
560  printfQuda("Twisted-mass doublet non supported (yet)\n");
561  exit(0);
562  }
563  }
564 
565  inv_param.clover_coeff = clover_coeff;
566 
567  inv_param.dagger = QUDA_DAG_NO;
569 
570  // do we want full solution or single-parity solution
571  inv_param.solution_type = QUDA_MAT_SOLUTION;
572 
573  // do we want to use an even-odd preconditioned solve or not
574  inv_param.solve_type = solve_type;
575  inv_param.matpc_type = matpc_type;
576 
577  inv_param.inv_type = QUDA_GCR_INVERTER;
578 
579  inv_param.verbosity = QUDA_VERBOSE;
580  inv_param.verbosity_precondition = mg_verbosity[0];
581 
582 
584  inv_param.pipeline = pipeline;
585  inv_param.gcrNkrylov = gcrNkrylov;
586  inv_param.tol = tol;
587 
588  // require both L2 relative and heavy quark residual to determine convergence
589  inv_param.residual_type = static_cast<QudaResidualType>(QUDA_L2_RELATIVE_RESIDUAL);
590  inv_param.tol_hq = tol_hq; // specify a tolerance for the residual for heavy quark residual
591 
592  // these can be set individually
593  for (int i=0; i<inv_param.num_offset; i++) {
594  inv_param.tol_offset[i] = inv_param.tol;
595  inv_param.tol_hq_offset[i] = inv_param.tol_hq;
596  }
597  inv_param.maxiter = niter;
598  inv_param.reliable_delta = reliable_delta;
599 
600  // domain decomposition preconditioner parameters
602  inv_param.precondition_cycle = 1;
603  inv_param.tol_precondition = 1e-1;
604  inv_param.maxiter_precondition = 1;
605  inv_param.omega = 1.0;
606 }
607 
608 int main(int argc, char **argv)
609 {
610  // We give here the default values to some of the array
612  for (int i = 0; i < QUDA_MAX_MG_LEVEL; i++) {
615  num_setup_iter[i] = 1;
616  setup_tol[i] = 5e-6;
617  setup_maxiter[i] = 500;
618  mu_factor[i] = 1.;
622  schwarz_cycle[i] = 1;
624  smoother_tol[i] = 0.25;
626  coarse_solver_tol[i] = 0.25;
627  coarse_solver_maxiter[i] = 100;
630  nu_pre[i] = 2;
631  nu_post[i] = 2;
632  n_block_ortho[i] = 1;
633 
634  // Default eigensolver params
635  mg_eig[i] = false;
636  mg_eig_tol[i] = 1e-3;
640  mg_eig_check_interval[i] = 5;
641  mg_eig_max_restarts[i] = 100;
645  mg_eig_poly_deg[i] = 100;
646  mg_eig_amin[i] = 1.0;
647  mg_eig_amax[i] = 5.0;
648 
650  setup_ca_basis_size[i] = 4;
651  setup_ca_lambda_min[i] = 0.0;
652  setup_ca_lambda_max[i] = -1.0; // use power iterations
653 
657  coarse_solver_ca_lambda_max[i] = -1.0;
658 
659  strcpy(mg_vec_infile[i], "");
660  strcpy(mg_vec_outfile[i], "");
661  }
662  reliable_delta = 1e-4;
663 
664  for (int i = 1; i < argc; i++){
665  if(process_command_line_option(argc, argv, &i) == 0){
666  continue;
667  }
668  printf("ERROR: Invalid option:%s\n", argv[i]);
669  usage(argv);
670  }
671 
678  for (int i =0; i<QUDA_MAX_MG_LEVEL; i++) {
681  }
682 
683  // initialize QMP/MPI, QUDA comms grid and RNG (test_util.cpp)
684  initComms(argc, argv, gridsize_from_cmdline);
685 
686  // call srand() with a rank-dependent seed
687  initRand();
688 
689  // *** QUDA parameters begin here.
690 
695  printfQuda("dslash_type %d not supported\n", dslash_type);
696  exit(0);
697  }
698 
700  setGaugeParam(gauge_param);
701 
703  setInvertParam(inv_param);
704 
706  // Set sub structures
707  QudaInvertParam mg_inv_param = newQudaInvertParam();
708  QudaEigParam mg_eig_param[mg_levels];
709  for (int i = 0; i < mg_levels; i++) {
710  if (mg_eig[i]) {
711  mg_eig_param[i] = newQudaEigParam();
712  setEigParam(mg_eig_param[i], i);
713  mg_param.eig_param[i] = &mg_eig_param[i];
714  } else {
715  mg_param.eig_param[i] = nullptr;
716  }
717  }
718 
719  // Set MG
720  mg_param.invert_param = &mg_inv_param;
721  setMultigridParam(mg_param);
722 
724 
725  // *** Everything between here and the call to initQuda() is
726  // *** application-specific.
727 
728  setDims(gauge_param.X);
729 
730  setSpinorSiteSize(24);
731 
732  size_t gSize = (gauge_param.cpu_prec == QUDA_DOUBLE_PRECISION) ? sizeof(double) : sizeof(float);
733  size_t sSize = (inv_param.cpu_prec == QUDA_DOUBLE_PRECISION) ? sizeof(double) : sizeof(float);
734 
735  void *gauge[4], *clover=0, *clover_inv=0;
736 
737  for (int dir = 0; dir < 4; dir++) {
738  gauge[dir] = malloc(V*gaugeSiteSize*gSize);
739  }
740 
741  if (strcmp(latfile,"")) { // load in the command line supplied gauge field
742  read_gauge_field(latfile, gauge, gauge_param.cpu_prec, gauge_param.X, argc, argv);
743  construct_gauge_field(gauge, 2, gauge_param.cpu_prec, &gauge_param);
744  } else { // else generate an SU(3) field
745  if (unit_gauge) {
746  // unit SU(3) field
747  construct_gauge_field(gauge, 0, gauge_param.cpu_prec, &gauge_param);
748  } else {
749  // random SU(3) field
750  construct_gauge_field(gauge, 1, gauge_param.cpu_prec, &gauge_param);
751  }
752  }
753 
755  double norm = 0.1; // clover components are random numbers in the range (-norm, norm)
756  double diag = 1.0; // constant added to the diagonal
757 
758  size_t cSize = inv_param.clover_cpu_prec;
759  clover = malloc(V*cloverSiteSize*cSize);
760  clover_inv = malloc(V*cloverSiteSize*cSize);
761  if (!compute_clover) construct_clover_field(clover, norm, diag, inv_param.clover_cpu_prec);
762 
763  inv_param.compute_clover = compute_clover;
764  if (compute_clover) inv_param.return_clover = 1;
765  inv_param.compute_clover_inverse = 1;
766  inv_param.return_clover_inverse = 1;
767  }
768 
769  void *spinorIn = malloc(V*spinorSiteSize*sSize*inv_param.Ls);
770  void *spinorCheck = malloc(V*spinorSiteSize*sSize*inv_param.Ls);
771  void *spinorOut = malloc(V * spinorSiteSize * sSize * inv_param.Ls);
772 
773  // initialize the QUDA library
774  initQuda(device);
775 
776  // load the gauge field
777  loadGaugeQuda((void*)gauge, &gauge_param);
778 
779  double plaq[3];
780  plaqQuda(plaq);
781  printfQuda("Computed plaquette is %e (spatial = %e, temporal = %e)\n", plaq[0], plaq[1], plaq[2]);
782 
783  // this line ensure that if we need to construct the clover inverse (in either the smoother or the solver) we do so
785  if (dslash_type == QUDA_CLOVER_WILSON_DSLASH || dslash_type == QUDA_TWISTED_CLOVER_DSLASH) loadCloverQuda(clover, clover_inv, &inv_param);
786 
787  inv_param.solve_type = solve_type; // restore actual solve_type we want to do
788 
789  // setup the multigrid solver
790  void *mg_preconditioner = newMultigridQuda(&mg_param);
791  inv_param.preconditioner = mg_preconditioner;
792 
793  auto *rng = new quda::RNG(quda::LatticeFieldParam(gauge_param), 1234);
794  rng->Init();
795  double *time = new double[Nsrc];
796  double *gflops = new double[Nsrc];
797 
798  for (int i = 0; i < Nsrc; i++) {
799  construct_spinor_source(spinorIn, 4, 3, inv_param.cpu_prec, gauge_param.X, *rng);
800  invertQuda(spinorOut, spinorIn, &inv_param);
801 
802  time[i] = inv_param.secs;
803  gflops[i] = inv_param.gflops / inv_param.secs;
804  printfQuda("Done: %i iter / %g secs = %g Gflops\n\n", inv_param.iter, inv_param.secs,
805  inv_param.gflops / inv_param.secs);
806  }
807 
808  rng->Release();
809  delete rng;
810 
811  // free the multigrid solver
812  destroyMultigridQuda(mg_preconditioner);
813 
814  auto mean_time = 0.0;
815  auto mean_time2 = 0.0;
816  auto mean_gflops = 0.0;
817  auto mean_gflops2 = 0.0;
818  for (int i = 0; i < Nsrc; i++) {
819  mean_time += time[i];
820  mean_time2 += time[i] * time[i];
821  mean_gflops += gflops[i];
822  mean_gflops2 += gflops[i] * gflops[i];
823  }
824 
825  mean_time /= Nsrc;
826  mean_time2 /= Nsrc;
827  auto stddev_time = Nsrc > 1 ? sqrt((Nsrc / ((double)Nsrc - 1.0)) * (mean_time2 - mean_time * mean_time)) : std::numeric_limits<double>::infinity();
828  mean_gflops /= Nsrc;
829  mean_gflops2 /= Nsrc;
830  auto stddev_gflops = Nsrc > 1 ? sqrt((Nsrc / ((double)Nsrc - 1.0)) * (mean_gflops2 - mean_gflops * mean_gflops)) : std::numeric_limits<double>::infinity();
831  printfQuda("%d solves, with mean solve time %g (stddev = %g), mean GFLOPS %g (stddev = %g)\n", Nsrc, mean_time,
832  stddev_time, mean_gflops, stddev_gflops);
833 
834  delete[] time;
835  delete[] gflops;
836 
837  if (inv_param.solution_type == QUDA_MAT_SOLUTION) {
838 
840  if (inv_param.twist_flavor == QUDA_TWIST_SINGLET) {
841  tm_mat(spinorCheck, gauge, spinorOut, inv_param.kappa, inv_param.mu, inv_param.twist_flavor, 0,
842  inv_param.cpu_prec, gauge_param);
843  } else {
844  int tm_offset = V * spinorSiteSize;
845  void *evenOut = spinorCheck;
846  void *oddOut = (char *)evenOut + tm_offset * cpu_prec;
847 
848  void *evenIn = spinorOut;
849  void *oddIn = (char *)evenIn + tm_offset * cpu_prec;
850 
851  tm_ndeg_mat(evenOut, oddOut, gauge, evenIn, oddIn, inv_param.kappa, inv_param.mu, inv_param.epsilon, 0,
852  inv_param.cpu_prec, gauge_param);
853  }
854  } else if (dslash_type == QUDA_TWISTED_CLOVER_DSLASH) {
855  tmc_mat(spinorCheck, gauge, clover, spinorOut, inv_param.kappa, inv_param.mu, inv_param.twist_flavor, 0,
856  inv_param.cpu_prec, gauge_param);
857  } else if (dslash_type == QUDA_WILSON_DSLASH) {
858  wil_mat(spinorCheck, gauge, spinorOut, inv_param.kappa, 0, inv_param.cpu_prec, gauge_param);
859  } else if (dslash_type == QUDA_CLOVER_WILSON_DSLASH) {
860  clover_mat(spinorCheck, gauge, clover, spinorOut, inv_param.kappa, 0, inv_param.cpu_prec, gauge_param);
861  } else {
862  errorQuda("Unsupported dslash_type");
863  }
864  if (inv_param.mass_normalization == QUDA_MASS_NORMALIZATION) {
866  ax(0.5 / inv_param.kappa, spinorCheck, 2 * V * spinorSiteSize, inv_param.cpu_prec);
867  } else {
868  ax(0.5 / inv_param.kappa, spinorCheck, V * spinorSiteSize, inv_param.cpu_prec);
869  }
870  }
871 
872  } else if(inv_param.solution_type == QUDA_MATPC_SOLUTION) {
873 
875  if (inv_param.twist_flavor != QUDA_TWIST_SINGLET) {
876  int tm_offset = Vh * spinorSiteSize;
877  void *out0 = spinorCheck;
878  void *out1 = (char *)out0 + tm_offset * cpu_prec;
879 
880  void *in0 = spinorOut;
881  void *in1 = (char *)in0 + tm_offset * cpu_prec;
882 
883  tm_ndeg_matpc(out0, out1, gauge, in0, in1, inv_param.kappa, inv_param.mu, inv_param.epsilon,
884  inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param);
885  } else {
886  tm_matpc(spinorCheck, gauge, spinorOut, inv_param.kappa, inv_param.mu, inv_param.twist_flavor,
887  inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param);
888  }
889  } else if (dslash_type == QUDA_TWISTED_CLOVER_DSLASH) {
890  if (inv_param.twist_flavor != QUDA_TWIST_SINGLET) errorQuda("Twisted mass solution type not supported");
891  tmc_matpc(spinorCheck, gauge, spinorOut, clover, clover_inv, inv_param.kappa, inv_param.mu,
892  inv_param.twist_flavor, inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param);
893  } else if (dslash_type == QUDA_WILSON_DSLASH) {
894  wil_matpc(spinorCheck, gauge, spinorOut, inv_param.kappa, inv_param.matpc_type, 0, inv_param.cpu_prec, gauge_param);
895  } else if (dslash_type == QUDA_CLOVER_WILSON_DSLASH) {
896  clover_matpc(spinorCheck, gauge, clover, clover_inv, spinorOut, inv_param.kappa, inv_param.matpc_type, 0,
897  inv_param.cpu_prec, gauge_param);
898  } else {
899  errorQuda("Unsupported dslash_type");
900  }
901 
902  if (inv_param.mass_normalization == QUDA_MASS_NORMALIZATION) {
903  ax(0.25/(inv_param.kappa*inv_param.kappa), spinorCheck, Vh*spinorSiteSize, inv_param.cpu_prec);
904  }
905 
906  }
907 
908  int vol = inv_param.solution_type == QUDA_MAT_SOLUTION ? V : Vh;
909  mxpy(spinorIn, spinorCheck, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
910  double nrm2 = norm_2(spinorCheck, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
911  double src2 = norm_2(spinorIn, vol*spinorSiteSize*inv_param.Ls, inv_param.cpu_prec);
912  double l2r = sqrt(nrm2 / src2);
913 
914  printfQuda("Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
915  inv_param.tol, inv_param.true_res, l2r, inv_param.tol_hq, inv_param.true_res_hq);
916 
917 
918  freeGaugeQuda();
920 
921  // finalize the QUDA library
922  endQuda();
923 
924  free(spinorIn);
925  free(spinorCheck);
926  free(spinorOut);
927 
928  // finalize the communications layer
929  finalizeComms();
930 
932  if (clover) free(clover);
933  if (clover_inv) free(clover_inv);
934  }
935 
936  for (int dir = 0; dir<4; dir++) free(gauge[dir]);
937 
938  return 0;
939 }
int maxiter_precondition
Definition: quda.h:292
QudaInverterType setup_inv[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1676
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
QudaMassNormalization mass_normalization
Definition: quda.h:208
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:182
QudaReconstructType reconstruct_sloppy
Definition: quda.h:53
double anisotropy
Definition: quda.h:38
void freeCloverQuda(void)
int mg_levels
Definition: test_util.cpp:1666
void display_test_info()
int num_setup_iter[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1679
QudaBoolean use_dagger
Definition: quda.h:401
void endQuda(void)
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
Definition: test_util.cpp:1047
QudaPrecision prec_precondition
Definition: test_util.cpp:1611
QudaSolveType solve_type
Definition: quda.h:205
QudaVerbosity verbosity_precondition
Definition: quda.h:286
int ydim
Definition: test_util.cpp:1616
QudaEigParam * eig_param[QUDA_MAX_MG_LEVEL]
Definition: quda.h:480
enum QudaPrecision_s QudaPrecision
QudaSchwarzType schwarz_type[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1703
int ga_pad
Definition: quda.h:63
char eig_QUDA_logfile[]
Definition: test_util.cpp:1741
double setup_ca_lambda_max[QUDA_MAX_MG_LEVEL]
Definition: quda.h:528
QudaMultigridParam newQudaMultigridParam(void)
bool mg_eig_use_poly_acc[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1755
QudaPrecision & cuda_prec
int nvec[]
Definition: test_util.cpp:1637
double mu
Definition: quda.h:114
QudaSetupType setup_type
Definition: test_util.cpp:1687
QudaGaugeFixed gauge_fix
Definition: quda.h:61
QudaSolveType coarse_solve_type[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1677
QudaSchwarzType schwarz_type
Definition: quda.h:310
__host__ __device__ ValueType norm(const complex< ValueType > &z)
Returns the magnitude of z squared.
QudaReconstructType link_recon_precondition
Definition: test_util.cpp:1607
double anisotropy
Definition: test_util.cpp:1650
void tm_mat(void *out, void **gauge, void *in, double kappa, double mu, QudaTwistFlavorType flavor, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
double reliable_delta
Definition: test_util.cpp:1658
bool mg_eig_use_dagger[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1760
enum QudaResidualType_s QudaResidualType
int main(int argc, char **argv)
double coarse_solver_ca_lambda_min[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1699
QudaInverterType inv_type_precondition
Definition: quda.h:270
bool mg_eig_use_normop[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1759
QudaLinkType type
Definition: quda.h:42
bool generate_all_levels
Definition: test_util.cpp:1702
double kappa
Definition: quda.h:106
QudaBoolean use_eig_solver[QUDA_MAX_MG_LEVEL]
Definition: quda.h:604
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
#define errorQuda(...)
Definition: util_quda.h:121
double tol
Definition: quda.h:121
void setEigParam(QudaEigParam &mg_eig_param, int level)
QudaFieldLocation solver_location[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1668
QudaDslashType dslash_type
Definition: quda.h:102
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
QudaSolveType smoother_solve_type[QUDA_MAX_MG_LEVEL]
Definition: quda.h:589
int niter
Definition: test_util.cpp:1629
QudaSetupType setup_type
Definition: quda.h:531
double mu_factor[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1674
enum QudaSolveType_s QudaSolveType
double setup_tol[QUDA_MAX_MG_LEVEL]
Definition: quda.h:510
__host__ __device__ ValueType sqrt(ValueType x)
Definition: complex_quda.h:120
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
bool post_orthonormalize
Definition: test_util.cpp:1689
int num_setup_iter[QUDA_MAX_MG_LEVEL]
Definition: quda.h:507
QudaPrecision cpu_prec
Definition: quda.h:213
const char * get_eig_spectrum_str(QudaEigSpectrumType type)
Definition: misc.cpp:1008
int process_command_line_option(int argc, char **argv, int *idx)
Definition: test_util.cpp:2019
int nu_pre[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1671
bool generate_nullspace
Definition: test_util.cpp:1701
double coarse_solver_tol[QUDA_MAX_MG_LEVEL]
Definition: quda.h:543
void setMultigridParam(QudaMultigridParam &mg_param)
void tm_ndeg_mat(void *evenOut, void *oddOut, void **gauge, void *evenIn, void *oddIn, double kappa, double mu, double epsilon, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
double epsilon
Definition: test_util.cpp:1649
QudaBoolean pre_orthonormalize
Definition: quda.h:534
QudaSchwarzType smoother_schwarz_type[QUDA_MAX_MG_LEVEL]
Definition: quda.h:579
void destroyMultigridQuda(void *mg_instance)
Free resources allocated by the multigrid solver.
void plaqQuda(double plaq[3])
QudaBoolean vec_load[QUDA_MAX_MG_LEVEL]
Definition: quda.h:627
void clover_matpc(void *out, void **gauge, void *clover, void *clover_inv, void *in, double kappa, QudaMatPCType matpc_type, int dagger, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaDagType dagger
Definition: quda.h:207
double mg_eig_tol[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1754
void finalizeComms()
Definition: test_util.cpp:128
double setup_ca_lambda_min[QUDA_MAX_MG_LEVEL]
Definition: quda.h:525
int nu_post[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1672
QudaGaugeParam gauge_param
int tdim
Definition: test_util.cpp:1618
QudaPrecision smoother_halo_precision[QUDA_MAX_MG_LEVEL]
Definition: quda.h:576
QudaPrecision clover_cuda_prec_refinement_sloppy
Definition: quda.h:227
QudaGaugeFieldOrder gauge_order
Definition: quda.h:43
double true_res
Definition: quda.h:126
void tmc_mat(void *out, void **gauge, void *clover, void *in, double kappa, double mu, QudaTwistFlavorType flavor, int dagger, QudaPrecision precision, QudaGaugeParam &gauge_param)
double tol
Definition: test_util.cpp:1656
QudaTwistFlavorType twist_flavor
Definition: test_util.cpp:1660
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)
int mg_eig_nKr[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1750
int return_clover
Definition: quda.h:241
enum QudaEigType_s QudaEigType
void construct_spinor_source(void *v, int nSpin, int nColor, QudaPrecision precision, const int *const x, quda::RNG &rng)
Definition: test_util.cpp:1342
#define spinorSiteSize
QudaBoolean setup_minimize_memory
Definition: quda.h:609
double mu_factor[QUDA_MAX_MG_LEVEL]
Definition: quda.h:648
QudaBoolean coarse_guess
Definition: quda.h:639
int geo_block_size[QUDA_MAX_MG_LEVEL][QUDA_MAX_DIM]
Definition: test_util.cpp:1706
QudaPrecision clover_cuda_prec_sloppy
Definition: quda.h:226
void setDims(int *)
Definition: test_util.cpp:151
QudaFieldLocation input_location
Definition: quda.h:99
QudaPrecision & cuda_prec_sloppy
void freeGaugeQuda(void)
QudaCABasis setup_ca_basis[QUDA_MAX_MG_LEVEL]
Definition: quda.h:519
double kappa
Definition: test_util.cpp:1647
QudaBoolean use_poly_acc
Definition: quda.h:387
double reliable_delta
Definition: quda.h:129
int n_vec[QUDA_MAX_MG_LEVEL]
Definition: quda.h:492
bool oblique_proj_check
Definition: test_util.cpp:1645
QudaSolutionType solution_type
Definition: quda.h:204
int nConv
Definition: quda.h:420
QudaFieldLocation setup_location[QUDA_MAX_MG_LEVEL]
Definition: quda.h:601
double setup_ca_lambda_min[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1685
QudaEigSpectrumType mg_eig_spectrum[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1761
QudaEigType eig_type
Definition: quda.h:384
QudaPrecision prec_null
Definition: test_util.cpp:1612
QudaPrecision clover_cuda_prec
Definition: quda.h:225
QudaFieldLocation setup_location[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1669
int precondition_cycle
Definition: quda.h:307
void * preconditioner
Definition: quda.h:273
QudaPrecision prec
Definition: test_util.cpp:1608
QudaBoolean global_reduction[QUDA_MAX_MG_LEVEL]
Definition: quda.h:595
const char * get_eig_type_str(QudaEigType type)
Definition: misc.cpp:1044
QudaPrecision & cuda_prec_precondition
QudaBoolean require_convergence
Definition: quda.h:408
void initQuda(int device)
int coarse_solver_maxiter[QUDA_MAX_MG_LEVEL]
Definition: quda.h:546
void ax(const double &a, GaugeField &u)
Scale the gauge field by the scalar a.
QudaCABasis coarse_solver_ca_basis[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1697
QudaFieldLocation output_location
Definition: quda.h:100
QudaPrecision clover_cuda_prec_precondition
Definition: quda.h:228
QudaInvertParam inv_param
Definition: covdev_test.cpp:37
QudaBoolean post_orthonormalize
Definition: quda.h:537
QudaMultigridCycleType cycle_type[QUDA_MAX_MG_LEVEL]
Definition: quda.h:592
QudaCABasis setup_ca_basis[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1683
QudaSolveType solve_type
Definition: test_util.cpp:1663
void setTransferGPU(bool)
QudaReconstructType link_recon
Definition: test_util.cpp:1605
QudaPrecision cuda_prec_sloppy
Definition: quda.h:215
QudaVerbosity verbosity
Definition: quda.h:244
void setSpinorSiteSize(int n)
Definition: test_util.cpp:211
int setup_maxiter[QUDA_MAX_MG_LEVEL]
Definition: quda.h:513
double tol_offset[QUDA_MAX_MULTI_SHIFT]
Definition: quda.h:179
QudaPrecision smoother_halo_prec
Definition: test_util.cpp:1694
double mass
Definition: test_util.cpp:1646
QudaInvertParam newQudaInvertParam(void)
double gflops
Definition: quda.h:250
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
Class declaration to initialize and hold CURAND RNG states.
Definition: random_quda.h:23
double omega[QUDA_MAX_MG_LEVEL]
Definition: quda.h:573
double tol_hq
Definition: quda.h:123
enum QudaMatPCType_s QudaMatPCType
cpuColorSpinorField * spinorOut
Definition: covdev_test.cpp:41
void * newMultigridQuda(QudaMultigridParam *param)
double coarse_solver_ca_lambda_max[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1700
double true_res_hq
Definition: quda.h:127
double smoother_tol[QUDA_MAX_MG_LEVEL]
Definition: quda.h:564
int poly_deg
Definition: quda.h:390
int gridsize_from_cmdline[]
Definition: test_util.cpp:49
QudaGammaBasis gamma_basis
Definition: quda.h:221
QudaBoolean use_norm_op
Definition: quda.h:402
bool mg_eig_require_convergence[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1751
double a_min
Definition: quda.h:393
QudaPrecision precision_null[QUDA_MAX_MG_LEVEL]
Definition: quda.h:495
enum QudaSchwarzType_s QudaSchwarzType
QudaBoolean compute_svd
Definition: quda.h:405
QudaPrecision cuda_prec_sloppy
Definition: quda.h:52
QudaVerbosity verbosity[QUDA_MAX_MG_LEVEL]
Definition: quda.h:501
double tol_precondition
Definition: quda.h:289
QudaInverterType coarse_solver[QUDA_MAX_MG_LEVEL]
Definition: quda.h:540
void clover_mat(void *out, void **gauge, void *clover, void *in, double kappa, int dagger, QudaPrecision precision, QudaGaugeParam &gauge_param)
void tm_ndeg_matpc(void *outEven1, void *outEven2, void **gauge, void *inEven1, void *inEven2, double kappa, double mu, double epsilon, QudaMatPCType matpc_type, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaBoolean run_verify
Definition: quda.h:618
QudaReconstructType reconstruct
Definition: quda.h:50
QudaDslashType dslash_type
Definition: test_util.cpp:1621
QudaPrecision cuda_prec
Definition: quda.h:49
QudaPrecision & cpu_prec
int X[4]
Definition: quda.h:36
char mg_vec_infile[QUDA_MAX_MG_LEVEL][256]
Definition: test_util.cpp:1638
int mg_eig_nEv[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1749
double mass
Definition: quda.h:105
int Nsrc
Definition: test_util.cpp:1627
double mg_eig_amin[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1757
int gcrNkrylov
Definition: quda.h:259
QudaBoolean vec_store[QUDA_MAX_MG_LEVEL]
Definition: quda.h:633
int V
Definition: test_util.cpp:27
double norm_2(void *v, int len, QudaPrecision precision)
int mg_eig_poly_deg[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1756
bool unit_gauge
Definition: test_util.cpp:1624
QudaInverterType coarse_solver[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1691
int compute_clover_inverse
Definition: quda.h:240
QudaMatPCType matpc_type
Definition: test_util.cpp:1662
int pipeline
Definition: test_util.cpp:1634
void usage(char **)
Definition: test_util.cpp:1783
QudaBoolean run_oblique_proj_check
Definition: quda.h:624
QudaFieldLocation location[QUDA_MAX_MG_LEVEL]
Definition: quda.h:598
int n_block_ortho[QUDA_MAX_MG_LEVEL]
Definition: quda.h:498
int Lsdim
Definition: test_util.cpp:1619
void construct_clover_field(void *clover, double norm, double diag, QudaPrecision precision)
Definition: test_util.cpp:1167
int smoother_schwarz_cycle[QUDA_MAX_MG_LEVEL]
Definition: quda.h:582
char vec_outfile[QUDA_MAX_MG_LEVEL][256]
Definition: quda.h:636
QudaBoolean run_low_mode_check
Definition: quda.h:621
char vec_outfile[256]
Definition: quda.h:462
int schwarz_cycle[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1704
enum QudaFieldLocation_s QudaFieldLocation
int spin_block_size[QUDA_MAX_MG_LEVEL]
Definition: quda.h:489
double coarse_solver_ca_lambda_max[QUDA_MAX_MG_LEVEL]
Definition: quda.h:558
void wil_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
double tol
Definition: quda.h:422
QudaPrecision cuda_prec_precondition
Definition: quda.h:217
int coarse_solver_ca_basis_size[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1698
QudaSolutionType coarse_grid_solution_type[QUDA_MAX_MG_LEVEL]
Definition: quda.h:586
int mg_eig_check_interval[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1752
enum QudaEigSpectrumType_s QudaEigSpectrumType
int device
Definition: test_util.cpp:1602
int geo_block_size[QUDA_MAX_MG_LEVEL][QUDA_MAX_DIM]
Definition: quda.h:486
int setup_ca_basis_size[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1684
QudaBoolean generate_all_levels
Definition: quda.h:615
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
void initRand()
Definition: test_util.cpp:138
int nu_pre[QUDA_MAX_MG_LEVEL]
Definition: quda.h:567
enum QudaCABasis_s QudaCABasis
#define QUDA_MAX_MG_LEVEL
Maximum number of multi-grid levels. This number may be increased if needed.
enum QudaSetupType_s QudaSetupType
int xdim
Definition: test_util.cpp:1615
void tmc_matpc(void *out, void **gauge, void *in, void *clover, void *cInv, double kappa, double mu, QudaTwistFlavorType flavor, QudaMatPCType matpc_type, int dagger, QudaPrecision precision, QudaGaugeParam &gauge_param)
int coarse_solver_ca_basis_size[QUDA_MAX_MG_LEVEL]
Definition: quda.h:552
QudaCABasis coarse_solver_ca_basis[QUDA_MAX_MG_LEVEL]
Definition: quda.h:549
#define printfQuda(...)
Definition: util_quda.h:115
QudaTboundary t_boundary
Definition: quda.h:45
QudaSolveType smoother_solve_type[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1678
QudaTwistFlavorType twist_flavor
Definition: quda.h:117
bool mg_eig[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1748
char vec_infile[QUDA_MAX_MG_LEVEL][256]
Definition: quda.h:630
double mg_eig_amax[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1758
char QUDA_logfile[512]
Definition: quda.h:434
char mg_vec_outfile[QUDA_MAX_MG_LEVEL][256]
Definition: test_util.cpp:1639
char latfile[]
Definition: test_util.cpp:1623
bool mg_eig_coarse_guess
Definition: test_util.cpp:1763
enum QudaDslashType_s QudaDslashType
int check_interval
Definition: quda.h:424
QudaEigType mg_eig_type[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1762
int max_restarts
Definition: quda.h:426
QudaEigSpectrumType spectrum
Definition: quda.h:411
void mxpy(ColorSpinorField &x, ColorSpinorField &y)
Definition: blas_quda.h:34
QudaResidualType residual_type
Definition: quda.h:320
void wil_matpc(void *outEven, void **gauge, void *inEven, double kappa, QudaMatPCType matpc_type, int daggerBit, QudaPrecision precision, QudaGaugeParam &gauge_param)
int mg_eig_max_restarts[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1753
int num_offset
Definition: quda.h:169
enum QudaVerbosity_s QudaVerbosity
bool low_mode_check
Definition: test_util.cpp:1644
int gcrNkrylov
Definition: test_util.cpp:1630
int compute_clover
Definition: quda.h:239
int coarse_solver_maxiter[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1696
double epsilon
Definition: quda.h:115
#define QUDA_MAX_DIM
Maximum number of dimensions supported by QUDA. In practice, no routines make use of more than 5...
double coarse_solver_tol[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1692
int nu_post[QUDA_MAX_MG_LEVEL]
Definition: quda.h:570
double omega
Definition: quda.h:295
int setup_maxiter[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1681
double mu
Definition: test_util.cpp:1648
QudaComputeNullVector compute_null_vector
Definition: quda.h:612
double omega
Definition: test_util.cpp:1690
void initComms(int argc, char **argv, int *const commDims)
Definition: test_util.cpp:88
double smoother_tol[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1695
void read_gauge_field(const char *filename, void *gauge[], QudaPrecision prec, const int *X, int argc, char *argv[])
Definition: qio_field.h:14
double a_max
Definition: quda.h:394
bool pre_orthonormalize
Definition: test_util.cpp:1688
QudaReconstructType link_recon_sloppy
Definition: test_util.cpp:1606
void setGaugeParam(QudaGaugeParam &gauge_param)
int n_block_ortho[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1673
int setup_ca_basis_size[QUDA_MAX_MG_LEVEL]
Definition: quda.h:522
QudaPrecision clover_cpu_prec
Definition: quda.h:224
double coarse_solver_ca_lambda_min[QUDA_MAX_MG_LEVEL]
Definition: quda.h:555
QudaPrecision cuda_prec_ritz
Definition: quda.h:447
bool compute_clover
Definition: test_util.cpp:1654
double clover_coeff
Definition: test_util.cpp:1653
QudaPrecision prec_sloppy
Definition: test_util.cpp:1609
QudaInverterType setup_inv_type[QUDA_MAX_MG_LEVEL]
Definition: quda.h:504
QudaInverterType smoother[QUDA_MAX_MG_LEVEL]
Definition: quda.h:561
QudaMatPCType matpc_type
Definition: quda.h:206
QudaEigParam newQudaEigParam(void)
int zdim
Definition: test_util.cpp:1617
char vec_infile[256]
Definition: quda.h:459
enum QudaInverterType_s QudaInverterType
bool verify_results
Definition: test_util.cpp:1643
double setup_tol[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1680
#define MAX(a, b)
QudaPrecision cpu_prec
Definition: quda.h:47
double tol_hq
Definition: test_util.cpp:1657
#define gaugeSiteSize
Definition: face_gauge.cpp:34
QudaGaugeParam newQudaGaugeParam(void)
void setInvertParam(QudaInvertParam &inv_param)
QudaInverterType smoother_type[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1693
QudaPreserveSource preserve_source
Definition: quda.h:211
QudaInvertParam * invert_param
Definition: quda.h:478
QudaVerbosity mg_verbosity[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1675
double setup_ca_lambda_max[QUDA_MAX_MG_LEVEL]
Definition: test_util.cpp:1686
double clover_coeff
Definition: quda.h:233
int Vh
Definition: test_util.cpp:28
enum QudaTwistFlavorType_s QudaTwistFlavorType