From 40edb6353813f7a8aa67efef72cbb159fbf91eb1 Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <gonnet@google.com>
Date: Thu, 17 Mar 2016 21:16:12 +0100
Subject: [PATCH] add utility functions to re-link parts/gparts.

---
 src/part.c | 28 ++++++++++++++++++++++++++++
 src/part.h |  2 ++
 2 files changed, 30 insertions(+)

diff --git a/src/part.c b/src/part.c
index 6a99325ef2..00b90d99f9 100644
--- a/src/part.c
+++ b/src/part.c
@@ -28,6 +28,34 @@
 /* This object's header. */
 #include "part.h"
 
+/**
+ * @brief Re-link the #gparts associated with the list of #parts.
+ *
+ * @param parts The list of #part.
+ * @param N The number of particles to re-link;
+ * @param offset The offset of #parts relative to the global parts list.
+ */
+void part_relink_gparts(struct part *parts, size_t N, ptrdiff_t offset) {
+  for (size_t k = 0; k < N; k++) {
+    parts[k]->gpart->id_or_neg_offset = -(k + offset);
+  }
+}
+
+/**
+ * @brief Re-link the #gparts associated with the list of #parts.
+ *
+ * @param gparts The list of #gpart.
+ * @param N The number of particles to re-link;
+ * @param parts The global part array in which to find the #gpart offsets.
+ */
+void part_relink_parts(struct gpart *gparts, size_t N, struct part *parts) {
+  for (size_t k = 0; k < N; k++) {
+    if (gparts[k].id_or_neg_offset < 0) {
+      parts[-gparts[k].id_or_neg_offset].gpart = &gparts[k];
+    }
+  }
+}
+
 #ifdef WITH_MPI
 /**
  * @brief Registers and returns an MPI type for the particles
diff --git a/src/part.h b/src/part.h
index 865403e8c2..7cd74fada9 100644
--- a/src/part.h
+++ b/src/part.h
@@ -51,6 +51,8 @@
 
 #include "./gravity/Default/gravity_part.h"
 
+void part_relink_gparts(struct parts *parts, size_t N, ptrdiff_t offset);
+void part_relink_parts(struct gparts *parts, size_t N);
 #ifdef WITH_MPI
 void part_create_mpi_type(MPI_Datatype* part_type);
 void xpart_create_mpi_type(MPI_Datatype* xpart_type);
-- 
GitLab