31 for(
int i=0; i < s1.size(); ++i)
133 return QMP_get_node_number_from(node_coord.
slice());
141 const int* node_crd = QMP_get_logical_coordinates_from(node);
143 for(
int i=0; i <
Nd; ++i)
144 node_coord[i] = node_crd[i];
148 int* non_const_node_crd =
const_cast<int*
>(node_crd);
149 free(non_const_node_crd);
159 _layout.num_nodes = QMP_get_number_of_nodes();
160 _layout.node_rank = QMP_get_node_number();
164 _layout.iogrid_defined =
false;
200 for(
int mu=0; mu <
Nd; mu++) {
201 _layout.iogrid[mu] = io_grid[mu];
203 _layout.num_iogrid = io_grid[0];
204 for(
int mu=1; mu <
Nd; mu++) {
205 _layout.num_iogrid *= io_grid[mu];
243 QDP_error_exit(
"dimension of lattice size not the same as the default");
246 for(
int i=0; i <
Nd; ++i)
261 QDP_error_exit(
"Layout::create - problem size not divisible by number of processors");
269 for(
int i=0; i <
Nd; ++i)
270 if (
_layout.nrow[i] % min_dim[i] != 0)
271 QDP_error_exit(
"Layout::create - Error: problem size not multiple of smallest size allowed for this type of layout");
277 for(
int i=0; i <
Nd; ++i)
278 nrow[i] =
_layout.nrow[i] / min_dim[i];
280 int* nrow_slice=
const_cast<int*
>(nrow.
slice());
281 QMP_layout_grid(nrow_slice,
Nd);
285 const int* phys_size = QMP_get_logical_dimensions();
286 const int* phys_coord = QMP_get_logical_coordinates();
294 for(
int i=0; i <
Nd; ++i)
296 _layout.logical_coord[i] = phys_coord[i];
297 _layout.logical_size[i] = phys_size[i];
306 for(
int i=0; i <
Nd; ++i)
311 for(
int i=0; i <
Nd; ++i)
316 for(
int i=0; i <
Nd; ++i)
321 for(
int i=0; i <
Nd; ++i)
328 if (
_layout.iogrid_defined ) {
331 for(
int i=0; i <
Nd; i++)
343 QDP_error_exit(
"Layout::create - Layout problems, the QMP logical to physical node map functions do not work correctly with this lattice size");
350 for(
int site=0; site <
vol(); ++site)
361 QDP_info(
"site= %d coord= %d %d %d %d linear= %d node=%d crd=%d %d %d %d j= %d",
362 site,coord1[0],coord1[1],coord1[2],coord1[3],
364 coord2[0],coord2[1],coord2[2],coord2[3],
368 QDP_error_exit(
"Layout::create - Layout problems, the layout functions do not work correctly with this lattice size");
381 QDPIO::cout <<
"Finished lattice layout" << std::endl;
384 QDP_info(
"Layout successfully initialized");
391#if QDP_USE_LEXICO_LAYOUT == 1
399 int linearSiteIndex(
const multi1d<int>& coord)
401 multi1d<int> tmp_coord(
Nd);
403 for(
int i=0; i < coord.size(); ++i)
416 for(
int i=0; i < coord.size(); ++i)
453#elif QDP_USE_CB2_LAYOUT == 1
465 subgrid_cb_nrow[0] >>= 1;
468 for(
int m=0; m <
Nd; ++m)
473 subgrid_cb_coord[0] = (coord[0] >> 1) % subgrid_cb_nrow[0];
474 for(
int i=1; i <
Nd; ++i)
475 subgrid_cb_coord[i] = coord[i] % subgrid_cb_nrow[i];
477 return local_site(subgrid_cb_coord, subgrid_cb_nrow) + cb*subgrid_vol_cb;
491 for(
int i=0; i < coord.size(); ++i)
507 subgrid_cb_nrow[0] >>= 1;
513 int cb = linearsite / subgrid_vol_cb;
518 coord[0] += 2*tmp_coord[0];
519 for(
int m=1; m <
Nd; ++m)
520 coord[m] += tmp_coord[m];
524 for(
int m=1; m <
Nd; ++m)
526 coord[0] += (cbb & 1);
546#elif QDP_USE_CB3D_LAYOUT == 1
558 subgrid_cb_nrow[0] /= 2;
561 for(
int m=0; m <
Nd-1; ++m) {
567 subgrid_cb_coord[0] = (coord[0] / 2) % subgrid_cb_nrow[0];
568 for(
int i=1; i <
Nd; ++i)
569 subgrid_cb_coord[i] = coord[i] % subgrid_cb_nrow[i];
571 return local_site(subgrid_cb_coord, subgrid_cb_nrow) + cb*subgrid_vol_cb;
585 for(
int i=0; i < coord.size(); ++i)
601 subgrid_cb_nrow[0] /= 2;
608 int cb = linearsite / subgrid_vol_cb;
615 coord[0] += 2*tmp_coord[0];
616 for(
int m=1; m <
Nd; ++m)
617 coord[m] += tmp_coord[m];
623 for(
int m=1; m <
Nd-1; ++m)
627 coord[0] += (cbb & 1);
649#elif QDP_USE_CB32_LAYOUT == 1
653#error "THIS BIT STILL UNDER CONSTRUCTION"
663 subgrid_cb_nrow[0] >>= 2;
664 for(
int i=1; i <
Nd; ++i)
665 subgrid_cb_nrow[i] >>= 1;
667 int subl = coord[
Nd-1] & 1;
668 for(
int m=
Nd-2; m >= 0; --m)
669 subl = (subl << 1) + (coord[m] & 1);
672 for(
int m=0; m <
Nd; ++m)
675 subl += (cb & 1) <<
Nd;
678 multi1d<int> subgrid_cb_coord(
Nd);
680 subgrid_cb_coord[0] = (coord[0] >> 2) % subgrid_cb_nrow[0];
681 for(
int i=1; i <
Nd; ++i)
682 subgrid_cb_coord[i] = (coord[i] >> 1) % subgrid_cb_nrow[i];
684 return local_site(subgrid_cb_coord, subgrid_cb_nrow) + subl*subgrid_vol_cb;
696 multi1d<int> tmp_coord(
Nd);
698 for(
int i=0; i < coord.size(); ++i)
710 multi1d<int>
siteCoords(
int node,
int linearsite)
714 subgrid_cb_nrow[0] >>= 2;
715 for(
int i=1; i <
Nd; ++i)
716 subgrid_cb_nrow[i] >>= 1;
722 int subl = linearsite / subgrid_vol_cb;
723 multi1d<int> tmp_coord =
crtesn(linearsite % subgrid_vol_cb, subgrid_cb_nrow);
727 coord[0] += tmp_coord[0] << 2;
728 for(
int m=1; m <
Nd; ++m)
729 coord[m] += tmp_coord[m] << 1;
732 for(
int m=1; m<
Nd; ++m)
737 for(
int m=0; m<
Nd; ++m)
738 coord[m] ^= (subl & (1 << m)) >> m;
739 coord[0] ^= (subl & (1 <<
Nd)) >> (
Nd-1);
749 multi1d<int> dim(
Nd);
752 for(
int m=1; m <
Nd; ++m)
761#error "no appropriate layout defined"
void init(size_t PoolSizeinMB)
static QDP::Allocator::QDPDefaultAllocator & Instance()
Container for a multi-dimensional 1D array.
const T * slice() const
Return ref to a column slice.
TextWriter & operator<<(TextWriter &txt, const std::string &output)
Layout namespace holding info on problem size and machine info.
int nodeNumber()
Returns the node number of this node.
struct QDP::Layout::LocalLayout_t _layout
const multi1d< int > & logicalSize()
Returns the logical size of this machine.
void setLattSize(const multi1d< int > &nrows)
Set virtual grid (problem grid) lattice size.
int linearSiteIndex(int site)
The linearized site index for the corresponding lexicographic site.
int sitesOnNode()
Subgrid lattice volume.
multi1d< int > siteCoords(int node, int index) QDP_CONST
Reconstruct the lattice coordinate from the node and site number.
void setIONodeGrid(const multi1d< int > &io_grid)
Set the I/O Node grid – satisfy interface.
void create()
Main lattice creation routine.
void initDefaults()
Initializer for all the layout defaults.
int getNodeNumberFrom(const multi1d< int > &node_coord)
Returns the node number given some logical node coordinate.
void init()
Initializer for layout.
int numNodes()
Returns the number of nodes.
const multi1d< int > & lattSize()
Virtual grid (problem grid) lattice size.
bool isIOGridDefined(void) QDP_CONST
check if I/O grid is defined
const multi1d< int > & subgridLattSize()
Subgrid (grid on each node) lattice size.
void setNumProc(int N)
Set number of processors in a multi-threaded implementation.
int numIONodeGrid(void) QDP_CONST
number of I/O nodes
multi1d< int > getLogicalCoordFrom(int node)
Returns the logical node coordinates given some node number.
void setSMPFlag(bool flag)
Set SMP flag – true if using smp/multiprocessor mode on a node.
int vol()
Total lattice volume.
multi1d< int > minimalLayoutMapping()
Return the smallest lattice size per node allowed.
bool primaryNode()
Returns whether this is the primary node.
void destroy()
Main destruction routine.
const multi1d< int > & nodeCoord()
Returns the logical node coordinates for this node.
const multi1d< int > & getIONodeGrid() QDP_CONST
Get the I/O Node grid.
StandardOutputStream cout
void initDefaultRNG()
Initialize the random number generator with a default seed.
Yet another random number generator.
int getProgramProfileLevel()
bool QDP_isInitialized()
Is the machine initialized?
void QDP_error_exit(const char *format,...)
Simple error display and abort routine.
int local_site(const multi1d< int > &coord, const multi1d< int > &latt_size)
Calculates the lexicographic site index from the coordinate of a site.
void initDefaultMaps()
Initializer for maps.
void initDefaultSets()
Initializer for sets.
MakeReturn< UnaryNode< FnFloor, typenameCreateLeaf< QDPExpr< T1, C1 > >::Leaf_t >, typenameUnaryReturn< C1, FnFloor >::Type_t >::Expression_t floor(const QDPExpr< T1, C1 > &l)
int setProfileLevel(int n)
multi1d< int > crtesn(int ipos, const multi1d< int > &latt_size)
Decompose a lexicographic site into coordinates.
int QDP_info(const char *format,...)
Simple information display routine.
Primary include file for QDP.
Catch-alls for all memory allocators.
Local data specific to all architectures.
int subgrid_vol
Subgrid lattice volume.
multi1d< int > logical_size
Logical system size.
int vol
Total lattice volume.
int num_nodes
Total number of nodes.
multi1d< int > iogrid
IO Grid size.
multi1d< int > nrow
Lattice size.
multi1d< int > logical_coord
Logical node coordinates.
multi1d< int > subgrid_nrow
Subgrid lattice size.