#ifndef GRID_LATTICE_PEEK_H #define GRID_LATTICE_PEEK_H /////////////////////////////////////////////// // Peeking and poking around /////////////////////////////////////////////// namespace Grid { //////////////////////////////////////////////////////////////////////////////////////////////////// // Peek internal indices of a Lattice object //////////////////////////////////////////////////////////////////////////////////////////////////// template inline auto peekIndex(const Lattice &lhs) -> Lattice(lhs._odata[0]))> { Lattice(lhs._odata[0]))> ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ ret._odata[ss] = peekIndex(lhs._odata[ss]); } return ret; }; template inline auto peekIndex(const Lattice &lhs,int i) -> Lattice(lhs._odata[0],i))> { Lattice(lhs._odata[0],i))> ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ ret._odata[ss] = peekIndex(lhs._odata[ss],i); } return ret; }; template inline auto peekIndex(const Lattice &lhs,int i,int j) -> Lattice(lhs._odata[0],i,j))> { Lattice(lhs._odata[0],i,j))> ret(lhs._grid); #pragma omp parallel for for(int ss=0;ssoSites();ss++){ ret._odata[ss] = peekIndex(lhs._odata[ss],i,j); } return ret; }; //////////////////////////////////////////////////////////////////////////////////////////////////// // Poke internal indices of a Lattice object //////////////////////////////////////////////////////////////////////////////////////////////////// template inline void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0]))> & rhs) { #pragma omp parallel for for(int ss=0;ssoSites();ss++){ pokeIndex(lhs._odata[ss],rhs._odata[ss]); } } template inline void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0))> & rhs,int i) { #pragma omp parallel for for(int ss=0;ssoSites();ss++){ pokeIndex(lhs._odata[ss],rhs._odata[ss],i); } } template inline void pokeIndex(Lattice &lhs,const Lattice(lhs._odata[0],0,0))> & rhs,int i,int j) { #pragma omp parallel for for(int ss=0;ssoSites();ss++){ pokeIndex(lhs._odata[ss],rhs._odata[ss],i,j); } } ////////////////////////////////////////////////////// // Poke a scalar object into the SIMD array ////////////////////////////////////////////////////// template void pokeSite(const sobj &s,Lattice &l,std::vector &site){ GridBase *grid=l._grid; typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_type vector_type; int Nsimd = grid->Nsimd(); assert( l.checkerboard== l._grid->CheckerBoard(site)); assert( sizeof(sobj)*Nsimd == sizeof(vobj)); int rank,odx,idx; grid->GlobalCoorToRankIndex(rank,odx,idx,site); // Optional to broadcast from node 0. grid->Broadcast(0,s); std::vector buf(Nsimd); std::vector pointers(Nsimd); for(int i=0;i void peekSite(sobj &s,Lattice &l,std::vector &site){ GridBase *grid=l._grid; typedef typename vobj::scalar_type scalar_type; typedef typename vobj::vector_type vector_type; int Nsimd = grid->Nsimd(); assert( l.checkerboard== l._grid->CheckerBoard(site)); assert( sizeof(sobj)*Nsimd == sizeof(vobj)); int rank,odx,idx; grid->GlobalCoorToRankIndex(rank,odx,idx,site); std::vector buf(Nsimd); std::vector pointers(Nsimd); for(int i=0;iBroadcast(rank,s); return; }; } #endif