22 struct StructIndexMapping;
29 struct StructIndexMapping<1, 1, 0>
31 static Index compute(Index i, Index j,
const Index [])
42 struct StructIndexMapping<2, 1, 0>
44 static Index compute(Index i, Index j,
const Index num_slices[])
47 if(i < num_slices[0] * (num_slices[1] + 1))
49 return i + j + i / num_slices[0];
53 return ((i - num_slices[0] * (num_slices[1] + 1)) / num_slices[1])
54 + ((i - num_slices[0] * (num_slices[1] + 1)) % num_slices[1])
55 * (num_slices[0] + 1) + j * (num_slices[0] + 1);
62 struct StructIndexMapping<2, 2, 0>
64 static Index compute(Index i, Index j,
const Index num_slices[])
67 return ((i / num_slices[0]) + ((j >> 1) & 0x1)) * (num_slices[0] + 1) + (i % num_slices[0]) + (j & 0x1);
73 struct StructIndexMapping<2, 2, 1>
75 static Index compute(Index i, Index j,
const Index num_slices[])
78 return ((3 - j) / 2) * (i + j * num_slices[0]) + (j / 2) * (num_slices[0] * (num_slices[1] + 1)
79 + ((i % num_slices[0]) + (j / 3)) * num_slices[1] + (i / num_slices[0]));
88 struct StructIndexMapping<3, 1, 0>
90 static Index compute(Index i, Index j,
const Index num_slices[])
98 if( i >= num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1) +
99 (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0])
101 pos = i - num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1) - (num_slices[2] + 1)
102 * (num_slices[1] + 1) * num_slices[0];
103 return (pos / num_slices[2]) + (pos % num_slices[2] + j) * (num_slices[0] + 1)*(num_slices[1] + 1);
106 else if( i >= (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0])
108 pos = i - (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0];
109 Index x = (pos / num_slices[1]) % (num_slices[0] + 1);
110 Index y = pos % num_slices[1];
111 Index z = (pos / num_slices[1]) / (num_slices[0] + 1);
112 return z * (num_slices[0] + 1) * (num_slices[1] + 1) + (y + j) * (num_slices[0] + 1) + x;
117 return i + j + i / num_slices[0];
124 struct StructIndexMapping<3, 2, 0>
126 static Index compute(Index i, Index j,
const Index num_slices[])
130 if( i < num_slices[0] * num_slices[1] * (num_slices[2] + 1))
132 return i + (i / num_slices[0]) + (i / (num_slices[0] * num_slices[1])) * (num_slices[0] + 1)
133 + (j % 2) + (j / 2) * (num_slices[0] + 1);
135 else if( i >= num_slices[0] * num_slices[1] * (num_slices[2] + 1)
136 && i < num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1)))
138 pos = i - num_slices[0] * num_slices[1] * (num_slices[2] + 1);
139 return pos % num_slices[0] + (pos / (num_slices[0] * num_slices[2])) * (num_slices[0] + 1)
140 + (pos % (num_slices[0] * num_slices[2])) / num_slices[0]
141 *(num_slices[0] + 1)*(num_slices[1] + 1) + (j % 2) + (j / 2) * (num_slices[0] + 1) * (num_slices[1] + 1);
145 pos = i - num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1));
146 return pos / (num_slices[1] * num_slices[2]) + (pos % num_slices[1]) * (num_slices[0] + 1) + ((pos / num_slices[1]) % num_slices[2])
147 * (num_slices[0] + 1) * (num_slices[1] + 1) + (j % 2) * (num_slices[0] + 1) + (j / 2)
148 * (num_slices[0] + 1) * (num_slices[1] + 1);
155 struct StructIndexMapping<3, 3, 0>
157 static Index compute(Index i, Index j,
const Index num_slices[])
160 return (i / (num_slices[0] * num_slices[1]) + j / 4) * ((num_slices[0] + 1)*(num_slices[1] + 1))
161 + ((i % (num_slices[0] * num_slices[1])) / num_slices[0] + (j % 4) / 2) * (num_slices[0] + 1)
162 + (i % (num_slices[0] * num_slices[1])) % num_slices[0] + j % 2;
168 struct StructIndexMapping<3, 2, 1>
170 static Index compute(Index i, Index j,
const Index num_slices[])
173 Index pos, node_0, node_0_x, node_0_y, node_0_z;
176 if( i < num_slices[0] * num_slices[1] * (num_slices[2] + 1))
179 node_0 = i + (i / num_slices[0]) + (i / (num_slices[0] * num_slices[1])) * (num_slices[0] + 1);
183 return node_0 - (node_0 / (num_slices[0] + 1)) + (j % 2) * num_slices[0];
188 node_0_x = node_0 % (num_slices[0] + 1);
189 node_0_y = (node_0 / (num_slices[0] + 1)) % (num_slices[1] + 1);
190 node_0_z = node_0 / ((num_slices[0] + 1) * (num_slices[1] + 1));
191 return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1) + node_0_y + (node_0_x + j - 2)
192 * num_slices[1] + node_0_z * (num_slices[0] + 1) * num_slices[1];
196 else if( i >= num_slices[0] * num_slices[1] * (num_slices[2]+1)
197 && i < num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1)))
200 pos = i - num_slices[0] * num_slices[1] * (num_slices[2] + 1);
201 node_0 = pos % num_slices[0] + (pos / (num_slices[0] * num_slices[2])) * (num_slices[0] + 1)
202 + (pos % (num_slices[0] * num_slices[2])) / num_slices[0]
203 * (num_slices[0] + 1) * (num_slices[1] + 1);
207 return node_0 - (node_0 / (num_slices[0] + 1)) + (j % 2) * num_slices[0] * (num_slices[1] + 1);
212 node_0_x = node_0 % (num_slices[0] + 1);
213 node_0_y = (node_0 / (num_slices[0] + 1)) % (num_slices[1] + 1);
214 node_0_z = node_0 / ((num_slices[0] + 1) * (num_slices[1] + 1));
215 return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1)
216 + num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1)
217 + node_0_z + (node_0_x + j - 2) * num_slices[2] + node_0_y * (num_slices[0] + 1) * num_slices[2];
224 pos = i - num_slices[0] * (num_slices[1] * (num_slices[2] + 1) + num_slices[2] * (num_slices[1] + 1));
225 node_0 = pos / (num_slices[1] * num_slices[2]) + (pos % num_slices[1]) * (num_slices[0] + 1)
226 + ((pos / num_slices[1]) % num_slices[2]) * (num_slices[0] + 1) * (num_slices[1] + 1);
229 node_0_x = node_0 % (num_slices[0] + 1);
230 node_0_y = (node_0 / (num_slices[0] + 1)) % (num_slices[1] + 1);
231 node_0_z = node_0 / ((num_slices[0] + 1) * (num_slices[1] + 1));
235 return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1) + node_0_y + node_0_x * num_slices[1]
236 + (node_0_z + j) * (num_slices[0] + 1) * num_slices[1];
240 return num_slices[0] * (num_slices[1] + 1) * (num_slices[2] + 1) + num_slices[1] * (num_slices[0] + 1) * (num_slices[2] + 1)
241 + node_0_z + node_0_x * num_slices[2] + (node_0_y + j - 2) * (num_slices[0] + 1) * num_slices[2];
251 struct StructIndexMapping<3, 3, 1>
253 static Index compute(Index i, Index j,
const Index num_slices[])
256 Index x = i % (num_slices[0] * num_slices[1]) % num_slices[0];
257 Index y = i % (num_slices[0] * num_slices[1]) / num_slices[0];
258 Index z = i / (num_slices[0] * num_slices[1]);
261 return (z + j / 2) * num_slices[0] * (num_slices[1] + 1) + (y + j % 2) * num_slices[0] + x;
265 return (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0] + (z + j / 6) * num_slices[1] * (num_slices[0]+1)
266 + (x + j % 2) * num_slices[1] + y;
270 return (num_slices[2] + 1) * (num_slices[1] + 1) * num_slices[0] + num_slices[1] * (num_slices[0] + 1)
271 * (num_slices[2] + 1) + (y + j / 10) * num_slices[2] * (num_slices[0] + 1) + (x + j % 2) * num_slices[2] + z;
278 struct StructIndexMapping<3, 3, 2>
280 static Index compute(Index i, Index j,
const Index num_slices[])
285 return i + j*num_slices[0] * num_slices[1];
290 Index x = i % (num_slices[0] * num_slices[1]) % num_slices[0];
291 Index y = i % (num_slices[0] * num_slices[1]) / num_slices[0];
292 Index z = i / (num_slices[0] * num_slices[1]);
293 return num_slices[0] * num_slices[1] * (num_slices[2] + 1)
294 + x + z * num_slices[0] + (y + j - 2) * num_slices[0] * num_slices[2];
299 Index x = i % (num_slices[0] * num_slices[1]) % num_slices[0];
300 Index y = i % (num_slices[0] * num_slices[1]) / num_slices[0];
301 Index z = i / (num_slices[0] * num_slices[1]);
302 return num_slices[0] * (num_slices[1] * (num_slices[2]+1) + num_slices[2] * (num_slices[1]+1))
303 + y + z * num_slices[1] + (x + j - 4) * num_slices[1] * num_slices[2];
std::uint64_t Index
Index data type.