From 73d4e5db66fe4f387fb9448dc875b3e98e3baf9c Mon Sep 17 00:00:00 2001 From: Matthieu Schaller <schaller@strw.leidenuniv.nl> Date: Thu, 11 Jan 2018 18:03:35 +0100 Subject: [PATCH] Sort particles consistently between edges. --- src/cell.c | 52 +++++++++++++++++++++++++------------------------- src/debug.c | 7 ++++--- src/periodic.h | 2 +- src/space.c | 36 +++++++++++++++++++++++++++++++--- 4 files changed, 64 insertions(+), 33 deletions(-) diff --git a/src/cell.c b/src/cell.c index 488637599f..a36b8fd2fd 100644 --- a/src/cell.c +++ b/src/cell.c @@ -803,8 +803,8 @@ void cell_split(struct cell *c, ptrdiff_t parts_offset, ptrdiff_t sparts_offset, /* Fill the buffer with the indices. */ for (int k = 0; k < count; k++) { - const int bid = (buff[k].x[0] > pivot[0]) * 4 + - (buff[k].x[1] > pivot[1]) * 2 + (buff[k].x[2] > pivot[2]); + const int bid = (buff[k].x[0] >= pivot[0]) * 4 + + (buff[k].x[1] >= pivot[1]) * 2 + (buff[k].x[2] >= pivot[2]); bucket_count[bid]++; buff[k].ind = bid; } @@ -876,44 +876,44 @@ void cell_split(struct cell *c, ptrdiff_t parts_offset, ptrdiff_t sparts_offset, /* Verify a few sub-cells. */ for (int k = 0; k < c->progeny[0]->count; k++) - if (c->progeny[0]->parts[k].x[0] > pivot[0] || - c->progeny[0]->parts[k].x[1] > pivot[1] || - c->progeny[0]->parts[k].x[2] > pivot[2]) + if (c->progeny[0]->parts[k].x[0] >= pivot[0] || + c->progeny[0]->parts[k].x[1] >= pivot[1] || + c->progeny[0]->parts[k].x[2] >= pivot[2]) error("Sorting failed (progeny=0)."); for (int k = 0; k < c->progeny[1]->count; k++) - if (c->progeny[1]->parts[k].x[0] > pivot[0] || - c->progeny[1]->parts[k].x[1] > pivot[1] || - c->progeny[1]->parts[k].x[2] <= pivot[2]) + if (c->progeny[1]->parts[k].x[0] >= pivot[0] || + c->progeny[1]->parts[k].x[1] >= pivot[1] || + c->progeny[1]->parts[k].x[2] < pivot[2]) error("Sorting failed (progeny=1)."); for (int k = 0; k < c->progeny[2]->count; k++) - if (c->progeny[2]->parts[k].x[0] > pivot[0] || - c->progeny[2]->parts[k].x[1] <= pivot[1] || - c->progeny[2]->parts[k].x[2] > pivot[2]) + if (c->progeny[2]->parts[k].x[0] >= pivot[0] || + c->progeny[2]->parts[k].x[1] < pivot[1] || + c->progeny[2]->parts[k].x[2] >= pivot[2]) error("Sorting failed (progeny=2)."); for (int k = 0; k < c->progeny[3]->count; k++) - if (c->progeny[3]->parts[k].x[0] > pivot[0] || - c->progeny[3]->parts[k].x[1] <= pivot[1] || - c->progeny[3]->parts[k].x[2] <= pivot[2]) + if (c->progeny[3]->parts[k].x[0] >= pivot[0] || + c->progeny[3]->parts[k].x[1] < pivot[1] || + c->progeny[3]->parts[k].x[2] < pivot[2]) error("Sorting failed (progeny=3)."); for (int k = 0; k < c->progeny[4]->count; k++) - if (c->progeny[4]->parts[k].x[0] <= pivot[0] || - c->progeny[4]->parts[k].x[1] > pivot[1] || - c->progeny[4]->parts[k].x[2] > pivot[2]) + if (c->progeny[4]->parts[k].x[0] < pivot[0] || + c->progeny[4]->parts[k].x[1] >= pivot[1] || + c->progeny[4]->parts[k].x[2] >= pivot[2]) error("Sorting failed (progeny=4)."); for (int k = 0; k < c->progeny[5]->count; k++) - if (c->progeny[5]->parts[k].x[0] <= pivot[0] || - c->progeny[5]->parts[k].x[1] > pivot[1] || - c->progeny[5]->parts[k].x[2] <= pivot[2]) + if (c->progeny[5]->parts[k].x[0] < pivot[0] || + c->progeny[5]->parts[k].x[1] >= pivot[1] || + c->progeny[5]->parts[k].x[2] < pivot[2]) error("Sorting failed (progeny=5)."); for (int k = 0; k < c->progeny[6]->count; k++) - if (c->progeny[6]->parts[k].x[0] <= pivot[0] || - c->progeny[6]->parts[k].x[1] <= pivot[1] || - c->progeny[6]->parts[k].x[2] > pivot[2]) + if (c->progeny[6]->parts[k].x[0] < pivot[0] || + c->progeny[6]->parts[k].x[1] < pivot[1] || + c->progeny[6]->parts[k].x[2] >= pivot[2]) error("Sorting failed (progeny=6)."); for (int k = 0; k < c->progeny[7]->count; k++) - if (c->progeny[7]->parts[k].x[0] <= pivot[0] || - c->progeny[7]->parts[k].x[1] <= pivot[1] || - c->progeny[7]->parts[k].x[2] <= pivot[2]) + if (c->progeny[7]->parts[k].x[0] < pivot[0] || + c->progeny[7]->parts[k].x[1] < pivot[1] || + c->progeny[7]->parts[k].x[2] < pivot[2]) error("Sorting failed (progeny=7)."); #endif diff --git a/src/debug.c b/src/debug.c index f63ed557d9..067ca156e7 100644 --- a/src/debug.c +++ b/src/debug.c @@ -224,10 +224,11 @@ int checkCellhdxmax(const struct cell *c, int *depth) { struct part *const p = &parts[k]; struct xpart *const xp = &xparts[k]; - if (p->x[0] < loc_min[0] || p->x[0] > loc_max[0] || p->x[1] < loc_min[1] || - p->x[1] > loc_max[1] || p->x[2] < loc_min[2] || p->x[2] > loc_max[2]) { + if (p->x[0] < loc_min[0] || p->x[0] >= loc_max[0] || + p->x[1] < loc_min[1] || p->x[1] >= loc_max[1] || + p->x[2] < loc_min[2] || p->x[2] >= loc_max[2]) { - message( + error( "Inconsistent part position p->x=[%e %e %e], c->loc=[%e %e %e] " "c->width=[%e %e %e]", p->x[0], p->x[1], p->x[2], c->loc[0], c->loc[1], c->loc[2], diff --git a/src/periodic.h b/src/periodic.h index 5874b8742e..ba34534a4c 100644 --- a/src/periodic.h +++ b/src/periodic.h @@ -36,7 +36,7 @@ const __typeof__(x) _x = (x); \ const __typeof__(a) _a = (a); \ const __typeof__(b) _b = (b); \ - _x < _a ? (_x + _b) : ((_x > _b) ? (_x - _b) : _x); \ + _x < _a ? (_x + _b) : ((_x >= _b) ? (_x - _b) : _x);\ }) /** diff --git a/src/space.c b/src/space.c index 02f285edb7..8a07e2e32d 100644 --- a/src/space.c +++ b/src/space.c @@ -1081,7 +1081,11 @@ void space_parts_get_cell_index_mapper(void *map_data, int nr_parts, ind[k] = index; #ifdef SWIFT_DEBUG_CHECKS - if (pos_x > dim_x || pos_y > dim_y || pos_z > pos_z || pos_x < 0. || + if(index < 0 || index > cdim[0] * cdim[1] * cdim[2]) + error("Invalid index=%d cdim=[%d %d %d] p->x=[%e %e %e]", index, + cdim[0], cdim[1], cdim[2], pos_x, pos_y, pos_z); + + if (pos_x >= dim_x || pos_y >= dim_y || pos_z >= dim_z || pos_x < 0. || pos_y < 0. || pos_z < 0.) error("Particle outside of simulation box. p->x=[%e %e %e]", pos_x, pos_y, pos_z); @@ -1138,6 +1142,17 @@ void space_gparts_get_cell_index_mapper(void *map_data, int nr_gparts, cell_getid(cdim, pos_x * ih_x, pos_y * ih_y, pos_z * ih_z); ind[k] = index; +#ifdef SWIFT_DEBUG_CHECKS + if(index < 0 || index > cdim[0] * cdim[1] * cdim[2]) + error("Invalid index=%d cdim=[%d %d %d] p->x=[%e %e %e]", index, + cdim[0], cdim[1], cdim[2], pos_x, pos_y, pos_z); + + if (pos_x >= dim_x || pos_y >= dim_y || pos_z >= dim_z || pos_x < 0. || + pos_y < 0. || pos_z < 0.) + error("Particle outside of simulation box. p->x=[%e %e %e]", pos_x, pos_y, + pos_z); +#endif + /* Update the position */ gp->x[0] = pos_x; gp->x[1] = pos_y; @@ -1189,6 +1204,17 @@ void space_sparts_get_cell_index_mapper(void *map_data, int nr_sparts, cell_getid(cdim, pos_x * ih_x, pos_y * ih_y, pos_z * ih_z); ind[k] = index; +#ifdef SWIFT_DEBUG_CHECKS + if(index < 0 || index > cdim[0] * cdim[1] * cdim[2]) + error("Invalid index=%d cdim=[%d %d %d] p->x=[%e %e %e]", index, + cdim[0], cdim[1], cdim[2], pos_x, pos_y, pos_z); + + if (pos_x >= dim_x || pos_y >= dim_y || pos_z >= dim_z || pos_x < 0. || + pos_y < 0. || pos_z < 0.) + error("Particle outside of simulation box. p->x=[%e %e %e]", pos_x, pos_y, + pos_z); +#endif + /* Update the position */ sp->x[0] = pos_x; sp->x[1] = pos_y; @@ -2609,11 +2635,15 @@ void space_first_init_parts(struct space *s) { p[i].v[1] = p[i].v[2] = 0.f; #endif + double temp = p[i].v[0]; + p[i].v[0] = p[i].v[1]; + p[i].v[1] = temp; + hydro_first_init_part(&p[i], &xp[i]); #ifdef SWIFT_DEBUG_CHECKS - p->ti_drift = 0; - p->ti_kick = 0; + p[i].ti_drift = 0; + p[i].ti_kick = 0; #endif } } -- GitLab