From fa97a56fdd8bea0b44068bb7a4e4b0874a03f47b Mon Sep 17 00:00:00 2001 From: Vera Guelpers Date: Fri, 14 Dec 2018 12:40:26 +0000 Subject: [PATCH] Hadrons: sequential Aslash insertion on propagator --- Hadrons/Modules.hpp | 1 + Hadrons/Modules/MSource/SeqAslash.cc | 36 +++++ Hadrons/Modules/MSource/SeqAslash.hpp | 186 ++++++++++++++++++++++++++ Hadrons/modules.inc | 2 + 4 files changed, 225 insertions(+) create mode 100644 Hadrons/Modules/MSource/SeqAslash.cc create mode 100644 Hadrons/Modules/MSource/SeqAslash.hpp diff --git a/Hadrons/Modules.hpp b/Hadrons/Modules.hpp index 787fecea..1305e6b7 100644 --- a/Hadrons/Modules.hpp +++ b/Hadrons/Modules.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include diff --git a/Hadrons/Modules/MSource/SeqAslash.cc b/Hadrons/Modules/MSource/SeqAslash.cc new file mode 100644 index 00000000..6586f2f2 --- /dev/null +++ b/Hadrons/Modules/MSource/SeqAslash.cc @@ -0,0 +1,36 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MSource/SeqAslash.cc + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Vera Guelpers + +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::TSeqAslash; + diff --git a/Hadrons/Modules/MSource/SeqAslash.hpp b/Hadrons/Modules/MSource/SeqAslash.hpp new file mode 100644 index 00000000..a31051fd --- /dev/null +++ b/Hadrons/Modules/MSource/SeqAslash.hpp @@ -0,0 +1,186 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MSource/SeqAslash.hpp + +Copyright (C) 2015-2018 + +Author: Antonin Portelli +Author: Lanny91 +Author: Vera Guelpers + +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_SeqAslash_hpp_ +#define Hadrons_MSource_SeqAslash_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/* + + Sequential source + ----------------------------- + * src_x = q_x * theta(x_3 - tA) * theta(tB - x_3) * i * A_mu g_mu * exp(i x.mom) + + * options: + - q: input propagator (string) + - tA: begin timeslice (integer) + - tB: end timesilce (integer) + - emField: input photon field (string) + - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") + + */ + +/****************************************************************************** + * SeqAslash * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MSource) + +class SeqAslashPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(SeqAslashPar, + std::string, q, + unsigned int, tA, + unsigned int, tB, + std::string, emField, + std::string, mom); +}; + +template +class TSeqAslash: public Module +{ +public: + FERM_TYPE_ALIASES(FImpl,); +public: + typedef PhotonR::GaugeField EmField; +public: + // constructor + TSeqAslash(const std::string name); + // destructor + virtual ~TSeqAslash(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(SeqAslash, TSeqAslash, MSource); + +/****************************************************************************** + * TSeqAslash implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TSeqAslash::TSeqAslash(const std::string name) +: Module(name) +, momphName_ (name + "_momph") +, tName_ (name + "_t") +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TSeqAslash::getInput(void) +{ + std::vector in = {par().q,par().emField}; + + return in; +} + +template +std::vector TSeqAslash::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TSeqAslash::setup(void) +{ + envCreateLat(PropagatorField, getName()); + envCache(Lattice>, tName_, 1, envGetGrid(LatticeComplex)); + envCacheLat(LatticeComplex, momphName_); + envTmpLat(LatticeComplex, "coor"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TSeqAslash::execute(void) +{ + if (par().tA == par().tB) + { + LOG(Message) << "Generating Aslash sequential source at t= " << par().tA + << " using the photon field " << par().emField << std::endl; + } + else + { + LOG(Message) << "Generating Aslash sequential source for " + << par().tA << " <= t <= " << par().tB + << " using the photon field " << par().emField << std::endl; + } + auto &src = envGet(PropagatorField, getName()); src=zero; + auto &q = envGet(PropagatorField, par().q); + 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; + } + auto &stoch_photon = envGet(EmField, par().emField); + Complex ci(0.0,1.0); + for(unsigned int mu=0;mu<=3;mu++) + { + Gamma gmu(Gamma::gmu[mu]); + src = src + where((t >= par().tA) and (t <= par().tB), ci * PeekIndex(stoch_photon, mu) *ph*(gmu*q), 0.*q); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MSource_SeqAslash_hpp_ diff --git a/Hadrons/modules.inc b/Hadrons/modules.inc index 88cfea88..1e1f1f4e 100644 --- a/Hadrons/modules.inc +++ b/Hadrons/modules.inc @@ -16,6 +16,7 @@ modules_cc =\ Modules/MSource/Wall.cc \ Modules/MSource/SeqConserved.cc \ Modules/MSource/SeqGamma.cc \ + Modules/MSource/SeqAslash.cc \ Modules/MSource/Z2.cc \ Modules/MSink/Point.cc \ Modules/MSink/Smear.cc \ @@ -85,6 +86,7 @@ modules_hpp =\ Modules/MFermion/FreeProp.hpp \ Modules/MFermion/GaugeProp.hpp \ Modules/MSource/SeqGamma.hpp \ + Modules/MSource/SeqAslash.hpp \ Modules/MSource/Point.hpp \ Modules/MSource/Wall.hpp \ Modules/MSource/Z2.hpp \