63 CloverTerm += diag_mass;
66 int DimRep = Impl::Dimension;
73 Eigen::MatrixXcd EigenCloverOp = Eigen::MatrixXcd::Zero(
Ns * DimRep,
Ns * DimRep);
74 Eigen::MatrixXcd EigenInvCloverOp = Eigen::MatrixXcd::Zero(
Ns * DimRep,
Ns * DimRep);
75 typename SiteClover::scalar_object Qx =
Zero(), Qxinv =
Zero();
78 for (
int j = 0; j <
Ns; j++)
79 for (
int k = 0; k <
Ns; k++)
80 for (
int a = 0; a < DimRep; a++)
81 for (
int b = 0; b < DimRep; b++){
82 auto zz = Qx()(j, k)(a, b);
83 EigenCloverOp(a + j * DimRep, b + k * DimRep) = std::complex<double>(zz);
86 EigenInvCloverOp = EigenCloverOp.inverse();
87 for (
int j = 0; j <
Ns; j++)
88 for (
int k = 0; k <
Ns; k++)
89 for (
int a = 0; a < DimRep; a++)
90 for (
int b = 0; b < DimRep; b++)
91 Qxinv()(j, k)(a, b) = EigenInvCloverOp(a + j * DimRep, b + k * DimRep);
97 static GaugeLinkField
Cmunu(std::vector<GaugeLinkField> &
U, GaugeLinkField &lambda,
int mu,
int nu) {
120 int DimRep = Impl::Dimension;
125 for (int sa=0; sa<Ns; sa++)
126 for (int ca=0; ca<DimRep; ca++)
127 in_v[ss]()(sa,sa)(ca,ca) = c;
136 while (cond*std::exp(R)>prec) {
138 cond*=R/(double)(NMAX+1);
149 CloverField ExpClover(grid);
151 int NMAX =
getNMAX(Clover, 3.*csw_t/diag_mass);
153 Clover *= (1.0/diag_mass);
159 std::vector<RealD> cn(NMAX+1);
161 for (
int i=1; i<=NMAX; i++)
162 cn[i] = cn[i-1] /
RealD(i);
166 for (
int i=NMAX-1; i>=0; i--)
167 ExpClover = ExpClover * Clover + cn[i];
170 CloverInv = (-1.0)*Clover;
172 Clover = ExpClover * diag_mass;
176 for (
int i=NMAX-1; i>=0; i--)
177 ExpClover = ExpClover * CloverInv + cn[i];
179 CloverInv = ExpClover * (1.0/diag_mass);
183 static GaugeLinkField
Cmunu(std::vector<GaugeLinkField> &
U, GaugeLinkField &lambda,
int mu,
int nu) {
213 const CloverDiagonalField& diagonal,
214 const CloverTriangleField& triangle,
215 CloverDiagonalField& diagonalInv,
216 CloverTriangleField& triangleInv,
217 bool fixedBoundaries) {
224 static GaugeLinkField
Cmunu(std::vector<GaugeLinkField> &
U, GaugeLinkField &lambda,
int mu,
int nu) {
246 int DimRep = Impl::Dimension;
251 for (int sa=0; sa<Ns; sa++)
252 for (int ca=0; ca<DimRep; ca++)
253 in_v[ss]()(sa,sa)(ca,ca) = c;
262 while (cond*std::exp(R)>prec) {
264 cond*=R/(double)(NMAX+1);
275 CloverField ExpClover(grid);
277 int NMAX =
getNMAX(Clover, 3.*csw_t/diag_mass);
279 Clover *= (1.0/diag_mass);
285 std::vector<RealD> cn(NMAX+1);
287 for (
int i=1; i<=NMAX; i++)
288 cn[i] = cn[i-1] /
RealD(i);
292 for (
int i=NMAX-1; i>=0; i--)
293 ExpClover = ExpClover * Clover + cn[i];
296 CloverInv = (-1.0)*Clover;
298 Clover = ExpClover * diag_mass;
302 for (
int i=NMAX-1; i>=0; i--)
303 ExpClover = ExpClover * CloverInv + cn[i];
305 CloverInv = ExpClover * (1.0/diag_mass);
310 const CloverDiagonalField& diagonal,
311 const CloverTriangleField& triangle,
312 CloverDiagonalField& diagonalInv,
313 CloverTriangleField& triangleInv,
314 bool fixedBoundaries) {
326 static GaugeLinkField
Cmunu(std::vector<GaugeLinkField> &
U, GaugeLinkField &lambda,
int mu,
int nu) {
#define accelerator_for(iterator, num, nsimd,...)
AcceleratorVector< int, MaxDims > Coordinate
void peekLocalSite(sobj &s, const LatticeView< vobj > &l, Coordinate &site)
void pokeLocalSite(const sobj &s, LatticeView< vobj > &l, Coordinate &site)
#define autoView(l_v, l, mode)
#define NAMESPACE_BEGIN(A)
#define thread_for(i, num,...)
static INTERNAL_PRECISION U
static GaugeLinkField Cmunu(std::vector< GaugeLinkField > &U, GaugeLinkField &lambda, int mu, int nu)
INHERIT_CLOVER_TYPES(Impl)
static void Instantiate(CloverField &CloverTerm, CloverField &CloverTermInv, RealD csw_t, RealD diag_mass)
WilsonCloverHelpers< Impl > Helpers
CompactWilsonCloverHelpers< Impl > CompactHelpers
static void InstantiateClover(CloverField &Clover, CloverField &CloverInv, RealD csw_t, RealD diag_mass)
static GaugeLinkField Cmunu(std::vector< GaugeLinkField > &U, GaugeLinkField &lambda, int mu, int nu)
INHERIT_CLOVER_TYPES(Impl)
static void InvertClover(CloverField &InvClover, const CloverDiagonalField &diagonal, const CloverTriangleField &triangle, CloverDiagonalField &diagonalInv, CloverTriangleField &triangleInv, bool fixedBoundaries)
WilsonCloverHelpers< Impl > Helpers
INHERIT_COMPACT_CLOVER_TYPES(Impl)
iScalar< iMatrix< iMatrix< vtype, Impl::Dimension >, Ns > > iImplClover
INHERIT_CLOVER_TYPES(Impl)
CompactWilsonCloverHelpers< Impl > CompactHelpers
static int getNMAX(Lattice< iImplClover< vComplexF > > &t, RealD R)
static GaugeLinkField Cmunu(std::vector< GaugeLinkField > &U, GaugeLinkField &lambda, int mu, int nu)
static void InvertClover(CloverField &InvClover, const CloverDiagonalField &diagonal, const CloverTriangleField &triangle, CloverDiagonalField &diagonalInv, CloverTriangleField &triangleInv, bool fixedBoundaries)
static int getNMAX(Lattice< iImplClover< vComplexD > > &t, RealD R)
static int getNMAX(RealD prec, RealD R)
static void IdentityTimesC(const CloverField &in, RealD c)
static void InstantiateClover(CloverField &Clover, CloverField &CloverInv, RealD csw_t, RealD diag_mass)
INHERIT_COMPACT_CLOVER_TYPES(Impl)
static void Invert(const CloverDiagonalField &diagonal, const CloverTriangleField &triangle, CloverDiagonalField &diagonalInv, CloverTriangleField &triangleInv)
static void ConvertLayout(const CloverField &full, CloverDiagonalField &diagonal, CloverTriangleField &triangle)
static void Instantiate(CloverField &Clover, CloverField &CloverInv, RealD csw_t, RealD diag_mass)
INHERIT_CLOVER_TYPES(Impl)
static int getNMAX(RealD prec, RealD R)
static int getNMAX(Lattice< iImplClover< vComplexD > > &t, RealD R)
static int getNMAX(Lattice< iImplClover< vComplexD2 > > &t, RealD R)
WilsonCloverHelpers< Impl > Helpers
static int getNMAX(Lattice< iImplClover< vComplexF > > &t, RealD R)
static GaugeLinkField Cmunu(std::vector< GaugeLinkField > &U, GaugeLinkField &lambda, int mu, int nu)
static void IdentityTimesC(const CloverField &in, RealD c)
iScalar< iMatrix< iMatrix< vtype, Impl::Dimension >, Ns > > iImplClover
void LocalIndexToLocalCoor(int lidx, Coordinate &lcoor)
static GaugeLinkField Cmunu(std::vector< GaugeLinkField > &U, GaugeLinkField &lambda, int mu, int nu)