diff --git a/Grid/qcd/utils/GaugeFix.h b/Grid/qcd/utils/GaugeFix.h index 2b0cd7f2..67f84f14 100644 --- a/Grid/qcd/utils/GaugeFix.h +++ b/Grid/qcd/utils/GaugeFix.h @@ -31,6 +31,7 @@ Author: Peter Boyle namespace Grid { namespace QCD { + template class FourierAcceleratedGaugeFixer : public Gimpl { public: @@ -45,18 +46,21 @@ class FourierAcceleratedGaugeFixer : public Gimpl { A[mu] = Ta(U[mu]) * cmi; } } - static void DmuAmu(const std::vector &A,GaugeMat &dmuAmu) { + static void DmuAmu(const std::vector &A,GaugeMat &dmuAmu,int orthog) { dmuAmu=zero; for(int mu=0;mu::avgPlaquette(Umu); + Real link_trace=WilsonLoops::linkTrace(Umu); + if( (orthog>=0) && (orthog(Umu,U[mu],mu); // Monitor progress and convergence test // infrequently to minimise cost overhead @@ -106,14 +124,14 @@ class FourierAcceleratedGaugeFixer : public Gimpl { } } }; - static Real SteepestDescentStep(std::vector &U,GaugeMat &xform,Real & alpha, GaugeMat & dmuAmu) { + static Real SteepestDescentStep(std::vector &U,GaugeMat &xform,Real & alpha, GaugeMat & dmuAmu,int orthog) { GridBase *grid = U[0]._grid; std::vector A(Nd,grid); GaugeMat g(grid); GaugeLinkToLieAlgebraField(U,A); - ExpiAlphaDmuAmu(A,g,alpha,dmuAmu); + ExpiAlphaDmuAmu(A,g,alpha,dmuAmu,orthog); Real vol = grid->gSites(); @@ -125,7 +143,7 @@ class FourierAcceleratedGaugeFixer : public Gimpl { return trG; } - static Real FourierAccelSteepestDescentStep(std::vector &U,GaugeMat &xform,Real & alpha, GaugeMat & dmuAmu) { + static Real FourierAccelSteepestDescentStep(std::vector &U,GaugeMat &xform,Real & alpha, GaugeMat & dmuAmu,int orthog) { GridBase *grid = U[0]._grid; @@ -144,31 +162,41 @@ class FourierAcceleratedGaugeFixer : public Gimpl { GaugeLinkToLieAlgebraField(U,A); - DmuAmu(A,dmuAmu); + DmuAmu(A,dmuAmu,orthog); - theFFT.FFT_all_dim(dmuAmu_p,dmuAmu,FFT::forward); + std::vector mask(Nd,1); + for(int mu=0;mu latt_size = grid->GlobalDimensions(); std::vector coor(grid->_ndimension,0); for(int mu=0;mu=0) && (orthogGlobalDimensions()[orthog];t++){ + coor[orthog]=t; + pokeSite(TComplex(16.0),Fp,coor); + } + } + dmuAmu_p = dmuAmu_p * Fp; - theFFT.FFT_all_dim(dmuAmu,dmuAmu_p,FFT::backward); + theFFT.FFT_dim_mask(dmuAmu,dmuAmu_p,mask,FFT::backward); GaugeMat ciadmam(grid); Complex cialpha(0.0,-alpha); @@ -183,11 +211,11 @@ class FourierAcceleratedGaugeFixer : public Gimpl { return trG; } - static void ExpiAlphaDmuAmu(const std::vector &A,GaugeMat &g,Real & alpha, GaugeMat &dmuAmu) { + static void ExpiAlphaDmuAmu(const std::vector &A,GaugeMat &g,Real & alpha, GaugeMat &dmuAmu,int orthog) { GridBase *grid = g._grid; Complex cialpha(0.0,-alpha); GaugeMat ciadmam(grid); - DmuAmu(A,dmuAmu); + DmuAmu(A,dmuAmu,orthog); ciadmam = dmuAmu*cialpha; SU::taExp(ciadmam,g); } diff --git a/tests/core/Test_fft_gfix.cc b/tests/core/Test_fft_gfix.cc index 7fdf5f73..4eb6887d 100644 --- a/tests/core/Test_fft_gfix.cc +++ b/tests/core/Test_fft_gfix.cc @@ -60,6 +60,9 @@ int main (int argc, char ** argv) std::cout<< "* Testing we can gauge fix steep descent a RGT of Unit gauge *" <::avgPlaquette(Umu); std::cout << " Final plaquette "<::avgPlaquette(Umu); + std::cout << " Initial plaquette "<::SteepestDescentGaugeFix(Umu,xform3,alpha,10000,1.0e-12, 1.0e-12,true,coulomb_dir); + + std::cout << Umu<::avgPlaquette(Umu); + std::cout << " Final plaquette "<