su3 slow_expon(su3 in, int nterm) { su3 out , out_new , aa , aa_old , aa_scale ; int i ; double fact = 1 ; _su3_one(out) ; aa = in ; aa_old = aa ; _su3_plus_su3(out_new,out,aa) ; out = out_new ; for(i=2 ; i < nterm ; ++i) { _su3_times_su3(aa,in,aa_old); aa_old = aa ; aa_scale = aa ; fact *= i ; scale_su3(&aa_scale, 1.0/fact ) ; _su3_plus_su3(out_new,out,aa_scale) ; out = out_new ; } return(out); }
void sw_spinor(const int ieo, spinor * const kk, spinor * const ll) { int ioff; int icx; int x; spinor *r,*s; static su3 v0,v1,v2,v3; static su3 u0,u1,u2,u3; static su3 lswp[4],lswm[4]; if(ieo == 0) { ioff=0; } else { ioff=(VOLUME+RAND)/2; } /************************ loop over half of the lattice sites ***********/ for(icx = ioff; icx < (VOLUME/2+ioff); icx++) { x = g_eo2lexic[icx]; r = kk + icx - ioff; s = ll + icx - ioff; _vector_tensor_vector(v0,(*r).s0,(*s).s0); _vector_tensor_vector(v1,(*r).s0,(*s).s1); _vector_tensor_vector(v2,(*r).s1,(*s).s1); _vector_tensor_vector(v3,(*r).s1,(*s).s0); _vector_tensor_vector(u0,(*r).s2,(*s).s2); _vector_tensor_vector(u1,(*r).s2,(*s).s3); _vector_tensor_vector(u2,(*r).s3,(*s).s3); _vector_tensor_vector(u3,(*r).s3,(*s).s2); /* compute the insertion matrix */ _su3_plus_su3(lswp[0],u0,v0); _su3_plus_su3(lswp[1],u1,v1); _su3_plus_su3(lswp[2],u2,v2); _su3_plus_su3(lswp[3],u3,v3); _su3_minus_su3(lswm[0],u0,v0); _su3_minus_su3(lswm[1],u1,v1); _su3_minus_su3(lswm[2],u2,v2); _su3_minus_su3(lswm[3],u3,v3); /* add up the swm[0] and swp[0] */ _su3_acc(swm[x][0], lswm[0]); _su3_acc(swm[x][1], lswm[1]); _su3_acc(swm[x][2], lswm[2]); _su3_acc(swm[x][3], lswm[3]); _su3_acc(swp[x][0], lswp[0]); _su3_acc(swp[x][1], lswp[1]); _su3_acc(swp[x][2], lswp[2]); _su3_acc(swp[x][3], lswp[3]); } return; }
void sw_term(su3 ** const gf, const double kappa, const double c_sw) { int k,l; int x,xpk,xpl,xmk,xml,xpkml,xplmk,xmkml; su3 *w1,*w2,*w3,*w4; double ka_csw_8 = kappa*c_sw/8.; static su3 v1,v2,plaq; static su3 fkl[4][4]; static su3 magnetic[4],electric[4]; static su3 aux; /* compute the clover-leave */ /* l __ __ | | | | |__| |__| __ __ | | | | |__| |__| k */ for(x = 0; x < VOLUME; x++) { for(k = 0; k < 4; k++) { for(l = k+1; l < 4; l++) { xpk=g_iup[x][k]; xpl=g_iup[x][l]; xmk=g_idn[x][k]; xml=g_idn[x][l]; xpkml=g_idn[xpk][l]; xplmk=g_idn[xpl][k]; xmkml=g_idn[xml][k]; w1=&gf[x][k]; w2=&gf[xpk][l]; w3=&gf[xpl][k]; w4=&gf[x][l]; _su3_times_su3(v1,*w1,*w2); _su3_times_su3(v2,*w4,*w3); _su3_times_su3d(plaq,v1,v2); w1=&gf[x][l]; w2=&gf[xplmk][k]; w3=&gf[xmk][l]; w4=&gf[xmk][k]; _su3_times_su3d(v1,*w1,*w2); _su3d_times_su3(v2,*w3,*w4); _su3_times_su3_acc(plaq,v1,v2); w1=&gf[xmk][k]; w2=&gf[xmkml][l]; w3=&gf[xmkml][k]; w4=&gf[xml][l]; _su3_times_su3(v1,*w2,*w1); _su3_times_su3(v2,*w3,*w4); _su3d_times_su3_acc(plaq,v1,v2); w1=&gf[xml][l]; w2=&gf[xml][k]; w3=&gf[xpkml][l]; w4=&gf[x][k]; _su3d_times_su3(v1,*w1,*w2); _su3_times_su3d(v2,*w3,*w4); _su3_times_su3_acc(plaq,v1,v2); _su3_dagger(v2,plaq); _su3_minus_su3(fkl[k][l],plaq,v2); } } // this is the one in flavour and colour space // twisted mass term is treated in clover, sw_inv and // clover_gamma5 _su3_one(sw[x][0][0]); _su3_one(sw[x][2][0]); _su3_one(sw[x][0][1]); _su3_one(sw[x][2][1]); for(k = 1; k < 4; k++) { _su3_assign(electric[k], fkl[0][k]); } _su3_assign(magnetic[1], fkl[2][3]); _su3_minus_assign(magnetic[2], fkl[1][3]); _su3_assign(magnetic[3], fkl[1][2]); /* upper left block 6x6 matrix */ _itimes_su3_minus_su3(aux,electric[3],magnetic[3]); _su3_refac_acc(sw[x][0][0],ka_csw_8,aux); _itimes_su3_minus_su3(aux,electric[1],magnetic[1]); _su3_minus_su3(v2,electric[2],magnetic[2]); _su3_acc(aux,v2); _real_times_su3(sw[x][1][0],ka_csw_8,aux); _itimes_su3_minus_su3(aux,magnetic[3],electric[3]); _su3_refac_acc(sw[x][2][0],ka_csw_8,aux); /* lower right block 6x6 matrix */ _itimes_su3_plus_su3(aux,electric[3],magnetic[3]); _su3_refac_acc(sw[x][0][1],(-ka_csw_8),aux); _itimes_su3_plus_su3(aux,electric[1],magnetic[1]); _su3_plus_su3(v2,electric[2],magnetic[2]); _su3_acc(aux,v2); _real_times_su3(sw[x][1][1],(-ka_csw_8),aux); _itimes_su3_plus_su3(aux,magnetic[3],electric[3]); _su3_refac_acc(sw[x][2][1],ka_csw_8,aux); } return; }
void sw_deriv(const int ieo, const double mu) { int ioff; int x; double fac = 1.0000; static su3 lswp[4],lswm[4]; /* convention: Tr clover-leaf times insertion */ if(ieo == 0) { ioff=0; } else { ioff = (VOLUME+RAND)/2; } if(fabs(mu) > 0.) fac = 0.5; for(int icx = ioff, icy=0; icx < (VOLUME/2+ioff); icx++, icy++) { x = g_eo2lexic[icx]; /* compute the insertion matrix */ _su3_plus_su3(lswp[0],sw_inv[icy][0][1],sw_inv[icy][0][0]); _su3_plus_su3(lswp[1],sw_inv[icy][1][1],sw_inv[icy][1][0]); _su3_plus_su3(lswp[2],sw_inv[icy][2][1],sw_inv[icy][2][0]); _su3_plus_su3(lswp[3],sw_inv[icy][3][1],sw_inv[icy][3][0]); _su3_minus_su3(lswm[0],sw_inv[icy][0][1],sw_inv[icy][0][0]); _su3_minus_su3(lswm[1],sw_inv[icy][1][1],sw_inv[icy][1][0]); _su3_minus_su3(lswm[2],sw_inv[icy][2][1],sw_inv[icy][2][0]); _su3_minus_su3(lswm[3],sw_inv[icy][3][1],sw_inv[icy][3][0]); /* add up to swm[] and swp[] */ _su3_refac_acc(swm[x][0], fac, lswm[0]); _su3_refac_acc(swm[x][1], fac, lswm[1]); _su3_refac_acc(swm[x][2], fac, lswm[2]); _su3_refac_acc(swm[x][3], fac, lswm[3]); _su3_refac_acc(swp[x][0], fac, lswp[0]); _su3_refac_acc(swp[x][1], fac, lswp[1]); _su3_refac_acc(swp[x][2], fac, lswp[2]); _su3_refac_acc(swp[x][3], fac, lswp[3]); if(fabs(mu) > 0.) { /* compute the insertion matrix */ _su3_plus_su3(lswp[0],sw_inv[icy+VOLUME/2][0][1],sw_inv[icy+VOLUME/2][0][0]); _su3_plus_su3(lswp[1],sw_inv[icy+VOLUME/2][1][1],sw_inv[icy+VOLUME/2][1][0]); _su3_plus_su3(lswp[2],sw_inv[icy+VOLUME/2][2][1],sw_inv[icy+VOLUME/2][2][0]); _su3_plus_su3(lswp[3],sw_inv[icy+VOLUME/2][3][1],sw_inv[icy+VOLUME/2][3][0]); _su3_minus_su3(lswm[0],sw_inv[icy+VOLUME/2][0][1],sw_inv[icy+VOLUME/2][0][0]); _su3_minus_su3(lswm[1],sw_inv[icy+VOLUME/2][1][1],sw_inv[icy+VOLUME/2][1][0]); _su3_minus_su3(lswm[2],sw_inv[icy+VOLUME/2][2][1],sw_inv[icy+VOLUME/2][2][0]); _su3_minus_su3(lswm[3],sw_inv[icy+VOLUME/2][3][1],sw_inv[icy+VOLUME/2][3][0]); /* add up to swm[] and swp[] */ _su3_refac_acc(swm[x][0], fac, lswm[0]); _su3_refac_acc(swm[x][1], fac, lswm[1]); _su3_refac_acc(swm[x][2], fac, lswm[2]); _su3_refac_acc(swm[x][3], fac, lswm[3]); _su3_refac_acc(swp[x][0], fac, lswp[0]); _su3_refac_acc(swp[x][1], fac, lswp[1]); _su3_refac_acc(swp[x][2], fac, lswp[2]); _su3_refac_acc(swp[x][3], fac, lswp[3]); } } return; }