14 #define stSpinorSiteSize 6
15 template<
typename Float>
18 printf(
"(%f,%f) (%f,%f) (%f,%f) \t",
19 spinor[0], spinor[1], spinor[2],
20 spinor[3], spinor[4], spinor[5]);
33 double* myspinor = (
double*)spinor;
34 for (i = 0;i < len; i++){
38 float* myspinor = (
float*)spinor;
39 for (i=0;i < len ;i++){
48 template<
typename Float>
53 for (i = 0;i < 3; i++){
55 printf(
"(%.10f,%.10f) \t", link[i*3*2 + j*2], link[i*3*2 + j*2 + 1]);
70 double* mylink = (
double*)link;
71 for (i = 0;i < len; i++){
75 float* mylink = (
float*)link;
76 for (i=0;i < len ;i++){
85 template <
typename Float>
87 a[0] += sign * (b[0]*c[0] - b[1]*c[1]);
88 a[1] -= sign * (b[0]*c[1] + b[1]*c[0]);
92 template<
typename Float>
100 Float* refc = &refc_buf[0];
102 memset((
void*)refc, 0,
sizeof(refc_buf));
106 Float* c = link + 12;
115 int X1h=gaugeParam->
X[0]/2;
116 int X1 =gaugeParam->
X[0];
117 int X2 =gaugeParam->
X[1];
118 int X3 =gaugeParam->
X[2];
119 int X4 =gaugeParam->
X[3];
123 double coff= -u0*u0*24;
133 int i4 = index /(X3*X2*
X1);
134 int i3 = (index - i4*(X3*X2*
X1))/(X2*
X1);
135 int i2 = (index - i4*(X3*X2*
X1) - i3*(X2*X1))/X1;
136 int i1 = index - i4*(X3*X2*
X1) - i3*(X2*X1) - i2*
X1;
145 if ((i1+i4) % 2 == 1){
150 if ( (i4+i1+i2) % 2 == 1){
155 if (ga_idx >= (X4-3)*X1h*X2*
X3 ){
166 refc[0]*=coff; refc[1]*=coff; refc[2]*=coff; refc[3]*=coff; refc[4]*=coff; refc[5]*=coff;
169 double delta = 0.0001;
171 for (i =0;i < 6; i++){
172 double diff = refc[i] - c[i];
173 double absdiff = diff > 0? diff: (-diff);
174 if (absdiff > delta){
175 printf(
"ERROR: sanity check failed for link\n");
177 printf(
"refc = (%.10f,%.10f) (%.10f,%.10f) (%.10f,%.10f)\n",
178 refc[0], refc[1], refc[2], refc[3], refc[4], refc[5]);
179 printf(
"dir=%d, ga_idx=%d, coff=%f, t_boundary=%f\n",dir, ga_idx,coff, t_boundary);
180 printf(
"X=%d %d %d %d, X1h=%d\n", gaugeParam->
X[0], X2, X3, X4, X1h);
191 template<
typename Float>
197 Float* refc = &refc_buf[0];
199 memset((
void*)refc, 0,
sizeof(refc_buf));
203 Float* c = link + 12;
212 int X1h=gaugeParam->
X[0]/2;
213 int X1 =gaugeParam->
X[0];
214 int X2 =gaugeParam->
X[1];
215 int X3 =gaugeParam->
X[2];
216 int X4 =gaugeParam->
X[3];
222 bool last_node_in_t =
true;
230 int i4 = index /(X3*X2*
X1);
231 int i3 = (index - i4*(X3*X2*
X1))/(X2*
X1);
232 int i2 = (index - i4*(X3*X2*
X1) - i3*(X2*X1))/X1;
233 int i1 = index - i4*(X3*X2*
X1) - i3*(X2*X1) - i2*
X1;
242 if ((i1+i4) % 2 == 1){
247 if ( (i4+i1+i2) % 2 == 1){
252 if (last_node_in_t && i4 == (X4-1) ){
263 double delta = 0.0001;
265 for (i =0;i < 6; i++){
266 double diff = refc[i] - c[i];
267 double absdiff = diff > 0? diff: (-diff);
268 if (absdiff > delta){
269 printf(
"ERROR: sanity check failed for site link\n");
271 printf(
"refc = (%.10f,%.10f) (%.10f,%.10f) (%.10f,%.10f)\n",
272 refc[0], refc[1], refc[2], refc[3], refc[4], refc[5]);
273 printf(
"X=%d %d %d %d, X1h=%d\n", gaugeParam->
X[0], X2, X3, X4, X1h);
289 template <
typename Float>
296 template <
typename Float>
298 a[0] = b[0]*c[0] - b[1]*c[1];
299 a[1] = b[0]*c[1] + b[1]*c[0];
303 template <
typename Float>
305 a[0] = b[0]*c[0] - b[1]*c[1];
306 a[1] = -b[0]*c[1] - b[1]*c[0];
310 template <
typename Float>
312 a[0] = b[0]*c[0] + b[1]*c[1];
313 a[1] = b[0]*c[1] - b[1]*c[0];
317 template <
typename Float>
319 a[0] += sign*(b[0]*c[0] - b[1]*c[1]);
320 a[1] += sign*(b[0]*c[1] + b[1]*c[0]);
324 template <
typename Float>
326 a[0] += b[0]*c[0] + b[1]*c[1];
327 a[1] += b[0]*c[1] - b[1]*c[0];
331 template<
typename Float>
336 Float ref_link_buf[18];
338 memset(ref, 0,
sizeof(ref_link_buf));
340 ref[0] = atan2(link[1], link[0]);
341 ref[1] = atan2(link[13], link[12]);
342 for (
int i=2; i<7; i++) {
346 int X1h=gaugeParam->
X[0]/2;
347 int X2 =gaugeParam->
X[1];
348 int X3 =gaugeParam->
X[2];
349 int X4 =gaugeParam->
X[3];
355 row_sum += ref[2]*ref[2];
356 row_sum += ref[3]*ref[3];
357 row_sum += ref[4]*ref[4];
358 row_sum += ref[5]*ref[5];
360 #define SMALL_NUM 1e-24
361 row_sum = (row_sum != 0)?row_sum:
SMALL_NUM;
365 int X1h=gaugeParam->
X[0]/2;
366 int X1 =gaugeParam->
X[0];
367 int X2 =gaugeParam->
X[1];
368 int X3 =gaugeParam->
X[2];
369 int X4 =gaugeParam->
X[3];
372 int i4 = index /(X3*X2*
X1);
373 int i3 = (index - i4*(X3*X2*
X1))/(X2*
X1);
374 int i2 = (index - i4*(X3*X2*
X1) - i3*(X2*X1))/X1;
375 int i1 = index - i4*(X3*X2*
X1) - i3*(X2*X1) - i2*
X1;
384 if ((i1+i4) % 2 == 1){
389 if ( (i4+i1+i2) % 2 == 1){
394 if (ga_idx >= (X4-3)*X1h*X2*
X3 ){
405 Float U00_mag = sqrt( (1.f/(u0*u0) - row_sum)>0? (1.f/(u0*u0)-row_sum):0);
410 ref[0] = U00_mag * cos(ref[14]);
411 ref[1] = U00_mag * sin(ref[14]);
413 Float column_sum = 0.0;
414 for (
int i=0; i<2; i++) column_sum += ref[i]*ref[i];
415 for (
int i=6; i<8; i++) column_sum += ref[i]*ref[i];
416 Float U20_mag = sqrt( (1.f/(u0*u0) - column_sum) > 0? (1.f/(u0*u0)-column_sum) : 0);
418 ref[12] = U20_mag * cos(ref[15]);
419 ref[13] = U20_mag * sin(ref[15]);
424 Float r_inv2 = 1.0/(u0*row_sum);
453 double delta = 0.0001;
455 for (i =0;i < 18; i++){
457 double diff = ref[i] - link[i];
458 double absdiff = diff > 0? diff: (-diff);
459 if ( (ref[i] != ref[i]) || (absdiff > delta)){
460 printf(
"ERROR: sanity check failed for link\n");
462 printf(
"reconstructed link is\n");
464 printf(
"dir=%d, ga_idx=%d, u0=%f, t_boundary=%f\n",dir, ga_idx, u0, t_boundary);
465 printf(
"X=%d %d %d %d, X1h=%d\n", gaugeParam->
X[0], X2, X3, X4, X1h);
484 double* mylink = (
double*)link;
486 for (i = 0;i < len/2; i++){
489 printf(
"ERROR: even link sanity check failed, i=%d\n",i);
497 for (i = 0;i < len/2; i++){
500 printf(
"ERROR: odd link sanity check failed, i=%d\n",i);
507 float* mylink = (
float*)link;
510 for (i=0;i < len/2 ;i++){
513 printf(
"ERROR: even link sanity check 12 failed, i=%d\n",i);
527 for (i=0;i < len/2 ;i++){
530 printf(
"ERROR: odd link sanity check 12 failed, i=%d\n", i);
558 double* mylink = (
double*)link;
560 for (i = 0;i < len/2; i++){
561 for(dir=
XUP;dir <=
TUP; dir++){
564 printf(
"ERROR: even link sanity check failed, i=%d, function %s\n",i, __FUNCTION__);
573 for (i = 0;i < len/2; i++){
574 for(dir=
XUP;dir <=
TUP; dir++){
577 printf(
"ERROR: odd link sanity check failed, i=%d, function %s\n",i, __FUNCTION__);
585 float* mylink = (
float*)link;
588 for (i=0;i < len/2 ;i++){
589 for(dir=
XUP;dir <=
TUP; dir++){
592 printf(
"ERROR: even link sanity check 12 failed, i=%d, function %s\n",i, __FUNCTION__);
599 for (i=0;i < len/2 ;i++){
600 for(dir=
XUP;dir <=
TUP; dir++){
603 printf(
"ERROR: odd link sanity check 12 failed, i=%d, function %s\n", i, __FUNCTION__);
620 if (strcmp(s,
"8") == 0){
622 }
else if (strcmp(s,
"12") == 0){
624 }
else if (strcmp(s,
"18") == 0){
627 fprintf(stderr,
"Error: invalid reconstruct type\n");
641 if (strcmp(s,
"double") == 0){
643 }
else if (strcmp(s,
"single") == 0){
645 }
else if (strcmp(s,
"half") == 0){
648 fprintf(stderr,
"Error: invalid precision type\n");
689 ret =
"Cayley-Hamilton/SVD";
779 if (strcmp(s,
"wilson") == 0){
781 }
else if (strcmp(s,
"clover") == 0){
783 }
else if (strcmp(s,
"twisted_mass") == 0){
785 }
else if (strcmp(s,
"asqtad") == 0){
787 }
else if (strcmp(s,
"domain_wall") == 0){
790 fprintf(stderr,
"Error: invalid dslash type\n");
831 static char vstr[32];
835 sprintf(vstr,
"%1d.%1d.%1d",