9#include <kernel/geometry/target_set.hpp>
10#include <kernel/geometry/intern/entity_counter.hpp>
11#include <kernel/geometry/intern/standard_refinement_traits.hpp>
12#include <kernel/geometry/intern/struct_index_coding.hpp>
22 template<
int shape_dim_,
int cell_dim_,
int child_dim_>
23 struct StructuredTargetRefiner;
34 template<
int shape_dim_>
35 struct StructuredTargetRefiner<shape_dim_, 0, 0>
37 static Index refine_simple(
38 TargetSet& target_set_out,
39 const TargetSet& target_set_in,
41 const Index num_slices_c[],
42 const Index num_slices_f[])
44 const Index num_verts = target_set_in.get_num_entities();
47 for(Index i(0); i < num_verts; ++i)
50 StructIndexCoding<shape_dim_, 0>::decode(v, target_set_in[i], num_slices_c);
53 for(
int j(0); j < shape_dim_; ++j)
57 target_set_out[offset+i] = StructIndexCoding<shape_dim_, 0>::encode(v, num_slices_f);
65 template<
int shape_dim_>
66 struct StructuredTargetRefiner<shape_dim_, 1, 0>
68 static Index refine_simple(
69 TargetSet& target_set_out,
70 const TargetSet& target_set_in,
72 const Index num_slices_c[],
73 const Index num_slices_f[])
75 const Index num_edges = target_set_in.get_num_entities();
76 Index v[shape_dim_+1];
78 for(Index i(0); i < num_edges; ++i)
81 StructIndexCoding<shape_dim_, 1>::decode(v, target_set_in[i], num_slices_c);
84 for(
int j(0); j < shape_dim_; ++j)
91 target_set_out[offset+i] = StructIndexCoding<shape_dim_, 0>::encode(v, num_slices_f);
99 template<
int shape_dim_>
100 struct StructuredTargetRefiner<shape_dim_, 1, 1>
102 static Index refine_simple(
103 TargetSet& target_set_out,
104 const TargetSet& target_set_in,
106 const Index num_slices_c[],
107 const Index num_slices_f[])
109 const Index num_edges = target_set_in.get_num_entities();
110 Index v[shape_dim_+1];
112 for(Index i(0); i < num_edges; ++i)
115 StructIndexCoding<shape_dim_, 1>::decode(v, target_set_in[i], num_slices_c);
118 for(
int j(0); j < shape_dim_; ++j)
122 target_set_out[offset+2*i+0] = StructIndexCoding<shape_dim_, 1>::encode(v, num_slices_f);
128 target_set_out[offset+2*i+1] = StructIndexCoding<shape_dim_, 1>::encode(v, num_slices_f);
136 template<
int shape_dim_>
137 struct StructuredTargetRefiner<shape_dim_, 2, 0>
139 static Index refine_simple(
140 TargetSet& target_set_out,
141 const TargetSet& target_set_in,
143 const Index num_slices_c[],
144 const Index num_slices_f[])
146 const Index num_quads = target_set_in.get_num_entities();
147 Index v[shape_dim_+1];
149 for(Index i(0); i < num_quads; ++i)
152 StructIndexCoding<shape_dim_, 2>::decode(v, target_set_in[i], num_slices_c);
155 for(
int j(0); j < shape_dim_; ++j)
159 target_set_out[offset+i] = StructIndexCoding<shape_dim_, 0>::encode(v, num_slices_f);
168 struct StructuredTargetRefiner<2, 2, 1>
170 static constexpr int shape_dim_ = 2;
172 static Index refine_simple(
173 TargetSet& target_set_out,
174 const TargetSet& target_set_in,
176 const Index num_slices_c[],
177 const Index num_slices_f[])
179 const Index num_quads = target_set_in.get_num_entities();
180 Index v[shape_dim_+1];
182 for(Index i(0); i < num_quads; ++i)
185 StructIndexCoding<shape_dim_, 2>::decode(v, target_set_in[i], num_slices_c);
188 for(
int j(0); j < shape_dim_; ++j)
195 target_set_out[offset+4*i+0] = StructIndexCoding<shape_dim_, 1>::encode(v, num_slices_f);
198 target_set_out[offset+4*i+1] = StructIndexCoding<shape_dim_, 1>::encode(v, num_slices_f);
204 target_set_out[offset+4*i+2] = StructIndexCoding<shape_dim_, 1>::encode(v, num_slices_f);
207 target_set_out[offset+4*i+3] = StructIndexCoding<shape_dim_, 1>::encode(v, num_slices_f);
210 return Index(4)*num_quads;
216 struct StructuredTargetRefiner< 2, 2, 2>
218 static constexpr int shape_dim_ = 2;
220 static Index refine_simple(
221 TargetSet& target_set_out,
222 const TargetSet& target_set_in,
224 const Index num_slices_c[],
225 const Index num_slices_f[])
227 const Index num_quads = target_set_in.get_num_entities();
228 Index v[shape_dim_+1];
230 for(Index i(0); i < num_quads; ++i)
233 StructIndexCoding<shape_dim_, 2>::decode(v, target_set_in[i], num_slices_c);
236 for(
int j(0); j < shape_dim_; ++j)
241 target_set_out[offset+4*i+0] = StructIndexCoding<shape_dim_, 2>::encode(v, num_slices_f);
245 target_set_out[offset+4*i+1] = StructIndexCoding<shape_dim_, 2>::encode(v, num_slices_f);
250 target_set_out[offset+4*i+2] = StructIndexCoding<shape_dim_, 2>::encode(v, num_slices_f);
254 target_set_out[offset+4*i+3] = StructIndexCoding<shape_dim_, 2>::encode(v, num_slices_f);
257 return Index(4) * num_quads;
261 template<
int shape_dim_,
int child_dim_,
int cell_dim_ = shape_dim_>
262 struct StructuredTargetRefineShapeWrapper
264 typedef Shape::Hypercube<shape_dim_> ShapeType;
265 typedef typename Shape::FaceTraits<ShapeType, cell_dim_>::ShapeType CellType;
267 static Index refine_simple(
268 TargetSet& target_set_out,
269 const TargetSetHolder<CellType>& target_set_holder_in,
270 const Index num_slices_c[],
const Index num_slices_f[])
273 Index offset = StructuredTargetRefineShapeWrapper<shape_dim_, child_dim_, cell_dim_-1>::refine_simple(
274 target_set_out, target_set_holder_in, num_slices_c, num_slices_f);
277 Index count = StructuredTargetRefiner<shape_dim_, cell_dim_, child_dim_>::refine_simple(
278 target_set_out, target_set_holder_in.template get_target_set<cell_dim_>(),
279 offset, num_slices_c, num_slices_f);
282 return offset + count;
286 template<
int shape_dim_,
int cell_dim_>
287 struct StructuredTargetRefineShapeWrapper<shape_dim_, cell_dim_, cell_dim_>
289 typedef Shape::Hypercube<shape_dim_> ShapeType;
290 typedef typename Shape::FaceTraits<ShapeType, cell_dim_>::ShapeType CellType;
292 static Index refine_simple(
293 TargetSet& target_set_out,
294 const TargetSetHolder<CellType>& target_set_holder_in,
295 const Index num_slices_c[],
const Index num_slices_f[])
298 Index count = StructuredTargetRefiner<shape_dim_, cell_dim_, cell_dim_>::refine_simple(
299 target_set_out, target_set_holder_in.template get_target_set<cell_dim_>(),
300 Index(0), num_slices_c, num_slices_f);
307 template<
int shape_dim_,
int cell_dim_ = shape_dim_>
308 struct StructuredTargetRefineWrapper
310 typedef Shape::Hypercube<shape_dim_> ShapeType;
311 typedef Shape::Hypercube<cell_dim_> CellType;
313 static void refine_simple(
314 TargetSetHolder<CellType>& target_set_holder_out,
315 const TargetSetHolder<ShapeType>& target_set_holder_in,
316 const Index num_slices_c[],
const Index num_slices_f[])
319 StructuredTargetRefineWrapper<shape_dim_, cell_dim_-1>::refine_simple(
320 target_set_holder_out, target_set_holder_in, num_slices_c, num_slices_f);
323 StructuredTargetRefineShapeWrapper<shape_dim_, cell_dim_>::refine_simple(
324 target_set_holder_out.template get_target_set<cell_dim_>(),
325 target_set_holder_in, num_slices_c, num_slices_f);
329 template<
int shape_dim_>
330 struct StructuredTargetRefineWrapper<shape_dim_, 0>
332 typedef Shape::Hypercube<shape_dim_> ShapeType;
335 static void refine_simple(
336 TargetSetHolder<Shape::Vertex>& target_set_holder_out,
337 const TargetSetHolder<ShapeType>& target_set_holder_in,
338 const Index num_slices_c[],
const Index num_slices_f[])
341 StructuredTargetRefineShapeWrapper<shape_dim_, 0>::refine_simple(
342 target_set_holder_out.template get_target_set<0>(),
343 target_set_holder_in, num_slices_c, num_slices_f);
std::uint64_t Index
Index data type.