1 | /* |
2 | * SparseGridUtil.hpp |
3 | * |
4 | * Created on: Oct 27, 2017 |
5 | * Author: i-bird |
6 | */ |
7 | |
8 | #ifndef OPENFPM_DATA_SRC_SPARSEGRID_SPARSEGRIDUTIL_HPP_ |
9 | #define OPENFPM_DATA_SRC_SPARSEGRID_SPARSEGRIDUTIL_HPP_ |
10 | |
11 | const static int cnk_pos = 0; |
12 | const static int cnk_nele = 1; |
13 | const static int cnk_mask = 2; |
14 | |
15 | //! sizeof the cache |
16 | #define SGRID_CACHE 2 |
17 | |
18 | //! When we have more that 1024 to remove remove them |
19 | #define FLUSH_REMOVE 1024 |
20 | |
21 | template<typename T> |
22 | struct encapsulated_type |
23 | { |
24 | typedef T type; |
25 | }; |
26 | |
27 | //! transform T=aggregate<float,double,int> into aggregate<std::array<float,n_ele>,std::array<double,n_ele>,std::array<int,n_ele>> |
28 | template <typename n_ele, typename T> |
29 | struct Ft_chunk |
30 | { |
31 | typedef encapsulated_type<std::array<typename std::remove_const<typename std::remove_reference<T>::type>::type,n_ele::value>> type; |
32 | }; |
33 | |
34 | //! Special case for vector |
35 | template <typename n_ele, typename T, int N1> |
36 | struct Ft_chunk<n_ele,const T(&)[N1]> |
37 | { |
38 | // typedef typename T::culo culo; |
39 | typedef encapsulated_type<std::array<T,n_ele::value>[N1]> type; |
40 | }; |
41 | |
42 | template<unsigned int dim> |
43 | struct NNStar_c |
44 | { |
45 | static const int nNN = 2*dim; |
46 | |
47 | static const int is_cross = false; |
48 | }; |
49 | |
50 | /*! \brief this class is a functor for "for_each" algorithm |
51 | * |
52 | * This class is a functor for "for_each" algorithm. For each |
53 | * element of the boost::vector the operator() is called. |
54 | * Is mainly used to set a grid info |
55 | * |
56 | * \tparam grid_sm_type |
57 | * \tparam vector_blocks_ext |
58 | * |
59 | */ |
60 | template<unsigned int dim, unsigned int stencil_size, typename vector_blocks_ext,typename vector_ext> |
61 | struct get_block_sizes |
62 | { |
63 | //! sizes in point with border |
64 | size_t sz_tot[dim]; |
65 | |
66 | //! sizes blocks |
67 | size_t sz_ext[dim]; |
68 | |
69 | //! sizes with border block |
70 | size_t sz_ext_b[dim]; |
71 | |
72 | //! sizes |
73 | size_t sz_block[dim]; |
74 | |
75 | //! It call the copy function for each property |
76 | template<typename T> |
77 | inline void operator()(T& val) |
78 | { |
79 | sz_tot[T::value] = boost::mpl::at<typename vector_blocks_ext::type,boost::mpl::int_<T::value>>::type::value * boost::mpl::at<vector_ext,boost::mpl::int_<T::value>>::type::value + 2*stencil_size; |
80 | sz_ext[T::value] = boost::mpl::at<vector_ext,boost::mpl::int_<T::value>>::type::value; |
81 | sz_ext_b[T::value] = boost::mpl::at<vector_ext,boost::mpl::int_<T::value>>::type::value + 2*stencil_size; |
82 | sz_block[T::value] = boost::mpl::at<typename vector_blocks_ext::type,boost::mpl::int_<T::value>>::type::value; |
83 | } |
84 | }; |
85 | |
86 | template<unsigned int dim> |
87 | struct default_chunking |
88 | { |
89 | typedef void type; |
90 | }; |
91 | |
92 | |
93 | |
94 | template<> |
95 | struct default_chunking<1> |
96 | { |
97 | typedef boost::mpl::vector<boost::mpl::int_<128>> type; |
98 | |
99 | typedef boost::mpl::vector<boost::mpl::int_<7>> shift; |
100 | |
101 | typedef boost::mpl::vector<boost::mpl::int_<7>> shift_c; |
102 | |
103 | typedef boost::mpl::int_<128> size; |
104 | }; |
105 | |
106 | template<> |
107 | struct default_chunking<2> |
108 | { |
109 | typedef boost::mpl::vector<boost::mpl::int_<32>, |
110 | boost::mpl::int_<32>> type; |
111 | |
112 | typedef boost::mpl::vector<boost::mpl::int_<5>, |
113 | boost::mpl::int_<5>> shift; |
114 | |
115 | typedef boost::mpl::vector<boost::mpl::int_<5>, |
116 | boost::mpl::int_<10>> shift_c; |
117 | |
118 | typedef boost::mpl::int_<1024> size; |
119 | }; |
120 | |
121 | template<> |
122 | struct default_chunking<3> |
123 | { |
124 | typedef boost::mpl::vector<boost::mpl::int_<16>, |
125 | boost::mpl::int_<16>, |
126 | boost::mpl::int_<16>> type; |
127 | |
128 | typedef boost::mpl::vector<boost::mpl::int_<4>, |
129 | boost::mpl::int_<4>, |
130 | boost::mpl::int_<4>> shift; |
131 | |
132 | typedef boost::mpl::vector<boost::mpl::int_<4>, |
133 | boost::mpl::int_<8>, |
134 | boost::mpl::int_<12>> shift_c; |
135 | |
136 | typedef boost::mpl::int_<4096> size; |
137 | |
138 | typedef boost::mpl::int_<1736> bord_size; |
139 | }; |
140 | |
141 | template<> |
142 | struct default_chunking<4> |
143 | { |
144 | typedef boost::mpl::vector<boost::mpl::int_<8>, |
145 | boost::mpl::int_<8>, |
146 | boost::mpl::int_<8>, |
147 | boost::mpl::int_<8>> type; |
148 | |
149 | typedef boost::mpl::vector<boost::mpl::int_<3>, |
150 | boost::mpl::int_<3>, |
151 | boost::mpl::int_<3>, |
152 | boost::mpl::int_<3>> shift; |
153 | |
154 | typedef boost::mpl::vector<boost::mpl::int_<3>, |
155 | boost::mpl::int_<6>, |
156 | boost::mpl::int_<9>, |
157 | boost::mpl::int_<12>> shift_c; |
158 | |
159 | typedef boost::mpl::int_<4096> size; |
160 | }; |
161 | |
162 | template<> |
163 | struct default_chunking<5> |
164 | { |
165 | typedef boost::mpl::vector<boost::mpl::int_<4>, |
166 | boost::mpl::int_<4>, |
167 | boost::mpl::int_<4>, |
168 | boost::mpl::int_<4>, |
169 | boost::mpl::int_<4>> type; |
170 | |
171 | typedef boost::mpl::vector<boost::mpl::int_<2>, |
172 | boost::mpl::int_<2>, |
173 | boost::mpl::int_<2>, |
174 | boost::mpl::int_<2>, |
175 | boost::mpl::int_<2>> shift; |
176 | |
177 | typedef boost::mpl::vector<boost::mpl::int_<2>, |
178 | boost::mpl::int_<4>, |
179 | boost::mpl::int_<6>, |
180 | boost::mpl::int_<8>, |
181 | boost::mpl::int_<10>> shift_c; |
182 | |
183 | typedef boost::mpl::int_<1024> size; |
184 | }; |
185 | |
186 | |
187 | template<> |
188 | struct default_chunking<6> |
189 | { |
190 | typedef boost::mpl::vector<boost::mpl::int_<4>, |
191 | boost::mpl::int_<4>, |
192 | boost::mpl::int_<4>, |
193 | boost::mpl::int_<4>, |
194 | boost::mpl::int_<4>, |
195 | boost::mpl::int_<4>> type; |
196 | |
197 | typedef boost::mpl::vector<boost::mpl::int_<2>, |
198 | boost::mpl::int_<2>, |
199 | boost::mpl::int_<2>, |
200 | boost::mpl::int_<2>, |
201 | boost::mpl::int_<2>, |
202 | boost::mpl::int_<2>> shift_c; |
203 | |
204 | typedef boost::mpl::vector<boost::mpl::int_<2>, |
205 | boost::mpl::int_<4>, |
206 | boost::mpl::int_<6>, |
207 | boost::mpl::int_<8>, |
208 | boost::mpl::int_<10>, |
209 | boost::mpl::int_<12>> shift; |
210 | |
211 | typedef boost::mpl::int_<4096> size; |
212 | }; |
213 | |
214 | |
215 | template<> |
216 | struct default_chunking<7> |
217 | { |
218 | typedef boost::mpl::vector<boost::mpl::int_<64>, |
219 | boost::mpl::int_<4>, |
220 | boost::mpl::int_<4>, |
221 | boost::mpl::int_<1>, |
222 | boost::mpl::int_<1>, |
223 | boost::mpl::int_<1>, |
224 | boost::mpl::int_<1>> type; |
225 | |
226 | typedef boost::mpl::vector<boost::mpl::int_<6>, |
227 | boost::mpl::int_<2>, |
228 | boost::mpl::int_<2>, |
229 | boost::mpl::int_<0>, |
230 | boost::mpl::int_<0>, |
231 | boost::mpl::int_<0>, |
232 | boost::mpl::int_<0>> shift; |
233 | |
234 | typedef boost::mpl::vector<boost::mpl::int_<6>, |
235 | boost::mpl::int_<8>, |
236 | boost::mpl::int_<10>, |
237 | boost::mpl::int_<10>, |
238 | boost::mpl::int_<10>, |
239 | boost::mpl::int_<10>, |
240 | boost::mpl::int_<10>> shift_c; |
241 | |
242 | typedef boost::mpl::int_<1024> size; |
243 | }; |
244 | |
245 | |
246 | template<> |
247 | struct default_chunking<8> |
248 | { |
249 | typedef boost::mpl::vector<boost::mpl::int_<64>, |
250 | boost::mpl::int_<4>, |
251 | boost::mpl::int_<4>, |
252 | boost::mpl::int_<1>, |
253 | boost::mpl::int_<1>, |
254 | boost::mpl::int_<1>, |
255 | boost::mpl::int_<1>, |
256 | boost::mpl::int_<1>> type; |
257 | |
258 | typedef boost::mpl::vector<boost::mpl::int_<6>, |
259 | boost::mpl::int_<2>, |
260 | boost::mpl::int_<2>, |
261 | boost::mpl::int_<0>, |
262 | boost::mpl::int_<0>, |
263 | boost::mpl::int_<0>, |
264 | boost::mpl::int_<0>, |
265 | boost::mpl::int_<0>> shift; |
266 | |
267 | typedef boost::mpl::vector<boost::mpl::int_<6>, |
268 | boost::mpl::int_<8>, |
269 | boost::mpl::int_<10>, |
270 | boost::mpl::int_<10>, |
271 | boost::mpl::int_<10>, |
272 | boost::mpl::int_<10>, |
273 | boost::mpl::int_<10>, |
274 | boost::mpl::int_<10>> shift_c; |
275 | |
276 | typedef boost::mpl::int_<1024> size; |
277 | }; |
278 | |
279 | template<unsigned int dim, |
280 | typename T, |
281 | typename S, |
282 | typename grid_lin = grid_sm<dim,void>, |
283 | typename layout=typename memory_traits_lin<T>::type, |
284 | template<typename> class layout_base = memory_traits_lin, |
285 | typename chunking = default_chunking<dim>> |
286 | class sgrid_cpu; |
287 | |
288 | |
289 | template<unsigned int dim, typename chunk> |
290 | struct key_shift |
291 | { |
292 | inline static void shift(grid_key_dx<dim> & k) |
293 | { |
294 | std::cerr << __FILE__ << ":" << __LINE__ << " error dimensionality " << dim << " is not implemented" << std::endl; |
295 | } |
296 | }; |
297 | |
298 | template<unsigned int dim, typename chunk> |
299 | struct sublin |
300 | { |
301 | inline static size_t lin(grid_key_dx<dim> & k) |
302 | { |
303 | std::cerr << __FILE__ << ":" << __LINE__ << " error dimensionality " << dim << " is not implemented" << std::endl; |
304 | |
305 | return 0; |
306 | } |
307 | }; |
308 | |
309 | template<typename chunk> |
310 | struct key_shift<1,chunk> |
311 | { |
312 | inline static void shift(grid_key_dx<1> & kh, grid_key_dx<1> &kl) |
313 | { |
314 | kl.set_d(0,kh.get(0) & (boost::mpl::at<typename chunk::type,boost::mpl::int_<0>>::type::value -1)); |
315 | kh.set_d(0,kh.get(0) >> boost::mpl::at<typename chunk::shift,boost::mpl::int_<0>>::type::value); |
316 | } |
317 | |
318 | inline static void cpos(grid_key_dx<1> & kh) |
319 | { |
320 | kh.set_d(0,kh.get(0) << boost::mpl::at<typename chunk::shift,boost::mpl::int_<0>>::type::value); |
321 | } |
322 | }; |
323 | |
324 | template<typename chunk> |
325 | struct sublin<1,chunk> |
326 | { |
327 | inline static size_t lin(grid_key_dx<1> & k) |
328 | { |
329 | return k.get(0); |
330 | } |
331 | }; |
332 | |
333 | template<typename chunk> |
334 | struct key_shift<2,chunk> |
335 | { |
336 | inline static void shift(grid_key_dx<2> & kh, grid_key_dx<2> &kl) |
337 | { |
338 | kl.set_d(0,kh.get(0) & (boost::mpl::at<typename chunk::type,boost::mpl::int_<0>>::type::value-1)); |
339 | kh.set_d(0,kh.get(0) >> boost::mpl::at<typename chunk::shift,boost::mpl::int_<0>>::type::value); |
340 | kl.set_d(1,kh.get(1) & (boost::mpl::at<typename chunk::type,boost::mpl::int_<1>>::type::value-1)); |
341 | kh.set_d(1,kh.get(1) >> boost::mpl::at<typename chunk::shift,boost::mpl::int_<1>>::type::value); |
342 | } |
343 | |
344 | inline static void cpos(grid_key_dx<2> & kh) |
345 | { |
346 | kh.set_d(0,kh.get(0) << boost::mpl::at<typename chunk::shift,boost::mpl::int_<0>>::type::value); |
347 | kh.set_d(1,kh.get(1) << boost::mpl::at<typename chunk::shift,boost::mpl::int_<1>>::type::value); |
348 | } |
349 | }; |
350 | |
351 | template<typename chunk> |
352 | struct sublin<2,chunk> |
353 | { |
354 | inline static size_t lin(grid_key_dx<2> & k) |
355 | { |
356 | return k.get(0) + (k.get(1) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
357 | } |
358 | }; |
359 | |
360 | template<typename chunk> |
361 | struct key_shift<3,chunk> |
362 | { |
363 | inline static void shift(grid_key_dx<3> & kh, grid_key_dx<3> & kl) |
364 | { |
365 | kl.set_d(0,kh.get(0) & (boost::mpl::at<typename chunk::type,boost::mpl::int_<0>>::type::value - 1)); |
366 | kh.set_d(0,kh.get(0) >> boost::mpl::at<typename chunk::shift,boost::mpl::int_<0>>::type::value); |
367 | kl.set_d(1,kh.get(1) & (boost::mpl::at<typename chunk::type,boost::mpl::int_<1>>::type::value - 1)); |
368 | kh.set_d(1,kh.get(1) >> boost::mpl::at<typename chunk::shift,boost::mpl::int_<1>>::type::value); |
369 | kl.set_d(2,kh.get(2) & (boost::mpl::at<typename chunk::type,boost::mpl::int_<2>>::type::value - 1)); |
370 | kh.set_d(2,kh.get(2) >> boost::mpl::at<typename chunk::shift,boost::mpl::int_<2>>::type::value); |
371 | } |
372 | |
373 | inline static void cpos(grid_key_dx<3> & kh) |
374 | { |
375 | kh.set_d(0,kh.get(0) << boost::mpl::at<typename chunk::shift,boost::mpl::int_<0>>::type::value); |
376 | kh.set_d(1,kh.get(1) << boost::mpl::at<typename chunk::shift,boost::mpl::int_<1>>::type::value); |
377 | kh.set_d(2,kh.get(2) << boost::mpl::at<typename chunk::shift,boost::mpl::int_<2>>::type::value); |
378 | } |
379 | }; |
380 | |
381 | template<typename chunk> |
382 | struct sublin<3,chunk> |
383 | { |
384 | inline static size_t lin(grid_key_dx<3> & k) |
385 | { |
386 | return k.get(0) + (k.get(1) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value) + |
387 | (k.get(2) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
388 | } |
389 | }; |
390 | |
391 | template<typename chunk> |
392 | struct key_shift<4,chunk> |
393 | { |
394 | inline static void shift(grid_key_dx<4> & kh, grid_key_dx<4> & kl) |
395 | { |
396 | kl.set_d(0,kh.get(0) & (boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value - 1)); |
397 | kh.set_d(0,kh.get(0) >> boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
398 | kl.set_d(1,kh.get(1) & (boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value - 1)); |
399 | kh.set_d(1,kh.get(1) >> boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
400 | kl.set_d(2,kh.get(2) & (boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value - 1)); |
401 | kh.set_d(2,kh.get(2) >> boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
402 | kl.set_d(3,kh.get(3) & (boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value - 1)); |
403 | kh.set_d(3,kh.get(3) >> boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
404 | } |
405 | |
406 | inline static void cpos(grid_key_dx<4> & kh) |
407 | { |
408 | kh.set_d(0,kh.get(0) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
409 | kh.set_d(1,kh.get(1) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
410 | kh.set_d(2,kh.get(2) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
411 | kh.set_d(3,kh.get(3) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
412 | } |
413 | }; |
414 | |
415 | |
416 | template<typename chunk> |
417 | struct sublin<4,chunk> |
418 | { |
419 | inline static size_t lin(grid_key_dx<4> & k) |
420 | { |
421 | return k.get(0) + (k.get(1) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value) + |
422 | (k.get(2) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value) + |
423 | (k.get(3) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
424 | } |
425 | }; |
426 | |
427 | template<typename chunk> |
428 | struct key_shift<5,chunk> |
429 | { |
430 | inline static void shift(grid_key_dx<5> & kh, grid_key_dx<5> & kl) |
431 | { |
432 | kl.set_d(0,kh.get(0) & (boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value - 1)); |
433 | kh.set_d(0,kh.get(0) >> boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
434 | kl.set_d(1,kh.get(1) & (boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value - 1)); |
435 | kh.set_d(1,kh.get(1) >> boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
436 | kl.set_d(2,kh.get(2) & (boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value - 1)); |
437 | kh.set_d(2,kh.get(2) >> boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
438 | kl.set_d(3,kh.get(3) & (boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value - 1)); |
439 | kh.set_d(3,kh.get(3) >> boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
440 | kl.set_d(4,kh.get(4) & (boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value - 1)); |
441 | kh.set_d(4,kh.get(4) >> boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
442 | } |
443 | |
444 | inline static void cpos(grid_key_dx<5> & kh) |
445 | { |
446 | kh.set_d(0,kh.get(0) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
447 | kh.set_d(1,kh.get(1) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
448 | kh.set_d(2,kh.get(2) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
449 | kh.set_d(3,kh.get(3) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
450 | kh.set_d(4,kh.get(4) << boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
451 | } |
452 | |
453 | }; |
454 | |
455 | template<typename chunk> |
456 | struct sublin<5,chunk> |
457 | { |
458 | inline static size_t lin(grid_key_dx<5> & k) |
459 | { |
460 | return k.get(0) + (k.get(1) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value) + |
461 | (k.get(2) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value) + |
462 | (k.get(3) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value) + |
463 | (k.get(4) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
464 | } |
465 | }; |
466 | |
467 | template<typename chunk> |
468 | struct key_shift<6,chunk> |
469 | { |
470 | inline static void shift(grid_key_dx<6> & kh, grid_key_dx<6> & kl) |
471 | { |
472 | kl.set_d(0,kh.get(0) & (boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value - 1)); |
473 | kh.set_d(0,kh.get(0) >> boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
474 | kl.set_d(1,kh.get(1) & (boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value - 1)); |
475 | kh.set_d(1,kh.get(1) >> boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
476 | kl.set_d(2,kh.get(2) & (boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value - 1)); |
477 | kh.set_d(2,kh.get(2) >> boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
478 | kl.set_d(3,kh.get(3) & (boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value - 1)); |
479 | kh.set_d(3,kh.get(3) >> boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
480 | kl.set_d(4,kh.get(4) & (boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value - 1)); |
481 | kh.set_d(4,kh.get(4) >> boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
482 | kl.set_d(5,kh.get(5) & (boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value - 1)); |
483 | kh.set_d(5,kh.get(5) >> boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value); |
484 | } |
485 | |
486 | inline static void cpos(grid_key_dx<6> & kh) |
487 | { |
488 | kh.set_d(0,kh.get(0) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
489 | kh.set_d(1,kh.get(1) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
490 | kh.set_d(2,kh.get(2) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
491 | kh.set_d(3,kh.get(3) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
492 | kh.set_d(4,kh.get(4) << boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
493 | kh.set_d(5,kh.get(5) << boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value); |
494 | } |
495 | }; |
496 | |
497 | template<typename chunk> |
498 | struct sublin<6,chunk> |
499 | { |
500 | inline static size_t lin(grid_key_dx<6> & k) |
501 | { |
502 | return k.get(0) + (k.get(1) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value) + |
503 | (k.get(2) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value) + |
504 | (k.get(3) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value) + |
505 | (k.get(4) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value) + |
506 | (k.get(5) << boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
507 | |
508 | } |
509 | }; |
510 | |
511 | |
512 | template<typename chunk> |
513 | struct key_shift<7,chunk> |
514 | { |
515 | inline static void shift(grid_key_dx<7> & kh, grid_key_dx<7> & kl) |
516 | { |
517 | kl.set_d(0,kh.get(0) & (boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value - 1)); |
518 | kh.set_d(0,kh.get(0) >> boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
519 | kl.set_d(1,kh.get(1) & (boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value - 1)); |
520 | kh.set_d(1,kh.get(1) >> boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
521 | kl.set_d(2,kh.get(2) & (boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value - 1)); |
522 | kh.set_d(2,kh.get(2) >> boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
523 | kl.set_d(3,kh.get(3) & (boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value - 1)); |
524 | kh.set_d(3,kh.get(3) >> boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
525 | kl.set_d(4,kh.get(4) & (boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value - 1)); |
526 | kh.set_d(4,kh.get(4) >> boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
527 | kl.set_d(5,kh.get(5) & (boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value - 1)); |
528 | kh.set_d(5,kh.get(5) >> boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value); |
529 | kl.set_d(6,kh.get(6) & (boost::mpl::at<chunk,boost::mpl::int_<6>>::type::value - 1)); |
530 | kh.set_d(6,kh.get(6) >> boost::mpl::at<chunk,boost::mpl::int_<6>>::type::value); |
531 | } |
532 | |
533 | inline static void cpos(grid_key_dx<7> & kh) |
534 | { |
535 | kh.set_d(0,kh.get(0) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
536 | kh.set_d(1,kh.get(1) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
537 | kh.set_d(2,kh.get(2) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
538 | kh.set_d(3,kh.get(3) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
539 | kh.set_d(4,kh.get(4) << boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
540 | kh.set_d(5,kh.get(5) << boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value); |
541 | kh.set_d(6,kh.get(6) << boost::mpl::at<chunk,boost::mpl::int_<6>>::type::value); |
542 | } |
543 | }; |
544 | |
545 | template<typename chunk> |
546 | struct sublin<7,chunk> |
547 | { |
548 | inline static size_t lin(grid_key_dx<7> & k) |
549 | { |
550 | return k.get(0) + (k.get(1) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value) + |
551 | (k.get(2) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value) + |
552 | (k.get(3) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value) + |
553 | (k.get(4) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value) + |
554 | (k.get(5) << boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value) + |
555 | (k.get(6) << boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value); |
556 | } |
557 | }; |
558 | |
559 | template<typename chunk> |
560 | struct key_shift<8,chunk> |
561 | { |
562 | inline static void shift(grid_key_dx<8> & kh, grid_key_dx<8> & kl) |
563 | { |
564 | kl.set_d(0,kh.get(0) & (boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value - 1)); |
565 | kh.set_d(0,kh.get(0) >> boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
566 | kl.set_d(1,kh.get(1) & (boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value - 1)); |
567 | kh.set_d(1,kh.get(1) >> boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
568 | kl.set_d(2,kh.get(2) & (boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value - 1)); |
569 | kh.set_d(2,kh.get(2) >> boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
570 | kl.set_d(3,kh.get(3) & (boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value - 1)); |
571 | kh.set_d(3,kh.get(3) >> boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
572 | kl.set_d(4,kh.get(4) & (boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value - 1)); |
573 | kh.set_d(4,kh.get(4) >> boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
574 | kl.set_d(5,kh.get(5) & (boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value - 1)); |
575 | kh.set_d(5,kh.get(5) >> boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value); |
576 | kl.set_d(6,kh.get(6) & (boost::mpl::at<chunk,boost::mpl::int_<6>>::type::value - 1)); |
577 | kh.set_d(6,kh.get(6) >> boost::mpl::at<chunk,boost::mpl::int_<6>>::type::value); |
578 | kl.set_d(7,kh.get(7) & (boost::mpl::at<chunk,boost::mpl::int_<7>>::type::value - 1)); |
579 | kh.set_d(7,kh.get(7) >> boost::mpl::at<chunk,boost::mpl::int_<7>>::type::value); |
580 | } |
581 | |
582 | inline static void cpos(grid_key_dx<8> & kh) |
583 | { |
584 | kh.set_d(0,kh.get(0) >> boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value); |
585 | kh.set_d(1,kh.get(1) >> boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value); |
586 | kh.set_d(2,kh.get(2) >> boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value); |
587 | kh.set_d(3,kh.get(3) >> boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value); |
588 | kh.set_d(4,kh.get(4) >> boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value); |
589 | kh.set_d(5,kh.get(5) >> boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value); |
590 | kh.set_d(6,kh.get(6) >> boost::mpl::at<chunk,boost::mpl::int_<6>>::type::value); |
591 | kh.set_d(7,kh.get(7) >> boost::mpl::at<chunk,boost::mpl::int_<7>>::type::value); |
592 | } |
593 | }; |
594 | |
595 | template<typename chunk> |
596 | struct sublin<8,chunk> |
597 | { |
598 | inline static size_t lin(grid_key_dx<8> & k) |
599 | { |
600 | return k.get(0) + (k.get(1) << boost::mpl::at<chunk,boost::mpl::int_<0>>::type::value) + |
601 | (k.get(2) << boost::mpl::at<chunk,boost::mpl::int_<1>>::type::value) + |
602 | (k.get(3) << boost::mpl::at<chunk,boost::mpl::int_<2>>::type::value) + |
603 | (k.get(4) << boost::mpl::at<chunk,boost::mpl::int_<3>>::type::value) + |
604 | (k.get(5) << boost::mpl::at<chunk,boost::mpl::int_<4>>::type::value) + |
605 | (k.get(6) << boost::mpl::at<chunk,boost::mpl::int_<5>>::type::value) + |
606 | (k.get(7) << boost::mpl::at<chunk,boost::mpl::int_<6>>::type::value); |
607 | } |
608 | }; |
609 | |
610 | |
611 | #endif /* OPENFPM_DATA_SRC_SPARSEGRID_SPARSEGRIDUTIL_HPP_ */ |
612 | |