From d550e36d6d5ad2e8dda9115fcadbe7480e8ba1af Mon Sep 17 00:00:00 2001
From: loikki <loic.hausammann@protonmail.ch>
Date: Sun, 20 Oct 2019 20:26:23 +0200
Subject: [PATCH] Task order: implement GEAR and EAGLE order

---
 src/cell.c                        | 22 +++++++++++++------
 src/engine_maketasks.c            | 17 +++++++++------
 src/engine_marktasks.c            | 19 +++++++++++-----
 src/task_order.h                  |  4 ++++
 src/task_order/EAGLE/task_order.h | 36 +++++++++++++++++++++++++++++++
 src/task_order/GEAR/task_order.h  | 36 +++++++++++++++++++++++++++++++
 src/task_order/none/task_order.h  |  2 +-
 7 files changed, 117 insertions(+), 19 deletions(-)

diff --git a/src/cell.c b/src/cell.c
index 6dee61ecc9..53806e9a9d 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -2477,7 +2477,7 @@ void cell_activate_star_formation_tasks(struct cell *c, struct scheduler *s) {
   scheduler_activate(s, c->hydro.star_formation);
 
   /* Activate the star resort tasks at whatever level they are */
-  if (task_order_need_resort_stars) {
+  if (task_order_star_formation_before_feedback) {
     cell_activate_star_resort_tasks(c, s);
   }
 }
@@ -3461,12 +3461,16 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) {
         /* Propagating new star counts? */
         if (with_star_formation && with_feedback) {
           if (ci_active && ci->hydro.count > 0) {
-            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_sf_counts);
+            if (task_order_star_formation_before_feedback) {
+              scheduler_activate_recv(s, ci->mpi.recv, task_subtype_sf_counts);
+            }
             scheduler_activate_recv(s, ci->mpi.recv, task_subtype_tend_spart);
           }
           if (cj_active && cj->hydro.count > 0) {
-            scheduler_activate_send(s, cj->mpi.send, task_subtype_sf_counts,
-                                    ci_nodeID);
+            if (task_order_star_formation_before_feedback) {
+              scheduler_activate_send(s, cj->mpi.send, task_subtype_sf_counts,
+                                      ci_nodeID);
+            }
             scheduler_activate_send(s, cj->mpi.send, task_subtype_tend_spart,
                                     ci_nodeID);
           }
@@ -3526,12 +3530,16 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) {
         /* Propagating new star counts? */
         if (with_star_formation && with_feedback) {
           if (cj_active && cj->hydro.count > 0) {
-            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_sf_counts);
+            if (task_order_star_formation_before_feedback) {
+              scheduler_activate_recv(s, cj->mpi.recv, task_subtype_sf_counts);
+            }
             scheduler_activate_recv(s, cj->mpi.recv, task_subtype_tend_spart);
           }
           if (ci_active && ci->hydro.count > 0) {
-            scheduler_activate_send(s, ci->mpi.send, task_subtype_sf_counts,
-                                    cj_nodeID);
+            if (task_order_star_formation_before_feedback) {
+              scheduler_activate_send(s, ci->mpi.send, task_subtype_sf_counts,
+                                      cj_nodeID);
+            }
             scheduler_activate_send(s, ci->mpi.send, task_subtype_tend_spart,
                                     cj_nodeID);
           }
diff --git a/src/engine_maketasks.c b/src/engine_maketasks.c
index a210746489..e2f6b68e38 100644
--- a/src/engine_maketasks.c
+++ b/src/engine_maketasks.c
@@ -258,7 +258,8 @@ void engine_addtasks_send_stars(struct engine *e, struct cell *ci,
   /* Early abort (are we below the level where tasks are)? */
   if (!cell_get_flag(ci, cell_flag_has_tasks)) return;
 
-  if (t_sf_counts == NULL && with_star_formation && ci->hydro.count > 0) {
+  if (task_order_star_formation_before_feedback &&
+      t_sf_counts == NULL && with_star_formation && ci->hydro.count > 0) {
 #ifdef SWIFT_DEBUG_CHECKS
     if (ci->depth != 0)
       error(
@@ -306,7 +307,8 @@ void engine_addtasks_send_stars(struct engine *e, struct cell *ci,
 
     engine_addlink(e, &ci->mpi.send, t_feedback);
     engine_addlink(e, &ci->mpi.send, t_ti);
-    if (with_star_formation && ci->hydro.count > 0) {
+    if (task_order_star_formation_before_feedback &&
+        with_star_formation && ci->hydro.count > 0) {
       engine_addlink(e, &ci->mpi.send, t_sf_counts);
     }
   }
@@ -552,7 +554,8 @@ void engine_addtasks_recv_stars(struct engine *e, struct cell *c,
   /* Early abort (are we below the level where tasks are)? */
   if (!cell_get_flag(c, cell_flag_has_tasks)) return;
 
-  if (t_sf_counts == NULL && with_star_formation && c->hydro.count > 0) {
+  if (task_order_star_formation_before_feedback &&
+      t_sf_counts == NULL && with_star_formation && c->hydro.count > 0) {
 #ifdef SWIFT_DEBUG_CHECKS
     if (c->depth != 0)
       error(
@@ -579,7 +582,8 @@ void engine_addtasks_recv_stars(struct engine *e, struct cell *c,
     t_ti = scheduler_addtask(s, task_type_recv, task_subtype_tend_spart,
                              c->mpi.tag, 0, c, NULL);
 
-    if (with_star_formation && c->hydro.count > 0) {
+    if (task_order_star_formation_before_feedback &&
+        with_star_formation && c->hydro.count > 0) {
 
       /* Receive the stars only once the counts have been received */
       scheduler_addunlock(s, t_sf_counts, t_feedback);
@@ -589,7 +593,8 @@ void engine_addtasks_recv_stars(struct engine *e, struct cell *c,
   if (t_feedback != NULL) {
     engine_addlink(e, &c->mpi.recv, t_feedback);
     engine_addlink(e, &c->mpi.recv, t_ti);
-    if (with_star_formation && c->hydro.count > 0) {
+    if (task_order_star_formation_before_feedback &&
+        with_star_formation && c->hydro.count > 0) {
       engine_addlink(e, &c->mpi.recv, t_sf_counts);
     }
 
@@ -1023,7 +1028,7 @@ void engine_make_hierarchical_tasks_hydro(struct engine *e, struct cell *c,
   /* Are we are the level where we create the stars' resort tasks?
    * If the tree is shallow, we need to do this at the super-level if the
    * super-level is above the level we want */
-  if (task_order_need_resort_stars &&
+  if (task_order_star_formation_before_feedback &&
       (c->nodeID == e->nodeID) && (star_resort_cell == NULL) &&
       (c->depth == engine_star_resort_task_depth || c->hydro.super == c)) {
 
diff --git a/src/engine_marktasks.c b/src/engine_marktasks.c
index 7f4e2d4c4b..220b52ceb9 100644
--- a/src/engine_marktasks.c
+++ b/src/engine_marktasks.c
@@ -51,6 +51,7 @@
 #include "debug.h"
 #include "error.h"
 #include "proxy.h"
+#include "task_order.h"
 #include "timers.h"
 
 /**
@@ -515,12 +516,16 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
           /* Propagating new star counts? */
           if (with_star_formation && with_feedback) {
             if (ci_active_hydro && ci->hydro.count > 0) {
-              scheduler_activate_recv(s, ci->mpi.recv, task_subtype_sf_counts);
+              if (task_order_star_formation_before_feedback) {
+                scheduler_activate_recv(s, ci->mpi.recv, task_subtype_sf_counts);
+              }
               scheduler_activate_recv(s, ci->mpi.recv, task_subtype_tend_spart);
             }
             if (cj_active_hydro && cj->hydro.count > 0) {
-              scheduler_activate_send(s, cj->mpi.send, task_subtype_sf_counts,
+              if (task_order_star_formation_before_feedback) {
+                scheduler_activate_send(s, cj->mpi.send, task_subtype_sf_counts,
                                       ci_nodeID);
+              }
               scheduler_activate_send(s, cj->mpi.send, task_subtype_tend_spart,
                                       ci_nodeID);
             }
@@ -576,12 +581,16 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
           /* Propagating new star counts? */
           if (with_star_formation && with_feedback) {
             if (cj_active_hydro && cj->hydro.count > 0) {
-              scheduler_activate_recv(s, cj->mpi.recv, task_subtype_sf_counts);
+              if (task_order_star_formation_before_feedback) {
+                scheduler_activate_recv(s, cj->mpi.recv, task_subtype_sf_counts);
+              }
               scheduler_activate_recv(s, cj->mpi.recv, task_subtype_tend_spart);
             }
             if (ci_active_hydro && ci->hydro.count > 0) {
-              scheduler_activate_send(s, ci->mpi.send, task_subtype_sf_counts,
-                                      cj_nodeID);
+              if (task_order_star_formation_before_feedback) {
+                scheduler_activate_send(s, ci->mpi.send, task_subtype_sf_counts,
+                                        cj_nodeID);
+              }
               scheduler_activate_send(s, ci->mpi.send, task_subtype_tend_spart,
                                       cj_nodeID);
             }
diff --git a/src/task_order.h b/src/task_order.h
index e1752b79d4..b7aed95dea 100644
--- a/src/task_order.h
+++ b/src/task_order.h
@@ -24,6 +24,10 @@
 
 #ifdef TASK_ORDER_NONE
 #include "task_order/none/task_order.h"
+#elif TASK_ORDER_GEAR
+#include "task_order/GEAR/task_order.h"
+#elif TASK_ORDER_EAGLE
+#include "task_order/EAGLE/task_order.h"
 #else
 #error undefined task order
 #endif
diff --git a/src/task_order/EAGLE/task_order.h b/src/task_order/EAGLE/task_order.h
index e69de29bb2..b33fe0506d 100644
--- a/src/task_order/EAGLE/task_order.h
+++ b/src/task_order/EAGLE/task_order.h
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * This file is part of SWIFT.
+ * Copyright (c) 2019 Loic Hausammann (loic.hausammann@epfl.ch)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ ******************************************************************************/
+
+#ifndef SWIFT_TASK_ORDER_NONE_H
+#define SWIFT_TASK_ORDER_NONE_H
+
+#include "cell.h"
+
+#define task_order_star_formation_before_feedback 1
+
+
+__attribute__((always_inline)) INLINE static void task_order_addunlock_star_formation_feedback(
+    struct scheduler *s, struct cell *c, struct cell *star_resort_cell) {
+
+  scheduler_addunlock(s, star_resort_cell->hydro.stars_resort,
+                      c->stars.stars_in);
+
+}
+
+#endif // SWIFT_TASK_ORDER_NONE_H
diff --git a/src/task_order/GEAR/task_order.h b/src/task_order/GEAR/task_order.h
index e69de29bb2..9b5eba329c 100644
--- a/src/task_order/GEAR/task_order.h
+++ b/src/task_order/GEAR/task_order.h
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * This file is part of SWIFT.
+ * Copyright (c) 2019 Loic Hausammann (loic.hausammann@epfl.ch)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ ******************************************************************************/
+
+#ifndef SWIFT_TASK_ORDER_GEAR_H
+#define SWIFT_TASK_ORDER_GEAR_H
+
+#include "cell.h"
+
+#define task_order_star_formation_before_feedback 0
+
+
+__attribute__((always_inline)) INLINE static void task_order_addunlock_star_formation_feedback(
+    struct scheduler *s, struct cell *c, struct cell *star_resort_cell) {
+
+  scheduler_addunlock(s, c->stars.stars_out,
+                      c->top->hydro.star_formation);
+
+}
+
+#endif // SWIFT_TASK_ORDER_GEAR_H
diff --git a/src/task_order/none/task_order.h b/src/task_order/none/task_order.h
index 97f6d1140c..b33fe0506d 100644
--- a/src/task_order/none/task_order.h
+++ b/src/task_order/none/task_order.h
@@ -22,7 +22,7 @@
 
 #include "cell.h"
 
-#define task_order_need_resort_stars 1
+#define task_order_star_formation_before_feedback 1
 
 
 __attribute__((always_inline)) INLINE static void task_order_addunlock_star_formation_feedback(
-- 
GitLab