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.