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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
#ifndef DH_HH
#define DH_HH
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <list>
#include <string>
#include <vector>
#include "bbox.hh"
#include "bboxset.hh"
#include "defs.hh"
#include "gh.hh"
#include "region.hh"
#include "vect.hh"
using namespace std;
#define CARPET_HAVE_BUFFER_WIDTH
// Forward declaration
class ggf;
class dh;
// A data hierarchy (grid hierarchy plus ghost zones)
class dh {
// Types
public:
typedef list<ibbox> iblist;
typedef vector<iblist> iblistvect; // vector of lists
typedef vector <pseudoregion_t> pvect;
typedef vector <sendrecv_pseudoregion_t> srpvect;
struct dboxes {
// Region description:
ibbox exterior; // whole region (including boundaries)
b2vect is_outer_boundary;
ibset outer_boundaries; // outer boundary
ibbox communicated; // exterior without outer boundary
ibset boundaries; // ghost zones
ibbox owned; // evolved in time
ibset buffers; // buffer zones
ibset active; // owned minus buffers
ibset sync; // filled by synchronisation
ibset bndref; // filled by boundary prolongation
// For Cactus: (these are like boundary or owned, but include the
// outer boundary)
ibset ghosts; // ghost zones, as seen from Cactus
ibbox interior; // interior (without ghost zones)
size_t memory () const;
ostream & output (ostream & os) const;
};
struct fast_dboxes {
// Communication schedule:
srpvect fast_mg_rest_sendrecv;
srpvect fast_mg_prol_sendrecv;
srpvect fast_ref_prol_sendrecv;
srpvect fast_ref_rest_sendrecv;
srpvect fast_sync_sendrecv;
srpvect fast_ref_bnd_prol_sendrecv;
// Regridding schedule:
srpvect fast_old2new_sync_sendrecv;
srpvect fast_old2new_ref_prol_sendrecv;
size_t memory () const;
ostream & output (ostream & os) const;
};
private:
typedef vector<dboxes> cboxes; // ... for each component
typedef vector<cboxes> rboxes; // ... for each refinement level
typedef vector<rboxes> mboxes; // ... for each multigrid level
typedef vector<fast_dboxes> fast_cboxes; // ... for each component
typedef vector<fast_cboxes> fast_rboxes; // ... for each refinement level
typedef vector<fast_rboxes> fast_mboxes; // ... for each multigrid level
void
setup_bboxes ();
public: // should be readonly
// Fields
gh & h; // hierarchy
i2vect ghost_width; // number of ghost zones
i2vect buffer_width; // number of buffer zones
int prolongation_order_space; // order of spatial prolongation operator
mboxes boxes; // grid hierarchy
mboxes oldboxes; // old grid hierarchy, used during regridding
fast_mboxes fast_boxes; // grid hierarchy
fast_mboxes fast_oldboxes;
list<ggf*> gfs; // list of all grid functions
public:
// Constructors
dh (gh & h,
i2vect const & ghosts, i2vect const & buffers,
int prolongation_order_space);
// Destructors
~dh ();
// Helpers
int prolongation_stencil_size () const;
// Modifiers
void regrid ();
void recompose (int rl, bool do_prolongate);
private:
int this_proc (int rl, int c) const;
bool on_this_proc (int rl, int c) const;
bool on_this_proc (int rl, int c, int cc) const;
int this_oldproc (int rl, int c) const;
bool on_this_oldproc (int rl, int c) const;
public:
// Grid function management
void add (ggf * f);
void remove (ggf * f);
// Output
size_t memory () const;
ostream & output (ostream & os) const;
};
inline size_t memoryof (dh::dboxes const & b)
{
return b.memory ();
}
inline size_t memoryof (dh::fast_dboxes const & b)
{
return b.memory ();
}
inline size_t memoryof (dh const & d)
{
return d.memory ();
}
inline ostream & operator<< (ostream & os, dh::dboxes const & b)
{
return b.output (os);
}
inline ostream & operator<< (ostream & os, dh::fast_dboxes const & b)
{
return b.output (os);
}
inline ostream & operator<< (ostream & os, dh const & d)
{
return d.output (os);
}
#endif // DH_HH
|