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.