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 "layout.h"
15 
16 // static const char rcsid[] = "$Id: physical_map.cpp 1145 2014-09-16 09:27:22Z namekawa $";
17 
18 static int find_coord_map(const char map_expr[], int ndim, int *map);
19 
20 //* physical rank is assigned to physical grid coord in column major order.
21 //* phys_coord[0] x phys_coord[1] x ... (fastest to slowest)
22 //* other assignment may be chosen.
23 
24 //* logical grid coord to physical rank number
25 int Communicator_impl::Layout::grid_rank(int *rank, const int *gcoord)
26 {
27  int r = 0;
28 
29  for (int i = m_ndim - 1; i >= 0; --i) {
30  int k = m_physical_to_logical[i];
31  r = r * m_grid_dims[k] + gcoord[k];
32  }
33 
34  *rank = r;
35 
36  return EXIT_SUCCESS;
37 }
38 
39 
40 //* physical rank to logical grid coord
41 int Communicator_impl::Layout::grid_coord(int *gcoord, const int rank)
42 {
43  int r = rank;
44 
45  for (int i = 0; i < m_ndim; ++i) {
46  int k = m_physical_to_logical[i];
47 
48  gcoord[k] = r % m_grid_dims[k];
49  r /= m_grid_dims[k];
50  }
51 
52  return EXIT_SUCCESS;
53 }
54 
55 
57 {
58  strncpy(m_map_grid, CommonParameters::Grid_map(), sizeof(m_map_grid) / sizeof(char));
59 
60  // physical to logical map
61  m_physical_to_logical = new int [m_ndim];
62 
63  find_coord_map(m_map_grid, m_ndim, m_physical_to_logical);
64 
65  return EXIT_SUCCESS;
66 }
67 
68 
70 {
71  delete [] m_physical_to_logical;
72 
73  return EXIT_SUCCESS;
74 }
75 
76 
77 //* translate {x, y, z, t, (w)} into {0, 1, 2, 3, (4)}
78 static int find_coord_map(const char map_expr[], int ndim, int *map)
79 {
80  int len = strlen(map_expr);
81 
82  if (len != ndim) {
83  fprintf(stderr, "ERROR: find_map: length mismatch: %d, expected %d.\n", len, ndim);
84  return EXIT_FAILURE;
85  }
86 
87  for (int i = 0; i < len; ++i) {
88  char c = map_expr[i];
89  int idx = -1;
90 
91  switch (c)
92  {
93  case 'x':
94  idx = 0;
95  break;
96 
97  case 'y':
98  idx = 1;
99  break;
100 
101  case 'z':
102  idx = 2;
103  break;
104 
105  case 't':
106  idx = 3;
107  break;
108 
109  case 'w':
110  idx = 4;
111  break; // extra 5th dimension
112 
113  default:
114  fprintf(stderr, "ERROR: find_map: unknown symbol %c.\n", c);
115  return EXIT_FAILURE;
116  }
117 
118  map[i] = idx;
119  }
120 
121  return EXIT_SUCCESS;
122 }
static int find_coord_map(const char map_expr[], int ndim, int *map)
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 * m_grid_dims
grid dimensions in directions.
Definition: layout.h:39
static char * Grid_map()
static int physical_map_delete()
static int physical_map_setup()