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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#include <cassert>
#include <cstdlib>
#include <cctk.h>
#include <cctk_Arguments.h>
#include <cctk_Parameters.h>
#include <carpet.hh>
namespace Carpet {
using namespace std;
/** Ensure that the parameters have legal values.
*
* Note that this checking happens only after most of Carpet has
* already been set up.
*/
void CarpetParamCheck (CCTK_ARGUMENTS)
{
DECLARE_CCTK_ARGUMENTS;
DECLARE_CCTK_PARAMETERS;
if ((CCTK_ParameterQueryTimesSet ("periodic", "Carpet") and periodic)
or (CCTK_ParameterQueryTimesSet ("periodic_x", "Carpet") and periodic_x)
or (CCTK_ParameterQueryTimesSet ("periodic_y", "Carpet") and periodic_y)
or (CCTK_ParameterQueryTimesSet ("periodic_z", "Carpet") and periodic_z)) {
CCTK_PARAMWARN ("Some of the parameters \"Carpet::periodic*\" have been set to \"yes\". These parameters are there for compatibility reasons only and must not be used.");
}
if (adaptive_stepsize and max_refinement_levels > 1) {
CCTK_PARAMWARN ("Adaptive time step sizes do not work with mesh refinement yet. Please use only a single level, and set max_refinement_levels=1.");
}
if (max_refinement_levels > 1) {
// InitBase
enum setup_method_t {
init_some_levels,
init_single_level,
init_two_levels,
init_all_levels,
};
setup_method_t setup_method;
if (CCTK_EQUALS (initial_data_setup_method, "init_some_levels")) {
setup_method = init_some_levels;
}
else if (CCTK_EQUALS (initial_data_setup_method, "init_single_level")) {
setup_method = init_single_level;
}
else if (CCTK_EQUALS (initial_data_setup_method, "init_two_levels")) {
setup_method = init_two_levels;
}
else if (CCTK_EQUALS (initial_data_setup_method, "init_all_levels")) {
setup_method = init_all_levels;
}
else
{
CCTK_PARAMWARN ("Unknown value of parameter InitBase::initial_data_setup_method");
}
// Carpet
enum init_method_t {
each_timelevel, // Initialise each time level
fill_timelevels, // Copy the current to all past timelevels
three_timelevels, // Carpet's 3 timelevel scheme
all_timelevels, // Initial data thorn initialises all timelevels
};
init_method_t init_method;
if (init_each_timelevel) {
if (init_fill_timelevels) {
CCTK_PARAMWARN ("Cannot set parameters init_each_timelevel and init_fill_timelevels at the same time");
}
if (init_3_timelevels) {
CCTK_PARAMWARN ("Cannot set parameters init_each_timelevel and init_3_timelevels at the same time");
}
init_method = each_timelevel;
}
else if (init_fill_timelevels) {
if (init_3_timelevels) {
CCTK_PARAMWARN ("Cannot set parameters init_fill_timelevels and init_3_timelevels at the same time");
}
init_method = fill_timelevels;
}
else if (init_3_timelevels) {
init_method = three_timelevels;
}
else {
init_method = all_timelevels;
}
switch (init_method) {
case each_timelevel:
if (setup_method != init_single_level) {
CCTK_PARAMWARN ("When you set Carpet::init_each_timelevel=yes, then you must also use InitBase::initial_data_setup_method=\"init_single_level\"");
}
break;
case fill_timelevels:
// Everything is allowed
break;
case three_timelevels:
// Everything is allowed
break;
case all_timelevels:
if (setup_method != init_all_levels) {
CCTK_PARAMWARN ("When you set neither Carpet::init_each_timelevel=yes nor Carpet::init_fill_timelevels=yes nor Carpet::init_3_timelevels=yes, then you must also use InitBase::initial_data_setup_method=\"init_all_levels\"");
}
break;
default:
assert (0);
}
} // if max_refinement_levels > 0
}
} // namespace Carpet
|