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.