QUDA v0.3.2
A library for QCD on GPUs

quda/tests/misc.cpp

Go to the documentation of this file.
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 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Defines