mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	Adding some wilson loop support
This commit is contained in:
		
							
								
								
									
										20
									
								
								lib/qcd/action/gauge/GaugeActionBase.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								lib/qcd/action/gauge/GaugeActionBase.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					#ifndef QCD_GAUGE_ACTION_BASE
 | 
				
			||||||
 | 
					#define QCD_GAUGE_ACTION_BASE
 | 
				
			||||||
 | 
					namespace Grid {
 | 
				
			||||||
 | 
					namespace QCD{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class GaugeField>
 | 
				
			||||||
 | 
					class GaugeActionBase { // derive this from TermInAction?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  virtual RealD S(const GaugeField &U)                        = 0;  // evaluate the action
 | 
				
			||||||
 | 
					  virtual void  deriv(const GaugeField &U,GaugeField & dSdU ) = 0;  // evaluate the action derivative
 | 
				
			||||||
 | 
					  virtual void  staple(const GaugeField &U,GaugeField & dSdU ) = 0;  // evaluate the action derivative
 | 
				
			||||||
 | 
					  virtual void refresh(const GaugeField & ) {}; 
 | 
				
			||||||
 | 
					  // Boundary conditions?
 | 
				
			||||||
 | 
					  // Heatbath?
 | 
				
			||||||
 | 
					  virtual ~GaugeActionBase() {};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										24
									
								
								lib/qcd/action/gauge/WilsonGaugeAction.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								lib/qcd/action/gauge/WilsonGaugeAction.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					#ifndef QCD_WILSON_GAUGE_ACTION_H
 | 
				
			||||||
 | 
					#define QCD_WILSON_GAUGE_ACTION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Wilson Gauge Action .. should I template the Nc etc..
 | 
				
			||||||
 | 
					////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					template<class GaugeField,class MatrixField>
 | 
				
			||||||
 | 
					class WilsonGaugeAction : public GaugeActionBase<GaugeField> {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  virtual RealD S(const GaugeField &U) {
 | 
				
			||||||
 | 
					    return WilsonLoops<MatrixField,GaugeField>::sumPlaquette(U);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  virtual RealD deriv(GaugeField &U,GaugeField & dSdU ) {
 | 
				
			||||||
 | 
					    WilsonLoops<MatrixField,GaugeField>::Staple(dSdU,U,mu);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  virtual void  staple(const MatrixField &stap,GaugeField & U,int mu ) {
 | 
				
			||||||
 | 
					    WilsonLoops<MatrixField,GaugeField>::Staple(stap,U,mu);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										22
									
								
								lib/qcd/utils/CovariantCshift.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								lib/qcd/utils/CovariantCshift.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					#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, 
 | 
				
			||||||
 | 
														    int mu,
 | 
				
			||||||
 | 
														    const Lattice<covariant> &field)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					}}
 | 
				
			||||||
							
								
								
									
										130
									
								
								lib/qcd/utils/WilsonLoops.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								lib/qcd/utils/WilsonLoops.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,130 @@
 | 
				
			|||||||
 | 
					#ifndef QCD_UTILS_WILSON_LOOPS_H
 | 
				
			||||||
 | 
					#define QCD_UTILS_WILSON_LOOPS_H
 | 
				
			||||||
 | 
					namespace Grid {
 | 
				
			||||||
 | 
					namespace QCD {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Common wilson loop observables
 | 
				
			||||||
 | 
					template<class GaugeMat,class GaugeLorentz>
 | 
				
			||||||
 | 
					class WilsonLoops {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //////////////////////////////////////////////////
 | 
				
			||||||
 | 
					  // 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]));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  //////////////////////////////////////////////////
 | 
				
			||||||
 | 
					  // 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)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    GaugeMat sp(U[0]._grid);
 | 
				
			||||||
 | 
					    dirPlaquette(sp,U,mu,nu);
 | 
				
			||||||
 | 
					    plaq=trace(sp);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  //////////////////////////////////////////////////
 | 
				
			||||||
 | 
					  // sum over all planes of plaquette
 | 
				
			||||||
 | 
					  //////////////////////////////////////////////////
 | 
				
			||||||
 | 
					  static void sitePlaquette(LatticeComplex &Plaq,const std::vector<GaugeMat> &U)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    LatticeComplex sitePlaq(U[0]._grid);
 | 
				
			||||||
 | 
					    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(4,Umu._grid);
 | 
				
			||||||
 | 
					    for(int mu=0;mu<Nd;mu++){
 | 
				
			||||||
 | 
					      U[mu] = peekIndex<LorentzIndex>(Umu,mu);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LatticeComplex Plaq(Umu._grid);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    sitePlaquette(Plaq,U);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    TComplex Tp = sum(Plaq);
 | 
				
			||||||
 | 
					    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){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  //////////////////////////////////////////////////
 | 
				
			||||||
 | 
					  // the sum over all staples on each site
 | 
				
			||||||
 | 
					  //////////////////////////////////////////////////
 | 
				
			||||||
 | 
					  static void Staple(GaugeMat &staple,GaugeLorentz &Umu,int mu){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::vector<GaugeMat> U(4,Umu._grid);
 | 
				
			||||||
 | 
					    for(int d=0;d<Nd;d++){
 | 
				
			||||||
 | 
					      U[d] = peekIndex<LorentzIndex>(Umu,d);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    staple = zero;
 | 
				
			||||||
 | 
					    GaugeMat tmp(U[0]._grid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for(int nu=0;nu<Nd;nu++){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if(nu != mu) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // mu
 | 
				
			||||||
 | 
					      // ^
 | 
				
			||||||
 | 
					      // |__  nu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      //    __                                         __
 | 
				
			||||||
 | 
					      //      |         |                          
 | 
				
			||||||
 | 
					      //    __|  =    __|                         *
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						staple   += CovShiftForward(U[nu],nu,U[mu])*Cshift(adj(U[nu]),mu,+1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					      //  __        __                         
 | 
				
			||||||
 | 
					      // |         |                          
 | 
				
			||||||
 | 
					      // |__     = |                              *       __
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
						tmp    = CovShiftForward (U[mu],mu,U[nu]);
 | 
				
			||||||
 | 
						staple+= CovShiftBackward(U[nu],nu,tmp);
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					  // 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){}
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		Reference in New Issue
	
	Block a user