From ccb5e8374b99987b43d72602dfdecb254b9a61c1 Mon Sep 17 00:00:00 2001 From: Felix Erben Date: Mon, 30 Sep 2019 17:36:15 +0100 Subject: [PATCH 1/2] 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_ From 5f22810f5572bec31d441efb11160f7227bd1a36 Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Wed, 2 Oct 2019 14:49:35 +0100 Subject: [PATCH 2/2] Fix after GPU merge: Phase in Free Propagator --- Grid/qcd/action/fermion/DomainWallFermion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Grid/qcd/action/fermion/DomainWallFermion.h b/Grid/qcd/action/fermion/DomainWallFermion.h index e32e5917..5639debe 100644 --- a/Grid/qcd/action/fermion/DomainWallFermion.h +++ b/Grid/qcd/action/fermion/DomainWallFermion.h @@ -80,7 +80,7 @@ public: theFFT.FFT_all_dim(out,prop_k,FFT::backward); } //phase for boundary condition - out = out * exp(Scalar(2.0*M_PI)*ci*ph); + out = out * exp(ci*ph); }; virtual void FreePropagator(const FermionField &in,FermionField &out,RealD mass,std::vector boundary,std::vector twist) {