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

Site Created By: libMesh Developers
Last modified: February 07 2014 16:57:04 UTC

Hosted By:
SourceForge.net Logo