aboutsummaryrefslogtreecommitdiff
path: root/src/ParamCheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ParamCheck.c')
-rw-r--r--src/ParamCheck.c82
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;
+}
+