diff --git a/src/space.c b/src/space.c index 6e3d09f7455e5ea400d98bdbe3bdc096bc9f080f..a4b834b7ef0da488110cb1e2cf3c078c7e3a6bd7 100644 --- a/src/space.c +++ b/src/space.c @@ -436,9 +436,37 @@ void space_regrid(struct space *s, int verbose) { else { /* Otherwise, just clean up the cells. */ /* Free the old cells, if they were allocated. */ - threadpool_map(&s->e->threadpool, space_clear_cells_mapper, s->cells_top, - s->nr_cells, sizeof(struct cell), 100, s); - // space_clear_cells_mapper(s->cells_top, s->nr_cells, s); + for (int k = 0; k < s->nr_cells; k++) { + space_rebuild_recycle(s, &s->cells_top[k]); + s->cells_top[k].sorts = NULL; + s->cells_top[k].nr_tasks = 0; + s->cells_top[k].density = NULL; + s->cells_top[k].gradient = NULL; + s->cells_top[k].force = NULL; + s->cells_top[k].grav = NULL; + s->cells_top[k].dx_max = 0.0f; + s->cells_top[k].sorted = 0; + s->cells_top[k].count = 0; + s->cells_top[k].gcount = 0; + s->cells_top[k].init = NULL; + s->cells_top[k].extra_ghost = NULL; + s->cells_top[k].ghost = NULL; + s->cells_top[k].kick = NULL; + s->cells_top[k].cooling = NULL; + s->cells_top[k].sourceterms = NULL; + s->cells_top[k].super = &s->cells_top[k]; +#if WITH_MPI + s->cells_top[k].recv_xv = NULL; + s->cells_top[k].recv_rho = NULL; + s->cells_top[k].recv_gradient = NULL; + s->cells_top[k].recv_ti = NULL; + + s->cells_top[k].send_xv = NULL; + s->cells_top[k].send_rho = NULL; + s->cells_top[k].send_gradient = NULL; + s->cells_top[k].send_ti = NULL; +#endif + } s->maxdepth = 0; } @@ -673,7 +701,7 @@ void space_rebuild(struct space *s, int verbose) { /* Extract the cell counts from the sorted indices. */ size_t last_gindex = 0; - gind[nr_parts] = s->nr_cells; + gind[nr_gparts] = s->nr_cells; for (size_t k = 0; k < nr_gparts; k++) { if (gind[k] < gind[k + 1]) { cells_top[ind[k]].gcount = k - last_gindex + 1; @@ -1617,17 +1645,26 @@ void space_split_mapper(void *map_data, int num_cells, void *extra_data) { */ void space_recycle(struct space *s, struct cell *c) { + /* Lock the space. */ + lock_lock(&s->lock); + /* Clear the cell. */ if (lock_destroy(&c->lock) != 0) error("Failed to destroy spinlock."); /* Clear this cell's sort arrays. */ if (c->sort != NULL) free(c->sort); + /* Clear the cell data. */ + bzero(c, sizeof(struct cell)); + /* Hook this cell into the buffer. */ - c->next = atomic_swap(&s->cells_sub, c); - atomic_dec(&s->tot_cells); -} + c->next = s->cells_sub; + s->cells_sub = c; + s->tot_cells -= 1; + /* Unlock the space. */ + lock_unlock_blind(&s->lock); +} /** * @brief Get a new empty (sub-)#cell. *