19 #define MAX(a,b) ((a)>(b)?(a):(b)) 109 extern void usage(
char** );
150 printfQuda(
"prec sloppy_prec link_recon sloppy_link_recon S_dimension T_dimension Ls_dimension\n");
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]);
171 printfQuda(
" - level %d number of eigenvectors requested nConv %d\n", i + 1,
nvec[i]);
199 gauge_param.
X[0] =
xdim;
200 gauge_param.
X[1] =
ydim;
201 gauge_param.
X[2] =
zdim;
202 gauge_param.
X[3] =
tdim;
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;
243 errorQuda(
"Only real spectrum type (LR or SR) can be passed to the a Lanczos type solver");
320 printfQuda(
"Twisted-mass doublet non supported (yet)\n");
335 for (
int i=0; i<mg_param.
n_level; i++) {
495 for (
int i = 0; i < mg_param.
n_level; i++) {
507 inv_param.
tol = 1e-10;
560 printfQuda(
"Twisted-mass doublet non supported (yet)\n");
605 inv_param.
omega = 1.0;
608 int main(
int argc,
char **argv)
664 for (
int i = 1; i < argc; i++){
668 printf(
"ERROR: Invalid option:%s\n", argv[i]);
713 mg_param.
eig_param[i] = &mg_eig_param[i];
735 void *gauge[4], *clover=0, *clover_inv=0;
737 for (
int dir = 0; dir < 4; dir++) {
781 printfQuda(
"Computed plaquette is %e (spatial = %e, temporal = %e)\n", plaq[0], plaq[1], plaq[2]);
795 double *time =
new double[
Nsrc];
796 double *gflops =
new double[
Nsrc];
798 for (
int i = 0; i <
Nsrc; i++) {
802 time[i] = inv_param.
secs;
803 gflops[i] = inv_param.
gflops / inv_param.
secs;
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];
827 auto stddev_time = Nsrc > 1 ?
sqrt((Nsrc / ((
double)Nsrc - 1.0)) * (mean_time2 - mean_time * mean_time)) : std::numeric_limits<double>::infinity();
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);
845 void *evenOut = spinorCheck;
846 void *oddOut = (
char *)evenOut + tm_offset *
cpu_prec;
849 void *oddIn = (
char *)evenIn + tm_offset *
cpu_prec;
877 void *out0 = spinorCheck;
878 void *out1 = (
char *)out0 + tm_offset *
cpu_prec;
881 void *in1 = (
char *)in0 + tm_offset *
cpu_prec;
891 tmc_matpc(spinorCheck, gauge, spinorOut, clover, clover_inv, inv_param.
kappa, inv_param.
mu,
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);
914 printfQuda(
"Residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
932 if (clover) free(clover);
933 if (clover_inv) free(clover_inv);
936 for (
int dir = 0; dir<4; dir++) free(gauge[dir]);
QudaInverterType setup_inv[QUDA_MAX_MG_LEVEL]
int dimPartitioned(int dim)
QudaDiracFieldOrder dirac_order
QudaMassNormalization mass_normalization
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
QudaReconstructType reconstruct_sloppy
void freeCloverQuda(void)
int num_setup_iter[QUDA_MAX_MG_LEVEL]
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
QudaPrecision prec_precondition
QudaVerbosity verbosity_precondition
QudaEigParam * eig_param[QUDA_MAX_MG_LEVEL]
enum QudaPrecision_s QudaPrecision
QudaSchwarzType schwarz_type[QUDA_MAX_MG_LEVEL]
double setup_ca_lambda_max[QUDA_MAX_MG_LEVEL]
QudaMultigridParam newQudaMultigridParam(void)
bool mg_eig_use_poly_acc[QUDA_MAX_MG_LEVEL]
QudaPrecision & cuda_prec
QudaSolveType coarse_solve_type[QUDA_MAX_MG_LEVEL]
QudaSchwarzType schwarz_type
__host__ __device__ ValueType norm(const complex< ValueType > &z)
Returns the magnitude of z squared.
QudaReconstructType link_recon_precondition
void tm_mat(void *out, void **gauge, void *in, double kappa, double mu, QudaTwistFlavorType flavor, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
bool mg_eig_use_dagger[QUDA_MAX_MG_LEVEL]
enum QudaResidualType_s QudaResidualType
int main(int argc, char **argv)
double coarse_solver_ca_lambda_min[QUDA_MAX_MG_LEVEL]
QudaInverterType inv_type_precondition
bool mg_eig_use_normop[QUDA_MAX_MG_LEVEL]
QudaBoolean use_eig_solver[QUDA_MAX_MG_LEVEL]
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
void setEigParam(QudaEigParam &mg_eig_param, int level)
QudaFieldLocation solver_location[QUDA_MAX_MG_LEVEL]
QudaDslashType dslash_type
QudaReconstructType reconstruct_precondition
QudaInverterType inv_type
int return_clover_inverse
QudaSolveType smoother_solve_type[QUDA_MAX_MG_LEVEL]
double mu_factor[QUDA_MAX_MG_LEVEL]
enum QudaSolveType_s QudaSolveType
double setup_tol[QUDA_MAX_MG_LEVEL]
__host__ __device__ ValueType sqrt(ValueType x)
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
int num_setup_iter[QUDA_MAX_MG_LEVEL]
const char * get_eig_spectrum_str(QudaEigSpectrumType type)
int process_command_line_option(int argc, char **argv, int *idx)
int nu_pre[QUDA_MAX_MG_LEVEL]
double coarse_solver_tol[QUDA_MAX_MG_LEVEL]
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)
QudaBoolean pre_orthonormalize
QudaSchwarzType smoother_schwarz_type[QUDA_MAX_MG_LEVEL]
void destroyMultigridQuda(void *mg_instance)
Free resources allocated by the multigrid solver.
void plaqQuda(double plaq[3])
QudaBoolean vec_load[QUDA_MAX_MG_LEVEL]
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)
double mg_eig_tol[QUDA_MAX_MG_LEVEL]
double setup_ca_lambda_min[QUDA_MAX_MG_LEVEL]
int nu_post[QUDA_MAX_MG_LEVEL]
QudaGaugeParam gauge_param
QudaPrecision smoother_halo_precision[QUDA_MAX_MG_LEVEL]
QudaPrecision clover_cuda_prec_refinement_sloppy
QudaGaugeFieldOrder gauge_order
void tmc_mat(void *out, void **gauge, void *clover, void *in, double kappa, double mu, QudaTwistFlavorType flavor, int dagger, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaTwistFlavorType twist_flavor
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)
void loadCloverQuda(void *h_clover, void *h_clovinv, QudaInvertParam *inv_param)
int mg_eig_nKr[QUDA_MAX_MG_LEVEL]
enum QudaEigType_s QudaEigType
void construct_spinor_source(void *v, int nSpin, int nColor, QudaPrecision precision, const int *const x, quda::RNG &rng)
QudaBoolean setup_minimize_memory
double mu_factor[QUDA_MAX_MG_LEVEL]
int geo_block_size[QUDA_MAX_MG_LEVEL][QUDA_MAX_DIM]
QudaPrecision clover_cuda_prec_sloppy
QudaFieldLocation input_location
QudaPrecision & cuda_prec_sloppy
QudaCABasis setup_ca_basis[QUDA_MAX_MG_LEVEL]
int n_vec[QUDA_MAX_MG_LEVEL]
QudaSolutionType solution_type
QudaFieldLocation setup_location[QUDA_MAX_MG_LEVEL]
double setup_ca_lambda_min[QUDA_MAX_MG_LEVEL]
QudaEigSpectrumType mg_eig_spectrum[QUDA_MAX_MG_LEVEL]
QudaPrecision clover_cuda_prec
QudaFieldLocation setup_location[QUDA_MAX_MG_LEVEL]
QudaBoolean global_reduction[QUDA_MAX_MG_LEVEL]
const char * get_eig_type_str(QudaEigType type)
QudaPrecision & cuda_prec_precondition
QudaBoolean require_convergence
void initQuda(int device)
int coarse_solver_maxiter[QUDA_MAX_MG_LEVEL]
void ax(const double &a, GaugeField &u)
Scale the gauge field by the scalar a.
QudaCABasis coarse_solver_ca_basis[QUDA_MAX_MG_LEVEL]
QudaFieldLocation output_location
QudaPrecision clover_cuda_prec_precondition
QudaInvertParam inv_param
QudaBoolean post_orthonormalize
QudaMultigridCycleType cycle_type[QUDA_MAX_MG_LEVEL]
QudaCABasis setup_ca_basis[QUDA_MAX_MG_LEVEL]
void setTransferGPU(bool)
QudaReconstructType link_recon
QudaPrecision cuda_prec_sloppy
void setSpinorSiteSize(int n)
int setup_maxiter[QUDA_MAX_MG_LEVEL]
double tol_offset[QUDA_MAX_MULTI_SHIFT]
QudaPrecision smoother_halo_prec
QudaInvertParam newQudaInvertParam(void)
const char * get_recon_str(QudaReconstructType recon)
QudaPrecision cuda_prec_precondition
QudaCloverFieldOrder clover_order
Class declaration to initialize and hold CURAND RNG states.
double omega[QUDA_MAX_MG_LEVEL]
enum QudaMatPCType_s QudaMatPCType
cpuColorSpinorField * spinorOut
void * newMultigridQuda(QudaMultigridParam *param)
double coarse_solver_ca_lambda_max[QUDA_MAX_MG_LEVEL]
double smoother_tol[QUDA_MAX_MG_LEVEL]
int gridsize_from_cmdline[]
QudaGammaBasis gamma_basis
bool mg_eig_require_convergence[QUDA_MAX_MG_LEVEL]
QudaPrecision precision_null[QUDA_MAX_MG_LEVEL]
enum QudaSchwarzType_s QudaSchwarzType
QudaPrecision cuda_prec_sloppy
QudaVerbosity verbosity[QUDA_MAX_MG_LEVEL]
QudaInverterType coarse_solver[QUDA_MAX_MG_LEVEL]
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)
QudaReconstructType reconstruct
QudaDslashType dslash_type
char mg_vec_infile[QUDA_MAX_MG_LEVEL][256]
int mg_eig_nEv[QUDA_MAX_MG_LEVEL]
double mg_eig_amin[QUDA_MAX_MG_LEVEL]
QudaBoolean vec_store[QUDA_MAX_MG_LEVEL]
double norm_2(void *v, int len, QudaPrecision precision)
int mg_eig_poly_deg[QUDA_MAX_MG_LEVEL]
QudaInverterType coarse_solver[QUDA_MAX_MG_LEVEL]
int compute_clover_inverse
QudaBoolean run_oblique_proj_check
QudaFieldLocation location[QUDA_MAX_MG_LEVEL]
int n_block_ortho[QUDA_MAX_MG_LEVEL]
void construct_clover_field(void *clover, double norm, double diag, QudaPrecision precision)
int smoother_schwarz_cycle[QUDA_MAX_MG_LEVEL]
char vec_outfile[QUDA_MAX_MG_LEVEL][256]
QudaBoolean run_low_mode_check
int schwarz_cycle[QUDA_MAX_MG_LEVEL]
enum QudaFieldLocation_s QudaFieldLocation
int spin_block_size[QUDA_MAX_MG_LEVEL]
double coarse_solver_ca_lambda_max[QUDA_MAX_MG_LEVEL]
void wil_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaPrecision cuda_prec_precondition
int coarse_solver_ca_basis_size[QUDA_MAX_MG_LEVEL]
QudaSolutionType coarse_grid_solution_type[QUDA_MAX_MG_LEVEL]
int mg_eig_check_interval[QUDA_MAX_MG_LEVEL]
enum QudaEigSpectrumType_s QudaEigSpectrumType
int geo_block_size[QUDA_MAX_MG_LEVEL][QUDA_MAX_DIM]
int setup_ca_basis_size[QUDA_MAX_MG_LEVEL]
QudaBoolean generate_all_levels
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
int nu_pre[QUDA_MAX_MG_LEVEL]
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
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]
QudaCABasis coarse_solver_ca_basis[QUDA_MAX_MG_LEVEL]
QudaSolveType smoother_solve_type[QUDA_MAX_MG_LEVEL]
QudaTwistFlavorType twist_flavor
bool mg_eig[QUDA_MAX_MG_LEVEL]
char vec_infile[QUDA_MAX_MG_LEVEL][256]
double mg_eig_amax[QUDA_MAX_MG_LEVEL]
char mg_vec_outfile[QUDA_MAX_MG_LEVEL][256]
enum QudaDslashType_s QudaDslashType
QudaEigType mg_eig_type[QUDA_MAX_MG_LEVEL]
QudaEigSpectrumType spectrum
void mxpy(ColorSpinorField &x, ColorSpinorField &y)
QudaResidualType residual_type
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]
enum QudaVerbosity_s QudaVerbosity
int coarse_solver_maxiter[QUDA_MAX_MG_LEVEL]
#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]
int nu_post[QUDA_MAX_MG_LEVEL]
int setup_maxiter[QUDA_MAX_MG_LEVEL]
QudaComputeNullVector compute_null_vector
void initComms(int argc, char **argv, int *const commDims)
double smoother_tol[QUDA_MAX_MG_LEVEL]
void read_gauge_field(const char *filename, void *gauge[], QudaPrecision prec, const int *X, int argc, char *argv[])
QudaReconstructType link_recon_sloppy
void setGaugeParam(QudaGaugeParam &gauge_param)
int n_block_ortho[QUDA_MAX_MG_LEVEL]
int setup_ca_basis_size[QUDA_MAX_MG_LEVEL]
QudaPrecision clover_cpu_prec
double coarse_solver_ca_lambda_min[QUDA_MAX_MG_LEVEL]
QudaPrecision cuda_prec_ritz
QudaPrecision prec_sloppy
QudaInverterType setup_inv_type[QUDA_MAX_MG_LEVEL]
QudaInverterType smoother[QUDA_MAX_MG_LEVEL]
QudaEigParam newQudaEigParam(void)
enum QudaInverterType_s QudaInverterType
double setup_tol[QUDA_MAX_MG_LEVEL]
QudaGaugeParam newQudaGaugeParam(void)
void setInvertParam(QudaInvertParam &inv_param)
QudaInverterType smoother_type[QUDA_MAX_MG_LEVEL]
QudaPreserveSource preserve_source
QudaInvertParam * invert_param
QudaVerbosity mg_verbosity[QUDA_MAX_MG_LEVEL]
double setup_ca_lambda_max[QUDA_MAX_MG_LEVEL]
enum QudaTwistFlavorType_s QudaTwistFlavorType