diff --git a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp index e9b3f00d..347371a3 100644 --- a/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp +++ b/extras/Hadrons/Modules/MSolver/RBPrecCG.hpp @@ -118,7 +118,7 @@ std::vector TRBPrecCG::getReference(void) template std::vector TRBPrecCG::getOutput(void) { - std::vector out = {getName()}; + std::vector out = {getName(), getName() + "_subtract"}; return out; } @@ -158,7 +158,7 @@ void TRBPrecCG::setup(void) guesser.reset(new CoarseGuesser(epack.evec, epack.evecCoarse, epack.evalCoarse)); } - catch (Exceptions::ObjectDefinition &) + catch (Exceptions::Definition &e) { auto &epack = envGet(EPack, par().eigenPack); @@ -168,19 +168,22 @@ void TRBPrecCG::setup(void) guesser.reset(new FineGuesser(epack.evec, epack.eval)); } } - auto solver = [&mat, guesser, this](FermionField &sol, - const FermionField &source) - { - ConjugateGradient cg(par().residual, - par().maxIteration); - HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); - - schurSolver(mat, source, sol, *guesser); + auto makeSolver = [&mat, guesser, this](bool subGuess) { + return [&mat, guesser, subGuess, this](FermionField &sol, + const FermionField &source) { + ConjugateGradient cg(par().residual, + par().maxIteration); + HADRONS_DEFAULT_SCHUR_SOLVE schurSolver(cg); + schurSolver.subtractGuess(subGuess); + schurSolver(mat, source, sol, *guesser); + }; }; + auto solver = makeSolver(false); envCreate(Solver, getName(), Ls, solver, mat); + auto solver_subtract = makeSolver(true); + envCreate(Solver, getName() + "_subtract", Ls, solver_subtract, mat); } - // execution /////////////////////////////////////////////////////////////////// template void TRBPrecCG::execute(void)