From 97c99293e32b69ef2cbab43777d4d5016a06a66b Mon Sep 17 00:00:00 2001
From: Matthieu Schaller <schaller@strw.leidenuniv.nl>
Date: Sat, 17 Nov 2018 18:02:19 +0100
Subject: [PATCH] Add the option to skip the drift of all the multipoles.

---
 examples/main.c |  2 +-
 src/engine.c    | 36 +++++++++++++++++++-----------------
 src/engine.h    |  2 +-
 3 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/examples/main.c b/examples/main.c
index 5ae01a9280..ecec9637be 100644
--- a/examples/main.c
+++ b/examples/main.c
@@ -1230,7 +1230,7 @@ int main(int argc, char *argv[]) {
 
   /* Write final output. */
   if (!force_stop) {
-    engine_drift_all(&e);
+    engine_drift_all(&e, /*drift_mpole=*/0);
     engine_print_stats(&e);
 #ifdef WITH_LOGGER
     logger_log_all(e.logger, &e);
diff --git a/src/engine.c b/src/engine.c
index d1b1365323..df2ec2236b 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -2131,7 +2131,7 @@ void engine_prepare(struct engine *e) {
   if (e->forcerepart) {
 
     /* Let's start by drifting everybody to the current time */
-    engine_drift_all(e);
+    engine_drift_all(e, /*drift_mpole=*/0);
     drifted_all = 1;
 
     /* And repartition */
@@ -2143,7 +2143,7 @@ void engine_prepare(struct engine *e) {
   if (e->forcerebuild) {
 
     /* Let's start by drifting everybody to the current time */
-    if (!e->restarting && !drifted_all) engine_drift_all(e);
+    if (!e->restarting && !drifted_all) engine_drift_all(e, /*drift_mpole=*/0);
 
     /* And rebuild */
     engine_rebuild(e, repartitioned, 0);
@@ -2924,7 +2924,7 @@ void engine_step(struct engine *e) {
   e->step_props = engine_step_prop_none;
 
   /* When restarting, move everyone to the current time. */
-  if (e->restarting) engine_drift_all(e);
+  if (e->restarting) engine_drift_all(e, /*drift_mpole=*/1);
 
   /* Get the physical value of the time and time-step size */
   if (e->policy & engine_policy_cosmology) {
@@ -2963,7 +2963,7 @@ void engine_step(struct engine *e) {
 
   /* Are we drifting everything (a la Gadget/GIZMO) ? */
   if (e->policy & engine_policy_drift_all && !e->forcerebuild)
-    engine_drift_all(e);
+    engine_drift_all(e, /*drift_mpole=*/1);
 
   /* Are we reconstructing the multipoles or drifting them ?*/
   if ((e->policy & engine_policy_self_gravity) && !e->forcerebuild) {
@@ -3107,7 +3107,7 @@ void engine_check_for_dumps(struct engine *e) {
         }
 
         /* Drift everyone */
-        engine_drift_all(e);
+        engine_drift_all(e, /*drift_mpole=*/0);
 
         /* Dump everything */
         engine_print_stats(e);
@@ -3131,7 +3131,7 @@ void engine_check_for_dumps(struct engine *e) {
         }
 
         /* Drift everyone */
-        engine_drift_all(e);
+        engine_drift_all(e, /*drift_mpole=*/0);
 
         /* Dump stats */
         engine_print_stats(e);
@@ -3143,7 +3143,7 @@ void engine_check_for_dumps(struct engine *e) {
           e->time = e->ti_next_snapshot * e->time_base + e->time_begin;
 
         /* Drift everyone */
-        engine_drift_all(e);
+        engine_drift_all(e, /*drift_mpole=*/0);
 
         /* Dump snapshot */
 #ifdef WITH_LOGGER
@@ -3166,7 +3166,7 @@ void engine_check_for_dumps(struct engine *e) {
         }
 
         /* Drift everyone */
-        engine_drift_all(e);
+        engine_drift_all(e, /*drift_mpole=*/0);
 
         /* Dump snapshot */
 #ifdef WITH_LOGGER
@@ -3183,7 +3183,7 @@ void engine_check_for_dumps(struct engine *e) {
           e->time = e->ti_next_stats * e->time_base + e->time_begin;
 
         /* Drift everyone */
-        engine_drift_all(e);
+        engine_drift_all(e, /*drift_mpole=*/0);
 
         /* Dump stats */
         engine_print_stats(e);
@@ -3206,7 +3206,7 @@ void engine_check_for_dumps(struct engine *e) {
       }
 
       /* Drift everyone */
-      engine_drift_all(e);
+      engine_drift_all(e, /*drift_mpole=*/0);
 
       /* Dump... */
 #ifdef WITH_LOGGER
@@ -3232,7 +3232,7 @@ void engine_check_for_dumps(struct engine *e) {
       }
 
       /* Drift everyone */
-      engine_drift_all(e);
+      engine_drift_all(e, /*drift_mpole=*/0);
 
       /* Dump */
       engine_print_stats(e);
@@ -3329,7 +3329,7 @@ void engine_dump_restarts(struct engine *e, int drifted_all, int force) {
       restart_remove_previous(e->restart_file);
 
       /* Drift all particles first (may have just been done). */
-      if (!drifted_all) engine_drift_all(e);
+      if (!drifted_all) engine_drift_all(e, /*drift_mpole=*/1);
       restart_write(e, e->restart_file);
 
       if (e->verbose)
@@ -3504,7 +3504,7 @@ void engine_do_drift_all_gpart_mapper(void *map_data, int num_elements,
  * @param extra_data Pointer to an #engine.
  */
 void engine_do_drift_all_multipole_mapper(void *map_data, int num_elements,
-					  void *extra_data) {
+                                          void *extra_data) {
 
   const struct engine *e = (const struct engine *)extra_data;
   const int restarting = e->restarting;
@@ -3545,8 +3545,9 @@ void engine_do_drift_all_multipole_mapper(void *map_data, int num_elements,
  * forward to the current time.
  *
  * @param e The #engine.
+ * @param drift_mpoles Do we want to drift all the multipoles as well?
  */
-void engine_drift_all(struct engine *e) {
+void engine_drift_all(struct engine *e, const int drift_mpoles) {
 
   const ticks tic = getticks();
 
@@ -3575,7 +3576,7 @@ void engine_drift_all(struct engine *e) {
                      e->s->local_cells_top, e->s->nr_local_cells, sizeof(int),
                      /* default chunk */ 0, e);
     }
-    if (e->policy & engine_policy_self_gravity) {
+    if (drift_mpoles && (e->policy & engine_policy_self_gravity)) {
       threadpool_map(&e->threadpool, engine_do_drift_all_multipole_mapper,
                      e->s->local_cells_with_tasks_top,
                      e->s->nr_local_cells_with_tasks, sizeof(int),
@@ -3609,8 +3610,9 @@ void engine_drift_all(struct engine *e) {
 
 #ifdef SWIFT_DEBUG_CHECKS
   /* Check that all cells have been drifted to the current time. */
-  space_check_drift_point(e->s, e->ti_current,
-                          e->policy & engine_policy_self_gravity);
+  space_check_drift_point(
+      e->s, e->ti_current,
+      drift_mpoles && (e->policy & engine_policy_self_gravity));
   part_verify_links(e->s->parts, e->s->gparts, e->s->sparts, e->s->nr_parts,
                     e->s->nr_gparts, e->s->nr_sparts, e->verbose);
 #endif
diff --git a/src/engine.h b/src/engine.h
index 96d90a5e79..eb73dc32d0 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -400,7 +400,7 @@ void engine_compute_next_stf_time(struct engine *e);
 void engine_compute_next_statistics_time(struct engine *e);
 void engine_recompute_displacement_constraint(struct engine *e);
 void engine_unskip(struct engine *e);
-void engine_drift_all(struct engine *e);
+void engine_drift_all(struct engine *e, const int drift_mpoles);
 void engine_drift_top_multipoles(struct engine *e);
 void engine_reconstruct_multipoles(struct engine *e);
 void engine_print_stats(struct engine *e);
-- 
GitLab