aboutsummaryrefslogtreecommitdiff
path: root/Carpet/Carpet/src/CarpetParamCheck.cc
blob: c02ab02b0777eaeeb9036f15b64777952a7b715e (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
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