mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	PauliVillars based 4D -> 5D reconstruction with Fourier Accelerated PV inverse
by Christoph. Differs from the one by Rudy in BFM since it vectorises the twisted 4D solves in pairs.
This commit is contained in:
		@@ -1,5 +1,4 @@
 | 
			
		||||
    /*************************************************************************************
 | 
			
		||||
 | 
			
		||||
    Grid physics library, www.github.com/paboyle/Grid 
 | 
			
		||||
 | 
			
		||||
    Source file: ./tests/Test_cayley_cg.cc
 | 
			
		||||
@@ -27,6 +26,7 @@ Author: paboyle <paboyle@ph.ed.ac.uk>
 | 
			
		||||
    *************************************************************************************/
 | 
			
		||||
    /*  END LEGAL */
 | 
			
		||||
#include <Grid/Grid.h>
 | 
			
		||||
#include <Grid/qcd/action/fermion/Reconstruct5Dprop.h>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace Grid;
 | 
			
		||||
@@ -46,6 +46,7 @@ struct scal {
 | 
			
		||||
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestCGinversions(What & Ddwf, 
 | 
			
		||||
		       LatticeGaugeField &Umu,
 | 
			
		||||
		       GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
		       GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
		       RealD mass, RealD M5,
 | 
			
		||||
@@ -75,6 +76,24 @@ void  TestCGprec(What & Ddwf,
 | 
			
		||||
		 GridParallelRNG *RNG4,
 | 
			
		||||
		 GridParallelRNG *RNG5);
 | 
			
		||||
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestReconstruct5D(What & Ddwf, 
 | 
			
		||||
			LatticeGaugeField &Umu,
 | 
			
		||||
			GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
			GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
			RealD mass, RealD M5,
 | 
			
		||||
			GridParallelRNG *RNG4,
 | 
			
		||||
			GridParallelRNG *RNG5);
 | 
			
		||||
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestReconstruct5DFA(What & Ddwf, 
 | 
			
		||||
			  LatticeGaugeField &Umu,
 | 
			
		||||
			  GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
			  GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
			  RealD mass, RealD M5,
 | 
			
		||||
			  GridParallelRNG *RNG4,
 | 
			
		||||
			  GridParallelRNG *RNG5);
 | 
			
		||||
 | 
			
		||||
int main (int argc, char ** argv)
 | 
			
		||||
{
 | 
			
		||||
  Grid_init(&argc,&argv);
 | 
			
		||||
@@ -100,46 +119,71 @@ int main (int argc, char ** argv)
 | 
			
		||||
 | 
			
		||||
  RealD mass=0.1;
 | 
			
		||||
  RealD M5  =1.8;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"DomainWallFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  DomainWallFermionR Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
 | 
			
		||||
  TestCGinversions<DomainWallFermionR>(Ddwf,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<DomainWallFermionR>(Ddwf,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<DomainWallFermionR>(Ddwf,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  RealD b=1.5;// Scale factor b+c=2, b-c=1
 | 
			
		||||
  RealD c=0.5;
 | 
			
		||||
  std::vector<ComplexD> gamma(Ls,ComplexD(1.0,0.0));
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"MobiusFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  MobiusFermionR Dmob(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c);
 | 
			
		||||
  TestCGinversions<MobiusFermionR>(Dmob,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<MobiusFermionR>(Dmob,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<MobiusFermionR>(Dmob,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"ZMobiusFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  ZMobiusFermionR ZDmob(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,gamma,b,c);
 | 
			
		||||
  TestCGinversions<ZMobiusFermionR>(ZDmob,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<ZMobiusFermionR>(ZDmob,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5D<ZMobiusFermionR>(ZDmob,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"MobiusZolotarevFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  MobiusZolotarevFermionR Dzolo(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c,0.1,2.0);
 | 
			
		||||
  TestCGinversions<MobiusZolotarevFermionR>(Dzolo,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<MobiusZolotarevFermionR>(Dzolo,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5D<MobiusZolotarevFermionR>(Dzolo,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"ScaledShamirFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  ScaledShamirFermionR Dsham(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,2.0);
 | 
			
		||||
  TestCGinversions<ScaledShamirFermionR>(Dsham,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<ScaledShamirFermionR>(Dsham,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<ScaledShamirFermionR>(Dsham,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"ShamirZolotarevFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  ShamirZolotarevFermionR Dshamz(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,0.1,2.0);
 | 
			
		||||
  TestCGinversions<ShamirZolotarevFermionR>(Dshamz,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<ShamirZolotarevFermionR>(Dshamz,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5D<ShamirZolotarevFermionR>(Dshamz,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"OverlapWilsonCayleyTanhFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  OverlapWilsonCayleyTanhFermionR Dov(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,1.0);
 | 
			
		||||
  TestCGinversions<OverlapWilsonCayleyTanhFermionR>(Dov,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<OverlapWilsonCayleyTanhFermionR>(Dov,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<OverlapWilsonCayleyTanhFermionR>(Dov,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"OverlapWilsonCayleyZolotarevFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  OverlapWilsonCayleyZolotarevFermionR Dovz(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,0.1,2.0);
 | 
			
		||||
  TestCGinversions<OverlapWilsonCayleyZolotarevFermionR>(Dovz,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestCGinversions<OverlapWilsonCayleyZolotarevFermionR>(Dovz,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5D<OverlapWilsonCayleyZolotarevFermionR>(Dovz,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  Grid_finalize();
 | 
			
		||||
}
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestCGinversions(What & Ddwf, 
 | 
			
		||||
		       LatticeGaugeField &Umu,
 | 
			
		||||
		       GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
		       GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
		       RealD mass, RealD M5,
 | 
			
		||||
@@ -154,6 +198,7 @@ void  TestCGinversions(What & Ddwf,
 | 
			
		||||
  TestCGschur<What>(Ddwf,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,RNG4,RNG5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestCGunprec(What & Ddwf, 
 | 
			
		||||
		   GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
@@ -189,6 +234,112 @@ void  TestCGprec(What & Ddwf,
 | 
			
		||||
  CG(HermOpEO,src_o,result_o);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestReconstruct5D(What & Ddwf, 
 | 
			
		||||
			LatticeGaugeField & Umu,
 | 
			
		||||
			GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
			GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
			RealD mass, RealD M5,
 | 
			
		||||
			GridParallelRNG *RNG4,
 | 
			
		||||
			GridParallelRNG *RNG5)
 | 
			
		||||
{
 | 
			
		||||
  LatticeFermion src4   (UGrid); random(*RNG4,src4);
 | 
			
		||||
  LatticeFermion res4   (UGrid); res4 = zero;
 | 
			
		||||
 | 
			
		||||
  LatticeFermion src   (FGrid);
 | 
			
		||||
  LatticeFermion src_NE(FGrid);
 | 
			
		||||
  LatticeFermion result(FGrid);
 | 
			
		||||
  LatticeFermion result_rec(FGrid);
 | 
			
		||||
 | 
			
		||||
  MdagMLinearOperator<What,LatticeFermion> HermOp(Ddwf);
 | 
			
		||||
  double Resid = 1.0e-12;
 | 
			
		||||
  ConjugateGradient<LatticeFermion> CG(Resid,10000);
 | 
			
		||||
 | 
			
		||||
  Ddwf.ImportPhysicalFermionSource(src4,src);
 | 
			
		||||
  Ddwf.Mdag(src,src_NE);
 | 
			
		||||
  CG(HermOp,src_NE,result);
 | 
			
		||||
 | 
			
		||||
  Ddwf.ExportPhysicalFermionSolution(result, res4);
 | 
			
		||||
 | 
			
		||||
  Ddwf.M(result,src_NE);
 | 
			
		||||
  src_NE = src_NE - src;
 | 
			
		||||
  std::cout <<GridLogMessage<< " True residual is " << norm2(src_NE)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout <<GridLogMessage<< " Reconstructing " <<std::endl;
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////
 | 
			
		||||
  // RBprec PV inverse
 | 
			
		||||
  ////////////////////////////
 | 
			
		||||
  typedef LatticeFermion Field;
 | 
			
		||||
  typedef SchurRedBlackDiagMooeeSolve<Field> SchurSolverType; 
 | 
			
		||||
  typedef PauliVillarsSolverRBprec<Field,SchurSolverType> PVinverter;
 | 
			
		||||
  SchurSolverType SchurSolver(CG);
 | 
			
		||||
  PVinverter      PVinverse(SchurSolver);
 | 
			
		||||
 | 
			
		||||
  Reconstruct5DfromPhysical<LatticeFermion,PVinverter> reconstructor(PVinverse);
 | 
			
		||||
 | 
			
		||||
  reconstructor(Ddwf,res4,src4,result_rec);
 | 
			
		||||
 | 
			
		||||
  std::cout <<GridLogMessage << "Result     "<<norm2(result)<<std::endl;
 | 
			
		||||
  std::cout <<GridLogMessage << "Result_rec "<<norm2(result_rec)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  result_rec = result_rec - result;
 | 
			
		||||
  std::cout <<GridLogMessage << "Difference "<<norm2(result_rec)<<std::endl;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestReconstruct5DFA(What & Ddwf, 
 | 
			
		||||
			LatticeGaugeField & Umu,
 | 
			
		||||
			GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
			GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
			RealD mass, RealD M5,
 | 
			
		||||
			GridParallelRNG *RNG4,
 | 
			
		||||
			GridParallelRNG *RNG5)
 | 
			
		||||
{
 | 
			
		||||
  LatticeFermion src4   (UGrid); random(*RNG4,src4);
 | 
			
		||||
  LatticeFermion res4   (UGrid); res4 = zero;
 | 
			
		||||
 | 
			
		||||
  LatticeFermion src   (FGrid);
 | 
			
		||||
  LatticeFermion src_NE(FGrid);
 | 
			
		||||
  LatticeFermion result(FGrid);
 | 
			
		||||
  LatticeFermion result_rec(FGrid);
 | 
			
		||||
 | 
			
		||||
  MdagMLinearOperator<What,LatticeFermion> HermOp(Ddwf);
 | 
			
		||||
  double Resid = 1.0e-12;
 | 
			
		||||
  ConjugateGradient<LatticeFermion> CG(Resid,10000);
 | 
			
		||||
 | 
			
		||||
  Ddwf.ImportPhysicalFermionSource(src4,src);
 | 
			
		||||
  Ddwf.Mdag(src,src_NE);
 | 
			
		||||
  CG(HermOp,src_NE,result);
 | 
			
		||||
 | 
			
		||||
  Ddwf.ExportPhysicalFermionSolution(result, res4);
 | 
			
		||||
 | 
			
		||||
  Ddwf.M(result,src_NE);
 | 
			
		||||
  src_NE = src_NE - src;
 | 
			
		||||
  std::cout <<GridLogMessage<< " True residual is " << norm2(src_NE)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  std::cout <<GridLogMessage<< " Reconstructing " <<std::endl;
 | 
			
		||||
 | 
			
		||||
  ////////////////////////////
 | 
			
		||||
  // Fourier accel PV inverse
 | 
			
		||||
  ////////////////////////////
 | 
			
		||||
  typedef LatticeFermion Field;
 | 
			
		||||
  typedef PauliVillarsSolverFourierAccel<LatticeFermion,LatticeGaugeField> PVinverter;
 | 
			
		||||
  PVinverter PVinverse(Umu,CG);
 | 
			
		||||
 | 
			
		||||
  Reconstruct5DfromPhysical<LatticeFermion,PVinverter> reconstructor(PVinverse);
 | 
			
		||||
 | 
			
		||||
  reconstructor(Ddwf,res4,src4,result_rec);
 | 
			
		||||
 | 
			
		||||
  std::cout <<GridLogMessage << "Result     "<<norm2(result)<<std::endl;
 | 
			
		||||
  std::cout <<GridLogMessage << "Result_rec "<<norm2(result_rec)<<std::endl;
 | 
			
		||||
 | 
			
		||||
  result_rec = result_rec - result;
 | 
			
		||||
  std::cout <<GridLogMessage << "Difference "<<norm2(result_rec)<<std::endl;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template<class What> 
 | 
			
		||||
void  TestCGschur(What & Ddwf, 
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user