diff --git a/src/engine.c b/src/engine.c index 55a1f1d6081fe8c114ca39202a9d3bef5d02fc10..a03df1594281df8ace8d110bad135531374da3b1 100644 --- a/src/engine.c +++ b/src/engine.c @@ -37,6 +37,7 @@ /* MPI headers. */ #ifdef WITH_MPI + #include <mpi.h> #endif @@ -1113,8 +1114,7 @@ void engine_allocate_foreign_particles(struct engine *e) { /* Allocate space for the foreign particles we will receive */ if (count_parts_in > s->size_parts_foreign) { - if (s->parts_foreign != NULL) - swift_free("sparts_foreign", s->parts_foreign); + if (s->parts_foreign != NULL) swift_free("parts_foreign", s->parts_foreign); s->size_parts_foreign = engine_foreign_alloc_margin * count_parts_in; if (swift_memalign("parts_foreign", (void **)&s->parts_foreign, part_align, sizeof(struct part) * s->size_parts_foreign) != 0) @@ -4687,6 +4687,13 @@ void engine_clean(struct engine *e, const int fof) { scheduler_clean(&e->sched); space_clean(e->s); threadpool_clean(&e->threadpool); +#if defined(WITH_MPI) + for (int i = 0; i < e->nr_proxies; ++i) { + proxy_clean(&e->proxies[i]); + } + free(e->proxy_ind); + free(e->proxies); +#endif /* Close files */ if (!fof && e->nodeID == 0) { diff --git a/src/proxy.c b/src/proxy.c index 4e7e979a68c311ecdde7d36f214a6d5dcded4f5e..0cd524ee5e6ff9f3b001798e356e795547b909af 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -983,6 +983,29 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) { p->nr_bparts_out = 0; } +/** + * @brief Free the memory allocated by a #proxy + */ +void proxy_clean(struct proxy *p) { + + free(p->cells_in); + free(p->cells_out); + free(p->cells_in_type); + free(p->cells_out_type); + swift_free("pcells_in", p->pcells_in); + swift_free("pcells_out", p->pcells_out); + swift_free("parts_out", p->parts_out); + swift_free("xparts_out", p->xparts_out); + swift_free("gparts_out", p->gparts_out); + swift_free("sparts_out", p->sparts_out); + swift_free("bparts_out", p->bparts_out); + swift_free("parts_in", p->parts_in); + swift_free("xparts_in", p->xparts_in); + swift_free("gparts_in", p->gparts_in); + swift_free("sparts_in", p->sparts_in); + swift_free("bparts_in", p->bparts_in); +} + /** * @brief Registers the MPI types for the proxy cells. */ diff --git a/src/proxy.h b/src/proxy.h index c59c8ff84356188ab7935ab2151f1c8075045095..ec2482ee1ee27b0199337bc45c04530c37ce8b17 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -98,6 +98,7 @@ struct proxy { /* Function prototypes. */ void proxy_init(struct proxy *p, int mynodeID, int nodeID); +void proxy_clean(struct proxy *p); void proxy_parts_load(struct proxy *p, const struct part *parts, const struct xpart *xparts, int N); void proxy_gparts_load(struct proxy *p, const struct gpart *gparts, int N); diff --git a/src/space.c b/src/space.c index 4d283309034b31cfda1b52be2d19060bf1579595..61bce1394729a6c325c9e64a08c86394a6dd359a 100644 --- a/src/space.c +++ b/src/space.c @@ -5462,6 +5462,12 @@ void space_clean(struct space *s) { swift_free("gparts", s->gparts); swift_free("sparts", s->sparts); swift_free("bparts", s->bparts); +#ifdef WITH_MPI + swift_free("parts_foreign", s->parts_foreign); + swift_free("sparts_foreign", s->sparts_foreign); + swift_free("gparts_foreign", s->gparts_foreign); + swift_free("bparts_foreign", s->bparts_foreign); +#endif } /**