41 return std::pow(x,-5);
44template<
class Fobj,
class CComplex,
int nbasis>
47 constexpr int Nbasis(
void) {
return nbasis; };
87 for(
int b=0;b<nn;b++){
90 scale = std::pow(
norm2(noise),-0.5);
104 for(
int b=0;b<nn;b++){
108 scale = std::pow(
norm2(noise),-0.5);
111 hermop.
Op(noise,Mn); std::cout<<
GridLogMessage <<
"noise ["<<b<<
"] <n|MdagM|n> "<<
norm2(Mn)<<std::endl;
113 for(
int i=0;i<4;i++){
118 scale = std::pow(
norm2(noise),-0.5);
123 hermop.
Op(noise,Mn); std::cout<<
GridLogMessage <<
"filtered["<<b<<
"] <f|MdagM|f> "<<
norm2(Mn)<<std::endl;
140 for(
int b=0;b<nn;b++){
144 scale = std::pow(
norm2(noise),-0.5);
149 for(
int i=0;i<2;i++){
165 scale = std::pow(
norm2(noise),-0.5);
199 scale = std::pow(
norm2(noise),-0.5);
202 std::cout <<
GridLogMessage<<
" Chebyshev subspace pass-1 : ord "<<orderfilter<<
" ["<<lo<<
","<<hi<<
"]"<<std::endl;
203 std::cout <<
GridLogMessage<<
" Chebyshev subspace pass-2 : nbasis"<<nn<<
" min "
204 <<ordermin<<
" step "<<orderstep
205 <<
" lo"<<filterlo<<std::endl;
215 Cheb(hermop,noise,Mn);
217 scale = std::pow(
norm2(Mn),-0.5); Mn=Mn*scale;
224 hermop.
AdjOp(Mn,tmp);
226 std::cout<<
GridLogMessage <<
"filt ["<<b<<
"] <n|AdjOp|n> "<<
norm2(tmp)<<
" "<<ip<<std::endl;
245 RealD xscale = 2.0/(hi-lo);
246 RealD mscale = -(hi+lo)/(hi-lo);
248 T1=y*xscale+noise*mscale;
250 for(
int n=2;n<=ordermin+orderstep*(nn-2);n++){
258 const int Nsimd = CComplex::Nsimd();
260 coalescedWrite(y_v[ss],xscale*y_v(ss)+mscale*Tn_v(ss));
261 coalescedWrite(Tnp_v[ss],2.0*y_v(ss)-Tnm_v(ss));
267 if ( n>=ordermin ) m=n-ordermin;
268 if ( (m%orderstep)==0 ) {
270 scale = std::pow(
norm2(Mn),-0.5); Mn=Mn*scale;
280 hermop.
AdjOp(Mn,tmp);
282 std::cout<<
GridLogMessage <<
"filt ["<<b<<
"] <n|AdjOp|n> "<<
norm2(tmp)<<
" "<<ip<<std::endl;
315 scale = std::pow(
norm2(noise),-0.5);
318 std::cout <<
GridLogMessage<<
" CreateSubspacePolyCheby "<<std::endl;
326 std::cout <<
GridLogMessage <<
"Cheby "<<lo1<<
","<<hi<<
" "<<orderstep<<std::endl;
328 Cheb(hermop,noise,Mn);
330 scale = std::pow(
norm2(Mn),-0.5); Mn=Mn*scale;
338 for(
int n=1;n<nn;n++){
339 std::cout <<
GridLogMessage <<
"Cheby "<<lo2<<
","<<hi<<
" "<<orderstep<<std::endl;
343 for(
int m=0;m<n;m++){
349 scale = std::pow(
norm2(Mn),-0.5);
375 std::cout <<
GridLogMessage<<
" Chebyshev subspace pure noise : ord "<<orderfilter<<
" ["<<lo<<
","<<hi<<
"]"<<std::endl;
376 std::cout <<
GridLogMessage<<
" Chebyshev subspace pure noise : nbasis "<<nn<<std::endl;
379 for(
int b =0;b<nbasis;b++)
382 scale = std::pow(
norm2(noise),-0.5);
391 Cheb(hermop,noise,Mn);
392 scale = std::pow(
norm2(Mn),-0.5); Mn=Mn*scale;
397 PowerLaw(hermop,noise,Mn);
398 scale = std::pow(
norm2(Mn),-0.5); Mn=Mn*scale;
421 std::cout <<
GridLogMessage<<
" Chebyshev subspace pure noise : ord "<<orderfilter<<
" [0,"<<hi<<
"]"<<std::endl;
422 std::cout <<
GridLogMessage<<
" Chebyshev subspace pure noise : nbasis "<<nn<<std::endl;
424 for(
int b =0;b<nbasis;b++)
427 scale = std::pow(
norm2(noise),-0.5);
435 Cheb(hermop,noise,Mn);
437 scale = std::pow(
norm2(Mn),-0.5); Mn=Mn*scale;
455 for(
int b =0;b<nbasis;b++)
458 scale = std::pow(
norm2(noise),-0.5);
487 Cheb1(hermop,noise,Mn); scale = std::pow(
norm2(Mn),-0.5); noise=Mn*scale;
489 Cheb2(hermop,noise,Mn); scale = std::pow(
norm2(Mn),-0.5); noise=Mn*scale;
505 double Lo,
double tol,
int maxit)
515 std::cout <<
GridLogMessage<<
" Multishift subspace : Lo "<<Lo<<std::endl;
521 double epsilon = Lo/3;
522 std::vector<RealD> alpha({1.0/6.0,-1.0/2.0,1.0/2.0,-1.0/6.0});
523 std::vector<RealD> shifts({Lo,Lo+epsilon,Lo+2*epsilon,Lo+3*epsilon});
524 std::vector<RealD> tols({tol,tol,tol,tol});
525 std::cout <<
"sizes "<<alpha.size()<<
" "<<shifts.size()<<
" "<<tols.size()<<std::endl;
528 std::cout <<
"msf constructed "<<std::endl;
533 msf.
order=alpha.size();
536 for(
int b =0;b<nbasis;b++)
539 scale = std::pow(
norm2(noise),-0.5);
546 MSCG(hermop,noise,Mn);
547 scale = std::pow(
norm2(Mn),-0.5); Mn=Mn*scale;
556 double Lo,
double tol,
int maxit)
559 for(
int b =0;b<nbasis;b++)
565 RealD scale = std::pow(
norm2(tmp),-0.5); tmp=tmp*scale;
575 std::vector<FineField> src_mrhs(nrhs,
FineGrid);
576 std::vector<FineField> res_mrhs(nrhs,
FineGrid);
578 for(
int b =0;b<nbasis;b+=nrhs)
581 RealD scale = std::pow(
norm2(tmp),-0.5); tmp=tmp*scale;
586 for(
int r=0;r<
MIN(nbasis-b,nrhs);r++){
589 for(
int r=0;r<nrhs;r++){
590 res_mrhs[r] =
Zero();
592 theHDCG(src_mrhs,res_mrhs);
594 for(
int r=0;r<
MIN(nbasis-b,nrhs);r++){
596 RealD scale = std::pow(
norm2(tmp),-0.5); tmp=tmp*scale;
#define accelerator_for(iterator, num, nsimd,...)
RealD AggregatePowerLaw(RealD x)
ComplexD innerProduct(const Lattice< vobj > &left, const Lattice< vobj > &right)
RealD norm2(const Lattice< vobj > &arg)
void gaussian(GridParallelRNG &rng, Lattice< vobj > &l)
void blockOrthogonalise(Lattice< CComplex > &ip, std::vector< Lattice< vobj > > &Basis)
void blockPromote(const Lattice< iVector< CComplex, nbasis > > &coarseData, Lattice< vobj > &fineData, const VLattice &Basis)
void blockProject(Lattice< iVector< CComplex, nbasis > > &coarseData, const Lattice< vobj > &fineData, const VLattice &Basis)
#define autoView(l_v, l, mode)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
#define NAMESPACE_BEGIN(A)
std::complex< RealD > ComplexD
std::vector< Lattice< Fobj > > subspace
Lattice< siteVector > CoarseVector
virtual void CreateSubspaceChebyshev(GridParallelRNG &RNG, LinearOperatorBase< FineField > &hermop, int nn, double hi, double lo, int orderfilter, int ordermin, int orderstep, double filterlo)
virtual void CreateSubspacePolyCheby(GridParallelRNG &RNG, LinearOperatorBase< FineField > &hermop, int nn, double hi, double lo1, int orderfilter, double lo2, int orderstep)
virtual void RefineSubspace(LinearOperatorBase< FineField > &hermop, double Lo, double tol, int maxit)
virtual void CreateSubspace(GridParallelRNG &RNG, LinearOperatorBase< FineField > &hermop, int nn=nbasis)
virtual void CreateSubspaceChebyshevPowerLaw(GridParallelRNG &RNG, LinearOperatorBase< FineField > &hermop, int nn, double hi, int orderfilter)
virtual void CreateSubspaceRandom(GridParallelRNG &RNG)
void PromoteFromSubspace(const CoarseVector &CoarseVec, FineField &FineVec)
iVector< CComplex, nbasis > siteVector
Lattice< CComplex > CoarseScalar
virtual void CreateSubspaceGCR(GridParallelRNG &RNG, LinearOperatorBase< FineField > &DiracOp, int nn=nbasis)
Aggregation(GridBase *_CoarseGrid, GridBase *_FineGrid, int _checkerboard)
virtual void RefineSubspaceHDCG(LinearOperatorBase< FineField > &hermop, TwoLevelADEF2mrhs< FineField, CoarseVector > &theHDCG, int nrhs)
constexpr int Nbasis(void)
void ProjectToSubspace(CoarseVector &CoarseVec, const FineField &FineVec)
virtual void CreateSubspaceChebyshevNew(GridParallelRNG &RNG, LinearOperatorBase< FineField > &hermop, double hi)
Lattice< iMatrix< CComplex, nbasis > > CoarseMatrix
virtual void CreateSubspaceChebyshev(GridParallelRNG &RNG, LinearOperatorBase< FineField > &hermop, int nn, double hi, double lo, int orderfilter)
Lattice< Fobj > FineField
virtual void CreateSubspaceMultishift(GridParallelRNG &RNG, LinearOperatorBase< FineField > &hermop, double Lo, double tol, int maxit)
accelerator_inline int Checkerboard(void) const
virtual void Op(const Field &in, Field &out)=0
virtual void AdjOp(const Field &in, Field &out)=0
virtual void HermOp(const Field &in, Field &out)=0
std::vector< RealD > poles
std::vector< RealD > tolerances
std::vector< RealD > residues