FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
shape_convert_vertex.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
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>
13
14namespace FEAT
15{
16 namespace Geometry
17 {
19 namespace Intern
20 {
21 template<
22 typename Shape_,
23 typename VertexSet_>
24 struct ShapeConvertVertex
25 {
26 // This generic implementation works for both Simplex<n> and Hypercube<m> shapes,
27 // where 1<=n<=3 and 2<=m<=3. The case Hypercube<1> is specialized below.
28 static_assert(Shape_::dimension > 0, "invalid shape");
29 static_assert(Shape_::dimension <= 3, "invalid shape");
30
31 typedef Shape_ ShapeType;
32 typedef IndexSet<Shape::FaceTraits<ShapeType, 0>::count> IndexSetType;
33 typedef VertexSet_ VertexSetType;
34
35 static Index refine(
36 Index offset,
37 VertexSetType& vertex_set_out,
38 const VertexSetType& vertex_set_in,
39 const IndexSetType& index_set_in)
40 {
41 typedef typename IndexSetType::IndexTupleType IndexTupleType;
42 typedef typename VertexSetType::VertexType VertexType;
43 typedef typename VertexSetType::CoordType CoordType;
44
45 // scaling factor
46 static const CoordType scale = CoordType(1) / CoordType(IndexSetType::num_indices);
47
48 // get number of cells
49 Index num_cells = index_set_in.get_num_entities();
50
51 // loop over all cells
52 FEAT_PRAGMA_OMP(parallel for)
53 for(Index i = 0; i < num_cells; ++i)
54 {
55 // get input index vector
56 const IndexTupleType& idx_in = index_set_in[i];
57
58 // get output vertex
59 VertexType& vtx_out = vertex_set_out[offset + i];
60
61 // clear output vertex
62 vtx_out.format();
63
64 // add all other vertices onto it
65 for(int k(0); k < IndexSetType::num_indices; ++k)
66 {
67 vtx_out.axpy(scale, vertex_set_in[idx_in[k]]);
68 }
69 }
70
71 // return number of created vertices
72 return num_cells;
73 }
74 };
75
81 template<typename VertexSet_>
82 struct ShapeConvertVertex<Shape::Vertex, VertexSet_>
83 {
84 typedef VertexSet_ VertexSetType;
85
86 static Index refine(
87 Index offset,
88 VertexSetType& vertex_set_out,
89 const VertexSetType& vertex_set_in)
90 {
91 // get the number of coarse mesh vertices
92 Index num_verts = vertex_set_in.get_num_vertices();
93 XASSERT(vertex_set_out.get_num_vertices() >= num_verts);
94
95 // loop over all vertices
96 FEAT_PRAGMA_OMP(parallel for)
97 for(Index i = 0; i < num_verts; ++i)
98 {
99 // copy source vertex
100 vertex_set_out[offset + i] = vertex_set_in[i];
101 }
102
103 // return number of created vertices
104 return num_verts;
105 }
106 }; // class ShapeConvertVertex<Vertex,...>
107
113 template<typename VertexSet_>
114 struct ShapeConvertVertex<Shape::Hypercube<1>, VertexSet_>
115 {
116 typedef Shape::Hypercube<1> ShapeType;
117 typedef IndexSet<Shape::FaceTraits<ShapeType, 0>::count> IndexSetType;
118 typedef VertexSet_ VertexSetType;
119
120 static Index refine(
121 Index /*offset*/,
122 VertexSetType& /*vertex_set_out*/,
123 const VertexSetType& /*vertex_set_in*/,
124 const IndexSetType& /*index_set_in*/)
125 {
126 // Hypercube edges do not generate new vertices
127 return 0;
128 }
129 }; // class ShapeConvertVertex<Shape::Hypercube<1>,...>
130
131 /* *************************************************************************************** */
132 /* *************************************************************************************** */
133 /* *************************************************************************************** */
134
140 template<
141 typename Shape_,
142 typename VertexSet_>
143 struct ShapeConvertVertexWrapper
144 {
145 typedef VertexSet_ VertexSetType;
146 typedef IndexSetHolder<Shape_> IndexSetHolderType;
147 typedef IndexSet<Shape::FaceTraits<Shape_, 0>::count> IndexSetType;
148
149 static Index refine(
150 VertexSetType& vertex_set_out,
151 const VertexSetType& vertex_set_in,
152 const IndexSetHolderType& index_set_holder_in)
153 {
154 typedef typename Shape::FaceTraits<Shape_, Shape_::dimension-1>::ShapeType FacetType;
155
156 // recursive call of ShapeConvertVertexWrapper
157 Index offset = ShapeConvertVertexWrapper<FacetType, VertexSet_>
158 ::refine(vertex_set_out, vertex_set_in, index_set_holder_in);
159
160 // get index set of current shape
161 const IndexSetType& index_set_in = index_set_holder_in.
162 template get_index_set_wrapper<Shape_::dimension>().template get_index_set<0>();
163
164 // call VertexRefiner
165 Index num_verts = ShapeConvertVertex<Shape_, VertexSet_>
166 ::refine(offset, vertex_set_out, vertex_set_in, index_set_in);
167
168 // validate number of created vertices
169 XASSERTM(num_verts == (ShapeConvertTraits<Shape_, 0>::count * index_set_in.get_num_entities()),
170 "ShapeConvertVertex output does not match ShapeConvertTraits prediction");
171
172 // return new offset
173 return offset + num_verts;
174 }
175 }; // struct StandardVertexRefineWrapper<...>
176
177 template<typename VertexSet_>
178 struct ShapeConvertVertexWrapper<Shape::Vertex, VertexSet_>
179 {
180 typedef VertexSet_ VertexSetType;
181 typedef IndexSetHolder<Shape::Vertex> IndexSetHolderType;
182
183 static Index refine(
184 VertexSetType& vertex_set_out,
185 const VertexSetType& vertex_set_in,
186 const IndexSetHolderType& /*index_set_holder_in*/)
187 {
188 // call VertexRefiner
189 Index num_verts = ShapeConvertVertex<Shape::Vertex,VertexSet_>
190 ::refine(0, vertex_set_out, vertex_set_in);
191
192 // validate number of created vertices
193 XASSERTM(num_verts == (ShapeConvertTraits<Shape::Vertex, 0>::count * vertex_set_in.get_num_vertices()),
194 "ShapeConvertVertex output does not match ShapeConvertTraits prediction");
195
196 // return new offset
197 return num_verts;
198 }
199 }; // struct StandardVertexRefineWrapper<Vertex,...>
200 } // namespace Intern
202 } // namespace Geometry
203} // namespace FEAT
#define XASSERT(expr)
Assertion macro definition.
Definition: assertion.hpp:262
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Definition: assertion.hpp:263
FEAT namespace.
Definition: adjactor.hpp:12
std::uint64_t Index
Index data type.