#include namespace Grid { int LebesgueOrder::UseLebesgueOrder; LebesgueOrder::IndexInteger LebesgueOrder::alignup(IndexInteger n){ n--; // 1000 0011 --> 1000 0010 n |= n >> 1; // 1000 0010 | 0100 0001 = 1100 0011 n |= n >> 2; // 1100 0011 | 0011 0000 = 1111 0011 n |= n >> 4; // 1111 0011 | 0000 1111 = 1111 1111 n |= n >> 8; // ... (At this point all bits are 1, so further bitwise-or n |= n >> 16; // operations produce no effect.) n++; // 1111 1111 --> 1 0000 0000 return n; }; LebesgueOrder::LebesgueOrder(GridBase *grid) { _LebesgueReorder.resize(0); // Align up dimensions to power of two. const IndexInteger one=1; IndexInteger ND = grid->_ndimension; std::vector dims(ND); std::vector adims(ND); std::vector > bitlist(ND); for(IndexInteger mu=0;mu_rdimensions[mu]; assert ( dims[mu] != 0 ); adims[mu] = alignup(dims[mu]); } // List which bits of padded volume coordinate contribute; this strategy // i) avoids recursion // ii) has loop lengths at most the width of a 32 bit word. int sitebit=0; int split=2; for(int mu=0;mu ax(ND); for(IndexInteger asite=0;asitedims[mu]-1 ) contained = 0; } if ( contained ) { int site = ax[0] + dims[0]*ax[1] +dims[0]*dims[1]*ax[2] +dims[0]*dims[1]*dims[2]*ax[3]; _LebesgueReorder.push_back(site); } } assert( _LebesgueReorder.size() == vol ); } }