aboutsummaryrefslogtreecommitdiff
path: root/src/ParamCheck.c
blob: 6e1ff22fe968e20ac820868e31d7865313746eb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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;
}