Line data Source code
1 : // The libMesh Finite Element Library.
2 : // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 :
4 : // This library is free software; you can redistribute it and/or
5 : // modify it under the terms of the GNU Lesser General Public
6 : // License as published by the Free Software Foundation; either
7 : // version 2.1 of the License, or (at your option) any later version.
8 :
9 : // This library is distributed in the hope that it will be useful,
10 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 : // Lesser General Public License for more details.
13 :
14 : // You should have received a copy of the GNU Lesser General Public
15 : // License along with this library; if not, write to the Free Software
16 : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 :
18 : // Local includes
19 : #include "libmesh/libmesh_config.h"
20 :
21 : #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
22 :
23 : // Local includes cont'd
24 : #include "libmesh/cell_inf_hex16.h"
25 : #include "libmesh/edge_edge3.h"
26 : #include "libmesh/edge_inf_edge2.h"
27 : #include "libmesh/face_quad8.h"
28 : #include "libmesh/face_inf_quad6.h"
29 : #include "libmesh/enum_io_package.h"
30 : #include "libmesh/enum_order.h"
31 :
32 : namespace libMesh
33 : {
34 :
35 :
36 : // ------------------------------------------------------------
37 : // InfHex16 class static member initializations
38 : const int InfHex16::num_nodes;
39 : const int InfHex16::nodes_per_side;
40 : const int InfHex16::nodes_per_edge;
41 :
42 : const unsigned int InfHex16::side_nodes_map[InfHex16::num_sides][InfHex16::nodes_per_side] =
43 : {
44 : { 0, 1, 2, 3, 8, 9, 10, 11}, // Side 0
45 : { 0, 1, 4, 5, 8, 12, 99, 99}, // Side 1
46 : { 1, 2, 5, 6, 9, 13, 99, 99}, // Side 2
47 : { 2, 3, 6, 7, 10, 14, 99, 99}, // Side 3
48 : { 3, 0, 7, 4, 11, 15, 99, 99} // Side 4
49 : };
50 :
51 : const unsigned int InfHex16::edge_nodes_map[InfHex16::num_edges][InfHex16::nodes_per_edge] =
52 : {
53 : {0, 1, 8}, // Edge 0
54 : {1, 2, 9}, // Edge 1
55 : {2, 3, 10}, // Edge 2
56 : {0, 3, 11}, // Edge 3
57 : {0, 4, 99}, // Edge 4
58 : {1, 5, 99}, // Edge 5
59 : {2, 6, 99}, // Edge 6
60 : {3, 7, 99} // Edge 7
61 : };
62 :
63 : // ------------------------------------------------------------
64 : // InfHex16 class member functions
65 :
66 616 : bool InfHex16::is_node_on_side(const unsigned int n,
67 : const unsigned int s) const
68 : {
69 232 : libmesh_assert_less (s, n_sides());
70 232 : return std::find(std::begin(side_nodes_map[s]),
71 616 : std::end(side_nodes_map[s]),
72 616 : n) != std::end(side_nodes_map[s]);
73 : }
74 :
75 : std::vector<unsigned>
76 136 : InfHex16::nodes_on_side(const unsigned int s) const
77 : {
78 47 : libmesh_assert_less(s, n_sides());
79 136 : auto trim = (s == 0) ? 0 : 2;
80 136 : return {std::begin(side_nodes_map[s]), std::end(side_nodes_map[s]) - trim};
81 : }
82 :
83 : std::vector<unsigned>
84 172 : InfHex16::nodes_on_edge(const unsigned int e) const
85 : {
86 60 : libmesh_assert_less(e, n_edges());
87 112 : auto trim = (e < 4) ? 0 : 1;
88 172 : return {std::begin(edge_nodes_map[e]), std::end(edge_nodes_map[e]) - trim};
89 : }
90 :
91 700 : bool InfHex16::is_node_on_edge(const unsigned int n,
92 : const unsigned int e) const
93 : {
94 276 : libmesh_assert_less (e, n_edges());
95 276 : return std::find(std::begin(edge_nodes_map[e]),
96 700 : std::end(edge_nodes_map[e]),
97 700 : n) != std::end(edge_nodes_map[e]);
98 : }
99 :
100 :
101 :
102 802 : Order InfHex16::default_order() const
103 : {
104 802 : return SECOND;
105 : }
106 :
107 :
108 :
109 0 : unsigned int InfHex16::local_side_node(unsigned int side,
110 : unsigned int side_node) const
111 : {
112 0 : libmesh_assert_less (side, this->n_sides());
113 :
114 : // Never more than 8 nodes per side.
115 0 : libmesh_assert_less (side_node, InfHex16::nodes_per_side);
116 :
117 : // Some sides have 6 nodes.
118 0 : libmesh_assert(side == 0 || side_node < 6);
119 :
120 0 : return InfHex16::side_nodes_map[side][side_node];
121 : }
122 :
123 :
124 :
125 480 : unsigned int InfHex16::local_edge_node(unsigned int edge,
126 : unsigned int edge_node) const
127 : {
128 160 : libmesh_assert_less (edge, this->n_edges());
129 :
130 : // Never more than 3 nodes per edge.
131 160 : libmesh_assert_less (edge_node, InfHex16::nodes_per_edge);
132 :
133 : // Some edges only have 2 nodes.
134 160 : libmesh_assert(edge < 4 || edge_node < 2);
135 :
136 480 : return InfHex16::edge_nodes_map[edge][edge_node];
137 : }
138 :
139 :
140 :
141 782 : std::unique_ptr<Elem> InfHex16::build_side_ptr (const unsigned int i)
142 : {
143 308 : libmesh_assert_less (i, this->n_sides());
144 :
145 782 : std::unique_ptr<Elem> face;
146 : // Think of a unit cube: (-1,1) x (-1,1) x (1,1)
147 782 : switch (i)
148 : {
149 : // the base face
150 243 : case 0:
151 : {
152 243 : face = std::make_unique<Quad8>();
153 243 : break;
154 : }
155 :
156 : // connecting to another infinite element
157 539 : case 1:
158 : case 2:
159 : case 3:
160 : case 4:
161 : {
162 539 : face = std::make_unique<InfQuad6>();
163 539 : break;
164 : }
165 :
166 0 : default:
167 0 : libmesh_error_msg("Invalid side i = " << i);
168 : }
169 :
170 : // Set the nodes
171 5960 : for (auto n : face->node_index_range())
172 7218 : face->set_node(n, this->node_ptr(InfHex16::side_nodes_map[i][n]));
173 :
174 782 : face->set_interior_parent(this);
175 474 : face->inherit_data_from(*this);
176 :
177 782 : return face;
178 0 : }
179 :
180 :
181 :
182 70 : void InfHex16::build_side_ptr (std::unique_ptr<Elem> & side,
183 : const unsigned int i)
184 : {
185 25 : libmesh_assert_less (i, this->n_sides());
186 :
187 : // Think of a unit cube: (-1,1) x (-1,1) x (1,1)
188 70 : switch (i)
189 : {
190 : // the base face
191 5 : case 0:
192 : {
193 14 : if (!side.get() || side->type() != QUAD8)
194 : {
195 14 : side = this->build_side_ptr(i);
196 11 : return;
197 : }
198 1 : break;
199 : }
200 :
201 : // connecting to another infinite element
202 20 : case 1:
203 : case 2:
204 : case 3:
205 : case 4:
206 : {
207 56 : if (!side.get() || side->type() != INFQUAD6)
208 : {
209 14 : side = this->build_side_ptr(i);
210 11 : return;
211 : }
212 16 : break;
213 : }
214 :
215 0 : default:
216 0 : libmesh_error_msg("Invalid side i = " << i);
217 : }
218 :
219 31 : side->inherit_data_from(*this);
220 :
221 : // Set the nodes
222 342 : for (auto n : side->node_index_range())
223 398 : side->set_node(n, this->node_ptr(InfHex16::side_nodes_map[i][n]));
224 : }
225 :
226 :
227 :
228 2704 : std::unique_ptr<Elem> InfHex16::build_edge_ptr (const unsigned int i)
229 : {
230 2704 : if (i < 4) // base edges
231 1260 : return this->simple_build_edge_ptr<Edge3,InfHex16>(i);
232 :
233 : // infinite edges
234 1444 : return this->simple_build_edge_ptr<InfEdge2,InfHex16>(i);
235 : }
236 :
237 :
238 :
239 0 : void InfHex16::build_edge_ptr (std::unique_ptr<Elem> & edge,
240 : const unsigned int i)
241 : {
242 0 : libmesh_assert_less (i, this->n_edges());
243 :
244 0 : switch (i)
245 : {
246 : // the base edges
247 0 : case 0:
248 : case 1:
249 : case 2:
250 : case 3:
251 : {
252 0 : if (!edge.get() || edge->type() != EDGE3)
253 : {
254 0 : edge = this->build_edge_ptr(i);
255 0 : return;
256 : }
257 0 : break;
258 : }
259 :
260 : // the infinite edges
261 0 : case 4:
262 : case 5:
263 : case 6:
264 : case 7:
265 : {
266 0 : if (!edge.get() || edge->type() != INFEDGE2)
267 : {
268 0 : edge = this->build_edge_ptr(i);
269 0 : return;
270 : }
271 0 : break;
272 : }
273 :
274 0 : default:
275 0 : libmesh_error_msg("Invalid edge i = " << i);
276 : }
277 :
278 0 : edge->inherit_data_from(*this);
279 :
280 : // Set the nodes
281 0 : for (auto n : edge->node_index_range())
282 0 : edge->set_node(n, this->node_ptr(InfHex16::edge_nodes_map[i][n]));
283 : }
284 :
285 :
286 :
287 0 : void InfHex16::connectivity(const unsigned int sc,
288 : const IOPackage iop,
289 : std::vector<dof_id_type> & conn) const
290 : {
291 0 : libmesh_assert(_nodes);
292 0 : libmesh_assert_less (sc, this->n_sub_elem());
293 0 : libmesh_assert_not_equal_to (iop, INVALID_IO_PACKAGE);
294 :
295 0 : switch (iop)
296 : {
297 0 : case TECPLOT:
298 : {
299 0 : switch (sc)
300 : {
301 0 : case 0:
302 :
303 0 : conn[0] = this->node_id(0)+1;
304 0 : conn[1] = this->node_id(1)+1;
305 0 : conn[2] = this->node_id(2)+1;
306 0 : conn[3] = this->node_id(3)+1;
307 0 : conn[4] = this->node_id(4)+1;
308 0 : conn[5] = this->node_id(5)+1;
309 0 : conn[6] = this->node_id(6)+1;
310 0 : conn[7] = this->node_id(7)+1;
311 0 : return;
312 :
313 0 : default:
314 0 : libmesh_error_msg("Invalid sc = " << sc);
315 : }
316 : }
317 :
318 0 : default:
319 0 : libmesh_error_msg("Unsupported IO package " << iop);
320 : }
321 : }
322 :
323 :
324 :
325 :
326 0 : unsigned short int InfHex16::second_order_adjacent_vertex (const unsigned int n,
327 : const unsigned int v) const
328 : {
329 0 : libmesh_assert_greater_equal (n, this->n_vertices());
330 0 : libmesh_assert_less (n, this->n_nodes());
331 0 : libmesh_assert_less (v, 2);
332 : // note that the _second_order_adjacent_vertices matrix is
333 : // stored in \p InfHex
334 0 : return _second_order_adjacent_vertices[n-this->n_vertices()][v];
335 : }
336 :
337 :
338 :
339 : std::pair<unsigned short int, unsigned short int>
340 0 : InfHex16::second_order_child_vertex (const unsigned int n) const
341 : {
342 0 : libmesh_assert_greater_equal (n, this->n_vertices());
343 0 : libmesh_assert_less (n, this->n_nodes());
344 : /*
345 : * the _second_order_vertex_child_* vectors are
346 : * stored in cell_inf_hex.C, since they are identical
347 : * for InfHex16 and InfHex18
348 : */
349 0 : return std::pair<unsigned short int, unsigned short int>
350 0 : (_second_order_vertex_child_number[n],
351 0 : _second_order_vertex_child_index[n]);
352 : }
353 :
354 :
355 :
356 :
357 :
358 : #ifdef LIBMESH_ENABLE_AMR
359 :
360 : const Real InfHex16::_embedding_matrix[InfHex16::num_children][InfHex16::num_nodes][InfHex16::num_nodes] =
361 : {
362 : // embedding matrix for child 0
363 : {
364 : // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 th parent Node
365 : { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 0th child N.
366 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 1
367 : { -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0}, // 2
368 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, // 3
369 : { 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 4
370 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, // 5
371 : { 0.0, 0.0, 0.0, 0.0, -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5}, // 6
372 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}, // 7
373 : { 0.375, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 8
374 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.75, 0.375, 0.25, 0.375, 0.0, 0.0, 0.0, 0.0}, // 9
375 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.25, 0.375, 0.75, 0.0, 0.0, 0.0, 0.0}, // 10
376 : { 0.375, 0.0, 0.0, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0}, // 11
377 : { 0.0, 0.0, 0.0, 0.0, 0.375, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0}, // 12
378 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.75, 0.375, 0.25, 0.375}, // 13
379 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.25, 0.375, 0.75}, // 14
380 : { 0.0, 0.0, 0.0, 0.0, 0.375, 0.0, 0.0, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75} // 15
381 : },
382 :
383 : // embedding matrix for child 1
384 : {
385 : // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 th parent Node
386 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 0th child N.
387 : { 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 1
388 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 2
389 : { -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0}, // 3
390 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, // 4
391 : { 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 5
392 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, // 6
393 : { 0.0, 0.0, 0.0, 0.0, -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5}, // 7
394 : { -0.125, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 8
395 : { 0.0, 0.375, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 9
396 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.75, 0.375, 0.25, 0.0, 0.0, 0.0, 0.0}, // 10
397 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.75, 0.375, 0.25, 0.375, 0.0, 0.0, 0.0, 0.0}, // 11
398 : { 0.0, 0.0, 0.0, 0.0, -0.125, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0}, // 12
399 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.375, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0}, // 13
400 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.75, 0.375, 0.25}, // 14
401 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.75, 0.375, 0.25, 0.375} // 15
402 : },
403 :
404 : // embedding matrix for child 2
405 : {
406 : // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 th parent Node
407 : { -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0}, // 0th child N.
408 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 1
409 : { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 2
410 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 3
411 : { 0.0, 0.0, 0.0, 0.0, -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5}, // 4
412 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, // 5
413 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 6
414 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, // 7
415 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.75, 0.375, 0.25, 0.0, 0.0, 0.0, 0.0}, // 8
416 : { 0.0, -0.125, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 9
417 : { 0.0, 0.0, 0.375, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0, 0.0}, // 10
418 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.25, 0.375, 0.75, 0.375, 0.0, 0.0, 0.0, 0.0}, // 11
419 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.75, 0.375, 0.25}, // 12
420 : { 0.0, 0.0, 0.0, 0.0, 0.0, -0.125, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0}, // 13
421 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.375, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 14
422 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.25, 0.375, 0.75, 0.375} // 15
423 : },
424 :
425 : // embedding matrix for child 3
426 : {
427 : // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 th parent Node
428 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, // 0th child N.
429 : { -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0}, // 1
430 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 2
431 : { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 3
432 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}, // 4
433 : { 0.0, 0.0, 0.0, 0.0, -0.25, -0.25, -0.25, -0.25, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.5}, // 5
434 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, // 6
435 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // 7
436 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.25, 0.375, 0.75, 0.0, 0.0, 0.0, 0.0}, // 8
437 : { -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.25, 0.375, 0.75, 0.375, 0.0, 0.0, 0.0, 0.0}, // 9
438 : { 0.0, 0.0, -0.125, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0, 0.0}, // 10
439 : { -0.125, 0.0, 0.0, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0, 0.0, 0.0}, // 11
440 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.375, 0.25, 0.375, 0.75}, // 12
441 : { 0.0, 0.0, 0.0, 0.0, -0.1875, -0.1875, -0.1875, -0.1875, 0.0, 0.0, 0.0, 0.0, 0.25, 0.375, 0.75, 0.375}, // 13
442 : { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.125, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 14
443 : { 0.0, 0.0, 0.0, 0.0, -0.125, 0.0, 0.0, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75} // 15
444 : }
445 : };
446 :
447 :
448 : #endif
449 :
450 :
451 : void
452 0 : InfHex16::permute(unsigned int perm_num)
453 : {
454 0 : libmesh_assert_less (perm_num, 4);
455 :
456 0 : for (unsigned int i = 0; i != perm_num; ++i)
457 : {
458 0 : swap4nodes(0,1,2,3);
459 0 : swap4nodes(4,5,6,7);
460 0 : swap4nodes(8,9,10,11);
461 0 : swap4nodes(12,13,14,15);
462 0 : swap4neighbors(1,2,3,4);
463 : }
464 0 : }
465 :
466 :
467 : void
468 0 : InfHex16::flip(BoundaryInfo * boundary_info)
469 : {
470 0 : libmesh_assert(boundary_info);
471 :
472 0 : swap2nodes(0,1);
473 0 : swap2nodes(2,3);
474 0 : swap2nodes(4,5);
475 0 : swap2nodes(6,7);
476 0 : swap2nodes(9,11);
477 0 : swap2nodes(13,15);
478 0 : swap2neighbors(2,4);
479 0 : swap2boundarysides(2,4,boundary_info);
480 0 : swap2boundaryedges(1,3,boundary_info);
481 0 : swap2boundaryedges(4,5,boundary_info);
482 0 : swap2boundaryedges(6,7,boundary_info);
483 0 : }
484 :
485 :
486 : ElemType
487 45 : InfHex16::side_type (const unsigned int s) const
488 : {
489 15 : libmesh_assert_less (s, 5);
490 45 : if (s == 0)
491 9 : return QUAD8;
492 12 : return INFQUAD6;
493 : }
494 :
495 :
496 : } // namespace libMesh
497 :
498 : #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
|