15 #if defined(QMP_COMMS) 17 #elif defined(MPI_COMMS) 31 #define MAX(a,b) ((a)>(b)?(a):(b)) 125 extern void usage(
char** );
141 printfQuda(
"prec sloppy_prec link_recon sloppy_link_recon S_dimension T_dimension Ls_dimension\n");
150 printfQuda(
" - level %d number of null-space vectors %d\n", i+1,
nvec[i]);
151 printfQuda(
" - level %d number of pre-smoother applications %d\n", i+1,
nu_pre[i]);
152 printfQuda(
" - level %d number of post-smoother applications %d\n", i+1,
nu_post[i]);
175 gauge_param.
X[0] =
xdim;
176 gauge_param.
X[1] =
ydim;
177 gauge_param.
X[2] =
zdim;
178 gauge_param.
X[3] =
tdim;
201 int x_face_size = gauge_param.
X[1]*gauge_param.
X[2]*gauge_param.
X[3]/2;
202 int y_face_size = gauge_param.
X[0]*gauge_param.
X[2]*gauge_param.
X[3]/2;
203 int z_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[3]/2;
204 int t_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[2]/2;
205 int pad_size =
MAX(x_face_size, y_face_size);
206 pad_size =
MAX(pad_size, z_face_size);
207 pad_size =
MAX(pad_size, t_face_size);
208 gauge_param.
ga_pad = pad_size;
257 printfQuda(
"Twisted-mass doublet non supported (yet)\n");
272 for (
int i=0; i<mg_param.
n_level; i++) {
406 mg_param.
omega[i] = 0.85;
427 for (
int i = 0; i < mg_param.
n_level; i++) {
437 inv_param.
tol = 1e-10;
489 printfQuda(
"Twisted-mass doublet non supported (yet)\n");
534 inv_param.
omega = 1.0;
538 using namespace quda;
540 const double max_error = 1e-10;
546 reunit_allow_svd, reunit_svd_only,
547 svd_rel_error, svd_abs_error);
552 using namespace quda;
555 cudaMemset(num_failures_dev, 0,
sizeof(
int));
558 cudaMemcpy(&num_failures, num_failures_dev,
sizeof(
int), cudaMemcpyDeviceToHost);
559 if(num_failures>0)
errorQuda(
"Error in the unitarization\n");
563 int main(
int argc,
char **argv)
604 for (
int i = 1; i < argc; i++){
608 printf(
"ERROR: Invalid option:%s\n", argv[i]);
664 void *gauge[4], *clover=0, *clover_inv=0;
666 for (
int dir = 0; dir < 4; dir++) {
703 double time0 = -((double)clock());
709 using namespace quda;
722 int R[4] = {0,0,0,0};
724 for(
int dir=0; dir<4; ++dir) y[dir] = gauge_param.
X[dir] + 2 * R[dir];
728 gParamEx.order = gParam.
order;
732 for(
int dir=0; dir<4; ++dir) gParamEx.r[dir] = R[dir];
735 RNG *randstates =
new RNG(*gauge, 1234);
741 bool coldstart =
false;
742 double beta_value = 6.2;
752 Monte(*gaugeEx, *randstates, beta_value, 100 * nhbsteps, 100 * novrsteps);
765 printfQuda(
"step=0 plaquette = %e topological charge = %e\n", plaq.x, charge);
773 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
float*)spinorIn)[i] = rand() / (float)RAND_MAX;
775 for (
int i=0; i<inv_param.
Ls*
V*
spinorSiteSize; i++) ((
double*)spinorIn)[i] = rand() / (double)RAND_MAX;
802 for(
int step=1; step<=nsteps; ++step){
803 Monte( *gaugeEx, *randstates, beta_value, nhbsteps, novrsteps);
814 printfQuda(
"step=%d plaquette = %e topological charge = %e\n", step, plaq.x, charge);
830 for (
int i=0; i<mg_param.
n_level; i++) {
832 sprintf(mg_param.
vec_outfile[i],
"dump_step_%d", step);
834 warningQuda(
"Solver failed to converge within max iteration count - dumping null vectors to %s",
838 for (
int i=0; i<mg_param.
n_level; i++) {
860 time0 /= CLOCKS_PER_SEC;
864 printfQuda(
"\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
877 if (clover) free(clover);
878 if (clover_inv) free(clover_inv);
881 for (
int dir = 0; dir<4; dir++) free(gauge[dir]);
static bool reunit_allow_svd
int dimPartitioned(int dim)
QudaDiracFieldOrder dirac_order
QudaMassNormalization mass_normalization
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
QudaReconstructType reconstruct_sloppy
void freeCloverQuda(void)
void Init()
Initialize CURAND RNG states.
QudaGhostExchange ghostExchange
void construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
QudaVerbosity verbosity_precondition
enum QudaPrecision_s QudaPrecision
double setup_ca_lambda_max[QUDA_MAX_MG_LEVEL]
QudaMultigridParam newQudaMultigridParam(void)
QudaSchwarzType schwarz_type
__host__ __device__ ValueType norm(const complex< ValueType > &z)
Returns the magnitude of z squared.
QudaPrecision prec_sloppy
enum QudaResidualType_s QudaResidualType
QudaInverterType inv_type_precondition
int setup_maxiter_refresh[QUDA_MAX_MG_LEVEL]
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
void setUnitarizeLinksConstants(double unitarize_eps, double max_error, bool allow_svd, bool svd_only, double svd_rel_error, double svd_abs_error)
QudaDslashType dslash_type
QudaReconstructType reconstruct_precondition
QudaInverterType inv_type
int return_clover_inverse
QudaSolveType smoother_solve_type[QUDA_MAX_MG_LEVEL]
QudaCABasis coarse_solver_ca_basis[QUDA_MAX_MG_LEVEL]
enum QudaSolveType_s QudaSolveType
double setup_tol[QUDA_MAX_MG_LEVEL]
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
int num_setup_iter[QUDA_MAX_MG_LEVEL]
QudaTwistFlavorType twist_flavor
int process_command_line_option(int argc, char **argv, int *idx)
double coarse_solver_tol[QUDA_MAX_MG_LEVEL]
QudaPrecision & cuda_prec
QudaBoolean pre_orthonormalize
QudaSchwarzType smoother_schwarz_type[QUDA_MAX_MG_LEVEL]
void CallUnitarizeLinks(quda::cudaGaugeField *cudaInGauge)
void destroyMultigridQuda(void *mg_instance)
Free resources allocated by the multigrid solver.
QudaBoolean vec_load[QUDA_MAX_MG_LEVEL]
double setup_ca_lambda_min[QUDA_MAX_MG_LEVEL]
QudaGaugeParam gauge_param
QudaPrecision smoother_halo_precision[QUDA_MAX_MG_LEVEL]
QudaGaugeFieldOrder gauge_order
const char * get_prec_str(QudaPrecision prec)
double mu_factor[QUDA_MAX_MG_LEVEL]
QudaSchwarzType schwarz_type[QUDA_MAX_MG_LEVEL]
QudaPrecision clover_cuda_prec_sloppy
QudaPrecision chrono_precision
QudaFieldLocation input_location
QudaPrecision & cuda_prec_precondition
QudaCABasis setup_ca_basis[QUDA_MAX_MG_LEVEL]
QudaUseInitGuess use_init_guess
int n_vec[QUDA_MAX_MG_LEVEL]
QudaPrecision prec_precondition
QudaDslashType dslash_type
int coarse_solver_maxiter[QUDA_MAX_MG_LEVEL]
QudaSolutionType solution_type
QudaFieldLocation setup_location[QUDA_MAX_MG_LEVEL]
int geo_block_size[QUDA_MAX_MG_LEVEL][QUDA_MAX_DIM]
static double svd_rel_error
QudaPrecision clover_cuda_prec
int num_setup_iter[QUDA_MAX_MG_LEVEL]
QudaBoolean global_reduction[QUDA_MAX_MG_LEVEL]
void initQuda(int device)
int coarse_solver_maxiter[QUDA_MAX_MG_LEVEL]
QudaFieldLocation output_location
void unitarizeLinks(cudaGaugeField &outfield, const cudaGaugeField &infield, int *fails)
QudaPrecision clover_cuda_prec_precondition
QudaFieldLocation solver_location[QUDA_MAX_MG_LEVEL]
QudaInvertParam inv_param
QudaBoolean post_orthonormalize
QudaMultigridCycleType cycle_type[QUDA_MAX_MG_LEVEL]
void PGaugeExchangeFree()
Release all allocated memory used to exchange data between nodes.
void setTransferGPU(bool)
int coarse_solver_ca_basis_size[QUDA_MAX_MG_LEVEL]
QudaSolveType smoother_solve_type[QUDA_MAX_MG_LEVEL]
QudaInverterType smoother_type[QUDA_MAX_MG_LEVEL]
QudaPrecision cuda_prec_sloppy
void Release()
Release Device memory for CURAND RNG states.
QudaReconstructType link_recon
void setSpinorSiteSize(int n)
int setup_maxiter[QUDA_MAX_MG_LEVEL]
static bool reunit_svd_only
void dumpMultigridQuda(void *mg_instance, QudaMultigridParam *param)
Dump the null-space vectors to disk.
double tol_offset[QUDA_MAX_MULTI_SHIFT]
QudaInvertParam newQudaInvertParam(void)
const char * get_recon_str(QudaReconstructType recon)
QudaPrecision cuda_prec_precondition
double coarse_solver_ca_lambda_max[QUDA_MAX_MG_LEVEL]
QudaCloverFieldOrder clover_order
Class declaration to initialize and hold CURAND RNG states.
double omega[QUDA_MAX_MG_LEVEL]
enum QudaMatPCType_s QudaMatPCType
cpuColorSpinorField * spinorOut
double setup_ca_lambda_min[QUDA_MAX_MG_LEVEL]
void * newMultigridQuda(QudaMultigridParam *param)
QudaGaugeFieldOrder order
double smoother_tol[QUDA_MAX_MG_LEVEL]
QudaGammaBasis gamma_basis
double setup_ca_lambda_max[QUDA_MAX_MG_LEVEL]
QudaPrecision precision_null[QUDA_MAX_MG_LEVEL]
enum QudaSchwarzType_s QudaSchwarzType
QudaPrecision cuda_prec_sloppy
QudaReconstructType link_recon_precondition
QudaVerbosity verbosity[QUDA_MAX_MG_LEVEL]
void setMultigridParam(QudaMultigridParam &mg_param)
void InitGaugeField(cudaGaugeField &data)
Perform a cold start to the gauge field, identity SU(3) matrix, also fills the ghost links in multi-G...
static double svd_abs_error
QudaInverterType coarse_solver[QUDA_MAX_MG_LEVEL]
QudaInverterType setup_inv[QUDA_MAX_MG_LEVEL]
QudaFieldLocation setup_location[QUDA_MAX_MG_LEVEL]
QudaReconstructType reconstruct
void updateMultigridQuda(void *mg_instance, QudaMultigridParam *param)
Updates the multigrid preconditioner for the new gauge / clover field.
QudaInverterType coarse_solver[QUDA_MAX_MG_LEVEL]
double smoother_tol[QUDA_MAX_MG_LEVEL]
QudaBoolean vec_store[QUDA_MAX_MG_LEVEL]
char mg_vec_outfile[QUDA_MAX_MG_LEVEL][256]
int compute_clover_inverse
void * memset(void *s, int c, size_t n)
double coarse_solver_tol[QUDA_MAX_MG_LEVEL]
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]
enum QudaFieldLocation_s QudaFieldLocation
QudaFieldLocation location
int spin_block_size[QUDA_MAX_MG_LEVEL]
int nu_pre[QUDA_MAX_MG_LEVEL]
QudaPrecision smoother_halo_prec
double coarse_solver_ca_lambda_max[QUDA_MAX_MG_LEVEL]
QudaPrecision cuda_prec_precondition
QudaSolutionType coarse_grid_solution_type[QUDA_MAX_MG_LEVEL]
int geo_block_size[QUDA_MAX_MG_LEVEL][QUDA_MAX_DIM]
void setInvertParam(QudaInvertParam &inv_param)
QudaBoolean generate_all_levels
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
static double unitarize_eps
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
int setup_ca_basis_size[QUDA_MAX_MG_LEVEL]
double setup_tol[QUDA_MAX_MG_LEVEL]
int coarse_solver_ca_basis_size[QUDA_MAX_MG_LEVEL]
QudaCABasis coarse_solver_ca_basis[QUDA_MAX_MG_LEVEL]
QudaTwistFlavorType twist_flavor
char vec_infile[QUDA_MAX_MG_LEVEL][256]
int schwarz_cycle[QUDA_MAX_MG_LEVEL]
QudaPrecision & cuda_prec_sloppy
double mu_factor[QUDA_MAX_MG_LEVEL]
#define device_malloc(size)
enum QudaDslashType_s QudaDslashType
int gridsize_from_cmdline[]
int main(int argc, char **argv)
QudaReconstructType reconstruct
int setup_maxiter_refresh[QUDA_MAX_MG_LEVEL]
int setup_maxiter[QUDA_MAX_MG_LEVEL]
QudaResidualType residual_type
enum QudaVerbosity_s QudaVerbosity
#define QUDA_MAX_DIM
Maximum number of dimensions supported by QUDA. In practice, no routines make use of more than 5...
int nu_post[QUDA_MAX_MG_LEVEL]
char mg_vec_infile[QUDA_MAX_MG_LEVEL][256]
QudaComputeNullVector compute_null_vector
double coarse_solver_ca_lambda_min[QUDA_MAX_MG_LEVEL]
void Monte(cudaGaugeField &data, RNG &rngstate, double Beta, int nhb, int nover)
Perform heatbath and overrelaxation. Performs nhb heatbath steps followed by nover overrelaxation ste...
void initComms(int argc, char **argv, int *const commDims)
QudaCABasis setup_ca_basis[QUDA_MAX_MG_LEVEL]
int n_block_ortho[QUDA_MAX_MG_LEVEL]
void read_gauge_field(const char *filename, void *gauge[], QudaPrecision prec, const int *X, int argc, char *argv[])
void setReunitarizationConsts()
int setup_ca_basis_size[QUDA_MAX_MG_LEVEL]
int nu_post[QUDA_MAX_MG_LEVEL]
QudaPrecision clover_cpu_prec
double coarse_solver_ca_lambda_min[QUDA_MAX_MG_LEVEL]
QudaInverterType setup_inv_type[QUDA_MAX_MG_LEVEL]
void copyExtendedGauge(GaugeField &out, const GaugeField &in, QudaFieldLocation location, void *Out=0, void *In=0)
QudaInverterType smoother[QUDA_MAX_MG_LEVEL]
void setGaugeParam(QudaGaugeParam &gauge_param)
enum QudaInverterType_s QudaInverterType
QudaSolveType coarse_solve_type[QUDA_MAX_MG_LEVEL]
QudaReconstructType link_recon_sloppy
double3 plaquette(const GaugeField &U)
Compute the plaquette of the gauge field.
int comm_dim_partitioned(int dim)
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source
QudaInvertParam * invert_param
enum QudaTwistFlavorType_s QudaTwistFlavorType
QudaVerbosity mg_verbosity[QUDA_MAX_MG_LEVEL]