/************************************************************************************* Grid physics library, www.github.com/paboyle/Grid Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc Copyright (C) 2017 Author: Andrew Lawson 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 MContraction; /* * Weak Hamiltonian current-current contractions, Non-Eye-type. * * These contractions are generated by the Q1 and Q2 operators in the physical * basis (see e.g. Fig 3 of arXiv:1507.03094). * * Schematic: * q2 q3 | q2 q3 * /--<--¬ /--<--¬ | /--<--¬ /--<--¬ * / \ / \ | / \ / \ * / \ / \ | / \ / \ * / \ / \ | / \ / \ * i * * H_W * f | i * * * H_W * f * \ * | | \ / \ / * \ / \ / | \ / \ / * \ / \ / | \ / \ / * \ / \ / | \-->--/ \-->--/ * \-->--/ \-->--/ | q1 q4 * q1 q4 | * Connected (C) | Wing (W) * * C: trace(q1*adj(q2)*g5*gL[mu]*q3*adj(q4)*g5*gL[mu]) * W: trace(q1*adj(q2)*g5*gL[mu])*trace(q3*adj(q4)*g5*gL[mu]) * */ /****************************************************************************** * TWeakHamiltonianNonEye implementation * ******************************************************************************/ // constructor ///////////////////////////////////////////////////////////////// TWeakHamiltonianNonEye::TWeakHamiltonianNonEye(const std::string name) : Module(name) {} // dependencies/products /////////////////////////////////////////////////////// std::vector TWeakHamiltonianNonEye::getInput(void) { std::vector in = {par().q1, par().q2, par().q3, par().q4}; return in; } std::vector TWeakHamiltonianNonEye::getOutput(void) { std::vector out = {getName()}; return out; } // setup /////////////////////////////////////////////////////////////////////// void TWeakHamiltonianNonEye::setup(void) { } // execution /////////////////////////////////////////////////////////////////// void TWeakHamiltonianNonEye::execute(void) { LOG(Message) << "Computing Weak Hamiltonian (Non-Eye type) contractions '" << getName() << "' using quarks '" << par().q1 << "', '" << par().q2 << ", '" << par().q3 << "' and '" << par().q4 << "'." << std::endl; XmlWriter writer(par().output); PropagatorField &q1 = *env().template getObject(par().q1); PropagatorField &q2 = *env().template getObject(par().q2); PropagatorField &q3 = *env().template getObject(par().q3); PropagatorField &q4 = *env().template getObject(par().q4); Gamma g5 = Gamma(Gamma::Algebra::Gamma5); LatticeComplex expbuf(env().getGrid()); std::vector corrbuf; std::vector result(n_noneye_diag); unsigned int ndim = env().getNd(); PropagatorField tmp1(env().getGrid()); LatticeComplex tmp2(env().getGrid()); std::vector C_i_side_loop(ndim, tmp1); std::vector C_f_side_loop(ndim, tmp1); std::vector W_i_side_loop(ndim, tmp2); std::vector W_f_side_loop(ndim, tmp2); // Setup for C-type contractions. for (int mu = 0; mu < ndim; ++mu) { C_i_side_loop[mu] = MAKE_CW_SUBDIAG(q1, q2, Gamma::gmu[mu]) - MAKE_CW_SUBDIAG(q1, q2, Gamma::gmu[mu]*g5); C_f_side_loop[mu] = MAKE_CW_SUBDIAG(q3, q4, Gamma::gmu[mu]) - MAKE_CW_SUBDIAG(q3, q4, Gamma::gmu[mu]*g5); } // Perform C-type contractions. SUM_MU(expbuf, trace(C_i_side_loop[mu]*C_f_side_loop[mu])) MAKE_DIAG(expbuf, corrbuf, result[C_diag], "HW_C") // Recycle sub-expressions for W-type contractions. for (unsigned int mu = 0; mu < ndim; ++mu) { W_i_side_loop[mu] = trace(C_i_side_loop[mu]); W_f_side_loop[mu] = trace(C_f_side_loop[mu]); } // Perform W-type contractions. SUM_MU(expbuf, W_i_side_loop[mu]*W_f_side_loop[mu]) MAKE_DIAG(expbuf, corrbuf, result[W_diag], "HW_W") write(writer, "HW_NonEye", result[C_diag]); write(writer, "HW_NonEye", result[W_diag]); }