/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: ./tests/Test_general_coarse_hdcg.cc Copyright (C) 2023 Author: Peter Boyle 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 #include #include #include using namespace std; using namespace Grid; template void SaveFineEvecs(aggregation &Agg,std::string file) { #ifdef HAVE_LIME emptyUserRecord record; ScidacWriter WR(Agg[0].Grid()->IsBoss()); WR.open(file); for(int b=0;b void SaveBasis(aggregation &Agg,std::string file) { #ifdef HAVE_LIME emptyUserRecord record; ScidacWriter WR(Agg.FineGrid->IsBoss()); WR.open(file); for(int b=0;b void LoadBasis(aggregation &Agg, std::string file) { #ifdef HAVE_LIME emptyUserRecord record; ScidacReader RD ; RD.open(file); for(int b=0;b void LoadFineEvecs(aggregation &Agg, std::string file,LatticeFermionF & conv_tmp) { #ifdef HAVE_LIME emptyUserRecord record; ScidacReader RD ; RD.open(file); for(int b=0;b void SaveEigenvectors(std::vector &eval, std::vector &evec, std::string evec_file, std::string eval_file) { #ifdef HAVE_LIME emptyUserRecord record; ScidacWriter WR(evec[0].Grid()->IsBoss()); WR.open(evec_file); for(int b=0;b void LoadEigenvectors(std::vector &eval, std::vector &evec, std::string evec_file, std::string eval_file) { #ifdef HAVE_LIME XmlReader RDx(eval_file); read(RDx,"evals",eval); emptyUserRecord record; Grid::ScidacReader RD ; RD.open(evec_file); GRID_ASSERT(evec.size()==eval.size()); for(int k=0;k class HermOpAdaptor : public LinearOperatorBase { LinearOperatorBase & wrapped; public: HermOpAdaptor(LinearOperatorBase &wrapme) : wrapped(wrapme) {}; void Op (const Field &in, Field &out) { wrapped.HermOp(in,out); } void HermOp(const Field &in, Field &out) { wrapped.HermOp(in,out); } void AdjOp (const Field &in, Field &out){ wrapped.HermOp(in,out); } void OpDiag (const Field &in, Field &out) { GRID_ASSERT(0); } void OpDir (const Field &in, Field &out,int dir,int disp) { GRID_ASSERT(0); } void OpDirAll (const Field &in, std::vector &out) { GRID_ASSERT(0); }; void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ GRID_ASSERT(0); } }; template class CGSmoother : public LinearFunction { public: using LinearFunction::operator(); typedef LinearOperatorBase FineOperator; FineOperator & _SmootherOperator; int iters; CGSmoother(int _iters, FineOperator &SmootherOperator) : _SmootherOperator(SmootherOperator), iters(_iters) { std::cout << GridLogMessage<<" Mirs smoother order "< CG(0.0,iters,false); // non-converge is just fine in a smoother out=Zero(); CG(_SmootherOperator,in,out); } }; int main (int argc, char ** argv) { Grid_init(&argc,&argv); const int Ls=24; const int nbasis = 62; const int cb = 0 ; RealD mass=0.00078; RealD M5=1.8; RealD b=1.5; RealD c=0.5; 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); // Construct a coarsened grid with 4^4 cell Coordinate Block({4,4,6,4}); Coordinate 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); ///////////////////////// Configuration ///////////////////////////////// LatticeGaugeField Umu(UGrid); FieldMetaData header; std::string file("ckpoint_lat.1000"); NerscIO::readConfiguration(Umu,header,file); //////////////////////// Fermion action ////////////////////////////////// MobiusFermionD Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5,b,c); SchurDiagMooeeOperator HermOpEO(Ddwf); const int Fine_Nstop = 200; const int Fine_Nk = 100; const int Fine_Np = 100; const int Fine_Nm = Fine_Nk+Fine_Np; typedef LatticeFermion FermionField; std::vector Fine_eval; std::vector Fine_evec; LatticeFermionF conv_tmp(FrbGridF); Fine_eval.resize(Fine_Nstop); Fine_evec.resize(Fine_Nstop,FrbGrid); std::string evec_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/Subspace.phys48.evecF"); LoadFineEvecs(Fine_evec,evec_file,conv_tmp); typedef HermOpAdaptor HermFineMatrix; HermFineMatrix FineHermOp(HermOpEO); //////////////////////////////////////////////////////////// ///////////// Coarse basis and Little Dirac Operator /////// //////////////////////////////////////////////////////////// typedef GeneralCoarsenedMatrix LittleDiracOperator; typedef LittleDiracOperator::CoarseVector CoarseVector; NextToNextToNextToNearestStencilGeometry5D geom(Coarse5d); typedef Aggregation Subspace; Subspace Aggregates(Coarse5d,FrbGrid,cb); //////////////////////////////////////////////////////////// // Need to check about red-black grid coarsening //////////////////////////////////////////////////////////// // std::string subspace_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/Subspace.phys48.mixed.2500.60"); // // std::string subspace_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/Subspace.phys48.new.62"); // std::string refine_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/Subspace.phys48.evec"); std::string refine_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/Refine.phys48.mixed.2500.60"); // std::string ldop_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/LittleDiracOp.phys48.mixed.60"); // std::string evec_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/evecs.scidac"); // std::string eval_file("/lustre/orion/phy157/proj-shared/phy157_dwf/paboyle/eval.xml"); bool load_agg=true; bool load_refine=true; ////////////////////////////////////////// // Block projector for coarse/fine ////////////////////////////////////////// MultiRHSBlockProject MrhsProjector; ///////////////////////////////////////////////// // Mirs smoother ///////////////////////////////////////////////// int ord=8; RealD lo=2.0; RealD MirsShift = lo; ShiftedHermOpLinearOperator ShiftedFineHermOp(HermOpEO,MirsShift); CGSmoother CGsmooth(ord,ShiftedFineHermOp) ; LoadBasis(Aggregates,refine_file); Aggregates.Orthogonalise(); std::cout << "**************************************"< Fine_ev(1,FrbGrid); std::vector Fine_ev_compressed(1,FrbGrid); std::vector c_evec(1,Coarse5d); for(int ev=0;ev