Commit c16a2476 authored by jstark's avatar jstark
Browse files

Generalizing types in Sussman redistancing and corresponding HelpFunctionsForGrid.

parent d0d7fe8c
......@@ -33,74 +33,74 @@ if ( CUDA_ON_BACKEND STREQUAL "HIP" AND HIP_FOUND )
hip_add_executable(numerics ${OPENFPM_INIT_FILE} ${CUDA_SOURCES}
OdeIntegrators/tests/OdeIntegratores_base_tests.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_subset_test.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_test_base_tests
FiniteDifference/FD_Solver_test.cpp
FiniteDifference/FD_op_Tests.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_test3d.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_Solver_test.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_test_temporal.cpp
DCPSE/tests/Dcpse_unit_tests.cpp
DCPSE/tests/DcpseRhs_unit_tests.cpp
DCPSE/tests/MonomialBasis_unit_tests.cpp
DCPSE/tests/Support_unit_tests.cpp
DCPSE/tests/Vandermonde_unit_tests.cpp
# OdeIntegrators/tests/OdeIntegratores_base_tests.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_subset_test.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_test_base_tests
# FiniteDifference/FD_Solver_test.cpp
# FiniteDifference/FD_op_Tests.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_test3d.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_Solver_test.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_test_temporal.cpp
# DCPSE/tests/Dcpse_unit_tests.cpp
# DCPSE/tests/DcpseRhs_unit_tests.cpp
# DCPSE/tests/MonomialBasis_unit_tests.cpp
# DCPSE/tests/Support_unit_tests.cpp
# DCPSE/tests/Vandermonde_unit_tests.cpp
main.cpp
Matrix/SparseMatrix_unit_tests.cpp
interpolation/interpolation_unit_tests.cpp
Vector/Vector_unit_tests.cpp
Solvers/petsc_solver_unit_tests.cpp
FiniteDifference/FDScheme_unit_tests.cpp
FiniteDifference/eq_unit_test_3d.cpp
FiniteDifference/eq_unit_test.cpp
FiniteDifference/tests/Eno_Weno_unit_test.cpp
FiniteDifference/tests/Upwind_gradient_unit_test.cpp
FiniteDifference/tests/FD_simple_unit_test.cpp
Operators/Vector/vector_dist_operators_unit_tests.cpp
Operators/Vector/vector_dist_operators_apply_kernel_unit_tests.cpp
../../src/lib/pdata.cpp
BoundaryConditions/tests/method_of_images_cylinder_unit_test.cpp
# Matrix/SparseMatrix_unit_tests.cpp
# interpolation/interpolation_unit_tests.cpp
# Vector/Vector_unit_tests.cpp
# Solvers/petsc_solver_unit_tests.cpp
# FiniteDifference/FDScheme_unit_tests.cpp
# FiniteDifference/eq_unit_test_3d.cpp
# FiniteDifference/eq_unit_test.cpp
# FiniteDifference/tests/Eno_Weno_unit_test.cpp
# FiniteDifference/tests/Upwind_gradient_unit_test.cpp
# FiniteDifference/tests/FD_simple_unit_test.cpp
# Operators/Vector/vector_dist_operators_unit_tests.cpp
# Operators/Vector/vector_dist_operators_apply_kernel_unit_tests.cpp
# ../../src/lib/pdata.cpp
# BoundaryConditions/tests/method_of_images_cylinder_unit_test.cpp
# level_set/closest_point/closest_point_unit_tests.cpp
# level_set/redistancing_Sussman/tests/redistancingSussman_unit_test.cpp
# level_set/redistancing_Sussman/tests/convergence_test.cpp
level_set/redistancing_Sussman/tests/redistancingSussman_unit_test.cpp
level_set/redistancing_Sussman/tests/convergence_test.cpp
)
else()
add_executable(numerics ${OPENFPM_INIT_FILE} ${CUDA_SOURCES}
OdeIntegrators/tests/OdeIntegratores_base_tests.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_subset_test.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_test_base_tests
FiniteDifference/FD_Solver_test.cpp
FiniteDifference/FD_op_Tests.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_test3d.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_Solver_test.cpp
DCPSE/DCPSE_op/tests/DCPSE_op_test_temporal.cpp
DCPSE/tests/Dcpse_unit_tests.cpp
DCPSE/tests/DcpseRhs_unit_tests.cpp
DCPSE/tests/MonomialBasis_unit_tests.cpp
DCPSE/tests/Support_unit_tests.cpp
DCPSE/tests/Vandermonde_unit_tests.cpp
# OdeIntegrators/tests/OdeIntegratores_base_tests.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_subset_test.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_test_base_tests
# FiniteDifference/FD_Solver_test.cpp
# FiniteDifference/FD_op_Tests.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_test3d.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_Solver_test.cpp
# DCPSE/DCPSE_op/tests/DCPSE_op_test_temporal.cpp
# DCPSE/tests/Dcpse_unit_tests.cpp
# DCPSE/tests/DcpseRhs_unit_tests.cpp
# DCPSE/tests/MonomialBasis_unit_tests.cpp
# DCPSE/tests/Support_unit_tests.cpp
# DCPSE/tests/Vandermonde_unit_tests.cpp
main.cpp
Matrix/SparseMatrix_unit_tests.cpp
interpolation/interpolation_unit_tests.cpp
Vector/Vector_unit_tests.cpp
Solvers/petsc_solver_unit_tests.cpp
FiniteDifference/FDScheme_unit_tests.cpp
FiniteDifference/eq_unit_test_3d.cpp
FiniteDifference/eq_unit_test.cpp
FiniteDifference/tests/Eno_Weno_unit_test.cpp
FiniteDifference/tests/Upwind_gradient_unit_test.cpp
FiniteDifference/tests/FD_simple_unit_test.cpp
Operators/Vector/vector_dist_operators_unit_tests.cpp
Operators/Vector/vector_dist_operators_apply_kernel_unit_tests.cpp
../../src/lib/pdata.cpp
BoundaryConditions/tests/method_of_images_cylinder_unit_test.cpp
# Matrix/SparseMatrix_unit_tests.cpp
# interpolation/interpolation_unit_tests.cpp
# Vector/Vector_unit_tests.cpp
# Solvers/petsc_solver_unit_tests.cpp
# FiniteDifference/FDScheme_unit_tests.cpp
# FiniteDifference/eq_unit_test_3d.cpp
# FiniteDifference/eq_unit_test.cpp
# FiniteDifference/tests/Eno_Weno_unit_test.cpp
# FiniteDifference/tests/Upwind_gradient_unit_test.cpp
# FiniteDifference/tests/FD_simple_unit_test.cpp
# Operators/Vector/vector_dist_operators_unit_tests.cpp
# Operators/Vector/vector_dist_operators_apply_kernel_unit_tests.cpp
# ../../src/lib/pdata.cpp
# BoundaryConditions/tests/method_of_images_cylinder_unit_test.cpp
# level_set/closest_point/closest_point_unit_tests.cpp
# level_set/redistancing_Sussman/tests/redistancingSussman_unit_test.cpp
# level_set/redistancing_Sussman/tests/convergence_test.cpp
level_set/redistancing_Sussman/tests/redistancingSussman_unit_test.cpp
level_set/redistancing_Sussman/tests/convergence_test.cpp
)
set_property(TARGET numerics PROPERTY CUDA_ARCHITECTURES OFF)
......
......@@ -26,9 +26,9 @@
* @return Time step.
*/
template <typename grid_type>
double get_time_step_CFL(grid_type &grid)
typename grid_type::stype get_time_step_CFL(grid_type &grid)
{
double sum = 0;
typename grid_type::stype sum = 0.0;
for (size_t d = 0; d < grid_type::dims; d++)
{
sum += 1.0 / (grid.spacing(d) * grid.spacing(d));
......@@ -47,9 +47,9 @@ double get_time_step_CFL(grid_type &grid)
* @return Time step.
*/
template <typename grid_type>
double get_time_step_CFL(grid_type & grid, double u [grid_type::dims], double C)
typename grid_type::stype get_time_step_CFL(grid_type & grid, typename grid_type::stype u [grid_type::dims], typename grid_type::stype C)
{
double sum = 0;
typename grid_type::stype sum = 0;
for (size_t d = 0; d < grid_type::dims; d++)
{
sum += u[d] / grid.spacing(d);
......@@ -66,9 +66,9 @@ double get_time_step_CFL(grid_type & grid, double u [grid_type::dims], double C)
* @return Time step.
*/
template <typename grid_type>
double get_time_step_CFL(grid_type & grid, double u, double C)
typename grid_type::stype get_time_step_CFL(grid_type & grid, typename grid_type::stype u, typename grid_type::stype C)
{
double sum = 0;
typename grid_type::stype sum = 0;
for (size_t d = 0; d < grid_type::dims; d++)
{
sum += u / grid.spacing(d);
......@@ -149,9 +149,9 @@ void copy_gridTogrid(const grid_source_type & grid_sc, grid_dest_type & grid_ds,
* @return Double variable that contains the value of the biggest spacing.
*/
template <typename grid_type>
double get_biggest_spacing(grid_type & grid)
typename grid_type::stype get_biggest_spacing(grid_type & grid)
{
double h_max = 0;
typename grid_type::stype h_max = 0;
for (size_t d = 0; d < grid_type::dims; d++)
{
if (grid.spacing(d) > h_max) h_max = grid.spacing(d);
......@@ -167,9 +167,9 @@ double get_biggest_spacing(grid_type & grid)
* @return Double variable that contains the value of the smallest spacing.
*/
template <typename grid_type>
double get_smallest_spacing(grid_type & grid)
typename grid_type::stype get_smallest_spacing(grid_type & grid)
{
double spacing [grid_type::dims];
typename grid_type::stype spacing [grid_type::dims];
for (size_t d = 0; d < grid_type::dims; d++)
{
spacing[d] = grid.spacing(d);
......@@ -188,10 +188,10 @@ double get_smallest_spacing(grid_type & grid)
* @return Double variable that contains the sum over all grid nodes of the difference between the value stored at \p
* Prop1 and the value stored at \p Prop2.
*/
template <size_t Prop1, size_t Prop2, typename grid_type>
double average_difference(grid_type & grid)
template <size_t Prop1, size_t Prop2, typename prop_type, typename grid_type>
prop_type average_difference(grid_type & grid)
{
double total_diff = 0;
prop_type total_diff = 0;
auto dom = grid.getDomainIterator();
while (dom.isNext())
{
......@@ -209,10 +209,10 @@ double average_difference(grid_type & grid)
* @param grid Input OpenFPM grid.
* @return Double variable that contains the maximum value of property \p Prop in \p grid.
*/
template <size_t Prop, typename grid_type>
double get_max_val(grid_type & grid)
template <size_t Prop, typename prop_type, typename grid_type>
prop_type get_max_val(grid_type & grid)
{
double max_value = std::numeric_limits<double>::lowest();
prop_type max_value = std::numeric_limits<prop_type>::lowest();
auto dom = grid.getDomainIterator();
while(dom.isNext())
{
......@@ -233,10 +233,10 @@ double get_max_val(grid_type & grid)
* @param grid Input OpenFPM grid.
* @return Double variable that contains the minimum value of property \p Prop in \p grid.
*/
template <size_t Prop, typename grid_type>
double get_min_val(grid_type & grid)
template <size_t Prop, typename prop_type, typename grid_type>
prop_type get_min_val(grid_type & grid)
{
double min_value = std::numeric_limits<double>::max();
prop_type min_value = std::numeric_limits<prop_type>::max();
auto dom = grid.getDomainIterator();
while(dom.isNext())
{
......@@ -277,14 +277,14 @@ void init_sign_prop(grid_type & grid)
* @tparam gridtype Type of input grid.
* @param grid Grid, on which the magnitude of gradient should be computed.
*/
template <size_t Vector_in, size_t Magnitude_out, typename gridtype>
template <size_t Vector_in, size_t Magnitude_out, typename magnitude_type, typename gridtype>
void get_vector_magnitude(gridtype & grid)
{
grid.template ghost_get<Vector_in>();
auto dom = grid.getDomainGhostIterator();
while(dom.isNext())
{
double sum = 0;
magnitude_type sum = 0;
auto key = dom.get();
for(size_t d = 0; d < gridtype::dims; d++)
{
......
......@@ -56,13 +56,14 @@
* between the iterations is considered and the
* redistancing finishes when the Conv_tol_change.value (or the max-iteration) is reached.
*/
template <typename phi_type>
struct Conv_tol_change
{
bool check = true; ///< If true, the total change of Phi (see DistFromSol::change)
///< between the iterations is considered and the redistancing finishes when the Conv_tol_change.value (or the
///< max-iteration) is reached. If false, the change is not considered as steady-state
///< criterion. Default: true.
double value = 1e-15; ///< Double variable that stores the tolerance value for the change at which the iterative
phi_type value = 1e-15; ///< Variable that stores the tolerance value for the change at which the iterative
///< redistancing process is considered as steady-state. (see also DistFromSol::change)
};
......@@ -71,12 +72,13 @@ struct Conv_tol_change
* @details If Conv_tol_residual.check = true, the residual, that is abs(magnitude gradient of phi - 1), is considered
* and the redistancing finishes when the Conv_tol_residual.value (or the max-iteration) is reached.
*/
template <typename phi_type>
struct Conv_tol_residual
{
bool check = true; ///< If true, the residual of Phi (see DistFromSol::residual) is considered and the
///< redistancing finishes when the Conv_tol_residual.value (or the
///< max-iteration) is reached. If false, the change is not considered as steady-state criterion. Default: true.
double value = 1e-3; ///< Double variable that stores the tolerance value for the residual at which the
phi_type value = 1e-3; ///< Variable that stores the tolerance value for the residual at which the
///< iterative redistancing process is considered as steady-state. (see also
///< DistFromSol::residual)
};
......@@ -112,13 +114,14 @@ struct Conv_tol_residual
* @param save_temp_grid: If true, save the temporary grid as hdf5 that can be reloaded onto a grid
*/
template <typename phi_type>
struct Redist_options
{
size_t min_iter = 1e5;
size_t max_iter = 1e12;
Conv_tol_change convTolChange;
Conv_tol_residual convTolResidual;
Conv_tol_change<phi_type> convTolChange;
Conv_tol_residual<phi_type> convTolResidual;
size_t interval_check_convergence = 100;
size_t width_NB_in_grid_points = 8;
......@@ -135,13 +138,13 @@ struct Redist_options
*/
struct DistFromSol
{
double change; ///< Double variable that contains the absolute value of the change of \a &phi; between the
auto change; ///< Variable that contains the absolute value of the change of \a &phi; between the
///< current
///< iteration \a i and the previous iteration \a i-1: @f[ abs( \phi_i - \phi_{i-1} ) @f] It is
///< computed for all grid
///< points that lie within the narrow band and normalized to the number of grid points that
///< lie in that narrow band.
double residual; ///< Double variable that contains the absolute value of how far the gradient magnitude of
auto residual; ///< Variable that contains the absolute value of how far the gradient magnitude of
///< the current \a &phi; of iteration number \a i is away from being equal to 1: @f[ abs(|\nabla\phi_i| - 1 ) @f]
///< It is computed for all grid points that lie within the narrow band and
///< normalized to the number of grid points that lie in that narrow band.
......@@ -154,7 +157,7 @@ struct DistFromSol
* @class RedistancingSussman
* @tparam grid_in_type Inferred type of input grid, which stores the initial level-set function Phi_0.
*/
template <typename grid_in_type>
template <typename grid_in_type, typename phi_type>
class RedistancingSussman
{
public:
......@@ -186,7 +189,7 @@ public:
* gradient of Phi_{n+1},
* sign of the original input Phi_0 (for the upwinding).
*/
typedef aggregate<double, Point<grid_in_type::dims, double>, int>
typedef aggregate<phi_type, Point<grid_in_type::dims, phi_type>, int>
props_temp;
/** @brief Type definition for the temporary grid.
*/
......@@ -235,7 +238,7 @@ public:
/** @brief Access the artificial timestep (private member) which will be used for the iterative redistancing.
* @see get_time_step_CFL(g_temp_type &grid), set_user_time_step()
*/
double get_time_step()
auto get_time_step()
{
/// This timestep is computed according to the grid spacing fulfilling the CFL condition.
return time_step;
......@@ -246,12 +249,12 @@ public:
return final_iter;
}
double get_finalChange()
auto get_finalChange()
{
return distFromSol.change;
}
double get_finalResidual()
auto get_finalResidual()
{
return distFromSol.residual;
}
......@@ -275,11 +278,11 @@ private:
int final_iter = 0; ///< Will be set to the final iteration when redistancing ends.
/// Transform the half-bandwidth in no_of_grid_points into physical half-bandwidth kappa.
double kappa = ceil(redistOptions.width_NB_in_grid_points / 2.0) * get_biggest_spacing(g_temp);
phi_type kappa = ceil(redistOptions.width_NB_in_grid_points / 2.0) * get_biggest_spacing(g_temp);
/**@brief Artificial timestep for the redistancing iterations.
* @see get_time_step_CFL(g_temp_type &grid), get_time_step(), set_user_time_step()
*/
double time_step;
grid_type::stype time_step;
int order_upwind_gradient;
// Member functions
#ifdef SE_CLASS1
......@@ -303,7 +306,7 @@ private:
template<size_t Phi_0_in>
void init_temp_grid()
{
double min_value = get_min_val<Phi_0_in>(r_grid_in); // get minimum Phi_0 value on the input grid
phi_type min_value = get_min_val<Phi_0_in>(r_grid_in); // get minimum Phi_0 value on the input grid
init_grid_and_ghost<Phi_n_temp>(g_temp, min_value); // init. Phi_n_temp (incl. ghost) with min. Phi_0
copy_gridTogrid<Phi_0_in, Phi_n_temp>(r_grid_in, g_temp); // Copy Phi_0 from the input grid to Phi_n_temp
}
......@@ -318,7 +321,7 @@ private:
* @return Phi_n+1 which is the Phi of the next time step on current node.
*
*/
double get_phi_nplus1(double phi_n, double phi_n_magnOfGrad, double dt, double sgn_phi_n)
phi_type get_phi_nplus1(phi_type phi_n, phi_type phi_n_magnOfGrad, grid_in_type::stype dt, phi_type sgn_phi_n)
{
return phi_n + dt * sgn_phi_n * (1 - phi_n_magnOfGrad);
}
......@@ -335,9 +338,9 @@ private:
while (dom.isNext())
{
auto key = dom.get();
const double phi_n = grid.template get<Phi_n_temp>(key);
const double phi_n_magnOfGrad = grid.template get<Phi_grad_temp>(key).norm();
double epsilon = phi_n_magnOfGrad * grid.getSpacing()[0];
const phi_type phi_n = grid.template get<Phi_n_temp>(key);
const phi_type phi_n_magnOfGrad = grid.template get<Phi_grad_temp>(key).norm();
phi_type epsilon = phi_n_magnOfGrad * grid.getSpacing()[0];
grid.template get<Phi_n_temp>(key) = get_phi_nplus1(phi_n, phi_n_magnOfGrad, time_step,
smooth_S(phi_n, epsilon));
++dom;
......@@ -350,7 +353,7 @@ private:
*
* @return True, if node lays within nb., false, if the distance to the interface is > kappa.
*/
bool lays_inside_NB(double Phi)
bool lays_inside_NB(phi_type Phi)
{
return (abs(Phi) <= kappa);
}
......@@ -362,8 +365,8 @@ private:
*/
void update_distFromSol(g_temp_type &grid)
{
double max_residual = 0;
double max_change = 0;
phi_type max_residual = 0;
phi_type max_change = 0;
int count = 0;
auto dom = grid.getDomainIterator();
while (dom.isNext())
......@@ -372,9 +375,9 @@ private:
if (lays_inside_NB(grid.template get<Phi_n_temp>(key)))
{
count++;
double phi_n_magnOfGrad = grid.template get<Phi_grad_temp>(key).norm();
double epsilon = phi_n_magnOfGrad * grid.getSpacing()[0];
double phi_nplus1 = get_phi_nplus1(grid.template get<Phi_n_temp>(key), phi_n_magnOfGrad, time_step,
phi_type phi_n_magnOfGrad = grid.template get<Phi_grad_temp>(key).norm();
phi_type epsilon = phi_n_magnOfGrad * grid.getSpacing()[0];
phi_type phi_nplus1 = get_phi_nplus1(grid.template get<Phi_n_temp>(key), phi_n_magnOfGrad, time_step,
smooth_S(grid.template get<Phi_n_temp>(key), epsilon));
if (abs(phi_nplus1 - grid.template get<Phi_n_temp>(key)) > max_change)
......
......@@ -18,7 +18,9 @@ BOOST_AUTO_TEST_SUITE(RedistancingSussmanTestSuite)
BOOST_AUTO_TEST_CASE(RedistancingSussman_unit_sphere)
{
const double EPSILON = std::numeric_limits<double>::epsilon();
typedef double phi_type;
typedef double space_type;
const phi_type EPSILON = std::numeric_limits<phi_type>::epsilon();
const size_t grid_dim = 3;
// some indices
const size_t x = 0;
......@@ -31,19 +33,19 @@ BOOST_AUTO_TEST_SUITE(RedistancingSussmanTestSuite)
const size_t Error_grid = 3;
size_t N = 128;
const double dt = 0.000165334; // CFL-condition for N=128
const space_type dt = 0.000165334; // CFL-condition for N=128
const size_t sz[grid_dim] = {N, N, N};
const double radius = 1.0;
const double box_lower = -2.0;
const double box_upper = 2.0;
Box<grid_dim, double> box({box_lower, box_lower, box_lower}, {box_upper, box_upper, box_upper});
const space_type radius = 1.0;
const space_type box_lower = -2.0;
const space_type box_upper = 2.0;
Box<grid_dim, space_type> box({box_lower, box_lower, box_lower}, {box_upper, box_upper, box_upper});
Ghost<grid_dim, long int> ghost(0);
typedef aggregate<double, double, double, double> props;
typedef grid_dist_id<grid_dim, double, props > grid_in_type;
typedef aggregate<phi_type, phi_type, phi_type, phi_type> props;
typedef grid_dist_id<grid_dim, space_type, props > grid_in_type;
grid_in_type g_dist(sz, box, ghost);
g_dist.setPropNames({"Phi_0", "SDF_sussman", "SDF_exact", "Relative error"});
const double center[grid_dim] = {0.5*(box_upper+box_lower),
const space_type center[grid_dim] = {0.5*(box_upper+box_lower),
0.5*(box_upper+box_lower),
0.5*(box_upper+box_lower)};
init_grid_with_sphere<Phi_0_grid>(g_dist, radius, center[x], center[y], center[z]); // Initialize sphere onto grid
......@@ -61,7 +63,8 @@ BOOST_AUTO_TEST_SUITE(RedistancingSussmanTestSuite)
redist_options.print_current_iterChangeResidual = true;
redist_options.print_steadyState_iter = true;
RedistancingSussman<grid_in_type> redist_obj(g_dist, redist_options); // Instantiation of Sussman-redistancing class
RedistancingSussman<grid_in_type, phi_type> redist_obj(g_dist, redist_options); // Instantiation of
// Sussman-redistancing class
std::cout << "New CFL timestep = " << redist_obj.get_time_step() << std::endl;
// redist_obj.set_user_time_step(dt);
// std::cout << "dt set to = " << dt << std::endl;
......@@ -79,9 +82,9 @@ BOOST_AUTO_TEST_SUITE(RedistancingSussmanTestSuite)
// Get narrow band: Place particles on interface (narrow band width e.g. 4 grid points on each side of the
// interface)
size_t bc[grid_dim] = {NON_PERIODIC, NON_PERIODIC, NON_PERIODIC};
typedef aggregate<double> props_nb;
typedef vector_dist<grid_dim, double, props_nb> vd_type;
Ghost<grid_dim, double> ghost_vd(0);
typedef aggregate<phi_type> props_nb;
typedef vector_dist<grid_dim, space_type, props_nb> vd_type;
Ghost<grid_dim, space_type> ghost_vd(0);
vd_type vd_narrow_band(0, box, bc, ghost_vd);
vd_narrow_band.setPropNames({"error"});
size_t narrow_band_width = 8;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment