#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; // Optional to broadcast from node 0. grid->GlobalCoorToRankIndex(rank,odx,idx,site); grid->Broadcast(grid->BossRank(),s); std::vector buf(Nsimd); // extract-modify-merge cycle is easiest way and this is not perf critical if ( rank == grid->ThisRank() ) { extract(l._odata[odx],buf); buf[idx] = s; merge(l._odata[odx],buf); } return; }; ////////////////////////////////////////////////////////// // Peek a scalar object from the SIMD array ////////////////////////////////////////////////////////// template 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); extract(l._odata[odx],buf); s = buf[idx]; grid->Broadcast(rank,s); return; }; ////////////////////////////////////////////////////////// // Peek a scalar object from the SIMD array ////////////////////////////////////////////////////////// template void peekLocalSite(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 odx,idx; idx= grid->iIndex(site); odx= grid->oIndex(site); std::vector buf(Nsimd); extract(l._odata[odx],buf); s = buf[idx]; return; }; template void pokeLocalSite(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 odx,idx; idx= grid->iIndex(site); odx= grid->oIndex(site); std::vector buf(Nsimd); // extract-modify-merge cycle is easiest way and this is not perf critical extract(l._odata[odx],buf); buf[idx] = s; merge(l._odata[odx],buf); return; }; } #endif