diff --git a/src/space.c b/src/space.c index 9bfa984b82144cc01eb4588b8fbff609d0105805..2ed86a9ff1e83a8212f25cbbd1c850a7d9f94769 100644 --- a/src/space.c +++ b/src/space.c @@ -2205,9 +2205,16 @@ void space_parts_get_cell_index_mapper(void *map_data, int nr_parts, #endif /* Put it back into the simulation volume */ - const double pos_x = box_wrap(old_pos_x, 0.0, dim_x); - const double pos_y = box_wrap(old_pos_y, 0.0, dim_y); - const double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + double pos_x = box_wrap(old_pos_x, 0.0, dim_x); + double pos_y = box_wrap(old_pos_y, 0.0, dim_y); + double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + + /* Treat the case where a particle was wrapped back exactly onto + * the edge because of rounding issues (more accuracy around 0 + * than around dim) */ + if (pos_x == dim_x) pos_x = 0.0; + if (pos_y == dim_y) pos_y = 0.0; + if (pos_z == dim_z) pos_z = 0.0; /* Get its cell index */ const int index = @@ -2338,9 +2345,16 @@ void space_gparts_get_cell_index_mapper(void *map_data, int nr_gparts, #endif /* Put it back into the simulation volume */ - const double pos_x = box_wrap(old_pos_x, 0.0, dim_x); - const double pos_y = box_wrap(old_pos_y, 0.0, dim_y); - const double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + double pos_x = box_wrap(old_pos_x, 0.0, dim_x); + double pos_y = box_wrap(old_pos_y, 0.0, dim_y); + double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + + /* Treat the case where a particle was wrapped back exactly onto + * the edge because of rounding issues (more accuracy around 0 + * than around dim) */ + if (pos_x == dim_x) pos_x = 0.0; + if (pos_y == dim_y) pos_y = 0.0; + if (pos_z == dim_z) pos_z = 0.0; /* Get its cell index */ const int index = @@ -2477,9 +2491,16 @@ void space_sparts_get_cell_index_mapper(void *map_data, int nr_sparts, #endif /* Put it back into the simulation volume */ - const double pos_x = box_wrap(old_pos_x, 0.0, dim_x); - const double pos_y = box_wrap(old_pos_y, 0.0, dim_y); - const double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + double pos_x = box_wrap(old_pos_x, 0.0, dim_x); + double pos_y = box_wrap(old_pos_y, 0.0, dim_y); + double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + + /* Treat the case where a particle was wrapped back exactly onto + * the edge because of rounding issues (more accuracy around 0 + * than around dim) */ + if (pos_x == dim_x) pos_x = 0.0; + if (pos_y == dim_y) pos_y = 0.0; + if (pos_z == dim_z) pos_z = 0.0; /* Get its cell index */ const int index = @@ -2612,9 +2633,16 @@ void space_bparts_get_cell_index_mapper(void *map_data, int nr_bparts, #endif /* Put it back into the simulation volume */ - const double pos_x = box_wrap(old_pos_x, 0.0, dim_x); - const double pos_y = box_wrap(old_pos_y, 0.0, dim_y); - const double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + double pos_x = box_wrap(old_pos_x, 0.0, dim_x); + double pos_y = box_wrap(old_pos_y, 0.0, dim_y); + double pos_z = box_wrap(old_pos_z, 0.0, dim_z); + + /* Treat the case where a particle was wrapped back exactly onto + * the edge because of rounding issues (more accuracy around 0 + * than around dim) */ + if (pos_x == dim_x) pos_x = 0.0; + if (pos_y == dim_y) pos_y = 0.0; + if (pos_z == dim_z) pos_z = 0.0; /* Get its cell index */ const int index =