#ifndef Hadrons_MSource_JacobiSmear_hpp_ #define Hadrons_MSource_JacobiSmear_hpp_ #include #include #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * JacobiSmear * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MSource) class JacobiSmearPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(JacobiSmearPar, std::string, gauge, double, width, int, iterations, int, orthog, std::string, source); }; template class TJacobiSmear: public Module { public: FERM_TYPE_ALIASES(FImpl,); typedef typename FImpl::GaugeLinkField GaugeMat; public: // constructor TJacobiSmear(const std::string name); // destructor virtual ~TJacobiSmear(void) {}; // 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(JacobiSmear, TJacobiSmear, MSource); /****************************************************************************** * TJacobiSmear implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template TJacobiSmear::TJacobiSmear(const std::string name) : Module(name) {} // dependencies/products /////////////////////////////////////////////////////// template std::vector TJacobiSmear::getInput(void) { std::vector in = {par().source, par().gauge}; return in; } template std::vector TJacobiSmear::getOutput(void) { std::vector out = {getName()}; return out; } // setup /////////////////////////////////////////////////////////////////////// template void TJacobiSmear::setup(void) { envCreateLat(PropagatorField, getName()); envTmp(std::vector, "Umu", 1, 4, envGetGrid(LatticeColourMatrix)); } // execution /////////////////////////////////////////////////////////////////// template void TJacobiSmear::execute(void) { auto &out = envGet(PropagatorField, getName()); auto &src = envGet(PropagatorField, par().source); auto &U = envGet(GaugeField, par().gauge); envGetTmp(std::vector, Umu); for(int mu=0; mu<4; mu++) { Umu.at(mu)=peekLorentz(U,mu); } CovariantSmearing covsmear; out=src; startTimer("Jacobi iteration"); covsmear.GaussianSmear(Umu, out, par().width, par().iterations, par().orthog); stopTimer("Jacobi iteration"); } END_MODULE_NAMESPACE END_HADRONS_NAMESPACE #endif // Hadrons_MSource_JacobiSmear_hpp_