mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	Merge branch 'develop' of https://github.com/paboyle/Grid into develop
This commit is contained in:
		@@ -43,7 +43,7 @@ public:
 | 
			
		||||
 | 
			
		||||
  template<typename vtype> using iSUnMatrix              = iScalar<iScalar<iMatrix<vtype, ncolour> > > ;
 | 
			
		||||
  template<typename vtype> using iSU2Matrix              = iScalar<iScalar<iMatrix<vtype, 2> > > ;
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Types can be accessed as SU<2>::Matrix , SU<2>::vSUnMatrix, SU<2>::LatticeMatrix etc...
 | 
			
		||||
  //////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -552,15 +552,24 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // reunitarise??
 | 
			
		||||
  static void LieRandomize(GridParallelRNG     &pRNG,LatticeMatrix &out,double scale=1.0){
 | 
			
		||||
  template<typename LatticeMatrixType>
 | 
			
		||||
  static void LieRandomize(GridParallelRNG     &pRNG,LatticeMatrixType &out,double scale=1.0){
 | 
			
		||||
    GridBase *grid = out._grid;
 | 
			
		||||
 | 
			
		||||
    LatticeComplex ca (grid);
 | 
			
		||||
    LatticeMatrix  lie(grid);
 | 
			
		||||
    LatticeMatrix  la (grid);
 | 
			
		||||
    Complex ci(0.0,scale);
 | 
			
		||||
    Complex cone(1.0,0.0);
 | 
			
		||||
    Matrix ta;
 | 
			
		||||
    
 | 
			
		||||
    typedef typename LatticeMatrixType::vector_type vector_type;
 | 
			
		||||
    typedef typename LatticeMatrixType::scalar_type scalar_type;
 | 
			
		||||
    
 | 
			
		||||
    typedef iSinglet<vector_type> vTComplexType;
 | 
			
		||||
    
 | 
			
		||||
    typedef Lattice<vTComplexType> LatticeComplexType;
 | 
			
		||||
    typedef typename GridTypeMapper<typename LatticeMatrixType::vector_object>::scalar_object MatrixType;
 | 
			
		||||
    
 | 
			
		||||
    LatticeComplexType ca (grid);
 | 
			
		||||
    LatticeMatrixType  lie(grid);
 | 
			
		||||
    LatticeMatrixType  la (grid);
 | 
			
		||||
    ComplexD ci(0.0,scale);
 | 
			
		||||
    ComplexD cone(1.0,0.0);
 | 
			
		||||
    MatrixType ta;
 | 
			
		||||
 | 
			
		||||
    lie=zero;
 | 
			
		||||
    for(int a=0;a<generators();a++){
 | 
			
		||||
@@ -596,9 +605,13 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  static void HotConfiguration(GridParallelRNG &pRNG,LatticeGaugeField &out){
 | 
			
		||||
    LatticeMatrix Umu(out._grid);
 | 
			
		||||
  template<typename GaugeField>
 | 
			
		||||
  static void HotConfiguration(GridParallelRNG &pRNG,GaugeField &out){
 | 
			
		||||
    typedef typename GaugeField::vector_type vector_type;
 | 
			
		||||
    typedef iSUnMatrix<vector_type> vMatrixType;
 | 
			
		||||
    typedef Lattice<vMatrixType> LatticeMatrixType;
 | 
			
		||||
    
 | 
			
		||||
    LatticeMatrixType Umu(out._grid);
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      LieRandomize(pRNG,Umu,1.0);
 | 
			
		||||
      PokeIndex<LorentzIndex>(out,Umu,mu);
 | 
			
		||||
@@ -622,13 +635,15 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g
 | 
			
		||||
  static void taProj( const LatticeMatrix &in,  LatticeMatrix &out){
 | 
			
		||||
    out = Ta(in);
 | 
			
		||||
  }
 | 
			
		||||
  static void taExp( const LatticeMatrix &x,  LatticeMatrix &ex){ 
 | 
			
		||||
 | 
			
		||||
    LatticeMatrix xn(x._grid);
 | 
			
		||||
  template<typename LatticeMatrixType>
 | 
			
		||||
  static void taExp( const LatticeMatrixType &x,  LatticeMatrixType &ex){ 
 | 
			
		||||
    typedef typename LatticeMatrixType::scalar_type ComplexType;    
 | 
			
		||||
    
 | 
			
		||||
    LatticeMatrixType xn(x._grid);
 | 
			
		||||
    RealD nfac = 1.0;
 | 
			
		||||
 | 
			
		||||
    xn = x;
 | 
			
		||||
    ex =xn+Complex(1.0); // 1+x
 | 
			
		||||
    ex =xn+ComplexType(1.0); // 1+x
 | 
			
		||||
 | 
			
		||||
    // Do a 12th order exponentiation
 | 
			
		||||
    for(int i=2; i <= 12; ++i)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
/*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/utils/WilsonLoops.h
 | 
			
		||||
 | 
			
		||||
@@ -25,391 +25,501 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
    with this program; if not, write to the Free Software Foundation, Inc.,
 | 
			
		||||
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | 
			
		||||
 | 
			
		||||
    See the full license in the file "LICENSE" in the top level distribution directory
 | 
			
		||||
    *************************************************************************************/
 | 
			
		||||
    /*  END LEGAL */
 | 
			
		||||
    See the full license in the file "LICENSE" in the top level distribution
 | 
			
		||||
directory
 | 
			
		||||
*************************************************************************************/
 | 
			
		||||
/*  END LEGAL */
 | 
			
		||||
#ifndef QCD_UTILS_WILSON_LOOPS_H
 | 
			
		||||
#define QCD_UTILS_WILSON_LOOPS_H
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
// Common wilson loop observables
 | 
			
		||||
template<class Gimpl>
 | 
			
		||||
class WilsonLoops : public Gimpl {
 | 
			
		||||
template <class Gimpl> class WilsonLoops : public Gimpl {
 | 
			
		||||
public:
 | 
			
		||||
  
 | 
			
		||||
  INHERIT_GIMPL_TYPES(Gimpl);
 | 
			
		||||
 | 
			
		||||
  typedef typename Gimpl::GaugeLinkField GaugeMat;
 | 
			
		||||
  typedef typename Gimpl::GaugeField     GaugeLorentz;
 | 
			
		||||
  typedef typename Gimpl::GaugeField GaugeLorentz;
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // directed plaquette oriented in mu,nu plane
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static void dirPlaquette(GaugeMat &plaq,const std::vector<GaugeMat> &U, const int mu, const int nu)
 | 
			
		||||
  {
 | 
			
		||||
    // Annoyingly, must use either scope resolution to find dependent base class, 
 | 
			
		||||
    // or this-> ; there is no "this" in a static method. This forces explicit Gimpl scope
 | 
			
		||||
    // resolution throughout the usage in this file, and rather defeats the purpose of deriving
 | 
			
		||||
  static void dirPlaquette(GaugeMat &plaq, const std::vector<GaugeMat> &U,
 | 
			
		||||
                           const int mu, const int nu) {
 | 
			
		||||
    // Annoyingly, must use either scope resolution to find dependent base
 | 
			
		||||
    // class,
 | 
			
		||||
    // or this-> ; there is no "this" in a static method. This forces explicit
 | 
			
		||||
    // Gimpl scope
 | 
			
		||||
    // resolution throughout the usage in this file, and rather defeats the
 | 
			
		||||
    // purpose of deriving
 | 
			
		||||
    // from Gimpl.
 | 
			
		||||
    plaq= Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
	  Gimpl::CovShiftBackward(U[nu],nu,
 | 
			
		||||
          Gimpl::CovShiftForward (U[mu],mu,U[nu])));
 | 
			
		||||
    plaq = Gimpl::CovShiftBackward(
 | 
			
		||||
        U[mu], mu, Gimpl::CovShiftBackward(
 | 
			
		||||
                       U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[nu])));
 | 
			
		||||
  }
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // trace of directed plaquette oriented in mu,nu plane
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static void traceDirPlaquette(LatticeComplex &plaq, const std::vector<GaugeMat> &U, const int mu, const int nu)
 | 
			
		||||
  {
 | 
			
		||||
  static void traceDirPlaquette(LatticeComplex &plaq,
 | 
			
		||||
                                const std::vector<GaugeMat> &U, const int mu,
 | 
			
		||||
                                const int nu) {
 | 
			
		||||
    GaugeMat sp(U[0]._grid);
 | 
			
		||||
    dirPlaquette(sp,U,mu,nu);
 | 
			
		||||
    plaq=trace(sp);
 | 
			
		||||
    dirPlaquette(sp, U, mu, nu);
 | 
			
		||||
    plaq = trace(sp);
 | 
			
		||||
  }
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // sum over all planes of plaquette
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static void sitePlaquette(LatticeComplex &Plaq,const std::vector<GaugeMat> &U)
 | 
			
		||||
  {
 | 
			
		||||
  static void sitePlaquette(LatticeComplex &Plaq,
 | 
			
		||||
                            const std::vector<GaugeMat> &U) {
 | 
			
		||||
    LatticeComplex sitePlaq(U[0]._grid);
 | 
			
		||||
    Plaq=zero;
 | 
			
		||||
    for(int mu=1;mu<Nd;mu++){
 | 
			
		||||
      for(int nu=0;nu<mu;nu++){
 | 
			
		||||
	traceDirPlaquette(sitePlaq,U,mu,nu);
 | 
			
		||||
	Plaq = Plaq + sitePlaq;
 | 
			
		||||
    Plaq = zero;
 | 
			
		||||
    for (int mu = 1; mu < Nd; mu++) {
 | 
			
		||||
      for (int nu = 0; nu < mu; nu++) {
 | 
			
		||||
        traceDirPlaquette(sitePlaq, U, mu, nu);
 | 
			
		||||
        Plaq = Plaq + sitePlaq;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // sum over all x,y,z,t and over all planes of plaquette
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static RealD sumPlaquette(const GaugeLorentz &Umu){
 | 
			
		||||
    std::vector<GaugeMat> U(Nd,Umu._grid);
 | 
			
		||||
  static RealD sumPlaquette(const GaugeLorentz &Umu) {
 | 
			
		||||
    std::vector<GaugeMat> U(4, Umu._grid);
 | 
			
		||||
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(Umu,mu);
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(Umu, mu);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    LatticeComplex Plaq(Umu._grid);
 | 
			
		||||
    
 | 
			
		||||
    sitePlaquette(Plaq,U);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    sitePlaquette(Plaq, U);
 | 
			
		||||
 | 
			
		||||
    TComplex Tp = sum(Plaq);
 | 
			
		||||
    Complex p  = TensorRemove(Tp);
 | 
			
		||||
    Complex p = TensorRemove(Tp);
 | 
			
		||||
    return p.real();
 | 
			
		||||
  }
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // average over all x,y,z,t and over all planes of plaquette
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static RealD avgPlaquette(const GaugeLorentz &Umu){
 | 
			
		||||
 | 
			
		||||
  static RealD avgPlaquette(const GaugeLorentz &Umu) {
 | 
			
		||||
    RealD sumplaq = sumPlaquette(Umu);
 | 
			
		||||
    
 | 
			
		||||
    double vol = Umu._grid->gSites();
 | 
			
		||||
    
 | 
			
		||||
    double faces = (1.0*Nd*(Nd-1))/2.0;
 | 
			
		||||
    
 | 
			
		||||
    return sumplaq/vol/faces/Nc; // Nd , Nc dependent... FIXME
 | 
			
		||||
    double faces = (1.0 * Nd * (Nd - 1)) / 2.0;
 | 
			
		||||
    return sumplaq / vol / faces / Nc; // Nd , Nc dependent... FIXME
 | 
			
		||||
  }
 | 
			
		||||
  static RealD linkTrace(const GaugeLorentz &Umu){
 | 
			
		||||
    std::vector<GaugeMat> U(Nd,Umu._grid);
 | 
			
		||||
 | 
			
		||||
    LatticeComplex Tr(Umu._grid); Tr=zero;
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(Umu,mu);
 | 
			
		||||
      Tr = Tr+trace(U[mu]);
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // average over traced single links
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static RealD linkTrace(const GaugeLorentz &Umu) {
 | 
			
		||||
    std::vector<GaugeMat> U(4, Umu._grid);
 | 
			
		||||
 | 
			
		||||
    LatticeComplex Tr(Umu._grid);
 | 
			
		||||
    Tr = zero;
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(Umu, mu);
 | 
			
		||||
      Tr = Tr + trace(U[mu]);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    TComplex Tp = sum(Tr);
 | 
			
		||||
    Complex p  = TensorRemove(Tp);
 | 
			
		||||
    Complex p = TensorRemove(Tp);
 | 
			
		||||
 | 
			
		||||
    double vol = Umu._grid->gSites();
 | 
			
		||||
 | 
			
		||||
    return p.real()/vol/((double)(Nd*(Nd-1)));
 | 
			
		||||
    return p.real() / vol / 4.0 / 3.0;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // the sum over all staples on each site
 | 
			
		||||
  // the sum over all staples on each site in direction mu,nu
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static void Staple(GaugeMat &staple,const GaugeLorentz &Umu,int mu){
 | 
			
		||||
  static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu,
 | 
			
		||||
                     int nu) {
 | 
			
		||||
 | 
			
		||||
    GridBase *grid = Umu._grid;
 | 
			
		||||
 | 
			
		||||
    std::vector<GaugeMat> U(Nd,grid);
 | 
			
		||||
    for(int d=0;d<Nd;d++){
 | 
			
		||||
      U[d] = PeekIndex<LorentzIndex>(Umu,d);
 | 
			
		||||
    std::vector<GaugeMat> U(4, grid);
 | 
			
		||||
    for (int d = 0; d < Nd; d++) {
 | 
			
		||||
      U[d] = PeekIndex<LorentzIndex>(Umu, d);
 | 
			
		||||
    }
 | 
			
		||||
    staple = zero;
 | 
			
		||||
    GaugeMat tmp(grid);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    for(int nu=0;nu<Nd;nu++){
 | 
			
		||||
 | 
			
		||||
      if(nu != mu) {
 | 
			
		||||
    if (nu != mu) {
 | 
			
		||||
 | 
			
		||||
      // mu
 | 
			
		||||
      // ^
 | 
			
		||||
      // |__>  nu
 | 
			
		||||
 | 
			
		||||
      //    __ 
 | 
			
		||||
      //    __
 | 
			
		||||
      //      |
 | 
			
		||||
      //    __|
 | 
			
		||||
      //
 | 
			
		||||
 | 
			
		||||
	staple+=Gimpl::ShiftStaple(
 | 
			
		||||
	        Gimpl::CovShiftForward (U[nu],nu, 
 | 
			
		||||
		Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
		Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu);
 | 
			
		||||
      staple += Gimpl::ShiftStaple(
 | 
			
		||||
          Gimpl::CovShiftForward(
 | 
			
		||||
              U[nu], nu,
 | 
			
		||||
              Gimpl::CovShiftBackward(
 | 
			
		||||
                  U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))),
 | 
			
		||||
          mu);
 | 
			
		||||
 | 
			
		||||
      //  __ 
 | 
			
		||||
      // |   
 | 
			
		||||
      // |__ 
 | 
			
		||||
      //  __
 | 
			
		||||
      // |
 | 
			
		||||
      // |__
 | 
			
		||||
      //
 | 
			
		||||
      //
 | 
			
		||||
	staple+=Gimpl::ShiftStaple(  
 | 
			
		||||
                Gimpl::CovShiftBackward(U[nu],nu,		  		  
 | 
			
		||||
		Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu);
 | 
			
		||||
      staple += Gimpl::ShiftStaple(
 | 
			
		||||
          Gimpl::CovShiftBackward(U[nu], nu,
 | 
			
		||||
                                  Gimpl::CovShiftBackward(U[mu], mu, U[nu])),
 | 
			
		||||
          mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // the sum over all staples on each site
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu) {
 | 
			
		||||
 | 
			
		||||
    GridBase *grid = Umu._grid;
 | 
			
		||||
 | 
			
		||||
    std::vector<GaugeMat> U(Nd, grid);
 | 
			
		||||
    for (int d = 0; d < Nd; d++) {
 | 
			
		||||
      U[d] = PeekIndex<LorentzIndex>(Umu, d);
 | 
			
		||||
    }
 | 
			
		||||
    staple = zero;
 | 
			
		||||
    GaugeMat tmp(grid);
 | 
			
		||||
 | 
			
		||||
    for (int nu = 0; nu < Nd; nu++) {
 | 
			
		||||
 | 
			
		||||
      if (nu != mu) {
 | 
			
		||||
 | 
			
		||||
        // mu
 | 
			
		||||
        // ^
 | 
			
		||||
        // |__>  nu
 | 
			
		||||
 | 
			
		||||
        //    __
 | 
			
		||||
        //      |
 | 
			
		||||
        //    __|
 | 
			
		||||
        //
 | 
			
		||||
 | 
			
		||||
        staple += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftForward(
 | 
			
		||||
                U[nu], nu,
 | 
			
		||||
                Gimpl::CovShiftBackward(
 | 
			
		||||
                    U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))),
 | 
			
		||||
            mu);
 | 
			
		||||
 | 
			
		||||
        //  __
 | 
			
		||||
        // |
 | 
			
		||||
        // |__
 | 
			
		||||
        //
 | 
			
		||||
        //
 | 
			
		||||
        staple += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftBackward(U[nu], nu,
 | 
			
		||||
                                    Gimpl::CovShiftBackward(U[mu], mu, U[nu])),
 | 
			
		||||
            mu);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // the sum over all staples on each site in direction mu,nu, upper part
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static void StapleUpper(GaugeMat &staple, const GaugeLorentz &Umu, int mu,
 | 
			
		||||
                          int nu) {
 | 
			
		||||
 | 
			
		||||
    staple = zero;
 | 
			
		||||
 | 
			
		||||
    if (nu != mu) {
 | 
			
		||||
      GridBase *grid = Umu._grid;
 | 
			
		||||
 | 
			
		||||
      std::vector<GaugeMat> U(4, grid);
 | 
			
		||||
      for (int d = 0; d < Nd; d++) {
 | 
			
		||||
        U[d] = PeekIndex<LorentzIndex>(Umu, d);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // mu
 | 
			
		||||
      // ^
 | 
			
		||||
      // |__>  nu
 | 
			
		||||
 | 
			
		||||
      //    __
 | 
			
		||||
      //      |
 | 
			
		||||
      //    __|
 | 
			
		||||
      //
 | 
			
		||||
 | 
			
		||||
      staple += Gimpl::ShiftStaple(
 | 
			
		||||
          Gimpl::CovShiftForward(
 | 
			
		||||
              U[nu], nu,
 | 
			
		||||
              Gimpl::CovShiftBackward(
 | 
			
		||||
                  U[mu], mu, Gimpl::CovShiftIdentityBackward(U[nu], nu))),
 | 
			
		||||
          mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////////
 | 
			
		||||
  // Similar to above for rectangle is required
 | 
			
		||||
  //////////////////////////////////////////////////////
 | 
			
		||||
  static void dirRectangle(GaugeMat &rect,const std::vector<GaugeMat> &U, const int mu, const int nu)
 | 
			
		||||
  {
 | 
			
		||||
    rect =  Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[mu],mu,U[nu]))* // ->->|
 | 
			
		||||
	adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[mu],mu,U[mu]))) ;
 | 
			
		||||
    rect = rect + 
 | 
			
		||||
          Gimpl::CovShiftForward(U[mu],mu,Gimpl::CovShiftForward(U[nu],nu,U[nu]))* // ->||
 | 
			
		||||
      adj(Gimpl::CovShiftForward(U[nu],nu,Gimpl::CovShiftForward(U[nu],nu,U[mu]))) ;
 | 
			
		||||
  static void dirRectangle(GaugeMat &rect, const std::vector<GaugeMat> &U,
 | 
			
		||||
                           const int mu, const int nu) {
 | 
			
		||||
    rect = Gimpl::CovShiftForward(
 | 
			
		||||
               U[mu], mu, Gimpl::CovShiftForward(U[mu], mu, U[nu])) * // ->->|
 | 
			
		||||
           adj(Gimpl::CovShiftForward(
 | 
			
		||||
               U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[mu])));
 | 
			
		||||
    rect = rect +
 | 
			
		||||
           Gimpl::CovShiftForward(
 | 
			
		||||
               U[mu], mu, Gimpl::CovShiftForward(U[nu], nu, U[nu])) * // ->||
 | 
			
		||||
               adj(Gimpl::CovShiftForward(
 | 
			
		||||
                   U[nu], nu, Gimpl::CovShiftForward(U[nu], nu, U[mu])));
 | 
			
		||||
  }
 | 
			
		||||
  static void traceDirRectangle(LatticeComplex &rect, const std::vector<GaugeMat> &U, const int mu, const int nu)
 | 
			
		||||
  {
 | 
			
		||||
  static void traceDirRectangle(LatticeComplex &rect,
 | 
			
		||||
                                const std::vector<GaugeMat> &U, const int mu,
 | 
			
		||||
                                const int nu) {
 | 
			
		||||
    GaugeMat sp(U[0]._grid);
 | 
			
		||||
    dirRectangle(sp,U,mu,nu);
 | 
			
		||||
    rect=trace(sp);
 | 
			
		||||
    dirRectangle(sp, U, mu, nu);
 | 
			
		||||
    rect = trace(sp);
 | 
			
		||||
  }
 | 
			
		||||
  static void siteRectangle(LatticeComplex &Rect,const std::vector<GaugeMat> &U)
 | 
			
		||||
  {
 | 
			
		||||
  static void siteRectangle(LatticeComplex &Rect,
 | 
			
		||||
                            const std::vector<GaugeMat> &U) {
 | 
			
		||||
    LatticeComplex siteRect(U[0]._grid);
 | 
			
		||||
    Rect=zero;
 | 
			
		||||
    for(int mu=1;mu<Nd;mu++){
 | 
			
		||||
      for(int nu=0;nu<mu;nu++){
 | 
			
		||||
	traceDirRectangle(siteRect,U,mu,nu);
 | 
			
		||||
	Rect = Rect + siteRect;
 | 
			
		||||
    Rect = zero;
 | 
			
		||||
    for (int mu = 1; mu < Nd; mu++) {
 | 
			
		||||
      for (int nu = 0; nu < mu; nu++) {
 | 
			
		||||
        traceDirRectangle(siteRect, U, mu, nu);
 | 
			
		||||
        Rect = Rect + siteRect;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // sum over all x,y,z,t and over all planes of plaquette
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static RealD sumRectangle(const GaugeLorentz &Umu){
 | 
			
		||||
    std::vector<GaugeMat> U(Nd,Umu._grid);
 | 
			
		||||
  static RealD sumRectangle(const GaugeLorentz &Umu) {
 | 
			
		||||
    std::vector<GaugeMat> U(Nd, Umu._grid);
 | 
			
		||||
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(Umu,mu);
 | 
			
		||||
    for (int mu = 0; mu < Nd; mu++) {
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(Umu, mu);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    LatticeComplex Rect(Umu._grid);
 | 
			
		||||
    
 | 
			
		||||
    siteRectangle(Rect,U);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    siteRectangle(Rect, U);
 | 
			
		||||
 | 
			
		||||
    TComplex Tp = sum(Rect);
 | 
			
		||||
    Complex p  = TensorRemove(Tp);
 | 
			
		||||
    Complex p = TensorRemove(Tp);
 | 
			
		||||
    return p.real();
 | 
			
		||||
  }
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // average over all x,y,z,t and over all planes of plaquette
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static RealD avgRectangle(const GaugeLorentz &Umu){
 | 
			
		||||
  static RealD avgRectangle(const GaugeLorentz &Umu) {
 | 
			
		||||
 | 
			
		||||
    RealD sumrect = sumRectangle(Umu);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    double vol = Umu._grid->gSites();
 | 
			
		||||
    
 | 
			
		||||
    double faces = (1.0*Nd*(Nd-1)); // 2 distinct orientations summed
 | 
			
		||||
    
 | 
			
		||||
    return sumrect/vol/faces/Nc; // Nd , Nc dependent... FIXME
 | 
			
		||||
 | 
			
		||||
    double faces = (1.0 * Nd * (Nd - 1)); // 2 distinct orientations summed
 | 
			
		||||
 | 
			
		||||
    return sumrect / vol / faces / Nc; // Nd , Nc dependent... FIXME
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // the sum over all staples on each site
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static void RectStapleDouble(GaugeMat &U2,const GaugeMat & U,int mu){
 | 
			
		||||
    U2 = U * Cshift(U,mu,1);
 | 
			
		||||
  static void RectStapleDouble(GaugeMat &U2, const GaugeMat &U, int mu) {
 | 
			
		||||
    U2 = U * Cshift(U, mu, 1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Hop by two optimisation strategy does not work nicely with Gparity. (could do,
 | 
			
		||||
  // Hop by two optimisation strategy does not work nicely with Gparity. (could
 | 
			
		||||
  // do,
 | 
			
		||||
  // but need to track two deep where cross boundary and apply a conjugation).
 | 
			
		||||
  // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do so .
 | 
			
		||||
  // Must differentiate this in Gimpl, and use Gimpl::isPeriodicGaugeField to do
 | 
			
		||||
  // so .
 | 
			
		||||
  ////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  static void RectStapleOptimised(GaugeMat &Stap,std::vector<GaugeMat> &U2,std::vector<GaugeMat> &U,int mu){
 | 
			
		||||
  static void RectStapleOptimised(GaugeMat &Stap, std::vector<GaugeMat> &U2,
 | 
			
		||||
                                  std::vector<GaugeMat> &U, int mu) {
 | 
			
		||||
 | 
			
		||||
    Stap = zero;
 | 
			
		||||
 | 
			
		||||
    GridBase *grid = U[0]._grid;
 | 
			
		||||
 | 
			
		||||
    GaugeMat Staple2x1 (grid);
 | 
			
		||||
    GaugeMat tmp (grid);
 | 
			
		||||
    GaugeMat Staple2x1(grid);
 | 
			
		||||
    GaugeMat tmp(grid);
 | 
			
		||||
 | 
			
		||||
    for(int nu=0;nu<Nd;nu++){
 | 
			
		||||
      if ( nu!=mu) {
 | 
			
		||||
    for (int nu = 0; nu < Nd; nu++) {
 | 
			
		||||
      if (nu != mu) {
 | 
			
		||||
 | 
			
		||||
	// Up staple    ___ ___ 
 | 
			
		||||
	//             |       |
 | 
			
		||||
	tmp = Cshift(adj(U[nu]),nu,-1); 
 | 
			
		||||
	tmp = adj(U2[mu])*tmp;
 | 
			
		||||
	tmp = Cshift(tmp,mu,-2);
 | 
			
		||||
        // Up staple    ___ ___
 | 
			
		||||
        //             |       |
 | 
			
		||||
        tmp = Cshift(adj(U[nu]), nu, -1);
 | 
			
		||||
        tmp = adj(U2[mu]) * tmp;
 | 
			
		||||
        tmp = Cshift(tmp, mu, -2);
 | 
			
		||||
 | 
			
		||||
	Staple2x1 = Gimpl::CovShiftForward (U[nu],nu,tmp);
 | 
			
		||||
        Staple2x1 = Gimpl::CovShiftForward(U[nu], nu, tmp);
 | 
			
		||||
 | 
			
		||||
        // Down staple
 | 
			
		||||
        //             |___ ___|
 | 
			
		||||
        //
 | 
			
		||||
        tmp = adj(U2[mu]) * U[nu];
 | 
			
		||||
        Staple2x1 += Gimpl::CovShiftBackward(U[nu], nu, Cshift(tmp, mu, -2));
 | 
			
		||||
 | 
			
		||||
	// Down staple
 | 
			
		||||
	//             |___ ___|
 | 
			
		||||
	//
 | 
			
		||||
	tmp = adj(U2[mu])*U[nu];
 | 
			
		||||
	Staple2x1+= Gimpl::CovShiftBackward(U[nu],nu,Cshift(tmp,mu,-2));
 | 
			
		||||
        //              ___ ___
 | 
			
		||||
        //             |    ___|
 | 
			
		||||
        //             |___ ___|
 | 
			
		||||
        //
 | 
			
		||||
 | 
			
		||||
        Stap += Cshift(Gimpl::CovShiftForward(U[mu], mu, Staple2x1), mu, 1);
 | 
			
		||||
 | 
			
		||||
	//              ___ ___
 | 
			
		||||
	//             |    ___|
 | 
			
		||||
	//             |___ ___|
 | 
			
		||||
	//
 | 
			
		||||
        //              ___ ___
 | 
			
		||||
        //             |___    |
 | 
			
		||||
        //             |___ ___|
 | 
			
		||||
        //
 | 
			
		||||
 | 
			
		||||
	Stap+= Cshift(Gimpl::CovShiftForward (U[mu],mu,Staple2x1),mu,1);
 | 
			
		||||
        //	tmp= Staple2x1* Cshift(U[mu],mu,-2);
 | 
			
		||||
        //	Stap+= Cshift(tmp,mu,1) ;
 | 
			
		||||
        Stap += Cshift(Staple2x1, mu, 1) * Cshift(U[mu], mu, -1);
 | 
			
		||||
        ;
 | 
			
		||||
 | 
			
		||||
	//              ___ ___
 | 
			
		||||
	//             |___    |
 | 
			
		||||
	//             |___ ___|
 | 
			
		||||
	//
 | 
			
		||||
        //       --
 | 
			
		||||
        //      |  |
 | 
			
		||||
        //
 | 
			
		||||
        //      |  |
 | 
			
		||||
 | 
			
		||||
	//	tmp= Staple2x1* Cshift(U[mu],mu,-2);
 | 
			
		||||
	//	Stap+= Cshift(tmp,mu,1) ;
 | 
			
		||||
	Stap+= Cshift(Staple2x1,mu,1)*Cshift(U[mu],mu,-1); ;
 | 
			
		||||
        tmp = Cshift(adj(U2[nu]), nu, -2);
 | 
			
		||||
        tmp = Gimpl::CovShiftBackward(U[mu], mu, tmp);
 | 
			
		||||
        tmp = U2[nu] * Cshift(tmp, nu, 2);
 | 
			
		||||
        Stap += Cshift(tmp, mu, 1);
 | 
			
		||||
 | 
			
		||||
	//       --    
 | 
			
		||||
	//      |  |              
 | 
			
		||||
	//          
 | 
			
		||||
	//      |  | 
 | 
			
		||||
	
 | 
			
		||||
	tmp = Cshift(adj(U2[nu]),nu,-2);
 | 
			
		||||
	tmp = Gimpl::CovShiftBackward(U[mu],mu,tmp);
 | 
			
		||||
	tmp = U2[nu]*Cshift(tmp,nu,2);
 | 
			
		||||
	Stap+= Cshift(tmp, mu, 1);
 | 
			
		||||
        //      |  |
 | 
			
		||||
        //
 | 
			
		||||
        //      |  |
 | 
			
		||||
        //       --
 | 
			
		||||
 | 
			
		||||
	//      |  |              
 | 
			
		||||
	//          
 | 
			
		||||
	//      |  | 
 | 
			
		||||
	//       -- 
 | 
			
		||||
	
 | 
			
		||||
	tmp = Gimpl::CovShiftBackward(U[mu],mu,U2[nu]);
 | 
			
		||||
	tmp = adj(U2[nu])*tmp;
 | 
			
		||||
	tmp = Cshift(tmp,nu,-2);
 | 
			
		||||
	Stap+=Cshift(tmp, mu, 1);
 | 
			
		||||
    }}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void RectStaple(GaugeMat &Stap,const GaugeLorentz & Umu,int mu)
 | 
			
		||||
  {
 | 
			
		||||
    RectStapleUnoptimised(Stap,Umu,mu);
 | 
			
		||||
  }
 | 
			
		||||
  static void RectStaple(const GaugeLorentz & Umu,GaugeMat &Stap,
 | 
			
		||||
			 std::vector<GaugeMat> &U2,
 | 
			
		||||
			 std::vector<GaugeMat> &U, int mu)
 | 
			
		||||
  {
 | 
			
		||||
    if ( Gimpl::isPeriodicGaugeField() ){ 
 | 
			
		||||
      RectStapleOptimised(Stap,U2,U,mu);
 | 
			
		||||
    } else {
 | 
			
		||||
      RectStapleUnoptimised(Stap,Umu,mu);
 | 
			
		||||
        tmp = Gimpl::CovShiftBackward(U[mu], mu, U2[nu]);
 | 
			
		||||
        tmp = adj(U2[nu]) * tmp;
 | 
			
		||||
        tmp = Cshift(tmp, nu, -2);
 | 
			
		||||
        Stap += Cshift(tmp, mu, 1);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void RectStapleUnoptimised(GaugeMat &Stap,const GaugeLorentz &Umu,int mu){
 | 
			
		||||
  static void RectStaple(GaugeMat &Stap, const GaugeLorentz &Umu, int mu) {
 | 
			
		||||
    RectStapleUnoptimised(Stap, Umu, mu);
 | 
			
		||||
  }
 | 
			
		||||
  static void RectStaple(const GaugeLorentz &Umu, GaugeMat &Stap,
 | 
			
		||||
                         std::vector<GaugeMat> &U2, std::vector<GaugeMat> &U,
 | 
			
		||||
                         int mu) {
 | 
			
		||||
    if (Gimpl::isPeriodicGaugeField()) {
 | 
			
		||||
      RectStapleOptimised(Stap, U2, U, mu);
 | 
			
		||||
    } else {
 | 
			
		||||
      RectStapleUnoptimised(Stap, Umu, mu);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void RectStapleUnoptimised(GaugeMat &Stap, const GaugeLorentz &Umu,
 | 
			
		||||
                                    int mu) {
 | 
			
		||||
    GridBase *grid = Umu._grid;
 | 
			
		||||
 | 
			
		||||
    std::vector<GaugeMat> U(Nd,grid);
 | 
			
		||||
    for(int d=0;d<Nd;d++){
 | 
			
		||||
      U[d] = PeekIndex<LorentzIndex>(Umu,d);
 | 
			
		||||
    std::vector<GaugeMat> U(Nd, grid);
 | 
			
		||||
    for (int d = 0; d < Nd; d++) {
 | 
			
		||||
      U[d] = PeekIndex<LorentzIndex>(Umu, d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Stap=zero;
 | 
			
		||||
    Stap = zero;
 | 
			
		||||
 | 
			
		||||
    for(int nu=0;nu<Nd;nu++){
 | 
			
		||||
      if ( nu!=mu) {
 | 
			
		||||
    //           __ ___ 
 | 
			
		||||
    //          |    __ |
 | 
			
		||||
    //
 | 
			
		||||
    Stap+= Gimpl::ShiftStaple(
 | 
			
		||||
		  Gimpl::CovShiftForward (U[mu],mu,
 | 
			
		||||
		  Gimpl::CovShiftForward (U[nu],nu,
 | 
			
		||||
		  Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
                  Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
		  Gimpl::CovShiftIdentityBackward(U[nu],nu))))) , mu);
 | 
			
		||||
    for (int nu = 0; nu < Nd; nu++) {
 | 
			
		||||
      if (nu != mu) {
 | 
			
		||||
        //           __ ___
 | 
			
		||||
        //          |    __ |
 | 
			
		||||
        //
 | 
			
		||||
        Stap += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftForward(
 | 
			
		||||
                U[mu], mu,
 | 
			
		||||
                Gimpl::CovShiftForward(
 | 
			
		||||
                    U[nu], nu,
 | 
			
		||||
                    Gimpl::CovShiftBackward(
 | 
			
		||||
                        U[mu], mu,
 | 
			
		||||
                        Gimpl::CovShiftBackward(
 | 
			
		||||
                            U[mu], mu,
 | 
			
		||||
                            Gimpl::CovShiftIdentityBackward(U[nu], nu))))),
 | 
			
		||||
            mu);
 | 
			
		||||
 | 
			
		||||
    //              __ 
 | 
			
		||||
    //          |__ __ |
 | 
			
		||||
        //              __
 | 
			
		||||
        //          |__ __ |
 | 
			
		||||
 | 
			
		||||
    Stap+= Gimpl::ShiftStaple(
 | 
			
		||||
                  Gimpl::CovShiftForward (U[mu],mu,
 | 
			
		||||
		  Gimpl::CovShiftBackward(U[nu],nu,
 | 
			
		||||
		  Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
                  Gimpl::CovShiftBackward(U[mu],mu, U[nu])))) , mu);
 | 
			
		||||
        Stap += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftForward(
 | 
			
		||||
                U[mu], mu,
 | 
			
		||||
                Gimpl::CovShiftBackward(
 | 
			
		||||
                    U[nu], nu,
 | 
			
		||||
                    Gimpl::CovShiftBackward(
 | 
			
		||||
                        U[mu], mu, Gimpl::CovShiftBackward(U[mu], mu, U[nu])))),
 | 
			
		||||
            mu);
 | 
			
		||||
 | 
			
		||||
    //           __ 
 | 
			
		||||
    //          |__ __ |
 | 
			
		||||
        //           __
 | 
			
		||||
        //          |__ __ |
 | 
			
		||||
 | 
			
		||||
    Stap+= Gimpl::ShiftStaple(
 | 
			
		||||
		  Gimpl::CovShiftBackward(U[nu],nu,
 | 
			
		||||
		  Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
		  Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
		  Gimpl::CovShiftForward(U[nu],nu,U[mu])))) , mu);
 | 
			
		||||
        Stap += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftBackward(
 | 
			
		||||
                U[nu], nu,
 | 
			
		||||
                Gimpl::CovShiftBackward(
 | 
			
		||||
                    U[mu], mu,
 | 
			
		||||
                    Gimpl::CovShiftBackward(
 | 
			
		||||
                        U[mu], mu, Gimpl::CovShiftForward(U[nu], nu, U[mu])))),
 | 
			
		||||
            mu);
 | 
			
		||||
 | 
			
		||||
    //           __ ___ 
 | 
			
		||||
    //          |__    |
 | 
			
		||||
        //           __ ___
 | 
			
		||||
        //          |__    |
 | 
			
		||||
 | 
			
		||||
    Stap+= Gimpl::ShiftStaple(
 | 
			
		||||
		   Gimpl::CovShiftForward (U[nu],nu,
 | 
			
		||||
	           Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
                   Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
                   Gimpl::CovShiftBackward(U[nu],nu,U[mu])))) , mu);
 | 
			
		||||
        Stap += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftForward(
 | 
			
		||||
                U[nu], nu,
 | 
			
		||||
                Gimpl::CovShiftBackward(
 | 
			
		||||
                    U[mu], mu,
 | 
			
		||||
                    Gimpl::CovShiftBackward(
 | 
			
		||||
                        U[mu], mu, Gimpl::CovShiftBackward(U[nu], nu, U[mu])))),
 | 
			
		||||
            mu);
 | 
			
		||||
 | 
			
		||||
     //       --    
 | 
			
		||||
     //      |  |              
 | 
			
		||||
     //          
 | 
			
		||||
     //      |  | 
 | 
			
		||||
     
 | 
			
		||||
    Stap+= Gimpl::ShiftStaple(
 | 
			
		||||
		   Gimpl::CovShiftForward(U[nu],nu,
 | 
			
		||||
		   Gimpl::CovShiftForward(U[nu],nu,
 | 
			
		||||
                   Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
                   Gimpl::CovShiftBackward(U[nu],nu,
 | 
			
		||||
		   Gimpl::CovShiftIdentityBackward(U[nu],nu))))) , mu);
 | 
			
		||||
        //       --
 | 
			
		||||
        //      |  |
 | 
			
		||||
        //
 | 
			
		||||
        //      |  |
 | 
			
		||||
 | 
			
		||||
        Stap += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftForward(
 | 
			
		||||
                U[nu], nu,
 | 
			
		||||
                Gimpl::CovShiftForward(
 | 
			
		||||
                    U[nu], nu,
 | 
			
		||||
                    Gimpl::CovShiftBackward(
 | 
			
		||||
                        U[mu], mu,
 | 
			
		||||
                        Gimpl::CovShiftBackward(
 | 
			
		||||
                            U[nu], nu,
 | 
			
		||||
                            Gimpl::CovShiftIdentityBackward(U[nu], nu))))),
 | 
			
		||||
            mu);
 | 
			
		||||
 | 
			
		||||
     //      |  |              
 | 
			
		||||
     //          
 | 
			
		||||
     //      |  | 
 | 
			
		||||
     //       -- 
 | 
			
		||||
     
 | 
			
		||||
    Stap+= Gimpl::ShiftStaple(
 | 
			
		||||
		   Gimpl::CovShiftBackward(U[nu],nu,
 | 
			
		||||
		   Gimpl::CovShiftBackward(U[nu],nu,
 | 
			
		||||
                   Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
                   Gimpl::CovShiftForward (U[nu],nu,U[nu])))) , mu);
 | 
			
		||||
    }}
 | 
			
		||||
        //      |  |
 | 
			
		||||
        //
 | 
			
		||||
        //      |  |
 | 
			
		||||
        //       --
 | 
			
		||||
 | 
			
		||||
        Stap += Gimpl::ShiftStaple(
 | 
			
		||||
            Gimpl::CovShiftBackward(
 | 
			
		||||
                U[nu], nu,
 | 
			
		||||
                Gimpl::CovShiftBackward(
 | 
			
		||||
                    U[nu], nu,
 | 
			
		||||
                    Gimpl::CovShiftBackward(
 | 
			
		||||
                        U[mu], mu, Gimpl::CovShiftForward(U[nu], nu, U[nu])))),
 | 
			
		||||
            mu);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef WilsonLoops<PeriodicGimplR> ColourWilsonLoops;
 | 
			
		||||
typedef WilsonLoops<PeriodicGimplR> U1WilsonLoops;
 | 
			
		||||
typedef WilsonLoops<PeriodicGimplR> SU2WilsonLoops;
 | 
			
		||||
typedef WilsonLoops<PeriodicGimplR> SU3WilsonLoops;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> ColourWilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> U1WilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> SU2WilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> SU3WilsonLoops;
 | 
			
		||||
 | 
			
		||||
}}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user