diff --git a/examples/Example_pvdagm_mrhs_3level_DenseCoarseMatrix.cc b/examples/Example_pvdagm_mrhs_3level_DenseCoarseMatrix.cc index cb22b74a6..e30d7491f 100644 --- a/examples/Example_pvdagm_mrhs_3level_DenseCoarseMatrix.cc +++ b/examples/Example_pvdagm_mrhs_3level_DenseCoarseMatrix.cc @@ -198,6 +198,7 @@ public: _Dense.ApplyBatch(split_in, split_out); for(int r=0;r<_nrhs;r++) InsertSliceFast(split_out[r], out, r, 0); } else { + GRID_TRACE("MrhsDensCCSolve::ApplyBatch6D"); _Dense.ApplyBatch6D(in, out, _nrhs); } } @@ -226,11 +227,12 @@ public: void SetZeroGuess(int z){ ZeroGuess=z; } MrhsPGCRNonHermitian(RealD tol,Integer maxit,LinearOperatorBase &_Linop,MrhsLinearFunction &Prec,int _mmax,int _nstep) : Tolerance(tol),MaxIterations(maxit),Linop(_Linop),Preconditioner(Prec),mmax(_mmax),nstep(_nstep){ level=1; } - static RealD vnorm2(std::vector &x){ RealD s=0; for(auto &f:x) s+=norm2(f); return s; } - static ComplexD vinnerProduct(std::vector &x,std::vector &y){ ComplexD s(0); for(int r=0;r<(int)x.size();r++) s+=innerProduct(x[r],y[r]); return s; } - static void vaxpy(std::vector &z,ComplexD a,std::vector &x,std::vector &y){ for(int r=0;r<(int)z.size();r++) axpy(z[r],a,x[r],y[r]); } - void vOp(std::vector &in,std::vector &out){ for(int r=0;r<(int)in.size();r++) Linop.Op(in[r],out[r]); } + static RealD vnorm2(std::vector &x){ GRID_TRACE("GCR-vnorm2"); RealD s=0; for(auto &f:x) s+=norm2(f); return s; } + static ComplexD vinnerProduct(std::vector &x,std::vector &y){ GRID_TRACE("GCR-vinnerProduct"); ComplexD s(0); for(int r=0;r<(int)x.size();r++) s+=innerProduct(x[r],y[r]); return s; } + static void vaxpy(std::vector &z,ComplexD a,std::vector &x,std::vector &y){ GRID_TRACE("GCR-vaxpy"); for(int r=0;r<(int)z.size();r++) axpy(z[r],a,x[r],y[r]); } + void vOp(std::vector &in,std::vector &out){ GRID_TRACE("GCR-vOp"); for(int r=0;r<(int)in.size();r++) Linop.Op(in[r],out[r]); } void operator()(std::vector &src,std::vector &psi){ + GRID_TRACE((name+"MrhsPGCRNonHermitian").c_str()); RealD cp,ssq,rsq; int nrhs=src.size(); GridBase *grid=src[0].Grid(); ssq=vnorm2(src); rsq=Tolerance*Tolerance*ssq; std::vector r(nrhs,grid); @@ -264,17 +266,32 @@ public: p[0]=z; q[0]=Az; qq[0]=zAAz; cp=vnorm2(r); for(int k=0;k(mmax-1))?(mmax-1):(kp); - for(int back=0;back=0); - b=-real(vinnerProduct(q[peri_back],Az))/qq[peri_back]; - vaxpy(p[peri_kp],b,p[peri_back],p[peri_kp]); vaxpy(q[peri_kp],b,q[peri_back],q[peri_kp]); } - qq[peri_kp]=vnorm2(q[peri_kp]); + + { + GRID_TRACE("GCR-orthog"); + q[peri_kp]=Az; p[peri_kp]=z; + int northog=((kp)>(mmax-1))?(mmax-1):(kp); + for(int back=0;back=0); + b=-real(vinnerProduct(q[peri_back],Az))/qq[peri_back]; + vaxpy(p[peri_kp],b,p[peri_back],p[peri_kp]); vaxpy(q[peri_kp],b,q[peri_back],q[peri_kp]); } + qq[peri_kp]=vnorm2(q[peri_kp]); + } + // q[peri_kp]=Az; p[peri_kp]=z; + // int northog=((kp)>(mmax-1))?(mmax-1):(kp); + // for(int back=0;back=0); + // b=-real(vinnerProduct(q[peri_back],Az))/qq[peri_back]; + // vaxpy(p[peri_kp],b,p[peri_back],p[peri_kp]); vaxpy(q[peri_kp],b,q[peri_back],q[peri_kp]); } + // qq[peri_kp]=vnorm2(q[peri_kp]); } GRID_ASSERT(0); return cp; } @@ -323,33 +340,45 @@ public: CoarseCoarseField CCsol(_CoarseCoarseMrhs); t=-usecond(); - for(int r=0;rL3 restrict took "< blockPromote -> pack 6D coarse; add correction t=-usecond(); - for(int r=0;rL3 prolong took "< &in, std::vector &out){ int nrhs=in.size(); GridBase *fgrid=in[0].Grid(); double t; + std::vector vec1(nrhs,fgrid),vec2(nrhs,fgrid); - for(int r=0;r Csrc_split(nrhs,_CoarseGrid), Csol_split(nrhs,_CoarseGrid); CoarseVector CsrcMrhs(_CoarseGridMrhs), CsolMrhs(_CoarseGridMrhs); t=-usecond(); - _Projector.blockProject(vec1,Csrc_split); - for(int r=0;r CC [3,6,8,8], the dense floor. Coordinate cclatt = clatt; - Coordinate Block2({8,4,3,6}); + Coordinate Block2({4,4,3,6}); if ( getenv("BLOCK2") ){ GridCmdOptionIntVector(std::string(getenv("BLOCK2")),Block2); GRID_ASSERT(Block2.size()==4); } for(int d=0;d<4;d++){ GRID_ASSERT(clatt[d]%Block2[d]==0); cclatt[d]=clatt[d]/Block2[d]; } std::cout << GridLogMessage << "Block2 " << Block2 << " coarse-coarse lattice " << cclatt << std::endl;