|
QUDA v0.3.2
A library for QCD on GPUs
|
00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include "quda.h" 00004 #include <string.h> 00005 #include "invert_quda.h" 00006 #include "misc.h" 00007 #include <assert.h> 00008 #include "util_quda.h" 00009 #include <test_util.h> 00010 00011 00012 00013 int verbose; 00014 00015 #define stSpinorSiteSize 6 00016 00017 template<typename Float> 00018 void display_spinor_internal(Float* spinor) 00019 { 00020 printf("(%f,%f) (%f,%f) (%f,%f) \t", 00021 spinor[0], spinor[1], spinor[2], 00022 spinor[3], spinor[4], spinor[5]); 00023 00024 printf("\n"); 00025 return; 00026 } 00027 00028 00029 00030 void display_spinor(void* spinor, int len, int precision) 00031 { 00032 int i; 00033 00034 if (precision == QUDA_DOUBLE_PRECISION){ 00035 double* myspinor = (double*)spinor; 00036 for (i = 0;i < len; i++){ 00037 display_spinor_internal(myspinor + stSpinorSiteSize*i); 00038 } 00039 }else if (precision == QUDA_SINGLE_PRECISION){ 00040 float* myspinor = (float*)spinor; 00041 for (i=0;i < len ;i++){ 00042 display_spinor_internal(myspinor + stSpinorSiteSize*i); 00043 } 00044 } 00045 return; 00046 } 00047 00048 00049 00050 template<typename Float> 00051 void display_link_internal(Float* link) 00052 { 00053 int i, j; 00054 00055 for (i = 0;i < 3; i++){ 00056 for(j=0;j < 3; j++){ 00057 printf("(%.10f,%.10f) \t", link[i*3*2 + j*2], link[i*3*2 + j*2 + 1]); 00058 } 00059 printf("\n"); 00060 } 00061 printf("\n"); 00062 return; 00063 } 00064 00065 00066 00067 void display_link(void* link, int len, int precision) 00068 { 00069 int i; 00070 00071 if (precision == QUDA_DOUBLE_PRECISION){ 00072 double* mylink = (double*)link; 00073 for (i = 0;i < len; i++){ 00074 display_link_internal(mylink + gaugeSiteSize*i); 00075 } 00076 }else if (precision == QUDA_SINGLE_PRECISION){ 00077 float* mylink = (float*)link; 00078 for (i=0;i < len ;i++){ 00079 display_link_internal(mylink + gaugeSiteSize*i); 00080 } 00081 } 00082 return; 00083 } 00084 00085 00086 00087 template <typename Float> 00088 void accumulateConjugateProduct(Float *a, Float *b, Float *c, int sign) { 00089 a[0] += sign * (b[0]*c[0] - b[1]*c[1]); 00090 a[1] -= sign * (b[0]*c[1] + b[1]*c[0]); 00091 } 00092 00093 00094 template<typename Float> 00095 int link_sanity_check_internal_12(Float* link, int dir, int ga_idx, QudaGaugeParam* gaugeParam, int oddBit) 00096 { 00097 //printf("link sanity check is called\n"); 00098 00099 int ret =0; 00100 00101 Float refc_buf[6]; 00102 Float* refc = &refc_buf[0]; 00103 00104 memset((void*)refc, 0, sizeof(refc_buf)); 00105 00106 Float* a = link; 00107 Float* b = link + 6; 00108 Float* c = link + 12; 00109 00110 accumulateConjugateProduct(refc + 0*2, a + 1*2, b + 2*2, +1); 00111 accumulateConjugateProduct(refc + 0*2, a + 2*2, b + 1*2, -1); 00112 accumulateConjugateProduct(refc + 1*2, a + 2*2, b + 0*2, +1); 00113 accumulateConjugateProduct(refc + 1*2, a + 0*2, b + 2*2, -1); 00114 accumulateConjugateProduct(refc + 2*2, a + 0*2, b + 1*2, +1); 00115 accumulateConjugateProduct(refc + 2*2, a + 1*2, b + 0*2, -1); 00116 00117 int X1h=gaugeParam->X[0]/2; 00118 int X1 =gaugeParam->X[0]; 00119 int X2 =gaugeParam->X[1]; 00120 int X3 =gaugeParam->X[2]; 00121 int X4 =gaugeParam->X[3]; 00122 double t_boundary = (gaugeParam->t_boundary ==QUDA_ANTI_PERIODIC_T)? -1.0:1.0; 00123 00124 double u0 = gaugeParam->tadpole_coeff; 00125 double coff= -u0*u0*24; 00126 //coff = (dir < 6) ? coff : ( (ga_idx >= (X4-3)*X1h*X2*X3 )? t_boundary : 1); 00127 00128 //float u0 = (dir < 6) ? gaugeParam->anisotropy : ( (ga_idx >= (X4-3)*X1h*X2*X3 )? t_boundary : 1); 00129 00130 00131 #if 1 00132 00133 { 00134 int index = fullLatticeIndex(ga_idx, oddBit); 00135 int i4 = index /(X3*X2*X1); 00136 int i3 = (index - i4*(X3*X2*X1))/(X2*X1); 00137 int i2 = (index - i4*(X3*X2*X1) - i3*(X2*X1))/X1; 00138 int i1 = index - i4*(X3*X2*X1) - i3*(X2*X1) - i2*X1; 00139 00140 if (dir == 0) { 00141 if (i4 % 2 == 1){ 00142 coff *= -1; 00143 } 00144 } 00145 00146 if (dir == 2){ 00147 if ((i1+i4) % 2 == 1){ 00148 coff *= -1; 00149 } 00150 } 00151 if (dir == 4){ 00152 if ( (i4+i1+i2) % 2 == 1){ 00153 coff *= -1; 00154 } 00155 } 00156 if (dir == 6){ 00157 if (ga_idx >= (X4-3)*X1h*X2*X3 ){ 00158 coff *= -1; 00159 } 00160 } 00161 00162 //printf("local ga_idx =%d, index=%d, i4,3,2,1 =%d %d %d %d\n", ga_idx, index, i4, i3, i2,i1); 00163 00164 } 00165 #endif 00166 00167 00168 refc[0]*=coff; refc[1]*=coff; refc[2]*=coff; refc[3]*=coff; refc[4]*=coff; refc[5]*=coff; 00169 00170 00171 double delta = 0.0001; 00172 int i; 00173 for (i =0;i < 6; i++){ 00174 double diff = refc[i] - c[i]; 00175 double absdiff = diff > 0? diff: (-diff); 00176 if (absdiff > delta){ 00177 printf("ERROR: sanity check failed for link\n"); 00178 display_link_internal(link); 00179 printf("refc = (%.10f,%.10f) (%.10f,%.10f) (%.10f,%.10f)\n", 00180 refc[0], refc[1], refc[2], refc[3], refc[4], refc[5]); 00181 printf("dir=%d, ga_idx=%d, coff=%f, t_boundary=%f\n",dir, ga_idx,coff, t_boundary); 00182 printf("X=%d %d %d %d, X1h=%d\n", gaugeParam->X[0], X2, X3, X4, X1h); 00183 return -1; 00184 } 00185 00186 } 00187 00188 00189 return ret; 00190 } 00191 00192 00193 template<typename Float> 00194 int site_link_sanity_check_internal_12(Float* link, int dir, int ga_idx, QudaGaugeParam* gaugeParam, int oddBit) 00195 { 00196 00197 int ret =0; 00198 00199 Float refc_buf[6]; 00200 Float* refc = &refc_buf[0]; 00201 00202 memset((void*)refc, 0, sizeof(refc_buf)); 00203 00204 Float* a = link; 00205 Float* b = link + 6; 00206 Float* c = link + 12; 00207 00208 accumulateConjugateProduct(refc + 0*2, a + 1*2, b + 2*2, +1); 00209 accumulateConjugateProduct(refc + 0*2, a + 2*2, b + 1*2, -1); 00210 accumulateConjugateProduct(refc + 1*2, a + 2*2, b + 0*2, +1); 00211 accumulateConjugateProduct(refc + 1*2, a + 0*2, b + 2*2, -1); 00212 accumulateConjugateProduct(refc + 2*2, a + 0*2, b + 1*2, +1); 00213 accumulateConjugateProduct(refc + 2*2, a + 1*2, b + 0*2, -1); 00214 00215 00216 int X1h=gaugeParam->X[0]/2; 00217 int X1 =gaugeParam->X[0]; 00218 int X2 =gaugeParam->X[1]; 00219 int X3 =gaugeParam->X[2]; 00220 int X4 =gaugeParam->X[3]; 00221 00222 #if 1 00223 double coeff= 1.0; 00224 00225 { 00226 int index = fullLatticeIndex(ga_idx, oddBit); 00227 int i4 = index /(X3*X2*X1); 00228 int i3 = (index - i4*(X3*X2*X1))/(X2*X1); 00229 int i2 = (index - i4*(X3*X2*X1) - i3*(X2*X1))/X1; 00230 int i1 = index - i4*(X3*X2*X1) - i3*(X2*X1) - i2*X1; 00231 00232 if (dir == XUP) { 00233 if (i4 % 2 == 1){ 00234 coeff *= -1; 00235 } 00236 } 00237 00238 if (dir == YUP){ 00239 if ((i1+i4) % 2 == 1){ 00240 coeff *= -1; 00241 } 00242 } 00243 if (dir == ZUP){ 00244 if ( (i4+i1+i2) % 2 == 1){ 00245 coeff *= -1; 00246 } 00247 } 00248 if (dir == TUP){ 00249 if (i4 == (X4 -1)){ 00250 coeff *= -1; 00251 } 00252 } 00253 } 00254 00255 00256 refc[0]*=coeff; refc[1]*=coeff; refc[2]*=coeff; refc[3]*=coeff; refc[4]*=coeff; refc[5]*=coeff; 00257 #endif 00258 00259 00260 double delta = 0.0001; 00261 int i; 00262 for (i =0;i < 6; i++){ 00263 double diff = refc[i] - c[i]; 00264 double absdiff = diff > 0? diff: (-diff); 00265 if (absdiff > delta){ 00266 printf("ERROR: sanity check failed for link\n"); 00267 display_link_internal(link); 00268 printf("refc = (%.10f,%.10f) (%.10f,%.10f) (%.10f,%.10f)\n", 00269 refc[0], refc[1], refc[2], refc[3], refc[4], refc[5]); 00270 printf("X=%d %d %d %d, X1h=%d\n", gaugeParam->X[0], X2, X3, X4, X1h); 00271 return -1; 00272 } 00273 00274 } 00275 00276 00277 return ret; 00278 } 00279 00280 00281 00282 00283 00284 00285 // a+=b 00286 template <typename Float> 00287 void complexAddTo(Float *a, Float *b) { 00288 a[0] += b[0]; 00289 a[1] += b[1]; 00290 } 00291 00292 // a = b*c 00293 template <typename Float> 00294 void complexProduct(Float *a, Float *b, Float *c) { 00295 a[0] = b[0]*c[0] - b[1]*c[1]; 00296 a[1] = b[0]*c[1] + b[1]*c[0]; 00297 } 00298 00299 // a = conj(b)*conj(c) 00300 template <typename Float> 00301 void complexConjugateProduct(Float *a, Float *b, Float *c) { 00302 a[0] = b[0]*c[0] - b[1]*c[1]; 00303 a[1] = -b[0]*c[1] - b[1]*c[0]; 00304 } 00305 00306 // a = conj(b)*c 00307 template <typename Float> 00308 void complexDotProduct(Float *a, Float *b, Float *c) { 00309 a[0] = b[0]*c[0] + b[1]*c[1]; 00310 a[1] = b[0]*c[1] - b[1]*c[0]; 00311 } 00312 00313 // a += b*c 00314 template <typename Float> 00315 void accumulateComplexProduct(Float *a, Float *b, Float *c, Float sign) { 00316 a[0] += sign*(b[0]*c[0] - b[1]*c[1]); 00317 a[1] += sign*(b[0]*c[1] + b[1]*c[0]); 00318 } 00319 00320 // a += conj(b)*c) 00321 template <typename Float> 00322 void accumulateComplexDotProduct(Float *a, Float *b, Float *c) { 00323 a[0] += b[0]*c[0] + b[1]*c[1]; 00324 a[1] += b[0]*c[1] - b[1]*c[0]; 00325 } 00326 00327 00328 template<typename Float> 00329 int link_sanity_check_internal_8(Float* link, int dir, int ga_idx, QudaGaugeParam* gaugeParam, int oddBit) 00330 { 00331 int ret =0; 00332 00333 Float ref_link_buf[18]; 00334 Float* ref = & ref_link_buf[0]; 00335 memset(ref, 0, sizeof(ref_link_buf)); 00336 00337 ref[0] = atan2(link[1], link[0]); 00338 ref[1] = atan2(link[13], link[12]); 00339 for (int i=2; i<7; i++) { 00340 ref[i] = link[i]; 00341 } 00342 00343 int X1h=gaugeParam->X[0]/2; 00344 int X2 =gaugeParam->X[1]; 00345 int X3 =gaugeParam->X[2]; 00346 int X4 =gaugeParam->X[3]; 00347 double t_boundary = (gaugeParam->t_boundary ==QUDA_ANTI_PERIODIC_T)? -1.0:1.0; 00348 00349 00350 // First reconstruct first row 00351 Float row_sum = 0.0; 00352 row_sum += ref[2]*ref[2]; 00353 row_sum += ref[3]*ref[3]; 00354 row_sum += ref[4]*ref[4]; 00355 row_sum += ref[5]*ref[5]; 00356 00357 #define SMALL_NUM 1e-24 00358 row_sum = (row_sum != 0)?row_sum: SMALL_NUM; 00359 #if 1 00360 Float u0= -gaugeParam->tadpole_coeff*gaugeParam->tadpole_coeff*24; 00361 { 00362 int X1h=gaugeParam->X[0]/2; 00363 int X1 =gaugeParam->X[0]; 00364 int X2 =gaugeParam->X[1]; 00365 int X3 =gaugeParam->X[2]; 00366 int X4 =gaugeParam->X[3]; 00367 00368 int index = fullLatticeIndex(ga_idx, oddBit); 00369 int i4 = index /(X3*X2*X1); 00370 int i3 = (index - i4*(X3*X2*X1))/(X2*X1); 00371 int i2 = (index - i4*(X3*X2*X1) - i3*(X2*X1))/X1; 00372 int i1 = index - i4*(X3*X2*X1) - i3*(X2*X1) - i2*X1; 00373 00374 if (dir == 0) { 00375 if (i4 % 2 == 1){ 00376 u0 *= -1; 00377 } 00378 } 00379 00380 if (dir == 1){ 00381 if ((i1+i4) % 2 == 1){ 00382 u0 *= -1; 00383 } 00384 } 00385 if (dir == 2){ 00386 if ( (i4+i1+i2) % 2 == 1){ 00387 u0 *= -1; 00388 } 00389 } 00390 if (dir == 3){ 00391 if (ga_idx >= (X4-3)*X1h*X2*X3 ){ 00392 u0 *= -1; 00393 } 00394 } 00395 00396 //printf("local ga_idx =%d, index=%d, i4,3,2,1 =%d %d %d %d\n", ga_idx, index, i4, i3, i2,i1); 00397 00398 } 00399 #endif 00400 00401 00402 Float U00_mag = sqrt( (1.f/(u0*u0) - row_sum)>0? (1.f/(u0*u0)-row_sum):0); 00403 00404 ref[14] = ref[0]; 00405 ref[15] = ref[1]; 00406 00407 ref[0] = U00_mag * cos(ref[14]); 00408 ref[1] = U00_mag * sin(ref[14]); 00409 00410 Float column_sum = 0.0; 00411 for (int i=0; i<2; i++) column_sum += ref[i]*ref[i]; 00412 for (int i=6; i<8; i++) column_sum += ref[i]*ref[i]; 00413 Float U20_mag = sqrt( (1.f/(u0*u0) - column_sum) > 0? (1.f/(u0*u0)-column_sum) : 0); 00414 00415 ref[12] = U20_mag * cos(ref[15]); 00416 ref[13] = U20_mag * sin(ref[15]); 00417 00418 // First column now restored 00419 00420 // finally reconstruct last elements from SU(2) rotation 00421 Float r_inv2 = 1.0/(u0*row_sum); 00422 00423 // U11 00424 Float A[2]; 00425 complexDotProduct(A, ref+0, ref+6); 00426 complexConjugateProduct(ref+8, ref+12, ref+4); 00427 accumulateComplexProduct(ref+8, A, ref+2, u0); 00428 ref[8] *= -r_inv2; 00429 ref[9] *= -r_inv2; 00430 00431 // U12 00432 complexConjugateProduct(ref+10, ref+12, ref+2); 00433 accumulateComplexProduct(ref+10, A, ref+4, -u0); 00434 ref[10] *= r_inv2; 00435 ref[11] *= r_inv2; 00436 00437 // U21 00438 complexDotProduct(A, ref+0, ref+12); 00439 complexConjugateProduct(ref+14, ref+6, ref+4); 00440 accumulateComplexProduct(ref+14, A, ref+2, -u0); 00441 ref[14] *= r_inv2; 00442 ref[15] *= r_inv2; 00443 00444 // U12 00445 complexConjugateProduct(ref+16, ref+6, ref+2); 00446 accumulateComplexProduct(ref+16, A, ref+4, u0); 00447 ref[16] *= -r_inv2; 00448 ref[17] *= -r_inv2; 00449 00450 double delta = 0.0001; 00451 int i; 00452 for (i =0;i < 18; i++){ 00453 00454 double diff = ref[i] - link[i]; 00455 double absdiff = diff > 0? diff: (-diff); 00456 if ( (ref[i] != ref[i]) || (absdiff > delta)){ 00457 printf("ERROR: sanity check failed for link\n"); 00458 display_link_internal(link); 00459 printf("reconstructed link is\n"); 00460 display_link_internal(ref); 00461 printf("dir=%d, ga_idx=%d, u0=%f, t_boundary=%f\n",dir, ga_idx, u0, t_boundary); 00462 printf("X=%d %d %d %d, X1h=%d\n", gaugeParam->X[0], X2, X3, X4, X1h); 00463 return -1; 00464 } 00465 00466 } 00467 00468 00469 return ret; 00470 } 00471 00472 00473 //this len must be V 00474 int 00475 link_sanity_check(void* link, int len, int precision, int dir, QudaGaugeParam* gaugeParam) 00476 { 00477 int i; 00478 int rc = 0; 00479 00480 if (precision == QUDA_DOUBLE_PRECISION){ 00481 double* mylink = (double*)link; 00482 //even 00483 for (i = 0;i < len/2; i++){ 00484 rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0); 00485 if (rc != 0){ 00486 printf("ERROR: even link sanity check failed, i=%d\n",i); 00487 display_link_internal(mylink+gaugeSiteSize*i); 00488 exit(1); 00489 } 00490 } 00491 00492 mylink = mylink + gaugeSiteSize*len/2; 00493 //odd 00494 for (i = 0;i < len/2; i++){ 00495 rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 1); 00496 if (rc != 0){ 00497 printf("ERROR: odd link sanity check failed, i=%d\n",i); 00498 display_link_internal(mylink+gaugeSiteSize*i); 00499 exit(1); 00500 } 00501 } 00502 00503 }else if (precision == QUDA_SINGLE_PRECISION){ 00504 float* mylink = (float*)link; 00505 00506 //even 00507 for (i=0;i < len/2 ;i++){ 00508 rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0); 00509 if (rc != 0){ 00510 printf("ERROR: even link sanity check 12 failed, i=%d\n",i); 00511 exit(1); 00512 } 00513 /* 00514 rc = link_sanity_check_internal_8(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0); 00515 if (rc != 0){ 00516 printf("ERROR: even link sanity check 8 failed, i=%d\n",i); 00517 exit(1); 00518 } 00519 */ 00520 00521 } 00522 mylink = mylink + gaugeSiteSize*len/2; 00523 //odd 00524 for (i=0;i < len/2 ;i++){ 00525 rc = link_sanity_check_internal_12(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 1); 00526 if (rc != 0){ 00527 printf("ERROR: odd link sanity check 12 failed, i=%d\n", i); 00528 exit(1); 00529 } 00530 /* 00531 rc = link_sanity_check_internal_8(mylink + gaugeSiteSize*i, dir, i, gaugeParam, 0); 00532 if (rc != 0){ 00533 printf("ERROR: even link sanity check 8 failed, i=%d\n",i); 00534 exit(1); 00535 } 00536 */ 00537 } 00538 00539 } 00540 00541 return rc; 00542 } 00543 00544 00545 00546 //this len must be V 00547 int 00548 site_link_sanity_check(void* link, int len, int precision, QudaGaugeParam* gaugeParam) 00549 { 00550 int i; 00551 int rc = 0; 00552 int dir; 00553 00554 if (precision == QUDA_DOUBLE_PRECISION){ 00555 double* mylink = (double*)link; 00556 //even 00557 for (i = 0;i < len/2; i++){ 00558 for(dir=XUP;dir <= TUP; dir++){ 00559 rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 0); 00560 if (rc != 0){ 00561 printf("ERROR: even link sanity check failed, i=%d, function %s\n",i, __FUNCTION__); 00562 display_link_internal(mylink+gaugeSiteSize*i); 00563 exit(1); 00564 } 00565 } 00566 } 00567 00568 mylink = mylink + 4*gaugeSiteSize*len/2; 00569 //odd 00570 for (i = 0;i < len/2; i++){ 00571 for(dir=XUP;dir <= TUP; dir++){ 00572 rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 1); 00573 if (rc != 0){ 00574 printf("ERROR: odd link sanity check failed, i=%d, function %s\n",i, __FUNCTION__); 00575 display_link_internal(mylink+gaugeSiteSize*i); 00576 exit(1); 00577 } 00578 } 00579 } 00580 00581 }else if (precision == QUDA_SINGLE_PRECISION){ 00582 float* mylink = (float*)link; 00583 00584 //even 00585 for (i=0;i < len/2 ;i++){ 00586 for(dir=XUP;dir <= TUP; dir++){ 00587 rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 0); 00588 if (rc != 0){ 00589 printf("ERROR: even link sanity check 12 failed, i=%d, function %s\n",i, __FUNCTION__); 00590 exit(1); 00591 } 00592 } 00593 } 00594 mylink = mylink + 4*gaugeSiteSize*len/2; 00595 //odd 00596 for (i=0;i < len/2 ;i++){ 00597 for(dir=XUP;dir <= TUP; dir++){ 00598 rc = site_link_sanity_check_internal_12(mylink + gaugeSiteSize*(4*i+dir), dir, i, gaugeParam, 1); 00599 if (rc != 0){ 00600 printf("ERROR: odd link sanity check 12 failed, i=%d, function %s\n", i, __FUNCTION__); 00601 exit(1); 00602 } 00603 } 00604 } 00605 00606 } 00607 00608 return rc; 00609 } 00610 00611 00612 QudaReconstructType 00613 get_recon(char* s) 00614 { 00615 QudaReconstructType ret; 00616 00617 if (strcmp(s, "8") == 0){ 00618 ret = QUDA_RECONSTRUCT_8; 00619 }else if (strcmp(s, "12") == 0){ 00620 ret = QUDA_RECONSTRUCT_12; 00621 }else if (strcmp(s, "18") == 0){ 00622 ret = QUDA_RECONSTRUCT_NO; 00623 }else{ 00624 fprintf(stderr, "Error: invalid reconstruct type\n"); 00625 exit(1); 00626 } 00627 00628 return ret; 00629 00630 00631 } 00632 00633 QudaPrecision 00634 get_prec(char* s) 00635 { 00636 QudaPrecision ret = QUDA_DOUBLE_PRECISION; 00637 00638 if (strcmp(s, "double") == 0){ 00639 ret = QUDA_DOUBLE_PRECISION; 00640 }else if (strcmp(s, "single") == 0){ 00641 ret = QUDA_SINGLE_PRECISION; 00642 }else if (strcmp(s, "half") == 0){ 00643 ret = QUDA_HALF_PRECISION; 00644 }else{ 00645 fprintf(stderr, "Error: invalid precision type\n"); 00646 exit(1); 00647 } 00648 00649 return ret; 00650 } 00651 00652 const char* 00653 get_prec_str(QudaPrecision prec) 00654 { 00655 const char* ret; 00656 00657 switch( prec){ 00658 00659 case QUDA_DOUBLE_PRECISION: 00660 ret= "double"; 00661 break; 00662 case QUDA_SINGLE_PRECISION: 00663 ret= "single"; 00664 break; 00665 case QUDA_HALF_PRECISION: 00666 ret= "half"; 00667 break; 00668 default: 00669 ret = "unknown"; 00670 break; 00671 } 00672 00673 00674 return ret; 00675 00676 } 00677 00678 const char* 00679 get_recon_str(QudaReconstructType recon) 00680 { 00681 const char* ret; 00682 switch(recon){ 00683 case QUDA_RECONSTRUCT_12: 00684 ret= "12"; 00685 break; 00686 case QUDA_RECONSTRUCT_8: 00687 ret = "8"; 00688 break; 00689 case QUDA_RECONSTRUCT_NO: 00690 ret = "18"; 00691 break; 00692 default: 00693 ret="unknown"; 00694 break; 00695 00696 } 00697 00698 return ret; 00699 } 00700 00701 const char* 00702 get_test_type(int t) 00703 { 00704 const char* ret; 00705 switch(t){ 00706 case 0: 00707 ret = "even"; 00708 break; 00709 case 1: 00710 ret = "odd"; 00711 break; 00712 case 2: 00713 ret = "full"; 00714 break; 00715 case 3: 00716 ret = "mcg_even"; 00717 break; 00718 case 4: 00719 ret = "mcg_odd"; 00720 break; 00721 case 5: 00722 ret = "mcg_full"; 00723 break; 00724 default: 00725 ret = "unknown"; 00726 break; 00727 } 00728 00729 return ret; 00730 } 00731 00732 void 00733 quda_set_verbose(int v) 00734 { 00735 verbose = v; 00736 }
1.7.3