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