diff --git a/src/engine.c b/src/engine.c index 030a724bef781d53eefa10a13f10df5ec982afb6..993c6fe49a121481f9c4329f637e65a7e59ffb86 100644 --- a/src/engine.c +++ b/src/engine.c @@ -3360,11 +3360,9 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs, /* Recover the (integer) end of the next time-step */ engine_collect_timestep_and_rebuild(e, 1); - /* Check if any particles have the same position and see if we need to - * correct the top-level cell h_max to match possible particle updates in - * the ghost tasks. Note this must be followed by a rebuild as sub-cells - * will not be updated until that is done. */ - if (s->cells_top != NULL && s->nr_parts > 0) { + /* Check if any particles have the same position. This is not + * allowed (/0) so we abort.*/ + if (s->nr_parts > 0) { /* Sorting should put the same positions next to each other... */ int failed = 0; @@ -3373,15 +3371,44 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs, if (prev_x[0] == s->parts[k].x[0] && prev_x[1] == s->parts[k].x[1] && prev_x[2] == s->parts[k].x[2]) { - message("Two particles occupy location: %f %f %f", - prev_x[0], prev_x[1], prev_x[2]); - failed = 1; + if (e->verbose) + message("Two particles occupy location: %f %f %f", + prev_x[0], prev_x[1], prev_x[2]); + failed++; } prev_x = s->parts[k].x; } - if (failed) - error("Cannot have particles with the same locations"); + if (failed > 0) + error("Have %d particle pairs with the same locations.\n" + "Cannot continue", failed); + } + + /* Also check any gparts. This is not supposed to be fatal so only warn. */ + if (s->nr_gparts > 0) { + int failed = 0; + double *prev_x = s->gparts[0].x; + for (size_t k = 1; k < s->nr_gparts; k++) { + if (prev_x[0] == s->gparts[k].x[0] && + prev_x[1] == s->gparts[k].x[1] && + prev_x[2] == s->gparts[k].x[2]) { + if (e->verbose) + message("Two gparts occupy location: %f %f %f / %f %f %f", + prev_x[0], prev_x[1], prev_x[2], + s->gparts[k].x[0], s->gparts[k].x[1], s->gparts[k].x[2] ); + failed++; + } + prev_x = s->gparts[k].x; + } + if (failed > 0) + message("WARNING: found %d gpart pairs at the same location. " + "That is not optimal", failed); + } + /* Check the top-level cell h_max matches the particles as these can be + * updated in the the ghost tasks (only a problem if the ICs estimates for h + * are too small). Note this must be followed by a rebuild as sub-cells will + * not be updated until that is done. */ + if (s->cells_top != NULL && s->nr_parts > 0) { for (int i = 0; i < s->nr_cells; i++) { struct cell *c = &s->cells_top[i]; if (c->nodeID == engine_rank) { @@ -3393,6 +3420,7 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs, } } } + clocks_gettime(&time2); #ifdef SWIFT_DEBUG_CHECKS