#ifndef Hadrons_MContraction_MesonFieldGamma_hpp_ #define Hadrons_MContraction_MesonFieldGamma_hpp_ #include #include #include #include BEGIN_HADRONS_NAMESPACE /****************************************************************************** * MesonFieldGamma * ******************************************************************************/ BEGIN_MODULE_NAMESPACE(MContraction) class MesonFieldPar : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(MesonFieldPar, int, Nl, int, N, std::string, A2A1, std::string, A2A2, std::string, gammas, std::string, output); }; template class TMesonFieldGamma : public Module { public: FERM_TYPE_ALIASES(FImpl, ); SOLVER_TYPE_ALIASES(FImpl, ); typedef A2AModesSchurDiagTwo A2ABase; class Result : Serializable { public: GRID_SERIALIZABLE_CLASS_MEMBERS(Result, Gamma::Algebra, gamma, std::vector>>, MesonField, ComplexD, last); }; public: // constructor TMesonFieldGamma(const std::string name); // destructor virtual ~TMesonFieldGamma(void){}; // dependency relation virtual std::vector getInput(void); virtual std::vector getOutput(void); virtual void parseGammaString(std::vector &gammaList); // setup virtual void setup(void); // execution virtual void execute(void); }; MODULE_REGISTER(MesonFieldGamma, ARG(TMesonFieldGamma), MContraction); MODULE_REGISTER(ZMesonFieldGamma, ARG(TMesonFieldGamma), MContraction); /****************************************************************************** * TMesonFieldGamma implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// template TMesonFieldGamma::TMesonFieldGamma(const std::string name) : Module(name) { } // dependencies/products /////////////////////////////////////////////////////// template std::vector TMesonFieldGamma::getInput(void) { std::vector in = {par().A2A1 + "_class", par().A2A2 + "_class"}; return in; } template std::vector TMesonFieldGamma::getOutput(void) { std::vector out = {}; return out; } template void TMesonFieldGamma::parseGammaString(std::vector &gammaList) { gammaList.clear(); // Determine gamma matrices to insert at source/sink. if (par().gammas.compare("all") == 0) { // Do all contractions. for (unsigned int i = 1; i < Gamma::nGamma; i += 2) { gammaList.push_back(((Gamma::Algebra)i)); } } else { // Parse individual contractions from input string. gammaList = strToVec(par().gammas); } } // setup /////////////////////////////////////////////////////////////////////// template void TMesonFieldGamma::setup(void) { int nt = env().getDim(Tp); int N = par().N; int Ls_ = env().getObjectLs(par().A2A1 + "_class"); envTmpLat(FermionField, "w", Ls_); envTmpLat(FermionField, "v", Ls_); envTmpLat(FermionField, "tmpv_5d", Ls_); envTmpLat(FermionField, "tmpw_5d", Ls_); } // execution /////////////////////////////////////////////////////////////////// template void TMesonFieldGamma::execute(void) { LOG(Message) << "Computing A2A meson field for gamma = " << par().gammas << ", taking w from " << par().A2A1 << " and v from " << par().A2A2 << std::endl; int N = par().N; int nt = env().getDim(Tp); std::vector result; std::vector gammaResultList; std::vector gammaList; parseGammaString(gammaResultList); result.resize(gammaResultList.size()); Gamma g5(Gamma::Algebra::Gamma5); gammaList.resize(gammaResultList.size(), g5); for (unsigned int i = 0; i < result.size(); ++i) { result[i].gamma = gammaResultList[i]; result[i].MesonField.resize(N, std::vector>(N, std::vector(nt))); Gamma gamma(gammaResultList[i]); gammaList[i] = gamma; } std::vector MesonField_ij; MesonField_ij.resize(nt); auto &a2a1 = envGet(A2ABase, par().A2A1 + "_class"); auto &a2a2 = envGet(A2ABase, par().A2A2 + "_class"); envGetTmp(FermionField, w); envGetTmp(FermionField, v); envGetTmp(FermionField, tmpv_5d); envGetTmp(FermionField, tmpw_5d); for (unsigned int i = 0; i < N; i++) { a2a1.return_w(i, tmpw_5d, w); for (unsigned int j = 0; j < N; j++) { a2a2.return_v(j, tmpv_5d, v); for (unsigned int k = 0; k < result.size(); k++) { v = gammaList[k]*v; sliceInnerProductVector(MesonField_ij, w, v, Tp); result[k].MesonField[i][j] = MesonField_ij; } } if (i % 10 == 0) { LOG(Message) << "MF for i = " << i << " of " << N << std::endl; } } result[0].last = MesonField_ij[7]; saveResult(par().output, "meson", result); } END_MODULE_NAMESPACE END_HADRONS_NAMESPACE #endif // Hadrons_MContraction_MesonFieldGm_hpp_