/* 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 }
/* 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 */ }