1
0
mirror of https://github.com/paboyle/Grid.git synced 2025-04-09 21:50:45 +01:00

Added gauge transform option to eigpack IO

This commit is contained in:
fionnoh 2019-05-15 13:35:47 +01:00
parent d8512b03f8
commit 94accec311
2 changed files with 52 additions and 16 deletions

View File

@ -31,7 +31,7 @@ using namespace Grid;
using namespace Hadrons; using namespace Hadrons;
using namespace MIO; using namespace MIO;
template class Grid::Hadrons::MIO::TLoadEigenPack<FermionEigenPack<FIMPL>>; template class Grid::Hadrons::MIO::TLoadEigenPack<FermionEigenPack<FIMPL>, GIMPL>;
#ifdef GRID_DEFAULT_PRECISION_DOUBLE #ifdef GRID_DEFAULT_PRECISION_DOUBLE
template class Grid::Hadrons::MIO::TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>>; template class Grid::Hadrons::MIO::TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>, GIMPL>;
#endif #endif

View File

@ -47,16 +47,21 @@ public:
std::string, filestem, std::string, filestem,
bool, multiFile, bool, multiFile,
unsigned int, size, unsigned int, size,
unsigned int, Ls); unsigned int, Ls,
std::string, gaugeXform);
}; };
template <typename Pack> template <typename Pack, typename GImpl>
class TLoadEigenPack: public Module<LoadEigenPackPar> class TLoadEigenPack: public Module<LoadEigenPackPar>
{ {
public: public:
typedef typename Pack::Field Field; typedef typename Pack::Field Field;
typedef typename Pack::FieldIo FieldIo; typedef typename Pack::FieldIo FieldIo;
typedef BaseEigenPack<Field> BasePack; typedef BaseEigenPack<Field> BasePack;
public:
GAUGE_TYPE_ALIASES(GImpl, );
typedef typename GImpl::GaugeLinkField GaugeMat;
public: public:
// constructor // constructor
TLoadEigenPack(const std::string name); TLoadEigenPack(const std::string name);
@ -71,31 +76,36 @@ public:
virtual void execute(void); virtual void execute(void);
}; };
MODULE_REGISTER_TMP(LoadFermionEigenPack, TLoadEigenPack<FermionEigenPack<FIMPL>>, MIO); MODULE_REGISTER_TMP(LoadFermionEigenPack, ARG(TLoadEigenPack<FermionEigenPack<FIMPL>, GIMPL>), MIO);
#ifdef GRID_DEFAULT_PRECISION_DOUBLE #ifdef GRID_DEFAULT_PRECISION_DOUBLE
MODULE_REGISTER_TMP(LoadFermionEigenPackIo32, ARG(TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>>), MIO); MODULE_REGISTER_TMP(LoadFermionEigenPackIo32, ARG(TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>, GIMPL>), MIO);
#endif #endif
/****************************************************************************** /******************************************************************************
* TLoadEigenPack implementation * * TLoadEigenPack implementation *
******************************************************************************/ ******************************************************************************/
// constructor ///////////////////////////////////////////////////////////////// // constructor /////////////////////////////////////////////////////////////////
template <typename Pack> template <typename Pack, typename GImpl>
TLoadEigenPack<Pack>::TLoadEigenPack(const std::string name) TLoadEigenPack<Pack, GImpl>::TLoadEigenPack(const std::string name)
: Module<LoadEigenPackPar>(name) : Module<LoadEigenPackPar>(name)
{} {}
// dependencies/products /////////////////////////////////////////////////////// // dependencies/products ///////////////////////////////////////////////////////
template <typename Pack> template <typename Pack, typename GImpl>
std::vector<std::string> TLoadEigenPack<Pack>::getInput(void) std::vector<std::string> TLoadEigenPack<Pack, GImpl>::getInput(void)
{ {
std::vector<std::string> in; std::vector<std::string> in;
if (!par().gaugeXform.empty())
{
in = {par().gaugeXform};
}
return in; return in;
} }
template <typename Pack> template <typename Pack, typename GImpl>
std::vector<std::string> TLoadEigenPack<Pack>::getOutput(void) std::vector<std::string> TLoadEigenPack<Pack, GImpl>::getOutput(void)
{ {
std::vector<std::string> out = {getName()}; std::vector<std::string> out = {getName()};
@ -103,8 +113,8 @@ std::vector<std::string> TLoadEigenPack<Pack>::getOutput(void)
} }
// setup /////////////////////////////////////////////////////////////////////// // setup ///////////////////////////////////////////////////////////////////////
template <typename Pack> template <typename Pack, typename GImpl>
void TLoadEigenPack<Pack>::setup(void) void TLoadEigenPack<Pack, GImpl>::setup(void)
{ {
GridBase *gridIo = nullptr; GridBase *gridIo = nullptr;
@ -114,16 +124,42 @@ void TLoadEigenPack<Pack>::setup(void)
} }
envCreateDerived(BasePack, Pack, getName(), par().Ls, par().size, envCreateDerived(BasePack, Pack, getName(), par().Ls, par().size,
envGetRbGrid(Field, par().Ls), gridIo); envGetRbGrid(Field, par().Ls), gridIo);
if (!par().gaugeXform.empty())
{
envTmp(GaugeMat, "tmp5dXform", par().Ls, envGetGrid5(Field, par().Ls));
envTmp(GaugeMat, "tmp5dXformOdd", par().Ls, envGetRbGrid5(Field, par().Ls));
}
} }
// execution /////////////////////////////////////////////////////////////////// // execution ///////////////////////////////////////////////////////////////////
template <typename Pack> template <typename Pack, typename GImpl>
void TLoadEigenPack<Pack>::execute(void) void TLoadEigenPack<Pack, GImpl>::execute(void)
{ {
auto &epack = envGetDerived(BasePack, Pack, getName()); auto &epack = envGetDerived(BasePack, Pack, getName());
epack.read(par().filestem, par().multiFile, vm().getTrajectory()); epack.read(par().filestem, par().multiFile, vm().getTrajectory());
epack.eval.resize(par().size); epack.eval.resize(par().size);
if (!par().gaugeXform.empty())
{
auto &xform = envGet(GaugeMat, par().gaugeXform);
envGetTmp(GaugeMat, tmp5dXform);
envGetTmp(GaugeMat, tmp5dXformOdd);
for (unsigned int j = 0; j < par().Ls; j++)
{
InsertSlice(xform, tmp5dXform, j, 0);
}
pickCheckerboard(Odd, tmp5dXformOdd, tmp5dXform);
for (unsigned int i = 0; i < par().size; i++)
{
LOG(Message) << "Applying gauge transformation to eigenvector i = " << i << std::endl;
epack.evec[i].checkerboard = Odd;
epack.evec[i] = tmp5dXformOdd * epack.evec[i];
}
}
} }
END_MODULE_NAMESPACE END_MODULE_NAMESPACE