diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index 68b96822..d92f2661 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -66,6 +66,7 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp new file mode 100644 index 00000000..59b7097c --- /dev/null +++ b/extras/Hadrons/Modules/MScalarSUN/TransProj.hpp @@ -0,0 +1,158 @@ +#ifndef Hadrons_MScalarSUN_TransProj_hpp_ +#define Hadrons_MScalarSUN_TransProj_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Transverse projection * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MScalarSUN) + +class TransProjPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(TransProjPar, + std::string, op, + DiffType, type, + std::string, output); +}; + +template +class TTransProj: public Module +{ +public: + typedef typename SImpl::Field Field; + typedef typename SImpl::ComplexField ComplexField; + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, op, + Complex , value); + }; +public: + // constructor + TTransProj(const std::string name); + // destructor + virtual ~TTransProj(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(TransProjSU2, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU3, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU4, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU5, TTransProj>, MScalarSUN); +MODULE_REGISTER_NS(TransProjSU6, TTransProj>, MScalarSUN); + +/****************************************************************************** + * TTransProj implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TTransProj::TTransProj(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TTransProj::getInput(void) +{ + std::vector in = {par().op}; + + return in; +} + +template +std::vector TTransProj::getOutput(void) +{ + std::vector out = {getName()}; + + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + out.push_back(varName(getName(), mu, nu)); + } + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TTransProj::setup(void) +{ + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + envCreateLat(ComplexField, varName(getName(), mu, nu)); + } + envTmpLat(ComplexField, "buf1"); + envTmpLat(ComplexField, "buf2"); + envTmpLat(ComplexField, "lap"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TTransProj::execute(void) +{ + LOG(Message) << "Computing (delta_mu,nu d^2 - d_mu*d_nu)*op using " + << par().type << " derivatives and op= '" << par().op + << "'" << std::endl; + + std::vector result; + auto &op = envGet(ComplexField, par().op); + + envGetTmp(ComplexField, buf1); + envGetTmp(ComplexField, buf2); + envGetTmp(ComplexField, lap); + lap = zero; + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + { + dmu(buf1, op, mu, par().type); + dmu(buf2, buf1, mu, par().type); + lap += buf2; + } + for (unsigned int mu = 0; mu < env().getNd(); ++mu) + for (unsigned int nu = mu; nu < env().getNd(); ++nu) + { + auto &out = envGet(ComplexField, varName(getName(), mu, nu)); + dmu(buf1, op, mu, par().type); + dmu(buf2, buf1, nu, par().type); + out = -buf2; + if (mu == nu) + { + out += lap; + } + if (!par().output.empty()) + { + Result r; + + r.op = "(delta_" + std::to_string(mu) + "," + std::to_string(nu) + + " d^2 - d_" + std::to_string(mu) + "*d_" + + std::to_string(nu) + ")*op"; + r.value = TensorRemove(sum(out)); + result.push_back(r); + } + } + if (result.size() > 0) + { + saveResult(par().output, "transproj", result); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MScalarSUN_TransProj_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index ea94179e..dbfa359c 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -49,6 +49,7 @@ modules_hpp =\ Modules/MScalarSUN/TwoPoint.hpp \ Modules/MScalarSUN/TrPhi.hpp \ Modules/MScalarSUN/Utils.hpp \ + Modules/MScalarSUN/TransProj.hpp \ Modules/MScalarSUN/TrKinetic.hpp \ Modules/MIO/LoadNersc.hpp \ Modules/MIO/LoadBinary.hpp