cell_inf_hex18.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2018 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_hex18.h"
25 #include "libmesh/edge_edge3.h"
26 #include "libmesh/edge_inf_edge2.h"
27 #include "libmesh/face_quad9.h"
28 #include "libmesh/face_inf_quad6.h"
29 #include "libmesh/side.h"
31 #include "libmesh/enum_order.h"
32 
33 namespace libMesh
34 {
35 
36 
37 // ------------------------------------------------------------
38 // InfHex18 class static member initializations
39 const int InfHex18::num_nodes;
40 const int InfHex18::num_sides;
41 const int InfHex18::num_edges;
42 const int InfHex18::num_children;
43 const int InfHex18::nodes_per_side;
44 const int InfHex18::nodes_per_edge;
45 
47  {
48  { 0, 1, 2, 3, 8, 9, 10, 11, 16}, // Side 0
49  { 0, 1, 4, 5, 8, 12, 99, 99, 99}, // Side 1
50  { 1, 2, 5, 6, 9, 13, 99, 99, 99}, // Side 2
51  { 2, 3, 6, 7, 10, 14, 99, 99, 99}, // Side 3
52  { 3, 0, 7, 4, 11, 15, 99, 99, 99} // Side 4
53  };
54 
56  {
57  {0, 1, 8}, // Edge 0
58  {1, 2, 9}, // Edge 1
59  {2, 3, 10}, // Edge 2
60  {0, 3, 11}, // Edge 3
61  {0, 4, 99}, // Edge 4
62  {1, 5, 99}, // Edge 5
63  {2, 6, 99}, // Edge 6
64  {3, 7, 99} // Edge 7
65  };
66 
67 // ------------------------------------------------------------
68 // InfHex18 class member functions
69 
71 {
72  return SECOND;
73 }
74 
75 bool InfHex18::is_vertex(const unsigned int i) const
76 {
77  if (i < 4)
78  return true;
79  return false;
80 }
81 
82 bool InfHex18::is_edge(const unsigned int i) const
83 {
84  if (i < 4)
85  return false;
86  if (i > 11)
87  return false;
88  return true;
89 }
90 
91 bool InfHex18::is_face(const unsigned int i) const
92 {
93  if (i > 11)
94  return true;
95  return false;
96 }
97 
98 bool InfHex18::is_node_on_side(const unsigned int n,
99  const unsigned int s) const
100 {
101  libmesh_assert_less (s, n_sides());
102  return std::find(std::begin(side_nodes_map[s]),
104  n) != std::end(side_nodes_map[s]);
105 }
106 
107 std::vector<unsigned>
108 InfHex18::nodes_on_side(const unsigned int s) const
109 {
110  libmesh_assert_less(s, n_sides());
111  auto trim = (s == 0) ? 0 : 3;
112  return {std::begin(side_nodes_map[s]), std::end(side_nodes_map[s]) - trim};
113 }
114 
115 bool InfHex18::is_node_on_edge(const unsigned int n,
116  const unsigned int e) const
117 {
118  libmesh_assert_less (e, n_edges());
119  return std::find(std::begin(edge_nodes_map[e]),
121  n) != std::end(edge_nodes_map[e]);
122 }
123 
124 
125 
126 dof_id_type InfHex18::key (const unsigned int s) const
127 {
128  libmesh_assert_less (s, this->n_sides());
129 
130  // Think of a unit cube: (-1,1) x (-1,1) x (1,1)
131  switch (s)
132  {
133  case 0: // the base face
134  return this->compute_key (this->node_id(16));
135 
136  case 1: // the face at y = -1
137  case 2: // the face at x = 1
138  case 3: // the face at y = 1
139  case 4: // the face at x = -1
140  return InfHex::key(s);
141 
142  default:
143  libmesh_error_msg("Invalid side s = " << s);
144  }
145 }
146 
147 
148 
149 unsigned int InfHex18::which_node_am_i(unsigned int side,
150  unsigned int side_node) const
151 {
152  libmesh_assert_less (side, this->n_sides());
153 
154  // Never more than 9 nodes per side.
155  libmesh_assert_less (side_node, 9);
156 
157  // Some sides have 6 nodes.
158  libmesh_assert(side == 0 || side_node < 6);
159 
160  return InfHex18::side_nodes_map[side][side_node];
161 }
162 
163 
164 
165 std::unique_ptr<Elem> InfHex18::build_side_ptr (const unsigned int i,
166  bool proxy)
167 {
168  libmesh_assert_less (i, this->n_sides());
169 
170  if (proxy)
171  {
172  switch (i)
173  {
174  // base
175  case 0:
176  return libmesh_make_unique<Side<Quad9,InfHex18>>(this,i);
177 
178  // ifem sides
179  case 1:
180  case 2:
181  case 3:
182  case 4:
183  return libmesh_make_unique<Side<InfQuad6,InfHex18>>(this,i);
184 
185  default:
186  libmesh_error_msg("Invalid side i = " << i);
187  }
188  }
189 
190  else
191  {
192  // Return value
193  std::unique_ptr<Elem> face;
194 
195  // Think of a unit cube: (-1,1) x (-1,1) x (1,1)
196  switch (i)
197  {
198  // the base face
199  case 0:
200  {
201  face = libmesh_make_unique<Quad9>();
202  break;
203  }
204 
205  // connecting to another infinite element
206  case 1:
207  case 2:
208  case 3:
209  case 4:
210  {
211  face = libmesh_make_unique<InfQuad6>();
212  break;
213  }
214 
215  default:
216  libmesh_error_msg("Invalid side i = " << i);
217  }
218 
219  face->subdomain_id() = this->subdomain_id();
220 
221  // Set the nodes
222  for (unsigned n=0; n<face->n_nodes(); ++n)
223  face->set_node(n) = this->node_ptr(InfHex18::side_nodes_map[i][n]);
224 
225  return face;
226  }
227 }
228 
229 
230 
231 void InfHex18::build_side_ptr (std::unique_ptr<Elem> & side,
232  const unsigned int i)
233 {
234  libmesh_assert_less (i, this->n_sides());
235 
236  // Think of a unit cube: (-1,1) x (-1,1) x (1,1)
237  switch (i)
238  {
239  // the base face
240  case 0:
241  {
242  if (!side.get() || side->type() != QUAD9)
243  {
244  side = this->build_side_ptr(i, false);
245  return;
246  }
247  break;
248  }
249 
250  // connecting to another infinite element
251  case 1:
252  case 2:
253  case 3:
254  case 4:
255  {
256  if (!side.get() || side->type() != INFQUAD6)
257  {
258  side = this->build_side_ptr(i, false);
259  return;
260  }
261  break;
262  }
263 
264  default:
265  libmesh_error_msg("Invalid side i = " << i);
266  }
267 
268  side->subdomain_id() = this->subdomain_id();
269 
270  // Set the nodes
271  for (auto n : side->node_index_range())
272  side->set_node(n) = this->node_ptr(InfHex18::side_nodes_map[i][n]);
273 }
274 
275 
276 
277 std::unique_ptr<Elem> InfHex18::build_edge_ptr (const unsigned int i)
278 {
279  libmesh_assert_less (i, this->n_edges());
280 
281  if (i < 4) // base edges
282  return libmesh_make_unique<SideEdge<Edge3,InfHex18>>(this,i);
283 
284  // infinite edges
285  return libmesh_make_unique<SideEdge<InfEdge2,InfHex18>>(this,i);
286 }
287 
288 
289 
290 void InfHex18::connectivity(const unsigned int sc,
291  const IOPackage iop,
292  std::vector<dof_id_type> & conn) const
293 {
294  libmesh_assert(_nodes);
295  libmesh_assert_less (sc, this->n_sub_elem());
296  libmesh_assert_not_equal_to (iop, INVALID_IO_PACKAGE);
297 
298  switch (iop)
299  {
300  case TECPLOT:
301  {
302  switch (sc)
303  {
304  case 0:
305 
306  conn[0] = this->node_id(0)+1;
307  conn[1] = this->node_id(8)+1;
308  conn[2] = this->node_id(16)+1;
309  conn[3] = this->node_id(11)+1;
310  conn[4] = this->node_id(4)+1;
311  conn[5] = this->node_id(12)+1;
312  conn[6] = this->node_id(17)+1;
313  conn[7] = this->node_id(15)+1;
314 
315  return;
316 
317  case 1:
318 
319  conn[0] = this->node_id(8)+1;
320  conn[1] = this->node_id(1)+1;
321  conn[2] = this->node_id(9)+1;
322  conn[3] = this->node_id(16)+1;
323  conn[4] = this->node_id(12)+1;
324  conn[5] = this->node_id(5)+1;
325  conn[6] = this->node_id(13)+1;
326  conn[7] = this->node_id(17)+1;
327 
328  return;
329 
330  case 2:
331 
332  conn[0] = this->node_id(11)+1;
333  conn[1] = this->node_id(16)+1;
334  conn[2] = this->node_id(10)+1;
335  conn[3] = this->node_id(3)+1;
336  conn[4] = this->node_id(15)+1;
337  conn[5] = this->node_id(17)+1;
338  conn[6] = this->node_id(14)+1;
339  conn[7] = this->node_id(7)+1;
340 
341  return;
342 
343  case 3:
344 
345  conn[0] = this->node_id(16)+1;
346  conn[1] = this->node_id(9)+1;
347  conn[2] = this->node_id(2)+1;
348  conn[3] = this->node_id(10)+1;
349  conn[4] = this->node_id(17)+1;
350  conn[5] = this->node_id(13)+1;
351  conn[6] = this->node_id(6)+1;
352  conn[7] = this->node_id(14)+1;
353 
354  return;
355 
356  default:
357  libmesh_error_msg("Invalid sc = " << sc);
358  }
359  }
360 
361  default:
362  libmesh_error_msg("Unsupported IO package " << iop);
363  }
364 }
365 
366 
367 
368 
369 unsigned int InfHex18::n_second_order_adjacent_vertices (const unsigned int n) const
370 {
371  switch (n)
372  {
373  case 8:
374  case 9:
375  case 10:
376  case 11:
377  case 12:
378  case 13:
379  case 14:
380  case 15:
381  return 2;
382 
383  case 16:
384  case 17:
385  return 4;
386 
387  default:
388  libmesh_error_msg("Invalid node n = " << n);
389  }
390 }
391 
392 
393 
394 unsigned short int InfHex18::second_order_adjacent_vertex (const unsigned int n,
395  const unsigned int v) const
396 {
397  libmesh_assert_greater_equal (n, this->n_vertices());
398  libmesh_assert_less (n, this->n_nodes());
399  libmesh_assert_less (v, this->n_second_order_adjacent_vertices(n));
400 
401  if (n == 16)
402  /*
403  * for the bubble node in the base the return value is
404  * simply v. Why? -- the user asks for the v-th
405  * adjacent vertex, from \p n_second_order_adjacent_vertices()
406  * there are 4 adjacent vertices, and these happen to be
407  * 0..3
408  */
409  return static_cast<unsigned short int>(v);
410  else if (n == 17)
411  /*
412  * for the bubble node further out similar reasoning works,
413  * but v must be shifted to the further-out nodes:
414  * simply add 4
415  */
416  return static_cast<unsigned short int>(v+4);
417 
418  else
419  /*
420  * all others are stored in the vertices matrix -- note
421  * that this matrix is kept in \p InfHex to foster
422  * code-reuse
423  */
424  return _second_order_adjacent_vertices[n-this->n_vertices()][v];
425 }
426 
427 
428 
429 std::pair<unsigned short int, unsigned short int>
430 InfHex18::second_order_child_vertex (const unsigned int n) const
431 {
432  libmesh_assert_greater_equal (n, this->n_vertices());
433  libmesh_assert_less (n, this->n_nodes());
434  /*
435  * the _second_order_vertex_child_* vectors are
436  * stored in cell_inf_hex.C, since they are identical
437  * for InfHex16 and InfHex18
438  */
439  return std::pair<unsigned short int, unsigned short int>
442 }
443 
444 
445 
446 
447 
448 
449 
450 #ifdef LIBMESH_ENABLE_AMR
451 
453  {
454  // embedding matrix for child 0
455  {
456  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 th parent Node
457  { 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, 0.0, 0.0}, // 0th child N.
458  { 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, 0.0, 0.0}, // 1
459  { 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.0, 1.0, 0.0}, // 2
460  { 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, 0.0, 0.0}, // 3
461  { 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, 0.0, 0.0}, // 4
462  { 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, 0.0, 0.0}, // 5
463  { 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.0, 0.0, 1.0}, // 6
464  { 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, 0.0, 0.0}, // 7
465  { 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, 0.0, 0.0}, // 8
466  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.375, 0.0, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 9
467  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.125, 0.0, 0.375, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 10
468  { 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, 0.0, 0.0}, // 11
469  { 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, 0.0, 0.0}, // 12
470  { 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.375, 0.0, -0.125, 0.0, 0.0, 0.75}, // 13
471  { 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.125, 0.0, 0.375, 0.0, 0.75}, // 14
472  { 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, 0.0, 0.0}, // 15
473  { 0.140625, -0.046875, 0.015625, -0.046875, 0.0, 0.0, 0.0, 0.0, 0.28125, -0.09375, -0.09375, 0.28125, 0.0, 0.0, 0.0, 0.0, 0.5625, 0.0}, // 16
474  { 0.0, 0.0, 0.0, 0.0, 0.140625, -0.046875, 0.015625, -0.046875, 0.0, 0.0, 0.0, 0.0, 0.28125, -0.09375, -0.09375, 0.28125, 0.0, 0.5625} // 17
475  },
476 
477  // embedding matrix for child 1
478  {
479  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 th parent Node
480  { 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, 0.0, 0.0}, // 0th child N.
481  { 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, 0.0, 0.0}, // 1
482  { 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, 0.0, 0.0}, // 2
483  { 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.0, 1.0, 0.0}, // 3
484  { 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, 0.0, 0.0}, // 4
485  { 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, 0.0, 0.0}, // 5
486  { 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, 0.0, 0.0}, // 6
487  { 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.0, 0.0, 1.0}, // 7
488  { -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, 0.0, 0.0}, // 8
489  { 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, 0.0, 0.0}, // 9
490  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.375, 0.0, -0.125, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 10
491  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.375, 0.0, -0.125, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 11
492  { 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, 0.0, 0.0}, // 12
493  { 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, 0.0, 0.0}, // 13
494  { 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.375, 0.0, -0.125, 0.0, 0.75}, // 14
495  { 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.375, 0.0, -0.125, 0.0, 0.0, 0.75}, // 15
496  { -0.046875, 0.140625, -0.046875, 0.015625, 0.0, 0.0, 0.0, 0.0, 0.28125, 0.28125, -0.09375, -0.09375, 0.0, 0.0, 0.0, 0.0, 0.5625, 0.0}, // 16
497  { 0.0, 0.0, 0.0, 0.0, -0.046875, 0.140625, -0.046875, 0.015625, 0.0, 0.0, 0.0, 0.0, 0.28125, 0.28125, -0.09375, -0.09375, 0.0, 0.5625} // 17
498  },
499 
500  // embedding matrix for child 2
501  {
502  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 th parent Node
503  { 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, 0.0, 0.0}, // 0th child N.
504  { 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.0, 1.0, 0.0}, // 1
505  { 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, 0.0, 0.0}, // 2
506  { 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, 0.0, 0.0}, // 3
507  { 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, 0.0, 0.0}, // 4
508  { 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.0, 0.0, 1.0}, // 5
509  { 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, 0.0, 0.0}, // 6
510  { 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, 0.0, 0.0}, // 7
511  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.125, 0.0, 0.375, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 8
512  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.125, 0.0, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 9
513  { 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, 0.0, 0.0}, // 10
514  { -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, 0.0, 0.0}, // 11
515  { 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.125, 0.0, 0.375, 0.0, 0.75}, // 12
516  { 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.125, 0.0, 0.375, 0.0, 0.0, 0.75}, // 13
517  { 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, 0.0, 0.0}, // 14
518  { 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, 0.0, 0.0}, // 15
519  { -0.046875, 0.015625, -0.046875, 0.140625, 0.0, 0.0, 0.0, 0.0, -0.09375, -0.09375, 0.28125, 0.28125, 0.0, 0.0, 0.0, 0.0, 0.5625, 0.0}, // 16
520  { 0.0, 0.0, 0.0, 0.0, -0.046875, 0.015625, -0.046875, 0.140625, 0.0, 0.0, 0.0, 0.0, -0.09375, -0.09375, 0.28125, 0.28125, 0.0, 0.5625} // 17
521  },
522 
523  // embedding matrix for child 3
524  {
525  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 th parent Node
526  { 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.0, 1.0, 0.0}, // 0th child N.
527  { 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, 0.0, 0.0}, // 1
528  { 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, 0.0, 0.0}, // 2
529  { 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, 0.0, 0.0}, // 3
530  { 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.0, 0.0, 1.0}, // 4
531  { 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, 0.0, 0.0}, // 5
532  { 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, 0.0, 0.0}, // 6
533  { 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, 0.0, 0.0}, // 7
534  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.375, 0.0, -0.125, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 8
535  { 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, 0.0, 0.0}, // 9
536  { 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, 0.0, 0.0}, // 10
537  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.125, 0.0, 0.375, 0.0, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0}, // 11
538  { 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.375, 0.0, -0.125, 0.0, 0.75}, // 12
539  { 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, 0.0, 0.0}, // 13
540  { 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, 0.0, 0.0}, // 14
541  { 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.125, 0.0, 0.375, 0.0, 0.0, 0.75}, // 15
542  { 0.015625, -0.046875, 0.140625, -0.046875, 0.0, 0.0, 0.0, 0.0, -0.09375, 0.28125, 0.28125, -0.09375, 0.0, 0.0, 0.0, 0.0, 0.5625, 0.0}, // 16
543  { 0.0, 0.0, 0.0, 0.0, 0.015625, -0.046875, 0.140625, -0.046875, 0.0, 0.0, 0.0, 0.0, -0.09375, 0.28125, 0.28125, -0.09375, 0.0, 0.5625} // 17
544  }
545  };
546 
547 
548 
549 
550 #endif
551 
552 } // namespace libMesh
553 
554 #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
virtual bool is_edge(const unsigned int i) const override
static const int num_nodes
static const int num_sides
static const int nodes_per_edge
Node ** _nodes
Definition: elem.h:1695
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i, bool proxy) override
virtual unsigned short int second_order_adjacent_vertex(const unsigned int n, const unsigned int v) const override
virtual bool is_vertex(const unsigned int i) const override
virtual dof_id_type key() const
Definition: elem.C:401
virtual unsigned int n_sub_elem() const override
unsigned short int side
Definition: xdr_io.C:50
static const int num_children
virtual Order default_order() const override
IterBase * end
virtual void connectivity(const unsigned int sc, const IOPackage iop, std::vector< dof_id_type > &conn) const override
static const unsigned short int _second_order_adjacent_vertices[8][2]
Definition: cell_inf_hex.h:195
virtual std::unique_ptr< Elem > build_edge_ptr(const unsigned int i) override
static const float _embedding_matrix[num_children][num_nodes][num_nodes]
virtual unsigned int n_vertices() const override final
Definition: cell_inf_hex.h:91
virtual bool is_node_on_edge(const unsigned int n, const unsigned int e) const override
static const unsigned int edge_nodes_map[num_edges][nodes_per_edge]
virtual unsigned int which_node_am_i(unsigned int side, unsigned int side_node) const override
static const int nodes_per_side
virtual std::pair< unsigned short int, unsigned short int > second_order_child_vertex(const unsigned int n) const override
static const int num_edges
static const unsigned short int _second_order_vertex_child_index[18]
Definition: cell_inf_hex.h:205
subdomain_id_type subdomain_id() const
Definition: elem.h:2034
static const unsigned int side_nodes_map[num_sides][nodes_per_side]
const Node * node_ptr(const unsigned int i) const
Definition: elem.h:1957
virtual unsigned int n_edges() const override final
Definition: cell_inf_hex.h:104
virtual unsigned int n_second_order_adjacent_vertices(const unsigned int) const override
virtual bool is_node_on_side(const unsigned int n, const unsigned int s) const override
static dof_id_type compute_key(dof_id_type n0)
Definition: elem.h:2754
virtual bool is_face(const unsigned int i) const override
dof_id_type node_id(const unsigned int i) const
Definition: elem.h:1914
static const unsigned short int _second_order_vertex_child_number[18]
Definition: cell_inf_hex.h:200
std::unique_ptr< Elem > side(const unsigned int i) const
Definition: elem.h:2202
virtual std::vector< unsigned int > nodes_on_side(const unsigned int s) const override
uint8_t dof_id_type
Definition: id_types.h:64
virtual unsigned int n_sides() const override final
Definition: cell_inf_hex.h:85
virtual unsigned int n_nodes() const override