9#include <kernel/geometry/vertex_set.hpp>
21 class StructuredVertexRefiner;
28 template<
typename VertexSet_>
29 class StructuredVertexRefiner<Shape::Hypercube<1>, VertexSet_>
32 typedef VertexSet_ VertexSetType;
35 VertexSetType& vertex_set_out,
36 const VertexSetType& vertex_set_in,
37 const Index num_slices_coarse[])
39 typedef typename VertexSetType::CoordType CoordType;
42 const Index n = num_slices_coarse[0];
45 vertex_set_out[0] = vertex_set_in[0];
48 for(Index i(0); i < n; ++i)
51 vertex_set_out[2*i + 1] = CoordType(0.5) *(vertex_set_in[i] + vertex_set_in[i + 1]);
54 vertex_set_out[2*i + 2] = vertex_set_in[i + 1];
65 template<
typename VertexSet_>
66 class StructuredVertexRefiner<Shape::Hypercube<2>, VertexSet_>
69 typedef VertexSet_ VertexSetType;
72 VertexSetType& vertex_set_out,
73 const VertexSetType& vertex_set_in,
74 const Index num_slices_coarse[])
76 typedef typename VertexSetType::CoordType CoordType;
79 const Index m = num_slices_coarse[0];
80 const Index n = num_slices_coarse[1];
83 vertex_set_out[0] = vertex_set_in[0];
86 for(Index i(0); i < m; ++i)
89 vertex_set_out[2*i + 1] = CoordType(0.5) * (vertex_set_in[i] + vertex_set_in[i + 1]);
92 vertex_set_out[2*i + 2] = vertex_set_in[i + 1];
96 FEAT_PRAGMA_OMP(parallel
for)
97 for(Index j = 0; j < n; ++j)
100 Index k0 = j *(m + 1);
101 Index k1 = (1 + j)*(m + 1);
102 Index l0 = (2*j + 1)*(2*m + 1);
103 Index l1 = 2*(j + 1)*(2*m + 1);
106 vertex_set_out[l0] = CoordType(0.5) * (vertex_set_in[k0] + vertex_set_in[k1]);
109 vertex_set_out[l1] = vertex_set_in[k1];
112 for(Index i(0); i < m; ++i)
115 vertex_set_out[l0 + 2*i + 1] = CoordType(0.25) * (
116 vertex_set_in[k0 + i] + vertex_set_in[k0 + i + 1] +
117 vertex_set_in[k1 + i] + vertex_set_in[k1 + i + 1]);
120 vertex_set_out[l0 + 2*i + 2] = CoordType(0.5) * (
121 vertex_set_in[k0 + i + 1] + vertex_set_in[k1 + i + 1]);
124 vertex_set_out[l1 + 2*i + 1] = CoordType(0.5) * (
125 vertex_set_in[k1 + i] + vertex_set_in[k1 + i + 1]);
128 vertex_set_out[l1 + 2*i + 2] = vertex_set_in[k1 + i + 1];
137 template<
typename VertexSet_>
138 class StructuredVertexRefiner<Shape::Hypercube<3>, VertexSet_>
141 typedef VertexSet_ VertexSetType;
144 VertexSetType& vertex_set_out,
145 const VertexSetType& vertex_set_in,
146 const Index num_slices_coarse[])
148 typedef typename VertexSetType::CoordType CoordType;
151 const Index m = num_slices_coarse[0];
152 const Index n = num_slices_coarse[1];
153 const Index l = num_slices_coarse[2];
156 vertex_set_out[0] = vertex_set_in[0];
161 for(Index i(0); i < m; ++i)
164 vertex_set_out[2*i + 1] = CoordType(0.5) * (vertex_set_in[i] + vertex_set_in[i + 1]);
167 vertex_set_out[2*i + 2] = vertex_set_in[i + 1];
171 FEAT_PRAGMA_OMP(parallel
for)
172 for(Index j = 0; j < n; ++j)
175 const Index k0 = j *(m + 1);
176 const Index k1 = (1 + j)*(m + 1);
177 const Index l0 = (2*j + 1)*(2*m + 1);
178 const Index l1 = 2*(j + 1)*(2*m + 1);
181 vertex_set_out[l0] = CoordType(0.5) * (vertex_set_in[k0] + vertex_set_in[k1]);
184 vertex_set_out[l1] = vertex_set_in[k1];
187 for(Index i(0); i < m; ++i)
190 vertex_set_out[l0 + 2*i + 1] = CoordType(0.25) * (
191 vertex_set_in[k0 + i] + vertex_set_in[k0 + i + 1] +
192 vertex_set_in[k1 + i] + vertex_set_in[k1 + i + 1]);
195 vertex_set_out[l0 + 2*i + 2] = CoordType(0.5) * (
196 vertex_set_in[k0 + i + 1] + vertex_set_in[k1 + i + 1]);
199 vertex_set_out[l1 + 2*i + 1] = CoordType(0.5) * (
200 vertex_set_in[k1 + i] + vertex_set_in[k1 + i + 1]);
203 vertex_set_out[l1 + 2*i + 2] = vertex_set_in[k1 + i + 1];
209 FEAT_PRAGMA_OMP(parallel
for)
210 for(Index k = 0; k < l; ++k)
213 const Index oc = (k+1)*(m+1)*(n+1);
214 const Index of = 2*(k+1)*(2*m+1)*(2*n+1);
217 vertex_set_out[of] = vertex_set_in[oc];
220 for(Index i(0); i < m; ++i)
223 vertex_set_out[of + 2*i + 1] = CoordType(0.5) * (vertex_set_in[oc + i] + vertex_set_in[oc + i + 1]);
226 vertex_set_out[of + 2*i + 2] = vertex_set_in[oc + i + 1];
230 for(Index j(0); j < n; ++j)
233 const Index k0 = j *(m + 1);
234 const Index k1 = (1 + j)*(m + 1);
235 const Index l0 = (2*j + 1)*(2*m + 1);
236 const Index l1 = 2*(j + 1)*(2*m + 1);
239 vertex_set_out[l0 + of] = CoordType(0.5) * (vertex_set_in[k0 + oc] + vertex_set_in[k1 + oc]);
242 vertex_set_out[l1 + of] = vertex_set_in[k1+ oc];
245 for(Index i(0); i < m; ++i)
248 vertex_set_out[l0 + 2*i + 1 + of] = CoordType(0.25) * (
249 vertex_set_in[k0 + i + oc] + vertex_set_in[k0 + i + 1 + oc] +
250 vertex_set_in[k1 + i + oc] + vertex_set_in[k1 + i + 1 + oc]);
253 vertex_set_out[l0 + 2*i + 2 + of] = CoordType(0.5) * (
254 vertex_set_in[k0 + i + 1 + oc] + vertex_set_in[k1 + i + 1 + oc]);
257 vertex_set_out[l1 + 2*i + 1 + of] = CoordType(0.5) * (
258 vertex_set_in[k1 + i + oc] + vertex_set_in[k1 + i + 1 + oc]);
261 vertex_set_out[l1 + 2*i + 2 + of] = vertex_set_in[k1 + i + 1 + oc];
270 FEAT_PRAGMA_OMP(parallel
for)
271 for(Index k = 0; k < l; ++k)
274 const Index of = 2*(k+1)*(2*m+1)*(2*n+1);
277 for(Index j(0); j < 2*n+1; ++j)
280 for(Index i(0); i < 2*m+1; ++i)
282 vertex_set_out[i + j*(2*m+1) + of - (2*m+1)*(2*n+1)] = CoordType(0.5) *
283 (vertex_set_out[i + j*(2*m+1) + of] + vertex_set_out[i + j*(2*m+1) + of - 2*(2*m+1)*(2*n+1)]);
std::uint64_t Index
Index data type.