30 for(
int i=0; i < s1.
size(); ++i)
129 return QMP_get_node_number_from(node_coord.slice());
136 multi1d<int> node_coord(
Nd);
137 const int* node_crd = QMP_get_logical_coordinates_from(node);
139 for(
int i=0; i <
Nd; ++i)
140 node_coord[i] = node_crd[i];
144 int* non_const_node_crd =
const_cast<int*
>(node_crd);
145 free(non_const_node_crd);
155 _layout.num_nodes = QMP_get_number_of_nodes();
156 _layout.node_rank = QMP_get_node_number();
197 QDP_error_exit(
"dimension of lattice size not the same as the default");
200 for(
int i=0; i <
Nd; ++i)
213 QDP_error_exit(
"Layout::create() - this scalarvec implementation requires there be a multiple of %d sites",
INNER_LEN);
220 QDP_error_exit(
"Layout::create - problem size not divisible by number of processors");
228 for(
int i=0; i <
Nd; ++i)
229 if (
_layout.nrow[i] % min_dim[i] != 0)
230 QDP_error_exit(
"Layout::create - Error: problem size not multiple of smallest size allowed for this type of layout");
235 multi1d<int> nrow(
Nd);
236 for(
int i=0; i <
Nd; ++i)
237 nrow[i] =
_layout.nrow[i] / min_dim[i];
239 int* nrow_slice=
const_cast<int*
>(nrow.slice());
240 QMP_layout_grid(nrow_slice,
Nd);
244 const int* phys_size = QMP_get_logical_dimensions();
245 const int* phys_coord = QMP_get_logical_coordinates();
253 for(
int i=0; i <
Nd; ++i)
255 _layout.logical_coord[i] = phys_coord[i];
256 _layout.logical_size[i] = phys_size[i];
268 for(
int i=0; i <
Nd; ++i)
273 for(
int i=0; i <
Nd; ++i)
278 for(
int i=0; i <
Nd; ++i)
283 for(
int i=0; i <
Nd; ++i)
293 QDP_error_exit(
"Layout::create() - this parscalarvec implementation requires there be a multiple of %d sites",
INNER_LEN);
303 QDP_error_exit(
"Layout::create - Layout problems, the QMP logical to physical node map functions do not work correctly with this lattice size");
307 for(
int site=0; site <
vol(); ++site)
314 multi1d<int> coord2 =
siteCoords(node,linear);
318 QDP_info(
"site= %d coord= %d %d %d %d linear= %d node=%d crd=%d %d %d %d j= %d",
319 site,coord1[0],coord1[1],coord1[2],coord1[3],
321 coord2[0],coord2[1],coord2[2],coord2[3],
325 QDP_error_exit(
"Layout::create - Layout problems, the layout functions do not work correctly with this lattice size");
331 QDPIO::cout <<
"Finished lattice layout" << std::endl;
337#if QDP_USE_LEXICO_LAYOUT == 1
349 for(
int i=0; i < coord.size(); ++i)
362 for(
int i=0; i < coord.size(); ++i)
399#elif QDP_USE_CB2_LAYOUT == 1
411 subgrid_cb_nrow[0] >>= 1;
414 for(
int m=0; m <
Nd; ++m)
419 subgrid_cb_coord[0] = (coord[0] >> 1) % subgrid_cb_nrow[0];
420 for(
int i=1; i <
Nd; ++i)
421 subgrid_cb_coord[i] = coord[i] % subgrid_cb_nrow[i];
423 return local_site(subgrid_cb_coord, subgrid_cb_nrow) + cb*subgrid_vol_cb;
437 for(
int i=0; i < coord.size(); ++i)
453 subgrid_cb_nrow[0] >>= 1;
459 int cb = linearsite / subgrid_vol_cb;
464 coord[0] += 2*tmp_coord[0];
465 for(
int m=1; m <
Nd; ++m)
466 coord[m] += tmp_coord[m];
470 for(
int m=1; m <
Nd; ++m)
472 coord[0] += (cbb & 1);
493#elif QDP_USE_CB32_LAYOUT == 1
497#error "THIS BIT STILL UNDER CONSTRUCTION"
507 subgrid_cb_nrow[0] >>= 2;
508 for(
int i=1; i <
Nd; ++i)
509 subgrid_cb_nrow[i] >>= 1;
511 int subl = coord[
Nd-1] & 1;
512 for(
int m=
Nd-2; m >= 0; --m)
513 subl = (subl << 1) + (coord[m] & 1);
516 for(
int m=0; m <
Nd; ++m)
519 subl += (cb & 1) <<
Nd;
522 multi1d<int> subgrid_cb_coord(
Nd);
524 subgrid_cb_coord[0] = (coord[0] >> 2) % subgrid_cb_nrow[0];
525 for(
int i=1; i <
Nd; ++i)
526 subgrid_cb_coord[i] = (coord[i] >> 1) % subgrid_cb_nrow[i];
528 return local_site(subgrid_cb_coord, subgrid_cb_nrow) + subl*subgrid_vol_cb;
540 multi1d<int> tmp_coord(
Nd);
542 for(
int i=0; i < coord.size(); ++i)
554 multi1d<int>
siteCoords(
int node,
int linearsite)
558 subgrid_cb_nrow[0] >>= 2;
559 for(
int i=1; i <
Nd; ++i)
560 subgrid_cb_nrow[i] >>= 1;
566 int subl = linearsite / subgrid_vol_cb;
567 multi1d<int> tmp_coord =
crtesn(linearsite % subgrid_vol_cb, subgrid_cb_nrow);
571 coord[0] += tmp_coord[0] << 2;
572 for(
int m=1; m <
Nd; ++m)
573 coord[m] += tmp_coord[m] << 1;
576 for(
int m=1; m<
Nd; ++m)
581 for(
int m=0; m<
Nd; ++m)
582 coord[m] ^= (subl & (1 << m)) >> m;
583 coord[0] ^= (subl & (1 <<
Nd)) >> (
Nd-1);
593 multi1d<int> dim(
Nd);
596 for(
int m=1; m <
Nd; ++m)
605#error "no appropriate layout defined"
Container for a multi-dimensional 1D array.
int size() const
Size of array.
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 create()
Main lattice creation routine.
int outerSitesOnNode()
Subgrid lattice volume.
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.
const multi1d< int > & subgridLattSize()
Subgrid (grid on each node) lattice size.
void setNumProc(int N)
Set number of processors in a multi-threaded implementation.
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.
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.
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.
int subgrid_vol
Subgrid lattice volume.
int olattice_vol
Outer-subgrid lattice volume.
multi1d< int > logical_size
Logical system size.
int vol
Total lattice volume.
int num_nodes
Total number of nodes.
multi1d< int > nrow
Lattice size.
multi1d< int > logical_coord
Logical node coordinates.
multi1d< int > subgrid_nrow
Subgrid lattice size.