Commit 48782434 authored by Peter W. Draper's avatar Peter W. Draper
Browse files

Add checks for particles that are at same position, this isn't allowed, and...

Add checks for particles that are at same position, this isn't allowed, and update the cell h_max to that of the particles after the initial ghost tasks have ran. This is needed before regridding if the h values of the particles in the IC are set to be smaller than reality (ends up looking like rebuilding failed as the particles are too far outside their cells).
parent 8a7231b8
......@@ -3359,6 +3359,38 @@ 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 cell h_max to match possible particle updates in the ghost
* tasks. */
if (s->cells_top != NULL) {
/* Sorting should put the same positions next to each other... */
int failed = 0;
double *prev_x = s->parts[0].x;
for (size_t k = 1; k < s->nr_parts; k++) {
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;
prev_x = s->parts[k].x;
if (failed)
error("Cannot have particles with the same positions");
for (int i = 0; i < s->nr_cells; i++) {
struct cell *c = &s->cells_top[i];
if (c->nodeID == engine_rank) {
float part_h_max = c->parts[0].h;
for (int k = 1; k < c->count; k++) {
if (c->parts[k].h > part_h_max) part_h_max = c->parts[k].h;
c->h_max = max(part_h_max, c->h_max);
Supports Markdown
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