1/*
2 * Kernels_unit_tests.hpp
3 *
4 * Created on: Feb 17, 2016
5 * Author: i-bird
6 */
7
8#ifndef OPENFPM_NUMERICS_SRC_PSE_KERNELS_UNIT_TESTS_HPP_
9#define OPENFPM_NUMERICS_SRC_PSE_KERNELS_UNIT_TESTS_HPP_
10
11#include "PSE/Kernels_test_util.hpp"
12#ifdef HAVE_LIBQUADMATH
13#include <boost/multiprecision/float128.hpp>
14#endif
15
16BOOST_AUTO_TEST_SUITE( pse_kernels_unit_tests )
17
18BOOST_AUTO_TEST_CASE( pse_ker )
19{
20 Vcluster<> & v_cl = create_vcluster();
21
22 // This test is not made to run in parallel
23 if (v_cl.getProcessingUnits() > 1)
24 return;
25
26 openfpm::vector<openfpm::vector<double>> y;
27 openfpm::vector<openfpm::vector<double>> y_res;
28
29 // Load the result of the test
30
31#ifdef HAVE_LIBQUADMATH
32 y_res.load("test/PSE_convergence");
33#else
34 y_res.load("test/PSE_convergence_osx");
35#endif
36
37 // Every time increase the number of particles by 2
38 for (size_t i = 250 ; i <= 2097152000 ; i*=2)
39 {
40 y.add();
41
42 PSEError err;
43
44 /////// Order 2 //////////////
45
46#ifdef HAVE_LIBQUADMATH
47
48 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,2>>(i,2,err);
49 y.last().add(err.linf_error);
50
51 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,2>>(i,4,err);
52 y.last().add(err.linf_error);
53#endif
54
55 PSE_test<double,Lap_PSE<1,double,2>>(i,2,err);
56 y.last().add(err.linf_error);
57
58 PSE_test<double,Lap_PSE<1,double,2>>(i,4,err);
59 y.last().add(err.linf_error);
60
61 PSE_test<float,Lap_PSE<1,float,2>>(i,2,err);
62 y.last().add(err.linf_error);
63
64 PSE_test<float,Lap_PSE<1,float,2>>(i,4,err);
65 y.last().add(err.linf_error);
66
67 //////// Order 4 /////////////
68
69#ifdef HAVE_LIBQUADMATH
70
71 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,4>>(i,2,err);
72 y.last().add(err.linf_error);
73
74 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,4>>(i,4,err);
75 y.last().add(err.linf_error);
76
77 //////// Order 6 /////////////
78
79
80 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,6>>(i,2,err);
81 y.last().add(err.linf_error);
82
83 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,6>>(i,4,err);
84 y.last().add(err.linf_error);
85
86
87 //////// Order 8 /////////////
88
89
90 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,8>>(i,8,err);
91 y.last().add(err.linf_error);
92
93 PSE_test<boost::multiprecision::float128,Lap_PSE<1,boost::multiprecision::float128,8>>(i,16,err);
94 y.last().add(err.linf_error);
95
96#endif
97 }
98
99 // Check the result
100 for (size_t i = 0 ; i < y.size(); i++)
101 {
102 for (size_t j = 0 ; j < y.get(i).size(); j++)
103 {
104 double c1 = y.get(i).get(j);
105 double c2 = y_res.get(i).get(j);
106
107#ifdef HAVE_LIBQUADMATH
108
109 // In divergent mode the system is too sensitive
110 // to compiler/hardware differences disable them
111 if (j != 4 && j != 5)
112 {BOOST_REQUIRE_CLOSE(c1,c2,3.0);}
113
114#else
115
116 // In divergent mode the system is too sensitive
117 // to compiler/hardware differences disable them
118 if (j != 2 && j != 3)
119 {BOOST_REQUIRE_CLOSE(c1,c2,3.0);}
120
121#endif
122 }
123 }
124}
125
126BOOST_AUTO_TEST_SUITE_END()
127
128#endif /* OPENFPM_NUMERICS_SRC_PSE_KERNELS_UNIT_TESTS_HPP_ */
129