37template<
class Impl,
class CloverHelpers>
46 const ImplParams& impl_p)
47 :
WilsonBase(_Umu, Fgrid, Hgrid, _mass, impl_p, clover_anisotropy)
62 assert(
Nd == 4 &&
Nc == 3 &&
Ns == 4 && Impl::Dimension == 3);
66 if (clover_anisotropy.isAnisotropic)
67 csw_r /= clover_anisotropy.xi_0;
77template<
class Impl,
class CloverHelpers>
83template<
class Impl,
class CloverHelpers>
89template<
class Impl,
class CloverHelpers>
95template<
class Impl,
class CloverHelpers>
101template<
class Impl,
class CloverHelpers>
109template<
class Impl,
class CloverHelpers>
111 out.Checkerboard() = in.Checkerboard();
118template<
class Impl,
class CloverHelpers>
120 out.Checkerboard() = in.Checkerboard();
127template<
class Impl,
class CloverHelpers>
133template<
class Impl,
class CloverHelpers>
139template<
class Impl,
class CloverHelpers>
141 if(in.Grid()->_isCheckerBoarded) {
142 if(in.Checkerboard() ==
Odd) {
153template<
class Impl,
class CloverHelpers>
158template<
class Impl,
class CloverHelpers>
160 if(in.Grid()->_isCheckerBoarded) {
161 if(in.Checkerboard() ==
Odd) {
172template<
class Impl,
class CloverHelpers>
177template<
class Impl,
class CloverHelpers>
182template<
class Impl,
class CloverHelpers>
187template<
class Impl,
class CloverHelpers>
194 GaugeLinkField force_mu(force.Grid()), lambda(force.Grid());
195 GaugeField clover_force(force.Grid());
196 PropagatorField Lambda(force.Grid());
203 std::vector<GaugeLinkField>
U(
Nd, this->
Umu.Grid());
205 Impl::extractLinkField(
U, this->
Umu);
214 Impl::outerProductImpl(Lambda, X, Y);
217 Gamma::Algebra sigma[] = {
218 Gamma::Algebra::SigmaXY,
219 Gamma::Algebra::SigmaXZ,
220 Gamma::Algebra::SigmaXT,
221 Gamma::Algebra::MinusSigmaXY,
222 Gamma::Algebra::SigmaYZ,
223 Gamma::Algebra::SigmaYT,
224 Gamma::Algebra::MinusSigmaXZ,
225 Gamma::Algebra::MinusSigmaYZ,
226 Gamma::Algebra::SigmaZT,
227 Gamma::Algebra::MinusSigmaXT,
228 Gamma::Algebra::MinusSigmaYT,
229 Gamma::Algebra::MinusSigmaZT};
240 clover_force =
Zero();
241 for (
int mu = 0; mu < 4; mu++)
244 for (
int nu = 0; nu < 4; nu++)
250 if (nu == 4 || mu == 4)
252 factor = 2.0 *
csw_t;
256 factor = 2.0 *
csw_r;
258 PropagatorField Slambda =
Gamma(sigma[count]) * Lambda;
259 Impl::TraceSpinImpl(lambda, Slambda);
267 force += clover_force;
270template<
class Impl,
class CloverHelpers>
275template<
class Impl,
class CloverHelpers>
280template<
class Impl,
class CloverHelpers>
283 const CloverDiagonalField& diagonal,
284 const CloverTriangleField& triangle) {
285 assert(in.Checkerboard() ==
Odd || in.Checkerboard() ==
Even);
286 out.Checkerboard() = in.Checkerboard();
294template<
class Impl,
class CloverHelpers>
306 typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid);
307 CloverField TmpOriginal(grid);
308 CloverField TmpInverse(grid);
333 CloverHelpers::InstantiateClover(TmpOriginal, TmpInverse,
csw_t, this->
diag_mass);
364 std::cout <<
GridLogDebug <<
"CompactWilsonCloverFermion::ImportGauge timings:" << std::endl;
365 std::cout <<
GridLogDebug <<
"WilsonFermion::Importgauge = " << (t1 - t0) / 1e6 << std::endl;
366 std::cout <<
GridLogDebug <<
"allocations = " << (t2 - t1) / 1e6 << std::endl;
367 std::cout <<
GridLogDebug <<
"field strength = " << (t3 - t2) / 1e6 << std::endl;
368 std::cout <<
GridLogDebug <<
"fill clover = " << (t4 - t3) / 1e6 << std::endl;
369 std::cout <<
GridLogDebug <<
"instantiate clover = " << (t5 - t4) / 1e6 << std::endl;
370 std::cout <<
GridLogDebug <<
"convert layout = " << (t6 - t5) / 1e6 << std::endl;
371 std::cout <<
GridLogDebug <<
"modify boundaries = " << (t7 - t6) / 1e6 << std::endl;
372 std::cout <<
GridLogDebug <<
"invert clover = " << (t8 - t7) / 1e6 << std::endl;
373 std::cout <<
GridLogDebug <<
"pick cbs = " << (t9 - t8) / 1e6 << std::endl;
374 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)
void Mdag(const FermionField &in, FermionField &out) override
void Mdir(const FermionField &in, FermionField &out, int dir, int disp) override
void MeooeDag(const FermionField &in, FermionField &out) override
CloverTriangleField TriangleInvOdd
MaskField BoundaryMaskOdd
void Dhop(const FermionField &in, FermionField &out, int dag) override
void MDeriv(GaugeField &force, const FermionField &X, const FermionField &Y, int dag) override
void ApplyBoundaryMask(Field &f)
CloverTriangleField TriangleInvEven
void MdirAll(const FermionField &in, std::vector< FermionField > &out) override
void DhopEO(const FermionField &in, FermionField &out, int dag) override
void M(const FermionField &in, FermionField &out) override
CloverTriangleField TriangleInv
WilsonFermion< Impl > WilsonBase
void MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) override
void MooeeInternal(const FermionField &in, FermionField &out, const CloverDiagonalField &diagonal, const CloverTriangleField &triangle)
void ImportGauge(const GaugeField &_Umu) override
CloverDiagonalField DiagonalInv
void MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag) override
CloverTriangleField TriangleEven
void DhopDirAll(const FermionField &in, std::vector< FermionField > &out)
CloverDiagonalField Diagonal
CloverTriangleField TriangleOdd
void DhopOE(const FermionField &in, FermionField &out, int dag) override
CloverDiagonalField DiagonalInvOdd
void MooeeInv(const FermionField &in, FermionField &out) override
CloverTriangleField Triangle
void MooeeInvDag(const FermionField &in, FermionField &out) override
CloverDiagonalField DiagonalOdd
void Meooe(const FermionField &in, FermionField &out) override
void DhopDir(const FermionField &in, FermionField &out, int dir, int disp) override
void MooeeDag(const FermionField &in, FermionField &out) override
CompactWilsonCloverFermion(GaugeField &_Umu, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, const RealD _mass, const RealD _csw_r=0.0, const RealD _csw_t=0.0, const RealD _cF=1.0, const WilsonAnisotropyCoefficients &clover_anisotropy=WilsonAnisotropyCoefficients(), const ImplParams &impl_p=ImplParams())
void Mooee(const FermionField &in, FermionField &out) override
MaskField BoundaryMaskEven
CloverDiagonalField DiagonalEven
CloverDiagonalField DiagonalInvEven
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 MeooeDag(const FermionField &in, FermionField &out)
void DhopOE(const FermionField &in, FermionField &out, int dag)
void Meooe(const FermionField &in, FermionField &out)
void Dhop(const FermionField &in, FermionField &out, int dag)
void ImportGauge(const GaugeField &_Umu)
void DhopDir(const FermionField &in, FermionField &out, int dir, int disp)
void DhopDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
void DhopDirAll(const FermionField &in, std::vector< FermionField > &out)
void DhopEO(const FermionField &in, FermionField &out, int dag)
static void FieldStrength(GaugeMat &FS, const GaugeLorentz &Umu, int mu, int nu)