/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MSource/Laplacian.hpp Copyright (C) 2017 Author: Guido Cossu 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_MSource_Laplacian_hpp_ #define Hadrons_MSource_Laplacian_hpp_ #include #include #include BEGIN_HADRONS_NAMESPACE /* Laplacian smearing source ----------------------------- * options: - source: name of source object to be smeared (string) - N: number of steps (integer) - alpha: smearing parameter (real) */ /****************************************************************************** * Z2 stochastic source * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MSource) class LaplacianPar : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(LaplacianPar, std::string, source, std::string, gauge, unsigned int, N, double, alpha); }; template class TLaplacian : public Module { public: FERM_TYPE_ALIASES(FImpl, ); public: // constructor TLaplacian(const std::string name); // destructor virtual ~TLaplacian(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_NS(LaplaceSmearing, TLaplacian, MSource); /****************************************************************************** * TLaplacian template implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template TLaplacian::TLaplacian(const std::string name) : Module(name) { } // dependencies/products /////////////////////////////////////////////////////// template std::vector TLaplacian::getInput(void) { std::vector in = {par().source, par().gauge}; return in; } template std::vector TLaplacian::getOutput(void) { std::vector out = {getName()}; return out; } // setup /////////////////////////////////////////////////////////////////////// template void TLaplacian::setup(void) { env().template registerLattice(getName()); } // execution /////////////////////////////////////////////////////////////////// template void TLaplacian::execute(void) { FermionField source(env().getGrid()), tmp(env().getGrid()); PropagatorField &SmrSrc = *env().template createLattice(getName()); PropagatorField &fullSrc = *env().template getObject(par().source); auto &U = *env().template getObject(par().gauge); Laplacian LaplaceOperator(env().getGrid()); LaplaceOperator.ImportGauge(U); double prefactor = par().alpha / (double)(par().N); for (unsigned int s = 0; s < Ns; ++s) { for (unsigned int c = 0; c < Nc; ++c) { PropToFerm(source, fullSrc, s, c); for (int smr = 0; smr < par().N; ++smr) { LaplaceOperator.M(source, tmp); source += prefactor * tmp; } FermToProp(SmrSrc, source, s, c); } } } END_MODULE_NAMESPACE END_HADRONS_NAMESPACE #endif // Hadrons_MSource_Z2_hpp_