diff --git a/Hadrons/Modules.hpp b/Hadrons/Modules.hpp index da57ab2b..da289307 100644 --- a/Hadrons/Modules.hpp +++ b/Hadrons/Modules.hpp @@ -24,9 +24,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include diff --git a/Hadrons/Modules/MGauge/Electrify.cc b/Hadrons/Modules/MGauge/Electrify.cc new file mode 100644 index 00000000..1feea9ec --- /dev/null +++ b/Hadrons/Modules/MGauge/Electrify.cc @@ -0,0 +1,34 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MGauge/Electrify.cc + +Copyright (C) 2015-2018 + +Author: Vera Guelpers + +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 MGauge; + +template class Grid::Hadrons::MGauge::TElectrify; diff --git a/Hadrons/Modules/MGauge/Electrify.hpp b/Hadrons/Modules/MGauge/Electrify.hpp new file mode 100644 index 00000000..58d65eba --- /dev/null +++ b/Hadrons/Modules/MGauge/Electrify.hpp @@ -0,0 +1,151 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MGauge/Electrify.hpp + +Copyright (C) 2015-2018 + +Author: Vera Guelpers + +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_MGauge_Electrify_hpp_ +#define Hadrons_MGauge_Electrify_hpp_ + +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Electrify gauge * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MGauge) + +/**************************************************************************** +* Electrify a gauge field: +* +* Ue_mu(x) = U_mu(x)*exp(ieqA_mu(x)) +* +* with +* +* - gauge: U_mu(x): gauge field +* - emField: A_mu(x): electromagnetic photon field +* - e: value for the elementary charge +* - q: charge in units of e +* +*****************************************************************************/ + + +class ElectrifyPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(ElectrifyPar, + std::string, gauge, + std::string, emField, + double, e, + double, charge); +}; + +template +class TElectrify: public Module +{ +public: + GAUGE_TYPE_ALIASES(GImpl,); +public: + typedef PhotonR::GaugeField EmField; +public: + // constructor + TElectrify(const std::string name); + // destructor + virtual ~TElectrify(void) {}; + // dependencies/products + virtual std::vector getInput(void); + virtual std::vector getOutput(void); +protected: + // setup + virtual void setup(void); + // execution + virtual void execute(void); +}; + +MODULE_REGISTER_TMP(Electrify, TElectrify, MGauge); + +/****************************************************************************** +* TElectrify implementation * +******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TElectrify::TElectrify(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TElectrify::getInput(void) +{ + std::vector in = {par().gauge, par().emField}; + + return in; +} + +template +std::vector TElectrify::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TElectrify::setup(void) +{ + envCreateLat(GaugeField, getName()); + envTmpLat(LatticeComplex, "eiAmu"); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TElectrify::execute(void) +{ + LOG(Message) << "Electrify the gauge field " << par().gauge << " using the photon field " + << par().emField << " with charge e*q= " << par().e << "*" << par().charge << std::endl; + + auto &Ue = envGet(GaugeField, getName()); + auto &U = envGet(GaugeField, par().gauge); + auto &A = envGet(EmField, par().emField); + envGetTmp(LatticeComplex, eiAmu); + + Complex i(0.0,1.0); + + for(unsigned int mu = 0; mu < env().getNd(); mu++) + { + eiAmu = exp(i * (Real)(par().e * par().charge) * PeekIndex(A, mu)); + PokeIndex(Ue, PeekIndex(U, mu) * eiAmu, mu); + } +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MGauge_Electrify_hpp_ diff --git a/Hadrons/Modules/MSolver/A2AAslashVector.cc b/Hadrons/Modules/MSolver/A2AAslashVector.cc new file mode 100644 index 00000000..27344397 --- /dev/null +++ b/Hadrons/Modules/MSolver/A2AAslashVector.cc @@ -0,0 +1,35 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MSolver/A2AAslashVector.cc + +Copyright (C) 2015-2018 + +Author: Vera Guelpers + +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 MSolver; + +template class Grid::Hadrons::MSolver::TA2AAslashVector; +template class Grid::Hadrons::MSolver::TA2AAslashVector; diff --git a/Hadrons/Modules/MSolver/A2AAslashVector.hpp b/Hadrons/Modules/MSolver/A2AAslashVector.hpp new file mode 100644 index 00000000..3142d1e7 --- /dev/null +++ b/Hadrons/Modules/MSolver/A2AAslashVector.hpp @@ -0,0 +1,189 @@ +/************************************************************************************* + +Grid physics library, www.github.com/paboyle/Grid + +Source file: Hadrons/Modules/MSolver/A2AAslashVector.hpp + +Copyright (C) 2015-2018 + +Author: Vera Guelpers + +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_MSolver_A2AAslashVector_hpp_ +#define Hadrons_MSolver_A2AAslashVector_hpp_ + +#include +#include +#include +#include + +BEGIN_HADRONS_NAMESPACE + +/****************************************************************************** + * Create all-to-all V & W vectors * + ******************************************************************************/ +BEGIN_MODULE_NAMESPACE(MSolver) + +/**************************************************************************** +* Calculate a sequential propagator on an insertion of i*g_mu*A_mu +* on an A2A vector +* +* vv_i(y) = S(y,x) * i * g_mu*A_mu(x) * v_i(x) +* +* with +* +* - vector: A2A vector v_i(x) +* - emField: A_mu(x): electromagnetic photon field +* - solver: the solver for calculating the sequential propagator +* +*****************************************************************************/ + + +class A2AAslashVectorPar: Serializable +{ +public: + GRID_SERIALIZABLE_CLASS_MEMBERS(A2AAslashVectorPar, + std::string, vector, + std::string, emField, + std::string, solver); +}; + +template +class TA2AAslashVector : public Module +{ +public: + FERM_TYPE_ALIASES(FImpl,); + SOLVER_TYPE_ALIASES(FImpl,); +public: + typedef PhotonR::GaugeField EmField; +public: + // constructor + TA2AAslashVector(const std::string name); + // destructor + virtual ~TA2AAslashVector(void) {}; + // dependency relation + virtual std::vector getInput(void); + virtual std::vector getOutput(void); + // setup + virtual void setup(void); + // execution + virtual void execute(void); +private: + unsigned int Ls_; +}; + +MODULE_REGISTER_TMP(A2AAslashVector,TA2AAslashVector, MSolver); +MODULE_REGISTER_TMP(ZA2AAslashVector,TA2AAslashVector, MSolver); + +/****************************************************************************** + * TA2AAslashVector implementation * + ******************************************************************************/ +// constructor ///////////////////////////////////////////////////////////////// +template +TA2AAslashVector::TA2AAslashVector(const std::string name) +: Module(name) +{} + +// dependencies/products /////////////////////////////////////////////////////// +template +std::vector TA2AAslashVector::getInput(void) +{ + std::vector in = {par().vector, par().emField, par().solver}; + + return in; +} + +template +std::vector TA2AAslashVector::getOutput(void) +{ + std::vector out = {getName()}; + + return out; +} + +// setup /////////////////////////////////////////////////////////////////////// +template +void TA2AAslashVector::setup(void) +{ + Ls_ = env().getObjectLs(par().solver); + auto &vvector = envGet(std::vector, par().vector); + unsigned int Nmodes = vvector.size(); + envCreate(std::vector, getName(), 1, + Nmodes, envGetGrid(FermionField)); + + envTmpLat(FermionField, "v4dtmp"); + envTmpLat(FermionField, "v5dtmp", Ls_); + envTmpLat(FermionField, "v5dtmp_sol", Ls_); +} + +// execution /////////////////////////////////////////////////////////////////// +template +void TA2AAslashVector::execute(void) +{ + auto &solver = envGet(Solver, par().solver); + auto &stoch_photon = envGet(EmField, par().emField); + auto &vvector = envGet(std::vector, par().vector); + auto &Aslashv = envGet(std::vector, getName()); + unsigned int Nmodes = vvector.size(); + auto &mat = solver.getFMat(); + envGetTmp(FermionField, v4dtmp); + envGetTmp(FermionField, v5dtmp); + envGetTmp(FermionField, v5dtmp_sol); + + Complex ci(0.0,1.0); + + + startTimer("Seq Aslash"); + + LOG(Message) << "Calculate Sequential propagator on Aslash * v with the A2A vector " << par().vector + << " and the photon field " << par().emField << std::endl; + + + for(unsigned int i=0; i(stoch_photon, mu) * (gmu * vvector[i]); + } + stopTimer("Multiply Aslash"); + + if (Ls_ == 1) + { + solver(Aslashv[i], v4dtmp); + } + else + { + mat.ImportPhysicalFermionSource(v4dtmp, v5dtmp); + solver(v5dtmp_sol, v5dtmp); + mat.ExportPhysicalFermionSolution(v5dtmp_sol, v4dtmp); + Aslashv[i] = v4dtmp; + } + } + + stopTimer("Seq Aslash"); +} + +END_MODULE_NAMESPACE + +END_HADRONS_NAMESPACE + +#endif // Hadrons_MSolver_A2AAslashVector_hpp_ diff --git a/Hadrons/modules.inc b/Hadrons/modules.inc index 157fe1a2..2add645c 100644 --- a/Hadrons/modules.inc +++ b/Hadrons/modules.inc @@ -20,11 +20,13 @@ modules_cc =\ Modules/MSink/Point.cc \ Modules/MSink/Smear.cc \ Modules/MSolver/A2AVectors.cc \ + Modules/MSolver/A2AAslashVector.cc \ Modules/MSolver/RBPrecCG.cc \ Modules/MSolver/MixedPrecisionRBPrecCG.cc \ Modules/MSolver/LocalCoherenceLanczos.cc \ Modules/MGauge/StoutSmearing.cc \ Modules/MGauge/Unit.cc \ + Modules/MGauge/Electrify.cc \ Modules/MGauge/UnitEm.cc \ Modules/MGauge/StochEm.cc \ Modules/MGauge/Random.cc \ @@ -95,9 +97,11 @@ modules_hpp =\ Modules/MSolver/Guesser.hpp \ Modules/MSolver/RBPrecCG.hpp \ Modules/MSolver/A2AVectors.hpp \ + Modules/MSolver/A2AAslashVector.hpp \ Modules/MGauge/UnitEm.hpp \ Modules/MGauge/StoutSmearing.hpp \ Modules/MGauge/Unit.hpp \ + Modules/MGauge/Electrify.hpp \ Modules/MGauge/Random.hpp \ Modules/MGauge/GaugeFix.hpp \ Modules/MGauge/FundtoHirep.hpp \