cell_prism18.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 
19 // C++ includes
20 
21 // Local includes
22 #include "libmesh/side.h"
23 #include "libmesh/cell_prism18.h"
24 #include "libmesh/edge_edge3.h"
25 #include "libmesh/face_quad9.h"
26 #include "libmesh/face_tri6.h"
27 
28 namespace libMesh
29 {
30 
31 
32 
33 // ------------------------------------------------------------
34 // Prism18 class static member initializations
35 const unsigned int Prism18::side_nodes_map[5][9] =
36 {
37  {0, 2, 1, 8, 7, 6, 99, 99, 99}, // Side 0
38  {0, 1, 4, 3, 6, 10, 12, 9, 15}, // Side 1
39  {1, 2, 5, 4, 7, 11, 13, 10, 16}, // Side 2
40  {2, 0, 3, 5, 8, 9, 14, 11, 17}, // Side 3
41  {3, 4, 5, 12, 13, 14, 99, 99, 99} // Side 4
42 };
43 
44 const unsigned int Prism18::edge_nodes_map[9][3] =
45 {
46  {0, 1, 6}, // Side 0
47  {1, 2, 7}, // Side 1
48  {0, 2, 8}, // Side 2
49  {0, 3, 9}, // Side 3
50  {1, 4, 10}, // Side 4
51  {2, 5, 11}, // Side 5
52  {3, 4, 12}, // Side 6
53  {4, 5, 13}, // Side 7
54  {3, 5, 14} // Side 8
55 };
56 
57 
58 // ------------------------------------------------------------
59 // Prism18 class member functions
60 
61 bool Prism18::is_vertex(const unsigned int i) const
62 {
63  if (i < 6)
64  return true;
65  return false;
66 }
67 
68 bool Prism18::is_edge(const unsigned int i) const
69 {
70  if (i < 6)
71  return false;
72  if (i > 14)
73  return false;
74  return true;
75 }
76 
77 bool Prism18::is_face(const unsigned int i) const
78 {
79  if (i > 14)
80  return true;
81  return false;
82 }
83 
84 bool Prism18::is_node_on_side(const unsigned int n,
85  const unsigned int s) const
86 {
87  libmesh_assert_less (s, n_sides());
88  for (unsigned int i = 0; i != 9; ++i)
89  if (side_nodes_map[s][i] == n)
90  return true;
91  return false;
92 }
93 
94 bool Prism18::is_node_on_edge(const unsigned int n,
95  const unsigned int e) const
96 {
97  libmesh_assert_less (e, n_edges());
98  for (unsigned int i = 0; i != 3; ++i)
99  if (edge_nodes_map[e][i] == n)
100  return true;
101  return false;
102 }
103 
104 
105 
107 {
108  // Make sure z edges are affine
109  Point v = this->point(3) - this->point(0);
110  if (!v.relative_fuzzy_equals(this->point(4) - this->point(1)) ||
111  !v.relative_fuzzy_equals(this->point(5) - this->point(2)))
112  return false;
113  // Make sure edges are straight
114  v /= 2;
115  if (!v.relative_fuzzy_equals(this->point(9) - this->point(0)) ||
116  !v.relative_fuzzy_equals(this->point(10) - this->point(1)) ||
117  !v.relative_fuzzy_equals(this->point(11) - this->point(2)) ||
118  !v.relative_fuzzy_equals(this->point(15) - this->point(6)) ||
119  !v.relative_fuzzy_equals(this->point(16) - this->point(7)) ||
120  !v.relative_fuzzy_equals(this->point(17) - this->point(8)))
121  return false;
122  v = (this->point(1) - this->point(0))/2;
123  if (!v.relative_fuzzy_equals(this->point(6) - this->point(0)) ||
124  !v.relative_fuzzy_equals(this->point(12) - this->point(3)))
125  return false;
126  v = (this->point(2) - this->point(0))/2;
127  if (!v.relative_fuzzy_equals(this->point(8) - this->point(0)) ||
128  !v.relative_fuzzy_equals(this->point(14) - this->point(3)))
129  return false;
130  v = (this->point(2) - this->point(1))/2;
131  if (!v.relative_fuzzy_equals(this->point(7) - this->point(1)) ||
132  !v.relative_fuzzy_equals(this->point(13) - this->point(4)))
133  return false;
134  return true;
135 }
136 
137 
138 
139 dof_id_type Prism18::key (const unsigned int s) const
140 {
141  libmesh_assert_less (s, this->n_sides());
142 
143  switch (s)
144  {
145  case 0: // the triangular face at z=0
146  {
147  return Prism::key(0);
148  }
149  case 1: // the quad face at y=0
150  {
151  return Elem::compute_key (this->node(15));
152  }
153  case 2: // the other quad face
154  {
155  return Elem::compute_key (this->node(16));
156  }
157  case 3: // the quad face at x=0
158  {
159  return Elem::compute_key (this->node(17));
160  }
161  case 4: // the triangular face at z=1
162  {
163  return Prism::key(4);
164  }
165  }
166 
167  // We'll never get here.
168  libmesh_error();
169  return 0;
170 }
171 
172 
173 
174 
175 
176 AutoPtr<Elem> Prism18::build_side (const unsigned int i,
177  bool proxy) const
178 {
179  libmesh_assert_less (i, this->n_sides());
180 
181  if (proxy)
182  {
183  switch(i)
184  {
185  case 0:
186  case 4:
187  {
188  AutoPtr<Elem> face(new Side<Tri6,Prism18>(this,i));
189  return face;
190  }
191 
192  case 1:
193  case 2:
194  case 3:
195  {
196  AutoPtr<Elem> face(new Side<Quad9,Prism18>(this,i));
197  return face;
198  }
199 
200  default:
201  {
202  libmesh_error();
203  }
204  }
205  }
206 
207  else
208  {
209  // Create NULL pointer to be initialized, returned later.
210  AutoPtr<Elem> face(NULL);
211 
212  switch (i)
213  {
214  case 0: // the triangular face at z=-1
215  {
216  face.reset(new Tri6);
217 
218  face->set_node(0) = this->get_node(0);
219  face->set_node(1) = this->get_node(2);
220  face->set_node(2) = this->get_node(1);
221  face->set_node(3) = this->get_node(8);
222  face->set_node(4) = this->get_node(7);
223  face->set_node(5) = this->get_node(6);
224 
225  break;
226  }
227  case 1: // the quad face at y=0
228  {
229  face.reset(new Quad9);
230 
231  face->set_node(0) = this->get_node(0);
232  face->set_node(1) = this->get_node(1);
233  face->set_node(2) = this->get_node(4);
234  face->set_node(3) = this->get_node(3);
235  face->set_node(4) = this->get_node(6);
236  face->set_node(5) = this->get_node(10);
237  face->set_node(6) = this->get_node(12);
238  face->set_node(7) = this->get_node(9);
239  face->set_node(8) = this->get_node(15);
240 
241  break;
242  }
243  case 2: // the other quad face
244  {
245  face.reset(new Quad9);
246 
247  face->set_node(0) = this->get_node(1);
248  face->set_node(1) = this->get_node(2);
249  face->set_node(2) = this->get_node(5);
250  face->set_node(3) = this->get_node(4);
251  face->set_node(4) = this->get_node(7);
252  face->set_node(5) = this->get_node(11);
253  face->set_node(6) = this->get_node(13);
254  face->set_node(7) = this->get_node(10);
255  face->set_node(8) = this->get_node(16);
256 
257  break;
258  }
259  case 3: // the quad face at x=0
260  {
261  face.reset(new Quad9);
262 
263  face->set_node(0) = this->get_node(2);
264  face->set_node(1) = this->get_node(0);
265  face->set_node(2) = this->get_node(3);
266  face->set_node(3) = this->get_node(5);
267  face->set_node(4) = this->get_node(8);
268  face->set_node(5) = this->get_node(9);
269  face->set_node(6) = this->get_node(14);
270  face->set_node(7) = this->get_node(11);
271  face->set_node(8) = this->get_node(17);
272 
273  break;
274  }
275  case 4: // the triangular face at z=1
276  {
277  face.reset(new Tri6);
278 
279  face->set_node(0) = this->get_node(3);
280  face->set_node(1) = this->get_node(4);
281  face->set_node(2) = this->get_node(5);
282  face->set_node(3) = this->get_node(12);
283  face->set_node(4) = this->get_node(13);
284  face->set_node(5) = this->get_node(14);
285 
286  break;
287  }
288  default:
289  {
290  libmesh_error();
291  }
292  }
293 
294  face->subdomain_id() = this->subdomain_id();
295  return face;
296  }
297 
298  // We'll never get here.
299  libmesh_error();
300  AutoPtr<Elem> ap(NULL); return ap;
301 }
302 
303 
304 
305 AutoPtr<Elem> Prism18::build_edge (const unsigned int i) const
306 {
307  libmesh_assert_less (i, this->n_edges());
308 
309  return AutoPtr<Elem>(new SideEdge<Edge3,Prism18>(this,i));
310 }
311 
312 
313 
314 void Prism18::connectivity(const unsigned int sc,
315  const IOPackage iop,
316  std::vector<dof_id_type>& conn) const
317 {
319  libmesh_assert_less (sc, this->n_sub_elem());
320  libmesh_assert_not_equal_to (iop, INVALID_IO_PACKAGE);
321 
322  switch (iop)
323  {
324  case TECPLOT:
325  {
326  conn.resize(8);
327  switch (sc)
328  {
329 
330  case 0:
331  {
332  conn[0] = this->node(0)+1;
333  conn[1] = this->node(6)+1;
334  conn[2] = this->node(8)+1;
335  conn[3] = this->node(8)+1;
336  conn[4] = this->node(9)+1;
337  conn[5] = this->node(15)+1;
338  conn[6] = this->node(17)+1;
339  conn[7] = this->node(17)+1;
340 
341  return;
342  }
343 
344  case 1:
345  {
346  conn[0] = this->node(6)+1;
347  conn[1] = this->node(1)+1;
348  conn[2] = this->node(7)+1;
349  conn[3] = this->node(7)+1;
350  conn[4] = this->node(15)+1;
351  conn[5] = this->node(10)+1;
352  conn[6] = this->node(16)+1;
353  conn[7] = this->node(16)+1;
354 
355  return;
356  }
357 
358  case 2:
359  {
360  conn[0] = this->node(8)+1;
361  conn[1] = this->node(7)+1;
362  conn[2] = this->node(2)+1;
363  conn[3] = this->node(2)+1;
364  conn[4] = this->node(17)+1;
365  conn[5] = this->node(16)+1;
366  conn[6] = this->node(11)+1;
367  conn[7] = this->node(11)+1;
368 
369  return;
370  }
371 
372  case 3:
373  {
374  conn[0] = this->node(6)+1;
375  conn[1] = this->node(7)+1;
376  conn[2] = this->node(8)+1;
377  conn[3] = this->node(8)+1;
378  conn[4] = this->node(15)+1;
379  conn[5] = this->node(16)+1;
380  conn[6] = this->node(17)+1;
381  conn[7] = this->node(17)+1;
382 
383  return;
384  }
385 
386  case 4:
387  {
388  conn[0] = this->node(9)+1;
389  conn[1] = this->node(15)+1;
390  conn[2] = this->node(17)+1;
391  conn[3] = this->node(17)+1;
392  conn[4] = this->node(3)+1;
393  conn[5] = this->node(12)+1;
394  conn[6] = this->node(14)+1;
395  conn[7] = this->node(14)+1;
396 
397  return;
398  }
399 
400  case 5:
401  {
402  conn[0] = this->node(15)+1;
403  conn[1] = this->node(10)+1;
404  conn[2] = this->node(16)+1;
405  conn[3] = this->node(16)+1;
406  conn[4] = this->node(12)+1;
407  conn[5] = this->node(4)+1;
408  conn[6] = this->node(13)+1;
409  conn[7] = this->node(13)+1;
410 
411  return;
412  }
413 
414  case 6:
415  {
416  conn[0] = this->node(17)+1;
417  conn[1] = this->node(16)+1;
418  conn[2] = this->node(11)+1;
419  conn[3] = this->node(11)+1;
420  conn[4] = this->node(14)+1;
421  conn[5] = this->node(13)+1;
422  conn[6] = this->node(5)+1;
423  conn[7] = this->node(5)+1;
424 
425  return;
426  }
427 
428  case 7:
429  {
430  conn[0] = this->node(15)+1;
431  conn[1] = this->node(16)+1;
432  conn[2] = this->node(17)+1;
433  conn[3] = this->node(17)+1;
434  conn[4] = this->node(12)+1;
435  conn[5] = this->node(13)+1;
436  conn[6] = this->node(14)+1;
437  conn[7] = this->node(14)+1;
438 
439  return;
440  }
441 
442  default:
443  libmesh_error();
444  }
445 
446  }
447 
448  case VTK:
449  {
450  // VTK now supports VTK_BIQUADRATIC_QUADRATIC_WEDGE directly
451  conn.resize(18);
452 
453  // VTK's VTK_BIQUADRATIC_QUADRATIC_WEDGE first 9 (vertex) and
454  // last 3 (mid-face) nodes match. The middle and top layers
455  // of mid-edge nodes are reversed from LibMesh's.
456  for (unsigned i=0; i<conn.size(); ++i)
457  conn[i] = this->node(i);
458 
459  // top "ring" of mid-edge nodes
460  conn[9] = this->node(12);
461  conn[10] = this->node(13);
462  conn[11] = this->node(14);
463 
464  // middle "ring" of mid-edge nodes
465  conn[12] = this->node(9);
466  conn[13] = this->node(10);
467  conn[14] = this->node(11);
468 
469  return;
470 
471  /*
472  conn.resize(6);
473  switch (sc)
474  {
475 
476  case 0:
477  {
478  conn[0] = this->node(0);
479  conn[1] = this->node(6);
480  conn[2] = this->node(8);
481  conn[3] = this->node(9);
482  conn[4] = this->node(15);
483  conn[5] = this->node(17);
484 
485  return;
486  }
487 
488  case 1:
489  {
490  conn[0] = this->node(6);
491  conn[1] = this->node(1);
492  conn[2] = this->node(7);
493  conn[3] = this->node(15);
494  conn[4] = this->node(10);
495  conn[5] = this->node(16);
496 
497  return;
498  }
499 
500  case 2:
501  {
502  conn[0] = this->node(8);
503  conn[1] = this->node(7);
504  conn[2] = this->node(2);
505  conn[3] = this->node(17);
506  conn[4] = this->node(16);
507  conn[5] = this->node(11);
508 
509  return;
510  }
511 
512  case 3:
513  {
514  conn[0] = this->node(6);
515  conn[1] = this->node(7);
516  conn[2] = this->node(8);
517  conn[3] = this->node(15);
518  conn[4] = this->node(16);
519  conn[5] = this->node(17);
520 
521  return;
522  }
523 
524  case 4:
525  {
526  conn[0] = this->node(9);
527  conn[1] = this->node(15);
528  conn[2] = this->node(17);
529  conn[3] = this->node(3);
530  conn[4] = this->node(12);
531  conn[5] = this->node(14);
532 
533  return;
534  }
535 
536  case 5:
537  {
538  conn[0] = this->node(15);
539  conn[1] = this->node(10);
540  conn[2] = this->node(16);
541  conn[3] = this->node(12);
542  conn[4] = this->node(4);
543  conn[5] = this->node(13);
544 
545  return;
546  }
547 
548  case 6:
549  {
550  conn[0] = this->node(17);
551  conn[1] = this->node(16);
552  conn[2] = this->node(11);
553  conn[3] = this->node(14);
554  conn[4] = this->node(13);
555  conn[5] = this->node(5);
556 
557  return;
558  }
559 
560  case 7:
561  {
562  conn[0] = this->node(15);
563  conn[1] = this->node(16);
564  conn[2] = this->node(17);
565  conn[3] = this->node(12);
566  conn[4] = this->node(13);
567  conn[5] = this->node(14);
568 
569  return;
570  }
571 
572  default:
573  libmesh_error();
574  }
575  */
576  }
577 
578  default:
579  libmesh_error();
580  }
581 
582  libmesh_error();
583 
584 }
585 
586 
587 
588 
589 unsigned int Prism18::n_second_order_adjacent_vertices (const unsigned int n) const
590 {
591  switch (n)
592  {
593  case 6:
594  case 7:
595  case 8:
596  case 9:
597  case 10:
598  case 11:
599  case 12:
600  case 13:
601  case 14:
602  return 2;
603 
604  case 15:
605  case 16:
606  case 17:
607  return 4;
608 
609  default:
610  libmesh_error();
611  }
612  libmesh_error();
613  return static_cast<unsigned int>(-1);
614 }
615 
616 
617 
618 
619 
620 unsigned short int Prism18::second_order_adjacent_vertex (const unsigned int n,
621  const unsigned int v) const
622 {
623  libmesh_assert_greater_equal (n, this->n_vertices());
624  libmesh_assert_less (n, this->n_nodes());
625 
626  switch (n)
627  {
628  /*
629  * These nodes are unique to \p Prism18,
630  * let our _remaining_... matrix handle
631  * this.
632  */
633  case 15:
634  case 16:
635  case 17:
636  {
637  libmesh_assert_less (v, 4);
639  }
640 
641  /*
642  * All other second-order nodes (6,...,14) are
643  * identical with Prism15 and are therefore
644  * delegated to the _second_order matrix of
645  * \p Prism
646  */
647  default:
648  {
649  libmesh_assert_less (v, 2);
650  return _second_order_adjacent_vertices[n-this->n_vertices()][v];
651  }
652 
653  }
654 
655  libmesh_error();
656  return static_cast<unsigned short int>(-1);
657 }
658 
659 
660 
661 const unsigned short int Prism18::_remaining_second_order_adjacent_vertices[3][4] =
662 {
663  { 0, 1, 3, 4}, // vertices adjacent to node 15
664  { 1, 2, 4, 5}, // vertices adjacent to node 16
665  { 0, 2, 3, 5} // vertices adjacent to node 17
666 };
667 
668 
669 
670 std::pair<unsigned short int, unsigned short int>
671 Prism18::second_order_child_vertex (const unsigned int n) const
672 {
673  libmesh_assert_greater_equal (n, this->n_vertices());
674  libmesh_assert_less (n, this->n_nodes());
675 
676  return std::pair<unsigned short int, unsigned short int>
679 }
680 
681 
682 
683 
684 
685 
686 
687 #ifdef LIBMESH_ENABLE_AMR
688 
689 const float Prism18::_embedding_matrix[8][18][18] =
690 {
691  // embedding matrix for child 0
692  {
693  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
694  { 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0
695  { 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1
696  { 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2
697  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.}, // 3
698  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 4
699  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 5
700  { 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6
701  { 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7
702  { 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8
703  { 0.375, 0., 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0.}, // 9
704  { 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0., 0.}, // 10
705  { 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75}, // 11
706  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0.}, // 12
707  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 13
708  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0.75}, // 14
709  { 0.140625,-0.046875, 0.,-0.046875, 0.015625, 0., 0.28125, 0., 0., 0.28125, -0.09375, 0., -0.09375, 0., 0., 0.5625, 0., 0.}, // 15
710  { 0.,-0.046875,-0.046875, 0., 0.015625, 0.015625, 0.1875, 0.09375, 0.1875, 0., -0.09375, -0.09375, -0.0625, -0.03125, -0.0625, 0.375, 0.1875, 0.375}, // 16
711  { 0.140625, 0.,-0.046875,-0.046875, 0., 0.015625, 0., 0., 0.28125, 0.28125, 0., -0.09375, 0., 0., -0.09375, 0., 0., 0.5625} // 17
712  },
713 
714  // embedding matrix for child 1
715  {
716  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
717  { 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0
718  { 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1
719  { 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2
720  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 3
721  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.}, // 4
722  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 5
723  { -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6
724  { 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7
725  { -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8
726  { 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0., 0.}, // 9
727  { 0., 0.375, 0., 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0.}, // 10
728  { 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0.}, // 11
729  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0.}, // 12
730  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0.}, // 13
731  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 14
732  {-0.046875, 0.140625, 0., 0.015625,-0.046875, 0., 0.28125, 0., 0., -0.09375, 0.28125, 0., -0.09375, 0., 0., 0.5625, 0., 0.}, // 15
733  { 0., 0.140625,-0.046875, 0.,-0.046875, 0.015625, 0., 0.28125, 0., 0., 0.28125, -0.09375, 0., -0.09375, 0., 0., 0.5625, 0.}, // 16
734  {-0.046875, 0.,-0.046875, 0.015625, 0., 0.015625, 0.1875, 0.1875, 0.09375, -0.09375, 0., -0.09375, -0.0625, -0.0625, -0.03125, 0.375, 0.375, 0.1875} // 17
735  },
736 
737  // embedding matrix for child 2
738  {
739  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
740  { 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0
741  { 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1
742  { 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2
743  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 3
744  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 4
745  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.}, // 5
746  { -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6
747  { 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7
748  { -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8
749  { 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75}, // 9
750  { 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0.}, // 10
751  { 0., 0., 0.375, 0., 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0.}, // 11
752  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 12
753  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0.}, // 13
754  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0.75}, // 14
755  {-0.046875,-0.046875, 0., 0.015625, 0.015625, 0., 0.09375, 0.1875, 0.1875, -0.09375, -0.09375, 0., -0.03125, -0.0625, -0.0625, 0.1875, 0.375, 0.375}, // 15
756  { 0.,-0.046875, 0.140625, 0., 0.015625,-0.046875, 0., 0.28125, 0., 0., -0.09375, 0.28125, 0., -0.09375, 0., 0., 0.5625, 0.}, // 16
757  {-0.046875, 0., 0.140625, 0.015625, 0.,-0.046875, 0., 0., 0.28125, -0.09375, 0., 0.28125, 0., 0., -0.09375, 0., 0., 0.5625} // 17
758  },
759 
760  // embedding matrix for child 3
761  {
762  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
763  { 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0
764  { 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1
765  { 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2
766  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 3
767  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 4
768  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 5
769  { -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6
770  { -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7
771  { 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8
772  { 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0., 0.}, // 9
773  { 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0.}, // 10
774  { 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75}, // 11
775  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 12
776  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 13
777  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 14
778  {-0.046875, 0.,-0.046875, 0.015625, 0., 0.015625, 0.1875, 0.1875, 0.09375, -0.09375, 0., -0.09375, -0.0625, -0.0625, -0.03125, 0.375, 0.375, 0.1875}, // 15
779  {-0.046875,-0.046875, 0., 0.015625, 0.015625, 0., 0.09375, 0.1875, 0.1875, -0.09375, -0.09375, 0., -0.03125, -0.0625, -0.0625, 0.1875, 0.375, 0.375}, // 16
780  { 0.,-0.046875,-0.046875, 0., 0.015625, 0.015625, 0.1875, 0.09375, 0.1875, 0., -0.09375, -0.09375, -0.0625, -0.03125, -0.0625, 0.375, 0.1875, 0.375} // 17
781  },
782 
783  // embedding matrix for child 4
784  {
785  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
786  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0
787  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 1
788  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 2
789  { 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 3
790  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.}, // 4
791  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.}, // 5
792  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0.}, // 6
793  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 7
794  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0.75}, // 8
795  { -0.125, 0., 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0.}, // 9
796  { 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0., 0.}, // 10
797  { 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75}, // 11
798  { 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0.}, // 12
799  { 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0.}, // 13
800  { 0., 0., 0., 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0.}, // 14
801  {-0.046875, 0.015625, 0., 0.140625,-0.046875, 0., -0.09375, 0., 0., 0.28125, -0.09375, 0., 0.28125, 0., 0., 0.5625, 0., 0.}, // 15
802  { 0., 0.015625, 0.015625, 0.,-0.046875,-0.046875, -0.0625, -0.03125, -0.0625, 0., -0.09375, -0.09375, 0.1875, 0.09375, 0.1875, 0.375, 0.1875, 0.375}, // 16
803  {-0.046875, 0., 0.015625, 0.140625, 0.,-0.046875, 0., 0., -0.09375, 0.28125, 0., -0.09375, 0., 0., 0.28125, 0., 0., 0.5625} // 17
804  },
805 
806  // embedding matrix for child 5
807  {
808  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
809  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 0
810  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.}, // 1
811  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 2
812  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.}, // 3
813  { 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 4
814  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.}, // 5
815  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0.}, // 6
816  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0.}, // 7
817  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 8
818  { 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0., 0.}, // 9
819  { 0., -0.125, 0., 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0.}, // 10
820  { 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0.}, // 11
821  { 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0.}, // 12
822  { 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0.}, // 13
823  { 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0.}, // 14
824  { 0.015625,-0.046875, 0.,-0.046875, 0.140625, 0., -0.09375, 0., 0., -0.09375, 0.28125, 0., 0.28125, 0., 0., 0.5625, 0., 0.}, // 15
825  { 0.,-0.046875, 0.015625, 0., 0.140625,-0.046875, 0., -0.09375, 0., 0., 0.28125, -0.09375, 0., 0.28125, 0., 0., 0.5625, 0.}, // 16
826  { 0.015625, 0., 0.015625,-0.046875, 0.,-0.046875, -0.0625, -0.0625, -0.03125, -0.09375, 0., -0.09375, 0.1875, 0.1875, 0.09375, 0.375, 0.375, 0.1875} // 17
827  },
828 
829  // embedding matrix for child 6
830  {
831  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
832  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 0
833  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 1
834  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.}, // 2
835  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.}, // 3
836  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.}, // 4
837  { 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 5
838  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 6
839  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0.}, // 7
840  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0.75}, // 8
841  { 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75}, // 9
842  { 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0.}, // 10
843  { 0., 0., -0.125, 0., 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0.}, // 11
844  { 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0.}, // 12
845  { 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0.}, // 13
846  { 0., 0., 0., -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0.}, // 14
847  { 0.015625, 0.015625, 0.,-0.046875,-0.046875, 0., -0.03125, -0.0625, -0.0625, -0.09375, -0.09375, 0., 0.09375, 0.1875, 0.1875, 0.1875, 0.375, 0.375}, // 15
848  { 0., 0.015625,-0.046875, 0.,-0.046875, 0.140625, 0., -0.09375, 0., 0., -0.09375, 0.28125, 0., 0.28125, 0., 0., 0.5625, 0.}, // 16
849  { 0.015625, 0.,-0.046875,-0.046875, 0., 0.140625, 0., 0., -0.09375, -0.09375, 0., 0.28125, 0., 0., 0.28125, 0., 0., 0.5625} // 17
850  },
851 
852  // embedding matrix for child 7
853  {
854  // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
855  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 0
856  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 1
857  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 2
858  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.}, // 3
859  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.}, // 4
860  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.}, // 5
861  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 6
862  { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 7
863  { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 8
864  { 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0., 0.}, // 9
865  { 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0.}, // 10
866  { 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75}, // 11
867  { 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0.}, // 12
868  { 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0.}, // 13
869  { 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0.}, // 14
870  { 0.015625, 0., 0.015625,-0.046875, 0.,-0.046875, -0.0625, -0.0625, -0.03125, -0.09375, 0., -0.09375, 0.1875, 0.1875, 0.09375, 0.375, 0.375, 0.1875}, // 15
871  { 0.015625, 0.015625, 0.,-0.046875,-0.046875, 0., -0.03125, -0.0625, -0.0625, -0.09375, -0.09375, 0., 0.09375, 0.1875, 0.1875, 0.1875, 0.375, 0.375}, // 16
872  { 0., 0.015625, 0.015625, 0.,-0.046875,-0.046875, -0.0625, -0.03125, -0.0625, 0., -0.09375, -0.09375, 0.1875, 0.09375, 0.1875, 0.375, 0.1875, 0.375} // 17
873  }
874 };
875 
876 #endif
877 
878 } // namespace libMesh

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

Hosted By:
SourceForge.net Logo