OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
FDScheme_unit_tests.hpp
1 /*
2  * FDScheme_unit_tests.hpp
3  *
4  * Created on: Oct 5, 2015
5  * Author: i-bird
6  */
7 
8 #ifndef OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_FDSCHEME_UNIT_TESTS_HPP_
9 #define OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_FDSCHEME_UNIT_TESTS_HPP_
10 
11 #include "FiniteDifference/Derivative.hpp"
12 #include "FiniteDifference/Laplacian.hpp"
13 #include "Decomposition/CartDecomposition.hpp"
14 #include "util/grid_dist_testing.hpp"
15 #include "FiniteDifference/Average.hpp"
16 #include "FiniteDifference/sum.hpp"
17 #include "eq.hpp"
18 
19 constexpr unsigned int x = 0;
20 constexpr unsigned int y = 1;
21 constexpr unsigned int z = 2;
22 constexpr unsigned int V = 0;
23 
24 struct sys_nn
25 {
27  static const unsigned int dims = 2;
29  static const unsigned int nvar = 1;
30 
31  static const unsigned int ord = EQS_FIELD;
32 
34  static const bool boundary[];
35 
37  typedef float stype;
38 
41 
43  typedef void testing;
44 };
45 
46 const bool sys_nn::boundary[] = {NON_PERIODIC,NON_PERIODIC};
47 
48 struct sys_pp
49 {
51  static const unsigned int dims = 2;
53  static const unsigned int nvar = 1;
54  static const unsigned int ord = EQS_FIELD;
55 
57  static const bool boundary[];
58 
60  typedef float stype;
61 
64 
66  typedef void testing;
67 };
68 
69 const bool sys_pp::boundary[] = {PERIODIC,PERIODIC};
70 
72 
73 struct syss_nn
74 {
76  static const unsigned int dims = 2;
78  static const unsigned int nvar = 1;
79 
80  static const unsigned int ord = EQS_FIELD;
81 
83  static const unsigned int grid_type = STAGGERED_GRID;
84 
86  static const bool boundary[];
87 
89  typedef float stype;
90 
93 
95  typedef void testing;
96 };
97 
98 const bool syss_nn::boundary[] = {NON_PERIODIC,NON_PERIODIC};
99 
100 struct syss_pp
101 {
103  static const unsigned int dims = 2;
105  static const unsigned int nvar = 1;
106  static const unsigned int ord = EQS_FIELD;
107 
109  static const unsigned int grid_type = STAGGERED_GRID;
110 
112  static const bool boundary[];
113 
115  typedef float stype;
116 
119 
121  typedef void testing;
122 };
123 
124 const bool syss_pp::boundary[] = {PERIODIC,PERIODIC};
125 
126 BOOST_AUTO_TEST_SUITE( fd_test )
127 
128 // Derivative central, composed central derivative,
129 // and central bulk + one-sided non periodic
130 
131 BOOST_AUTO_TEST_CASE( der_central_non_periodic)
132 {
134 
135  // grid size
136  size_t sz[2]={16,16};
137 
138  // grid_dist_testing
139  grid_dist_testing<2> g_map(sz);
140 
141  // grid_sm
142  grid_sm<2,void> ginfo(sz);
143 
144  // spacing
145  float spacing[2] = {0.5,0.3};
146 
147  // Create several keys
148  grid_dist_key_dx<2> key11(0,grid_key_dx<2>(1,1));
149  grid_dist_key_dx<2> key00(0,grid_key_dx<2>(0,0));
150  grid_dist_key_dx<2> key22(0,grid_key_dx<2>(2,2));
151  grid_dist_key_dx<2> key1515(0,grid_key_dx<2>(15,15));
152 
153  // filled colums
154  std::unordered_map<long int,float> cols_x;
155  std::unordered_map<long int,float> cols_y;
156 
157  D<x,Field<V,sys_nn>,sys_nn>::value(g_map,key11,ginfo,spacing,cols_x,1);
158  D<y,Field<V,sys_nn>,sys_nn>::value(g_map,key11,ginfo,spacing,cols_y,1);
159 
160  BOOST_REQUIRE_EQUAL(cols_x.size(),2ul);
161  BOOST_REQUIRE_EQUAL(cols_y.size(),2ul);
162 
163  BOOST_REQUIRE_EQUAL(cols_x[17+1],1/spacing[0]/2.0);
164  BOOST_REQUIRE_EQUAL(cols_x[17-1],-1/spacing[0]/2.0);
165 
166  BOOST_REQUIRE_EQUAL(cols_y[17+16],1/spacing[1]/2.0);
167  BOOST_REQUIRE_EQUAL(cols_y[17-16],-1/spacing[1]/2.0);
168 
170 
171  // filled colums
172 
173  std::unordered_map<long int,float> cols_xx;
174  std::unordered_map<long int,float> cols_xy;
175  std::unordered_map<long int,float> cols_yx;
176  std::unordered_map<long int,float> cols_yy;
177 
178  // Composed derivative
179 
180  D<x,D<x,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_xx,1);
181  D<x,D<y,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_xy,1);
182  D<y,D<x,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_yx,1);
183  D<y,D<y,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_yy,1);
184 
185  BOOST_REQUIRE_EQUAL(cols_xx.size(),3ul);
186  BOOST_REQUIRE_EQUAL(cols_xy.size(),4ul);
187  BOOST_REQUIRE_EQUAL(cols_yx.size(),4ul);
188  BOOST_REQUIRE_EQUAL(cols_yy.size(),3ul);
189 
190  BOOST_REQUIRE_EQUAL(cols_xx[32],1/spacing[0]/spacing[0]/2.0/2.0);
191  BOOST_REQUIRE_EQUAL(cols_xx[34],-2/spacing[0]/spacing[0]/2.0/2.0);
192  BOOST_REQUIRE_EQUAL(cols_xx[36],1/spacing[0]/spacing[0]/2.0/2.0);
193 
194  BOOST_REQUIRE_EQUAL(cols_xy[17],1/spacing[0]/spacing[1]/2.0/2.0);
195  BOOST_REQUIRE_EQUAL(cols_xy[19],-1/spacing[0]/spacing[1]/2.0/2.0);
196  BOOST_REQUIRE_EQUAL(cols_xy[49],-1/spacing[0]/spacing[1]/2.0/2.0);
197  BOOST_REQUIRE_EQUAL(cols_xy[51],1/spacing[0]/spacing[1]/2.0/2.0);
198 
199  BOOST_REQUIRE_EQUAL(cols_yx[17],1/spacing[0]/spacing[1]/2.0/2.0);
200  BOOST_REQUIRE_EQUAL(cols_yx[19],-1/spacing[0]/spacing[1]/2.0/2.0);
201  BOOST_REQUIRE_EQUAL(cols_yx[49],-1/spacing[0]/spacing[1]/2.0/2.0);
202  BOOST_REQUIRE_EQUAL(cols_xy[51],1/spacing[0]/spacing[1]/2.0/2.0);
203 
204  BOOST_REQUIRE_EQUAL(cols_yy[2],1/spacing[1]/spacing[1]/2.0/2.0);
205  BOOST_REQUIRE_EQUAL(cols_yy[34],-2/spacing[1]/spacing[1]/2.0/2.0);
206  BOOST_REQUIRE_EQUAL(cols_yy[66],1/spacing[1]/spacing[1]/2.0/2.0);
207 
208  // Non periodic with one sided
209 
210  cols_x.clear();
211  cols_y.clear();
212 
213  D<x,Field<V,sys_nn>,sys_nn,CENTRAL_B_ONE_SIDE>::value(g_map,key11,ginfo,spacing,cols_x,1);
214  D<y,Field<V,sys_nn>,sys_nn,CENTRAL_B_ONE_SIDE>::value(g_map,key11,ginfo,spacing,cols_y,1);
215 
216  BOOST_REQUIRE_EQUAL(cols_x.size(),2ul);
217  BOOST_REQUIRE_EQUAL(cols_y.size(),2ul);
218 
219  BOOST_REQUIRE_EQUAL(cols_x[17+1],1/spacing[0]);
220  BOOST_REQUIRE_EQUAL(cols_x[17-1],-1/spacing[0]);
221 
222  BOOST_REQUIRE_EQUAL(cols_y[17+16],1/spacing[1]);
223  BOOST_REQUIRE_EQUAL(cols_y[17-16],-1/spacing[1]);
224 
225  // Border left
226 
227  cols_x.clear();
228  cols_y.clear();
229 
230  D<x,Field<V,sys_nn>,sys_nn,CENTRAL_B_ONE_SIDE>::value(g_map,key00,ginfo,spacing,cols_x,1);
231  D<y,Field<V,sys_nn>,sys_nn,CENTRAL_B_ONE_SIDE>::value(g_map,key00,ginfo,spacing,cols_y,1);
232 
233  BOOST_REQUIRE_EQUAL(cols_x.size(),3ul);
234  BOOST_REQUIRE_EQUAL(cols_y.size(),3ul);
235 
236  BOOST_REQUIRE_EQUAL(cols_x[0],-1.5/spacing[0]);
237  BOOST_REQUIRE_EQUAL(cols_x[1],2/spacing[0]);
238  BOOST_REQUIRE_EQUAL(cols_x[2],-0.5/spacing[0]);
239 
240  BOOST_REQUIRE_CLOSE(cols_y[0],-1.5/spacing[1],0.001);
241  BOOST_REQUIRE_CLOSE(cols_y[16],2/spacing[1],0.001);
242  BOOST_REQUIRE_CLOSE(cols_y[32],-0.5/spacing[1],0.001);
243 
244  // Border Top right
245 
246  cols_x.clear();
247  cols_y.clear();
248 
249  D<x,Field<V,sys_nn>,sys_nn,CENTRAL_B_ONE_SIDE>::value(g_map,key1515,ginfo,spacing,cols_x,1);
250  D<y,Field<V,sys_nn>,sys_nn,CENTRAL_B_ONE_SIDE>::value(g_map,key1515,ginfo,spacing,cols_y,1);
251 
252  BOOST_REQUIRE_EQUAL(cols_x.size(),3ul);
253  BOOST_REQUIRE_EQUAL(cols_y.size(),3ul);
254 
255  BOOST_REQUIRE_EQUAL(cols_x[15*16+15],1.5/spacing[0]);
256  BOOST_REQUIRE_EQUAL(cols_x[15*16+14],-2/spacing[0]);
257  BOOST_REQUIRE_EQUAL(cols_x[15*16+13],0.5/spacing[0]);
258 
259  BOOST_REQUIRE_CLOSE(cols_y[15*16+15],1.5/spacing[1],0.001);
260  BOOST_REQUIRE_CLOSE(cols_y[14*16+15],-2/spacing[1],0.001);
261  BOOST_REQUIRE_CLOSE(cols_y[13*16+15],0.5/spacing[1],0.001);
262 }
263 
264 // Derivative forward and backward non periodic
265 
266 BOOST_AUTO_TEST_CASE( der_forward_backward_non_periodic )
267 {
268  // grid size
269  size_t sz[2]={16,16};
270 
271  // spacing
272  float spacing[2] = {0.5,0.3};
273 
274  // grid_dist_testing
275  grid_dist_testing<2> g_map(sz);
276 
277  // grid_sm
278  grid_sm<2,void> ginfo(sz);
279 
280  // Create several keys
281  grid_dist_key_dx<2> key11(0,grid_key_dx<2>(1,1));
282  grid_dist_key_dx<2> key00(0,grid_key_dx<2>(0,0));
283  grid_dist_key_dx<2> key22(0,grid_key_dx<2>(2,2));
284  grid_dist_key_dx<2> key1515(0,grid_key_dx<2>(15,15));
285 
286  // filled colums
287  std::unordered_map<long int,float> cols_x;
288  std::unordered_map<long int,float> cols_y;
289 
290  D<x,Field<V,sys_nn>,sys_nn,FORWARD>::value(g_map,key11,ginfo,spacing,cols_x,1);
291  D<y,Field<V,sys_nn>,sys_nn,FORWARD>::value(g_map,key11,ginfo,spacing,cols_y,1);
292 
293  BOOST_REQUIRE_EQUAL(cols_x.size(),2ul);
294  BOOST_REQUIRE_EQUAL(cols_y.size(),2ul);
295 
296  BOOST_REQUIRE_EQUAL(cols_x[17+1],1/spacing[0]);
297  BOOST_REQUIRE_EQUAL(cols_x[17],-1/spacing[0]);
298 
299  BOOST_REQUIRE_EQUAL(cols_y[17+16],1/spacing[1]);
300  BOOST_REQUIRE_EQUAL(cols_y[17],-1/spacing[1]);
301 
302  cols_x.clear();
303  cols_y.clear();
304 
305  D<x,Field<V,sys_nn>,sys_nn,BACKWARD>::value(g_map,key11,ginfo,spacing,cols_x,1);
306  D<y,Field<V,sys_nn>,sys_nn,BACKWARD>::value(g_map,key11,ginfo,spacing,cols_y,1);
307 
308  BOOST_REQUIRE_EQUAL(cols_x.size(),2ul);
309  BOOST_REQUIRE_EQUAL(cols_y.size(),2ul);
310 
311  BOOST_REQUIRE_EQUAL(cols_x[17],1/spacing[0]);
312  BOOST_REQUIRE_EQUAL(cols_x[17-1],-1/spacing[0]);
313 
314  BOOST_REQUIRE_EQUAL(cols_y[17],1/spacing[1]);
315  BOOST_REQUIRE_EQUAL(cols_y[17-16],-1/spacing[1]);
316 }
317 
318 // Average central non periodic
319 
320 BOOST_AUTO_TEST_CASE( avg_central_non_periodic)
321 {
322  // grid size
323  size_t sz[2]={16,16};
324 
325  // spacing
326  float spacing[2] = {0.5,0.3};
327 
328  // grid_dist_testing
329  grid_dist_testing<2> g_map(sz);
330 
331  // grid_sm
332  grid_sm<2,void> ginfo(sz);
333 
334  // Create several keys
335  grid_dist_key_dx<2> key11(0,grid_key_dx<2>(1,1));
336  grid_dist_key_dx<2> key00(0,grid_key_dx<2>(0,0));
337  grid_dist_key_dx<2> key22(0,grid_key_dx<2>(2,2));
338  grid_dist_key_dx<2> key1515(0,grid_key_dx<2>(15,15));
339 
340  // filled colums
341  std::unordered_map<long int,float> cols_x;
342  std::unordered_map<long int,float> cols_y;
343 
344  Avg<x,Field<V,sys_nn>,sys_nn>::value(g_map,key11,ginfo,spacing,cols_x,1);
345  Avg<y,Field<V,sys_nn>,sys_nn>::value(g_map,key11,ginfo,spacing,cols_y,1);
346 
347  BOOST_REQUIRE_EQUAL(cols_x.size(),2ul);
348  BOOST_REQUIRE_EQUAL(cols_y.size(),2ul);
349 
350  BOOST_REQUIRE_EQUAL(cols_x[17+1],0.5);
351  BOOST_REQUIRE_EQUAL(cols_x[17-1],0.5);
352 
353  BOOST_REQUIRE_EQUAL(cols_y[17+16],0.5);
354  BOOST_REQUIRE_EQUAL(cols_y[17-16],0.5);
355 
356  // filled colums
357 
358  std::unordered_map<long int,float> cols_xx;
359  std::unordered_map<long int,float> cols_xy;
360  std::unordered_map<long int,float> cols_yx;
361  std::unordered_map<long int,float> cols_yy;
362 
363  // Composed derivative
364 
365  Avg<x,Avg<x,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_xx,1);
366  Avg<x,Avg<y,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_xy,1);
367  Avg<y,Avg<x,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_yx,1);
368  Avg<y,Avg<y,Field<V,sys_nn>,sys_nn>,sys_nn>::value(g_map,key22,ginfo,spacing,cols_yy,1);
369 
370  BOOST_REQUIRE_EQUAL(cols_xx.size(),3ul);
371  BOOST_REQUIRE_EQUAL(cols_xy.size(),4ul);
372  BOOST_REQUIRE_EQUAL(cols_yx.size(),4ul);
373  BOOST_REQUIRE_EQUAL(cols_yy.size(),3ul);
374 
375  BOOST_REQUIRE_EQUAL(cols_xx[32],1/2.0/2.0);
376  BOOST_REQUIRE_EQUAL(cols_xx[34],2/2.0/2.0);
377  BOOST_REQUIRE_EQUAL(cols_xx[36],1/2.0/2.0);
378 
379  BOOST_REQUIRE_EQUAL(cols_xy[17],1/2.0/2.0);
380  BOOST_REQUIRE_EQUAL(cols_xy[19],1/2.0/2.0);
381  BOOST_REQUIRE_EQUAL(cols_xy[49],1/2.0/2.0);
382  BOOST_REQUIRE_EQUAL(cols_xy[51],1/2.0/2.0);
383 
384  BOOST_REQUIRE_EQUAL(cols_yx[17],1/2.0/2.0);
385  BOOST_REQUIRE_EQUAL(cols_yx[19],1/2.0/2.0);
386  BOOST_REQUIRE_EQUAL(cols_yx[49],1/2.0/2.0);
387  BOOST_REQUIRE_EQUAL(cols_xy[51],1/2.0/2.0);
388 
389  BOOST_REQUIRE_EQUAL(cols_yy[2],1/2.0/2.0);
390  BOOST_REQUIRE_EQUAL(cols_yy[34],2/2.0/2.0);
391  BOOST_REQUIRE_EQUAL(cols_yy[66],1/2.0/2.0);
392 }
393 
394 
395 
396 BOOST_AUTO_TEST_CASE( der_central_staggered_non_periodic)
397 {
398  // grid size
399  size_t sz[2]={16,16};
400 
401  // spacing
402  float spacing[2] = {0.5,0.3};
403 
404  // grid_sm
405  grid_sm<2,void> ginfo(sz);
406 
407  // grid_dist_testing
408  grid_dist_testing<2> g_map(sz);
409 
410  // Create several keys
411  grid_dist_key_dx<2> key11(0,grid_key_dx<2>(1,1));
412  grid_dist_key_dx<2> key22(0,grid_key_dx<2>(2,2));
413  grid_dist_key_dx<2> key1515(0,grid_key_dx<2>(15,15));
414 
415  // filled colums
416  std::unordered_map<long int,float> cols_x;
417  std::unordered_map<long int,float> cols_y;
418 
419  D<x,Field<V,syss_nn>,syss_pp>::value(g_map,key11,ginfo,spacing,cols_x,1);
420  D<y,Field<V,syss_nn>,syss_pp>::value(g_map,key11,ginfo,spacing,cols_y,1);
421 
422  BOOST_REQUIRE_EQUAL(cols_x.size(),2ul);
423  BOOST_REQUIRE_EQUAL(cols_y.size(),2ul);
424 
425  BOOST_REQUIRE_EQUAL(cols_x[17],1/spacing[0]);
426  BOOST_REQUIRE_EQUAL(cols_x[17-1],-1/spacing[0]);
427 
428  BOOST_REQUIRE_EQUAL(cols_y[17],1/spacing[1]);
429  BOOST_REQUIRE_EQUAL(cols_y[17-16],-1/spacing[1]);
430 
431  cols_x.clear();
432  cols_y.clear();
433 }
434 
435 BOOST_AUTO_TEST_CASE( avg_central_staggered_non_periodic)
436 {
437  // grid size
438  size_t sz[2]={16,16};
439 
440  // spacing
441  float spacing[2] = {0.5,0.3};
442 
443  // grid_sm
444  grid_sm<2,void> ginfo(sz);
445 
446  // grid_dist_testing
447  grid_dist_testing<2> g_map(sz);
448 
449  // Create several keys
450  grid_dist_key_dx<2> key11(0,grid_key_dx<2>(1,1));
451  grid_dist_key_dx<2> key22(0,grid_key_dx<2>(2,2));
452  grid_dist_key_dx<2> key1515(0,grid_key_dx<2>(15,15));
453 
454  // filled colums
455  std::unordered_map<long int,float> cols_x;
456  std::unordered_map<long int,float> cols_y;
457 
458  Avg<x,Field<V,syss_pp>,syss_pp>::value(g_map,key11,ginfo,spacing,cols_x,1);
459  Avg<y,Field<V,syss_pp>,syss_pp>::value(g_map,key11,ginfo,spacing,cols_y,1);
460 
461  BOOST_REQUIRE_EQUAL(cols_x.size(),2ul);
462  BOOST_REQUIRE_EQUAL(cols_y.size(),2ul);
463 
464  BOOST_REQUIRE_EQUAL(cols_x[17],1/2.0);
465  BOOST_REQUIRE_EQUAL(cols_x[17-1],1/2.0);
466 
467  BOOST_REQUIRE_EQUAL(cols_y[17],1/2.0);
468  BOOST_REQUIRE_EQUAL(cols_y[17-16],1/2.0);
469 
470  cols_x.clear();
471  cols_y.clear();
472 }
473 
475 
476 BOOST_AUTO_TEST_CASE( lap_periodic)
477 {
479 
480  // grid size
481  size_t sz[2]={16,16};
482 
483  // grid_sm
484  grid_sm<2,void> ginfo(sz);
485 
486  // spacing
487  float spacing[2] = {0.5,0.3};
488 
489  // grid_dist_testing
490  grid_dist_testing<2> g_map(sz);
491 
492  // Create several keys
493  grid_dist_key_dx<2> key11(0,grid_key_dx<2>(1,1));
494  grid_dist_key_dx<2> key22(0,grid_key_dx<2>(2,2));
495  grid_dist_key_dx<2> key1414(0,grid_key_dx<2>(14,14));
496 
497  // filled colums
498  std::unordered_map<long int,float> cols;
499 
500  Lap<Field<V,sys_pp>,sys_pp>::value(g_map,key11,ginfo,spacing,cols,1);
501 
502  BOOST_REQUIRE_EQUAL(cols.size(),5ul);
503 
504  BOOST_REQUIRE_EQUAL(cols[1],1/spacing[1]/spacing[1]);
505  BOOST_REQUIRE_EQUAL(cols[17-1],1/spacing[0]/spacing[0]);
506  BOOST_REQUIRE_EQUAL(cols[17+1],1/spacing[0]/spacing[0]);
507  BOOST_REQUIRE_EQUAL(cols[17+16],1/spacing[1]/spacing[1]);
508 
509  BOOST_REQUIRE_EQUAL(cols[17],-2/spacing[0]/spacing[0] - 2/spacing[1]/spacing[1]);
510 
512 
513  cols.clear();
514 
515  Lap<Field<V,sys_pp>,sys_pp>::value(g_map,key1414,ginfo,spacing,cols,1);
516 
517  BOOST_REQUIRE_EQUAL(cols.size(),5ul);
518 
519  BOOST_REQUIRE_EQUAL(cols[14*16+13],1.0/spacing[0]/spacing[0]);
520  BOOST_REQUIRE_EQUAL(cols[14*16+15],1.0/spacing[0]/spacing[0]);
521  BOOST_REQUIRE_CLOSE(cols[13*16+14],1.0/spacing[1]/spacing[1],0.001);
522  BOOST_REQUIRE_CLOSE(cols[15*16+14],1.0/spacing[1]/spacing[1],0.001);
523 
524  BOOST_REQUIRE_EQUAL(cols[14*16+14],-2/spacing[0]/spacing[0] - 2/spacing[1]/spacing[1]);
525 }
526 
527 // sum test
528 
529 
530 BOOST_AUTO_TEST_CASE( sum_periodic)
531 {
533 
534  // grid size
535  size_t sz[2]={16,16};
536 
537  // spacing
538  float spacing[2] = {0.5,0.3};
539 
540  // grid_sm
541  grid_sm<2,void> ginfo(sz);
542 
543  // grid_dist_testing
544  grid_dist_testing<2> g_map(sz);
545 
546  // Create several keys
547  grid_dist_key_dx<2> key11(0,grid_key_dx<2>(1,1));
548  grid_dist_key_dx<2> key22(0,grid_key_dx<2>(2,2));
549  grid_dist_key_dx<2> key1414(0,grid_key_dx<2>(14,14));
550 
551  // filled colums
552  std::unordered_map<long int,float> cols;
553 
554  sum<Field<V,sys_pp>,Field<V,sys_pp>,sys_pp>::value(g_map,key11,ginfo,spacing,cols,1);
555 
556  BOOST_REQUIRE_EQUAL(cols.size(),1ul);
557 
558  BOOST_REQUIRE_EQUAL(cols[17],2);
559 
561 
562  cols.clear();
563 
564  sum<Field<V,sys_pp>, Field<V,sys_pp> , Field<V,sys_pp> ,sys_pp>::value(g_map,key11,ginfo,spacing,cols,1);
565 
566  BOOST_REQUIRE_EQUAL(cols.size(),1ul);
567 
568  BOOST_REQUIRE_EQUAL(cols[17],3);
569 
570  cols.clear();
571 
573 
574  sum<Field<V,sys_pp>, Field<V,sys_pp> , minus<Field<V,sys_pp>,sys_pp> ,sys_pp>::value(g_map,key11,ginfo,spacing,cols,1);
575 
576  BOOST_REQUIRE_EQUAL(cols.size(),1ul);
577 
578  BOOST_REQUIRE_EQUAL(cols[17],1ul);
579 
581 }
582 
584 
585 BOOST_AUTO_TEST_CASE( fd_test_use_staggered_position)
586 {
587  // grid size
588  size_t sz[2]={16,16};
589 
590  // grid_sm
591  grid_sm<2,void> ginfo(sz);
592 
593  // Create a derivative row Matrix
594  grid_key_dx<2> key00(0,0);
595  grid_key_dx<2> key11(1,1);
596  grid_key_dx<2> key22(2,2);
597  grid_key_dx<2> key1515(15,15);
598 
599  comb<2> vx_c[] = {{0,-1}};
600  comb<2> vy_c[] = {{-1,0}};
601 
602  grid_key_dx<2> key_ret_vx_x = D<x,Field<V,syss_nn>,syss_nn>::position(key00,ginfo,vx_c);
603  grid_key_dx<2> key_ret_vx_y = D<y,Field<V,syss_nn>,syss_nn>::position(key00,ginfo,vx_c);
604  grid_key_dx<2> key_ret_vy_x = D<x,Field<V,syss_nn>,syss_nn>::position(key00,ginfo,vy_c);
605  grid_key_dx<2> key_ret_vy_y = D<y,Field<V,syss_nn>,syss_nn>::position(key00,ginfo,vy_c);
606 
607  BOOST_REQUIRE_EQUAL(key_ret_vx_x.get(0),0);
608  BOOST_REQUIRE_EQUAL(key_ret_vx_x.get(1),0);
609  BOOST_REQUIRE_EQUAL(key_ret_vx_y.get(0),-1);
610  BOOST_REQUIRE_EQUAL(key_ret_vx_y.get(1),-1);
611  BOOST_REQUIRE_EQUAL(key_ret_vy_y.get(0),0);
612  BOOST_REQUIRE_EQUAL(key_ret_vy_y.get(1),0);
613  BOOST_REQUIRE_EQUAL(key_ret_vy_x.get(0),-1);
614  BOOST_REQUIRE_EQUAL(key_ret_vy_x.get(1),-1);
615 
616  // Composed derivative
617 
618  grid_key_dx<2> key_ret_xx = D<x,D<x,Field<V,syss_nn>,syss_nn>,syss_nn>::position(key00,ginfo,vx_c);
619  grid_key_dx<2> key_ret_xy = D<x,D<y,Field<V,syss_nn>,syss_nn>,syss_nn>::position(key00,ginfo,vx_c);
620  grid_key_dx<2> key_ret_yx = D<y,D<x,Field<V,syss_nn>,syss_nn>,syss_nn>::position(key00,ginfo,vx_c);
621  grid_key_dx<2> key_ret_yy = D<y,D<y,Field<V,syss_nn>,syss_nn>,syss_nn>::position(key00,ginfo,vx_c);
622 
623  BOOST_REQUIRE_EQUAL(key_ret_xx.get(0),-1);
624  BOOST_REQUIRE_EQUAL(key_ret_xx.get(1),0);
625 
626  BOOST_REQUIRE_EQUAL(key_ret_xy.get(0),0);
627  BOOST_REQUIRE_EQUAL(key_ret_xy.get(1),-1);
628 
629  BOOST_REQUIRE_EQUAL(key_ret_yx.get(0),0);
630  BOOST_REQUIRE_EQUAL(key_ret_yx.get(1),-1);
631 
632  BOOST_REQUIRE_EQUAL(key_ret_yy.get(0),-1);
633  BOOST_REQUIRE_EQUAL(key_ret_yy.get(1),0);
634 
636 
637  key_ret_vx_x = D<x,Field<V,syss_nn>,syss_nn,CENTRAL_B_ONE_SIDE>::position(key00,ginfo,vx_c);
638  key_ret_vx_y = D<y,Field<V,syss_nn>,syss_nn,CENTRAL_B_ONE_SIDE>::position(key00,ginfo,vx_c);
639  key_ret_vy_x = D<x,Field<V,syss_nn>,syss_nn,CENTRAL_B_ONE_SIDE>::position(key00,ginfo,vy_c);
640  key_ret_vy_y = D<y,Field<V,syss_nn>,syss_nn,CENTRAL_B_ONE_SIDE>::position(key00,ginfo,vy_c);
641 
642  BOOST_REQUIRE_EQUAL(key_ret_vx_x.get(0),-1);
643  BOOST_REQUIRE_EQUAL(key_ret_vx_x.get(1),0);
644  BOOST_REQUIRE_EQUAL(key_ret_vx_y.get(0),-1);
645  BOOST_REQUIRE_EQUAL(key_ret_vx_y.get(1),0);
646  BOOST_REQUIRE_EQUAL(key_ret_vy_y.get(0),0);
647  BOOST_REQUIRE_EQUAL(key_ret_vy_y.get(1),-1);
648  BOOST_REQUIRE_EQUAL(key_ret_vy_x.get(0),0);
649  BOOST_REQUIRE_EQUAL(key_ret_vy_x.get(1),-1);
650 
651  // Border left*/
652 }
653 
654 BOOST_AUTO_TEST_SUITE_END()
655 
656 
657 #endif /* OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_FDSCHEME_UNIT_TESTS_HPP_ */
static const bool boundary[]
boundary at X and Y
Derivative second order on h (spacing)
Definition: Derivative.hpp:28
static const bool boundary[]
boundary at X and Y
grid_dist_id< dims, stype, aggregate< float >, CartDecomposition< 2, stype > > b_grid
Base grid.
It ancapsulate the minus operation.
Definition: sum.hpp:141
grid_key_dx is the key to access any element in the grid
Definition: grid_key.hpp:18
Position of the element of dimension d in the hyper-cube of dimension dim.
Definition: comb.hpp:34
Definition: eq.hpp:81
static const unsigned int dims
dimensionaly of the equation (2D problem 3D problem ...)
static const unsigned int dims
dimensionaly of the equation (2D problem 3D problem ...)
static const bool boundary[]
boundary at X and Y
grid_dist_id< dims, stype, aggregate< float >, CartDecomposition< 2, stype > > b_grid
Base grid.
Grid key for a distributed grid.
static const unsigned int dims
dimensionaly of the equation (2D problem 3D problem ...)
float stype
type of space float, double, ...
mem_id get(size_t i) const
Get the i index.
Definition: grid_key.hpp:394
float stype
type of space float, double, ...
static const unsigned int nvar
number of fields in the system
This class decompose a space into sub-sub-domains and distribute them across processors.
This is a distributed grid.
grid_dist_id< dims, stype, aggregate< float >, CartDecomposition< 2, stype > > b_grid
Base grid.
void testing
Indicate we are on testing.
float stype
type of space float, double, ...
static const unsigned int dims
dimensionaly of the equation (2D problem 3D problem ...)
static const unsigned int nvar
Degree of freedom in the system.
void testing
specify that we are on testing
void testing
Indicate we are on testing.
Average.
Definition: Average.hpp:31
Laplacian second order on h (spacing)
Definition: Laplacian.hpp:22
static const unsigned int nvar
number of degree of freedoms
grid_dist_id< dims, stype, aggregate< float >, CartDecomposition< 2, stype > > b_grid
Base grid.
Declaration grid_sm.
Definition: grid_sm.hpp:71
float stype
type of space float, double, ...
static const bool boundary[]
boundary at X and Y
It model an expression expr1 + ... exprn.
Definition: sum.hpp:92
void testing
Indicate we are on testing.
static const unsigned int nvar
number of degree of freedom in the system