#ifndef Hadrons_MGauge_StoutSmearing_hpp_ #define Hadrons_MGauge_StoutSmearing_hpp_ #include #include #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * Stout smearing * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MGauge) class StoutSmearingPar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(StoutSmearingPar, std::string, gauge, unsigned int, steps, double, rho); }; template class TStoutSmearing: public Module { public: typedef typename GImpl::Field GaugeField; public: // constructor TStoutSmearing(const std::string name); // destructor virtual ~TStoutSmearing(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(StoutSmearing, TStoutSmearing, MGauge); /****************************************************************************** * TStoutSmearing implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template TStoutSmearing::TStoutSmearing(const std::string name) : Module(name) {} // dependencies/products /////////////////////////////////////////////////////// template std::vector TStoutSmearing::getInput(void) { std::vector in = {par().gauge}; return in; } template std::vector TStoutSmearing::getOutput(void) { std::vector out = {getName()}; return out; } // setup /////////////////////////////////////////////////////////////////////// template void TStoutSmearing::setup(void) { envCreateLat(GaugeField, getName()); envTmpLat(GaugeField, "buf"); } // execution /////////////////////////////////////////////////////////////////// template void TStoutSmearing::execute(void) { LOG(Message) << "Smearing '" << par().gauge << "' with " << par().steps << " step" << ((par().steps > 1) ? "s" : "") << " of stout smearing and rho= " << par().rho << std::endl; Smear_Stout smearer(par().rho); auto &U = envGet(GaugeField, par().gauge); auto &Usmr = envGet(GaugeField, getName()); envGetTmp(GaugeField, buf); buf = U; for (unsigned int n = 0; n < par().steps; ++n) { smearer.smear(Usmr, buf); buf = Usmr; } } END_MODULE_NAMESPACE END_HADRONS_NAMESPACE #endif // Hadrons_MGauge_StoutSmearing_hpp_