/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSolver/LocalCoherenceLanczos.hpp Copyright (C) 2015-2018 Author: Antonin Portelli 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 */ #ifndef Hadrons_MSolver_LocalCoherenceLanczos_hpp_ #define Hadrons_MSolver_LocalCoherenceLanczos_hpp_ #include #include #include #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * Local coherence Lanczos eigensolver * *****************************************************************************/ BEGIN_MODULE_NAMESPACE(MSolver) class LocalCoherenceLanczosPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(LocalCoherenceLanczosPar, std::string, action, bool, doCoarse, LanczosParams, fineParams, LanczosParams, coarseParams, ChebyParams, smoother, RealD, coarseRelaxTol, std::string, blockSize, std::string, output); }; template class TLocalCoherenceLanczos: public Module { public: FERM_TYPE_ALIASES(FImpl,); typedef LocalCoherenceLanczos LCL; typedef FermionEigenPack BasePack; typedef CoarseFermionEigenPack CoarsePack; typedef HADRONS_DEFAULT_SCHUR_OP SchurFMat; public: // constructor TLocalCoherenceLanczos(const std::string name); // destructor virtual ~TLocalCoherenceLanczos(void) = default; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); // setup virtual void setup(void); // execution virtual void execute(void); }; MODULE_REGISTER_TMP(LocalCoherenceLanczos, ARG(TLocalCoherenceLanczos), MSolver); MODULE_REGISTER_TMP(ZLocalCoherenceLanczos, ARG(TLocalCoherenceLanczos), MSolver); /****************************************************************************** * TLocalCoherenceLanczos implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template TLocalCoherenceLanczos::TLocalCoherenceLanczos(const std::string name) : Module(name) {} // dependencies/products /////////////////////////////////////////////////////// template std::vector TLocalCoherenceLanczos::getInput(void) { std::vector in = {par().action}; return in; } template std::vector TLocalCoherenceLanczos::getOutput(void) { std::vector out = {getName()}; return out; } // setup /////////////////////////////////////////////////////////////////////// template void TLocalCoherenceLanczos::setup(void) { LOG(Message) << "Setting up local coherence Lanczos eigensolver for" << " action '" << par().action << "' (" << nBasis << " eigenvectors)..." << std::endl; unsigned int Ls = env().getObjectLs(par().action); auto blockSize = strToVec(par().blockSize); env().createCoarseGrid(blockSize, Ls); auto cg = env().getCoarseGrid(blockSize, Ls); int cNm = (par().doCoarse) ? par().coarseParams.Nm : 0; LOG(Message) << "Coarse grid: " << cg->GlobalDimensions() << std::endl; envCreateDerived(BasePack, CoarsePack, getName(), Ls, par().fineParams.Nm, cNm, env().getRbGrid(Ls), cg); auto &epack = envGetDerived(BasePack, CoarsePack, getName()); envTmp(SchurFMat, "mat", Ls, envGet(FMat, par().action)); envGetTmp(SchurFMat, mat); envTmp(LCL, "solver", Ls, env().getRbGrid(Ls), cg, mat, Odd, epack.evec, epack.evecCoarse, epack.eval, epack.evalCoarse); } // execution /////////////////////////////////////////////////////////////////// template void TLocalCoherenceLanczos::execute(void) { auto &finePar = par().fineParams; auto &coarsePar = par().coarseParams; auto &epack = envGetDerived(BasePack, CoarsePack, getName()); epack.record.operatorXml = vm().getModule(par().action)->parString(); epack.record.solverXml = parString(); envGetTmp(LCL, solver); LOG(Message) << "Performing fine grid IRL -- Nstop= " << finePar.Nstop << ", Nk= " << finePar.Nk << ", Nm= " << finePar.Nm << std::endl; solver.calcFine(finePar.Cheby, finePar.Nstop, finePar.Nk, finePar.Nm, finePar.resid,finePar.MaxIt, finePar.betastp, finePar.MinRes); solver.testFine(finePar.resid*100.0); if (!par().output.empty()) { epack.writeFine(par().output, vm().getTrajectory()); } if (par().doCoarse) { LOG(Message) << "Orthogonalising" << std::endl; solver.Orthogonalise(); LOG(Message) << "Performing coarse grid IRL -- Nstop= " << coarsePar.Nstop << ", Nk= " << coarsePar.Nk << ", Nm= " << coarsePar.Nm << std::endl; solver.calcCoarse(coarsePar.Cheby, par().smoother, par().coarseRelaxTol, coarsePar.Nstop, coarsePar.Nk, coarsePar.Nm, coarsePar.resid, coarsePar.MaxIt, coarsePar.betastp, coarsePar.MinRes); solver.testCoarse(coarsePar.resid*100.0, par().smoother, par().coarseRelaxTol); if (!par().output.empty()) { epack.writeCoarse(par().output, vm().getTrajectory()); } } } END_MODULE_NAMESPACE END_HADRONS_NAMESPACE #endif // Hadrons_MSolver_LocalCoherenceLanczos_hpp_