15 #if defined(QMP_COMMS) 17 #elif defined(MPI_COMMS) 23 #define MAX(a,b) ((a)>(b)?(a):(b)) 59 extern void usage(
char** );
68 printfQuda(
"prec prec_sloppy multishift matpc_type recon recon_sloppy S_dimension T_dimension Ls_dimension dslash_type normalization\n");
69 printfQuda(
"%6s %6s %d %12s %2s %2s %3d/%3d/%3d %3d %2d %14s %8s\n",
93 printfQuda(
" --num_src n # Numer of sources used\n");
100 int main(
int argc,
char **argv)
105 for (
int i = 1; i < argc; i++){
113 if( strcmp(argv[i],
"--num_src") == 0){
117 num_src= atoi(argv[i+1]);
123 printfQuda(
"ERROR: Invalid option:%s\n", argv[i]);
162 gauge_param.
X[0] =
xdim;
163 gauge_param.
X[1] =
ydim;
164 gauge_param.
X[2] =
zdim;
165 gauge_param.
X[3] =
tdim;
195 kappa5 = 0.5/(5 + inv_param.
m5);
199 kappa5 = 0.5/(5 + inv_param.
m5);
201 for(
int k = 0; k <
Lsdim; k++)
205 inv_param.
b_5[k] = 1.452;
206 inv_param.
c_5[k] = 0.452;
213 double offset[12] = {0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12};
246 errorQuda(
"qudaInvert: requesting zero residual\n");
275 inv_param.
omega = 1.0;
293 int x_face_size = gauge_param.
X[1]*gauge_param.
X[2]*gauge_param.
X[3]/2;
294 int y_face_size = gauge_param.
X[0]*gauge_param.
X[2]*gauge_param.
X[3]/2;
295 int z_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[3]/2;
296 int t_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[2]/2;
297 int pad_size =
MAX(x_face_size, y_face_size);
298 pad_size =
MAX(pad_size, z_face_size);
299 pad_size =
MAX(pad_size, t_face_size);
300 gauge_param.
ga_pad = pad_size;
331 void *gauge[4], *clover_inv=0, *clover=0;
333 for (
int dir = 0; dir < 4; dir++) {
362 int asymmetric = preconditioned &&
365 if (!preconditioned) {
368 }
else if (asymmetric) {
377 void **spinorIn = (
void**)malloc(inv_param.
num_src*
sizeof(
void *));
378 void **spinorCheck = (
void**)malloc(inv_param.
num_src*
sizeof(
void *));
379 for (
int i=0; i<inv_param.
num_src; i++) {
384 void **spinorOutMulti = NULL;
386 spinorOutMulti = (
void**)malloc(inv_param.
num_src*
sizeof(
void *));
387 for (
int i=0; i<inv_param.
num_src; i++) {
396 for (
int i=0; i<inv_param.
num_src; i++) {
408 for (
int j=0; j<inv_param.
num_src; j++) {
411 for (
int i=0; i<inv_param.
Ls*
V; i++) ((
float*)spinorIn[j])[i*
spinorSiteSize+j] = rand() / (float)RAND_MAX;
414 for (
int i=0; i<inv_param.
Ls*
V; i++) ((
double*)spinorIn[j])[i*
spinorSiteSize+j] = rand() / (double)RAND_MAX;
418 double time0 = -((double)clock());
440 time0 /= CLOCKS_PER_SEC;
442 printfQuda(
"\nDone: %i iter / %g secs = %g Gflops, total time = %g secs\n",
445 for(
int i = 0; i < inv_param.
num_src ; i++){
446 invertQuda(spinorOutMulti[i], spinorIn[i], &inv_param);
491 for (
int i=0; i <inv_param.
num_src; i++){
501 void *evenOut = spinorCheck[i];
502 void *oddOut = cpu_prec ==
sizeof(double) ? (
void*)((
double*)evenOut + tm_offset): (
void*)((
float*)evenOut + tm_offset);
504 void *evenIn = spinorOutMulti[i];
505 void *oddIn = cpu_prec ==
sizeof(double) ? (
void*)((
double*)evenIn + tm_offset): (
void*)((
float*)evenIn + tm_offset);
507 tm_ndeg_mat(evenOut, oddOut, gauge, evenIn, oddIn, inv_param.
kappa, inv_param.
mu, inv_param.
epsilon, 0, inv_param.
cpu_prec, gauge_param);
510 wil_mat(spinorCheck[i], gauge, spinorOutMulti[i], inv_param.
kappa, 0, inv_param.
cpu_prec, gauge_param);
512 dw_mat(spinorCheck[i], gauge, spinorOutMulti[i], kappa5, inv_param.
dagger, inv_param.
cpu_prec, gauge_param, inv_param.
mass);
537 errorQuda(
"Twisted mass solution type not supported");
548 double _Complex *kappa_b = (
double _Complex *)malloc(
Lsdim *
sizeof(
double _Complex));
549 double _Complex *kappa_c = (
double _Complex *)malloc(
Lsdim *
sizeof(
double _Complex));
550 for(
int xs = 0 ; xs <
Lsdim ; xs++)
552 kappa_b[xs] = 1.0/(2*(inv_param.
b_5[xs]*(4.0 + inv_param.
m5) + 1.0));
553 kappa_c[xs] = 1.0/(2*(inv_param.
c_5[xs]*(4.0 + inv_param.
m5) - 1.0));
555 mdw_matpc(spinorCheck[i], gauge, spinorOutMulti[i], kappa_b, kappa_c, inv_param.
matpc_type, 0, inv_param.
cpu_prec, gauge_param, inv_param.
mass, inv_param.
b_5, inv_param.
c_5);
582 errorQuda(
"Twisted mass solution type not supported");
598 errorQuda(
"Mass normalization not implemented");
607 double nrm2 =
norm_2(spinorCheck[i], vol*spinorSiteSize*inv_param.
Ls, inv_param.
cpu_prec);
608 double src2 =
norm_2(spinorIn[i], vol*spinorSiteSize*inv_param.
Ls, inv_param.
cpu_prec);
609 double l2r =
sqrt(nrm2 / src2);
613 printfQuda(
"rhs %d residuals: (L2 relative) tol %g, QUDA = %g, host = %g; (heavy-quark) tol %g, QUDA = %g\n",
int dimPartitioned(int dim)
void ax(double a, ColorSpinorField &x)
QudaDiracFieldOrder dirac_order
void usage_extra(char **argv)
QudaMassNormalization mass_normalization
double tol_hq_offset[QUDA_MAX_MULTI_SHIFT]
enum QudaMassNormalization_s QudaMassNormalization
QudaReconstructType reconstruct_sloppy
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 construct_gauge_field(void **gauge, int type, QudaPrecision precision, QudaGaugeParam *param)
QudaDslashType dslash_type
QudaVerbosity verbosity_precondition
enum QudaPrecision_s QudaPrecision
double_complex c_5[QUDA_MAX_DWF_LS]
void dw_setDims(int *X, const int L5)
QudaSchwarzType schwarz_type
__host__ __device__ ValueType norm(const complex< ValueType > &z)
Returns the magnitude of z squared.
void tm_mat(void *out, void **gauge, void *in, double kappa, double mu, QudaTwistFlavorType flavor, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaInverterType inv_type_precondition
void invertQuda(void *h_x, void *h_b, QudaInvertParam *param)
QudaDslashType dslash_type
QudaReconstructType reconstruct_precondition
QudaInverterType inv_type
__host__ __device__ ValueType sqrt(ValueType x)
void loadGaugeQuda(void *h_gauge, QudaGaugeParam *param)
QudaPrecision & cuda_prec
int process_command_line_option(int argc, char **argv, int *idx)
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)
const char * get_matpc_str(QudaMatPCType type)
QudaGaugeParam gauge_param
QudaGaugeFieldOrder gauge_order
void dw_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param, double mferm)
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)
QudaPrecision & cuda_prec_precondition
QudaPrecision clover_cuda_prec_sloppy
QudaFieldLocation input_location
double true_res_hq_offset[QUDA_MAX_MULTI_SHIFT]
double_complex b_5[QUDA_MAX_DWF_LS]
QudaSolutionType solution_type
QudaSolverNormalization solver_normalization
QudaPrecision clover_cuda_prec
QudaPrecision & cuda_prec_sloppy
QudaInverterType precon_type
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)
QudaFieldLocation output_location
QudaPrecision clover_cuda_prec_precondition
QudaInvertParam inv_param
QudaPrecision cuda_prec_sloppy
void setSpinorSiteSize(int n)
const char * get_mass_normalization_str(QudaMassNormalization type)
double tol_offset[QUDA_MAX_MULTI_SHIFT]
double true_res_offset[QUDA_MAX_MULTI_SHIFT]
QudaInvertParam newQudaInvertParam(void)
const char * get_recon_str(QudaReconstructType recon)
QudaPrecision cuda_prec_precondition
QudaCloverFieldOrder clover_order
enum QudaMatPCType_s QudaMatPCType
QudaGammaBasis gamma_basis
QudaPrecision cuda_prec_sloppy
const char * get_dslash_str(QudaDslashType type)
double offset[QUDA_MAX_MULTI_SHIFT]
int use_sloppy_partial_accumulator
QudaReconstructType reconstruct
double norm_2(void *v, int len, QudaPrecision precision)
QudaReconstructType link_recon_sloppy
void * memset(void *s, int c, size_t n)
void construct_clover_field(void *clover, double norm, double diag, QudaPrecision precision)
void wil_mat(void *out, void **gauge, void *in, double kappa, int dagger_bit, QudaPrecision precision, QudaGaugeParam &gauge_param)
QudaPrecision cuda_prec_precondition
QudaInverterType inv_type
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
void invertMultiSrcQuda(void **_hp_x, void **_hp_b, QudaInvertParam *param)
QudaTwistFlavorType twist_flavor
QudaTwistFlavorType twist_flavor
enum QudaDslashType_s QudaDslashType
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 main(int argc, char **argv)
QudaMassNormalization normalization
QudaReconstructType link_recon
cpuColorSpinorField * spinorTmp
void initComms(int argc, char **argv, int *const commDims)
void read_gauge_field(const char *filename, void *gauge[], QudaPrecision prec, const int *X, int argc, char *argv[])
QudaPrecision clover_cpu_prec
int gridsize_from_cmdline[]
enum QudaInverterType_s QudaInverterType
QudaPrecision prec_sloppy
QudaGaugeParam newQudaGaugeParam(void)
QudaPreserveSource preserve_source
enum QudaTwistFlavorType_s QudaTwistFlavorType