From ccb5e8374b99987b43d72602dfdecb254b9a61c1 Mon Sep 17 00:00:00 2001 From: Felix Erben Date: Mon, 30 Sep 2019 17:36:15 +0100 Subject: [PATCH] z2-momentum phase module --- Hadrons/Modules/MSource/MomentumPhase.cc | 35 +++++ Hadrons/Modules/MSource/MomentumPhase.hpp | 160 ++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 Hadrons/Modules/MSource/MomentumPhase.cc create mode 100644 Hadrons/Modules/MSource/MomentumPhase.hpp diff --git a/Hadrons/Modules/MSource/MomentumPhase.cc b/Hadrons/Modules/MSource/MomentumPhase.cc new file mode 100644 index 00000000..f1ff48d6 --- /dev/null +++ b/Hadrons/Modules/MSource/MomentumPhase.cc @@ -0,0 +1,35 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MSource/MomentumPhase.cc + +Copyright (C) 2015-2019 + +Author: Felix Erben + +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 */ +#include + +using namespace Grid; +using namespace Hadrons; +using namespace MSource; + +template class Grid::Hadrons::MSource::TMomentumPhase; +template class Grid::Hadrons::MSource::TMomentumPhase; diff --git a/Hadrons/Modules/MSource/MomentumPhase.hpp b/Hadrons/Modules/MSource/MomentumPhase.hpp new file mode 100644 index 00000000..89bd0c8e --- /dev/null +++ b/Hadrons/Modules/MSource/MomentumPhase.hpp @@ -0,0 +1,160 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MSource/MomentumPhase.hpp + +Copyright (C) 2015-2019 + +Author: Felix Erben + +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_MomentumPhase_hpp_ +#define Hadrons_MSource_MomentumPhase_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/* + + Multiply source field by momentum phase + ----------------------------- + * can be used to multiply a Z2-wall source by a phase e^{ipx}, which is needed for + * 2pt-correlation functions of mesons with nonzero momenta. + + */ + +/****************************************************************************** + * MomentumPhase * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MSource) + +class MomentumPhasePar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(MomentumPhasePar, + std::string, src, + std::string, mom); +}; + +template +class TMomentumPhase: public Module +{ +public: + FERM_TYPE_ALIASES(FImpl,); +public: + // constructor + TMomentumPhase(const std::string name); + // destructor + virtual ~TMomentumPhase(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); +protected: + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + bool hasPhase_{false}; + std::string momphName_, tName_; +}; + +MODULE_REGISTER_TMP(MomentumPhase, TMomentumPhase, MSource); +MODULE_REGISTER_TMP(ZMomentumPhase, TMomentumPhase, MSource); + +/****************************************************************************** + * TMomentumPhase implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TMomentumPhase::TMomentumPhase(const std::string name) +: Module(name) +, momphName_ (name + "_momph") +, tName_ (name + "_t") +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TMomentumPhase::getInput(void) +{ + std::vector in = {par().src}; + + return in; +} + +template +std::vector TMomentumPhase::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TMomentumPhase::setup(void) +{ + envCreateLat(PropagatorField, getName()); + envCache(Lattice>, tName_, 1, envGetGrid(LatticeComplex)); + envCacheLat(LatticeComplex, momphName_); + envTmpLat(LatticeComplex, "coor"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TMomentumPhase::execute(void) +{ + LOG(Message) << "Multiplying source field " << par().src + << " by momentum phase " + << par().mom << std::endl; + auto &out = envGet(PropagatorField, getName()); + auto &src = envGet(PropagatorField, par().src); + auto &ph = envGet(LatticeComplex, momphName_); + auto &t = envGet(Lattice>, tName_); + + if (!hasPhase_) + { + Complex i(0.0,1.0); + std::vector p; + + envGetTmp(LatticeComplex, coor); + p = strToVec(par().mom); + ph = zero; + for(unsigned int mu = 0; mu < env().getNd(); mu++) + { + LatticeCoordinate(coor, mu); + ph = ph + (p[mu]/env().getDim(mu))*coor; + } + ph = exp((Real)(2*M_PI)*i*ph); + LatticeCoordinate(t, Tp); + hasPhase_ = true; + } + out = ph*src; +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MSource_MomentumPhase_hpp_