QUDA  v0.5.0
A library for QCD on GPUs
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
su3_test.cpp
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 #include <test_util.h>
6 #include <dslash_util.h>
7 
8 #include <gauge_qio.h>
9 
10 #ifdef QMP_COMMS
11 #include <qmp.h>
12 #endif
13 
15 void *gauge[4], *new_gauge[4];
16 
17 extern int device;
18 extern int xdim;
19 extern int ydim;
20 extern int zdim;
21 extern int tdim;
22 extern int gridsize_from_cmdline[];
24 extern QudaPrecision prec;
25 extern char latfile[];
26 
27 #define MAX(a,b) ((a)>(b)?(a):(b))
28 
29 void init() {
30 
31  param = newQudaGaugeParam();
32 
34  param.cuda_prec = prec;
35  param.reconstruct = link_recon;
36  param.cuda_prec_sloppy = prec;
38 
39  param.type = QUDA_WILSON_LINKS;
41 
42  param.X[0] = xdim;
43  param.X[1] = ydim;
44  param.X[2] = zdim;
45  param.X[3] = tdim;
46  setDims(param.X);
47 
48  param.anisotropy = 1.0;
51 #ifdef MULTI_GPU
52  int x_face_size = param.X[1]*param.X[2]*param.X[3]/2;
53  int y_face_size = param.X[0]*param.X[2]*param.X[3]/2;
54  int z_face_size = param.X[0]*param.X[1]*param.X[3]/2;
55  int t_face_size = param.X[0]*param.X[1]*param.X[2]/2;
56  int pad_size = MAX(x_face_size, y_face_size);
57  pad_size = MAX(pad_size, z_face_size);
58  pad_size = MAX(pad_size, t_face_size);
59  param.ga_pad = pad_size;
60 #else
61  param.ga_pad = 0;
62 #endif
63 
64  // construct gauge fields
65  for (int dir = 0; dir < 4; dir++) {
66  gauge[dir] = malloc(V*gaugeSiteSize*param.cpu_prec);
67  new_gauge[dir] = malloc(V*gaugeSiteSize*param.cpu_prec);
68  }
69 
71 }
72 
73 void end() {
74  endQuda();
75 
76  // release memory
77  for (int dir = 0; dir < 4; dir++) {
78  free(gauge[dir]);
79  free(new_gauge[dir]);
80  }
81 }
82 
83 extern void usage(char**);
84 
85 void SU3Test(int argc, char **argv) {
86 
87  for (int i =1;i < argc; i++){
88  if(process_command_line_option(argc, argv, &i) == 0){
89  continue;
90  }
91 
92  fprintf(stderr, "ERROR: Invalid option:%s\n", argv[i]);
93  usage(argv);
94  }
95 
96  init();
97 
98  if (strcmp(latfile,"")) { // load in the command line supplied gauge field
99  read_gauge_field(latfile, gauge, param.cpu_prec, param.X, argc, argv);
100  construct_gauge_field((void**)gauge, 2, param.cpu_prec, &param);
101  } else { // generate a random SU(3) field
102  printf("Randomizing fields...");
103  construct_gauge_field((void**)gauge, 1, param.cpu_prec, &param);
104  printf("done.\n");
105  }
106 
107  loadGaugeQuda(gauge, &param);
108  saveGaugeQuda(new_gauge, &param);
109 
110  check_gauge(gauge, new_gauge, 1e-3, param.cpu_prec);
111 
112  end();
113 }
114 
115 int main(int argc, char **argv) {
116 
117  initComms(argc, argv, gridsize_from_cmdline);
118 
119  SU3Test(argc, argv);
120 
121  finalizeComms();
122 
123  return 0;
124 }