4 #define BOOST_TEST_DYN_LINK 6 #include <boost/test/unit_test.hpp> 13 #include "Draw/DrawSphere.hpp" 17 BOOST_AUTO_TEST_SUITE(RedistancingSussmanFastTestSuite)
19 BOOST_AUTO_TEST_CASE(RedistancingSussman_unit_sphere_fast_double_test)
21 typedef double phi_type;
22 typedef double space_type;
23 const phi_type EPSILON = std::numeric_limits<phi_type>::epsilon();
24 const size_t grid_dim = 3;
30 const size_t Phi_0_grid = 0;
31 const size_t SDF_sussman_grid = 1;
32 const size_t SDF_exact_grid = 2;
33 const size_t Error_grid = 3;
36 const size_t sz[grid_dim] = {N, N, N};
37 const space_type radius = 1.0;
38 const space_type box_lower = -2.0;
39 const space_type box_upper = 2.0;
44 grid_in_type g_dist(sz, box, ghost);
45 g_dist.setPropNames({
"Phi_0",
"SDF_sussman",
"SDF_exact",
"Relative error"});
47 const space_type center[grid_dim] = {(box_upper+box_lower)/(space_type)2,
48 (box_upper+box_lower)/(space_type)2,
49 (box_upper+box_lower)/(space_type)2};
51 init_grid_with_sphere<Phi_0_grid>(g_dist, radius, center[x], center[y], center[z]);
54 redist_options.min_iter = 1e3;
55 redist_options.max_iter = 1e3;
57 redist_options.convTolChange.check =
false;
58 redist_options.convTolResidual.check =
false;
60 redist_options.interval_check_convergence = 1e3;
61 redist_options.width_NB_in_grid_points = 8;
62 redist_options.print_current_iterChangeResidual =
true;
63 redist_options.print_steadyState_iter =
true;
67 std::cout <<
"Automatically found timestep is " << redist_obj.get_time_step() << std::endl;
69 redist_obj.run_redistancing<Phi_0_grid, SDF_sussman_grid>();
72 init_analytic_sdf_sphere<SDF_exact_grid>(g_dist, radius, center[x], center[y], center[z]);
75 get_absolute_error<SDF_sussman_grid, SDF_exact_grid, Error_grid>(g_dist);
79 size_t bc[grid_dim] = {NON_PERIODIC, NON_PERIODIC, NON_PERIODIC};
83 vd_type vd_narrow_band(0, box, bc, ghost_vd);
84 vd_narrow_band.setPropNames({
"error"});
85 size_t narrow_band_width = 8;
87 const size_t Error_vd = 0;
88 narrowBand.get_narrow_band_copy_specific_property<SDF_sussman_grid, Error_grid, Error_vd>(g_dist,
93 std::cout << lNorms_vd.l2 <<
", " << lNorms_vd.linf << std::endl;
100 BOOST_CHECK(lNorms_vd.l2 < 0.0428669);
101 BOOST_CHECK(lNorms_vd.linf < 0.0763499);
104 BOOST_AUTO_TEST_CASE(RedistancingSussman_unit_sphere_fast_float_test)
106 typedef float phi_type;
107 typedef float space_type;
108 const phi_type EPSILON = std::numeric_limits<phi_type>::epsilon();
109 const size_t grid_dim = 3;
115 const size_t Phi_0_grid = 0;
116 const size_t SDF_sussman_grid = 1;
117 const size_t SDF_exact_grid = 2;
118 const size_t Error_grid = 3;
121 const size_t sz[grid_dim] = {N, N, N};
122 const space_type radius = 1.0;
123 const space_type box_lower = -2.0;
124 const space_type box_upper = 2.0;
129 grid_in_type g_dist(sz, box, ghost);
130 g_dist.setPropNames({
"Phi_0",
"SDF_sussman",
"SDF_exact",
"Relative error"});
132 const space_type center[grid_dim] = {(box_upper+box_lower)/(space_type)2,
133 (box_upper+box_lower)/(space_type)2,
134 (box_upper+box_lower)/(space_type)2};
136 init_grid_with_sphere<Phi_0_grid>(g_dist, radius, center[x], center[y], center[z]);
139 redist_options.min_iter = 1e3;
140 redist_options.max_iter = 1e3;
142 redist_options.convTolChange.check =
false;
143 redist_options.convTolResidual.check =
false;
145 redist_options.interval_check_convergence = 1e3;
146 redist_options.width_NB_in_grid_points = 8;
147 redist_options.print_current_iterChangeResidual =
true;
148 redist_options.print_steadyState_iter =
true;
150 redist_options.save_temp_grid =
false;
154 std::cout <<
"Automatically found timestep is " << redist_obj.get_time_step() << std::endl;
156 redist_obj.run_redistancing<Phi_0_grid, SDF_sussman_grid>();
159 init_analytic_sdf_sphere<SDF_exact_grid>(g_dist, radius, center[x], center[y], center[z]);
162 get_absolute_error<SDF_sussman_grid, SDF_exact_grid, Error_grid>(g_dist);
166 size_t bc[grid_dim] = {NON_PERIODIC, NON_PERIODIC, NON_PERIODIC};
170 vd_type vd_narrow_band(0, box, bc, ghost_vd);
171 vd_narrow_band.setPropNames({
"error"});
172 size_t narrow_band_width = 8;
174 const size_t Error_vd = 0;
175 narrowBand.get_narrow_band_copy_specific_property<SDF_sussman_grid, Error_grid, Error_vd>(g_dist,
180 std::cout << lNorms_vd.l2 <<
", " << lNorms_vd.linf << std::endl;
187 BOOST_CHECK(lNorms_vd.l2 < 0.0428700);
188 BOOST_CHECK(lNorms_vd.linf < 0.0763502);
191 BOOST_AUTO_TEST_CASE(RedistancingSussman_unit_sphere_fast_usingDefault_test)
193 typedef double phi_type;
194 typedef double space_type;
195 const phi_type EPSILON = std::numeric_limits<phi_type>::epsilon();
196 const size_t grid_dim = 3;
202 const size_t Phi_0_grid = 0;
203 const size_t SDF_sussman_grid = 1;
204 const size_t SDF_exact_grid = 2;
205 const size_t Error_grid = 3;
208 const size_t sz[grid_dim] = {N, N, N};
209 const space_type radius = 1.0;
210 const space_type box_lower = -2.0;
211 const space_type box_upper = 2.0;
216 grid_in_type g_dist(sz, box, ghost);
217 g_dist.setPropNames({
"Phi_0",
"SDF_sussman",
"SDF_exact",
"Relative error"});
219 const space_type center[grid_dim] = {(box_upper+box_lower)/(space_type)2,
220 (box_upper+box_lower)/(space_type)2,
221 (box_upper+box_lower)/(space_type)2};
223 init_grid_with_sphere<Phi_0_grid>(g_dist, radius, center[x], center[y], center[z]);
226 redist_options.min_iter = 1e3;
227 redist_options.max_iter = 1e3;
229 redist_options.convTolChange.check =
false;
230 redist_options.convTolResidual.check =
false;
232 redist_options.interval_check_convergence = 1e3;
233 redist_options.width_NB_in_grid_points = 8;
234 redist_options.print_current_iterChangeResidual =
true;
235 redist_options.print_steadyState_iter =
true;
239 std::cout <<
"Automatically found timestep is " << redist_obj.get_time_step() << std::endl;
241 redist_obj.run_redistancing<Phi_0_grid, SDF_sussman_grid>();
244 init_analytic_sdf_sphere<SDF_exact_grid>(g_dist, radius, center[x], center[y], center[z]);
247 get_absolute_error<SDF_sussman_grid, SDF_exact_grid, Error_grid>(g_dist);
251 size_t bc[grid_dim] = {NON_PERIODIC, NON_PERIODIC, NON_PERIODIC};
255 vd_type vd_narrow_band(0, box, bc, ghost_vd);
256 vd_narrow_band.setPropNames({
"error"});
257 size_t narrow_band_width = 8;
259 const size_t Error_vd = 0;
260 narrowBand.get_narrow_band_copy_specific_property<SDF_sussman_grid, Error_grid, Error_vd>(g_dist,
265 std::cout << lNorms_vd.l2 <<
", " << lNorms_vd.linf << std::endl;
274 BOOST_CHECK(lNorms_vd.l2 < 0.0428669);
275 BOOST_CHECK(lNorms_vd.linf < 0.0763499);
278 BOOST_AUTO_TEST_SUITE_END()
Class for getting the narrow band around the interface.
Class for reinitializing a level-set function into a signed distance function using Sussman redistanc...
Header file containing functions for computing the error and the L_2 / L_infinity norm.
Structure to bundle options for redistancing.
Class for reinitializing a level-set function into a signed distance function using Sussman redistanc...
This is a distributed grid.
This class represent an N-dimensional box.
void get_l_norms_vector(vectortype &vd)
Computes the L_2 and L_infinity norm on the basis of the precomputed error on a particle vector.
Header file containing functions for creating files and folders.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Class for getting the narrow band around the interface.
Header file containing functions that compute the analytical solution of the signed distance function...
Class for computing the l2/l_infinity norm for distributed grids and vectors based on given errors.