diff --git a/extras/Hadrons/Modules.hpp b/extras/Hadrons/Modules.hpp index e379bd77..46c65cb2 100644 --- a/extras/Hadrons/Modules.hpp +++ b/extras/Hadrons/Modules.hpp @@ -30,6 +30,9 @@ See the full license in the file "LICENSE" in the top level distribution directo #include #include #include +#include +#include +#include #include #include #include diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp new file mode 100644 index 00000000..cb3775ab --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp @@ -0,0 +1,86 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp + +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 */ + +#ifndef Hadrons_WeakHamiltonian_hpp_ +#define Hadrons_WeakHamiltonian_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * WeakHamiltonian * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MContraction) + +/******************************************************************************* + * Utilities for contractions involving the Weak Hamiltonian. + ******************************************************************************/ +//// Sum and store correlator. +#define MAKE_DIAG(exp, buf, res, n)\ +sliceSum(exp, buf, Tp);\ +res.name = (n);\ +res.corr.resize(buf.size());\ +for (unsigned int t = 0; t < buf.size(); ++t)\ +{\ + res.corr[t] = TensorRemove(buf[t]);\ +} + +//// Contraction of mu index: use 'mu' variable in exp. +#define SUM_MU(buf,exp)\ +buf = zero;\ +for (unsigned int mu = 0; mu < Nd; ++mu)\ +{\ + buf += exp;\ +} + +enum +{ + i_V = 0, + i_A = 1, + n_i = 2 +}; + +class WeakHamiltonianPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(WeakHamiltonianPar, + std::string, q1, + std::string, q2, + std::string, q3, + std::string, q4, + std::string, output); +}; + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_WeakHamiltonian_hpp_ diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc new file mode 100644 index 00000000..86920a7c --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc @@ -0,0 +1,92 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.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, 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). + * + * Schematics: q4 | q4 + * /-<-¬ | /-<-¬ + * / \ | / \ + * \ / | \ / + * q2 \ / q3 | \_ _/ + * |-----<-----* *-----<----¬ | q2 * q3 + * i * H_W * f | |-----<------*------<----¬ + * \ / | i * H_W * f + * \ / | \ / + * \---------->---------/ | \------------>---------/ + * q1 | q1 + * | + * Saucer (S) | Eye (E) + * + * S: trace(q3*g5*q1*adj(q2)*g5*gL[mu][p_1]*q4*gL[mu][p_2]) + * E: trace(q3*g5*q1*adj(q2)*g5*gL[mu][p_1])*trace(q4*gL[mu][p_2]) + */ + +/****************************************************************************** + * TWeakHamiltonianEye implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +TWeakHamiltonianEye::TWeakHamiltonianEye(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +std::vector TWeakHamiltonianEye::getInput(void) +{ + std::vector in; + + return in; +} + +std::vector TWeakHamiltonianEye::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +void TWeakHamiltonianEye::setup(void) +{ + +} + +// execution /////////////////////////////////////////////////////////////////// +void TWeakHamiltonianEye::execute(void) +{ + +} diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp new file mode 100644 index 00000000..8f88a78b --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp @@ -0,0 +1,75 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp + +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 */ + +#ifndef Hadrons_WeakHamiltonianEye_hpp_ +#define Hadrons_WeakHamiltonianEye_hpp_ + +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * WeakHamiltonianEye * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MContraction) + +enum +{ + S_diag = 0, + E_diag = 1 +}; + +// Saucer and Eye subdiagram contractions. +#define MAKE_SE_BODY(Q_1, Q_2, Q_3, gamma) (Q_3*g5*Q_1*adj(Q_2)*g5*gamma) +#define MAKE_SE_LOOP(Q_loop, gamma) (Q_loop*gamma) + +class TWeakHamiltonianEye: public Module +{ +public: + TYPE_ALIASES(FIMPL,) +public: + // constructor + TWeakHamiltonianEye(const std::string name); + // destructor + virtual ~TWeakHamiltonianEye(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(WeakHamiltonianEye, TWeakHamiltonianEye, MContraction); + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_WeakHamiltonianEye_hpp_ diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc new file mode 100644 index 00000000..81d18f15 --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc @@ -0,0 +1,148 @@ +/************************************************************************************* + +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; + + return in; +} + +std::vector TWeakHamiltonianNonEye::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +void TWeakHamiltonianNonEye::setup(void) +{ + +} + +// execution /////////////////////////////////////////////////////////////////// +void TWeakHamiltonianNonEye::execute(void) +{ + 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); + SpinMatrix g5 = makeGammaProd(Ns*Ns - 1); // Soon to be deprecated. + LatticeComplex expbuf(env().getGrid()); + std::vector corrbuf; + std::vector result; + + PropagatorField tmp1(env().getGrid()); + LatticeComplex tmp2(env().getGrid()); + std::vector C_i_side_loop(Nd, tmp1); + std::vector C_f_side_loop(Nd, tmp1); + std::vector W_i_side_loop(Nd, tmp2); + std::vector W_f_side_loop(Nd, tmp2); + + // Soon to be deprecated. Keeping V and A parts distinct to take advantage + // of zero-flop gamma products, when implemented. + std::vector> gL; + gL.resize(n_i); + gL[i_V].resize(Nd); + gL[i_A].resize(Nd); + for (unsigned int mu = 0; mu < Nd; ++mu) + { + gL[i_V][mu] = makeGammaProd(mu); + gL[i_A][mu] = g5*makeGammaProd(mu); + } + + // Setup for C-type contractions. + for (int mu = 0; mu < Nd; ++mu) + { + C_i_side_loop[mu] = MAKE_CW_SUBDIAG(q1, q2, gL[i_V][mu]) - + MAKE_CW_SUBDIAG(q1, q2, gL[i_A][mu]); + C_f_side_loop[mu] = MAKE_CW_SUBDIAG(q3, q4, gL[i_V][mu]) - + MAKE_CW_SUBDIAG(q3, q4, gL[i_A][mu]); + } + + // 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], "3pt_HW_C") + + // Recycle sub-expressions for W-type contractions. + for (unsigned int mu = 0; mu < Nd; ++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], "3pt_HW_W") + + write(writer, "HW_3pt_NonEye", result[C_diag]); + write(writer, "HW_3pt_NonEye", result[W_diag]); +} diff --git a/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp new file mode 100644 index 00000000..8541df9e --- /dev/null +++ b/extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp @@ -0,0 +1,81 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp + +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 */ + +#ifndef Hadrons_WeakHamiltonianNonEye_hpp_ +#define Hadrons_WeakHamiltonianNonEye_hpp_ + +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * WeakHamiltonianNonEye * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MContraction) + +enum +{ + W_diag = 0, + C_diag = 1 +}; + +// Wing and Connected subdiagram contractions +#define MAKE_CW_SUBDIAG(Q_1, Q_2, gamma) (Q_1*adj(Q_2)*g5*gamma) + +class TWeakHamiltonianNonEye: public Module +{ +public: + TYPE_ALIASES(FIMPL,) + class Result: Serializable + { + public: + GRID_SERIALIZABLE_CLASS_MEMBERS(Result, + std::string, name, + std::vector, corr); + }; +public: + // constructor + TWeakHamiltonianNonEye(const std::string name); + // destructor + virtual ~TWeakHamiltonianNonEye(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(WeakHamiltonianNonEye, TWeakHamiltonianNonEye, MContraction); + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_WeakHamiltonianNonEye_hpp_ diff --git a/extras/Hadrons/modules.inc b/extras/Hadrons/modules.inc index b2494236..69794808 100644 --- a/extras/Hadrons/modules.inc +++ b/extras/Hadrons/modules.inc @@ -1,4 +1,6 @@ modules_cc =\ + Modules/MContraction/WeakHamiltonianEye.cc \ + Modules/MContraction/WeakHamiltonianNonEye.cc \ Modules/MGauge/Load.cc \ Modules/MGauge/Random.cc \ Modules/MGauge/Unit.cc @@ -8,6 +10,9 @@ modules_hpp =\ Modules/MAction/Wilson.hpp \ Modules/MContraction/Baryon.hpp \ Modules/MContraction/Meson.hpp \ + Modules/MContraction/WeakHamiltonian.hpp \ + Modules/MContraction/WeakHamiltonianEye.hpp \ + Modules/MContraction/WeakHamiltonianNonEye.hpp \ Modules/MGauge/Load.hpp \ Modules/MGauge/Random.hpp \ Modules/MGauge/Unit.hpp \