Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
physical_map.cpp
Go to the documentation of this file.
1 
14 #include "configure.h"
15 #include "defs.h"
16 
17 #include <cstdio>
18 #include <cstdlib>
19 #include <cstdarg>
20 #include <cstddef>
21 #include <cstring>
22 
23 #include "commonParameters.h"
24 #include "communicator.h"
25 #include "communicator_bgnet.h"
26 #include "layout.h"
27 
28 #include <exception>
29 #include <cassert>
30 
31 static const char rcsid[] = "$Id: physical_map.cpp 1145 2014-09-16 09:27:22Z namekawa $";
32 
33 static int find_coord_map(const char map_expr[], int ndim, int *map);
34 
35 //* physical rank is assigned to physical grid coord in column major order.
36 //* phys_coord[0] x phys_coord[1] x ... (fastest to slowest)
37 //* other assignment may be chosen.
38 
39 //* logical grid coord to physical rank number
40 int Communicator_impl::Layout::grid_rank(int *rank, const int *gcoord)
41 {
42  int r = 0;
43 
44  for (int i = m_ndim - 1; i >= 0; --i) {
45  int k = m_physical_to_logical[i];
46  r = r * m_grid_dims[k] + gcoord[k];
47  }
48 
49  *rank = r;
50 
51  return BRIDGE_SUCCESS;
52 }
53 
54 
55 //* physical rank to logical grid coord
56 int Communicator_impl::Layout::grid_coord(int *gcoord, const int rank)
57 {
58  int r = rank;
59 
60  for (int i = 0; i < m_ndim; ++i) {
61  int k = m_physical_to_logical[i];
62 
63  gcoord[k] = r % m_grid_dims[k];
64  r /= m_grid_dims[k];
65  }
66 
67  return BRIDGE_SUCCESS;
68 }
69 
70 
72 {
73  strncpy(m_map_grid, CommonParameters::Grid_map(), sizeof(m_map_grid) / sizeof(char));
74 
75  // physical to logical map
76  m_physical_to_logical = new int [m_ndim];
77 
78  find_coord_map(m_map_grid, m_ndim, m_physical_to_logical);
79 
80  return BRIDGE_SUCCESS;
81 }
82 
83 
85 {
86  delete [] m_physical_to_logical;
87 
88  return BRIDGE_SUCCESS;
89 }
90 
91 
92 //* translate {x, y, z, t, (w)} into {0, 1, 2, 3, (4)}
93 static int find_coord_map(const char map_expr[], int ndim, int *map)
94 {
95  int len = strlen(map_expr);
96 
97  if (len != ndim) {
98  fprintf(stderr, "ERROR: find_map: length mismatch: %d, expected %d.\n", len, ndim);
99  return BRIDGE_ERR;
100  }
101 
102  for (int i = 0; i < len; ++i) {
103  char c = map_expr[i];
104  int idx = -1;
105 
106  switch (c)
107  {
108  case 'x':
109  idx = 0;
110  break;
111 
112  case 'y':
113  idx = 1;
114  break;
115 
116  case 'z':
117  idx = 2;
118  break;
119 
120  case 't':
121  idx = 3;
122  break;
123 
124  case 'w':
125  idx = 4;
126  break; // extra 5th dimension
127 
128  default:
129  fprintf(stderr, "ERROR: find_map: unknown symbol %c.\n", c);
130  return BRIDGE_ERR;
131  }
132 
133  map[i] = idx;
134  }
135 
136  return BRIDGE_SUCCESS;
137 }
static int grid_coord(int *gcoord, const int rank)
static int * m_physical_to_logical
map between physical and logical grid
Definition: layout.h:47
static int m_ndim
number of dimensions.
Definition: layout.h:35
static int m_ndim
static int grid_rank(int *rank, const int *gcoord)
static int find_coord_map(const char map_expr[], int ndim, int *map)
static int * m_grid_dims
grid dimensions in directions.
Definition: layout.h:39
static char * Grid_map()
static const char rcsid[]
static int physical_map_delete()
static int physical_map_setup()