9#include <kernel/geometry/index_set.hpp> 
   10#include <kernel/geometry/vertex_set.hpp> 
   11#include <kernel/geometry/intern/shape_convert_traits.hpp> 
   12#include <kernel/geometry/intern/entity_counter.hpp> 
   24      struct ShapeConvertVertex
 
   28        static_assert(Shape_::dimension > 0, 
"invalid shape");
 
   29        static_assert(Shape_::dimension <= 3, 
"invalid shape");
 
   31        typedef Shape_ ShapeType;
 
   32        typedef IndexSet<Shape::FaceTraits<ShapeType, 0>::count> IndexSetType;
 
   33        typedef VertexSet_ VertexSetType;
 
   37          VertexSetType& vertex_set_out,
 
   38          const VertexSetType& vertex_set_in,
 
   39          const IndexSetType& index_set_in)
 
   41          typedef typename IndexSetType::IndexTupleType IndexTupleType;
 
   42          typedef typename VertexSetType::VertexType VertexType;
 
   43          typedef typename VertexSetType::CoordType CoordType;
 
   46          static const CoordType scale = CoordType(1) / CoordType(IndexSetType::num_indices);
 
   49          Index num_cells = index_set_in.get_num_entities();
 
   52          FEAT_PRAGMA_OMP(parallel 
for)
 
   53          for(Index i = 0; i < num_cells; ++i)
 
   56            const IndexTupleType& idx_in = index_set_in[i];
 
   59            VertexType& vtx_out = vertex_set_out[offset + i];
 
   65            for(
int k(0); k < IndexSetType::num_indices; ++k)
 
   67              vtx_out.axpy(scale, vertex_set_in[idx_in[k]]);
 
   81      template<
typename VertexSet_>
 
   82      struct ShapeConvertVertex<Shape::Vertex, VertexSet_>
 
   84        typedef VertexSet_ VertexSetType;
 
   88          VertexSetType& vertex_set_out,
 
   89          const VertexSetType& vertex_set_in)
 
   92          Index num_verts = vertex_set_in.get_num_vertices();
 
   93          XASSERT(vertex_set_out.get_num_vertices() >= num_verts);
 
   96          FEAT_PRAGMA_OMP(parallel 
for)
 
   97          for(Index i = 0; i < num_verts; ++i)
 
  100            vertex_set_out[offset + i] = vertex_set_in[i];
 
  113      template<
typename VertexSet_>
 
  114      struct ShapeConvertVertex<Shape::Hypercube<1>, VertexSet_>
 
  116        typedef Shape::Hypercube<1> ShapeType;
 
  117        typedef IndexSet<Shape::FaceTraits<ShapeType, 0>::count> IndexSetType;
 
  118        typedef VertexSet_ VertexSetType;
 
  123          const VertexSetType& ,
 
  124          const IndexSetType& )
 
  143      struct ShapeConvertVertexWrapper
 
  145        typedef VertexSet_ VertexSetType;
 
  146        typedef IndexSetHolder<Shape_> IndexSetHolderType;
 
  147        typedef IndexSet<Shape::FaceTraits<Shape_, 0>::count> IndexSetType;
 
  150          VertexSetType& vertex_set_out,
 
  151          const VertexSetType& vertex_set_in,
 
  152          const IndexSetHolderType& index_set_holder_in)
 
  154          typedef typename Shape::FaceTraits<Shape_, Shape_::dimension-1>::ShapeType FacetType;
 
  157          Index offset = ShapeConvertVertexWrapper<FacetType, VertexSet_>
 
  158            ::refine(vertex_set_out, vertex_set_in, index_set_holder_in);
 
  161          const IndexSetType& index_set_in = index_set_holder_in.
 
  162            template get_index_set_wrapper<Shape_::dimension>().template get_index_set<0>();
 
  165          Index num_verts = ShapeConvertVertex<Shape_, VertexSet_>
 
  166            ::refine(offset, vertex_set_out, vertex_set_in, index_set_in);
 
  169          XASSERTM(num_verts == (ShapeConvertTraits<Shape_, 0>::count * index_set_in.get_num_entities()),
 
  170            "ShapeConvertVertex output does not match ShapeConvertTraits prediction");
 
  173          return offset + num_verts;
 
  177      template<
typename VertexSet_>
 
  178      struct ShapeConvertVertexWrapper<Shape::Vertex, VertexSet_>
 
  180        typedef VertexSet_ VertexSetType;
 
  181        typedef IndexSetHolder<Shape::Vertex> IndexSetHolderType;
 
  184          VertexSetType& vertex_set_out,
 
  185          const VertexSetType& vertex_set_in,
 
  186          const IndexSetHolderType& )
 
  189          Index num_verts =  ShapeConvertVertex<Shape::Vertex,VertexSet_>
 
  190            ::refine(0, vertex_set_out, vertex_set_in);
 
  193          XASSERTM(num_verts == (ShapeConvertTraits<Shape::Vertex, 0>::count * vertex_set_in.get_num_vertices()),
 
  194            "ShapeConvertVertex output does not match ShapeConvertTraits prediction");
 
#define XASSERT(expr)
Assertion macro definition.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
std::uint64_t Index
Index data type.