mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	Merge branch 'master' of https://github.com/paboyle/Grid into scidac1_2
Conflicts: lib/qcd/action/fermion/WilsonKernels.h tests/Make.inc
This commit is contained in:
		@@ -114,7 +114,7 @@ namespace QCD {
 | 
			
		||||
    // Apply Dw
 | 
			
		||||
    this->DW(psi,Din,DaggerYes); 
 | 
			
		||||
 | 
			
		||||
    Meooe5D(Din,chi);
 | 
			
		||||
    MeooeDag5D(Din,chi);
 | 
			
		||||
 | 
			
		||||
    int Ls=this->Ls;
 | 
			
		||||
    for(int s=0;s<Ls;s++){
 | 
			
		||||
@@ -163,7 +163,6 @@ namespace QCD {
 | 
			
		||||
    FermionField tmp(psi._grid);
 | 
			
		||||
    // Assemble the 5d matrix
 | 
			
		||||
    Meooe5D(psi,tmp); 
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
    std::cout << "Meooe Test replacement norm2 tmp = " <<norm2(tmp)<<std::endl;
 | 
			
		||||
    for(int s=0;s<Ls;s++){
 | 
			
		||||
@@ -202,7 +201,7 @@ namespace QCD {
 | 
			
		||||
      this->DhopOE(psi,tmp,DaggerYes);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Meooe5D(tmp,chi); 
 | 
			
		||||
    MeooeDag5D(tmp,chi); 
 | 
			
		||||
#if 0
 | 
			
		||||
    std::cout << "Meooe Test replacement norm2 chi new = " <<norm2(chi)<<std::endl;
 | 
			
		||||
    // Assemble the 5d matrix
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,12 @@ namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
WilsonKernels<Impl>::WilsonKernels(const ImplParams &p): Base(p) {};
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
  SiteHalfSpinor  tmp;    
 | 
			
		||||
  SiteHalfSpinor  chi;    
 | 
			
		||||
@@ -122,7 +125,7 @@ void WilsonKernels<Impl>::DiracOptDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class Impl> 
 | 
			
		||||
void WilsonKernels<Impl>::DiracOptDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
void WilsonKernels<Impl>::DiracOptDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					      int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
{
 | 
			
		||||
@@ -369,6 +372,16 @@ void WilsonKernels<Impl>::DiracOptDhopDir(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
  vstream(out._odata[sF],result*(-0.5));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if ( ! defined(AVX512) ) && ( ! defined(IMCI) )
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSite(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  FermOpTemplateInstantiate(WilsonKernels);
 | 
			
		||||
  GparityFermOpTemplateInstantiate(WilsonKernels);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,11 +28,11 @@ namespace Grid {
 | 
			
		||||
     void DiracOptDhopDir(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			  int sF,int sU,const FermionField &in, FermionField &out,int dirdisp,int gamma);
 | 
			
		||||
#if defined(AVX512) || defined(IMCI)
 | 
			
		||||
 | 
			
		||||
     void DiracOptAsmDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			      int sF,int sU,const FermionField &in, FermionField &out,uint64_t *);
 | 
			
		||||
#else
 | 
			
		||||
#if 0
 | 
			
		||||
     void DiracOptAsmDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			      std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			      int sF,int sU,const FermionField &in, FermionField &out,uint64_t *p){
 | 
			
		||||
@@ -41,7 +41,7 @@ namespace Grid {
 | 
			
		||||
#endif
 | 
			
		||||
// doesn't seem to work with Gparity at the moment
 | 
			
		||||
#undef HANDOPT
 | 
			
		||||
#ifdef HANDOPT
 | 
			
		||||
//#define HANDOPT
 | 
			
		||||
     void DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			       int sF,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
@@ -49,25 +49,9 @@ namespace Grid {
 | 
			
		||||
     void DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
				  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
				  int sF,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
     void DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
			       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
			       int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
     {
 | 
			
		||||
       DiracOptDhopSite(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
     void DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
				  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
				  int sF,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
     {
 | 
			
		||||
       DiracOptDhopSiteDag(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
     }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
     WilsonKernels(const ImplParams &p= ImplParams()) : Base(p) {};
 | 
			
		||||
 | 
			
		||||
     WilsonKernels(const ImplParams &p= ImplParams());
 | 
			
		||||
     
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -282,7 +282,7 @@ namespace QCD {
 | 
			
		||||
 | 
			
		||||
#ifdef HANDOPT
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonKernels<Impl >::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
void WilsonKernels<Impl >::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
					       std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
					       int ss,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
{
 | 
			
		||||
@@ -526,7 +526,7 @@ void WilsonKernels<Impl >::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeFiel
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class Impl>
 | 
			
		||||
void WilsonKernels<Impl >::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
void WilsonKernels<Impl >::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
						   std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
						   int ss,int sU,const FermionField &in, FermionField &out)
 | 
			
		||||
{
 | 
			
		||||
@@ -767,6 +767,36 @@ void WilsonKernels<Impl >::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeF
 | 
			
		||||
    vstream(ref()(3)(2),result_32*(-0.5));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
  FermOpTemplateInstantiate(WilsonKernels);
 | 
			
		||||
#else 
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSite(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
  DiracOptDhopSiteDag(st,U,buf,sF,sU,in,out); // will template override for Wilson Nc=3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template void WilsonKernels<WilsonImplF>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
template void WilsonKernels<WilsonImplD>::DiracOptHandDhopSite(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
template void WilsonKernels<WilsonImplF>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
template void WilsonKernels<WilsonImplD>::DiracOptHandDhopSiteDag(StencilImpl &st,DoubledGaugeField &U,
 | 
			
		||||
							  std::vector<SiteHalfSpinor,alignedAllocator<SiteHalfSpinor> >  &buf,
 | 
			
		||||
							  int ss,int sU,const FermionField &in, FermionField &out);
 | 
			
		||||
 | 
			
		||||
}}
 | 
			
		||||
 
 | 
			
		||||
@@ -45,13 +45,13 @@ namespace QCD {
 | 
			
		||||
  // To fail is not to err (Cryptic clue: suggest to Google SFINAE ;) )
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjXp (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      hspin(0)=fspin(0)-timesI(fspin(3));
 | 
			
		||||
      hspin(1)=fspin(1)-timesI(fspin(2));
 | 
			
		||||
      hspin(0)=fspin(0)+timesI(fspin(3));
 | 
			
		||||
      hspin(1)=fspin(1)+timesI(fspin(2));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjXm (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      hspin(0)=fspin(0)+timesI(fspin(3));
 | 
			
		||||
      hspin(1)=fspin(1)+timesI(fspin(2));
 | 
			
		||||
      hspin(0)=fspin(0)-timesI(fspin(3));
 | 
			
		||||
      hspin(1)=fspin(1)-timesI(fspin(2));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
      //  0 0  0  -1  [0] -+ [3]
 | 
			
		||||
@@ -60,13 +60,13 @@ namespace QCD {
 | 
			
		||||
      // -1 0  0  0
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjYp (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      hspin(0)=fspin(0)+fspin(3);
 | 
			
		||||
      hspin(1)=fspin(1)-fspin(2);
 | 
			
		||||
      hspin(0)=fspin(0)-fspin(3);
 | 
			
		||||
      hspin(1)=fspin(1)+fspin(2);
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjYm (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      hspin(0)=fspin(0)-fspin(3);
 | 
			
		||||
      hspin(1)=fspin(1)+fspin(2);
 | 
			
		||||
      hspin(0)=fspin(0)+fspin(3);
 | 
			
		||||
      hspin(1)=fspin(1)-fspin(2);
 | 
			
		||||
    }
 | 
			
		||||
	    /*Gz
 | 
			
		||||
	     *  0 0  i  0   [0]+-i[2]
 | 
			
		||||
@@ -76,14 +76,14 @@ namespace QCD {
 | 
			
		||||
	     */
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjZp (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      hspin(0)=fspin(0)-timesI(fspin(2));
 | 
			
		||||
      hspin(1)=fspin(1)+timesI(fspin(3));
 | 
			
		||||
      hspin(0)=fspin(0)+timesI(fspin(2));
 | 
			
		||||
      hspin(1)=fspin(1)-timesI(fspin(3));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjZm (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      hspin(0)=fspin(0)+timesI(fspin(2));
 | 
			
		||||
      hspin(1)=fspin(1)-timesI(fspin(3));
 | 
			
		||||
      hspin(0)=fspin(0)-timesI(fspin(2));
 | 
			
		||||
      hspin(1)=fspin(1)+timesI(fspin(3));
 | 
			
		||||
    }
 | 
			
		||||
	    /*Gt
 | 
			
		||||
	     *  0 0  1  0 [0]+-[2]
 | 
			
		||||
@@ -94,14 +94,14 @@ namespace QCD {
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjTp (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      hspin(0)=fspin(0)-fspin(2);
 | 
			
		||||
      hspin(1)=fspin(1)-fspin(3);
 | 
			
		||||
      hspin(0)=fspin(0)+fspin(2);
 | 
			
		||||
      hspin(1)=fspin(1)+fspin(3);
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spProjTm (iVector<vtype,Nhs> &hspin,const iVector<vtype,Ns> &fspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      hspin(0)=fspin(0)+fspin(2);
 | 
			
		||||
      hspin(1)=fspin(1)+fspin(3);
 | 
			
		||||
      hspin(0)=fspin(0)-fspin(2);
 | 
			
		||||
      hspin(1)=fspin(1)-fspin(3);
 | 
			
		||||
    }
 | 
			
		||||
	    /*G5
 | 
			
		||||
	     *  1 0  0  0 
 | 
			
		||||
@@ -157,32 +157,32 @@ namespace QCD {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)=timesI(hspin(1));
 | 
			
		||||
      fspin(3)=timesI(hspin(0));
 | 
			
		||||
      fspin(2)=timesMinusI(hspin(1));
 | 
			
		||||
      fspin(3)=timesMinusI(hspin(0));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spReconXm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)=timesMinusI(hspin(1));
 | 
			
		||||
      fspin(3)=timesMinusI(hspin(0));
 | 
			
		||||
      fspin(2)=timesI(hspin(1));
 | 
			
		||||
      fspin(3)=timesI(hspin(0));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconXp (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)+=timesI(hspin(1));
 | 
			
		||||
      fspin(3)+=timesI(hspin(0));
 | 
			
		||||
      fspin(2)-=timesI(hspin(1));
 | 
			
		||||
      fspin(3)-=timesI(hspin(0));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconXm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)-=timesI(hspin(1));
 | 
			
		||||
      fspin(3)-=timesI(hspin(0));
 | 
			
		||||
      fspin(2)+=timesI(hspin(1));
 | 
			
		||||
      fspin(3)+=timesI(hspin(0));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
      //  0 0  0  -1  [0] -+ [3]
 | 
			
		||||
@@ -195,32 +195,32 @@ namespace QCD {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)=-hspin(1);
 | 
			
		||||
      fspin(3)= hspin(0);
 | 
			
		||||
      fspin(2)= hspin(1);
 | 
			
		||||
      fspin(3)=-hspin(0);//Unary minus?
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spReconYm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)= hspin(1);
 | 
			
		||||
      fspin(3)=-hspin(0);//Unary minus?
 | 
			
		||||
      fspin(2)=-hspin(1);
 | 
			
		||||
      fspin(3)= hspin(0);
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconYp (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)-=hspin(1);
 | 
			
		||||
      fspin(3)+=hspin(0);
 | 
			
		||||
      fspin(2)+=hspin(1);
 | 
			
		||||
      fspin(3)-=hspin(0);
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconYm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)+=hspin(1);
 | 
			
		||||
      fspin(3)-=hspin(0);
 | 
			
		||||
      fspin(2)-=hspin(1);
 | 
			
		||||
      fspin(3)+=hspin(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	    /*Gz
 | 
			
		||||
@@ -234,32 +234,32 @@ namespace QCD {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)=     timesI(hspin(0));
 | 
			
		||||
      fspin(3)=timesMinusI(hspin(1));
 | 
			
		||||
      fspin(2)=timesMinusI(hspin(0));
 | 
			
		||||
      fspin(3)=timesI(hspin(1));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spReconZm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)=timesMinusI(hspin(0));
 | 
			
		||||
      fspin(3)=timesI(hspin(1));
 | 
			
		||||
      fspin(2)=     timesI(hspin(0));
 | 
			
		||||
      fspin(3)=timesMinusI(hspin(1));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconZp (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)+=timesI(hspin(0));
 | 
			
		||||
      fspin(3)-=timesI(hspin(1));
 | 
			
		||||
      fspin(2)-=timesI(hspin(0));
 | 
			
		||||
      fspin(3)+=timesI(hspin(1));
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconZm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)-=timesI(hspin(0));
 | 
			
		||||
      fspin(3)+=timesI(hspin(1));
 | 
			
		||||
      fspin(2)+=timesI(hspin(0));
 | 
			
		||||
      fspin(3)-=timesI(hspin(1));
 | 
			
		||||
    }
 | 
			
		||||
	    /*Gt
 | 
			
		||||
	     *  0 0  1  0 [0]+-[2]
 | 
			
		||||
@@ -272,32 +272,32 @@ namespace QCD {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)=-hspin(0);
 | 
			
		||||
      fspin(3)=-hspin(1);
 | 
			
		||||
      fspin(2)=hspin(0);
 | 
			
		||||
      fspin(3)=hspin(1);
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void spReconTm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)=hspin(0);
 | 
			
		||||
      fspin(1)=hspin(1);
 | 
			
		||||
      fspin(2)=hspin(0);
 | 
			
		||||
      fspin(3)=hspin(1);
 | 
			
		||||
      fspin(2)=-hspin(0);
 | 
			
		||||
      fspin(3)=-hspin(1);
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconTp (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)-=hspin(0);
 | 
			
		||||
      fspin(3)-=hspin(1);
 | 
			
		||||
      fspin(2)+=hspin(0);
 | 
			
		||||
      fspin(3)+=hspin(1);
 | 
			
		||||
    }
 | 
			
		||||
  template<class vtype,IfSpinor<iVector<vtype,Ns> > = 0> strong_inline void accumReconTm (iVector<vtype,Ns> &fspin,const iVector<vtype,Nhs> &hspin)
 | 
			
		||||
    {
 | 
			
		||||
      //typename std::enable_if<matchGridTensorIndex<iVector<vtype,Ns>,SpinorIndex>::value,iVector<vtype,Ns> >::type *SFINAE;
 | 
			
		||||
      fspin(0)+=hspin(0);
 | 
			
		||||
      fspin(1)+=hspin(1);
 | 
			
		||||
      fspin(2)+=hspin(0);
 | 
			
		||||
      fspin(3)+=hspin(1);
 | 
			
		||||
      fspin(2)-=hspin(0);
 | 
			
		||||
      fspin(3)-=hspin(1);
 | 
			
		||||
    }
 | 
			
		||||
	    /*G5
 | 
			
		||||
	     *  1 0  0  0 
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user