示例#1
0
文件: D_psi.c 项目: Finkenrath/tmLQCD
/* 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
}
示例#2
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
}