QUDA  0.9.0
misc.cpp
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "quda.h"
4 #include <string.h>
5 #include "invert_quda.h"
6 #include "misc.h"
7  #include <assert.h>
8 #include "util_quda.h"
9 #include <test_util.h>
10 
11 
12 #define stSpinorSiteSize 6
13 template<typename Float>
15 {
16  printf("(%f,%f) (%f,%f) (%f,%f) \t",
17  spinor[0], spinor[1], spinor[2],
18  spinor[3], spinor[4], spinor[5]);
19 
20  printf("\n");
21  return;
22 }
23 
24 
25 
26 void display_spinor(void* spinor, int len, int precision)
27 {
28  int i;
29 
30  if (precision == QUDA_DOUBLE_PRECISION){
31  double* myspinor = (double*)spinor;
32  for (i = 0;i < len; i++){
34  }
35  }else if (precision == QUDA_SINGLE_PRECISION){
36  float* myspinor = (float*)spinor;
37  for (i=0;i < len ;i++){
39  }
40  }
41  return;
42 }
43 
44 
45 
46 template<typename Float>
47 void display_link_internal(Float* link)
48 {
49  int i, j;
50 
51  for (i = 0;i < 3; i++){
52  for(j=0;j < 3; j++){
53  printf("(%.10f,%.10f) \t", link[i*3*2 + j*2], link[i*3*2 + j*2 + 1]);
54  }
55  printf("\n");
56  }
57  printf("\n");
58  return;
59 }
60 
61 
62 
63 void display_link(void* link, int len, int precision)
64 {
65  int i;
66 
67  if (precision == QUDA_DOUBLE_PRECISION){
68  double* mylink = (double*)link;
69  for (i = 0;i < len; i++){
71  }
72  }else if (precision == QUDA_SINGLE_PRECISION){
73  float* mylink = (float*)link;
74  for (i=0;i < len ;i++){
76  }
77  }
78  return;
79 }
80 
81 
82 
83 template <typename Float>
84 void accumulateConjugateProduct(Float *a, Float *b, Float *c, int sign) {
85  a[0] += sign * (b[0]*c[0] - b[1]*c[1]);
86  a[1] -= sign * (b[0]*c[1] + b[1]*c[0]);
87 }
88 
89 
90 template<typename Float>
91 int link_sanity_check_internal_12(Float* link, int dir, int ga_idx, QudaGaugeParam* gaugeParam, int oddBit)
92 {
93  //printf("link sanity check is called\n");
94 
95  int ret =0;
96 
97  Float refc_buf[6];
98  Float* refc = &refc_buf[0];
99 
100  memset((void*)refc, 0, sizeof(refc_buf));
101 
102  Float* a = link;
103  Float* b = link + 6;
104  Float* c = link + 12;
105 
106  accumulateConjugateProduct(refc + 0*2, a + 1*2, b + 2*2, +1);
107  accumulateConjugateProduct(refc + 0*2, a + 2*2, b + 1*2, -1);
108  accumulateConjugateProduct(refc + 1*2, a + 2*2, b + 0*2, +1);
109  accumulateConjugateProduct(refc + 1*2, a + 0*2, b + 2*2, -1);
110  accumulateConjugateProduct(refc + 2*2, a + 0*2, b + 1*2, +1);
111  accumulateConjugateProduct(refc + 2*2, a + 1*2, b + 0*2, -1);
112 
113  int X1h=gaugeParam->X[0]/2;
114  int X1 =gaugeParam->X[0];
115  int X2 =gaugeParam->X[1];
116  int X3 =gaugeParam->X[2];
117  int X4 =gaugeParam->X[3];
118  double t_boundary = (gaugeParam->t_boundary ==QUDA_ANTI_PERIODIC_T)? -1.0:1.0;
119 
120  double u0 = gaugeParam->tadpole_coeff;
121  double coff= -u0*u0*24;
122  //coff = (dir < 6) ? coff : ( (ga_idx >= (X4-3)*X1h*X2*X3 )? t_boundary : 1);
123 
124  //float u0 = (dir < 6) ? gaugeParam->anisotropy : ( (ga_idx >= (X4-3)*X1h*X2*X3 )? t_boundary : 1);
125 
126 
127 #if 1
128 
129  {
130  int index = fullLatticeIndex(ga_idx, oddBit);
131  int i4 = index /(X3*X2*X1);
132  int i3 = (index - i4*(X3*X2*X1))/(X2*X1);
133  int i2 = (index - i4*(X3*X2*X1) - i3*(X2*X1))/X1;
134  int i1 = index - i4*(X3*X2*X1) - i3*(X2*X1) - i2*X1;
135 
136  if (dir == 0) {
137  if (i4 % 2 == 1){
138  coff *= -1;
139  }
140  }
141 
142  if (dir == 2){
143  if ((i1+i4) % 2 == 1){
144  coff *= -1;
145  }
146  }
147  if (dir == 4){
148  if ( (i4+i1+i2) % 2 == 1){
149  coff *= -1;
150  }
151  }
152  if (dir == 6){
153  if (ga_idx >= (X4-3)*X1h*X2*X3 ){
154  coff *= -1;
155  }
156  }
157 
158  //printf("local ga_idx =%d, index=%d, i4,3,2,1 =%d %d %d %d\n", ga_idx, index, i4, i3, i2,i1);
159 
160  }
161 #endif
162 
163 
164  refc[0]*=coff; refc[1]*=coff; refc[2]*=coff; refc[3]*=coff; refc[4]*=coff; refc[5]*=coff;
165 
166 
167  double delta = 0.0001;
168  int i;
169  for (i =0;i < 6; i++){
170  double diff = refc[i] - c[i];
171  double absdiff = diff > 0? diff: (-diff);
172  if (absdiff > delta){
173  printf("ERROR: sanity check failed for link\n");
174  display_link_internal(link);
175  printf("refc = (%.10f,%.10f) (%.10f,%.10f) (%.10f,%.10f)\n",
176  refc[0], refc[1], refc[2], refc[3], refc[4], refc[5]);
177  printf("dir=%d, ga_idx=%d, coff=%f, t_boundary=%f\n",dir, ga_idx,coff, t_boundary);
178  printf("X=%d %d %d %d, X1h=%d\n", gaugeParam->X[0], X2, X3, X4, X1h);
179  return -1;
180  }
181 
182  }
183 
184 
185  return ret;
186 }
187 
188 
189 template<typename Float>
190 int site_link_sanity_check_internal_12(Float* link, int dir, int ga_idx, QudaGaugeParam* gaugeParam, int oddBit)
191 {
192  int ret = 0;
193 
194  Float refc_buf[6];
195  Float* refc = &refc_buf[0];
196 
197  memset((void*)refc, 0, sizeof(refc_buf));
198 
199  Float* a = link;
200  Float* b = link + 6;
201  Float* c = link + 12;
202 
203  accumulateConjugateProduct(refc + 0*2, a + 1*2, b + 2*2, +1);
204  accumulateConjugateProduct(refc + 0*2, a + 2*2, b + 1*2, -1);
205  accumulateConjugateProduct(refc + 1*2, a + 2*2, b + 0*2, +1);
206  accumulateConjugateProduct(refc + 1*2, a + 0*2, b + 2*2, -1);
207  accumulateConjugateProduct(refc + 2*2, a + 0*2, b + 1*2, +1);
208  accumulateConjugateProduct(refc + 2*2, a + 1*2, b + 0*2, -1);
209 
210  int X1h=gaugeParam->X[0]/2;
211  int X1 =gaugeParam->X[0];
212  int X2 =gaugeParam->X[1];
213  int X3 =gaugeParam->X[2];
214  int X4 =gaugeParam->X[3];
215 
216  // only apply temporal boundary condition if I'm the last node in T
217 #ifdef MULTI_GPU
218  bool last_node_in_t = (comm_coord(3) == comm_dim(3)-1);
219 #else
220  bool last_node_in_t = true;
221 #endif
222 
223 #if 1
224  double coeff= 1.0;
225 
226  {
227  int index = fullLatticeIndex(ga_idx, oddBit);
228  int i4 = index /(X3*X2*X1);
229  int i3 = (index - i4*(X3*X2*X1))/(X2*X1);
230  int i2 = (index - i4*(X3*X2*X1) - i3*(X2*X1))/X1;
231  int i1 = index - i4*(X3*X2*X1) - i3*(X2*X1) - i2*X1;
232 
233  if (dir == XUP) {
234  if (i4 % 2 == 1){
235  coeff *= -1;
236  }
237  }
238 
239  if (dir == YUP){
240  if ((i1+i4) % 2 == 1){
241  coeff *= -1;
242  }
243  }
244  if (dir == ZUP){
245  if ( (i4+i1+i2) % 2 == 1){
246  coeff *= -1;
247  }
248  }
249  if (dir == TUP){
250  if (last_node_in_t && i4 == (X4-1) ){
251  coeff *= -1;
252  }
253  }
254  }
255 
256 
257  refc[0]*=coeff; refc[1]*=coeff; refc[2]*=coeff; refc[3]*=coeff; refc[4]*=coeff; refc[5]*=coeff;
258 #endif
259 
260 
261  double delta = 0.0001;
262  int i;
263  for (i =0;i < 6; i++){
264  double diff = refc[i] - c[i];
265  double absdiff = diff > 0? diff: (-diff);
266  if (absdiff > delta){
267  printf("ERROR: sanity check failed for site link\n");
268  display_link_internal(link);
269  printf("refc = (%.10f,%.10f) (%.10f,%.10f) (%.10f,%.10f)\n",
270  refc[0], refc[1], refc[2], refc[3], refc[4], refc[5]);
271  printf("X=%d %d %d %d, X1h=%d\n", gaugeParam->X[0], X2, X3, X4, X1h);
272  return -1;
273  }
274 
275  }
276 
277 
278  return ret;
279 }
280 
281 
282 
283 
284 
285 
286 // a+=b
287 template <typename Float>
288 void complexAddTo(Float *a, Float *b) {
289  a[0] += b[0];
290  a[1] += b[1];
291 }
292 
293 // a = b*c
294 template <typename Float>
295 void complexProduct(Float *a, Float *b, Float *c) {
296  a[0] = b[0]*c[0] - b[1]*c[1];
297  a[1] = b[0]*c[1] + b[1]*c[0];
298 }
299 
300 // a = conj(b)*conj(c)
301 template <typename Float>
302 void complexConjugateProduct(Float *a, Float *b, Float *c) {
303  a[0] = b[0]*c[0] - b[1]*c[1];
304  a[1] = -b[0]*c[1] - b[1]*c[0];
305 }
306 
307 // a = conj(b)*c
308 template <typename Float>
309 void complexDotProduct(Float *a, Float *b, Float *c) {
310  a[0] = b[0]*c[0] + b[1]*c[1];
311  a[1] = b[0]*c[1] - b[1]*c[0];
312 }
313 
314 // a += b*c
315 template <typename Float>
316 void accumulateComplexProduct(Float *a, Float *b, Float *c, Float sign) {
317  a[0] += sign*(b[0]*c[0] - b[1]*c[1]);
318  a[1] += sign*(b[0]*c[1] + b[1]*c[0]);
319 }
320 
321 // a += conj(b)*c)
322 template <typename Float>
323 void accumulateComplexDotProduct(Float *a, Float *b, Float *c) {
324  a[0] += b[0]*c[0] + b[1]*c[1];
325  a[1] += b[0]*c[1] - b[1]*c[0];
326 }
327 
328 
329 template<typename Float>
330 int link_sanity_check_internal_8(Float* link, int dir, int ga_idx, QudaGaugeParam* gaugeParam, int oddBit)
331 {
332  int ret =0;
333 
334  Float ref_link_buf[18];
335  Float* ref = & ref_link_buf[0];
336  memset(ref, 0, sizeof(ref_link_buf));
337 
338  ref[0] = atan2(link[1], link[0]);
339  ref[1] = atan2(link[13], link[12]);
340  for (int i=2; i<7; i++) {
341  ref[i] = link[i];
342  }
343 
344  int X1h=gaugeParam->X[0]/2;
345  int X2 =gaugeParam->X[1];
346  int X3 =gaugeParam->X[2];
347  int X4 =gaugeParam->X[3];
348  double t_boundary = (gaugeParam->t_boundary ==QUDA_ANTI_PERIODIC_T)? -1.0:1.0;
349 
350 
351  // First reconstruct first row
352  Float row_sum = 0.0;
353  row_sum += ref[2]*ref[2];
354  row_sum += ref[3]*ref[3];
355  row_sum += ref[4]*ref[4];
356  row_sum += ref[5]*ref[5];
357 
358 #define SMALL_NUM 1e-24
359  row_sum = (row_sum != 0)?row_sum: SMALL_NUM;
360 #if 1
362  {
363  int X1h=gaugeParam->X[0]/2;
364  int X1 =gaugeParam->X[0];
365  int X2 =gaugeParam->X[1];
366  int X3 =gaugeParam->X[2];
367  int X4 =gaugeParam->X[3];
368 
369  int index = fullLatticeIndex(ga_idx, oddBit);
370  int i4 = index /(X3*X2*X1);
371  int i3 = (index - i4*(X3*X2*X1))/(X2*X1);
372  int i2 = (index - i4*(X3*X2*X1) - i3*(X2*X1))/X1;
373  int i1 = index - i4*(X3*X2*X1) - i3*(X2*X1) - i2*X1;
374 
375  if (dir == 0) {
376  if (i4 % 2 == 1){
377  u0 *= -1;
378  }
379  }
380 
381  if (dir == 1){
382  if ((i1+i4) % 2 == 1){
383  u0 *= -1;
384  }
385  }
386  if (dir == 2){
387  if ( (i4+i1+i2) % 2 == 1){
388  u0 *= -1;
389  }
390  }
391  if (dir == 3){
392  if (ga_idx >= (X4-3)*X1h*X2*X3 ){
393  u0 *= -1;
394  }
395  }
396 
397  //printf("local ga_idx =%d, index=%d, i4,3,2,1 =%d %d %d %d\n", ga_idx, index, i4, i3, i2,i1);
398 
399  }
400 #endif
401 
402 
403  Float U00_mag = sqrt( (1.f/(u0*u0) - row_sum)>0? (1.f/(u0*u0)-row_sum):0);
404 
405  ref[14] = ref[0];
406  ref[15] = ref[1];
407 
408  ref[0] = U00_mag * cos(ref[14]);
409  ref[1] = U00_mag * sin(ref[14]);
410 
411  Float column_sum = 0.0;
412  for (int i=0; i<2; i++) column_sum += ref[i]*ref[i];
413  for (int i=6; i<8; i++) column_sum += ref[i]*ref[i];
414  Float U20_mag = sqrt( (1.f/(u0*u0) - column_sum) > 0? (1.f/(u0*u0)-column_sum) : 0);
415 
416  ref[12] = U20_mag * cos(ref[15]);
417  ref[13] = U20_mag * sin(ref[15]);
418 
419  // First column now restored
420 
421  // finally reconstruct last elements from SU(2) rotation
422  Float r_inv2 = 1.0/(u0*row_sum);
423 
424  // U11
425  Float A[2];
426  complexDotProduct(A, ref+0, ref+6);
428  accumulateComplexProduct(ref+8, A, ref+2, u0);
429  ref[8] *= -r_inv2;
430  ref[9] *= -r_inv2;
431 
432  // U12
433  complexConjugateProduct(ref+10, ref+12, ref+2);
434  accumulateComplexProduct(ref+10, A, ref+4, -u0);
435  ref[10] *= r_inv2;
436  ref[11] *= r_inv2;
437 
438  // U21
439  complexDotProduct(A, ref+0, ref+12);
441  accumulateComplexProduct(ref+14, A, ref+2, -u0);
442  ref[14] *= r_inv2;
443  ref[15] *= r_inv2;
444 
445  // U12
447  accumulateComplexProduct(ref+16, A, ref+4, u0);
448  ref[16] *= -r_inv2;
449  ref[17] *= -r_inv2;
450 
451  double delta = 0.0001;
452  int i;
453  for (i =0;i < 18; i++){
454 
455  double diff = ref[i] - link[i];
456  double absdiff = diff > 0? diff: (-diff);
457  if ( (ref[i] != ref[i]) || (absdiff > delta)){
458  printf("ERROR: sanity check failed for link\n");
459  display_link_internal(link);
460  printf("reconstructed link is\n");
462  printf("dir=%d, ga_idx=%d, u0=%f, t_boundary=%f\n",dir, ga_idx, u0, t_boundary);
463  printf("X=%d %d %d %d, X1h=%d\n", gaugeParam->X[0], X2, X3, X4, X1h);
464  return -1;
465  }
466 
467  }
468 
469 
470  return ret;
471 }
472 
473 
474 //this len must be V
475 int
476 link_sanity_check(void* link, int len, int precision, int dir, QudaGaugeParam* gaugeParam)
477 {
478  int i;
479  int rc = 0;
480 
481  if (precision == QUDA_DOUBLE_PRECISION){
482  double* mylink = (double*)link;
483  //even
484  for (i = 0;i < len/2; i++){
485  rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0);
486  if (rc != 0){
487  printf("ERROR: even link sanity check failed, i=%d\n",i);
489  exit(1);
490  }
491  }
492 
493  mylink = mylink + gaugeSiteSize*len/2;
494  //odd
495  for (i = 0;i < len/2; i++){
496  rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 1);
497  if (rc != 0){
498  printf("ERROR: odd link sanity check failed, i=%d\n",i);
500  exit(1);
501  }
502  }
503 
504  }else if (precision == QUDA_SINGLE_PRECISION){
505  float* mylink = (float*)link;
506 
507  //even
508  for (i=0;i < len/2 ;i++){
509  rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0);
510  if (rc != 0){
511  printf("ERROR: even link sanity check 12 failed, i=%d\n",i);
512  exit(1);
513  }
514  /*
515  rc = link_sanity_check_internal_8(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0);
516  if (rc != 0){
517  printf("ERROR: even link sanity check 8 failed, i=%d\n",i);
518  exit(1);
519  }
520  */
521 
522  }
523  mylink = mylink + gaugeSiteSize*len/2;
524  //odd
525  for (i=0;i < len/2 ;i++){
526  rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 1);
527  if (rc != 0){
528  printf("ERROR: odd link sanity check 12 failed, i=%d\n", i);
529  exit(1);
530  }
531  /*
532  rc = link_sanity_check_internal_8(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0);
533  if (rc != 0){
534  printf("ERROR: even link sanity check 8 failed, i=%d\n",i);
535  exit(1);
536  }
537  */
538  }
539 
540  }
541 
542  return rc;
543 }
544 
545 
546 
547 //this len must be V
548 int
549 site_link_sanity_check(void* link, int len, int precision, QudaGaugeParam* gaugeParam)
550 {
551  int i;
552  int rc = 0;
553  int dir;
554 
555  if (precision == QUDA_DOUBLE_PRECISION){
556  double* mylink = (double*)link;
557  //even
558  for (i = 0;i < len/2; i++){
559  for(dir=XUP;dir <= TUP; dir++){
560  rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 0);
561  if (rc != 0){
562  printf("ERROR: even link sanity check failed, i=%d, function %s\n",i, __FUNCTION__);
564  exit(1);
565  }
566  }
567  }
568 
569  mylink = mylink + 4*gaugeSiteSize*len/2;
570  //odd
571  for (i = 0;i < len/2; i++){
572  for(dir=XUP;dir <= TUP; dir++){
573  rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 1);
574  if (rc != 0){
575  printf("ERROR: odd link sanity check failed, i=%d, function %s\n",i, __FUNCTION__);
577  exit(1);
578  }
579  }
580  }
581 
582  }else if (precision == QUDA_SINGLE_PRECISION){
583  float* mylink = (float*)link;
584 
585  //even
586  for (i=0;i < len/2 ;i++){
587  for(dir=XUP;dir <= TUP; dir++){
588  rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 0);
589  if (rc != 0){
590  printf("ERROR: even link sanity check 12 failed, i=%d, function %s\n",i, __FUNCTION__);
591  exit(1);
592  }
593  }
594  }
595  mylink = mylink + 4*gaugeSiteSize*len/2;
596  //odd
597  for (i=0;i < len/2 ;i++){
598  for(dir=XUP;dir <= TUP; dir++){
599  rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 1);
600  if (rc != 0){
601  printf("ERROR: odd link sanity check 12 failed, i=%d, function %s\n", i, __FUNCTION__);
602  exit(1);
603  }
604  }
605  }
606 
607  }
608 
609  return rc;
610 }
611 
614 {
616 
617  if (strcmp(s, "silent") == 0){
618  ret = QUDA_SILENT;
619  }else if (strcmp(s, "summarize") == 0){
621  }else if (strcmp(s, "verbose") == 0){
622  ret = QUDA_VERBOSE;
623  }else if (strcmp(s, "debug") == 0){
625  }else{
626  fprintf(stderr, "Error: invalid verbosity type %s\n", s);
627  exit(1);
628  }
629 
630  return ret;
631 }
632 
633 const char *
635 {
636  const char* ret;
637 
638  switch(type) {
639  case QUDA_SILENT:
640  ret = "silent";
641  break;
642  case QUDA_SUMMARIZE:
643  ret = "summarize";
644  break;
645  case QUDA_VERBOSE:
646  ret = "verbose";
647  break;
648  case QUDA_DEBUG_VERBOSE:
649  ret = "debug";
650  break;
651  default:
652  fprintf(stderr, "Error: invalid verbosity type %d\n", type);
653  exit(1);
654  }
655 
656  return ret;
657 }
658 
660 get_recon(char* s)
661 {
663 
664  if (strcmp(s, "8") == 0){
666  }else if (strcmp(s, "9") == 0){
668  }else if (strcmp(s, "12") == 0){
670  }else if (strcmp(s, "13") == 0){
672  }else if (strcmp(s, "18") == 0){
674  }else{
675  fprintf(stderr, "Error: invalid reconstruct type\n");
676  exit(1);
677  }
678 
679  return ret;
680 
681 
682 }
683 
685 get_prec(char* s)
686 {
688 
689  if (strcmp(s, "double") == 0){
691  }else if (strcmp(s, "single") == 0){
693  }else if (strcmp(s, "half") == 0){
695  }else{
696  fprintf(stderr, "Error: invalid precision type\n");
697  exit(1);
698  }
699 
700  return ret;
701 }
702 
703 const char*
705 {
706  const char* ret;
707 
708  switch( prec){
709 
711  ret= "double";
712  break;
714  ret= "single";
715  break;
716  case QUDA_HALF_PRECISION:
717  ret= "half";
718  break;
719  default:
720  ret = "unknown";
721  break;
722  }
723 
724 
725  return ret;
726 }
727 
728 
729 const char*
730 get_unitarization_str(bool svd_only)
731 {
732  const char* ret;
733 
734  if(svd_only){
735  ret = "SVD";
736  }else{
737  ret = "Cayley-Hamilton/SVD";
738  }
739  return ret;
740 }
741 
742 const char*
744 {
745  const char* ret;
746 
747  switch(order){
749  ret = "qdp";
750  break;
751 
753  ret = "milc";
754  break;
755 
757  ret = "cps_wilson";
758  break;
759 
760  default:
761  ret = "unknown";
762  break;
763  }
764 
765  return ret;
766 }
767 
768 
769 const char*
771 {
772  const char* ret;
773  switch(recon){
774  case QUDA_RECONSTRUCT_13:
775  ret="13";
776  break;
777  case QUDA_RECONSTRUCT_12:
778  ret= "12";
779  break;
780  case QUDA_RECONSTRUCT_9:
781  ret="9";
782  break;
783  case QUDA_RECONSTRUCT_8:
784  ret = "8";
785  break;
786  case QUDA_RECONSTRUCT_NO:
787  ret = "18";
788  break;
789  default:
790  ret="unknown";
791  break;
792  }
793 
794  return ret;
795 }
796 
797 const char*
799 {
800  const char* ret;
801  switch(t){
802  case 0:
803  ret = "even";
804  break;
805  case 1:
806  ret = "odd";
807  break;
808  case 2:
809  ret = "full";
810  break;
811  case 3:
812  ret = "mcg_even";
813  break;
814  case 4:
815  ret = "mcg_odd";
816  break;
817  case 5:
818  ret = "mcg_full";
819  break;
820  default:
821  ret = "unknown";
822  break;
823  }
824 
825  return ret;
826 }
827 
828 int get_rank_order(char* s)
829 {
830  int ret = -1;
831 
832  if (strcmp(s, "col") == 0) {
833  ret = 0;
834  } else if (strcmp(s, "row") == 0) {
835  ret = 1;
836  } else {
837  fprintf(stderr, "Error: invalid rank order type\n");
838  exit(1);
839  }
840 
841  return ret;
842 }
843 
846 {
848 
849  if (strcmp(s, "wilson") == 0){
851  }else if (strcmp(s, "clover") == 0){
853  }else if (strcmp(s, "twisted-mass") == 0){
855  }else if (strcmp(s, "twisted-clover") == 0){
857  }else if (strcmp(s, "staggered") == 0){
859  }else if (strcmp(s, "asqtad") == 0){
861  }else if (strcmp(s, "domain-wall") == 0){
863  }else if (strcmp(s, "domain-wall-4d") == 0){
865  }else if (strcmp(s, "mobius") == 0){
867  }else if (strcmp(s, "laplace") == 0){
869  }else{
870  fprintf(stderr, "Error: invalid dslash type\n");
871  exit(1);
872  }
873 
874  return ret;
875 }
876 
877 const char*
879 {
880  const char* ret;
881 
882  switch( type){
883  case QUDA_WILSON_DSLASH:
884  ret= "wilson";
885  break;
887  ret= "clover";
888  break;
890  ret= "twisted-mass";
891  break;
893  ret= "twisted-clover";
894  break;
896  ret = "staggered";
897  break;
898  case QUDA_ASQTAD_DSLASH:
899  ret = "asqtad";
900  break;
902  ret = "domain-wall";
903  break;
905  ret = "domain_wall_4d";
906  break;
908  ret = "mobius";
909  break;
910  case QUDA_LAPLACE_DSLASH:
911  ret = "laplace";
912  break;
913  default:
914  ret = "unknown";
915  break;
916  }
917 
918 
919  return ret;
920 
921 }
922 
925 {
927 
928  if (strcmp(s, "kappa") == 0){
930  }else if (strcmp(s, "mass") == 0){
932  }else if (strcmp(s, "asym-mass") == 0){
934  }else{
935  fprintf(stderr, "Error: invalid mass normalization\n");
936  exit(1);
937  }
938 
939  return ret;
940 }
941 
942 const char*
944 {
945  const char *s;
946 
947  switch (type) {
949  s = "kappa";
950  break;
952  s = "mass";
953  break;
955  s = "asym-mass";
956  break;
957  default:
958  fprintf(stderr, "Error: invalid mass normalization\n");
959  exit(1);
960  }
961 
962  return s;
963 }
964 
967 {
969 
970  if (strcmp(s, "even-even") == 0){
972  }else if (strcmp(s, "odd-odd") == 0){
974  }else if (strcmp(s, "even-even-asym") == 0){
976  }else if (strcmp(s, "odd-odd-asym") == 0){
978  }else{
979  fprintf(stderr, "Error: invalid matpc type %s\n", s);
980  exit(1);
981  }
982 
983  return ret;
984 }
985 
986 const char *
988 {
989  const char* ret;
990 
991  switch(type) {
993  ret = "even-even";
994  break;
995  case QUDA_MATPC_ODD_ODD:
996  ret = "odd-odd";
997  break;
999  ret = "even-even-asym";
1000  break;
1002  ret = "odd-odd-asym";
1003  break;
1004  default:
1005  fprintf(stderr, "Error: invalid matpc type %d\n", type);
1006  exit(1);
1007  }
1008 
1009  return ret;
1010 }
1011 
1014 {
1016 
1017  if (strcmp(s, "direct") == 0) {
1019  } else if (strcmp(s, "direct-pc") == 0) {
1021  } else if (strcmp(s, "normop") == 0) {
1023  } else if (strcmp(s, "normop-pc") == 0) {
1025  } else if (strcmp(s, "normerr") == 0) {
1027  } else if (strcmp(s, "normerr-pc") == 0) {
1029  } else {
1030  fprintf(stderr, "Error: invalid matpc type %s\n", s);
1031  exit(1);
1032  }
1033 
1034  return ret;
1035 }
1036 
1037 const char *
1039 {
1040  const char* ret;
1041 
1042  switch(type) {
1043  case QUDA_DIRECT_SOLVE:
1044  ret = "direct";
1045  break;
1046  case QUDA_DIRECT_PC_SOLVE:
1047  ret = "direct-pc";
1048  break;
1049  case QUDA_NORMOP_SOLVE:
1050  ret = "normop";
1051  break;
1052  case QUDA_NORMOP_PC_SOLVE:
1053  ret = "normop-pc";
1054  break;
1055  case QUDA_NORMERR_SOLVE:
1056  ret = "normerr";
1057  break;
1058  case QUDA_NORMERR_PC_SOLVE:
1059  ret = "normerr-pc";
1060  break;
1061  default:
1062  fprintf(stderr, "Error: invalid solve type %d\n", type);
1063  exit(1);
1064  }
1065 
1066  return ret;
1067 }
1068 
1071 {
1073 
1074  if (strcmp(s, "singlet") == 0){
1076  }else if (strcmp(s, "deg-doublet") == 0){
1078  }else if (strcmp(s, "nondeg-doublet") == 0){
1080  }else if (strcmp(s, "no") == 0){
1081  ret = QUDA_TWIST_NO;
1082  }else{
1083  fprintf(stderr, "Error: invalid flavor type\n");
1084  exit(1);
1085  }
1086 
1087  return ret;
1088 }
1089 
1090 const char*
1092 {
1093  const char* ret;
1094 
1095  switch(type) {
1096  case QUDA_TWIST_SINGLET:
1097  ret = "singlet";
1098  break;
1100  ret = "deg-doublet";
1101  break;
1103  ret = "nondeg-doublet";
1104  break;
1105  case QUDA_TWIST_NO:
1106  ret = "no";
1107  break;
1108  default:
1109  ret = "unknown";
1110  break;
1111  }
1112 
1113  return ret;
1114 }
1115 
1118 {
1120 
1121  if (strcmp(s, "cg") == 0){
1123  } else if (strcmp(s, "bicgstab") == 0){
1125  } else if (strcmp(s, "gcr") == 0){
1127  } else if (strcmp(s, "pcg") == 0){
1129  } else if (strcmp(s, "mpcg") == 0){
1131  } else if (strcmp(s, "mpbicgstab") == 0){
1133  } else if (strcmp(s, "mr") == 0){
1135  } else if (strcmp(s, "sd") == 0){
1137  } else if (strcmp(s, "eigcg") == 0){
1139  } else if (strcmp(s, "inc-eigcg") == 0){
1141  } else if (strcmp(s, "gmresdr") == 0){
1143  } else if (strcmp(s, "gmresdr-proj") == 0){
1145  } else if (strcmp(s, "gmresdr-sh") == 0){
1147  } else if (strcmp(s, "fgmresdr") == 0){
1149  } else if (strcmp(s, "mg") == 0){
1151  } else if (strcmp(s, "bicgstab-l") == 0){
1153  } else if (strcmp(s, "cgne") == 0){
1155  } else if (strcmp(s, "cgnr") == 0){
1157  } else {
1158  fprintf(stderr, "Error: invalid solver type\n");
1159  exit(1);
1160  }
1161 
1162  return ret;
1163 }
1164 
1165 const char*
1167 {
1168  const char* ret;
1169 
1170  switch(type){
1171  case QUDA_CG_INVERTER:
1172  ret = "cg";
1173  break;
1175  ret = "bicgstab";
1176  break;
1177  case QUDA_GCR_INVERTER:
1178  ret = "gcr";
1179  break;
1180  case QUDA_PCG_INVERTER:
1181  ret = "pcg";
1182  break;
1183  case QUDA_MPCG_INVERTER:
1184  ret = "mpcg";
1185  break;
1187  ret = "mpbicgstab";
1188  break;
1189  case QUDA_MR_INVERTER:
1190  ret = "mr";
1191  break;
1192  case QUDA_SD_INVERTER:
1193  ret = "sd";
1194  break;
1195  case QUDA_EIGCG_INVERTER:
1196  ret = "eigcg";
1197  break;
1199  ret = "inc-eigcg";
1200  break;
1201  case QUDA_GMRESDR_INVERTER:
1202  ret = "gmresdr";
1203  break;
1205  ret = "gmresdr-proj";
1206  break;
1208  ret = "gmresdr-sh";
1209  break;
1211  ret = "fgmresdr";
1212  break;
1213  case QUDA_MG_INVERTER:
1214  ret= "mg";
1215  break;
1217  ret = "bicgstab-l";
1218  break;
1219  default:
1220  ret = "unknown";
1221  errorQuda("Error: invalid solver type %d\n", type);
1222  break;
1223  }
1224 
1225  return ret;
1226 }
1227 
1228 const char*
1230 {
1231  static char vstr[32];
1232  int major_num = QUDA_VERSION_MAJOR;
1233  int minor_num = QUDA_VERSION_MINOR;
1234  int ext_num = QUDA_VERSION_SUBMINOR;
1235  sprintf(vstr, "%1d.%1d.%1d",
1236  major_num,
1237  minor_num,
1238  ext_num);
1239  return vstr;
1240 }
1241 
1242 
1245 {
1247 
1248  if (strcmp(s, "eigen") == 0) {
1250  } else if (strcmp(s, "magma") == 0) {
1252  } else {
1253  fprintf(stderr, "Error: invalid external library type %s\n", s);
1254  exit(1);
1255  }
1256 
1257  return ret;
1258 }
1259 
1262 {
1264 
1265  if (strcmp(s, "host") == 0) {
1267  } else if (strcmp(s, "cuda") == 0) {
1269  } else {
1270  fprintf(stderr, "Error: invalid external library type %s\n", s);
1271  exit(1);
1272  }
1273 
1274  return ret;
1275 }
1276 
1277 
1280 {
1282 
1283  if (strcmp(s, "device") == 0) {
1285  } else if (strcmp(s, "pinned") == 0) {
1287  } else if (strcmp(s, "mapped") == 0) {
1289  } else {
1290  fprintf(stderr, "Error: invalid external library type %s\n", s);
1291  exit(1);
1292  }
1293 
1294  return ret;
1295 }
1296 
1297 
1298 
enum QudaMassNormalization_s QudaMassNormalization
QudaGaugeParam gaugeParam
Definition: covdev_test.cpp:36
#define SMALL_NUM
void complexDotProduct(Float *a, Float *b, Float *c)
Definition: misc.cpp:309
enum QudaPrecision_s QudaPrecision
QudaTwistFlavorType get_flavor_type(char *s)
Definition: misc.cpp:1070
QudaPrecision get_prec(char *s)
Definition: misc.cpp:685
void accumulateComplexDotProduct(Float *a, Float *b, Float *c)
Definition: misc.cpp:323
int site_link_sanity_check(void *link, int len, int precision, QudaGaugeParam *gaugeParam)
Definition: misc.cpp:549
#define errorQuda(...)
Definition: util_quda.h:90
#define stSpinorSiteSize
Definition: misc.cpp:12
enum QudaSolveType_s QudaSolveType
int comm_dim(int dim)
double cos(double)
int comm_coord(int dim)
#define QUDA_VERSION_MINOR
Definition: quda_constants.h:2
#define XUP
const char * get_matpc_str(QudaMatPCType type)
Definition: misc.cpp:987
double atan2(double, double)
const char * get_gauge_order_str(QudaGaugeFieldOrder order)
Definition: misc.cpp:743
const char * get_prec_str(QudaPrecision prec)
Definition: misc.cpp:704
int get_rank_order(char *s)
Definition: misc.cpp:828
#define YUP
QudaReconstructType get_recon(char *s)
Definition: misc.cpp:660
void accumulateConjugateProduct(Float *a, Float *b, Float *c, int sign)
Definition: misc.cpp:84
void accumulateComplexProduct(Float *a, Float *b, Float *c, Float sign)
Definition: misc.cpp:316
const char * get_flavor_str(QudaTwistFlavorType type)
Definition: misc.cpp:1091
const char * get_test_type(int t)
Definition: misc.cpp:798
void exit(int) __attribute__((noreturn))
QudaFieldLocation get_df_location_ritz(char *s)
Definition: misc.cpp:1261
const char * get_solver_str(QudaInverterType type)
Definition: misc.cpp:1166
int fullLatticeIndex(int dim[4], int index, int oddBit)
Definition: test_util.cpp:442
QudaSolveType get_solve_type(char *s)
Definition: misc.cpp:1013
char * index(const char *, int)
#define b
void complexProduct(Float *a, Float *b, Float *c)
Definition: misc.cpp:295
QudaExtLibType get_solve_ext_lib_type(char *s)
Definition: misc.cpp:1244
int strcmp(const char *__s1, const char *__s2)
const char * get_solve_str(QudaSolveType type)
Definition: misc.cpp:1038
const char * get_unitarization_str(bool svd_only)
Definition: misc.cpp:730
static unsigned int delta
QudaInverterType get_solver_type(char *s)
Definition: misc.cpp:1117
void display_link_internal(Float *link)
Definition: misc.cpp:47
int printf(const char *,...) __attribute__((__format__(__printf__
void display_spinor(void *spinor, int len, int precision)
Definition: misc.cpp:26
const char * get_mass_normalization_str(QudaMassNormalization type)
Definition: misc.cpp:943
QudaDslashType get_dslash_type(char *s)
Definition: misc.cpp:845
const char * get_recon_str(QudaReconstructType recon)
Definition: misc.cpp:770
#define ZUP
enum QudaMatPCType_s QudaMatPCType
#define gaugeSiteSize
Definition: test_util.h:6
double sqrt(double)
int link_sanity_check(void *link, int len, int precision, int dir, QudaGaugeParam *gaugeParam)
Definition: misc.cpp:476
int int int enum cudaChannelFormatKind f
#define QUDA_VERSION_SUBMINOR
Definition: quda_constants.h:3
QudaMatPCType get_matpc_type(char *s)
Definition: misc.cpp:966
const char * get_dslash_str(QudaDslashType type)
Definition: misc.cpp:878
enum QudaGaugeFieldOrder_s QudaGaugeFieldOrder
int link_sanity_check_internal_8(Float *link, int dir, int ga_idx, QudaGaugeParam *gaugeParam, int oddBit)
Definition: misc.cpp:330
int X[4]
Definition: quda.h:29
int fprintf(FILE *, const char *,...) __attribute__((__format__(__printf__
QudaMemoryType get_df_mem_type_ritz(char *s)
Definition: misc.cpp:1279
void display_link(void *link, int len, int precision)
Definition: misc.cpp:63
#define TUP
void * memset(void *__b, int __c, size_t __len)
enum QudaFieldLocation_s QudaFieldLocation
double tadpole_coeff
Definition: quda.h:32
int link_sanity_check_internal_12(Float *link, int dir, int ga_idx, QudaGaugeParam *gaugeParam, int oddBit)
Definition: misc.cpp:91
cpuColorSpinorField * ref
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
int sprintf(char *, const char *,...) __attribute__((__format__(__printf__
const char * get_verbosity_str(QudaVerbosity type)
Definition: misc.cpp:634
QudaTboundary t_boundary
Definition: quda.h:38
void complexConjugateProduct(Float *a, Float *b, Float *c)
Definition: misc.cpp:302
QudaMassNormalization get_mass_normalization_type(char *s)
Definition: misc.cpp:924
enum QudaDslashType_s QudaDslashType
void display_spinor_internal(Float *spinor)
Definition: misc.cpp:14
int site_link_sanity_check_internal_12(Float *link, int dir, int ga_idx, QudaGaugeParam *gaugeParam, int oddBit)
Definition: misc.cpp:190
const void * c
enum QudaVerbosity_s QudaVerbosity
QudaVerbosity get_verbosity_type(char *s)
Definition: misc.cpp:613
double sin(double)
const char * get_quda_ver_str()
Definition: misc.cpp:1229
QudaPrecision prec
Definition: test_util.cpp:1615
#define a
#define QUDA_VERSION_MAJOR
Definition: quda_constants.h:1
void complexAddTo(Float *a, Float *b)
Definition: misc.cpp:288
enum QudaInverterType_s QudaInverterType
enum QudaMemoryType_s QudaMemoryType
cpuColorSpinorField * spinor
Definition: covdev_test.cpp:41
enum QudaExtLibType_s QudaExtLibType
enum QudaTwistFlavorType_s QudaTwistFlavorType