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;
}
|