#ifndef GRID_QCD_GAUGE_IMPL_H #define GRID_QCD_GAUGE_IMPL_H namespace Grid { namespace QCD { //////////////////////////////////////////////////////////////////////// // Implementation dependent gauge types //////////////////////////////////////////////////////////////////////// template class WilsonLoops; #define INHERIT_GIMPL_TYPES(GImpl) \ typedef typename GImpl::Simd Simd;\ typedef typename GImpl::GaugeLinkField GaugeLinkField;\ typedef typename GImpl::GaugeField GaugeField; // Composition with smeared link, bc's etc.. probably need multiple inheritance // Variable precision "S" and variable Nc template class PeriodicGaugeImpl { public: typedef S Simd; template using iImplGaugeLink = iScalar > >; template using iImplGaugeField = iVector >, Nd >; typedef iImplGaugeLink SiteGaugeLink; typedef iImplGaugeField SiteGaugeField; typedef Lattice GaugeLinkField; // bit ugly naming; polarised gauge field, lorentz... all ugly typedef Lattice GaugeField; //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Support needed for the assembly of loops including all boundary condition effects such as conjugate bcs //////////////////////////////////////////////////////////////////////////////////////////////////////////// template static inline Lattice CovShiftForward (const GaugeLinkField &Link, int mu, const Lattice &field) { return PeriodicBC::CovShiftForward(Link,mu,field); } template static inline Lattice CovShiftBackward(const GaugeLinkField &Link, int mu,const Lattice &field) { return PeriodicBC::CovShiftBackward(Link,mu,field); } static inline GaugeLinkField CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { return Cshift(adj(Link),mu,-1); } static inline GaugeLinkField CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { return Link; } static inline GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { return Cshift(Link,mu,1); } static inline bool isPeriodicGaugeField(void) { return true; } }; // Composition with smeared link, bc's etc.. probably need multiple inheritance // Variable precision "S" and variable Nc template class ConjugateGaugeImpl { public: typedef S Simd; template using iImplGaugeLink = iScalar > >; template using iImplGaugeField = iVector >, Nd >; typedef iImplGaugeLink SiteGaugeLink; typedef iImplGaugeField SiteGaugeField; typedef Lattice GaugeLinkField; // bit ugly naming; polarised gauge field, lorentz... all ugly typedef Lattice GaugeField; //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Support needed for the assembly of loops including all boundary condition effects such as Gparity. //////////////////////////////////////////////////////////////////////////////////////////////////////////// template static Lattice CovShiftForward (const GaugeLinkField &Link, int mu, const Lattice &field) { return GparityBC::CovShiftForward(Link,mu,field); } template static Lattice CovShiftBackward(const GaugeLinkField &Link, int mu,const Lattice &field) { return GparityBC::CovShiftBackward(Link,mu,field); } static inline GaugeLinkField CovShiftIdentityBackward(const GaugeLinkField &Link, int mu) { GridBase *grid = Link._grid; int Lmu = grid->GlobalDimensions()[mu]-1; Lattice > coor(grid); LatticeCoordinate(coor,mu); GaugeLinkField tmp (grid); tmp=adj(Link); tmp = where(coor==Lmu,conjugate(tmp),tmp); return Cshift(tmp,mu,-1);// moves towards positive mu } static inline GaugeLinkField CovShiftIdentityForward(const GaugeLinkField &Link, int mu) { return Link; } static inline GaugeLinkField ShiftStaple(const GaugeLinkField &Link, int mu) { GridBase *grid = Link._grid; int Lmu = grid->GlobalDimensions()[mu]-1; Lattice > coor(grid); LatticeCoordinate(coor,mu); GaugeLinkField tmp (grid); tmp=Cshift(Link,mu,1); tmp=where(coor==Lmu,conjugate(tmp),tmp); return tmp; } static inline bool isPeriodicGaugeField(void) { return false; } }; typedef PeriodicGaugeImpl PeriodicGimplR; // Real.. whichever prec typedef PeriodicGaugeImpl PeriodicGimplF; // Float typedef PeriodicGaugeImpl PeriodicGimplD; // Double typedef ConjugateGaugeImpl ConjugateGimplR; // Real.. whichever prec typedef ConjugateGaugeImpl ConjugateGimplF; // Float typedef ConjugateGaugeImpl ConjugateGimplD; // Double } } #endif