diff --git a/tests/Test_cayley_ldop_cg.cc b/tests/Test_cayley_ldop_cg.cc new file mode 100644 index 00000000..b146002d --- /dev/null +++ b/tests/Test_cayley_ldop_cg.cc @@ -0,0 +1,136 @@ +#include + +using namespace std; +using namespace Grid; +using namespace Grid::QCD; + + +template +struct scal { + d internal; +}; + + Gamma::GammaMatrix Gmu [] = { + Gamma::GammaX, + Gamma::GammaY, + Gamma::GammaZ, + Gamma::GammaT + }; + +double lowpass(double x) +{ + return pow(x*x+1.0,-2); +} + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + Chebyshev filter(-150.0, 150.0,16, lowpass); + ofstream csv(std::string("filter.dat"),std::ios::out|std::ios::trunc); + filter.csv(csv); + csv.close(); + + const int Ls=8; + + GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi()); + GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); + + GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); + GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); + + // Construct a coarsened grid + std::vector clatt = GridDefaultLatt(); + for(int d=0;d seeds4({1,2,3,4}); + std::vector seeds5({5,6,7,8}); + std::vector cseeds({5,6,7,8}); + GridParallelRNG RNG5(FGrid); RNG5.SeedFixedIntegers(seeds5); + GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4); + GridParallelRNG CRNG(Coarse5d);CRNG.SeedFixedIntegers(cseeds); + + LatticeFermion src(FGrid); gaussian(RNG5,src); + LatticeFermion result(FGrid); result=zero; + LatticeFermion ref(FGrid); ref=zero; + LatticeFermion tmp(FGrid); + LatticeFermion err(FGrid); + LatticeGaugeField Umu(UGrid); gaussian(RNG4,Umu); + + + //random(RNG4,Umu); + NerscField header; + std::string file("./ckpoint_lat.400"); + readNerscConfiguration(Umu,header,file); + +#if 0 + LatticeColourMatrix U(UGrid); + U=zero; + for(int nn=0;nn2) { + pokeIndex(Umu,U,nn); + } + } +#endif + RealD mass=0.1; + RealD M5=1.0; + + DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); + Gamma5R5HermitianLinearOperator HermIndefOp(Ddwf); + + const int nbasis = 8; + std::vector subspace(nbasis,FGrid); + LatticeFermion noise(FGrid); + LatticeFermion ms(FGrid); + for(int b=0;b HermDefOp(Ddwf); + ConjugateGradient CG(1.0e-5,10000); + + for(int i=0;i<4;i++){ + + CG(HermDefOp,noise,subspace[b]); + noise = subspace[b]; + + scale = pow(norm2(noise),-0.5); + noise=noise*scale; + HermDefOp.HermOp(noise,ms); std::cout << "filt "< "< LittleDiracOperator; + typedef LittleDiracOperator::CoarseVector CoarseVector; + + LittleDiracOperator LittleDiracOp(*Coarse5d); + LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,subspace); + + CoarseVector c_src (Coarse5d); + CoarseVector c_res (Coarse5d); + gaussian(CRNG,c_src); + c_res=zero; + + std::cout << "Solving CG on coarse space "<< std::endl; + MdagMLinearOperator PosdefLdop(LittleDiracOp); + ConjugateGradient CG(1.0e-8,10000); + CG(PosdefLdop,c_src,c_res); + + std::cout << "Done "<< std::endl; + Grid_finalize(); +}