Exemplo n.º 1
0
// 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;
}
Exemplo n.º 2
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);
        }
    }
}
Exemplo n.º 3
0
// 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;
}
Exemplo n.º 4
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;
}
Exemplo n.º 5
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;
}
Exemplo n.º 6
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();}
      }
    }
  }

}
Exemplo n.º 7
0
void su3_Tmul(float *res, float *mat, float *vec) {
    float matT[3*3*2];
    su3_transpose(matT, mat);
    su3_mul(res, matT, vec);
}