/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: ./lib/algorithms/Aggregates.h Copyright (C) 2015 Author: Azusa Yamaguchi Author: Peter Boyle Author: Peter Boyle Author: paboyle 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 */ #pragma once NAMESPACE_BEGIN(Grid); inline RealD AggregatePowerLaw(RealD x) { // return std::pow(x,-4); // return std::pow(x,-3); return std::pow(x,-5); } template class Aggregation { public: constexpr int Nbasis(void) { return nbasis; }; typedef iVector siteVector; typedef Lattice CoarseVector; typedef Lattice > CoarseMatrix; typedef Lattice< CComplex > CoarseScalar; // used for inner products on fine field typedef Lattice FineField; GridBase *CoarseGrid; GridBase *FineGrid; std::vector > subspace; int checkerboard; int Checkerboard(void){return checkerboard;} Aggregation(GridBase *_CoarseGrid,GridBase *_FineGrid,int _checkerboard) : CoarseGrid(_CoarseGrid), FineGrid(_FineGrid), subspace(nbasis,_FineGrid), checkerboard(_checkerboard) { }; void Orthogonalise(void){ CoarseScalar InnerProd(CoarseGrid); // std::cout << GridLogMessage <<" Block Gramm-Schmidt pass 1"< &hermop,int nn=nbasis) { RealD scale; ConjugateGradient CG(1.0e-2,100,false); FineField noise(FineGrid); FineField Mn(FineGrid); for(int b=0;b "< "< &hermop, int nn, double hi, double lo, int orderfilter, int ordermin, int orderstep, double filterlo ) { RealD scale; FineField noise(FineGrid); FineField Mn(FineGrid); FineField tmp(FineGrid); // New normalised noise gaussian(RNG,noise); scale = std::pow(norm2(noise),-0.5); noise=noise*scale; std::cout << GridLogMessage<<" Chebyshev subspace pass-1 : ord "< "< Cheb(lo,hi,orderfilter); Cheb(hermop,noise,Mn); // normalise scale = std::pow(norm2(Mn),-0.5); Mn=Mn*scale; subspace[b] = Mn; hermop.Op(Mn,tmp); std::cout< "<oSites(), Nsimd, { coalescedWrite(y_v[ss],xscale*y_v(ss)+mscale*Tn_v(ss)); coalescedWrite(Tnp_v[ss],2.0*y_v(ss)-Tnm_v(ss)); }); // Possible more fine grained control is needed than a linear sweep, // but huge productivity gain if this is simple algorithm and not a tunable int m =1; if ( n>=ordermin ) m=n-ordermin; if ( (m%orderstep)==0 ) { Mn=*Tnp; scale = std::pow(norm2(Mn),-0.5); Mn=Mn*scale; subspace[b] = Mn; hermop.Op(Mn,tmp); std::cout< "< &hermop, int nn, double hi, double lo, int orderfilter ) { RealD scale; FineField noise(FineGrid); FineField Mn(FineGrid); FineField tmp(FineGrid); // New normalised noise std::cout << GridLogMessage<<" Chebyshev subspace pure noise : ord "< "< Cheb(lo,hi,orderfilter); Cheb(hermop,noise,Mn); scale = std::pow(norm2(Mn),-0.5); Mn=Mn*scale; // Refine Chebyshev PowerLaw(lo,hi,1000,AggregatePowerLaw); noise = Mn; PowerLaw(hermop,noise,Mn); scale = std::pow(norm2(Mn),-0.5); Mn=Mn*scale; // normalise subspace[b] = Mn; hermop.Op(Mn,tmp); std::cout< "< &hermop, int nn, double hi, int orderfilter ) { RealD scale; FineField noise(FineGrid); FineField Mn(FineGrid); FineField tmp(FineGrid); // New normalised noise std::cout << GridLogMessage<<" Chebyshev subspace pure noise : ord "< "< Cheb(0.0,hi,orderfilter,AggregatePowerLaw); Cheb(hermop,noise,Mn); // normalise scale = std::pow(norm2(Mn),-0.5); Mn=Mn*scale; subspace[b] = Mn; hermop.Op(Mn,tmp); std::cout< "< &hermop, double hi ) { RealD scale; FineField noise(FineGrid); FineField Mn(FineGrid); FineField tmp(FineGrid); // New normalised noise for(int b =0;b "< Cheb1(3.0,hi,300); Chebyshev Cheb2(1.0,hi,50); Chebyshev Cheb3(0.5,hi,300); Chebyshev Cheb4(0.05,hi,500); Chebyshev Cheb5(0.01,hi,2000); */ /* 242 */ /* Chebyshev Cheb3(0.1,hi,300); Chebyshev Cheb2(0.02,hi,1000); Chebyshev Cheb1(0.003,hi,2000); 8? */ /* How many?? */ Chebyshev Cheb2(0.001,hi,2500); // 169 iters on HDCG after refine Chebyshev Cheb1(0.02,hi,600); // Chebyshev Cheb2(0.001,hi,1500); // Chebyshev Cheb1(0.02,hi,600); Cheb1(hermop,noise,Mn); scale = std::pow(norm2(Mn),-0.5); noise=Mn*scale; hermop.Op(noise,tmp); std::cout< "< "< "< "< "< "< &hermop, double Lo,double tol,int maxit) { RealD scale; FineField noise(FineGrid); FineField Mn(FineGrid); FineField tmp(FineGrid); // New normalised noise std::cout << GridLogMessage<<" Multishift subspace : Lo "< alpha({1.0/6.0,-1.0/2.0,1.0/2.0,-1.0/6.0}); std::vector shifts({Lo,Lo+epsilon,Lo+2*epsilon,Lo+3*epsilon}); std::vector tols({tol,tol,tol,tol}); std::cout << "sizes "< MSCG(maxit,msf); for(int b =0;b "< "< &hermop, double Lo,double tol,int maxit) { FineField tmp(FineGrid); for(int b =0;b CGsloppy(tol,maxit,false); ShiftedHermOpLinearOperator ShiftedFineHermOp(hermop,Lo); tmp=Zero(); CGsloppy(hermop,subspace[b],tmp); RealD scale = std::pow(norm2(tmp),-0.5); tmp=tmp*scale; subspace[b]=tmp; hermop.Op(subspace[b],tmp); std::cout< "< &hermop, TwoLevelADEF2mrhs & theHDCG, int nrhs) { std::vector src_mrhs(nrhs,FineGrid); std::vector res_mrhs(nrhs,FineGrid); FineField tmp(FineGrid); for(int b =0;b "< "<