diff --git a/tests/debug/Test_general_coarse_new.cc b/tests/debug/Test_general_coarse_new.cc new file mode 100644 index 00000000..75d6114a --- /dev/null +++ b/tests/debug/Test_general_coarse_new.cc @@ -0,0 +1,304 @@ + /************************************************************************************* + + Grid physics library, www.github.com/paboyle/Grid + + Source file: ./tests/Test_padded_cell.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 +#include +#include + +#include +#include + +using namespace std; +using namespace Grid; + +gridblasHandle_t GridBLAS::gridblasHandle; +int GridBLAS::gridblasInit; + +/////////////////////// +// Tells little dirac op to use MdagM as the .Op() +/////////////////////// +template +class HermOpAdaptor : public LinearOperatorBase +{ + LinearOperatorBase & wrapped; +public: + HermOpAdaptor(LinearOperatorBase &wrapme) : wrapped(wrapme) {}; + void OpDiag (const Field &in, Field &out) { assert(0); } + void OpDir (const Field &in, Field &out,int dir,int disp) { assert(0); } + void OpDirAll (const Field &in, std::vector &out){ assert(0); }; + void Op (const Field &in, Field &out){ + wrapped.HermOp(in,out); + } + void AdjOp (const Field &in, Field &out){ + wrapped.HermOp(in,out); + } + void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ assert(0); } + void HermOp(const Field &in, Field &out){ + wrapped.HermOp(in,out); + } +}; + + +int main (int argc, char ** argv) +{ + Grid_init(&argc,&argv); + + const int Ls=4; + + 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 + 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); + + LatticeFermion src(FGrid); random(RNG5,src); + LatticeFermion result(FGrid); result=Zero(); + LatticeFermion ref(FGrid); ref=Zero(); + LatticeFermion tmp(FGrid); + LatticeFermion err(FGrid); + LatticeGaugeField Umu(UGrid); + SU::HotConfiguration(RNG4,Umu); + // Umu=Zero(); + + RealD mass=0.1; + RealD M5=1.8; + + DomainWallFermionD Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); + + const int nbasis = 16; + const int cb = 0 ; + LatticeFermion prom(FGrid); + + std::vector subspace(nbasis,FGrid); + + std::cout< HermDefOp(Ddwf); + + /////////////////////////////////////////////////// + // Random aggregation space + /////////////////////////////////////////////////// + std::cout< Subspace; + Subspace Aggregates(Coarse5d,FGrid,cb); + Aggregates.CreateSubspaceRandom(RNG5); + + /////////////////////////////////////////////////// + // Build little dirac op + /////////////////////////////////////////////////// + std::cout< LittleDiracOperator; + typedef LittleDiracOperator::CoarseVector CoarseVector; + + NextToNearestStencilGeometry5D geom(Coarse5d); + LittleDiracOperator LittleDiracOp(geom,FGrid,Coarse5d); + LittleDiracOperator LittleDiracOpCol(geom,FGrid,Coarse5d); + + HermOpAdaptor HOA(HermDefOp); + + LittleDiracOp.CoarsenOperator(HOA,Aggregates); + + /////////////////////////////////////////////////// + // Test the operator + /////////////////////////////////////////////////// + CoarseVector c_src (Coarse5d); + CoarseVector c_res (Coarse5d); + CoarseVector c_res_dag(Coarse5d); + CoarseVector c_proj(Coarse5d); + + subspace=Aggregates.subspace; + + // random(CRNG,c_src); + c_src = 1.0; + + blockPromote(c_src,err,subspace); + + prom=Zero(); + for(int b=0;b