/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: Hadrons/Modules/MContraction/SigmaToNucleonEye.hpp Copyright (C) 2015-2019 Author: Antonin Portelli 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_MContraction_SigmaToNucleonEye_hpp_ #define Hadrons_MContraction_SigmaToNucleonEye_hpp_ #include #include #include #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * SigmaToNucleonEye * ******************************************************************************/ /* * Sigma-to-nucleon 3-pt diagrams, eye topologies. * * Schematics: qqLoop | * /->-¬ | * / \ | qsTi G qdTf * \ / | /---->------*------>----¬ * qsTi \ / qdTf | / /-*-¬ \ * /----->-----* *----->----¬ | / / G \ \ * * G G * | * \ / qqLoop * * |\ /| | |\ \-<-/ /| * | \ / | | | \ / | * | \---------->---------/ | | | \----------->----------/ | * \ quSpec / | \ quSpec / * \ / | \ / * \---------->---------/ | \----------->----------/ * quSpec | quSpec * * analogously to the rare-kaon naming, the left diagram is named 'one-trace' and * the diagram on the right 'two-trace' * * Propagators: * * qqLoop * * quSpec, source at ti * * qdTf, source at tf * * qsTi, source at ti */ BEGIN_MODULE_NAMESPACE(MContraction) class SigmaToNucleonEyePar: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(SigmaToNucleonEyePar, std::string, qqLoop, std::string, quSpec, std::string, qdTf, std::string, qsTi, unsigned int, tf, std::string, sink, std::string, output); }; template class TSigmaToNucleonEye: public Module { public: FERM_TYPE_ALIASES(FImpl,); BASIC_TYPE_ALIASES(ScalarImplCR, Scalar); SINK_TYPE_ALIASES(Scalar); typedef typename SpinMatrixField::vector_object::scalar_object SpinMatrix; class Metadata: Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(Metadata, Gamma::Algebra, gammaH, Gamma::Algebra, gammaASigma, Gamma::Algebra, gammaBSigma, Gamma::Algebra, gammaANucl, Gamma::Algebra, gammaBNucl, int, trace); }; typedef Correlator Result; public: // constructor TSigmaToNucleonEye(const std::string name); // destructor virtual ~TSigmaToNucleonEye(void) {}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); protected: // setup virtual void setup(void); // execution virtual void execute(void); // Which gamma algebra was specified Gamma::Algebra al; }; MODULE_REGISTER_TMP(SigmaToNucleonEye, ARG(TSigmaToNucleonEye), MContraction); /****************************************************************************** * TSigmaToNucleonEye implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template TSigmaToNucleonEye::TSigmaToNucleonEye(const std::string name) : Module(name) {} // dependencies/products /////////////////////////////////////////////////////// template std::vector TSigmaToNucleonEye::getInput(void) { std::vector input = {par().qqLoop, par().quSpec, par().qdTf, par().qsTi, par().sink}; return input; } template std::vector TSigmaToNucleonEye::getOutput(void) { std::vector out = {}; return out; } // setup /////////////////////////////////////////////////////////////////////// template void TSigmaToNucleonEye::setup(void) { envTmpLat(SpinMatrixField, "c"); } // execution /////////////////////////////////////////////////////////////////// template void TSigmaToNucleonEye::execute(void) { const Gamma GammaB(Gamma::Algebra::SigmaXZ); // C*gamma_5 const Gamma Id(Gamma::Algebra::Identity); // C*gamma_5 LOG(Message) << "Computing sigma-to-nucleon contractions '" << getName() << "'" << std::endl; LOG(Message) << "' with (Gamma^A,Gamma^B)_sigma = ( Identity, C*gamma_5 ) and (Gamma^A,Gamma^B)_nucl = ( Identity, C*gamma_5 )" << std::endl; LOG(Message) << " using sink " << par().sink << "." << std::endl; envGetTmp(SpinMatrixField, c); std::vector buf; std::vector result; Result r; r.info.gammaASigma = Id.g; r.info.gammaBSigma = GammaB.g; r.info.gammaANucl = Id.g; r.info.gammaBNucl = GammaB.g; auto &qqLoop = envGet(PropagatorField, par().qqLoop); auto &quSpec = envGet(SlicedPropagator, par().quSpec); auto &qdTf = envGet(PropagatorField, par().qdTf); auto &qsTi = envGet(PropagatorField, par().qsTi); auto qut = quSpec[par().tf]; for (auto &G: Gamma::gall) { r.info.gammaH = G.g; //Operator Q1, equivalent to the two-trace case in the rare-kaons module c=Zero(); BaryonUtils::Sigma_to_Nucleon_Eye(qqLoop,qut,qdTf,qsTi,G,GammaB,GammaB,"Q1",c); sliceSum(c,buf,Tp); r.corr.clear(); for (unsigned int t = 0; t < buf.size(); ++t) { r.corr.push_back(buf[t]); } r.info.trace = 2; result.push_back(r); //Operator Q2, equivalent to the one-trace case in the rare-kaons module c=Zero(); BaryonUtils::Sigma_to_Nucleon_Eye(qqLoop,qut,qdTf,qsTi,G,GammaB,GammaB,"Q2",c); sliceSum(c,buf,Tp); r.corr.clear(); for (unsigned int t = 0; t < buf.size(); ++t) { r.corr.push_back(buf[t]); } r.info.trace = 1; result.push_back(r); } saveResult(par().output, "stnEye", result); } END_MODULE_NAMESPACE END_HADRONS_NAMESPACE #endif // Hadrons_MContraction_SigmaToNucleonEye_hpp_