mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Added overlap comms compute mode
This commit is contained in:
		@@ -110,10 +110,10 @@ namespace Grid {
 | 
			
		||||
    // Single flavour four spinors with colour index
 | 
			
		||||
    ///////
 | 
			
		||||
    template<class S,int Nrepresentation=Nc>
 | 
			
		||||
    class WilsonImpl :  public PeriodicGaugeImpl<S,Nrepresentation> { 
 | 
			
		||||
    class WilsonImpl :  public PeriodicGaugeImpl< GaugeImplTypes< S,Nrepresentation> > { 
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
      typedef PeriodicGaugeImpl<S,Nrepresentation> Gimpl;
 | 
			
		||||
      typedef PeriodicGaugeImpl< GaugeImplTypes< S,Nrepresentation> > Gimpl;
 | 
			
		||||
 | 
			
		||||
      INHERIT_GIMPL_TYPES(Gimpl);
 | 
			
		||||
 | 
			
		||||
@@ -182,10 +182,10 @@ PARALLEL_FOR_LOOP
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
    template<class S,int Nrepresentation>
 | 
			
		||||
    class GparityWilsonImpl : public ConjugateGaugeImpl<S,Nrepresentation> { 
 | 
			
		||||
    class GparityWilsonImpl : public ConjugateGaugeImpl< GaugeImplTypes<S,Nrepresentation> >{ 
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
      typedef ConjugateGaugeImpl<S,Nrepresentation> Gimpl;
 | 
			
		||||
      typedef ConjugateGaugeImpl< GaugeImplTypes<S,Nrepresentation> > Gimpl;
 | 
			
		||||
 | 
			
		||||
      INHERIT_GIMPL_TYPES(Gimpl);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -227,7 +227,7 @@ PARALLEL_FOR_LOOP
 | 
			
		||||
    
 | 
			
		||||
    out.checkerboard = in.checkerboard;
 | 
			
		||||
    
 | 
			
		||||
    DhopInternal(Stencil,Umu,in,out,dag);
 | 
			
		||||
    DhopInternalCommsCompute(Stencil,Umu,in,out,dag);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  template<class Impl>
 | 
			
		||||
@@ -238,7 +238,7 @@ PARALLEL_FOR_LOOP
 | 
			
		||||
    assert(in.checkerboard==Even);
 | 
			
		||||
    out.checkerboard = Odd;
 | 
			
		||||
    
 | 
			
		||||
    DhopInternal(StencilEven,UmuOdd,in,out,dag);
 | 
			
		||||
    DhopInternalCommsCompute(StencilEven,UmuOdd,in,out,dag);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  template<class Impl>
 | 
			
		||||
@@ -249,7 +249,7 @@ PARALLEL_FOR_LOOP
 | 
			
		||||
    assert(in.checkerboard==Odd);
 | 
			
		||||
    out.checkerboard = Even;
 | 
			
		||||
    
 | 
			
		||||
    DhopInternal(StencilOdd,UmuEven,in,out,dag);
 | 
			
		||||
    DhopInternalCommsCompute(StencilOdd,UmuEven,in,out,dag);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  template<class Impl>
 | 
			
		||||
@@ -319,6 +319,78 @@ PARALLEL_FOR_LOOP
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  template<class Impl>
 | 
			
		||||
  void WilsonFermion<Impl>::DhopInternalCommsCompute(StencilImpl & st,DoubledGaugeField & U,
 | 
			
		||||
						     const FermionField &in, FermionField &out,int dag) {
 | 
			
		||||
 | 
			
		||||
    assert((dag==DaggerNo) ||(dag==DaggerYes));
 | 
			
		||||
 | 
			
		||||
    Compressor compressor(dag);
 | 
			
		||||
 | 
			
		||||
    std::thread comms_thread = st.HaloExchangeBegin(in,comm_buf,compressor);
 | 
			
		||||
    comms_thread.join();
 | 
			
		||||
 | 
			
		||||
    bool local    = true;
 | 
			
		||||
    bool nonlocal = false;
 | 
			
		||||
    if ( dag == DaggerYes ) {
 | 
			
		||||
      if( HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptHandDhopSiteDag(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptDhopSiteDag(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      if( HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptHandDhopSite(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptDhopSite(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    local    = false;
 | 
			
		||||
    nonlocal = true;
 | 
			
		||||
    if ( dag == DaggerYes ) {
 | 
			
		||||
      if( HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptHandDhopSiteDag(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptDhopSiteDag(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      if( HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptHandDhopSite(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
        for(int sss=0;sss<in._grid->oSites();sss++){
 | 
			
		||||
	  Kernels::DiracOptDhopSite(st,U,comm_buf,sss,sss,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
  FermOpTemplateInstantiate(WilsonFermion);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -114,6 +114,9 @@ namespace Grid {
 | 
			
		||||
      void DhopInternal(StencilImpl & st,DoubledGaugeField & U,
 | 
			
		||||
			const FermionField &in, FermionField &out,int dag) ;
 | 
			
		||||
 | 
			
		||||
      void DhopInternalCommsCompute(StencilImpl & st,DoubledGaugeField & U,
 | 
			
		||||
				    const FermionField &in, FermionField &out,int dag) ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      // Constructor
 | 
			
		||||
      WilsonFermion(GaugeField &_Umu,
 | 
			
		||||
 
 | 
			
		||||
@@ -396,6 +396,137 @@ PARALLEL_FOR_LOOP
 | 
			
		||||
  }
 | 
			
		||||
  dslashtime +=usecond();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::DhopInternalCommsCompute(StencilImpl & st, LebesgueOrder &lo,
 | 
			
		||||
						     DoubledGaugeField & U,
 | 
			
		||||
						     const FermionField &in, FermionField &out,int dag)
 | 
			
		||||
{
 | 
			
		||||
  //  assert((dag==DaggerNo) ||(dag==DaggerYes));
 | 
			
		||||
 | 
			
		||||
  Compressor compressor(dag);
 | 
			
		||||
 | 
			
		||||
  // Assume balanced KMP_AFFINITY; this is forced in GridThread.h
 | 
			
		||||
 | 
			
		||||
  int threads = GridThread::GetThreads();
 | 
			
		||||
  int HT      = GridThread::GetHyperThreads();
 | 
			
		||||
  int cores   = GridThread::GetCores();
 | 
			
		||||
  int nwork = U._grid->oSites();
 | 
			
		||||
  
 | 
			
		||||
  commtime -=usecond();
 | 
			
		||||
  std::thread thr = st.HaloExchangeBegin(in,comm_buf,compressor);
 | 
			
		||||
  commtime +=usecond();
 | 
			
		||||
  
 | 
			
		||||
  // Dhop takes the 4d grid from U, and makes a 5d index for fermion
 | 
			
		||||
  // Not loop ordering and data layout.
 | 
			
		||||
  // Designed to create 
 | 
			
		||||
  // - per thread reuse in L1 cache for U
 | 
			
		||||
  // - 8 linear access unit stride streams per thread for Fermion for hw prefetchable.
 | 
			
		||||
  bool local    = true;
 | 
			
		||||
  bool nonlocal = false;
 | 
			
		||||
  dslashtime -=usecond();
 | 
			
		||||
  if ( dag == DaggerYes ) {
 | 
			
		||||
    if( this->HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	int sU=ss;
 | 
			
		||||
	for(int s=0;s<Ls;s++){
 | 
			
		||||
	  int sF = s+Ls*sU;
 | 
			
		||||
	  Kernels::DiracOptHandDhopSiteDag(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	  }
 | 
			
		||||
      }
 | 
			
		||||
    } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	{
 | 
			
		||||
	  int sd;
 | 
			
		||||
	  for(sd=0;sd<Ls;sd++){
 | 
			
		||||
	    int sU=ss;
 | 
			
		||||
	    int sF = sd+Ls*sU;
 | 
			
		||||
	    Kernels::DiracOptDhopSiteDag(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if( this->HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	int sU=ss;
 | 
			
		||||
	for(int s=0;s<Ls;s++){
 | 
			
		||||
	  int sF = s+Ls*sU;
 | 
			
		||||
	  Kernels::DiracOptHandDhopSite(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	int sU=ss;
 | 
			
		||||
	for(int s=0;s<Ls;s++){
 | 
			
		||||
	  int sF = s+Ls*sU; 
 | 
			
		||||
	  Kernels::DiracOptDhopSite(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  dslashtime +=usecond();
 | 
			
		||||
 | 
			
		||||
  commtime -=usecond();
 | 
			
		||||
  thr.join();
 | 
			
		||||
  commtime +=usecond();
 | 
			
		||||
 | 
			
		||||
  local    = false;
 | 
			
		||||
  nonlocal = true;
 | 
			
		||||
  dslashtime -=usecond();
 | 
			
		||||
  if ( dag == DaggerYes ) {
 | 
			
		||||
    if( this->HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	int sU=ss;
 | 
			
		||||
	for(int s=0;s<Ls;s++){
 | 
			
		||||
	  int sF = s+Ls*sU;
 | 
			
		||||
	  Kernels::DiracOptHandDhopSiteDag(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	  }
 | 
			
		||||
      }
 | 
			
		||||
    } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	{
 | 
			
		||||
	  int sd;
 | 
			
		||||
	  for(sd=0;sd<Ls;sd++){
 | 
			
		||||
	    int sU=ss;
 | 
			
		||||
	    int sF = sd+Ls*sU;
 | 
			
		||||
	    Kernels::DiracOptDhopSiteDag(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if( this->HandOptDslash ) {
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	int sU=ss;
 | 
			
		||||
	for(int s=0;s<Ls;s++){
 | 
			
		||||
	  int sF = s+Ls*sU;
 | 
			
		||||
	  Kernels::DiracOptHandDhopSite(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    } else { 
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
      for(int ss=0;ss<U._grid->oSites();ss++){
 | 
			
		||||
	int sU=ss;
 | 
			
		||||
	for(int s=0;s<Ls;s++){
 | 
			
		||||
	  int sF = s+Ls*sU; 
 | 
			
		||||
	  Kernels::DiracOptDhopSite(st,U,comm_buf,sF,sU,in,out,local,nonlocal);
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  dslashtime +=usecond();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::DhopOE(const FermionField &in, FermionField &out,int dag)
 | 
			
		||||
{
 | 
			
		||||
@@ -405,7 +536,7 @@ void WilsonFermion5D<Impl>::DhopOE(const FermionField &in, FermionField &out,int
 | 
			
		||||
  assert(in.checkerboard==Even);
 | 
			
		||||
  out.checkerboard = Odd;
 | 
			
		||||
 | 
			
		||||
  DhopInternal(StencilEven,LebesgueEvenOdd,UmuOdd,in,out,dag);
 | 
			
		||||
  DhopInternalCommsCompute(StencilEven,LebesgueEvenOdd,UmuOdd,in,out,dag);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::DhopEO(const FermionField &in, FermionField &out,int dag)
 | 
			
		||||
@@ -416,7 +547,7 @@ void WilsonFermion5D<Impl>::DhopEO(const FermionField &in, FermionField &out,int
 | 
			
		||||
  assert(in.checkerboard==Odd);
 | 
			
		||||
  out.checkerboard = Even;
 | 
			
		||||
 | 
			
		||||
  DhopInternal(StencilOdd,LebesgueEvenOdd,UmuEven,in,out,dag);
 | 
			
		||||
  DhopInternalCommsCompute(StencilOdd,LebesgueEvenOdd,UmuEven,in,out,dag);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::Dhop(const FermionField &in, FermionField &out,int dag)
 | 
			
		||||
@@ -426,7 +557,7 @@ void WilsonFermion5D<Impl>::Dhop(const FermionField &in, FermionField &out,int d
 | 
			
		||||
 | 
			
		||||
  out.checkerboard = in.checkerboard;
 | 
			
		||||
 | 
			
		||||
  DhopInternal(Stencil,Lebesgue,Umu,in,out,dag);
 | 
			
		||||
  DhopInternalCommsCompute(Stencil,Lebesgue,Umu,in,out,dag);
 | 
			
		||||
}
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonFermion5D<Impl>::DW(const FermionField &in, FermionField &out,int dag)
 | 
			
		||||
 
 | 
			
		||||
@@ -117,6 +117,13 @@ namespace Grid {
 | 
			
		||||
			FermionField &out,
 | 
			
		||||
			int dag);
 | 
			
		||||
 | 
			
		||||
      void DhopInternalCommsCompute(StencilImpl & st,
 | 
			
		||||
			LebesgueOrder &lo,
 | 
			
		||||
			DoubledGaugeField &U,
 | 
			
		||||
			const FermionField &in, 
 | 
			
		||||
			FermionField &out,
 | 
			
		||||
			int dag);
 | 
			
		||||
 | 
			
		||||
      // Constructors
 | 
			
		||||
      WilsonFermion5D(GaugeField &_Umu,
 | 
			
		||||
		      GridCartesian         &FiveDimGrid,
 | 
			
		||||
 
 | 
			
		||||
@@ -34,10 +34,11 @@ namespace QCD {
 | 
			
		||||
template<class Impl> 
 | 
			
		||||
WilsonKernels<Impl>::WilsonKernels(const ImplParams &p): Base(p) {};
 | 
			
		||||
 | 
			
		||||
  // Need controls to do interior, exterior, or both
 | 
			
		||||
template<class Impl> 
 | 
			
		||||
void WilsonKernels<Impl>::DiracOptDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					   int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
					   int sF,int sU,const FermionField &in, FermionField &out,bool local, bool nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  SiteHalfSpinor  tmp;    
 | 
			
		||||
  SiteHalfSpinor  chi;    
 | 
			
		||||
@@ -46,231 +47,425 @@ void WilsonKernels<Impl>::DiracOptDhopSiteDag(StencilImpl &st,DoubledGaugeField
 | 
			
		||||
  StencilEntry *SE;
 | 
			
		||||
  int ptype;
 | 
			
		||||
 | 
			
		||||
  int num = 0;
 | 
			
		||||
 | 
			
		||||
  result=zero;
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Xp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Xp,sF);
 | 
			
		||||
  if ( SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjXp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjXp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Xp,SE,st);
 | 
			
		||||
  spReconXp(result,Uchi);
 | 
			
		||||
    
 | 
			
		||||
  // Yp
 | 
			
		||||
  SE=st.GetEntry(ptype,Yp,sF);
 | 
			
		||||
  if ( SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjYp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjYp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Yp,SE,st);
 | 
			
		||||
  accumReconYp(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  // Zp
 | 
			
		||||
  SE=st.GetEntry(ptype,Zp,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjZp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjZp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  if (local && SE->_is_local ) { 
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjXp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjXp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Zp,SE,st);
 | 
			
		||||
  accumReconZp(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  // Tp
 | 
			
		||||
  SE=st.GetEntry(ptype,Tp,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjTp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjTp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Tp,SE,st);
 | 
			
		||||
  accumReconTp(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  // Xm
 | 
			
		||||
  SE=st.GetEntry(ptype,Xm,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjXm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjXm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Xm,SE,st);
 | 
			
		||||
  accumReconXm(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  // Ym
 | 
			
		||||
  SE=st.GetEntry(ptype,Ym,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjYm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjYm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Ym,SE,st);
 | 
			
		||||
  accumReconYm(result,Uchi);
 | 
			
		||||
  
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Xp,SE,st);
 | 
			
		||||
    accumReconXp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
    
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Yp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Yp,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) { 
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjYp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjYp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Yp,SE,st);
 | 
			
		||||
    accumReconYp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Zp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Zp,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) { 
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjZp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjZp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Zp,SE,st);
 | 
			
		||||
    accumReconZp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Tp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Tp,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjTp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjTp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Tp,SE,st);
 | 
			
		||||
    accumReconTp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Xm
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Xm,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjXm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjXm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Xm,SE,st);
 | 
			
		||||
    accumReconXm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Ym
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Ym,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjYm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjYm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Ym,SE,st);
 | 
			
		||||
    accumReconYm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Zm
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Zm,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjZm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjZm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjZm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjZm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Zm,SE,st);
 | 
			
		||||
  accumReconZm(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Zm,SE,st);
 | 
			
		||||
    accumReconZm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Tm
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Tm,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjTm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjTm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjTm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else { 
 | 
			
		||||
      spProjTm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Tm,SE,st);
 | 
			
		||||
  accumReconTm(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  vstream(out._odata[sF],result*(-0.5));
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Tm,SE,st);
 | 
			
		||||
    accumReconTm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( local ) {
 | 
			
		||||
    vstream(out._odata[sF],result*(-0.5));
 | 
			
		||||
  } else if ( num ) { 
 | 
			
		||||
    vstream(out._odata[sF],out._odata[sF]+result*(-0.5));
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Need controls to do interior, exterior, or both
 | 
			
		||||
template<class Impl> 
 | 
			
		||||
void WilsonKernels<Impl>::DiracOptDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					      int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
					   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					   int sF,int sU,const FermionField &in, FermionField &out,bool local, bool nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  SiteHalfSpinor  tmp;    
 | 
			
		||||
  SiteHalfSpinor  chi;    
 | 
			
		||||
  SiteSpinor result;
 | 
			
		||||
  SiteHalfSpinor Uchi;
 | 
			
		||||
  SiteSpinor result;
 | 
			
		||||
  StencilEntry *SE;
 | 
			
		||||
  int ptype;
 | 
			
		||||
 | 
			
		||||
  int num = 0;
 | 
			
		||||
 | 
			
		||||
  result=zero;
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Xp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Xm,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjXp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjXp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Xm,SE,st);
 | 
			
		||||
  spReconXp(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  // Yp
 | 
			
		||||
  SE=st.GetEntry(ptype,Ym,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjYp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjYp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  if (local && SE->_is_local ) { 
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjXp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjXp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Ym,SE,st);
 | 
			
		||||
  accumReconYp(result,Uchi);
 | 
			
		||||
  
 | 
			
		||||
  // Zp
 | 
			
		||||
  SE=st.GetEntry(ptype,Zm,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjZp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjZp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Zm,SE,st);
 | 
			
		||||
  accumReconZp(result,Uchi);
 | 
			
		||||
  
 | 
			
		||||
  // Tp
 | 
			
		||||
  SE=st.GetEntry(ptype,Tm,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjTp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjTp(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Tm,SE,st);
 | 
			
		||||
  accumReconTp(result,Uchi);
 | 
			
		||||
  
 | 
			
		||||
  // Xm
 | 
			
		||||
  SE=st.GetEntry(ptype,Xp,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjXm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjXm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Xp,SE,st);
 | 
			
		||||
  accumReconXm(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  // Ym
 | 
			
		||||
  SE=st.GetEntry(ptype,Yp,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjYm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjYm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Yp,SE,st);
 | 
			
		||||
  accumReconYm(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  // Zm
 | 
			
		||||
  SE=st.GetEntry(ptype,Zp,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjZm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjZm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Xm,SE,st);
 | 
			
		||||
    accumReconXp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Zp,SE,st);
 | 
			
		||||
  accumReconZm(result,Uchi);
 | 
			
		||||
    
 | 
			
		||||
  // Tm
 | 
			
		||||
  SE=st.GetEntry(ptype,Tp,sF);
 | 
			
		||||
  if (  SE->_is_local && SE->_permute ) {
 | 
			
		||||
    spProjTm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
    permute(chi,tmp,ptype);
 | 
			
		||||
  } else if ( SE->_is_local ) {
 | 
			
		||||
    spProjTm(chi,in._odata[SE->_offset]);
 | 
			
		||||
  } else { 
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Yp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Ym,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) { 
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjYp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjYp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
  Impl::multLink(Uchi,U._odata[sU],chi,Tp,SE,st);
 | 
			
		||||
  accumReconTm(result,Uchi);
 | 
			
		||||
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Ym,SE,st);
 | 
			
		||||
    accumReconYp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Zp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Zm,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) { 
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjZp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjZp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) { 
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Zm,SE,st);
 | 
			
		||||
    accumReconZp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Tp
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Tm,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjTp(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjTp(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Tm,SE,st);
 | 
			
		||||
    accumReconTp(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Xm
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Xp,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjXm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjXm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Xp,SE,st);
 | 
			
		||||
    accumReconXm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Ym
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Yp,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjYm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjYm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Yp,SE,st);
 | 
			
		||||
    accumReconYm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  vstream(out._odata[sF],result*(-0.5));
 | 
			
		||||
}
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Zm
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Zp,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjZm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else {
 | 
			
		||||
      spProjZm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Zp,SE,st);
 | 
			
		||||
    accumReconZm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  // Tm
 | 
			
		||||
  ///////////////////////////
 | 
			
		||||
  SE=st.GetEntry(ptype,Tp,sF);
 | 
			
		||||
 | 
			
		||||
  if (local && SE->_is_local ) {
 | 
			
		||||
    if ( SE->_permute ) {
 | 
			
		||||
      spProjTm(tmp,in._odata[SE->_offset]);
 | 
			
		||||
      permute(chi,tmp,ptype);
 | 
			
		||||
    } else { 
 | 
			
		||||
      spProjTm(chi,in._odata[SE->_offset]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( nonlocal && (!SE->_is_local) ) {
 | 
			
		||||
    chi=buf[SE->_offset];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if( (local && SE->_is_local) || ( nonlocal && (!SE->_is_local)) ) {
 | 
			
		||||
    Impl::multLink(Uchi,U._odata[sU],chi,Tp,SE,st);
 | 
			
		||||
    accumReconTm(result,Uchi);
 | 
			
		||||
    num++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( local ) {
 | 
			
		||||
    vstream(out._odata[sF],result*(-0.5));
 | 
			
		||||
  } else if ( num ) { 
 | 
			
		||||
    vstream(out._odata[sF],out._odata[sF]+result*(-0.5));
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class Impl> 
 | 
			
		||||
void WilsonKernels<Impl>::DiracOptDhopDir(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
@@ -405,7 +600,7 @@ void WilsonKernels<Impl>::DiracOptDhopDir(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
template<class Impl> 
 | 
			
		||||
void WilsonKernels<Impl>::DiracOptAsmDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					      int sF,int sU,const FermionField &in, FermionField &out,uint64_t *p)
 | 
			
		||||
					      int sF,int sU,const FermionField &in, FermionField &out,bool local, bool nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSite(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -48,11 +48,11 @@ namespace Grid {
 | 
			
		||||
    public:
 | 
			
		||||
     void DiracOptDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			   int sF,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
			   int sF,int sU,const FermionField &in, FermionField &out,bool local= true, bool nonlocal=true);
 | 
			
		||||
      
 | 
			
		||||
     void DiracOptDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			      int sF,int sU,const FermionField &in,FermionField &out);
 | 
			
		||||
			      int sF,int sU,const FermionField &in,FermionField &out,bool local= true, bool nonlocal=true);
 | 
			
		||||
 | 
			
		||||
     void DiracOptDhopDir(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
@@ -60,15 +60,15 @@ namespace Grid {
 | 
			
		||||
 | 
			
		||||
     void DiracOptAsmDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			      int sF,int sU,const FermionField &in, FermionField &out,uint64_t *);
 | 
			
		||||
			      int sF,int sU,const FermionField &in, FermionField &out,bool local= true, bool nonlocal=true);
 | 
			
		||||
 | 
			
		||||
     void DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			       int sF,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
			       int sF,int sU,const FermionField &in, FermionField &out,bool local= true, bool nonlocal=true);
 | 
			
		||||
 | 
			
		||||
     void DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
				  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
				  int sF,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
				  int sF,int sU,const FermionField &in, FermionField &out,bool local= true, bool nonlocal=true);
 | 
			
		||||
 | 
			
		||||
     WilsonKernels(const ImplParams &p= ImplParams());
 | 
			
		||||
     
 | 
			
		||||
 
 | 
			
		||||
@@ -311,8 +311,8 @@ namespace QCD {
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonKernels<Impl >::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					       int ss,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
						   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
						   int ss,int sU,const FermionField &in, FermionField &out, bool Local, bool Nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  //  std::cout << "Hand op Dhop "<<std::endl;
 | 
			
		||||
  typedef typename Simd::scalar_type S;
 | 
			
		||||
@@ -555,8 +555,8 @@ void WilsonKernels<Impl >::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeF
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonKernels<Impl >::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
						   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
						   int ss,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
						std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
						int ss,int sU,const FermionField &in, FermionField &out, bool Local, bool Nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  typedef typename Simd::scalar_type S;
 | 
			
		||||
  typedef typename Simd::vector_type V;
 | 
			
		||||
@@ -801,32 +801,32 @@ void WilsonKernels<Impl >::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeFiel
 | 
			
		||||
  ////////////////////////////////////////////////
 | 
			
		||||
template<>
 | 
			
		||||
void WilsonKernels<GparityWilsonImplF>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					       int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
							     std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							     int sF,int sU,const FermionField &in, FermionField &out, bool Local, bool Nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSite(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<>
 | 
			
		||||
void WilsonKernels<GparityWilsonImplF>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
						   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
						   int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
								std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
								int sF,int sU,const FermionField &in, FermionField &out, bool Local, bool Nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSiteDag(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<>
 | 
			
		||||
void WilsonKernels<GparityWilsonImplD>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					       int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
							     std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							     int sF,int sU,const FermionField &in, FermionField &out, bool Local, bool Nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSite(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<>
 | 
			
		||||
void WilsonKernels<GparityWilsonImplD>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
						   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
						   int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
								std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
								int sF,int sU,const FermionField &in, FermionField &out, bool Local, bool Nonlocal)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSiteDag(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
@@ -834,30 +834,30 @@ void WilsonKernels<GparityWilsonImplD>::DiracOptHandDhopSiteDag(StencilImpl &st,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template void WilsonKernels<WilsonImplF>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
							       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							       int ss,int sU,const FermionField &in, FermionField &out,bool l,bool n);
 | 
			
		||||
template void WilsonKernels<WilsonImplD>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
							       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							       int ss,int sU,const FermionField &in, FermionField &out, bool l, bool n);
 | 
			
		||||
template void WilsonKernels<WilsonImplF>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
								  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
								  int ss,int sU,const FermionField &in, FermionField &out, bool l, bool n);
 | 
			
		||||
template void WilsonKernels<WilsonImplD>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
								  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
								  int ss,int sU,const FermionField &in, FermionField &out, bool l, bool n);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template void WilsonKernels<GparityWilsonImplF>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
								      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
								      int ss,int sU,const FermionField &in, FermionField &out, bool l, bool nl);
 | 
			
		||||
template void WilsonKernels<GparityWilsonImplD>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
								      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
								      int ss,int sU,const FermionField &in, FermionField &out, bool l, bool nl);
 | 
			
		||||
template void WilsonKernels<GparityWilsonImplF>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
									 std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
									 int ss,int sU,const FermionField &in, FermionField &out, bool l, bool nl);
 | 
			
		||||
template void WilsonKernels<GparityWilsonImplD>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
									 std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
									 int ss,int sU,const FermionField &in, FermionField &out, bool l, bool nl);
 | 
			
		||||
 | 
			
		||||
}}
 | 
			
		||||
 
 | 
			
		||||
@@ -44,11 +44,10 @@ template<class Gimpl> class WilsonLoops;
 | 
			
		||||
    typedef typename GImpl::GaugeLinkField       GaugeLinkField;\
 | 
			
		||||
    typedef typename GImpl::GaugeField               GaugeField;	
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    // Composition with smeared link, bc's etc.. probably need multiple inheritance
 | 
			
		||||
    // Variable precision "S" and variable Nc
 | 
			
		||||
 | 
			
		||||
    // 
 | 
			
		||||
    template<class S,int Nrepresentation=Nc>
 | 
			
		||||
    class PeriodicGaugeImpl { 
 | 
			
		||||
    class GaugeImplTypes { 
 | 
			
		||||
    public:
 | 
			
		||||
    
 | 
			
		||||
      typedef S Simd;
 | 
			
		||||
@@ -61,7 +60,17 @@ template<class Gimpl> class WilsonLoops;
 | 
			
		||||
    
 | 
			
		||||
      typedef Lattice<SiteGaugeLink>                GaugeLinkField; // bit ugly naming; polarised gauge field, lorentz... all ugly
 | 
			
		||||
      typedef Lattice<SiteGaugeField>                   GaugeField;
 | 
			
		||||
     
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Composition with smeared link, bc's etc.. probably need multiple inheritance
 | 
			
		||||
    // Variable precision "S" and variable Nc
 | 
			
		||||
    template<class GimplTypes>
 | 
			
		||||
    class PeriodicGaugeImpl : public GimplTypes  { 
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
    INHERIT_GIMPL_TYPES(GimplTypes);
 | 
			
		||||
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    // Support needed for the assembly of loops including all boundary condition effects such as conjugate bcs
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -92,38 +101,28 @@ template<class Gimpl> class WilsonLoops;
 | 
			
		||||
	return true;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    // Composition with smeared link, bc's etc.. probably need multiple inheritance
 | 
			
		||||
    // Variable precision "S" and variable Nc
 | 
			
		||||
    template<class S,int Nrepresentation=Nc>
 | 
			
		||||
    class ConjugateGaugeImpl { 
 | 
			
		||||
    template<class GimplTypes>
 | 
			
		||||
    class ConjugateGaugeImpl : public GimplTypes { 
 | 
			
		||||
    public:
 | 
			
		||||
    
 | 
			
		||||
      typedef S Simd;
 | 
			
		||||
    
 | 
			
		||||
      template<typename vtype> using iImplGaugeLink          = iScalar<iScalar<iMatrix<vtype, Nrepresentation> > >;
 | 
			
		||||
      template<typename vtype> using iImplGaugeField         = iVector<iScalar<iMatrix<vtype, Nrepresentation> >, Nd  >;
 | 
			
		||||
    
 | 
			
		||||
      typedef iImplGaugeLink    <Simd>           SiteGaugeLink;
 | 
			
		||||
      typedef iImplGaugeField   <Simd>           SiteGaugeField;
 | 
			
		||||
    
 | 
			
		||||
      typedef Lattice<SiteGaugeLink>                GaugeLinkField; // bit ugly naming; polarised gauge field, lorentz... all ugly
 | 
			
		||||
      typedef Lattice<SiteGaugeField>                   GaugeField;
 | 
			
		||||
 | 
			
		||||
      INHERIT_GIMPL_TYPES(GimplTypes);
 | 
			
		||||
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    // Support needed for the assembly of loops including all boundary condition effects such as Gparity.
 | 
			
		||||
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    template<class covariant>  static
 | 
			
		||||
    Lattice<covariant> CovShiftForward (const GaugeLinkField &Link, int mu, const Lattice<covariant> &field) {
 | 
			
		||||
      return GparityBC::CovShiftForward(Link,mu,field);
 | 
			
		||||
      return ConjugateBC::CovShiftForward(Link,mu,field);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class covariant> static
 | 
			
		||||
    Lattice<covariant> CovShiftBackward(const GaugeLinkField &Link, int mu,const Lattice<covariant> &field) {
 | 
			
		||||
      return GparityBC::CovShiftBackward(Link,mu,field);
 | 
			
		||||
      return ConjugateBC::CovShiftBackward(Link,mu,field);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline
 | 
			
		||||
@@ -162,14 +161,17 @@ template<class Gimpl> class WilsonLoops;
 | 
			
		||||
    
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    typedef GaugeImplTypes<vComplex,Nc>     GimplTypesR;
 | 
			
		||||
    typedef GaugeImplTypes<vComplexF,Nc>    GimplTypesF;
 | 
			
		||||
    typedef GaugeImplTypes<vComplexD,Nc>    GimplTypesD;
 | 
			
		||||
 | 
			
		||||
    typedef PeriodicGaugeImpl<vComplex ,Nc> PeriodicGimplR; // Real.. whichever prec
 | 
			
		||||
    typedef PeriodicGaugeImpl<vComplexF,Nc> PeriodicGimplF; // Float
 | 
			
		||||
    typedef PeriodicGaugeImpl<vComplexD,Nc> PeriodicGimplD; // Double
 | 
			
		||||
    typedef PeriodicGaugeImpl<GimplTypesR> PeriodicGimplR; // Real.. whichever prec
 | 
			
		||||
    typedef PeriodicGaugeImpl<GimplTypesF> PeriodicGimplF; // Float
 | 
			
		||||
    typedef PeriodicGaugeImpl<GimplTypesD> PeriodicGimplD; // Double
 | 
			
		||||
 | 
			
		||||
    typedef ConjugateGaugeImpl<vComplex ,Nc> ConjugateGimplR; // Real.. whichever prec
 | 
			
		||||
    typedef ConjugateGaugeImpl<vComplexF,Nc> ConjugateGimplF; // Float
 | 
			
		||||
    typedef ConjugateGaugeImpl<vComplexD,Nc> ConjugateGimplD; // Double
 | 
			
		||||
    typedef ConjugateGaugeImpl<GimplTypesR> ConjugateGimplR; // Real.. whichever prec
 | 
			
		||||
    typedef ConjugateGaugeImpl<GimplTypesF> ConjugateGimplF; // Float
 | 
			
		||||
    typedef ConjugateGaugeImpl<GimplTypesD> ConjugateGimplD; // Double
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user