5 #define BOOST_TEST_DYN_LINK 6 #include <boost/test/unit_test.hpp> 10 #include "Gaussian.hpp" 14 BOOST_AUTO_TEST_SUITE(UpwindGradientTestSuite)
15 const double EPSILON = 1e-14;
16 const size_t f_gaussian = 0;
17 const size_t Sign = 1;
18 const size_t df_gaussian = 2;
19 const size_t df_upwind = 3;
20 const size_t Error = 4;
22 BOOST_AUTO_TEST_CASE(Upwind_gradient_order1_1D_test)
24 const int convergence_order = 1;
25 const size_t grid_dim = 1;
27 const double box_lower = -1.0;
28 const double box_upper = 1.0;
34 double mu = 0.5 * (box_upper - abs(box_lower));
35 double sigma = 0.3 * (box_upper - box_lower);
40 const size_t sz[grid_dim] = {N};
41 grid_in_type g_dist(sz, box, ghost);
43 g_dist.setPropNames({
"f_gaussian",
"Sign",
"df_gaussian",
"df_upwind",
"Error"});
45 auto gdom = g_dist.getDomainGhostIterator();
48 auto key = gdom.get();
51 g_dist.getProp<f_gaussian>(key) = gaussian(p, mu, sigma);
53 g_dist.getProp<Sign>(key) =
sgn(g_dist.getProp<f_gaussian>(key));
57 auto dom = g_dist.getDomainIterator();
63 for (
int d = 0; d < grid_dim; d++)
66 g_dist.getProp<df_gaussian>(key)[d] = hermite_polynomial(p.
get(d), sigma, 1) * g_dist.getProp<f_gaussian>(key);
72 get_upwind_gradient<f_gaussian, Sign, df_upwind>(g_dist, convergence_order,
false);
75 get_relative_error<df_upwind, df_gaussian, Error>(g_dist);
80 if (N==32) BOOST_CHECK_MESSAGE(lNorms.l2 <= 0.38954184748195 + EPSILON,
"Checking L2-norm upwind gradient " 81 "order " + std::to_string
87 BOOST_AUTO_TEST_CASE(Upwind_gradient_order3_1D_test)
89 const int convergence_order = 3;
90 const size_t grid_dim = 1;
92 const double box_lower = -1.0;
93 const double box_upper = 1.0;
99 double mu = 0.5 * (box_upper - abs(box_lower));
100 double sigma = 0.3 * (box_upper - box_lower);
105 const size_t sz[grid_dim] = {N};
106 grid_in_type g_dist(sz, box, ghost);
108 g_dist.setPropNames({
"f_gaussian",
"Sign",
"df_gaussian",
"df_upwind",
"Error"});
110 auto gdom = g_dist.getDomainGhostIterator();
111 while (gdom.isNext())
113 auto key = gdom.get();
116 g_dist.getProp<f_gaussian>(key) = gaussian(p, mu, sigma);
118 g_dist.getProp<Sign>(key) =
sgn(g_dist.getProp<f_gaussian>(key));
122 auto dom = g_dist.getDomainIterator();
125 auto key = dom.get();
128 for (
int d = 0; d < grid_dim; d++)
131 g_dist.getProp<df_gaussian>(key)[d] = hermite_polynomial(p.
get(d), sigma, 1) * g_dist.getProp<f_gaussian>(key);
137 get_upwind_gradient<f_gaussian, Sign, df_upwind>(g_dist, convergence_order,
false);
140 get_relative_error<df_upwind, df_gaussian, Error>(g_dist);
145 if (N==32) BOOST_CHECK_MESSAGE(lNorms.l2 <= 0.08667855716144 + EPSILON,
"Checking L2-norm upwind gradient " 147 + std::to_string(convergence_order));
150 BOOST_AUTO_TEST_CASE(Upwind_gradient_order5_1D_test)
152 const int convergence_order = 5;
153 const size_t grid_dim = 1;
155 const double box_lower = -1.0;
156 const double box_upper = 1.0;
162 double mu = 0.5 * (box_upper - abs(box_lower));
163 double sigma = 0.3 * (box_upper - box_lower);
168 const size_t sz[grid_dim] = {N};
169 grid_in_type g_dist(sz, box, ghost);
171 g_dist.setPropNames({
"f_gaussian",
"Sign",
"df_gaussian",
"df_upwind",
"Error"});
173 auto gdom = g_dist.getDomainGhostIterator();
174 while (gdom.isNext())
176 auto key = gdom.get();
179 g_dist.getProp<f_gaussian>(key) = gaussian(p, mu, sigma);
181 g_dist.getProp<Sign>(key) =
sgn(g_dist.getProp<f_gaussian>(key));
185 auto dom = g_dist.getDomainIterator();
188 auto key = dom.get();
191 for (
int d = 0; d < grid_dim; d++)
194 g_dist.getProp<df_gaussian>(key)[d] = hermite_polynomial(p.
get(d), sigma, 1) * g_dist.getProp<f_gaussian>(key);
200 get_upwind_gradient<f_gaussian, Sign, df_upwind>(g_dist, convergence_order,
false);
203 get_relative_error<df_upwind, df_gaussian, Error>(g_dist);
208 if (N==32) BOOST_CHECK_MESSAGE(lNorms.l2 <= 0.03215172234342 + EPSILON,
"Checking L2-norm upwind gradient " 210 + std::to_string(convergence_order));
213 BOOST_AUTO_TEST_CASE(Upwind_gradient_3D_test)
216 const size_t grid_dim = 3;
217 const double box_lower = -1.0;
218 const double box_upper = 1.0;
224 double mu = 0.5 * (box_upper - abs(box_lower));
225 double sigma = 0.3 * (box_upper - box_lower);
230 const size_t sz[grid_dim] = {N, N, N};
231 grid_in_type g_dist(sz, box, ghost);
232 g_dist.setPropNames({
"f_gaussian",
"Sign",
"df_gaussian",
"df_upwind",
"Error"});
234 auto gdom = g_dist.getDomainGhostIterator();
235 while (gdom.isNext())
237 auto key = gdom.get();
240 g_dist.getProp<f_gaussian>(key) = gaussian(p, mu, sigma);
242 g_dist.getProp<Sign>(key) =
sgn(g_dist.getProp<f_gaussian>(key));
246 auto dom = g_dist.getDomainIterator();
249 auto key = dom.get();
252 for (
int d = 0; d < grid_dim; d++)
255 g_dist.getProp<df_gaussian>(key)[d] = hermite_polynomial(p.
get(d), sigma, 1) * g_dist.getProp<f_gaussian>(key);
260 for (
int convergence_order = 1; convergence_order <=5; convergence_order +=2 )
263 get_upwind_gradient<f_gaussian, Sign, df_upwind>(g_dist, convergence_order,
false);
265 get_relative_error<df_upwind, df_gaussian, Error>(g_dist);
272 switch(convergence_order)
275 BOOST_CHECK_MESSAGE(lNorms.l2 <= 0.38954184748194 + EPSILON,
"Checking L2-norm upwind gradient order " + std::to_string(convergence_order));
278 BOOST_CHECK_MESSAGE(lNorms.l2 <= 0.08667855716144 + EPSILON,
"Checking L2-norm upwind gradient order " + std::to_string(convergence_order));
281 BOOST_CHECK_MESSAGE(lNorms.l2 <= 0.02285996528578 + EPSILON,
"Checking L2-norm upwind gradient order " + std::to_string(convergence_order));
285 std::cout <<
"Checking only implemented for convergence order 1, 3 and 5." << std::endl;
293 BOOST_AUTO_TEST_SUITE_END()
Header file containing functions for computing the error and the L_2 / L_infinity norm.
This class implement the point shape in an N-dimensional space.
int sgn(T val)
Gets the sign of a variable.
This is a distributed grid.
Out-of-bound policy kill the program.
__device__ __host__ const T & get(unsigned int i) const
Get coordinate.
Approximating upwind gradients on a grid with the following options for the order of accuracy: 1,...
void get_l_norms_grid(gridtype &grid)
Computes the L_2 and L_infinity norm on the basis of the precomputed error on a grid.
This class represent an N-dimensional box.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Class for computing the l2/l_infinity norm for distributed grids and vectors based on given errors.
Header file containing small mathematical help-functions that are needed e.g. for the Sussman redista...