/** * \file mortonid.cpp * \author Dhairya Malhotra, dhairya.malhotra@gmail.com * \date 2-11-2011 * \brief This file contains implementation of the class MortonId. */ #include #include #include #include namespace pvfmm{ void MortonId::NbrList(std::vector& nbrs, uint8_t level, int periodic) const{ nbrs.clear(); static int dim=3; static int nbr_cnt=(int)(pow(3.0,dim)+0.5); static UINT_T maxCoord=(((UINT_T)1)<<(MAX_DEPTH)); UINT_T mask=maxCoord-(((UINT_T)1)<<(MAX_DEPTH-level)); UINT_T pX=x & mask; UINT_T pY=y & mask; UINT_T pZ=z & mask; MortonId mid_tmp; mask=(((UINT_T)1)<<(MAX_DEPTH-level)); for(int i=0; i=0 && newX<(INT_T)maxCoord) if(newY>=0 && newY<(INT_T)maxCoord) if(newZ>=0 && newZ<(INT_T)maxCoord){ mid_tmp.x=newX; mid_tmp.y=newY; mid_tmp.z=newZ; mid_tmp.depth=level; nbrs.push_back(mid_tmp); } }else{ if(newX<0) newX+=maxCoord; if(newX>=(INT_T)maxCoord) newX-=maxCoord; if(newY<0) newY+=maxCoord; if(newY>=(INT_T)maxCoord) newY-=maxCoord; if(newZ<0) newZ+=maxCoord; if(newZ>=(INT_T)maxCoord) newZ-=maxCoord; mid_tmp.x=newX; mid_tmp.y=newY; mid_tmp.z=newZ; mid_tmp.depth=level; nbrs.push_back(mid_tmp); } } } std::vector MortonId::Children() const{ static int dim=3; static int c_cnt=(1UL< child(c_cnt); UINT_T mask=maxCoord-(((UINT_T)1)<<(MAX_DEPTH-depth)); UINT_T pX=x & mask; UINT_T pY=y & mask; UINT_T pZ=z & mask; mask=(((UINT_T)1)<<(MAX_DEPTH-(depth+1))); for(int i=0; i=0;i--){ s=s*0.5; if(mid.z & (((UINT_T)1)<