summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrhaas <rhaas@17b73243-c579-4c4c-a9d2-2d5706c11dac>2012-07-16 19:12:39 +0000
committerrhaas <rhaas@17b73243-c579-4c4c-a9d2-2d5706c11dac>2012-07-16 19:12:39 +0000
commite85e80bdb8bf5a32c017c2c89eebaea96b25980b (patch)
treeb0a57474d1ce1834a59692db3726f7f7bb5f2853 /src
parent8c217ff59b154985a8321420968d9803601ee06a (diff)
add parameters to reverse un-enforced Cactus schedule ordering
This patch adds two new parameters to the flesh: * schedule_sort_mode - which affects the order of schedule items before enforcing BEFORE/AFTER * schedule_sort_warnings - which outputs warnings if a schedule item refers to a non-existing item in its BEFORE/AFTER modifiers Neither one is intended to be used in production runs but they are useful for debugging a schedule. schedule_sort_warnings is intended to catch typos in dependency names and when one tries to order with respect to items hidden within a group. It will find a number of false positives for items that are only scheduled based on parameter settings. Eg. MoL's RHS NaN checker. schedule_sort_mode can be used to ensure that the schedule order does not depend on the (semi-random) order that Cactus generates for non-enforced ordering. git-svn-id: http://svn.cactuscode.org/flesh/trunk@4845 17b73243-c579-4c4c-a9d2-2d5706c11dac
Diffstat (limited to 'src')
-rw-r--r--src/param.ccl12
-rw-r--r--src/schedule/Schedule.h2
-rw-r--r--src/schedule/ScheduleCreater.c218
3 files changed, 229 insertions, 3 deletions
diff --git a/src/param.ccl b/src/param.ccl
index 8b6929b7..5746f0bf 100644
--- a/src/param.ccl
+++ b/src/param.ccl
@@ -91,6 +91,18 @@ KEYWORD recovery_mode "How to behave when recovering from a checkpoint" STEERABL
"relaxed" :: "Recover variables if possible, after INITIAL timebins have been scheduled"
} "strict"
+# these options are intended to help debugging schedule files. Do not rely on
+# them to ensure any particular ordering.
+KEYWORD schedule_sort_mode "How to behave when no explicit ordering is prescribed between itemse" STEERABLE=RECOVER
+{
+ "none" :: "no special ordering is enforced"
+ "ascending" :: "sorted alphabetically by thorn name and item name"
+ "descending" :: "sorted in reverse alphabetical order by thorn name and item name"
+} "none"
+
+BOOLEAN schedule_sort_warnings "Output warnings if a schedule item refers to a non-existing item for ordering"
+{
+} "no"
restricted:
diff --git a/src/schedule/Schedule.h b/src/schedule/Schedule.h
index bea93775..1dd8f7b8 100644
--- a/src/schedule/Schedule.h
+++ b/src/schedule/Schedule.h
@@ -44,6 +44,8 @@ cHandledData *CCTKi_DoScheduleGetGroups(void);
typedef enum {sched_item_none, sched_group, sched_function} t_sched_item_type;
+typedef enum {sort_order_none, sort_order_ascending, sort_order_descending} t_sort_order;
+
typedef struct
{
char *name;
diff --git a/src/schedule/ScheduleCreater.c b/src/schedule/ScheduleCreater.c
index 87283600..15913fa7 100644
--- a/src/schedule/ScheduleCreater.c
+++ b/src/schedule/ScheduleCreater.c
@@ -12,9 +12,13 @@
#include <stdlib.h>
#include <string.h>
+#include "cctk.h"
#include "cctk_WarnLevel.h"
+#include "cctk_Parameters.h"
#include "cctk_Flesh.h"
+#include "util_String.h"
+
#include "cctki_Schedule.h"
#include "StoreHandledData.h"
#include "Schedule.h"
@@ -43,9 +47,15 @@ static int ScheduleSortGroup(t_sched_group *group);
static t_sched_modifier_type ScheduleTranslateModifierType(const char *modifier);
+static const char * ScheduleModifierTypeName(t_sched_modifier_type type);
+
static int ScheduleItemNumber(t_sched_group *group,
const char *name);
+static t_sort_order ScheduleTranslateSortOrder(const char *order);
+
+static int ScheduleCompareAscending(const void *a, const void *b);
+static int ScheduleCompareDescending(const void *a, const void *b);
static int ScheduleSetupWhiles(t_sched_item *item);
static int ScheduleSetupIfs(t_sched_item *item);
@@ -693,6 +703,112 @@ static t_sched_modifier_type ScheduleTranslateModifierType(const char *modifier)
}
/*@@
+ @routine ScheduleTranslateSortOrder
+ @date Sun Jul 15 20:29:29 PDT 2012
+ @author Roland Haas
+ @desc
+ Translates a sorting order type from a string to an enum.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+ @var order
+ @vdesc The order string
+ @vtype const char *
+ @vio in
+ @vcomment
+
+ @endvar
+
+ @returntype t_sort_order
+ @returndesc
+ The enumerated sort order.
+ @endreturndesc
+@@*/
+static t_sort_order ScheduleTranslateSortOrder(const char *order)
+{
+ t_sort_order retval;
+
+ if(CCTK_Equals(order, "none"))
+ {
+ retval = sort_order_none;
+ }
+ else if(CCTK_Equals(order, "ascending"))
+ {
+ retval = sort_order_ascending;
+ }
+ else if(CCTK_Equals(order, "descending"))
+ {
+ retval = sort_order_descending;
+ }
+ else
+ {
+ CCTK_VWarn(CCTK_WARN_ABORT, __LINE__, __FILE__, "Cactus",
+ "Unknown sort ordering type '%s'", order);
+ retval = -1; /* NOTREACHED */
+ }
+
+#ifdef DEBUG_SCHEDULAR
+ printf("Translated sort order %s to %d\n", order, retval);
+#endif
+
+ return retval;
+}
+
+
+ /*@@
+ @routine ScheduleModifierTypeName
+ @date Sun Jul 15 18:42:48 PDT 2012
+ @author Roland Haas
+ @desc
+ Translates a modifier type from an enum to a string.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+ @var type
+ @vdesc The modifier type
+ @vtype t_sched_modifier_type
+ @vio in
+ @vcomment
+
+ @endvar
+
+ @returntype const char *
+ @returndesc
+ The named schedule modifier type.
+ @endreturndesc
+@@*/
+static const char *ScheduleModifierTypeName(t_sched_modifier_type type)
+{
+ switch(type)
+ {
+ case sched_before:
+ return "before";
+ break;
+ case sched_after:
+ return "after";
+ break;
+ case sched_while:
+ return "while";
+ break;
+ case sched_if:
+ return "if";
+ break;
+ default:
+ CCTK_VWarn(CCTK_WARN_ABORT, __LINE__, __FILE__, "Cactus",
+ "Internal error: Unknown schedule modifier type %d",
+ (int)type);
+ break;
+ }
+ return NULL; /* NOTREACHED */
+}
+
+ /*@@
@routine ScheduleSortGroup
@date Mon Sep 13 11:30:19 1999
@author Tom Goodale
@@ -729,6 +845,8 @@ static t_sched_modifier_type ScheduleTranslateModifierType(const char *modifier)
@@*/
static int ScheduleSortGroup(t_sched_group *group)
{
+ DECLARE_CCTK_PARAMETERS;
+
int item;
int *order;
int *thisorders;
@@ -738,6 +856,7 @@ static int ScheduleSortGroup(t_sched_group *group)
int mod;
int i;
int errcode;
+ int sort_order;
#ifdef DEBUG_SCHEDULAR
int j;
@@ -747,6 +866,18 @@ static int ScheduleSortGroup(t_sched_group *group)
array = CCTKi_ScheduleCreateArray(group->n_scheditems);
order = CCTKi_ScheduleCreateIVec(group->n_scheditems);
thisorders = CCTKi_ScheduleCreateIVec(group->n_scheditems);
+
+ sort_order = ScheduleTranslateSortOrder(schedule_sort_mode);
+ if(sort_order == sort_order_ascending)
+ {
+ qsort(group->scheditems, group->n_scheditems,
+ sizeof(*group->scheditems), ScheduleCompareAscending);
+ }
+ else if(sort_order == sort_order_descending)
+ {
+ qsort(group->scheditems, group->n_scheditems,
+ sizeof(*group->scheditems), ScheduleCompareDescending);
+ }
for(item=0; item < group->n_scheditems; item++)
{
@@ -761,11 +892,19 @@ static int ScheduleSortGroup(t_sched_group *group)
}
number = ScheduleItemNumber(group, modifier->argument);
-#ifdef DEBUG_SCHEDULAR
- printf("Scheduling against item %d '%s' - mod-type %d\n", number, group->scheditems[number].name, modifier->type);
-#endif
+ if(number < 0 && schedule_sort_warnings)
+ {
+ CCTK_VWarn(CCTK_WARN_ALERT, __LINE__, __FILE__, "Cactus",
+ "Modifier '%s' of schedule item '%s' in group '%s' refers to non-existing item '%s'.",
+ ScheduleModifierTypeName(modifier->type), group->scheditems[item].name,
+ group->name, modifier->argument);
+ }
+
if(number >= 0 && number < group->n_scheditems)
{
+#ifdef DEBUG_SCHEDULAR
+ printf("Scheduling against item %d '%s' - mod-type %d\n", number, group->scheditems[number].name, modifier->type);
+#endif
switch(modifier->type)
{
case sched_before : mod = -1; break;
@@ -1048,6 +1187,79 @@ static int ScheduleSetupIfs(t_sched_item *item)
return retval;
}
+ /*@@
+ @routine ScheduleCompareAscending
+ @date Mon Jul 16 07:27:39 PDT 2012
+ @author Roland Haas
+ @desc
+ Compare two schedule items based on their thorn and routine names
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+ @var a
+ @vdesc The first schedule items to work on
+ @vtype t_sched_item *
+ @vio ino
+ @vcomment
+
+ @var b
+ @vdesc The first schedule items to work on
+ @vtype t_sched_item *
+ @vio ino
+ @vcomment
+
+ @returntype int
+ @returndesc
+ Returns +strcmpi(a->name, b->name)
+ @endreturndesc
+@@*/
+static int ScheduleCompareAscending(const void *a_, const void *b_)
+{
+ const t_sched_item *a = a_;
+ const t_sched_item *b = b_;
+ return +Util_StrCmpi(a->name, b->name);
+}
+
+ /*@@
+ @routine ScheduleCompareDescending
+ @date Mon Jul 16 07:27:39 PDT 2012
+ @author Roland Haas
+ @desc
+ Compare (in reverse alphabetical order) two schedule items based on their
+ thorn and routine names
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+ @var a
+ @vdesc The first schedule items to work on
+ @vtype t_sched_item *
+ @vio ino
+ @vcomment
+
+ @var b
+ @vdesc The first schedule items to work on
+ @vtype t_sched_item *
+ @vio ino
+ @vcomment
+
+ @returntype int
+ @returndesc
+ Returns -strcmpi(a->name, b->name)
+ @endreturndesc
+@@*/
+static int ScheduleCompareDescending(const void *a_, const void *b_)
+{
+ const t_sched_item *a = a_;
+ const t_sched_item *b = b_;
+ return -Util_StrCmpi(a->name, b->name);
+}
+
/********************************************************************
********************************************************************
********************************************************************/