mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	Mixed precision now supported in MADWF
This commit is contained in:
		@@ -85,8 +85,9 @@ void  TestReconstruct5D(What & Ddwf,
 | 
			
		||||
			GridParallelRNG *RNG4,
 | 
			
		||||
			GridParallelRNG *RNG5);
 | 
			
		||||
 | 
			
		||||
template<class What> 
 | 
			
		||||
template<class What,class WhatF> 
 | 
			
		||||
void  TestReconstruct5DFA(What & Ddwf, 
 | 
			
		||||
			  WhatF & DdwfF, 
 | 
			
		||||
			  LatticeGaugeField &Umu,
 | 
			
		||||
			  GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
			  GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
@@ -102,19 +103,31 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
 | 
			
		||||
 | 
			
		||||
  const int Ls=8;
 | 
			
		||||
  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi());
 | 
			
		||||
  GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), 
 | 
			
		||||
								   GridDefaultSimd(Nd,vComplex::Nsimd()),
 | 
			
		||||
								   GridDefaultMpi());
 | 
			
		||||
  GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
 | 
			
		||||
  GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
 | 
			
		||||
  GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  GridCartesian         * UGridF   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), 
 | 
			
		||||
								    GridDefaultSimd(Nd,vComplexF::Nsimd()),
 | 
			
		||||
								    GridDefaultMpi());
 | 
			
		||||
  GridRedBlackCartesian * UrbGridF = SpaceTimeGrid::makeFourDimRedBlackGrid(UGridF);
 | 
			
		||||
  GridCartesian         * FGridF   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGridF);
 | 
			
		||||
  GridRedBlackCartesian * FrbGridF = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGridF);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  std::vector<int> seeds4({1,2,3,4});
 | 
			
		||||
  std::vector<int> seeds5({5,6,7,8});
 | 
			
		||||
  GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5);
 | 
			
		||||
  GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4);
 | 
			
		||||
 | 
			
		||||
  LatticeGaugeField Umu(UGrid);
 | 
			
		||||
  LatticeGaugeFieldF UmuF(UGridF);
 | 
			
		||||
  SU3::HotConfiguration(RNG4,Umu);
 | 
			
		||||
  precisionChange(UmuF,Umu);
 | 
			
		||||
  std::vector<LatticeColourMatrix> U(4,UGrid);
 | 
			
		||||
 | 
			
		||||
  RealD mass=0.1;
 | 
			
		||||
@@ -123,8 +136,9 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage <<"DomainWallFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  DomainWallFermionR Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
 | 
			
		||||
  DomainWallFermionF DdwfF(UmuF,*FGridF,*FrbGridF,*UGridF,*UrbGridF,mass,M5);
 | 
			
		||||
  TestCGinversions<DomainWallFermionR>(Ddwf,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<DomainWallFermionR>(Ddwf,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<DomainWallFermionR,DomainWallFermionF>(Ddwf,DdwfF,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;
 | 
			
		||||
@@ -134,8 +148,9 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage <<"MobiusFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  MobiusFermionR Dmob(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c);
 | 
			
		||||
  MobiusFermionF DmobF(UmuF,*FGridF,*FrbGridF,*UGridF,*UrbGridF,mass,M5,b,c);
 | 
			
		||||
  TestCGinversions<MobiusFermionR>(Dmob,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<MobiusFermionR>(Dmob,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<MobiusFermionR,MobiusFermionF>(Dmob,DmobF,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"ZMobiusFermion test"<<std::endl;
 | 
			
		||||
@@ -155,8 +170,9 @@ int main (int argc, char ** argv)
 | 
			
		||||
  std::cout<<GridLogMessage <<"ScaledShamirFermion test"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  ScaledShamirFermionR Dsham(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,2.0);
 | 
			
		||||
  ScaledShamirFermionF DshamF(UmuF,*FGridF,*FrbGridF,*UGridF,*UrbGridF,mass,M5,2.0);
 | 
			
		||||
  TestCGinversions<ScaledShamirFermionR>(Dsham,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<ScaledShamirFermionR>(Dsham,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<ScaledShamirFermionR,ScaledShamirFermionF>(Dsham,DshamF,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"ShamirZolotarevFermion test"<<std::endl;
 | 
			
		||||
@@ -168,9 +184,10 @@ int main (int argc, char ** argv)
 | 
			
		||||
  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);
 | 
			
		||||
  OverlapWilsonCayleyTanhFermionR Dov (Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,1.0);
 | 
			
		||||
  OverlapWilsonCayleyTanhFermionF DovF(UmuF,*FGridF,*FrbGridF,*UGridF,*UrbGridF,mass,M5,1.0);
 | 
			
		||||
  TestCGinversions<OverlapWilsonCayleyTanhFermionR>(Dov,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<OverlapWilsonCayleyTanhFermionR>(Dov,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
  TestReconstruct5DFA<OverlapWilsonCayleyTanhFermionR,OverlapWilsonCayleyTanhFermionF>(Dov,DovF,Umu,FGrid,FrbGrid,UGrid,UrbGrid,mass,M5,&RNG4,&RNG5);
 | 
			
		||||
 | 
			
		||||
  std::cout<<GridLogMessage <<"======================"<<std::endl;
 | 
			
		||||
  std::cout<<GridLogMessage <<"OverlapWilsonCayleyZolotarevFermion test"<<std::endl;
 | 
			
		||||
@@ -304,14 +321,15 @@ void  TestReconstruct5D(What & Ddwf,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
template<class What> 
 | 
			
		||||
template<class What,class WhatF> 
 | 
			
		||||
void  TestReconstruct5DFA(What & Ddwf, 
 | 
			
		||||
			LatticeGaugeField & Umu,
 | 
			
		||||
			GridCartesian         * FGrid,	       GridRedBlackCartesian * FrbGrid,
 | 
			
		||||
			GridCartesian         * UGrid,	       GridRedBlackCartesian * UrbGrid,
 | 
			
		||||
			RealD mass, RealD M5,
 | 
			
		||||
			GridParallelRNG *RNG4,
 | 
			
		||||
			GridParallelRNG *RNG5)
 | 
			
		||||
			  WhatF & DdwfF, 
 | 
			
		||||
			  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;
 | 
			
		||||
@@ -326,7 +344,7 @@ void  TestReconstruct5DFA(What & Ddwf,
 | 
			
		||||
  double Resid = 1.0e-12;
 | 
			
		||||
  double Residi = 1.0e-5;
 | 
			
		||||
  ConjugateGradient<LatticeFermion> CG(Resid,10000);
 | 
			
		||||
  ConjugateGradient<LatticeFermion> CGi(Residi,10000);
 | 
			
		||||
  ConjugateGradient<LatticeFermionF> CGi(Residi,10000);
 | 
			
		||||
 | 
			
		||||
  Ddwf.ImportPhysicalFermionSource(src4,src);
 | 
			
		||||
  Ddwf.Mdag(src,src_NE);
 | 
			
		||||
@@ -344,7 +362,8 @@ void  TestReconstruct5DFA(What & Ddwf,
 | 
			
		||||
  // Fourier accel PV inverse
 | 
			
		||||
  ////////////////////////////
 | 
			
		||||
  typedef LatticeFermion Field;
 | 
			
		||||
  typedef SchurRedBlackDiagTwoSolve<Field> SchurSolverTypei; 
 | 
			
		||||
  typedef LatticeFermionF FieldF;
 | 
			
		||||
  typedef SchurRedBlackDiagTwoSolve<FieldF> SchurSolverTypei; 
 | 
			
		||||
  typedef PauliVillarsSolverFourierAccel<LatticeFermion,LatticeGaugeField> PVinverter;
 | 
			
		||||
  PVinverter PVinverse(Umu,CG);
 | 
			
		||||
 | 
			
		||||
@@ -362,9 +381,9 @@ void  TestReconstruct5DFA(What & Ddwf,
 | 
			
		||||
  // Now try MADWF
 | 
			
		||||
  //////////////////////////////
 | 
			
		||||
  SchurSolverTypei SchurSolver(CGi);
 | 
			
		||||
  ZeroGuesser<LatticeFermion> Guess;
 | 
			
		||||
  MADWF<What,What,PVinverter,SchurSolverTypei,ZeroGuesser<LatticeFermion> > 
 | 
			
		||||
    madwf(Ddwf,Ddwf,PVinverse,SchurSolver,Guess,Resid,10);
 | 
			
		||||
  ZeroGuesser<LatticeFermionF> Guess;
 | 
			
		||||
  MADWF<What,WhatF,PVinverter,SchurSolverTypei,ZeroGuesser<LatticeFermionF> > 
 | 
			
		||||
    madwf(Ddwf,DdwfF,PVinverse,SchurSolver,Guess,Resid,10);
 | 
			
		||||
  
 | 
			
		||||
  madwf(src4,result_madwf);
 | 
			
		||||
  result_madwf = result_madwf - result;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user