15 typename T::scalar_object tmp;
17 std::cout <<
" Dump "<<s<<
" "<<tmp<<std::endl;
35 std::vector<LatticeLorentzComplex>
masks;
42 const GaugeField& iLambda,
55 GaugeLinkField staple(grid), u_tmp(grid);
56 GaugeLinkField iLambda_mu(grid), iLambda_nu(grid);
57 GaugeLinkField U_mu(grid), U_nu(grid);
58 GaugeLinkField sh_field(grid), temp_Sigma(grid);
59 Real rho_munu, rho_numu;
63 for(
int mu = 0; mu <
Nd; ++mu){
67 for(
int nu = 0; nu <
Nd; ++nu){
75 if ( (mu==mmu)||(nu==mmu) )
81 temp_Sigma = -rho_numu*staple*iLambda_nu;
83 Gimpl::AddLink(SigmaTerm, temp_Sigma, mu);
85 sh_field =
Cshift(iLambda_nu, mu, 1);
87 temp_Sigma = rho_numu*sh_field*staple;
89 Gimpl::AddLink(SigmaTerm, temp_Sigma, mu);
93 sh_field =
Cshift(iLambda_mu, nu, 1);
95 temp_Sigma = -rho_munu*staple*U_nu*sh_field*
adj(U_nu);
97 Gimpl::AddLink(SigmaTerm, temp_Sigma, mu);
101 sh_field =
Cshift(U_nu, mu, 1);
106 temp_Sigma = -rho_munu*
adj(sh_field)*
adj(U_mu)*iLambda_mu*U_nu;
109 temp_Sigma += rho_numu*
adj(sh_field)*
adj(U_mu)*iLambda_nu*U_nu;
111 u_tmp =
adj(U_nu)*iLambda_nu;
112 sh_field =
Cshift(u_tmp, mu, 1);
113 temp_Sigma += -rho_numu*sh_field*
adj(U_mu)*U_nu;
116 sh_field =
Cshift(temp_Sigma, nu, -1);
117 Gimpl::AddLink(SigmaTerm, sh_field, mu);
125 GaugeLinkField tmp_stpl(grid);
128 for(
int nu=0; nu<
Nd; ++nu){
131 WL.
Staple(tmp_stpl,
U, mu, nu);
132 Cup +=
adj(tmp_stpl*rho);
140 GaugeLinkField Fdet_pol(Fdet.Grid());
142 for(
int e=0;e<8;e++){
146 Fdet_pol=Fdet_pol + ci*tmp*te;
152 GaugeLinkField UtaU(PlaqL.Grid());
153 GaugeLinkField D(PlaqL.Grid());
165 for(
int a=0;a<Ngen;a++) {
170 UtaU=
adj(PlaqL)*ta*PlaqR;
177 for(
int c=0;c<Ngen;c++) {
185 for(
int b=0;b<Ngen;b++){
187 tmp =-
trace(ci*tb*D);
196 tmp =
trace(MpInvJx * Dbc_opt);
201 std::cout <<
GridLogPerformance <<
" Compute_MpInvJx_dNxxdSy " << t/1e3 <<
" ms proj "<<tp/1e3<<
" ms"
202 <<
" ta "<<tta/1e3<<
" ms" <<
" poke "<<tpk/1e3<<
" ms"<<std::endl;
207 GaugeLinkField Nx(PlaqL.Grid());
212 for(
int b=0;b<Ngen;b++) {
215 Nx =
Ta(
adj(PlaqL)*tb * PlaqR );
219 for(
int c=0;c<Ngen;c++) {
230 GaugeLinkField Umu(
U.Grid());
231 for(
int mu=0;mu<
Nd;mu++){
247 GaugeField Umsk(grid);
248 std::vector<GaugeLinkField> Umu(
Nd,grid);
249 GaugeLinkField Cmu(grid);
250 GaugeLinkField Zx(grid);
251 GaugeLinkField Nxx(grid);
252 GaugeLinkField Utmp(grid);
253 GaugeLinkField PlaqL(grid);
254 GaugeLinkField PlaqR(grid);
273 for(
int d=0;d<
Nd;d++){
292 for(
int mu=0;mu<4;mu++){
293 for(
int nu=0;nu<4;nu++){
294 if ( mu!=nu) assert(this->
StoutSmearing->SmearRho[idx]==rho);
310 Zx =
Ta(Cmu *
adj(Umu[mu]));
312 std::cout <<
GridLogMessage <<
"Z took "<<time<<
" us"<<std::endl;
317 for(
int b=0;b<8;b++) {
322 cplx = 2.0*
trace(ci*tb*Zx);
323 ZxAd = ZxAd + cplx * TRb;
326 std::cout <<
GridLogMessage <<
"ZxAd took "<<time<<
" us"<<std::endl;
336 for(
int k=1;k<12;k++){
338 kpfac = kpfac /(k+1);
339 JxAd = JxAd + X * kpfac;
342 std::cout <<
GridLogMessage <<
"Jx took "<<time<<
" us"<<std::endl;
349 std::vector<AdjMatrixField> dJdX; dJdX.resize(8,grid);
350 std::vector<AdjMatrix> TRb_s; TRb_s.resize(8);
359 for(
int b=0;b<8;b++){
367 for (
int j = 12; j > 1; --j) {
368 t3 = t2*(1.0 / (j + 1)) + aunit;
370 for(
int b=0;b<8;b++){
371 dJdX[b]= TRb_s[b] * t3 + X * dJdX[b]*(1.0 / (j + 1));
374 for(
int b=0;b<8;b++){
378 std::vector<AdjMatrixField> dJdX; dJdX.
resize(8,grid);
386 for(
int b=0;b<8;b++){
393 for (
int j = 12; j > 1; --j) {
394 t3 = t2*(1.0 / (j + 1)) + aunit;
395 dt3 = dt2*(1.0 / (j + 1));
397 dt2 = TRb * t3 + X * dt3;
403 std::cout <<
GridLogMessage <<
"dJx took "<<time<<
" us"<<std::endl;
409 PlaqR = Utmp*
adj(Cmu);
412 std::cout <<
GridLogMessage <<
"ComputeNxy took "<<time<<
" us"<<std::endl;
418 MpAd = MpAd - JxAd * NxxAd;
426 std::cout <<
GridLogMessage <<
"MpAdInv took "<<time<<
" us"<<std::endl;
439 nMpInv= NxxAd *MpAdInv;
443 MpInvJx = (-1.0)*MpAdInv * JxAd;
449 for(
int e =0 ; e<8 ; e++){
453 tr =
trace(dJdX[e] * nMpInv);
460 dJdXe_nMpInv = dJdXe_nMpInv*tmp;
470 GaugeField Fdet1(grid);
471 GaugeField Fdet2(grid);
472 GaugeLinkField Fdet_pol(grid);
475 for(
int nu=0;nu<
Nd;nu++){
486 PlaqR=(-rho)*Gimpl::CovShiftForward(Umu[nu], nu,
487 Gimpl::CovShiftForward(Umu[mu], mu,
488 Gimpl::CovShiftBackward(Umu[nu], nu,
489 Gimpl::CovShiftIdentityBackward(Utmp, mu))));
491 std::cout <<
GridLogMessage <<
"PlaqLR took "<<time<<
" us"<<std::endl;
494 dJdXe_nMpInv_y = dJdXe_nMpInv;
496 Fdet1_nu =
transpose(Nxy)*dJdXe_nMpInv_y;
498 std::cout <<
GridLogMessage <<
"ComputeNxy (occurs 6x) took "<<time<<
" us"<<std::endl;
505 std::cout <<
GridLogMessage <<
"Compute_MpInvJx_dNxxSy (occurs 6x) took "<<time<<
" us"<<std::endl;
511 PlaqR=(rho)*Gimpl::CovShiftForward(Umu[nu], nu,
512 Gimpl::CovShiftBackward(Umu[mu], mu,
513 Gimpl::CovShiftIdentityBackward(Umu[nu], nu)));
515 PlaqL=Gimpl::CovShiftIdentityBackward(Utmp, mu);
517 dJdXe_nMpInv_y =
Cshift(dJdXe_nMpInv,mu,-1);
519 Fdet1_nu = Fdet1_nu+
transpose(Nxy)*dJdXe_nMpInv_y;
522 MpInvJx_nu =
Cshift(MpInvJx,mu,-1);
524 Fdet2_nu = Fdet2_nu+FdetV;
531 PlaqL=(rho)* Gimpl::CovShiftForward(Umu[mu], mu,
532 Gimpl::CovShiftForward(Umu[nu], nu,
533 Gimpl::CovShiftIdentityBackward(Utmp, mu)));
535 PlaqR = Gimpl::CovShiftIdentityForward(Umu[nu], nu);
537 dJdXe_nMpInv_y =
Cshift(dJdXe_nMpInv,nu,1);
539 Fdet1_nu = Fdet1_nu +
transpose(Nxy)*dJdXe_nMpInv_y;
541 MpInvJx_nu =
Cshift(MpInvJx,nu,1);
543 Fdet2_nu = Fdet2_nu+FdetV;
549 PlaqL=(-rho)*Gimpl::CovShiftForward(Umu[nu], nu,
550 Gimpl::CovShiftIdentityBackward(Utmp, mu));
552 PlaqR=Gimpl::CovShiftBackward(Umu[mu], mu,
553 Gimpl::CovShiftIdentityForward(Umu[nu], nu));
555 dJdXe_nMpInv_y =
Cshift(dJdXe_nMpInv,mu,-1);
556 dJdXe_nMpInv_y =
Cshift(dJdXe_nMpInv_y,nu,1);
559 Fdet1_nu = Fdet1_nu +
transpose(Nxy)*dJdXe_nMpInv_y;
561 MpInvJx_nu =
Cshift(MpInvJx,mu,-1);
562 MpInvJx_nu =
Cshift(MpInvJx_nu,nu,1);
564 Fdet2_nu = Fdet2_nu+FdetV;
579 PlaqL=(-rho)*Gimpl::CovShiftForward(Umu[mu], mu,
580 Gimpl::CovShiftBackward(Umu[nu], nu,
581 Gimpl::CovShiftIdentityBackward(Utmp, mu)));
583 PlaqR=Gimpl::CovShiftIdentityBackward(Umu[nu], nu);
585 dJdXe_nMpInv_y =
Cshift(dJdXe_nMpInv,nu,-1);
588 Fdet1_mu = Fdet1_mu +
transpose(Nxy)*dJdXe_nMpInv_y;
590 MpInvJx_nu =
Cshift(MpInvJx,nu,-1);
593 Fdet2_mu = Fdet2_mu+FdetV;
599 PlaqL=(-rho)*Gimpl::CovShiftForward(Umu[mu], mu,
600 Gimpl::CovShiftForward(Umu[nu], nu,
601 Gimpl::CovShiftIdentityBackward(Utmp, mu)));
603 PlaqR=Gimpl::CovShiftIdentityForward(Umu[nu], nu);
605 dJdXe_nMpInv_y =
Cshift(dJdXe_nMpInv,nu,1);
608 Fdet1_mu = Fdet1_mu +
transpose(Nxy)*dJdXe_nMpInv_y;
610 MpInvJx_nu =
Cshift(MpInvJx,nu,1);
613 Fdet2_mu = Fdet2_mu+FdetV;
619 Fdet1_mu = Fdet1_mu +
transpose(NxxAd)*dJdXe_nMpInv;
624 force= (-0.5)*( Fdet1 + Fdet2);
626 std::cout <<
GridLogMessage <<
" logDetJacobianForce level took "<<t1-t0<<
" us "<<std::endl;
627 std::cout <<
GridLogMessage <<
" logDetJacobianForce t3-t0 "<<t3a-t0<<
" us "<<std::endl;
628 std::cout <<
GridLogMessage <<
" logDetJacobianForce t4-t3 dJdXe_nMpInv "<<t4-t3a<<
" us "<<std::endl;
629 std::cout <<
GridLogMessage <<
" logDetJacobianForce t5-t4 mu nu loop "<<t5-t4<<
" us "<<std::endl;
630 std::cout <<
GridLogMessage <<
" logDetJacobianForce t1-t5 "<<t1-t5<<
" us "<<std::endl;
631 std::cout <<
GridLogMessage <<
" logDetJacobianForce level took "<<t1-t0<<
" us "<<std::endl;
637 GaugeLinkField Nb(grid);
638 GaugeLinkField Z(grid);
639 GaugeLinkField Umu(grid), Cmu(grid);
668 for(
int b=0;b<Ngen;b++) {
671 Nb = (2.0)*
Ta( ci*Tb * Umu *
adj(Cmu));
676 for(
int c=0;c<Ngen;c++) {
678 auto tmp = -
trace(ci*Tc*Nb);
688 Z =
Ta(Cmu *
adj(Umu));
692 for(
int b=0;b<8;b++) {
699 cplx = 2.0*
trace(ci*Tb*Z);
700 Zac = Zac + cplx * TRb;
710 for(
int k=1;k<12;k++){
712 kpfac = kpfac /(k+1);
713 Jac = Jac + X * kpfac;
720 Mab = Mab - Jac * Ncb;
737 ln_det = ln_det * mask;
739 return result.real();
754 double time = (end - start)/ 1e3;
755 std::cout <<
GridLogMessage <<
"GaugeConfigurationMasked: logDetJacobian took " << time <<
" ms" << std::endl;
762 GaugeField force_det(force.Grid());
768 GaugeLinkField tmp_mu(force.Grid());
773 for (
int mu = 0; mu <
Nd; mu++) {
782 for (
int mu = 0; mu <
Nd; mu++) {
792 force = force + force_det;
796 for (
int mu = 0; mu <
Nd; mu++) {
803 for (
int mu = 0; mu <
Nd; mu++) {
812 force = force + force_det;
817 double time = (end - start)/ 1e3;
818 std::cout <<
GridLogMessage <<
"GaugeConfigurationMasked: lnDetJacobianForce took " << time <<
" ms" << std::endl;
831 std::cout <<
GridLogError <<
"[SmearedConfigurationMasked] Error in ThinLinks pointer\n";
835 std::cout <<
GridLogMessage <<
"[SmearedConfigurationMasked] Filling SmearedSet\n";
836 GaugeField previous_u(this->
ThinLinks->Grid());
838 GaugeField smeared_A(this->
ThinLinks->Grid());
839 GaugeField smeared_B(this->
ThinLinks->Grid());
843 for (
int smearLvl = 0; smearLvl < this->
smearingLevels; ++smearLvl)
847 smeared_B = previous_u;
850 this->
SmearedSet[smearLvl] = previous_u-smeared_B + smeared_A;
855 std::cout <<
GridLogMessage <<
"[SmearedConfigurationMasked] smeared Plaq: " << impl_plaq << std::endl;
858 double time = (end - start)/ 1e3;
859 std::cout <<
GridLogMessage <<
"GaugeConfigurationMasked: Link smearing took " << time <<
" ms" << std::endl;
865 const GaugeField& GaugeK,
int level)
868 GaugeField SigmaK(grid), iLambda(grid);
869 GaugeField SigmaKPrimeA(grid);
870 GaugeField SigmaKPrimeB(grid);
871 GaugeLinkField iLambda_mu(grid);
872 GaugeLinkField iQ(grid), e_iQ(grid);
873 GaugeLinkField SigmaKPrime_mu(grid);
874 GaugeLinkField GaugeKmu(grid), Cmu(grid);
876 int mmu= (level/2) %
Nd;
884 SigmaKPrimeA = SigmaKPrime;
886 SigmaKPrimeB = SigmaKPrime - SigmaKPrimeA;
895 iQ =
Ta(Cmu *
adj(GaugeKmu));
896 this->
set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu);
897 pokeLorentz(SigmaK, SigmaKPrime_mu * e_iQ +
adj(Cmu) * iLambda_mu, mu);
910 iQ =
Ta(Cmu *
adj(GaugeKmu));
911 this->
set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu);
912 pokeLorentz(SigmaK, SigmaKPrime_mu * e_iQ +
adj(Cmu) * iLambda_mu, mu);
914 std::cout <<
" mu "<<mu<<
" SigmaKPrime_mu"<<
norm2(SigmaKPrime_mu)<<
" iLambda_mu " <<
norm2(iLambda_mu)<<std::endl;
926 SigmaK = SigmaK+SigmaKPrimeB;
937 assert(Nsmear%(2*
Nd)==0);
973 GaugeField force = SigmaTilde;
974 GaugeLinkField tmp_mu(SigmaTilde.Grid());
977 for (
int mu = 0; mu <
Nd; mu++)
991 for (
int mu = 0; mu <
Nd; mu++)
999 double time = (end - start)/ 1e3;
1000 std::cout <<
GridLogMessage <<
" GaugeConfigurationMasked: Smeared Force chain rule took " << time <<
" ms" << std::endl;
1003 SigmaTilde=Gimpl::projectForce(SigmaTilde);
AcceleratorVector< int, MaxDims > Coordinate
auto Cshift(const Expression &expr, int dim, int shift) -> decltype(closure(expr))
void Dump(const Lattice< T > &lat, std::string s, Coordinate site=Coordinate({0, 0, 0, 0}))
accelerator_inline Grid_simd2< S, V > trace(const Grid_simd2< S, V > &arg)
accelerator_inline Grid_simd< S, V > log(const Grid_simd< S, V > &r)
auto closure(const LatticeUnaryExpression< Op, T1 > &expr) -> Lattice< typename std::remove_const< decltype(expr.op.func(vecEval(0, expr.arg1)))>::type >
void PokeIndex(Lattice< vobj > &lhs, const Lattice< decltype(peekIndex< Index >(vobj(), 0))> &rhs, int i)
auto PeekIndex(const Lattice< vobj > &lhs, int i) -> Lattice< decltype(peekIndex< Index >(vobj(), i))>
vobj::scalar_object peekSite(const Lattice< vobj > &l, const Coordinate &site)
Lattice< vobj > adj(const Lattice< vobj > &lhs)
vobj::scalar_object sum(const vobj *arg, Integer osites)
RealD norm2(const Lattice< vobj > &arg)
Lattice< iScalar< iScalar< iScalar< Vec > > > > Determinant(const Lattice< iScalar< iScalar< iMatrix< Vec, N > > > > &Umu)
Lattice< iScalar< iScalar< iMatrix< vComplexD, N > > > > Inverse(const Lattice< iScalar< iScalar< iMatrix< vComplexD, N > > > > &Umu)
void setCheckerboard(Lattice< vobj > &full, const Lattice< vobj > &half)
void pickCheckerboard(int cb, Lattice< vobj > &half, const Lattice< vobj > &full)
GridLogger GridLogError(1, "Error", GridLogColours, "RED")
GridLogger GridLogPerformance(1, "Performance", GridLogColours, "GREEN")
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
iColourMatrix< Complex > ColourMatrix
void pokeLorentz(Lattice< vobj > &lhs, const Lattice< decltype(peekIndex< LorentzIndex >(vobj(), 0))> &rhs, int i)
Lattice< vTComplexD > LatticeComplexD
Lattice< vLorentzComplex > LatticeLorentzComplex
auto peekColour(const vobj &rhs, int i) -> decltype(PeekIndex< ColourIndex >(rhs, 0))
Lattice< vTComplex > LatticeComplex
void pokeColour(Lattice< vobj > &lhs, const Lattice< decltype(peekIndex< ColourIndex >(vobj(), 0))> &rhs, int i)
auto peekLorentz(const vobj &rhs, int i) -> decltype(PeekIndex< LorentzIndex >(rhs, 0))
std::complex< RealD > ComplexD
std::complex< Real > Complex
accelerator_inline iScalar< vtype > Ta(const iScalar< vtype > &r)
accelerator_inline ComplexD transpose(ComplexD &rhs)
static INTERNAL_PRECISION U
static void LieAlgebraProject(LatticeAlgebraMatrix &out, const LatticeMatrix &in, int b)
static void generator(int lieIndex, iGroupMatrix< cplx > &ta, GroupName::SU)
void resize(uint64_t size)
static void generator(int Index, iSUnAdjointMatrix< cplx > &iAdjTa)
iSUnAdjointMatrix< Complex > AMatrix
Lattice< vAMatrix > LatticeAdjMatrix
static const int Dimension
Lattice< iScalar< iScalar< iVector< vComplex, Dimension > > > > LatticeAdjVector
Stout smearing of link variable.
void ComputeNxy(const GaugeLinkField &PlaqL, const GaugeLinkField &PlaqR, AdjMatrixField &NxAd)
void Compute_MpInvJx_dNxxdSy(const GaugeLinkField &PlaqL, const GaugeLinkField &PlaqR, AdjMatrixField MpInvJx, AdjVectorField &Fdet2)
SU3Adjoint::LatticeAdjVector AdjVectorField
virtual void smeared_force(GaugeField &SigmaTilde)
RealD logDetJacobian(void)
void BaseSmear(GaugeLinkField &Cup, const GaugeField &U, int mu, RealD rho)
virtual GaugeField AnalyticSmearedForce(const GaugeField &SigmaKPrime, const GaugeField &GaugeK, int level)
virtual void fill_smearedSet(GaugeField &U)
INHERIT_GIMPL_TYPES(Gimpl)
RealD logDetJacobianLevel(const GaugeField &U, int smr)
void logDetJacobianForceLevel(const GaugeField &U, GaugeField &force, int smr)
void logDetJacobianForce(GaugeField &force)
void InsertForce(GaugeField &Fdet, AdjVectorField &Fdet_nu, int nu)
void ApplyMask(GaugeField &U, int smr)
SU3Adjoint::LatticeAdjMatrix AdjMatrixField
std::vector< LatticeLorentzComplex > masks
void BaseSmearDerivative(GaugeField &SigmaTerm, const GaugeField &iLambda, const GaugeField &U, int mmu, RealD rho)
SU3Adjoint::AMatrix AdjMatrix
SmearedConfigurationMasked(GridCartesian *_UGrid, unsigned int Nsmear, Smear_Stout< Gimpl > &Stout)
const unsigned int smearingLevels
const GaugeField & get_smeared_conf(int Level) const
Returns smeared configuration at level 'Level'.
Smear_Stout< Gimpl > * StoutSmearing
SmearedConfiguration(GridCartesian *UGrid, unsigned int Nsmear, Smear_Stout< Gimpl > &Stout)
void set_iLambda(GaugeLinkField &iLambda, GaugeLinkField &e_iQ, const GaugeLinkField &iQ, const GaugeLinkField &Sigmap, const GaugeLinkField &GaugeK) const
std::vector< GaugeField > SmearedSet
static GridRedBlackCartesian * makeFourDimRedBlackGrid(const GridCartesian *FourDimGrid)
static RealD avgPlaquette(const GaugeLorentz &Umu)
static void StapleUpper(GaugeMat &staple, const GaugeLorentz &Umu, int mu, int nu)
static void Staple(GaugeMat &staple, const GaugeLorentz &Umu, int mu, int nu)