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
11const static int cnk_pos = 0;
12const static int cnk_nele = 1;
13const 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
21template<typename T>
22struct 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>>
28template <typename n_ele, typename T>
29struct 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
35template <typename n_ele, typename T, int N1>
36struct 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
42template<unsigned int dim>
43struct 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 */
60template<unsigned int dim, unsigned int stencil_size, typename vector_blocks_ext,typename vector_ext>
61struct 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
86template<unsigned int dim>
87struct default_chunking
88{
89 typedef void type;
90};
91
92
93
94template<>
95struct 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
106template<>
107struct 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
121template<>
122struct 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
141template<>
142struct 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
162template<>
163struct 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
187template<>
188struct 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
215template<>
216struct 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
246template<>
247struct 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
279template<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>>
286class sgrid_cpu;
287
288
289template<unsigned int dim, typename chunk>
290struct 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
298template<unsigned int dim, typename chunk>
299struct 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
309template<typename chunk>
310struct 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
324template<typename chunk>
325struct sublin<1,chunk>
326{
327 inline static size_t lin(grid_key_dx<1> & k)
328 {
329 return k.get(0);
330 }
331};
332
333template<typename chunk>
334struct 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
351template<typename chunk>
352struct 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
360template<typename chunk>
361struct 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
381template<typename chunk>
382struct 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
391template<typename chunk>
392struct 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
416template<typename chunk>
417struct 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
427template<typename chunk>
428struct 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
455template<typename chunk>
456struct 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
467template<typename chunk>
468struct 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
497template<typename chunk>
498struct 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
512template<typename chunk>
513struct 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
545template<typename chunk>
546struct 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
559template<typename chunk>
560struct 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
595template<typename chunk>
596struct 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