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
This commit is contained in:
		@@ -1,23 +1,130 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/utils/CovariantCshift.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    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 */
 | 
			
		||||
#ifndef QCD_UTILS_COVARIANT_CSHIFT_H
 | 
			
		||||
#define QCD_UTILS_COVARIANT_CSHIFT_H
 | 
			
		||||
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
////////////////////////////////////////////////////////////////////////
 | 
			
		||||
// Low performance implementation of CovariantCshift API
 | 
			
		||||
////////////////////////////////////////////////////////////////////////
 | 
			
		||||
template<class covariant,class gauge> Lattice<covariant> CovShiftForward(const Lattice<gauge> &Link, 
 | 
			
		||||
// Make these members of an Impl class for BC's.
 | 
			
		||||
 | 
			
		||||
namespace PeriodicBC { 
 | 
			
		||||
 | 
			
		||||
  template<class covariant,class gauge> Lattice<covariant> CovShiftForward(const Lattice<gauge> &Link, 
 | 
			
		||||
									    int mu,
 | 
			
		||||
									    const Lattice<covariant> &field)
 | 
			
		||||
{
 | 
			
		||||
  return Link*Cshift(field,mu,1);// moves towards negative mu
 | 
			
		||||
  {
 | 
			
		||||
    return Link*Cshift(field,mu,1);// moves towards negative mu
 | 
			
		||||
  }
 | 
			
		||||
  template<class covariant,class gauge> Lattice<covariant> CovShiftBackward(const Lattice<gauge> &Link, 
 | 
			
		||||
									    int mu,
 | 
			
		||||
									    const Lattice<covariant> &field)
 | 
			
		||||
  {
 | 
			
		||||
    Lattice<covariant> tmp(field._grid);
 | 
			
		||||
    tmp = adj(Link)*field;
 | 
			
		||||
    return Cshift(tmp,mu,-1);// moves towards positive mu
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
template<class covariant,class gauge> Lattice<covariant> CovShiftBackward(const Lattice<gauge> &Link, 
 | 
			
		||||
									     int mu,
 | 
			
		||||
									     const Lattice<covariant> &field)
 | 
			
		||||
{
 | 
			
		||||
  Lattice<covariant> tmp(field._grid);
 | 
			
		||||
  tmp = adj(Link)*field;
 | 
			
		||||
  return Cshift(tmp,mu,-1);// moves towards positive mu
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace ConjugateBC { 
 | 
			
		||||
 | 
			
		||||
  // Must give right answers across boundary
 | 
			
		||||
  //     <----
 | 
			
		||||
  //       --    
 | 
			
		||||
  //      |  |              
 | 
			
		||||
  // xxxxxxxxxxxxxxxxxxxx
 | 
			
		||||
  //      |  | 
 | 
			
		||||
  //  
 | 
			
		||||
  //     Stap= Cshift(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,-1))))) , mu, 1);
 | 
			
		||||
  //  
 | 
			
		||||
  //                      U  U^* U^* U^T U^adj =  U  (U U U^dag U^T )^*
 | 
			
		||||
  //                                           =  U  (U U U^dag)^* ( U^T )^*
 | 
			
		||||
  //
 | 
			
		||||
  // So covariant shift rule: conjugate inward shifted plane when crossing boundary applies.
 | 
			
		||||
  //
 | 
			
		||||
  // This conjugate should be applied to BOTH the link and the covariant field on backward shift
 | 
			
		||||
  // boundary wrap.
 | 
			
		||||
  // 
 | 
			
		||||
  //      |  |              
 | 
			
		||||
  // xxxxxxxxxxxxxxxxx         
 | 
			
		||||
  //      |  | <---- this link is conjugated, and the path leading into it. Segment crossing in and out is double conjugated.
 | 
			
		||||
  //       -- 
 | 
			
		||||
  //    ------->
 | 
			
		||||
  template<class covariant,class gauge> Lattice<covariant> CovShiftForward(const Lattice<gauge> &Link, 
 | 
			
		||||
									    int mu,
 | 
			
		||||
									    const Lattice<covariant> &field)
 | 
			
		||||
  {
 | 
			
		||||
    GridBase * grid = Link._grid;
 | 
			
		||||
 | 
			
		||||
    int Lmu = grid->GlobalDimensions()[mu]-1;
 | 
			
		||||
 | 
			
		||||
    conformable(field,Link);
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > coor(grid);    LatticeCoordinate(coor,mu);
 | 
			
		||||
 | 
			
		||||
    Lattice<covariant> field_bc = Cshift(field,mu,1);// moves towards negative mu;
 | 
			
		||||
 | 
			
		||||
    field_bc = where(coor==Lmu,conjugate(field_bc),field_bc);
 | 
			
		||||
    //    std::cout<<"Gparity::CovCshiftForward mu="<<mu<<std::endl;
 | 
			
		||||
    return Link*field_bc;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<class covariant,class gauge> Lattice<covariant> CovShiftBackward(const Lattice<gauge> &Link, 
 | 
			
		||||
									    int mu,
 | 
			
		||||
									    const Lattice<covariant> &field)
 | 
			
		||||
  {
 | 
			
		||||
    GridBase * grid = field._grid;
 | 
			
		||||
 | 
			
		||||
    int Lmu = grid->GlobalDimensions()[mu]-1;
 | 
			
		||||
 | 
			
		||||
    conformable(field,Link);
 | 
			
		||||
 | 
			
		||||
    Lattice<iScalar<vInteger> > coor(grid);    LatticeCoordinate(coor,mu);
 | 
			
		||||
 | 
			
		||||
    Lattice<covariant> tmp(grid);
 | 
			
		||||
 | 
			
		||||
    tmp = adj(Link)*field;
 | 
			
		||||
    tmp = where(coor==Lmu,conjugate(tmp),tmp);
 | 
			
		||||
    //    std::cout<<"Gparity::CovCshiftBackward mu="<<mu<<std::endl;
 | 
			
		||||
    return Cshift(tmp,mu,-1);// moves towards positive mu
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,32 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/utils/LinalgUtils.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: Peter Boyle <peterboyle@Peters-MacBook-Pro-2.local>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    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 */
 | 
			
		||||
#ifndef GRID_QCD_LINALG_UTILS_H
 | 
			
		||||
#define GRID_QCD_LINALG_UTILS_H
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +38,25 @@ namespace QCD{
 | 
			
		||||
//These routines support five-D chiral fermions and contain s-subslice indexing 
 | 
			
		||||
//on the 5d (rb4d) checkerboarded lattices
 | 
			
		||||
////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
template<class vobj> 
 | 
			
		||||
void axpibg5x(Lattice<vobj> &z,const Lattice<vobj> &x,RealD a,RealD b)
 | 
			
		||||
{
 | 
			
		||||
  z.checkerboard = x.checkerboard;
 | 
			
		||||
  conformable(x,z);
 | 
			
		||||
 | 
			
		||||
  GridBase *grid=x._grid;
 | 
			
		||||
 | 
			
		||||
  Gamma G5(Gamma::Gamma5);
 | 
			
		||||
PARALLEL_FOR_LOOP
 | 
			
		||||
  for(int ss=0;ss<grid->oSites();ss++){
 | 
			
		||||
    vobj tmp;
 | 
			
		||||
    tmp = a*x._odata[ss];
 | 
			
		||||
    tmp = tmp + G5*(b*timesI(x._odata[ss]));
 | 
			
		||||
    vstream(z._odata[ss],tmp);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class vobj> 
 | 
			
		||||
void axpby_ssp(Lattice<vobj> &z, RealD a,const Lattice<vobj> &x,RealD b,const Lattice<vobj> &y,int s,int sp)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,33 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/utils/SUn.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: neo <cossu@post.kek.jp>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    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 */
 | 
			
		||||
#ifndef QCD_UTIL_SUN_H
 | 
			
		||||
#define QCD_UTIL_SUN_H
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,30 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/utils/SpaceTimeGrid.cc
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    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 */
 | 
			
		||||
#include <Grid.h>
 | 
			
		||||
 | 
			
		||||
namespace Grid { 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,30 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/utils/SpaceTimeGrid.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    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 */
 | 
			
		||||
#ifndef GRID_QCD_SPACE_TIME_GRID_H
 | 
			
		||||
#define GRID_QCD_SPACE_TIME_GRID_H
 | 
			
		||||
namespace Grid {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,60 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./lib/qcd/utils/WilsonLoops.h
 | 
			
		||||
 | 
			
		||||
    Copyright (C) 2015
 | 
			
		||||
 | 
			
		||||
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
 | 
			
		||||
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
Author: neo <cossu@post.kek.jp>
 | 
			
		||||
Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
 | 
			
		||||
    This program is free software; you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU General Public License as published by
 | 
			
		||||
    the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU General Public License along
 | 
			
		||||
    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 */
 | 
			
		||||
#ifndef QCD_UTILS_WILSON_LOOPS_H
 | 
			
		||||
#define QCD_UTILS_WILSON_LOOPS_H
 | 
			
		||||
namespace Grid {
 | 
			
		||||
namespace QCD {
 | 
			
		||||
 | 
			
		||||
// Common wilson loop observables
 | 
			
		||||
template<class GaugeLorentz>
 | 
			
		||||
class WilsonLoops {
 | 
			
		||||
template<class Gimpl>
 | 
			
		||||
class WilsonLoops : public Gimpl {
 | 
			
		||||
public:
 | 
			
		||||
  
 | 
			
		||||
  INHERIT_GIMPL_TYPES(Gimpl);
 | 
			
		||||
 | 
			
		||||
  typedef LorentzScalar<GaugeLorentz> GaugeMat;
 | 
			
		||||
  typedef typename Gimpl::GaugeLinkField GaugeMat;
 | 
			
		||||
  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)
 | 
			
		||||
  {
 | 
			
		||||
    plaq=CovShiftForward(U[mu],mu,U[nu])*adj(CovShiftForward(U[nu],nu,U[mu]));
 | 
			
		||||
    // 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])));
 | 
			
		||||
  }
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // trace of directed plaquette oriented in mu,nu plane
 | 
			
		||||
@@ -98,34 +137,36 @@ public:
 | 
			
		||||
    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
 | 
			
		||||
      // |__>  nu
 | 
			
		||||
 | 
			
		||||
      //    __                                         __
 | 
			
		||||
      //      |         |                          
 | 
			
		||||
      //    __|  =    __|                         *
 | 
			
		||||
      //    __ 
 | 
			
		||||
      //      |
 | 
			
		||||
      //    __|
 | 
			
		||||
      //
 | 
			
		||||
 | 
			
		||||
	staple   += CovShiftForward(U[nu],nu,U[mu])*Cshift(adj(U[nu]),mu,+1);
 | 
			
		||||
	staple+=Gimpl::ShiftStaple(
 | 
			
		||||
	        Gimpl::CovShiftForward (U[nu],nu, 
 | 
			
		||||
		Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
		Gimpl::CovShiftIdentityBackward(U[nu],nu))),mu);
 | 
			
		||||
 | 
			
		||||
      //
 | 
			
		||||
      //  __        __                         
 | 
			
		||||
      // |         |                          
 | 
			
		||||
      // |__     = |                              *       __
 | 
			
		||||
      //  __ 
 | 
			
		||||
      // |   
 | 
			
		||||
      // |__ 
 | 
			
		||||
      //
 | 
			
		||||
      //
 | 
			
		||||
	tmp    = CovShiftForward (U[mu],mu,U[nu]);
 | 
			
		||||
	staple+= CovShiftBackward(U[nu],nu,tmp);
 | 
			
		||||
      
 | 
			
		||||
	staple+=Gimpl::ShiftStaple(  
 | 
			
		||||
                Gimpl::CovShiftBackward(U[nu],nu,		  		  
 | 
			
		||||
		Gimpl::CovShiftBackward(U[mu],mu,U[nu])),mu);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -133,21 +174,241 @@ public:
 | 
			
		||||
  //////////////////////////////////////////////////////
 | 
			
		||||
  // Similar to above for rectangle is required
 | 
			
		||||
  //////////////////////////////////////////////////////
 | 
			
		||||
  /*
 | 
			
		||||
void siteRectangle(GaugeMat &plaq,const std::vector<GaugeMat> &U, const int mu, const int nu){
 | 
			
		||||
RealD avgRectangle(const std::vector<GaugeMat> &U){}
 | 
			
		||||
RealD avgRectangle(const std::vector<GaugeMat> &U, const int mu, const int nu){}
 | 
			
		||||
void traceRectangle(LatticeComplex &plaq,const std::vector<GaugeMat> &U, const int mu, const int nu){}
 | 
			
		||||
void siteRectangle(GaugeMat &plaq,const std::vector<GaugeMat> &U, const int mu, const int nu){}
 | 
			
		||||
  */
 | 
			
		||||
  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)
 | 
			
		||||
  {
 | 
			
		||||
    GaugeMat sp(U[0]._grid);
 | 
			
		||||
    dirRectangle(sp,U,mu,nu);
 | 
			
		||||
    rect=trace(sp);
 | 
			
		||||
  }
 | 
			
		||||
  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;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // sum over all x,y,z,t and over all planes of plaquette
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  static RealD sumRectangle(const GaugeLorentz &Umu){
 | 
			
		||||
    std::vector<GaugeMat> U(4,Umu._grid);
 | 
			
		||||
 | 
			
		||||
    for(int mu=0;mu<Nd;mu++){
 | 
			
		||||
      U[mu] = PeekIndex<LorentzIndex>(Umu,mu);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    LatticeComplex Rect(Umu._grid);
 | 
			
		||||
    
 | 
			
		||||
    siteRectangle(Rect,U);
 | 
			
		||||
    
 | 
			
		||||
    TComplex Tp = sum(Rect);
 | 
			
		||||
    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){
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  // the sum over all staples on each site
 | 
			
		||||
  //////////////////////////////////////////////////
 | 
			
		||||
  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,
 | 
			
		||||
  // 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 .
 | 
			
		||||
  ////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  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);
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
	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));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	//              ___ ___
 | 
			
		||||
	//             |    ___|
 | 
			
		||||
	//             |___ ___|
 | 
			
		||||
	//
 | 
			
		||||
 | 
			
		||||
	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 = 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);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static void RectStapleUnoptimised(GaugeMat &Stap,const GaugeLorentz &Umu,int mu){
 | 
			
		||||
    GridBase *grid = Umu._grid;
 | 
			
		||||
 | 
			
		||||
    std::vector<GaugeMat> U(4,grid);
 | 
			
		||||
    for(int d=0;d<Nd;d++){
 | 
			
		||||
      U[d] = PeekIndex<LorentzIndex>(Umu,d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
    //              __ 
 | 
			
		||||
    //          |__ __ |
 | 
			
		||||
 | 
			
		||||
    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::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::CovShiftBackward(U[nu],nu,
 | 
			
		||||
		   Gimpl::CovShiftBackward(U[nu],nu,
 | 
			
		||||
                   Gimpl::CovShiftBackward(U[mu],mu,
 | 
			
		||||
                   Gimpl::CovShiftForward (U[nu],nu,U[nu])))) , mu);
 | 
			
		||||
    }}
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 typedef WilsonLoops<LatticeGaugeField> ColourWilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<LatticeGaugeField> U1WilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<LatticeGaugeField> SU2WilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<LatticeGaugeField> SU3WilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> ColourWilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> U1WilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> SU2WilsonLoops;
 | 
			
		||||
 typedef WilsonLoops<PeriodicGimplR> SU3WilsonLoops;
 | 
			
		||||
 | 
			
		||||
}}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user