diff --git a/lib/qcd/action/gauge/PlaqPlusRectangleAction.h b/lib/qcd/action/gauge/PlaqPlusRectangleAction.h new file mode 100644 index 00000000..82e21aed --- /dev/null +++ b/lib/qcd/action/gauge/PlaqPlusRectangleAction.h @@ -0,0 +1,98 @@ +#ifndef QCD_PLAQ_PLUS_RECTANGLE_ACTION_H +#define QCD_PLAQ_PLUS_RECTANGLE_ACTION_H + +namespace Grid{ + namespace QCD{ + + //////////////////////////////////////////////////////////////////////// + // PlaqPlusRectangleActoin + //////////////////////////////////////////////////////////////////////// + template + class PlaqPlusRectangleAction : public Action { + public: + + typedef LorentzScalar GaugeLinkField; + + private: + RealD c_plaq; + RealD c_rect; + + public: + PlaqPlusRectangleAction(RealD b,RealD c): c_plaq(b),c_rect(c){}; + + virtual void refresh(const GaugeField &U, GridParallelRNG& pRNG) {}; // noop as no pseudoferms + + virtual RealD S(const GaugeField &U) { + RealD vol = U._grid->gSites(); + + RealD plaq = WilsonLoops::avgPlaquette(U); + RealD rect = WilsonLoops::avgRectangle(U); + + RealD action=c_plaq*(1.0 -plaq)*(Nd*(Nd-1.0))*vol*0.5 + +c_rect*(1.0 -rect)*(Nd*(Nd-1.0))*vol; + + return action; + }; + + virtual void deriv(const GaugeField &U,GaugeField & dSdU) { + //extend Ta to include Lorentz indexes + RealD factor_p = c_plaq/RealD(Nc)*0.5; + RealD factor_r = c_rect/RealD(Nc)*0.5; + + GaugeLinkField Umu(U._grid); + GaugeLinkField dSdU_mu(U._grid); + GaugeLinkField staple(U._grid); + for (int mu=0; mu < Nd; mu++){ + + Umu = PeekIndex(U,mu); + + // Staple in direction mu + WilsonLoops::Staple(staple,U,mu); + dSdU_mu = Ta(Umu*staple)*factor_p; + + WilsonLoops::RectStaple(staple,U,mu); + dSdU_mu = dSdU_mu + Ta(Umu*staple)*factor_r; + + PokeIndex(dSdU, dSdU_mu, mu); + + } + }; + }; + + // Convenience for common physically defined cases. + // + // RBC c1 parameterisation is not really RBC but don't have good + // reference and we are happy to change name if prior use of this plaq coeff + // parameterisation is made known to us. + template + class RBCGaugeAction : public PlaqPlusRectangleAction { + public: + RBCGaugeAction(RealD beta,RealD c1) : PlaqPlusRectangleAction(beta*(1.0-8.0*c1), beta*c1) { + }; + }; + + template + class IwasakiGaugeAction : public RBCGaugeAction { + public: + IwasakiGaugeAction(RealD beta) : RBCGaugeAction(beta,-0.331) { + }; + }; + + template + class SymanzikGaugeAction : public RBCGaugeAction { + public: + SymanzikGaugeAction(RealD beta) : RBCGaugeAction(beta,-1.0/12.0) { + }; + }; + + template + class DBW2GaugeAction : public RBCGaugeAction { + public: + DBW2GaugeAction(RealD beta) : RBCGaugeAction(beta,-1.4067) { + }; + }; + + } +} + +#endif