diff --git a/src/cell.c b/src/cell.c index 848176b1370df0c14435dae44b4867211ce34f0a..4e4b36bf0f509b954adee094cc6747224a3ca456 100644 --- a/src/cell.c +++ b/src/cell.c @@ -102,7 +102,7 @@ int cell_link_parts(struct cell *c, struct part *parts) { if (c->nodeID == engine_rank) error("Linking foreign particles in a local cell!"); - if(c->hydro.parts != NULL) + if (c->hydro.parts != NULL) error("Linking parts into a cell that was already linked"); #endif @@ -135,7 +135,7 @@ int cell_link_gparts(struct cell *c, struct gpart *gparts) { if (c->nodeID == engine_rank) error("Linking foreign particles in a local cell!"); - if(c->grav.parts != NULL) + if (c->grav.parts != NULL) error("Linking gparts into a cell that was already linked"); #endif @@ -168,7 +168,7 @@ int cell_link_sparts(struct cell *c, struct spart *sparts) { if (c->nodeID == engine_rank) error("Linking foreign particles in a local cell!"); - if(c->stars.parts != NULL) + if (c->stars.parts != NULL) error("Linking sparts into a cell that was already linked"); #endif @@ -303,7 +303,6 @@ int cell_count_gparts_for_tasks(const struct cell *c) { } } - /** * @brief Pack the data of the given cell and all it's sub-cells. * diff --git a/src/engine.c b/src/engine.c index d89dd6a74fd933657727dba87da84016044bc76b..d48f1b2a203680dd422f1872e286d997da563752 100644 --- a/src/engine.c +++ b/src/engine.c @@ -1756,30 +1756,33 @@ void engine_allocate_foreign_particles(struct engine *e) { const int nr_proxies = e->nr_proxies; struct space *s = e->s; - // ticks tic = getticks(); + ticks tic = getticks(); /* Count the number of particles we need to import and re-allocate the buffer if needed. */ - size_t count_parts_in_old = 0, count_gparts_in_old = 0; - size_t count_parts_in = 0, count_gparts_in = 0; + size_t count_parts_in = 0, count_gparts_in = 0, count_sparts_in = 0; for (int k = 0; k < nr_proxies; k++) { for (int j = 0; j < e->proxies[k].nr_cells_in; j++) { if (e->proxies[k].cells_in_type[j] & proxy_cell_type_hydro) { - count_parts_in_old += e->proxies[k].cells_in[j]->hydro.count; count_parts_in += cell_count_parts_for_tasks(e->proxies[k].cells_in[j]); } if (e->proxies[k].cells_in_type[j] & proxy_cell_type_gravity) { - count_gparts_in_old += e->proxies[k].cells_in[j]->grav.count; - count_gparts_in += cell_count_gparts_for_tasks(e->proxies[k].cells_in[j]); + count_gparts_in += + cell_count_gparts_for_tasks(e->proxies[k].cells_in[j]); } + /* For stars, we just use the numbers in the top-level cells */ + count_sparts_in += e->proxies[k].cells_in[j]->stars.count; } } - message("New parts count: %zd old parts count: %zd", count_parts_in, count_parts_in_old); - message("New gparts count: %zd old gparts count: %zd", count_gparts_in, count_gparts_in_old); + if (e->verbose) + message("Counting number of foreign particles took %.3f %s.", + clocks_from_ticks(getticks() - tic), clocks_getunit()); + + tic = getticks(); /* Allocate space for the foreign particles we will receive */ if (count_parts_in > s->size_parts_foreign) { @@ -1797,90 +1800,56 @@ void engine_allocate_foreign_particles(struct engine *e) { sizeof(struct gpart) * s->size_gparts_foreign) != 0) error("Failed to allocate foreign gpart data."); } + /* Allocate space for the foreign particles we will receive */ + if (count_sparts_in > s->size_sparts_foreign) { + if (s->sparts_foreign != NULL) free(s->sparts_foreign); + s->size_sparts_foreign = 1.1 * count_sparts_in; + if (posix_memalign((void **)&s->sparts_foreign, part_align, + sizeof(struct spart) * s->size_sparts_foreign) != 0) + error("Failed to allocate foreign spart data."); + } + + if (e->verbose) + message("Allocating memory for foreign particles took %.3f %s.", + clocks_from_ticks(getticks() - tic), clocks_getunit()); + tic = getticks(); + + /* Unpack the cells and link to the particle data. */ struct part *parts = s->parts_foreign; struct gpart *gparts = s->gparts_foreign; - size_t total_count_parts = 0; - size_t total_count_gparts = 0; + struct spart *sparts = s->sparts_foreign; for (int k = 0; k < nr_proxies; k++) { for (int j = 0; j < e->proxies[k].nr_cells_in; j++) { if (e->proxies[k].cells_in_type[j] & proxy_cell_type_hydro) { - const size_t count_parts = cell_link_foreign_parts(e->proxies[k].cells_in[j], parts); + const size_t count_parts = + cell_link_foreign_parts(e->proxies[k].cells_in[j], parts); parts = &parts[count_parts]; - total_count_parts += count_parts; } if (e->proxies[k].cells_in_type[j] & proxy_cell_type_gravity) { - const size_t count_gparts = cell_link_foreign_gparts(e->proxies[k].cells_in[j], gparts); + const size_t count_gparts = + cell_link_foreign_gparts(e->proxies[k].cells_in[j], gparts); gparts = &gparts[count_gparts]; - total_count_gparts += count_gparts; } + + /* For stars, we just use the numbers in the top-level cells */ + cell_link_sparts(e->proxies[k].cells_in[j], sparts); + sparts = &sparts[e->proxies[k].cells_in[j]->stars.count]; } } /* Update the counters */ s->nr_parts_foreign = parts - s->parts_foreign; s->nr_gparts_foreign = gparts - s->gparts_foreign; + s->nr_sparts_foreign = sparts - s->sparts_foreign; - - message("count_parts: %zd %zd", count_parts_in, total_count_parts); - - return; - - /* if (count_gparts_in > s->size_gparts_foreign) { */ - /* if (s->gparts_foreign != NULL) free(s->gparts_foreign); */ - /* s->size_gparts_foreign = 1.1 * count_gparts_in; */ - /* if (posix_memalign((void **)&s->gparts_foreign, gpart_align, */ - /* sizeof(struct gpart) * s->size_gparts_foreign) != 0) - */ - /* error("Failed to allocate foreign gpart data."); */ - /* } */ - /* if (count_sparts_in > s->size_sparts_foreign) { */ - /* if (s->sparts_foreign != NULL) free(s->sparts_foreign); */ - /* s->size_sparts_foreign = 1.1 * count_sparts_in; */ - /* if (posix_memalign((void **)&s->sparts_foreign, spart_align, */ - /* sizeof(struct spart) * s->size_sparts_foreign) != 0) - */ - /* error("Failed to allocate foreign spart data."); */ - /* } */ - - /* if (e->verbose) */ - /* message("Counting and allocating arrays took %.3f %s.", */ - /* clocks_from_ticks(getticks() - tic), clocks_getunit()); */ - - /* tic = getticks(); */ - - /* /\* Unpack the cells and link to the particle data. *\/ */ - /* struct part *parts = s->parts_foreign; */ - /* struct gpart *gparts = s->gparts_foreign; */ - /* struct spart *sparts = s->sparts_foreign; */ - /* for (int k = 0; k < nr_proxies; k++) { */ - /* for (int j = 0; j < e->proxies[k].nr_cells_in; j++) { */ - - /* if (e->proxies[k].cells_in_type[j] & proxy_cell_type_hydro) { */ - /* cell_link_parts(e->proxies[k].cells_in[j], parts); */ - /* parts = &parts[e->proxies[k].cells_in[j]->hydro.count]; */ - /* } */ - - /* if (e->proxies[k].cells_in_type[j] & proxy_cell_type_gravity) { */ - /* cell_link_gparts(e->proxies[k].cells_in[j], gparts); */ - /* gparts = &gparts[e->proxies[k].cells_in[j]->grav.count]; */ - /* } */ - - /* cell_link_sparts(e->proxies[k].cells_in[j], sparts); */ - /* sparts = &sparts[e->proxies[k].cells_in[j]->stars.count]; */ - /* } */ - /* } */ - /* s->nr_parts_foreign = parts - s->parts_foreign; */ - /* s->nr_gparts_foreign = gparts - s->gparts_foreign; */ - /* s->nr_sparts_foreign = sparts - s->sparts_foreign; */ - - /* if (e->verbose) */ - /* message("Recursively linking arrays took %.3f %s.", */ - /* clocks_from_ticks(getticks() - tic), clocks_getunit()); */ + if (e->verbose) + message("Recursively linking arrays took %.3f %s.", + clocks_from_ticks(getticks() - tic), clocks_getunit()); #else error("SWIFT was not compiled with MPI support.");