mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-01 04:24:32 +00:00 
			
		
		
		
	Merge branch 'feature/staggering' into develop
This commit is contained in:
		| @@ -162,15 +162,10 @@ namespace Grid { | |||||||
| 	_Mat.M(in,out); | 	_Mat.M(in,out); | ||||||
|       } |       } | ||||||
|       void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ |       void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ | ||||||
| 	ComplexD dot; |  | ||||||
|  |  | ||||||
| 	_Mat.M(in,out); | 	_Mat.M(in,out); | ||||||
| 	 | 	 | ||||||
| 	dot= innerProduct(in,out); | 	ComplexD dot= innerProduct(in,out); n1=real(dot); | ||||||
| 	n1=real(dot); | 	n2=norm2(out); | ||||||
|  |  | ||||||
| 	dot = innerProduct(out,out); |  | ||||||
| 	n2=real(dot); |  | ||||||
|       } |       } | ||||||
|       void HermOp(const Field &in, Field &out){ |       void HermOp(const Field &in, Field &out){ | ||||||
| 	_Mat.M(in,out); | 	_Mat.M(in,out); | ||||||
| @@ -192,10 +187,10 @@ namespace Grid { | |||||||
| 	ni=Mpc(in,tmp); | 	ni=Mpc(in,tmp); | ||||||
| 	no=MpcDag(tmp,out); | 	no=MpcDag(tmp,out); | ||||||
|       } |       } | ||||||
|       void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ |       virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ | ||||||
| 	MpcDagMpc(in,out,n1,n2); | 	MpcDagMpc(in,out,n1,n2); | ||||||
|       } |       } | ||||||
|       void HermOp(const Field &in, Field &out){ |       virtual void HermOp(const Field &in, Field &out){ | ||||||
| 	RealD n1,n2; | 	RealD n1,n2; | ||||||
| 	HermOpAndNorm(in,out,n1,n2); | 	HermOpAndNorm(in,out,n1,n2); | ||||||
|       } |       } | ||||||
| @@ -300,6 +295,39 @@ namespace Grid { | |||||||
|       } |       } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |       // | ||||||
|  |     template<class Matrix,class Field> | ||||||
|  |       class SchurStaggeredOperator :  public SchurOperatorBase<Field> { | ||||||
|  |     protected: | ||||||
|  |       Matrix &_Mat; | ||||||
|  |     public: | ||||||
|  |       SchurStaggeredOperator (Matrix &Mat): _Mat(Mat){}; | ||||||
|  |       virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ | ||||||
|  | 	ComplexD dot; | ||||||
|  | 	n2 = Mpc(in,out); | ||||||
|  | 	dot= innerProduct(in,out); | ||||||
|  | 	n1 = real(dot); | ||||||
|  |       } | ||||||
|  |       virtual void HermOp(const Field &in, Field &out){ | ||||||
|  | 	Mpc(in,out); | ||||||
|  |       } | ||||||
|  |       virtual  RealD Mpc      (const Field &in, Field &out) { | ||||||
|  | 	Field tmp(in._grid); | ||||||
|  | 	_Mat.Meooe(in,tmp); | ||||||
|  | 	_Mat.MooeeInv(tmp,out); | ||||||
|  | 	_Mat.MeooeDag(out,tmp); | ||||||
|  | 	_Mat.Mooee(in,out); | ||||||
|  |         return axpy_norm(out,-1.0,tmp,out); | ||||||
|  |       } | ||||||
|  |       virtual  RealD MpcDag   (const Field &in, Field &out){ | ||||||
|  | 	return Mpc(in,out); | ||||||
|  |       } | ||||||
|  |       virtual void MpcDagMpc(const Field &in, Field &out,RealD &ni,RealD &no) { | ||||||
|  | 	assert(0);// Never need with staggered | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |     template<class Matrix,class Field> using SchurStagOperator = SchurStaggeredOperator<Matrix,Field>; | ||||||
|  |  | ||||||
|  |  | ||||||
|     ///////////////////////////////////////////////////////////// |     ///////////////////////////////////////////////////////////// | ||||||
|     // Base classes for functions of operators |     // Base classes for functions of operators | ||||||
|   | |||||||
| @@ -63,6 +63,85 @@ Author: Peter Boyle <paboyle@ph.ed.ac.uk> | |||||||
|    */ |    */ | ||||||
| namespace Grid { | namespace Grid { | ||||||
|  |  | ||||||
|  |   /////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |   // Take a matrix and form a Red Black solver calling a Herm solver | ||||||
|  |   // Use of RB info prevents making SchurRedBlackSolve conform to standard interface | ||||||
|  |   /////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|  |   template<class Field> class SchurRedBlackStaggeredSolve { | ||||||
|  |   private: | ||||||
|  |     OperatorFunction<Field> & _HermitianRBSolver; | ||||||
|  |     int CBfactorise; | ||||||
|  |   public: | ||||||
|  |  | ||||||
|  |     ///////////////////////////////////////////////////// | ||||||
|  |     // Wrap the usual normal equations Schur trick | ||||||
|  |     ///////////////////////////////////////////////////// | ||||||
|  |   SchurRedBlackStaggeredSolve(OperatorFunction<Field> &HermitianRBSolver)  : | ||||||
|  |      _HermitianRBSolver(HermitianRBSolver)  | ||||||
|  |     {  | ||||||
|  |       CBfactorise=0; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     template<class Matrix> | ||||||
|  |       void operator() (Matrix & _Matrix,const Field &in, Field &out){ | ||||||
|  |  | ||||||
|  |       // FIXME CGdiagonalMee not implemented virtual function | ||||||
|  |       // FIXME use CBfactorise to control schur decomp | ||||||
|  |       GridBase *grid = _Matrix.RedBlackGrid(); | ||||||
|  |       GridBase *fgrid= _Matrix.Grid(); | ||||||
|  |  | ||||||
|  |       SchurStaggeredOperator<Matrix,Field> _HermOpEO(_Matrix); | ||||||
|  |   | ||||||
|  |       Field src_e(grid); | ||||||
|  |       Field src_o(grid); | ||||||
|  |       Field sol_e(grid); | ||||||
|  |       Field sol_o(grid); | ||||||
|  |       Field   tmp(grid); | ||||||
|  |       Field  Mtmp(grid); | ||||||
|  |       Field resid(fgrid); | ||||||
|  |  | ||||||
|  |       pickCheckerboard(Even,src_e,in); | ||||||
|  |       pickCheckerboard(Odd ,src_o,in); | ||||||
|  |       pickCheckerboard(Even,sol_e,out); | ||||||
|  |       pickCheckerboard(Odd ,sol_o,out); | ||||||
|  |      | ||||||
|  |       ///////////////////////////////////////////////////// | ||||||
|  |       // src_o = Mdag * (source_o - Moe MeeInv source_e) | ||||||
|  |       ///////////////////////////////////////////////////// | ||||||
|  |       _Matrix.MooeeInv(src_e,tmp);     assert(  tmp.checkerboard ==Even); | ||||||
|  |       _Matrix.Meooe   (tmp,Mtmp);      assert( Mtmp.checkerboard ==Odd);      | ||||||
|  |       tmp=src_o-Mtmp;                  assert(  tmp.checkerboard ==Odd);      | ||||||
|  |  | ||||||
|  |       _Matrix.Mooee(tmp,src_o);     assert(src_o.checkerboard ==Odd); | ||||||
|  |  | ||||||
|  |       ////////////////////////////////////////////////////////////// | ||||||
|  |       // Call the red-black solver | ||||||
|  |       ////////////////////////////////////////////////////////////// | ||||||
|  |       std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl; | ||||||
|  |       _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd); | ||||||
|  |  | ||||||
|  |       /////////////////////////////////////////////////// | ||||||
|  |       // sol_e = M_ee^-1 * ( src_e - Meo sol_o )... | ||||||
|  |       /////////////////////////////////////////////////// | ||||||
|  |       _Matrix.Meooe(sol_o,tmp);        assert(  tmp.checkerboard   ==Even); | ||||||
|  |       src_e = src_e-tmp;               assert(  src_e.checkerboard ==Even); | ||||||
|  |       _Matrix.MooeeInv(src_e,sol_e);   assert(  sol_e.checkerboard ==Even); | ||||||
|  |       | ||||||
|  |       setCheckerboard(out,sol_e); assert(  sol_e.checkerboard ==Even); | ||||||
|  |       setCheckerboard(out,sol_o); assert(  sol_o.checkerboard ==Odd ); | ||||||
|  |  | ||||||
|  |       // Verify the unprec residual | ||||||
|  |       _Matrix.M(out,resid);  | ||||||
|  |       resid = resid-in; | ||||||
|  |       RealD ns = norm2(in); | ||||||
|  |       RealD nr = norm2(resid); | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage << "SchurRedBlackStaggered solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl; | ||||||
|  |     }      | ||||||
|  |   }; | ||||||
|  |   template<class Field> using SchurRedBlackStagSolve = SchurRedBlackStaggeredSolve<Field>; | ||||||
|  |  | ||||||
|   /////////////////////////////////////////////////////////////////////////////////////////////////////// |   /////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|   // Take a matrix and form a Red Black solver calling a Herm solver |   // Take a matrix and form a Red Black solver calling a Herm solver | ||||||
|   // Use of RB info prevents making SchurRedBlackSolve conform to standard interface |   // Use of RB info prevents making SchurRedBlackSolve conform to standard interface | ||||||
| @@ -141,5 +220,166 @@ namespace Grid { | |||||||
|     }      |     }      | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   /////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |   // Take a matrix and form a Red Black solver calling a Herm solver | ||||||
|  |   // Use of RB info prevents making SchurRedBlackSolve conform to standard interface | ||||||
|  |   /////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |   template<class Field> class SchurRedBlackDiagTwoSolve { | ||||||
|  |   private: | ||||||
|  |     OperatorFunction<Field> & _HermitianRBSolver; | ||||||
|  |     int CBfactorise; | ||||||
|  |   public: | ||||||
|  |  | ||||||
|  |     ///////////////////////////////////////////////////// | ||||||
|  |     // Wrap the usual normal equations Schur trick | ||||||
|  |     ///////////////////////////////////////////////////// | ||||||
|  |   SchurRedBlackDiagTwoSolve(OperatorFunction<Field> &HermitianRBSolver)  : | ||||||
|  |      _HermitianRBSolver(HermitianRBSolver)  | ||||||
|  |     {  | ||||||
|  |       CBfactorise=0; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     template<class Matrix> | ||||||
|  |       void operator() (Matrix & _Matrix,const Field &in, Field &out){ | ||||||
|  |  | ||||||
|  |       // FIXME CGdiagonalMee not implemented virtual function | ||||||
|  |       // FIXME use CBfactorise to control schur decomp | ||||||
|  |       GridBase *grid = _Matrix.RedBlackGrid(); | ||||||
|  |       GridBase *fgrid= _Matrix.Grid(); | ||||||
|  |  | ||||||
|  |       SchurDiagTwoOperator<Matrix,Field> _HermOpEO(_Matrix); | ||||||
|  |   | ||||||
|  |       Field src_e(grid); | ||||||
|  |       Field src_o(grid); | ||||||
|  |       Field sol_e(grid); | ||||||
|  |       Field sol_o(grid); | ||||||
|  |       Field   tmp(grid); | ||||||
|  |       Field  Mtmp(grid); | ||||||
|  |       Field resid(fgrid); | ||||||
|  |  | ||||||
|  |       pickCheckerboard(Even,src_e,in); | ||||||
|  |       pickCheckerboard(Odd ,src_o,in); | ||||||
|  |       pickCheckerboard(Even,sol_e,out); | ||||||
|  |       pickCheckerboard(Odd ,sol_o,out); | ||||||
|  |      | ||||||
|  |       ///////////////////////////////////////////////////// | ||||||
|  |       // src_o = Mdag * (source_o - Moe MeeInv source_e) | ||||||
|  |       ///////////////////////////////////////////////////// | ||||||
|  |       _Matrix.MooeeInv(src_e,tmp);     assert(  tmp.checkerboard ==Even); | ||||||
|  |       _Matrix.Meooe   (tmp,Mtmp);      assert( Mtmp.checkerboard ==Odd);      | ||||||
|  |       tmp=src_o-Mtmp;                  assert(  tmp.checkerboard ==Odd);      | ||||||
|  |  | ||||||
|  |       // get the right MpcDag | ||||||
|  |       _HermOpEO.MpcDag(tmp,src_o);     assert(src_o.checkerboard ==Odd);        | ||||||
|  |  | ||||||
|  |       ////////////////////////////////////////////////////////////// | ||||||
|  |       // Call the red-black solver | ||||||
|  |       ////////////////////////////////////////////////////////////// | ||||||
|  |       std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl; | ||||||
|  | //      _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd); | ||||||
|  |       _HermitianRBSolver(_HermOpEO,src_o,tmp);  assert(tmp.checkerboard==Odd); | ||||||
|  |       _Matrix.MooeeInv(tmp,sol_o);        assert(  sol_o.checkerboard   ==Odd); | ||||||
|  |  | ||||||
|  |       /////////////////////////////////////////////////// | ||||||
|  |       // sol_e = M_ee^-1 * ( src_e - Meo sol_o )... | ||||||
|  |       /////////////////////////////////////////////////// | ||||||
|  |       _Matrix.Meooe(sol_o,tmp);        assert(  tmp.checkerboard   ==Even); | ||||||
|  |       src_e = src_e-tmp;               assert(  src_e.checkerboard ==Even); | ||||||
|  |       _Matrix.MooeeInv(src_e,sol_e);   assert(  sol_e.checkerboard ==Even); | ||||||
|  |       | ||||||
|  |       setCheckerboard(out,sol_e); assert(  sol_e.checkerboard ==Even); | ||||||
|  |       setCheckerboard(out,sol_o); assert(  sol_o.checkerboard ==Odd ); | ||||||
|  |  | ||||||
|  |       // Verify the unprec residual | ||||||
|  |       _Matrix.M(out,resid);  | ||||||
|  |       resid = resid-in; | ||||||
|  |       RealD ns = norm2(in); | ||||||
|  |       RealD nr = norm2(resid); | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage << "SchurRedBlackDiagTwo solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl; | ||||||
|  |     }      | ||||||
|  |   }; | ||||||
|  |   /////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |   // Take a matrix and form a Red Black solver calling a Herm solver | ||||||
|  |   // Use of RB info prevents making SchurRedBlackSolve conform to standard interface | ||||||
|  |   /////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |   template<class Field> class SchurRedBlackDiagTwoMixed { | ||||||
|  |   private: | ||||||
|  |     LinearFunction<Field> & _HermitianRBSolver; | ||||||
|  |     int CBfactorise; | ||||||
|  |   public: | ||||||
|  |  | ||||||
|  |     ///////////////////////////////////////////////////// | ||||||
|  |     // Wrap the usual normal equations Schur trick | ||||||
|  |     ///////////////////////////////////////////////////// | ||||||
|  |   SchurRedBlackDiagTwoMixed(LinearFunction<Field> &HermitianRBSolver)  : | ||||||
|  |      _HermitianRBSolver(HermitianRBSolver)  | ||||||
|  |     {  | ||||||
|  |       CBfactorise=0; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     template<class Matrix> | ||||||
|  |       void operator() (Matrix & _Matrix,const Field &in, Field &out){ | ||||||
|  |  | ||||||
|  |       // FIXME CGdiagonalMee not implemented virtual function | ||||||
|  |       // FIXME use CBfactorise to control schur decomp | ||||||
|  |       GridBase *grid = _Matrix.RedBlackGrid(); | ||||||
|  |       GridBase *fgrid= _Matrix.Grid(); | ||||||
|  |  | ||||||
|  |       SchurDiagTwoOperator<Matrix,Field> _HermOpEO(_Matrix); | ||||||
|  |   | ||||||
|  |       Field src_e(grid); | ||||||
|  |       Field src_o(grid); | ||||||
|  |       Field sol_e(grid); | ||||||
|  |       Field sol_o(grid); | ||||||
|  |       Field   tmp(grid); | ||||||
|  |       Field  Mtmp(grid); | ||||||
|  |       Field resid(fgrid); | ||||||
|  |  | ||||||
|  |       pickCheckerboard(Even,src_e,in); | ||||||
|  |       pickCheckerboard(Odd ,src_o,in); | ||||||
|  |       pickCheckerboard(Even,sol_e,out); | ||||||
|  |       pickCheckerboard(Odd ,sol_o,out); | ||||||
|  |      | ||||||
|  |       ///////////////////////////////////////////////////// | ||||||
|  |       // src_o = Mdag * (source_o - Moe MeeInv source_e) | ||||||
|  |       ///////////////////////////////////////////////////// | ||||||
|  |       _Matrix.MooeeInv(src_e,tmp);     assert(  tmp.checkerboard ==Even); | ||||||
|  |       _Matrix.Meooe   (tmp,Mtmp);      assert( Mtmp.checkerboard ==Odd);      | ||||||
|  |       tmp=src_o-Mtmp;                  assert(  tmp.checkerboard ==Odd);      | ||||||
|  |  | ||||||
|  |       // get the right MpcDag | ||||||
|  |       _HermOpEO.MpcDag(tmp,src_o);     assert(src_o.checkerboard ==Odd);        | ||||||
|  |  | ||||||
|  |       ////////////////////////////////////////////////////////////// | ||||||
|  |       // Call the red-black solver | ||||||
|  |       ////////////////////////////////////////////////////////////// | ||||||
|  |       std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl; | ||||||
|  | //      _HermitianRBSolver(_HermOpEO,src_o,sol_o);  assert(sol_o.checkerboard==Odd); | ||||||
|  | //      _HermitianRBSolver(_HermOpEO,src_o,tmp);  assert(tmp.checkerboard==Odd); | ||||||
|  |       _HermitianRBSolver(src_o,tmp);  assert(tmp.checkerboard==Odd); | ||||||
|  |       _Matrix.MooeeInv(tmp,sol_o);        assert(  sol_o.checkerboard   ==Odd); | ||||||
|  |  | ||||||
|  |       /////////////////////////////////////////////////// | ||||||
|  |       // sol_e = M_ee^-1 * ( src_e - Meo sol_o )... | ||||||
|  |       /////////////////////////////////////////////////// | ||||||
|  |       _Matrix.Meooe(sol_o,tmp);        assert(  tmp.checkerboard   ==Even); | ||||||
|  |       src_e = src_e-tmp;               assert(  src_e.checkerboard ==Even); | ||||||
|  |       _Matrix.MooeeInv(src_e,sol_e);   assert(  sol_e.checkerboard ==Even); | ||||||
|  |       | ||||||
|  |       setCheckerboard(out,sol_e); assert(  sol_e.checkerboard ==Even); | ||||||
|  |       setCheckerboard(out,sol_o); assert(  sol_o.checkerboard ==Odd ); | ||||||
|  |  | ||||||
|  |       // Verify the unprec residual | ||||||
|  |       _Matrix.M(out,resid);  | ||||||
|  |       resid = resid-in; | ||||||
|  |       RealD ns = norm2(in); | ||||||
|  |       RealD nr = norm2(resid); | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage << "SchurRedBlackDiagTwo solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl; | ||||||
|  |     }      | ||||||
|  |   }; | ||||||
|  |  | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										130
									
								
								tests/solver/Test_staggered_block_cg_prec.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								tests/solver/Test_staggered_block_cg_prec.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | |||||||
|  |     /************************************************************************************* | ||||||
|  |  | ||||||
|  |     Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  |     Source file: ./tests/Test_wilson_cg_unprec.cc | ||||||
|  |  | ||||||
|  |     Copyright (C) 2015 | ||||||
|  |  | ||||||
|  | Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk> | ||||||
|  | Author: Peter Boyle <paboyle@ph.ed.ac.uk> | ||||||
|  |  | ||||||
|  |     This program is free software; you can redistribute it and/or modify | ||||||
|  |     it under the terms of the GNU General Public License as published by | ||||||
|  |     the Free Software Foundation; either version 2 of the License, or | ||||||
|  |     (at your option) any later version. | ||||||
|  |  | ||||||
|  |     This program is distributed in the hope that it will be useful, | ||||||
|  |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |     GNU General Public License for more details. | ||||||
|  |  | ||||||
|  |     You should have received a copy of the GNU General Public License along | ||||||
|  |     with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  |     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  |     See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  |     *************************************************************************************/ | ||||||
|  |     /*  END LEGAL */ | ||||||
|  | #include <Grid/Grid.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Grid::QCD; | ||||||
|  |  | ||||||
|  | template<class d> | ||||||
|  | struct scal { | ||||||
|  |   d internal; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |   Gamma::Algebra Gmu [] = { | ||||||
|  |     Gamma::Algebra::GammaX, | ||||||
|  |     Gamma::Algebra::GammaY, | ||||||
|  |     Gamma::Algebra::GammaZ, | ||||||
|  |     Gamma::Algebra::GammaT | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  | int main (int argc, char ** argv) | ||||||
|  | { | ||||||
|  |   typedef typename ImprovedStaggeredFermion5DR::FermionField FermionField;  | ||||||
|  |   typedef typename ImprovedStaggeredFermion5DR::ComplexField ComplexField;  | ||||||
|  |   typename ImprovedStaggeredFermion5DR::ImplParams params;  | ||||||
|  |  | ||||||
|  |   const int Ls=8; | ||||||
|  |  | ||||||
|  |   Grid_init(&argc,&argv); | ||||||
|  |  | ||||||
|  |   std::vector<int> latt_size   = GridDefaultLatt(); | ||||||
|  |   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); | ||||||
|  |   std::vector<int> mpi_layout  = 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); | ||||||
|  |  | ||||||
|  |   std::vector<int> seeds({1,2,3,4}); | ||||||
|  |   GridParallelRNG pRNG(UGrid );  pRNG.SeedFixedIntegers(seeds); | ||||||
|  |   GridParallelRNG pRNG5(FGrid);  pRNG5.SeedFixedIntegers(seeds); | ||||||
|  |  | ||||||
|  |   FermionField src(FGrid); random(pRNG5,src); | ||||||
|  |   FermionField src_o(FrbGrid);   pickCheckerboard(Odd,src_o,src); | ||||||
|  |   FermionField result_o(FrbGrid); result_o=zero;  | ||||||
|  |   RealD nrm = norm2(src); | ||||||
|  |  | ||||||
|  |   LatticeGaugeField Umu(UGrid); SU3::HotConfiguration(pRNG,Umu); | ||||||
|  |  | ||||||
|  |   RealD mass=0.003; | ||||||
|  |   ImprovedStaggeredFermion5DR Ds(Umu,Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass);  | ||||||
|  |   SchurDiagMooeeOperator<ImprovedStaggeredFermion5DR,FermionField> HermOp(Ds); | ||||||
|  |  | ||||||
|  |   ConjugateGradient<FermionField> CG(1.0e-8,10000); | ||||||
|  |   int blockDim = 0; | ||||||
|  |   BlockConjugateGradient<FermionField>    BCGrQ(BlockCGrQ,blockDim,1.0e-8,10000); | ||||||
|  |   BlockConjugateGradient<FermionField>    BCG  (BlockCG,blockDim,1.0e-8,10000); | ||||||
|  |   BlockConjugateGradient<FermionField>    mCG  (CGmultiRHS,blockDim,1.0e-8,10000); | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage << "****************************************************************** "<<std::endl; | ||||||
|  |   std::cout << GridLogMessage << " Calling 4d CG "<<std::endl; | ||||||
|  |   std::cout << GridLogMessage << "****************************************************************** "<<std::endl; | ||||||
|  |   ImprovedStaggeredFermionR Ds4d(Umu,Umu,*UGrid,*UrbGrid,mass); | ||||||
|  |   SchurDiagMooeeOperator<ImprovedStaggeredFermionR,FermionField> HermOp4d(Ds4d); | ||||||
|  |   FermionField src4d(UGrid); random(pRNG,src4d); | ||||||
|  |   FermionField src4d_o(UrbGrid);   pickCheckerboard(Odd,src4d_o,src4d); | ||||||
|  |   FermionField result4d_o(UrbGrid);  | ||||||
|  |  | ||||||
|  |   result4d_o=zero; | ||||||
|  |   CG(HermOp4d,src4d_o,result4d_o); | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |   std::cout << GridLogMessage << " Calling 5d CG for "<<Ls <<" right hand sides" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |   Ds.ZeroCounters(); | ||||||
|  |   result_o=zero; | ||||||
|  |   CG(HermOp,src_o,result_o); | ||||||
|  |   Ds.Report(); | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |   std::cout << GridLogMessage << " Calling multiRHS CG for "<<Ls <<" right hand sides" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |   Ds.ZeroCounters(); | ||||||
|  |   result_o=zero; | ||||||
|  |   mCG(HermOp,src_o,result_o); | ||||||
|  |   Ds.Report(); | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |   std::cout << GridLogMessage << " Calling Block CG for "<<Ls <<" right hand sides" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |   Ds.ZeroCounters(); | ||||||
|  |   result_o=zero; | ||||||
|  |   BCGrQ(HermOp,src_o,result_o); | ||||||
|  |   Ds.Report(); | ||||||
|  |   std::cout << GridLogMessage << "************************************************************************ "<<std::endl; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   Grid_finalize(); | ||||||
|  | } | ||||||
| @@ -71,7 +71,7 @@ int main (int argc, char ** argv) | |||||||
|     volume=volume*latt_size[mu]; |     volume=volume*latt_size[mu]; | ||||||
|   }   |   }   | ||||||
|    |    | ||||||
|   RealD mass=0.1; |   RealD mass=0.003; | ||||||
|   ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass); |   ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass); | ||||||
|  |  | ||||||
|   FermionField res_o(&RBGrid);  |   FermionField res_o(&RBGrid);  | ||||||
| @@ -83,5 +83,10 @@ int main (int argc, char ** argv) | |||||||
|   ConjugateGradient<FermionField> CG(1.0e-8,10000); |   ConjugateGradient<FermionField> CG(1.0e-8,10000); | ||||||
|   CG(HermOpEO,src_o,res_o); |   CG(HermOpEO,src_o,res_o); | ||||||
|  |  | ||||||
|  |   FermionField tmp(&RBGrid); | ||||||
|  |  | ||||||
|  |   HermOpEO.Mpc(res_o,tmp); | ||||||
|  |   std::cout << "check Mpc resid " << axpy_norm(tmp,-1.0,src_o,tmp)/norm2(src_o) << "\n"; | ||||||
|  |  | ||||||
|   Grid_finalize(); |   Grid_finalize(); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user