mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-04 05:54:32 +00:00 
			
		
		
		
	Added gauge transform option to eigpack IO
This commit is contained in:
		@@ -31,7 +31,7 @@ using namespace Grid;
 | 
			
		||||
using namespace Hadrons;
 | 
			
		||||
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
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>>;
 | 
			
		||||
template class Grid::Hadrons::MIO::TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>, GIMPL>;
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -47,16 +47,21 @@ public:
 | 
			
		||||
                                    std::string, filestem,
 | 
			
		||||
                                    bool, multiFile,
 | 
			
		||||
                                    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>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename Pack::Field   Field;
 | 
			
		||||
    typedef typename Pack::FieldIo FieldIo;
 | 
			
		||||
    typedef BaseEigenPack<Field>   BasePack;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    GAUGE_TYPE_ALIASES(GImpl, );
 | 
			
		||||
    typedef typename GImpl::GaugeLinkField GaugeMat;
 | 
			
		||||
public:
 | 
			
		||||
    // constructor
 | 
			
		||||
    TLoadEigenPack(const std::string name);
 | 
			
		||||
@@ -71,31 +76,36 @@ public:
 | 
			
		||||
    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
 | 
			
		||||
MODULE_REGISTER_TMP(LoadFermionEigenPackIo32, ARG(TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>>), MIO);
 | 
			
		||||
MODULE_REGISTER_TMP(LoadFermionEigenPackIo32, ARG(TLoadEigenPack<FermionEigenPack<FIMPL, FIMPLF>, GIMPL>), MIO);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/******************************************************************************
 | 
			
		||||
 *                    TLoadEigenPack implementation                           *
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
// constructor /////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename Pack>
 | 
			
		||||
TLoadEigenPack<Pack>::TLoadEigenPack(const std::string name)
 | 
			
		||||
template <typename Pack, typename GImpl>
 | 
			
		||||
TLoadEigenPack<Pack, GImpl>::TLoadEigenPack(const std::string name)
 | 
			
		||||
: Module<LoadEigenPackPar>(name)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
// dependencies/products ///////////////////////////////////////////////////////
 | 
			
		||||
template <typename Pack>
 | 
			
		||||
std::vector<std::string> TLoadEigenPack<Pack>::getInput(void)
 | 
			
		||||
template <typename Pack, typename GImpl>
 | 
			
		||||
std::vector<std::string> TLoadEigenPack<Pack, GImpl>::getInput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> in;
 | 
			
		||||
 | 
			
		||||
    if (!par().gaugeXform.empty())
 | 
			
		||||
    {
 | 
			
		||||
        in = {par().gaugeXform};
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename Pack>
 | 
			
		||||
std::vector<std::string> TLoadEigenPack<Pack>::getOutput(void)
 | 
			
		||||
template <typename Pack, typename GImpl>
 | 
			
		||||
std::vector<std::string> TLoadEigenPack<Pack, GImpl>::getOutput(void)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<std::string> out = {getName()};
 | 
			
		||||
    
 | 
			
		||||
@@ -103,8 +113,8 @@ std::vector<std::string> TLoadEigenPack<Pack>::getOutput(void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setup ///////////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename Pack>
 | 
			
		||||
void TLoadEigenPack<Pack>::setup(void)
 | 
			
		||||
template <typename Pack, typename GImpl>
 | 
			
		||||
void TLoadEigenPack<Pack, GImpl>::setup(void)
 | 
			
		||||
{
 | 
			
		||||
    GridBase *gridIo = nullptr;
 | 
			
		||||
 | 
			
		||||
@@ -114,16 +124,42 @@ void TLoadEigenPack<Pack>::setup(void)
 | 
			
		||||
    }
 | 
			
		||||
    envCreateDerived(BasePack, Pack, getName(), par().Ls, par().size, 
 | 
			
		||||
                     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 ///////////////////////////////////////////////////////////////////
 | 
			
		||||
template <typename Pack>
 | 
			
		||||
void TLoadEigenPack<Pack>::execute(void)
 | 
			
		||||
template <typename Pack, typename GImpl>
 | 
			
		||||
void TLoadEigenPack<Pack, GImpl>::execute(void)
 | 
			
		||||
{
 | 
			
		||||
    auto &epack = envGetDerived(BasePack, Pack, getName());
 | 
			
		||||
 | 
			
		||||
    epack.read(par().filestem, par().multiFile, vm().getTrajectory());
 | 
			
		||||
    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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user