51 static int *squaresize;
54 static int *size1[2], *size2;
55 static int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
56 static int sites_on_node;
59 #define MAXPRIMES (sizeof(prime)/sizeof(int))
62 static void setup_qmp_fixed(
int len[],
int nd,
int numnodes) {
65 for (i=0; i<ndim; i++) {
66 nsquares[i] = QMP_get_logical_dimensions()[i];
67 squaresize[i] = len[i]/nsquares[i];
72 static void setup_qmp_grid(
int len[],
int nd,
int numnodes){
76 ndim2 = QMP_get_allocated_number_of_dimensions();
77 nsquares2 = QMP_get_allocated_dimensions();
78 for(i=0; i<ndim; i++) {
79 if(i<ndim2) nsquares[i] = nsquares2[i];
83 for(i=0; i<ndim; i++) {
84 if(len[i]%nsquares[i] != 0) {
85 printf(
"LATTICE SIZE DOESN'T FIT GRID\n");
88 squaresize[i] = len[i]/nsquares[i];
92 static void setup_hyper_prime(
int len[],
int nd,
int numnodes)
97 for(i=0; i<ndim; ++i) {
98 squaresize[i] = len[i];
106 while( (n%prime[k]!=0) && (k>0) ) --k;
114 for(i=0; i<ndim; i++) {
115 if(squaresize[i]%prime[k]==0) {
116 if( (j<0) || (squaresize[i]>squaresize[j]) ) {
118 }
else if(squaresize[i]==squaresize[j]) {
119 if((nsquares[j]==1)&&(nsquares[i]!=1)) j = i;
127 fprintf(stderr,
"LAYOUT: Not enough prime factors in lattice dimensions\n");
135 squaresize[j] /= prime[k];
136 nsquares[j] *= prime[k];
144 squaresize = (
int *) malloc(ndim*
sizeof(
int));
145 nsquares = (
int *) malloc(ndim*
sizeof(
int));
146 mcoord = (
int *) malloc(ndim*
sizeof(
int));
155 if(QMP_get_msg_passing_type()==QMP_GRID) {
157 setup_qmp_grid(len, ndim, numnodes);
159 printf(
"prime\n"); setup_hyper_prime(len, ndim, numnodes);
162 setup_qmp_fixed(len, ndim, numnodes);
166 if(!QMP_logical_topology_is_declared()) {
167 if(QMP_declare_logical_topology(nsquares, ndim)!=0)
172 for(i=0; i<ndim; ++i) {
173 sites_on_node *= squaresize[i];
176 size1[0] = (
int*)malloc(2*(ndim+1)*
sizeof(int));
177 size1[1] = size1[0] + ndim + 1;
178 size2 = (
int*)malloc((ndim+1)*
sizeof(int));
183 for(i=1; i<=ndim; i++) {
184 size1[0][i] = size2[i-1]*(squaresize[i-1]/2)
185 + size1[0][i-1]*(squaresize[i-1]%2);
186 size1[1][i] = size2[i-1]*(squaresize[i-1]/2)
187 + size1[1][i-1]*(squaresize[i-1]%2);
188 size2[i] = size1[0][i] + size1[1][i];
198 for(i=0; i<ndim; i++) {
199 mcoord[i] = x[i]/squaresize[i];
201 return QMP_get_node_number_from(mcoord);
208 for(i=ndim-1; i>=0; --i) {
209 r = r*squaresize[i] + (x[i]%squaresize[i]);
216 r = (r+sites_on_node)/2;
228 m = QMP_get_logical_coordinates_from(node);
231 for(i=0; i<ndim; ++i) {
232 x[i] = m[i] * squaresize[i];
237 if(index>=size1[s][ndim]) {
238 index -= size1[
s][ndim];
242 for(i=ndim-1; i>0; i--) {
243 x[i] += 2*(index/size2[i]);
245 if(index>=size1[s][i]) {
246 index -= size1[
s][i];
258 fprintf(stderr,
"get_coords: error in layout!\n");
259 for(i=0; i<ndim; i++) {
260 fprintf(stderr,
"%i\t%i\t%i\n", size1[0][i], size1[1][i], size2[i]);
262 fprintf(stderr,
"%i\t%i", node, si);
263 for(i=0; i<ndim; i++) fprintf(stderr,
"\t%i", x[i]);
264 fprintf(stderr,
"\n");
273 return sites_on_node;
void get_coords(int x[], int node, int index)
int setup_layout(int len[], int nd, int numnodes)
int node_index(const int x[])
int node_number(const int x[])