Example #1
0
/* input on k; output on l */
void Hopping_Matrix(const int ieo, spinor * const l, spinor * const k){
  int icx,icz,ioff;
  int ix,iz;
  int x0,icx0,jj;
  su3 *restrict up;
  su3 * restrict um;
  spinor * restrict sp;
  spinor * restrict sm;
  spinor * restrict rn;

# if (defined MPI)
#  ifdef PARALLELX
#   define  REQC 4
#  elif defined PARALLELXY
#   define  REQC 8
#  elif defined PARALLELXYZ
#   define  REQC 12
#  endif
  MPI_Request requests[REQC];
  MPI_Status status[REQC];
# endif

#ifdef _GAUGE_COPY
  if(g_update_gauge_copy) {
    update_backward_gauge(g_gauge_field);
  }
#endif

  if(ieo == 0){ /* even out - odd in */
    ioff = 0;
  } 
  else{ /* odd out - even in */
    ioff = (VOLUME+RAND)/2;
  }

  /* Loop over time direction. This is the outmost loop */
  for(x0=0;x0<T;x0++){

    /* start the communication of the timslice borders (non-blocking send and receive)*/
#    if (defined MPI && !defined _NO_COMM)
   xchange_field_open(k, ieo, x0, requests, status);
#    endif
    

  /* loop over timeslice. At: contribution of timelike links  */
   icx0=g_1st_eot[x0][ieo];
   jj =0;
   um=&g_gauge_field_copyt[icx0][0]-1; /* allowed? */
   for(icx = icx0; icx < icx0+TEOSLICE; icx++){
     rn=l+(icx-ioff);
    /*********************** direction +0 ************************/

    sp=k+g_iup_eo[icx][0]; /* all sp,sm,up,um could be moved up */
    up=um+1;

#if (defined AVX)
    _avx_load(sp->s0);
    _avx_load_up(sp->s2);
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka0);
    _avx_store_up(rn->s0);
    _avx_store_up(rn->s2);      
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s3);
    _avx_vector_add();
      
    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka0);
    _avx_store_up(rn->s1);
    _avx_store_up(rn->s3); 

    /*********************** direction -0 ************************/

    sm=k+g_idn_eo[icx][0];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s2);
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka0);
      
    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s2);
    _avx_vector_sub();
    _avx_store(rn->s2);
      
    _avx_load(sm->s1);
    _avx_load_up(sm->s3);
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka0);
      
    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s3);
    _avx_vector_sub();
    _avx_store(rn->s3);

#elif (defined SSE2 || defined SSE3)
    _sse_load(sp->s0);
    _sse_load_up(sp->s2);
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka0);
    _sse_store_up(rn->s0);
    _sse_store_up(rn->s2);      
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s3);
    _sse_vector_add();
      
    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka0);
    _sse_store_up(rn->s1);
    _sse_store_up(rn->s3); 

    /*********************** direction -0 ************************/

    sm=k+g_idn_eo[icx][0];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s2);
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka0);
      
    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s2);
    _sse_vector_sub();
    _sse_store(rn->s2);
      
    _sse_load(sm->s1);
    _sse_load_up(sm->s3);
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka0);
      
    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s3);
    _sse_vector_sub();
    _sse_store(rn->s3);

#endif
    
    jj++;
   } /* end of loop over timeslice (At)*/

       
   /* complete the communication of the timslice borders (and wait) */
#if (defined MPI && !defined _NO_COMM)
   xchange_field_close(requests, status, REQC); /*    MPI_Waitall */
#endif

   /* loop over timeslice. Bt: contribution of spacelike links  */
   um=&g_gauge_field_copys[icx0][0]-1;
   for(icx = icx0; icx < icx0+TEOSLICE; icx++){
    ix=g_eo2lexic[icx];
    rn=l+(icx-ioff);
    /*********************** direction +1 ************************/

    sp=k+g_iup_eo[icx][1];
    up=um+1;

#if (defined AVX)
    _avx_load(sp->s0);
    _avx_load_up(sp->s3);
    _avx_vector_i_mul();
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka1);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s3); 
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s2);
    _avx_vector_i_mul();
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka1);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s2);       

    /*********************** direction -1 ************************/

    sm=k+g_idn_eo[icx][1];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s3);
    _avx_vector_i_mul();
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka1);
      
    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_add();
    _avx_store(rn->s3);

    _avx_load(sm->s1);
    _avx_load_up(sm->s2);
    _avx_vector_i_mul();
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka1);
      
    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_i_mul();      
    _avx_vector_add();
    _avx_store(rn->s2);

    /*********************** direction +2 ************************/

    sp=k+g_iup_eo[icx][2];
    up=um+1;

    _avx_load(sp->s0);
    _avx_load_up(sp->s3);
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka2);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_add();
    _avx_store(rn->s3);
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s2);
    _avx_vector_sub();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka2);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_sub();
    _avx_store(rn->s2);      

    /*********************** direction -2 ************************/

    sm=k+g_idn_eo[icx][2];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s3);
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka2);
      
    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_sub();
    _avx_store(rn->s3);
      
    _avx_load(sm->s1);
    _avx_load_up(sm->s2);
    _avx_vector_add();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka2);
      
    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_add();
    _avx_store(rn->s2);      
      
    /*********************** direction +3 ************************/

    sp=k+g_iup_eo[icx][3];
    up=um+1;

    _avx_load(sp->s0);
    _avx_load_up(sp->s2);
    _avx_vector_i_mul();
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka3);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s2);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s2);
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s3);
    _avx_vector_i_mul();
    _avx_vector_sub();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka3);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_add();
    _avx_store(rn->s3);
      
    /*********************** direction -3 ************************/

    sm=k+g_idn_eo[icx][3];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s2);
    _avx_vector_i_mul();
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka3);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s2);
    _avx_vector_i_mul();
    _avx_vector_add();
    _avx_store(rn->s2);

    _avx_load(sm->s1);
    _avx_load_up(sm->s3);
    _avx_vector_i_mul();
    _avx_vector_add();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka3);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s3);
    
#elif (defined SSE2 || defined SSE3)
    _sse_load(sp->s0);
    _sse_load_up(sp->s3);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka1);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s3); 
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s2);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka1);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s2);       

    /*********************** direction -1 ************************/

    sm=k+g_idn_eo[icx][1];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s3);
    _sse_vector_i_mul();
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka1);
      
    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rn->s3);

    _sse_load(sm->s1);
    _sse_load_up(sm->s2);
    _sse_vector_i_mul();
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka1);
      
    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rn->s2);

    /*********************** direction +2 ************************/

    sp=k+g_iup_eo[icx][2];
    up=um+1;

    _sse_load(sp->s0);
    _sse_load_up(sp->s3);
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka2);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_add();
    _sse_store(rn->s3);
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s2);
    _sse_vector_sub();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka2);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_sub();
    _sse_store(rn->s2);      

    /*********************** direction -2 ************************/

    sm=k+g_idn_eo[icx][2];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s3);
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka2);
      
    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_sub();
    _sse_store(rn->s3);
      
    _sse_load(sm->s1);
    _sse_load_up(sm->s2);
    _sse_vector_add();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka2);
      
    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_add();
    _sse_store(rn->s2);      
      
    /*********************** direction +3 ************************/

    sp=k+g_iup_eo[icx][3];
    up=um+1;

    _sse_load(sp->s0);
    _sse_load_up(sp->s2);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka3);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s2);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s2);
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s3);
    _sse_vector_i_mul();
    _sse_vector_sub();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka3);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rn->s3);
      
    /*********************** direction -3 ************************/

    sm=k+g_idn_eo[icx][3];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s2);
    _sse_vector_i_mul();
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka3);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s2);
    _sse_vector_i_mul();
    _sse_vector_add();
    _sse_store(rn->s2);

    _sse_load(sm->s1);
    _sse_load_up(sm->s3);
    _sse_vector_i_mul();
    _sse_vector_add();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka3);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s3);

#endif    
   }  /* end of loop over timeslice (Bt)*/
  } /* x0=0; x0<T */
}
Example #2
0
/* Serially Checked ! */
void Dtm_psi(spinor * const P, spinor * const Q){

  if(P==Q){
    printf("Error in Dtm_psi (D_psi.c):\n");
    printf("Arguments must be differen spinor fields\n");
    printf("Program aborted\n");
    exit(1);
  }

#ifdef _GAUGE_COPY2
  if(g_update_gauge_copy) {
    update_backward_gauge(g_gauge_field);
  }
#endif

# if defined TM_USE_MPI
  xchange_lexicfield(Q);
# endif

#ifdef TM_USE_OMP
#pragma omp parallel
  {
#endif
    int ix,iy,iz;
    su3 *up,*um;
    spinor *s,*sp,*sm,*rn;
    _Complex double fact1, fact2;
    spinor rs __attribute__ ((aligned (16)));

    fact1 = 1. + g_mu * I;
    fact2 = conj(fact1);

#ifndef TM_USE_OMP
    iy=g_iup[0][0];
    sp=(spinor *) Q + iy;
    up=&g_gauge_field[0][0];
#endif

    /************************ loop over all lattice sites *************************/
#ifdef TM_USE_OMP
#pragma omp for
#endif
    for (ix=0;ix<VOLUME;ix++){
#ifdef TM_USE_OMP
      iy=g_iup[ix][0];
      up=&g_gauge_field[ix][0];
      sp=(spinor *) Q + iy;
#endif
      s=(spinor *) Q + ix;
      _prefetch_spinor(s);

      /******************************* direction +0 *********************************/

      iy=g_idn[ix][0];
      
      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);       

      _sse_load(sp->s0);
      _sse_load_up(sp->s2);
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_0);
      _sse_store_up(rs.s2);

      // the diagonal bit
      _sse_load_up(s->s0);
      _sse_vector_cmplx_mul(fact1);
      _sse_load(rs.s2);
      _sse_vector_add();
      _sse_store(rs.s0);

      // g5 in the twisted term
      _sse_load_up(s->s2);
      _sse_vector_cmplx_mul(fact2);
      _sse_load(rs.s2);
      _sse_vector_add();
      _sse_store(rs.s2);      
      
      um=&g_gauge_field[iy][0];
      _prefetch_su3(um);
      
      _sse_load(sp->s1);
      _sse_load_up(sp->s3);
      _sse_vector_add();
      
      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_0);
      _sse_store_up(rs.s3);
    
      // the diagonal bit
      _sse_load_up(s->s1);
      _sse_vector_cmplx_mul(fact1);
      _sse_load(rs.s3);
      _sse_vector_add();
      _sse_store(rs.s1);

      // g5 in the twisted term
      _sse_load_up(s->s3);
      _sse_vector_cmplx_mul(fact2);
      _sse_load(rs.s3);
      _sse_vector_add();
      _sse_store(rs.s3); 

      /******************************* direction -0 *********************************/

      iy=g_iup[ix][1];

      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s2);
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_0);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s2);
      _sse_vector_sub();
      _sse_store(rs.s2);
      
      up+=1;
      _prefetch_su3(up);
      
      _sse_load(sm->s1);
      _sse_load_up(sm->s3);
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_0);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s3);
      _sse_vector_sub();
      _sse_store(rs.s3);
      
      /******************************* direction +1 *********************************/

      iy=g_idn[ix][1];
      
      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);

      _sse_load(sp->s0);
      _sse_load_up(sp->s3);
      _sse_vector_i_mul();
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_1);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store(rs.s3); 
      
      um=&g_gauge_field[iy][1];
      _prefetch_su3(um);

      _sse_load(sp->s1);
      _sse_load_up(sp->s2);
      _sse_vector_i_mul();
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_1);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store(rs.s2);       

      /******************************* direction -1 *********************************/

      iy=g_iup[ix][2];

      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s3);
      _sse_vector_i_mul();
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_1);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store(rs.s3);

      up+=1;
      _prefetch_su3(up);

      _sse_load(sm->s1);
      _sse_load_up(sm->s2);
      _sse_vector_i_mul();
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_1);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store(rs.s2);

      /******************************* direction +2 *********************************/

      iy=g_idn[ix][2];

      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);

      _sse_load(sp->s0);
      _sse_load_up(sp->s3);
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_2);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_add();
      _sse_store(rs.s3);
      
      um=&g_gauge_field[iy][2];
      _prefetch_su3(um);

      _sse_load(sp->s1);
      _sse_load_up(sp->s2);
      _sse_vector_sub();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_2);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_sub();
      _sse_store(rs.s2);      

      /******************************* direction -2 *********************************/

      iy=g_iup[ix][3];

      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s3);
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_2);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_sub();
      _sse_store(rs.s3);
      
      up+=1;
      _prefetch_su3(up);

      _sse_load(sm->s1);
      _sse_load_up(sm->s2);
      _sse_vector_add();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_2);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_add();
      _sse_store(rs.s2);      
      
      /******************************* direction +3 *********************************/

      iy=g_idn[ix][3];

      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);

      _sse_load(sp->s0);
      _sse_load_up(sp->s2);
      _sse_vector_i_mul();
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_3);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store(rs.s2);
      
      um=&g_gauge_field[iy][3];
      _prefetch_su3(um);

      _sse_load(sp->s1);
      _sse_load_up(sp->s3);
      _sse_vector_i_mul();
      _sse_vector_sub();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_3);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store(rs.s3);
      
      /******************************* direction -3 *********************************/

      iz=(ix+1+VOLUME)%VOLUME;

      iy=g_iup[iz][0];
      
      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s2);
      _sse_vector_i_mul();
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_3);
      rn = (spinor *) P + ix;
      
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store_nt(rn->s0);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store_nt(rn->s2);

      up=&g_gauge_field[iz][0];
      _prefetch_su3(up);

      _sse_load(sm->s1);
      _sse_load_up(sm->s3);
      _sse_vector_i_mul();
      _sse_vector_add();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_3);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store_nt(rn->s1);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store_nt(rn->s3);
      
      /******************************** end of loop *********************************/

    }
#ifdef TM_USE_OMP
  } /* OpenMP closing brace */
#endif
}
Example #3
0
void Hopping_Matrix(const int ieo, spinor * const l, spinor * const k){
  int ix, i;
  su3 * restrict U ALIGN;
  static spinor rs;
  spinor * restrict s ALIGN;
  halfspinor ** phi ALIGN;
#if defined OPTERON
  const int predist=2;
#else
  const int predist=1;
#endif
#ifdef _KOJAK_INST
#pragma pomp inst begin(hoppingmatrix)
#endif

#ifdef _GAUGE_COPY
  if(g_update_gauge_copy) {
    update_backward_gauge();
  }
#endif
  /* We will run through the source vector now */
  /* instead of the solution vector            */
  s = k;
  _prefetch_spinor(s);

  if(ieo == 0) {
    U = g_gauge_field_copy[0][0];
  }
  else {
    U = g_gauge_field_copy[1][0];
  }
  phi = NBPointer[ieo];

  _prefetch_su3(U);
  /**************** loop over all lattice sites ******************/
  ix=0;
  for(i = 0; i < (VOLUME)/2; i++){

    /*********************** direction +0 ************************/
    _prefetch_su3(U+predist);

    _sse_load((*s).s0);
    _sse_load_up((*s).s2);
    _sse_vector_add();

    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka0);
    _sse_store_nt_up((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s3);
    _sse_vector_add();
      
    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka0);
    _sse_store_nt_up((*phi[ix]).s1);
    U++;
    ix++;
    /*********************** direction -0 ************************/
    _sse_load((*s).s0);
    _sse_load_up((*s).s2);
    _sse_vector_sub();
    _sse_store_nt((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s3);
    _sse_vector_sub();
    _sse_store_nt((*phi[ix]).s1);
    ix++;

    /*********************** direction +1 ************************/
    _prefetch_su3(U+predist);

    _sse_load((*s).s0);
    /*next not needed?*/
    _sse_load_up((*s).s3);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka1);
    _sse_store_nt_up((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s2);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka1);
    _sse_store_nt_up((*phi[ix]).s1);
    ix++;
    U++;

    /*********************** direction -1 ************************/
    _sse_load((*s).s0);
    _sse_load_up((*s).s3);
    _sse_vector_i_mul();
    _sse_vector_sub();
    _sse_store_nt((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s2);
    _sse_vector_i_mul();
    _sse_vector_sub();
    _sse_store_nt((*phi[ix]).s1);
    ix++;

    /*********************** direction +2 ************************/
    _prefetch_su3(U+predist);

    _sse_load((*s).s0);
    _sse_load_up((*s).s3);
    _sse_vector_add();

    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka2);
    _sse_store_nt_up((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s2);
    _sse_vector_sub();

    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka2);
    _sse_store_nt_up((*phi[ix]).s1);
    ix++;
    U++;
    /*********************** direction -2 ************************/
    _sse_load((*s).s0);
    _sse_load_up((*s).s3);
    _sse_vector_sub();
    _sse_store_nt((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s2);
    _sse_vector_add();
    _sse_store_nt((*phi[ix]).s1);
    ix++;

    /*********************** direction +3 ************************/
    _prefetch_su3(U+predist);
    _prefetch_spinor(s+1);

    _sse_load((*s).s0);
    _sse_load_up((*s).s2);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka3);
    _sse_store_nt_up((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s3);
    _sse_vector_i_mul();
    _sse_vector_sub();

    _sse_su3_multiply((*U));
    _sse_vector_cmplx_mul(ka3);
    _sse_store_nt_up((*phi[ix]).s1);
    ix++;
    U++;

    /*********************** direction -3 ************************/
    _sse_load((*s).s0);
    _sse_load_up((*s).s2);
    _sse_vector_i_mul();
    _sse_vector_sub();
    _sse_store_nt((*phi[ix]).s0);

    _sse_load((*s).s1);
    _sse_load_up((*s).s3);
    _sse_vector_i_mul();
    _sse_vector_add();
    _sse_store_nt((*phi[ix]).s1);
    ix++;
    s++;
  }

#    if (defined MPI && !defined _NO_COMM)
  xchange_halffield(); 
#    endif
  s = l;
  phi = NBPointer[2 + ieo];
  if(ieo == 0) {
    U = g_gauge_field_copy[1][0];
  }
  else {
    U = g_gauge_field_copy[0][0];
  }
  _prefetch_su3(U);
  
  /* Now we sum up and expand to a full spinor */
  ix = 0;
  for(i = 0; i < (VOLUME)/2; i++){
    /*********************** direction +0 ************************/
    _vector_assign(rs.s0, (*phi[ix]).s0);
    _vector_assign(rs.s2, (*phi[ix]).s0);
    _vector_assign(rs.s1, (*phi[ix]).s1);
    _vector_assign(rs.s3, (*phi[ix]).s1);
    ix++;

    /*********************** direction -0 ************************/
    _prefetch_su3(U+predist);
      
    _sse_load((*phi[ix]).s0);
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka0);
    _sse_load(rs.s0);
    _sse_vector_add();
    _sse_store(rs.s0);

    _sse_load(rs.s2);
    _sse_vector_sub();
    _sse_store(rs.s2);

    _sse_load((*phi[ix]).s1);
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka0);

    _sse_load(rs.s1);
    _sse_vector_add();
    _sse_store(rs.s1);

    _sse_load(rs.s3);
    _sse_vector_sub();
    _sse_store(rs.s3);

    ix++;
    U++;
    /*********************** direction +1 ************************/
    _sse_load_up((*phi[ix]).s0);
    _sse_load(rs.s0);
    _sse_vector_add();
    _sse_store(rs.s0);

    _sse_load(rs.s3);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rs.s3); 

    _sse_load_up((*phi[ix]).s1);
    _sse_load(rs.s1);
    _sse_vector_add();
    _sse_store(rs.s1);

    _sse_load(rs.s2);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rs.s2);       
    ix++;

    /*********************** direction -1 ************************/

    _prefetch_su3(U+predist);

    _sse_load((*phi[ix]).s0);
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka1);

    _sse_load(rs.s0);
    _sse_vector_add();
    _sse_store(rs.s0);

    _sse_load(rs.s3);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rs.s3);

    _sse_load((*phi[ix]).s1);
      
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka1);

    _sse_load(rs.s1);
    _sse_vector_add();
    _sse_store(rs.s1);

    _sse_load(rs.s2);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rs.s2);
    ix++;
    U++;

    /*********************** direction +2 ************************/
    _sse_load_up((*phi[ix]).s0);
    _sse_load(rs.s0);
    _sse_vector_add();
    _sse_store(rs.s0);

    _sse_load(rs.s3);
    _sse_vector_add();
    _sse_store(rs.s3);

    _sse_load_up((*phi[ix]).s1);
    _sse_load(rs.s1);
    _sse_vector_add();
    _sse_store(rs.s1);

    _sse_load(rs.s2);
    _sse_vector_sub();
    _sse_store(rs.s2);      
    ix++;

    /*********************** direction -2 ************************/

    _prefetch_su3(U+predist);

    _sse_load((*phi[ix]).s0);
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka2);

    _sse_load(rs.s0);
    _sse_vector_add();
    _sse_store(rs.s0);

    _sse_load(rs.s3);
    _sse_vector_sub();
    _sse_store(rs.s3);

    _sse_load((*phi[ix]).s1);
      
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka2);

    _sse_load(rs.s1);
    _sse_vector_add();
    _sse_store(rs.s1);

    _sse_load(rs.s2);
    _sse_vector_add();
    _sse_store(rs.s2);      
    ix++;
    U++;
    /*********************** direction +3 ************************/
    _sse_load_up((*phi[ix]).s0);

    _sse_load(rs.s0);
    _sse_vector_add();
    _sse_store(rs.s0);

    _sse_load(rs.s2);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rs.s2);

    _sse_load_up((*phi[ix]).s1);

    _sse_load(rs.s1);
    _sse_vector_add();
    _sse_store(rs.s1);

    _sse_load(rs.s3);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rs.s3);

    ix++;
    /*********************** direction -3 ************************/

    _prefetch_su3(U+predist); 
    _prefetch_spinor(s+1);

    _sse_load((*phi[ix]).s0);
      
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka3);

    _sse_load(rs.s0);
    _sse_vector_add();
    _sse_store_nt((*s).s0);

    _sse_load(rs.s2);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store_nt((*s).s2);

    _sse_load((*phi[ix]).s1);
      
    _sse_su3_inverse_multiply((*U));
    _sse_vector_cmplxcg_mul(ka3);

    _sse_load(rs.s1);
    _sse_vector_add();
    _sse_store_nt((*s).s1);

    _sse_load(rs.s3);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store_nt((*s).s3);
    ix++;
    U++;
    s++;
  }
#ifdef _KOJAK_INST
#pragma pomp inst end(hoppingmatrix)
#endif
}