37template<
class Impl,
class CloverHelpers>
45 const ImplParams& impl_p)
46 :
WilsonFermion<Impl>(_Umu, Fgrid, Hgrid, _mass, impl_p, clover_anisotropy)
59 if(clover_anisotropy.isAnisotropic) {
60 csw_r = _csw_r * 0.5 / clover_anisotropy.xi_0;
61 diag_mass = _mass + 1.0 + (
Nd - 1) * (clover_anisotropy.nu / clover_anisotropy.xi_0);
69 std::cout <<
GridLogWarning <<
"Initializing WilsonCloverFermion with csw_r = 0" << std::endl;
71 std::cout <<
GridLogWarning <<
"Initializing WilsonCloverFermion with csw_t = 0" << std::endl;
77template<
class Impl,
class CloverHelpers>
80 FermionField temp(out.Grid());
83 out.Checkerboard() = in.Checkerboard();
92template<
class Impl,
class CloverHelpers>
95 FermionField temp(out.Grid());
98 out.Checkerboard() = in.Checkerboard();
107template<
class Impl,
class CloverHelpers>
114 typename Impl::GaugeLinkField Bx(grid), By(grid), Bz(grid), Ex(grid), Ey(grid), Ez(grid);
153 std::cout <<
GridLogDebug <<
"WilsonCloverFermion::ImportGauge timings:" << std::endl;
154 std::cout <<
GridLogDebug <<
"WilsonFermion::Importgauge = " << (t1 - t0) / 1e6 << std::endl;
155 std::cout <<
GridLogDebug <<
"allocations = " << (t2 - t1) / 1e6 << std::endl;
156 std::cout <<
GridLogDebug <<
"field strength = " << (t3 - t2) / 1e6 << std::endl;
157 std::cout <<
GridLogDebug <<
"fill clover = " << (t4 - t3) / 1e6 << std::endl;
158 std::cout <<
GridLogDebug <<
"instantiation = " << (t5 - t4) / 1e6 << std::endl;
159 std::cout <<
GridLogDebug <<
"pick cbs = " << (t6 - t5) / 1e6 << std::endl;
160 std::cout <<
GridLogDebug <<
"total = " << (t6 - t0) / 1e6 << std::endl;
163template<
class Impl,
class CloverHelpers>
169template<
class Impl,
class CloverHelpers>
175template<
class Impl,
class CloverHelpers>
181template<
class Impl,
class CloverHelpers>
187template<
class Impl,
class CloverHelpers>
190 out.Checkerboard() = in.Checkerboard();
192 assert(in.Checkerboard() ==
Odd || in.Checkerboard() ==
Even);
196 if (in.Grid()->_isCheckerBoarded)
198 if (in.Checkerboard() ==
Odd)
216 if (in.Grid()->_isCheckerBoarded)
219 if (in.Checkerboard() ==
Odd)
241template<
class Impl,
class CloverHelpers>
246 GaugeLinkField force_mu(force.Grid()), lambda(force.Grid());
247 GaugeField clover_force(force.Grid());
248 PropagatorField Lambda(force.Grid());
255 std::vector<GaugeLinkField>
U(
Nd, this->
Umu.Grid());
257 Impl::extractLinkField(
U, this->
Umu);
266 Impl::outerProductImpl(Lambda, X, Y);
269 Gamma::Algebra sigma[] = {
270 Gamma::Algebra::SigmaXY,
271 Gamma::Algebra::SigmaXZ,
272 Gamma::Algebra::SigmaXT,
273 Gamma::Algebra::MinusSigmaXY,
274 Gamma::Algebra::SigmaYZ,
275 Gamma::Algebra::SigmaYT,
276 Gamma::Algebra::MinusSigmaXZ,
277 Gamma::Algebra::MinusSigmaYZ,
278 Gamma::Algebra::SigmaZT,
279 Gamma::Algebra::MinusSigmaXT,
280 Gamma::Algebra::MinusSigmaYT,
281 Gamma::Algebra::MinusSigmaZT};
292 clover_force =
Zero();
293 for (
int mu = 0; mu < 4; mu++)
296 for (
int nu = 0; nu < 4; nu++)
302 if (nu == 4 || mu == 4)
304 factor = 2.0 *
csw_t;
308 factor = 2.0 *
csw_r;
310 PropagatorField Slambda =
Gamma(sigma[count]) * Lambda;
311 Impl::TraceSpinImpl(lambda, Slambda);
319 force += clover_force;
323template<
class Impl,
class CloverHelpers>
330template<
class Impl,
class CloverHelpers>
Lattice< vobj > adj(const Lattice< vobj > &lhs)
void pickCheckerboard(int cb, Lattice< vobj > &half, const Lattice< vobj > &full)
GridLogger GridLogDebug(1, "Debug", GridLogColours, "PURPLE")
GridLogger GridLogWarning(1, "Warning", GridLogColours, "YELLOW")
#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 constexpr int InverseNo
static constexpr int InverseYes
static INTERNAL_PRECISION U
static GaugeLinkField Cmunu(std::vector< GaugeLinkField > &U, GaugeLinkField &lambda, int mu, int nu)
static void Instantiate(CloverField &CloverTerm, CloverField &CloverTermInv, RealD csw_t, RealD diag_mass)
CloverField CloverTermDagEven
virtual void MooeeInternal(const FermionField &in, FermionField &out, int dag, int inv)
virtual void MeeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
CloverField CloverTermInvDagEven
virtual void MooeeInv(const FermionField &in, FermionField &out)
WilsonCloverFermion(GaugeField &_Umu, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, const RealD _mass, const RealD _csw_r=0.0, const RealD _csw_t=0.0, const WilsonAnisotropyCoefficients &clover_anisotropy=WilsonAnisotropyCoefficients(), const ImplParams &impl_p=ImplParams())
void MDeriv(GaugeField &force, const FermionField &X, const FermionField &Y, int dag)
virtual void Mdag(const FermionField &in, FermionField &out)
virtual void Mooee(const FermionField &in, FermionField &out)
CloverField CloverTermInvOdd
virtual void M(const FermionField &in, FermionField &out)
virtual void MooeeInvDag(const FermionField &in, FermionField &out)
CloverField CloverTermInvDagOdd
void ImportGauge(const GaugeField &_Umu)
CloverField CloverTermInv
CloverField CloverTermDagOdd
virtual void MooDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
CloverField CloverTermInvEven
CloverField CloverTermOdd
CloverField CloverTermEven
virtual void MooeeDag(const FermionField &in, FermionField &out)
static CloverField fillCloverYZ(const GaugeLinkField &F)
void multCloverField(_SpinorField &out, const CloverField &C, const _SpinorField &phi)
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)
WilsonFermion(GaugeField &_Umu, GridCartesian &Fgrid, GridRedBlackCartesian &Hgrid, RealD _mass, const ImplParams &p=ImplParams(), const WilsonAnisotropyCoefficients &anis=WilsonAnisotropyCoefficients())
void Dhop(const FermionField &in, FermionField &out, int dag)
void ImportGauge(const GaugeField &_Umu)
void DhopDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
static void FieldStrength(GaugeMat &FS, const GaugeLorentz &Umu, int mu, int nu)