From ce3782b9f49b1d45abc9c2658dfffaacf8b1d034 Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <gonnet@google.com>
Date: Wed, 8 Jun 2016 15:56:54 +0200
Subject: [PATCH] made engine_marktasks serial again for the non-fixdt case.

---
 src/engine.c | 115 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 99 insertions(+), 16 deletions(-)

diff --git a/src/engine.c b/src/engine.c
index 2b88b46eca..a435178acb 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -63,19 +63,11 @@
 #include "single_io.h"
 #include "timers.h"
 
-const char *engine_policy_names[13] = {"none",
-                                       "rand",
-                                       "steal",
-                                       "keep",
-                                       "block",
-                                       "fix_dt",
-                                       "cpu_tight",
-                                       "mpi",
-                                       "numa_affinity",
-                                       "hydro",
-                                       "self_gravity",
-                                       "external_gravity",
-                                       "cosmology_integration"};
+const char *engine_policy_names[13] = {
+    "none",                 "rand",   "steal",        "keep",
+    "block",                "fix_dt", "cpu_tight",    "mpi",
+    "numa_affinity",        "hydro",  "self_gravity", "external_gravity",
+    "cosmology_integration"};
 
 /** The rank of the engine as a global variable (for messages). */
 int engine_rank;
@@ -103,7 +95,7 @@ void engine_addlink(struct engine *e, struct link **l, struct task *t) {
     error("Link table overflow.");
   }
   struct link *res = &e->links[ind];
-  
+
   /* Set it atomically. */
   res->t = t;
   res->next = atomic_swap(l, res);
@@ -1622,6 +1614,96 @@ void engine_marktasks_mapper(void *map_data, void *extra_data) {
     t->skip = 1;
 }
 
+int engine_marktasks_serial(struct engine *e) {
+
+  struct scheduler *s = &e->sched;
+  const int ti_end = e->ti_current;
+  const int nr_tasks = s->nr_tasks;
+  const int *const ind = s->tasks_ind;
+  struct task *tasks = s->tasks;
+
+  /* Run through the tasks and mark as skip or not. */
+  for (int k = 0; k < nr_tasks; k++) {
+
+    /* Get a handle on the kth task. */
+    struct task *t = &tasks[ind[k]];
+
+    /* Sort-task? Note that due to the task ranking, the sorts
+       will all come before the pairs. */
+    if (t->type == task_type_sort) {
+
+      /* Re-set the flags. */
+      t->flags = 0;
+      t->skip = 1;
+
+    }
+
+    /* Single-cell task? */
+    else if (t->type == task_type_self || t->type == task_type_ghost ||
+             (t->type == task_type_sub && t->cj == NULL)) {
+
+      /* Set this task's skip. */
+      t->skip = (t->ci->ti_end_min > ti_end);
+    }
+
+    /* Pair? */
+    else if (t->type == task_type_pair ||
+             (t->type == task_type_sub && t->cj != NULL)) {
+
+      /* Local pointers. */
+      const struct cell *ci = t->ci;
+      const struct cell *cj = t->cj;
+
+      /* Set this task's skip. */
+      t->skip = (ci->ti_end_min > ti_end && cj->ti_end_min > ti_end);
+
+      /* Too much particle movement? */
+      if (t->tight &&
+          (fmaxf(ci->h_max, cj->h_max) + ci->dx_max + cj->dx_max > cj->dmin ||
+           ci->dx_max > space_maxreldx * ci->h_max ||
+           cj->dx_max > space_maxreldx * cj->h_max))
+        return 1;
+
+      /* Set the sort flags. */
+      if (!t->skip && t->type == task_type_pair) {
+        if (!(ci->sorted & (1 << t->flags))) {
+          ci->sorts->flags |= (1 << t->flags);
+          ci->sorts->skip = 0;
+        }
+        if (!(cj->sorted & (1 << t->flags))) {
+          cj->sorts->flags |= (1 << t->flags);
+          cj->sorts->skip = 0;
+        }
+      }
+
+    }
+
+    /* Kick? */
+    else if (t->type == task_type_kick) {
+      t->skip = (t->ci->ti_end_min > ti_end);
+      t->ci->updated = 0;
+      t->ci->g_updated = 0;
+    }
+
+    /* Drift? */
+    else if (t->type == task_type_drift)
+      t->skip = 0;
+
+    /* Init? */
+    else if (t->type == task_type_init) {
+      /* Set this task's skip. */
+      t->skip = (t->ci->ti_end_min > ti_end);
+    }
+
+    /* None? */
+    else if (t->type == task_type_none)
+      t->skip = 1;
+  }
+
+  /* All is well... */
+  return 0;
+}
+
 int engine_marktasks(struct engine *e) {
 
   struct scheduler *s = &e->sched;
@@ -1640,12 +1722,13 @@ int engine_marktasks(struct engine *e) {
   } else {
 
     /* Run through the tasks and mark as skip or not. */
-    int extra_data[2] = {e->ti_current, rebuild_space};
+    /* int extra_data[2] = {e->ti_current, rebuild_space};
     threadpool_map(&e->threadpool, engine_marktasks_sorts_mapper, s->tasks,
                    s->nr_tasks, sizeof(struct task), NULL);
     threadpool_map(&e->threadpool, engine_marktasks_mapper, s->tasks,
                    s->nr_tasks, sizeof(struct task), extra_data);
-    rebuild_space = extra_data[1];
+    rebuild_space = extra_data[1]; */
+    rebuild_space = engine_marktasks_serial(e);
   }
 
   if (e->verbose)
-- 
GitLab