55 static int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
59 #define MAXPRIMES (sizeof(prime)/sizeof(int)) 68 if(QMP_get_number_of_nodes() == 1) {
69 for (i=0; i<
ndim; i++) {
74 for (i=0; i<
ndim; i++) {
75 nsquares[i] = QMP_get_logical_dimensions()[i];
86 ndim2 = QMP_get_allocated_number_of_dimensions();
87 nsquares2 = QMP_get_allocated_dimensions();
88 for(i=0; i<
ndim; i++) {
89 if(i<ndim2)
nsquares[i] = nsquares2[i];
93 for(i=0; i<
ndim; i++) {
95 printf(
"LATTICE SIZE DOESN'T FIT GRID\n");
107 for(i=0; i<
ndim; ++i) {
116 while( (n%
prime[k]!=0) && (k>0) ) --k;
124 for(i=0; i<
ndim; i++) {
137 fprintf(stderr,
"LAYOUT: Not enough prime factors in lattice dimensions\n");
172 if(QMP_get_msg_passing_type()==QMP_GRID) {
183 if(!QMP_logical_topology_is_declared()) {
189 for(i=0; i<
ndim; ++i) {
194 size1[0] = (
int*)malloc(2*(ndim+1)*
sizeof(int));
198 size2 = (
int*)malloc((ndim+1)*
sizeof(int));
203 for(i=1; i<=
ndim; i++) {
218 for(i=0; i<
ndim; i++) {
221 return QMP_get_node_number_from(
mcoord);
228 for(i=
ndim-1; i>=0; --i) {
248 m = QMP_get_logical_coordinates_from(node);
251 for(i=0; i<
ndim; ++i) {
257 if(index>=
size1[s][ndim]) {
262 for(i=ndim-1; i>0; i--) {
263 x[i] += 2*(index/
size2[i]);
265 if(index>=
size1[s][i]) {
278 fprintf(stderr,
"get_coords: error in layout!\n");
279 for(i=0; i<
ndim; i++) {
282 fprintf(stderr,
"%i\t%i", node, si);
283 for(i=0; i<
ndim; i++) fprintf(stderr,
"\t%i", x[i]);
284 fprintf(stderr,
"\n");
void get_coords(int x[], int node, int index)
static void setup_hyper_prime(int len[], int nd, int numnodes)
static void setup_qmp_fixed(int len[], int nd, int numnodes)
static int index(int ndim, const int *dims, const int *x)
int setup_layout(int len[], int nd, int numnodes)
int node_index(const int x[])
int node_number(const int x[])
static void setup_qmp_grid(int len[], int nd, int numnodes)