38template<
class Impl,
class CloverHelpers>
48 const ImplParams& impl_p)
49 :
WilsonBase(_Umu, FiveDimGrid, FiveDimRedBlackGrid, FourDimGrid, FourDimRedBlackGrid, _mass, impl_p)
64 assert(
Nd == 4 &&
Nc == 3 &&
Ns == 4 && Impl::Dimension == 3);
79template<
class Impl,
class CloverHelpers>
85template<
class Impl,
class CloverHelpers>
91template<
class Impl,
class CloverHelpers>
97template<
class Impl,
class CloverHelpers>
103template<
class Impl,
class CloverHelpers>
111template<
class Impl,
class CloverHelpers>
113 out.Checkerboard() = in.Checkerboard();
120template<
class Impl,
class CloverHelpers>
122 out.Checkerboard() = in.Checkerboard();
129template<
class Impl,
class CloverHelpers>
135template<
class Impl,
class CloverHelpers>
141template<
class Impl,
class CloverHelpers>
143 if(in.Grid()->_isCheckerBoarded) {
144 if(in.Checkerboard() ==
Odd) {
155template<
class Impl,
class CloverHelpers>
160template<
class Impl,
class CloverHelpers>
162 if(in.Grid()->_isCheckerBoarded) {
163 if(in.Checkerboard() ==
Odd) {
174template<
class Impl,
class CloverHelpers>
179template<
class Impl,
class CloverHelpers>
184template<
class Impl,
class CloverHelpers>
189template<
class Impl,
class CloverHelpers>
196 GaugeLinkField force_mu(force.Grid()), lambda(force.Grid());
197 GaugeField clover_force(force.Grid());
198 PropagatorField Lambda(force.Grid());
205 std::vector<GaugeLinkField>
U(
Nd, this->
Umu.Grid());
207 Impl::extractLinkField(
U, this->
Umu);
216 Impl::outerProductImpl(Lambda, X, Y);
219 Gamma::Algebra sigma[] = {
220 Gamma::Algebra::SigmaXY,
221 Gamma::Algebra::SigmaXZ,
222 Gamma::Algebra::SigmaXT,
223 Gamma::Algebra::MinusSigmaXY,
224 Gamma::Algebra::SigmaYZ,
225 Gamma::Algebra::SigmaYT,
226 Gamma::Algebra::MinusSigmaXZ,
227 Gamma::Algebra::MinusSigmaYZ,
228 Gamma::Algebra::SigmaZT,
229 Gamma::Algebra::MinusSigmaXT,
230 Gamma::Algebra::MinusSigmaYT,
231 Gamma::Algebra::MinusSigmaZT};
242 clover_force =
Zero();
243 for (
int mu = 0; mu < 4; mu++)
246 for (
int nu = 0; nu < 4; nu++)
252 if (nu == 4 || mu == 4)
254 factor = 2.0 *
csw_t;
258 factor = 2.0 *
csw_r;
260 PropagatorField Slambda =
Gamma(sigma[count]) * Lambda;
261 Impl::TraceSpinImpl(lambda, Slambda);
269 force += clover_force;
272template<
class Impl,
class CloverHelpers>
277template<
class Impl,
class CloverHelpers>
282template<
class Impl,
class CloverHelpers>
285 const CloverDiagonalField& diagonal,
286 const CloverTriangleField& triangle) {
287 assert(in.Checkerboard() ==
Odd || in.Checkerboard() ==
Even);
288 out.Checkerboard() = in.Checkerboard();
293template<
class Impl,
class CloverHelpers>
305 typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid);
306 CloverField TmpOriginal(grid);
307 CloverField TmpInverse(grid);
332 CloverHelpers::InstantiateClover(TmpOriginal, TmpInverse,
csw_t, 4.0 + this->
M5 );
363 std::cout <<
GridLogDebug <<
"CompactWilsonCloverFermion5D::ImportGauge timings:" << std::endl;
364 std::cout <<
GridLogDebug <<
"WilsonFermion::Importgauge = " << (t1 - t0) / 1e6 << std::endl;
365 std::cout <<
GridLogDebug <<
"allocations = " << (t2 - t1) / 1e6 << std::endl;
366 std::cout <<
GridLogDebug <<
"field strength = " << (t3 - t2) / 1e6 << std::endl;
367 std::cout <<
GridLogDebug <<
"fill clover = " << (t4 - t3) / 1e6 << std::endl;
368 std::cout <<
GridLogDebug <<
"instantiate clover = " << (t5 - t4) / 1e6 << std::endl;
369 std::cout <<
GridLogDebug <<
"convert layout = " << (t6 - t5) / 1e6 << std::endl;
370 std::cout <<
GridLogDebug <<
"modify boundaries = " << (t7 - t6) / 1e6 << std::endl;
371 std::cout <<
GridLogDebug <<
"invert clover = " << (t8 - t7) / 1e6 << std::endl;
372 std::cout <<
GridLogDebug <<
"pick cbs = " << (t9 - t8) / 1e6 << std::endl;
373 std::cout <<
GridLogDebug <<
"total = " << (t9 - t0) / 1e6 << std::endl;
void axpy(Lattice< vobj > &ret, sobj a, const Lattice< vobj > &x, const Lattice< vobj > &y)
void pickCheckerboard(int cb, Lattice< vobj > &half, const Lattice< vobj > &full)
GridLogger GridLogDebug(1, "Debug", GridLogColours, "PURPLE")
#define NAMESPACE_BEGIN(A)
void pokeLorentz(Lattice< vobj > &lhs, const Lattice< decltype(peekIndex< LorentzIndex >(vobj(), 0))> &rhs, int i)
static constexpr int DaggerYes
static constexpr int Xdir
static constexpr int Tdir
static constexpr int Zdir
static constexpr int DaggerNo
static constexpr int Ydir
static INTERNAL_PRECISION U
static GaugeLinkField Cmunu(std::vector< GaugeLinkField > &U, GaugeLinkField &lambda, int mu, int nu)
CloverDiagonalField DiagonalEven
CloverDiagonalField DiagonalInv
void MooeeInternal(const FermionField &in, FermionField &out, const CloverDiagonalField &diagonal, const CloverTriangleField &triangle)
CloverDiagonalField DiagonalInvOdd
CloverTriangleField TriangleOdd
CloverTriangleField TriangleInvOdd
CloverTriangleField Triangle
void MdirAll(const FermionField &in, std::vector< FermionField > &out) override
void MooeeInvDag(const FermionField &in, FermionField &out) override
void MooeeInv(const FermionField &in, FermionField &out) override
MaskField BoundaryMaskOdd
void MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) override
void Mdir(const FermionField &in, FermionField &out, int dir, int disp) override
CloverTriangleField TriangleEven
void DhopDir(const FermionField &in, FermionField &out, int dir, int disp) override
CompactWilsonCloverFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, const RealD _mass, const RealD _csw_r=0.0, const RealD _csw_t=0.0, const RealD _cF=1.0, const ImplParams &impl_p=ImplParams())
WilsonFermion5D< Impl > WilsonBase
void MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) override
void Mooee(const FermionField &in, FermionField &out) override
void MeooeDag(const FermionField &in, FermionField &out) override
void M(const FermionField &in, FermionField &out) override
void Dhop(const FermionField &in, FermionField &out, int dag) override
void MooeeDag(const FermionField &in, FermionField &out) override
CloverDiagonalField Diagonal
CloverTriangleField TriangleInv
void ApplyBoundaryMask(Field &f)
void Meooe(const FermionField &in, FermionField &out) override
void Mdag(const FermionField &in, FermionField &out) override
void MDeriv(GaugeField &force, const FermionField &X, const FermionField &Y, int dag) override
CloverDiagonalField DiagonalInvEven
MaskField BoundaryMaskEven
void DhopOE(const FermionField &in, FermionField &out, int dag) override
void ImportGauge(const GaugeField &_Umu) override
CloverTriangleField TriangleInvEven
void DhopEO(const FermionField &in, FermionField &out, int dag) override
void DhopDirAll(const FermionField &in, std::vector< FermionField > &out)
CloverDiagonalField DiagonalOdd
static void ModifyBoundaries(CloverDiagonalField &diagonal, CloverTriangleField &triangle, RealD csw_t, RealD cF, RealD diag_mass)
static void MooeeKernel(int Nsite, int Ls, const FermionField &in, FermionField &out, const CloverDiagonalField &diagonal, const CloverTriangleField &triangle)
static void ConvertLayout(const CloverField &full, CloverDiagonalField &diagonal, CloverTriangleField &triangle)
static void SetupMasks(MaskField &full, MaskField &even, MaskField &odd)
static CloverField fillCloverYZ(const GaugeLinkField &F)
static CloverField fillCloverXT(const GaugeLinkField &F)
static CloverField fillCloverXZ(const GaugeLinkField &F)
static CloverField fillCloverXY(const GaugeLinkField &F)
static CloverField fillCloverZT(const GaugeLinkField &F)
static CloverField fillCloverYT(const GaugeLinkField &F)
void ImportGauge(const GaugeField &_Umu)
virtual void Meooe(const FermionField &in, FermionField &out)
void DhopDir(const FermionField &in, FermionField &out, int dir, int disp)
void DhopDirAll(const FermionField &in, std::vector< FermionField > &out)
virtual void MeooeDag(const FermionField &in, FermionField &out)
virtual void DhopDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
void DhopEO(const FermionField &in, FermionField &out, int dag)
void Dhop(const FermionField &in, FermionField &out, int dag)
void DhopOE(const FermionField &in, FermionField &out, int dag)
static void FieldStrength(GaugeMat &FS, const GaugeLorentz &Umu, int mu, int nu)