summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/Parameters.c37
-rw-r--r--src/main/SetParams.c151
2 files changed, 130 insertions, 58 deletions
diff --git a/src/main/Parameters.c b/src/main/Parameters.c
index e465e064..78452bda 100644
--- a/src/main/Parameters.c
+++ b/src/main/Parameters.c
@@ -441,6 +441,9 @@ int CCTKi_ParameterAddRange(const char *implementation,
@returntype int
@returndesc
negative in case of errors
+ -1 = parameter out of range
+ -2 = parameter not found
+ -3 = trying to steer non steerable parameter
@endreturndesc
@@*/
@@ -459,25 +462,31 @@ int CCTK_ParameterSet(const char *name,
/* before parameter recovery (which is while parsing the parameter file)
all parameters can be set */
- /* after parameter recovery only steerable parameters can be set */
if(cctk_parameter_set_mask == PARAMETER_RECOVERY_POST &&
param->props->steerable != CCTK_STEERABLE_ALWAYS)
{
+
+ /* after parameter recovery only steerable parameters can be set */
+
CCTK_VWarn(1, __LINE__, __FILE__, "Cactus",
- "CCTK_ParameterSet: Cannot set parameter '%s::%s' (non-steerable)",
+ "CCTK_ParameterSet: Cannot set parameter '%s::%s' "
+ "(non-steerable)",
thorn, name);
- retval = -2;
+ retval = -3;
+
}
+ else if(cctk_parameter_set_mask == PARAMETER_RECOVERY_IN
+ && param->props->n_set > 0)
+ {
- /* during parameter recovery STEERABLE_NEVER parameters which were set
+ /* during parameter recovery STEERABLE_NEVER parameters which were set
from the parameter file are overwritten by the checkpoint file */
- if(cctk_parameter_set_mask == PARAMETER_RECOVERY_IN &&
- param->props->n_set > 0)
- {
+
if (param->props->steerable == CCTK_STEERABLE_NEVER)
{
CCTK_VWarn(1, __LINE__, __FILE__, "Cactus",
- "CCTK_ParameterSet: Parameter '%s::%s' is non-steerable and will be "
+ "CCTK_ParameterSet: Parameter '%s::%s' "
+ "is non-steerable and will be "
"overwritten by its value from the checkpoint file",
thorn, name);
}
@@ -485,17 +494,11 @@ int CCTK_ParameterSet(const char *name,
{
retval = 1; /* do not restore the original value */
}
- }
- if (retval == 0)
+ }
+ else
{
retval = ParameterSetSimple(param, value);
- if (retval < 0)
- {
- CCTK_VWarn(0,__LINE__,__FILE__,"Cactus",
- "CCTK_ParameterSet: Error setting parameter %s to %s\n",
- name,value);
- }
/* register another set operation */
param->props->n_set++;
@@ -504,7 +507,7 @@ int CCTK_ParameterSet(const char *name,
}
else
{
- retval = -1;
+ retval = -2;
}
return retval;
diff --git a/src/main/SetParams.c b/src/main/SetParams.c
index 461f6471..5d3e5f38 100644
--- a/src/main/SetParams.c
+++ b/src/main/SetParams.c
@@ -94,7 +94,11 @@ int CCTKi_SetParameter(const char *parameter, const char *value)
const char *position;
int length;
int n_errors;
-
+ int param_type;
+ int parameter_check;
+
+ parameter_check = CCTK_ParameterLevel();
+
retval = 0;
if(CCTK_Equals(parameter, "ActiveThorns"))
@@ -131,18 +135,77 @@ int CCTKi_SetParameter(const char *parameter, const char *value)
{
retval = ReallySetParameter(parameter, value);
}
-
- if(retval)
+
+ if (retval == -1)
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,"Cactus",
+ "CCTKi_SetParameter: Range error setting parameter %s to %s\n",
+ parameter,value);
+ }
+ else if (retval == -2)
+ {
+ /* Parameter not defined in thorn */
+ if (parameter_check==CCTK_PARAMETER_RELAXED)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"Cactus",
+ "CCTKi_SetParameter: Parameter %s not found",
+ parameter);
+ }
+ else
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,"Cactus",
+ "CCTKi_SetParameter: Parameter %s not found",
+ parameter);
+ }
+ }
+ else if (retval == -4)
+ {
+ /* Setting parameter twice */
+ if (parameter_check==CCTK_PARAMETER_RELAXED)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"Cactus",
+ "CCTKi_SetParameter: Parameter %s "
+ "set in two different thorns",
+ parameter);
+ }
+ else
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,"Cactus",
+ "CCTKi_SetParameter: Parameter %s "
+ "set in two different thorns",
+ parameter);
+ }
+ }
+ else if (retval == -5)
+ {
+ /* Parameter not defined by any active thorn */
+ if (parameter_check==CCTK_PARAMETER_STRICT)
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,"Cactus",
+ "CCTKi_SetParameter: Parameter %s "
+ "is not associated with an active thorn",
+ parameter);
+ }
+ else if (parameter_check==CCTK_PARAMETER_NORMAL)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"Cactus",
+ "CCTKi_SetParameter: Parameter %s "
+ "is not associated with an active thorn",
+ parameter);
+ }
+ }
+
+ /* if(retval)
{
if(retval == -1)
{
- fprintf(stderr, "Unknown parameter %s\n", parameter);
+ fprintf(stderr, "Unknown parameter %s\n", parameter);
}
else
{
fprintf(stderr, "Error setting parameter %s to %s\n", parameter, value);
}
- }
+ }*/
return retval;
}
@@ -181,70 +244,76 @@ int CCTKi_SetParameter(const char *parameter, const char *value)
@returntype int
@returndesc
- 0 - success
- -1 - unknown parameter
+ 0 = success
+ -5 = thorn/imp not active
+ -4 = tried to set parameter in two different thorns
+ -3 = tried to steer nonsteerable parameter
+ -2 = parameter not defined in the active thorn
+ -1 = parameter out of range
@endreturndesc
@@*/
static int ReallySetParameter(const char *parameter, const char *value)
{
int retval;
+ int retval_thorn=0;
+ int found = 0;
+ int retval_imp=0;
const char *thorn;
char *param;
char *imp;
- int retval_imp;
- int retval_thorn;
-
-
Util_SplitString(&imp, &param, parameter, "::");
- retval = -1;
-
- /* If param is null, there were no colons in the input */
- if(!param)
+ if (!param)
{
+ /* must be global parameter */
retval = CCTK_ParameterSet(parameter, imp, value);
}
- else
+ else
{
- /* Set if this is an implementation one */
- if(CCTK_IsImplementationActive(imp))
+ /* try and set parameter from implementation */
+ if (CCTK_IsImplementationActive(imp))
{
thorn = CCTK_ActivatingThorn(imp);
- retval_imp = CCTK_ParameterSet(param, thorn, value);
+ /* only do it if the thorn name is different to the imp */
+ if (!CCTK_Equals(thorn,imp))
+ {
+ found++;
+ retval_imp = CCTK_ParameterSet(param, thorn, value);
+ }
}
- else
+
+ /* try and set parameter from thorn */
+ if (CCTK_IsThornActive(imp))
{
- thorn = NULL;
- retval_imp = -1;
+ found++;
+ retval_thorn = CCTK_ParameterSet(param, imp, value);
}
-
- /* Set if this is a thorn one. */
- if(!thorn || !CCTK_Equals(thorn,imp))
+ if (!found)
{
- if(CCTK_IsThornActive(imp))
- {
- retval_thorn = CCTK_ParameterSet(param, imp, value);
- }
- else
- {
- retval_thorn = -1;
- }
+ /* imp or thorn not found */
+ retval = -5;
}
- else
+ else if (found==2 && retval_imp>-1 && retval_thorn >-1)
{
- /* Don't need to set it twice if the name of the imp is the same as the thorn providing it */
- retval_thorn = retval_imp;
+ /* tried to set parameter for both imp and thorn */
+ retval = -4;
}
-
- if(!retval_imp || !retval_thorn)
+ else if (found==2 && retval_imp<0 && retval_thorn <0)
{
- retval = 0;
+ /* failed to set parameter for both imp and thorn */
+ /* FIXME: returning imp but loosing thorn info*/
+ retval = retval_imp;
}
- else
+ else if (found==2)
+ {
+ /* Only one succeeded */
+ retval = (retval_imp>-1 ? retval_imp : retval_thorn);
+ }
+ else if (found==1)
{
- retval = retval_imp ? retval_imp : retval_thorn;
+ retval = retval_imp + retval_thorn;
}
}