From 7fb2e6069b9b22504ac03bf09fcc94e7ff2540f7 Mon Sep 17 00:00:00 2001
From: Stuart Mcalpine <s.r.mcalpine@durham.ac.uk>
Date: Wed, 31 Jul 2019 18:47:45 +0100
Subject: [PATCH] Now you can only run with invoke_stf is you don't have
 duplicate time entries between the snapshots and stf output lists

---
 src/engine.c     | 14 +++++++++-----
 src/outputlist.c | 17 +++++++++++++++++
 src/outputlist.h |  2 ++
 3 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/src/engine.c b/src/engine.c
index c28d915251..1d4ad74a71 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -5442,11 +5442,15 @@ void engine_config(int restart, int fof, struct engine *e,
               "simulation start a=%e.",
               e->a_first_stf_output, e->cosmology->a_begin);
 
-        if (e->snapshot_invoke_stf && e->output_list_stf)
-          error("Cannot run with invoke_stf alongside StructureFinding: "
-                "output_list.\nCan run either with invoke_stf using the Snapshots: "
-                "output_list or by having Snapshots: output_list and "
-                "StructureFinding:output_list both defined.");
+        if ((e->snapshot_invoke_stf && e->output_list_stf &&
+             e->output_list_snapshots) &&
+            (output_list_check_duplicates(e->output_list_snapshots,
+                                          e->output_list_stf)))
+            error("Cannot have duplicate time entries between "
+                  "StructureFinding:output_list and "
+                  "Snapshots:output_list when Snapshots:invoke_stf "
+                  "is selected.");
+
       }
 
       if (e->policy & engine_policy_fof) {
diff --git a/src/outputlist.c b/src/outputlist.c
index 8e2a262419..7e742a07c3 100644
--- a/src/outputlist.c
+++ b/src/outputlist.c
@@ -314,3 +314,20 @@ void output_list_struct_restore(struct output_list *list, FILE *stream) {
   restart_read_blocks(list->times, list->size, sizeof(double), stream, NULL,
                       "times");
 }
+
+/**
+ * @brief Check if there are duplicate times between two output lists
+ *
+ * @param list_a The first #output_list.
+ * @param list_b THe second #output_list.
+ */
+int output_list_check_duplicates(const struct output_list *list_a,
+                                 const struct output_list *list_b) {
+
+  for (size_t ind_a=0; ind_a < list_a->size; ind_a++) {
+    for (size_t ind_b=0; ind_b < list_a->size; ind_b++) {
+      if (list_a->times[ind_a] == list_b->times[ind_b]) return 1;
+    }
+  }
+  return 0;
+}
diff --git a/src/outputlist.h b/src/outputlist.h
index 441c404831..8ca6bc6fec 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -64,5 +64,7 @@ void output_list_print(const struct output_list *outputlist);
 void output_list_clean(struct output_list **outputlist);
 void output_list_struct_dump(struct output_list *list, FILE *stream);
 void output_list_struct_restore(struct output_list *list, FILE *stream);
+int output_list_check_duplicates(const struct output_list *list_a,
+                                 const struct output_list *list_b);
 
 #endif /* SWIFT_OUTPUT_LIST_H */
-- 
GitLab