diff options
Diffstat (limited to 'src/ParamCheck.c')
-rw-r--r-- | src/ParamCheck.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/ParamCheck.c b/src/ParamCheck.c new file mode 100644 index 0000000..6e1ff22 --- /dev/null +++ b/src/ParamCheck.c @@ -0,0 +1,82 @@ +#include <assert.h> +#include <stdlib.h> + +#include "cctk.h" +#include "cctk_Arguments.h" +#include "cctk_Parameters.h" + +#include "util_String.h" + +static void callback (int idx, const char * optstring, void * callback_arg); + +/** Ensure that all HydroBase initial data that are supposed to be read + from a file are actually scheduled for the file reader. */ +void HydroBase_ParamCheck (CCTK_ARGUMENTS) +{ + DECLARE_CCTK_ARGUMENTS; + DECLARE_CCTK_PARAMETERS; + + char * variable_is_read; + int i; + int nvars; + + const struct { + const char * paramname; + const char * paramvalue; + const char * varname; + } vars_to_read[] = { + {"initial_hydro", initial_hydro, "HydroBase::rho"}, + {"initial_hydro", initial_hydro, "HydroBase::vel[0]"}, + {"initial_hydro", initial_hydro, "HydroBase::vel[1]"}, + {"initial_hydro", initial_hydro, "HydroBase::vel[2]"}, + {"initial_hydro", initial_hydro, "HydroBase::eps"}, + {"initial_hydro", initial_hydro, "HydroBase::press"}, + {"initial_Aphi", initial_Aphi, "HydroBase::Aphi"}, + {"initial_Avec", initial_Avec, "HydroBase::Avec[0]"}, + {"initial_Avec", initial_Avec, "HydroBase::Avec[1]"}, + {"initial_Avec", initial_Avec, "HydroBase::Avec[2]"}, + {"initial_Bvec", initial_Bvec, "HydroBase::Bvec[0]"}, + {"initial_Bvec", initial_Bvec, "HydroBase::Bvec[1]"}, + {"initial_Bvec", initial_Bvec, "HydroBase::Bvec[2]"}, + {"initial_Y_e", initial_Y_e, "HydroBase::Ye"}, + {"initial_temperature", initial_temperature, "HydroBase::temperature"}, + {"initial_entropy", initial_entropy, "HydroBase::entropy"}, + }; + + variable_is_read = malloc (CCTK_NumVars()); + assert (variable_is_read); + for (i=0; i<CCTK_NumVars(); ++i) { + variable_is_read[i] = 0; + } + + nvars = CCTK_TraverseString + (filereader_ID_vars, callback, variable_is_read, CCTK_GROUP_OR_VAR); + assert (nvars >= 0); + + for (i=0; i<(int)(sizeof(vars_to_read)/sizeof(vars_to_read[0])); ++i) { + if (CCTK_EQUALS(vars_to_read[i].paramvalue, "read from file")) { + int const ivar = CCTK_VarIndex (vars_to_read[i].varname); + assert (ivar >= 0); + if (! variable_is_read[ivar]) { + char * msg; + size_t written = Util_asprintf(&msg, + "'%s' is initialised using the file reader by '%s', but has not been scheduled to be read. Please set the parameter \"IO::filereader_ID_vars\" accordingly.", + vars_to_read[i].varname, + vars_to_read[i].paramname); + assert(written > 0); + CCTK_PARAMWARN (msg); + free(msg); + } + } + } + + free (variable_is_read); +} + +/** Mark a variable as to be read from the file reader. */ +static void callback (int idx, const char * optstring, void * callback_arg) +{ + assert (idx>=0 && idx<CCTK_NumVars()); + ((char *)callback_arg)[idx] = 1; +} + |