diff options
-rw-r--r-- | src/main/Parameters.c | 37 | ||||
-rw-r--r-- | src/main/SetParams.c | 151 |
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, ¶m, 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; } } |