4#define BOOST_TEST_DYN_LINK
6#include <boost/test/unit_test.hpp>
13#include "Draw/DrawSphere.hpp"
17BOOST_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 = 4;
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"});
86 const size_t Error_vd = 0;
87 narrowBand.get_narrow_band_copy_specific_property<SDF_sussman_grid, Error_grid, Error_vd>(g_dist,
92 std::cout << lNorms_vd.l2 <<
", " << lNorms_vd.linf << std::endl;
94 BOOST_CHECK(lNorms_vd.l2 < 0.044693);
95 BOOST_CHECK(lNorms_vd.linf < 0.066995);
98 BOOST_AUTO_TEST_CASE(RedistancingSussman_unit_sphere_fast_float_test)
100 typedef float phi_type;
101 typedef float space_type;
102 const phi_type EPSILON = std::numeric_limits<phi_type>::epsilon();
103 const size_t grid_dim = 3;
109 const size_t Phi_0_grid = 0;
110 const size_t SDF_sussman_grid = 1;
111 const size_t SDF_exact_grid = 2;
112 const size_t Error_grid = 3;
115 const size_t sz[grid_dim] = {N, N, N};
116 const space_type radius = 1.0;
117 const space_type box_lower = -2.0;
118 const space_type box_upper = 2.0;
123 grid_in_type g_dist(sz, box, ghost);
124 g_dist.setPropNames({
"Phi_0",
"SDF_sussman",
"SDF_exact",
"Relative error"});
126 const space_type center[grid_dim] = {(box_upper+box_lower)/(space_type)2,
127 (box_upper+box_lower)/(space_type)2,
128 (box_upper+box_lower)/(space_type)2};
130 init_grid_with_sphere<Phi_0_grid>(g_dist, radius, center[x], center[y], center[z]);
133 redist_options.min_iter = 1e3;
134 redist_options.max_iter = 1e3;
136 redist_options.convTolChange.check =
false;
137 redist_options.convTolResidual.check =
false;
139 redist_options.interval_check_convergence = 1e3;
140 redist_options.width_NB_in_grid_points = 8;
141 redist_options.print_current_iterChangeResidual =
true;
142 redist_options.print_steadyState_iter =
true;
144 redist_options.save_temp_grid =
false;
148 std::cout <<
"Automatically found timestep is " << redist_obj.get_time_step() << std::endl;
150 redist_obj.run_redistancing<Phi_0_grid, SDF_sussman_grid>();
153 init_analytic_sdf_sphere<SDF_exact_grid>(g_dist, radius, center[x], center[y], center[z]);
156 get_absolute_error<SDF_sussman_grid, SDF_exact_grid, Error_grid>(g_dist);
160 size_t bc[grid_dim] = {NON_PERIODIC, NON_PERIODIC, NON_PERIODIC};
164 vd_type vd_narrow_band(0, box, bc, ghost_vd);
165 vd_narrow_band.setPropNames({
"error"});
167 const size_t Error_vd = 0;
168 narrowBand.get_narrow_band_copy_specific_property<SDF_sussman_grid, Error_grid, Error_vd>(g_dist,
173 std::cout << lNorms_vd.l2 <<
", " << lNorms_vd.linf << std::endl;
175 BOOST_CHECK(lNorms_vd.l2 < 0.0500563);
176 BOOST_CHECK(lNorms_vd.linf < 0.0846976);
179 BOOST_AUTO_TEST_CASE(RedistancingSussman_unit_sphere_fast_usingDefault_test)
180 {
typedef double phi_type;
181 typedef double space_type;
182 const phi_type EPSILON = std::numeric_limits<phi_type>::epsilon();
183 const size_t grid_dim = 3;
189 const size_t Phi_0_grid = 0;
190 const size_t SDF_sussman_grid = 1;
191 const size_t SDF_exact_grid = 2;
192 const size_t Error_grid = 3;
195 const size_t sz[grid_dim] = { N, N, N };
196 const space_type radius = 1.0;
197 const space_type box_lower = -2.0;
198 const space_type box_upper = 2.0;
203 grid_in_type g_dist(sz, box, ghost);
204 g_dist.setPropNames({
"Phi_0",
"SDF_sussman",
"SDF_exact",
"Relative error" });
206 const space_type center[grid_dim] = {
207 (box_upper + box_lower) / (space_type) 2, (box_upper + box_lower) / (space_type) 2,
208 (box_upper + box_lower) / (space_type) 2
211 init_grid_with_sphere<Phi_0_grid>(g_dist, radius, center[x], center[y], center[z]);
214 redist_options.min_iter = 1e3;
215 redist_options.max_iter = 1e3;
219 std::cout <<
"Automatically found timestep is " << redist_obj.get_time_step() << std::endl;
221 redist_obj.run_redistancing<Phi_0_grid, SDF_sussman_grid>();
224 init_analytic_sdf_sphere<SDF_exact_grid>(g_dist, radius, center[x], center[y], center[z]);
227 get_absolute_error<SDF_sussman_grid, SDF_exact_grid, Error_grid>(g_dist);
231 size_t bc[grid_dim] = { NON_PERIODIC, NON_PERIODIC, NON_PERIODIC };
235 vd_type vd_narrow_band(0, box, bc, ghost_vd);
236 vd_narrow_band.setPropNames({
"error" });
238 const size_t Error_vd = 0;
239 narrowBand.get_narrow_band_copy_specific_property<SDF_sussman_grid, Error_grid, Error_vd>(g_dist, vd_narrow_band);
243 std::cout << lNorms_vd.l2 <<
", " << lNorms_vd.linf << std::endl;
245 BOOST_CHECK(lNorms_vd.l2 < 0.0417405);
246 BOOST_CHECK(lNorms_vd.linf < 0.0639717);
248BOOST_AUTO_TEST_SUITE_END()
Header file containing functions that compute the analytical solution of the signed distance function...
Header file containing functions for computing the error and the L_2 / L_infinity norm.
Class for getting the narrow band around the interface.
Header file containing functions for creating files and folders.
Class for reinitializing a level-set function into a signed distance function using Sussman redistanc...
This class represent an N-dimensional box.
Class for computing the l2/l_infinity norm for distributed grids and vectors based on given errors.
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.
Class for getting the narrow band around the interface.
Class for reinitializing a level-set function into a signed distance function using Sussman redistanc...
This is a distributed grid.
Structure to bundle options for redistancing.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...