// r=sqrt(2) double twloop2(int t, int mu, int nu ,const su3_matrix* links, int* site){ su3_matrix A[(2+t)*2]; // bottom side for(int i=0;i<t;i++){ A[i]=links[index(site,0)]; shift(site,0,FORWARD); } // right side, twisted A[t+0]=links[index(site,mu)]; shift(site,mu,FORWARD); A[t+1]=links[index(site,nu)]; shift(site,nu,FORWARD); // top side for(int i=0;i<t;i++){ shift(site,0,BACKWARD); A[t+2+i]=su3_inv(links[index(site,0)]); } // left side, twisted shift(site,mu,BACKWARD); A[t+2+t+0]=su3_inv(links[index(site,mu)]); shift(site,nu,BACKWARD); A[t+2+t+1]=su3_inv(links[index(site,nu)]); // multiply for(int i=1;i<2*(2+t);i++){ A[0]=su3_mul(A[0],A[i]); } return su3_trace(A[0])/3.0; }
// // dslashReference() // // if oddBit is zero: calculate odd parity spinor elements (using even parity spinor) // if oddBit is one: calculate even parity spinor elements // // if daggerBit is zero: perform ordinary dslash operator // if daggerBit is one: perform hermitian conjugate of dslash // void dslashReference(float *res, float **gaugeFull, float *spinorField, int oddBit, int daggerBit) { zero(res, Nh*4*3*2); float *gaugeEven[4], *gaugeOdd[4]; for (int dir = 0; dir < 4; dir++) { gaugeEven[dir] = gaugeFull[dir]; gaugeOdd[dir] = gaugeFull[dir]+Nh*gaugeSiteSize; } for (int i = 0; i < Nh; i++) { for (int dir = 0; dir < 8; dir++) { float *gauge = gaugeLink(i, dir, oddBit, gaugeEven, gaugeOdd); float *spinor = spinorNeighbor(i, dir, oddBit, spinorField); float projectedSpinor[4*3*2], gaugedSpinor[4*3*2]; int projIdx = 2*(dir/2)+(dir+daggerBit)%2; multiplySpinorByDiracProjector(projectedSpinor, projIdx, spinor); for (int s = 0; s < 4; s++) { if (dir % 2 == 0) su3_mul(&gaugedSpinor[s*(3*2)], gauge, &projectedSpinor[s*(3*2)]); else su3_Tmul(&gaugedSpinor[s*(3*2)], gauge, &projectedSpinor[s*(3*2)]); } sum(&res[i*(4*3*2)], &res[i*(4*3*2)], gaugedSpinor, 4*3*2); } } }
// plaquette operator at site (t,x,y,z) in plane (mu,nu) // normally mu>nu double plaquette(const su3_matrix* links, int mu, int nu, int* site){ su3_matrix A,B,C,D; A = links[index(site,mu)]; shift(site,mu,FORWARD); B = links[index(site,nu)]; shift(site,mu,BACKWARD); shift(site,nu,FORWARD); C = su3_inv(links[index(site,mu)]); shift(site,nu,BACKWARD); // restore site position D = su3_inv(links[index(site,nu)]); A = su3_mul(A,B); A = su3_mul(A,C); A = su3_mul(A,D); return su3_trace(A)/3.0; }
// end of Wilson loop ------------------------------------------------------ // Polyakov loop ----------------------------------------------------------- double polyakov(const su3_matrix* links, int* site){ su3_matrix A[N]; for(int i=0;i<N;i++){ A[i]=links[index(site,0)]; shift(site,0,FORWARD); } // multiply for(int i=1;i<N;i++){ A[0]=su3_mul(A[0],A[i]); } return su3_trace(A[0])/3.0; }
// TODO: not working double gloop(int n, int* shape, const su3_matrix* links, int* site){ su3_matrix A[2*n]; // forward for(int i=0;i<n;i++){ A[i]=links[index(site,shape[i])]; shift(site,shape[i],FORWARD); } // backward for(int i=0;i<n;i++){ shift(site,shape[i],BACKWARD); A[n+i]=su3_inv(links[index(site,shape[i])]); } // multiply for(int i=1;i<2*n;i++){ A[0]=su3_mul(A[0],A[i]); } return su3_trace(A[0])/3.0; }
// update void do_hb_update(su3_matrix* links, const gsl_rng* r, const su3_matrix* rands, int* site, int dir){ if(verbose) {printf("Updating {%d, %d, %d, %d} direction %d",site[0],site[1],site[2],site[3],dir);getchar();} double dS,action_old; su3_matrix link_old; for(int times=0; times<Nk; times++){ action_old = action(links,site,dir); link_old = links[index(site,dir)]; links[index(site,dir)]=su3_mul(links[index(site,dir)],rands[gsl_rng_uniform_int(r, 50)]); dS = action(links,site,dir)-action_old; if(verbose) {printf("Old action = %f, ",action_old); su3_print(link_old); getchar();} if(verbose) {printf("New action = %f, ",action_old+dS); su3_print(links[index(site,dir)]); getchar();} acc++;tot++; if(dS>0){ if(exp(-dS)<gsl_rng_uniform(r)){ acc--; links[index(site,dir)]=link_old; // revert update if(verbose) {printf("Reverted"); getchar();} } } } }
void su3_Tmul(float *res, float *mat, float *vec) { float matT[3*3*2]; su3_transpose(matT, mat); su3_mul(res, matT, vec); }