diff --git a/src/runner.c b/src/runner.c index 8e08412dea6de4ff2af5d973f611837ce6032a9d..4a769f7620f8ebe767144e4e01a5e80fd5180fb7 100644 --- a/src/runner.c +++ b/src/runner.c @@ -289,6 +289,15 @@ void runner_do_sort_ascending(struct entry *sort, int N) { } } +void runner_check_sorts(struct cell *c, int flags) { + if (flags & ~c->sorted) + error("Inconsistent sort flags (downward)!"); + if (c->split) + for (int k = 0; k < 8; k++) + if (c->progeny[k] != NULL) + runner_check_sorts(c->progeny[k], c->sorted); +} + /** * @brief Sort the particles in the given cell along all cardinal directions. * @@ -312,18 +321,30 @@ void runner_do_sort(struct runner *r, struct cell *c, int flags, int clock) { /* Check that the particles have been moved to the current time */ if (!cell_is_drifted(c, r->e)) error("Sorting un-drifted cell"); + +#ifdef SWIFT_DEBUG_CHECKS + /* Make sure the sort flags are consistent (downward). */ + runner_check_sorts(c, c->sorted); + + /* Make sure the sort flags are consistent (upard). */ + for (struct cell *finger = c->parent; finger != NULL; finger = finger->parent) { + if (finger->sorted & ~c->sorted) + error("Inconsistent sort flags (upward)."); + } +#endif /* Clean-up the flags, i.e. filter out what's already been sorted, but only if the sorts are recent. */ if (c->ti_sort == r->e->ti_current) { - /* Ignore dimensions that have been sorted. */ - flags &= ~c->sorted; + /* Ignore dimensions that have been sorted in this timestep. */ + // flags &= ~c->sorted; } else { /* Clean old (stale) sorts. */ + flags |= c->sorted; c->sorted = 0; } if (flags == 0) return; - + /* start by allocating the entry arrays. */ if (c->sort == NULL || c->sortsize < count) { if (c->sort != NULL) free(c->sort); @@ -336,7 +357,7 @@ void runner_do_sort(struct runner *r, struct cell *c, int flags, int clock) { /* Does this cell have any progeny? */ if (c->split) { - + /* Fill in the gaps within the progeny. */ float dx_max_sort = 0.0f; for (int k = 0; k < 8; k++) { @@ -474,6 +495,15 @@ void runner_do_sort(struct runner *r, struct cell *c, int flags, int clock) { if (finger[k].i >= count) error("Sorting failed, indices borked."); } } + + /* Make sure the sort flags are consistent (downward). */ + runner_check_sorts(c, flags); + + /* Make sure the sort flags are consistent (upward). */ + for (struct cell *finger = c->parent; finger != NULL; finger = finger->parent) { + if (finger->sorted & ~c->sorted) + error("Inconsistent sort flags."); + } #endif if (clock) TIMER_TOC(timer_dosort);