$extrastylesheet
00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 00003 00004 // This library is free software; you can redistribute it and/or 00005 // modify it under the terms of the GNU Lesser General Public 00006 // License as published by the Free Software Foundation; either 00007 // version 2.1 of the License, or (at your option) any later version. 00008 00009 // This library is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 // Lesser General Public License for more details. 00013 00014 // You should have received a copy of the GNU Lesser General Public 00015 // License along with this library; if not, write to the Free Software 00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 00018 00019 // C++ includes 00020 00021 // Local includes 00022 #include "libmesh/side.h" 00023 #include "libmesh/cell_prism18.h" 00024 #include "libmesh/edge_edge3.h" 00025 #include "libmesh/face_quad9.h" 00026 #include "libmesh/face_tri6.h" 00027 00028 namespace libMesh 00029 { 00030 00031 00032 00033 // ------------------------------------------------------------ 00034 // Prism18 class static member initializations 00035 const unsigned int Prism18::side_nodes_map[5][9] = 00036 { 00037 {0, 2, 1, 8, 7, 6, 99, 99, 99}, // Side 0 00038 {0, 1, 4, 3, 6, 10, 12, 9, 15}, // Side 1 00039 {1, 2, 5, 4, 7, 11, 13, 10, 16}, // Side 2 00040 {2, 0, 3, 5, 8, 9, 14, 11, 17}, // Side 3 00041 {3, 4, 5, 12, 13, 14, 99, 99, 99} // Side 4 00042 }; 00043 00044 const unsigned int Prism18::edge_nodes_map[9][3] = 00045 { 00046 {0, 1, 6}, // Side 0 00047 {1, 2, 7}, // Side 1 00048 {0, 2, 8}, // Side 2 00049 {0, 3, 9}, // Side 3 00050 {1, 4, 10}, // Side 4 00051 {2, 5, 11}, // Side 5 00052 {3, 4, 12}, // Side 6 00053 {4, 5, 13}, // Side 7 00054 {3, 5, 14} // Side 8 00055 }; 00056 00057 00058 // ------------------------------------------------------------ 00059 // Prism18 class member functions 00060 00061 bool Prism18::is_vertex(const unsigned int i) const 00062 { 00063 if (i < 6) 00064 return true; 00065 return false; 00066 } 00067 00068 bool Prism18::is_edge(const unsigned int i) const 00069 { 00070 if (i < 6) 00071 return false; 00072 if (i > 14) 00073 return false; 00074 return true; 00075 } 00076 00077 bool Prism18::is_face(const unsigned int i) const 00078 { 00079 if (i > 14) 00080 return true; 00081 return false; 00082 } 00083 00084 bool Prism18::is_node_on_side(const unsigned int n, 00085 const unsigned int s) const 00086 { 00087 libmesh_assert_less (s, n_sides()); 00088 for (unsigned int i = 0; i != 9; ++i) 00089 if (side_nodes_map[s][i] == n) 00090 return true; 00091 return false; 00092 } 00093 00094 bool Prism18::is_node_on_edge(const unsigned int n, 00095 const unsigned int e) const 00096 { 00097 libmesh_assert_less (e, n_edges()); 00098 for (unsigned int i = 0; i != 3; ++i) 00099 if (edge_nodes_map[e][i] == n) 00100 return true; 00101 return false; 00102 } 00103 00104 00105 00106 bool Prism18::has_affine_map() const 00107 { 00108 // Make sure z edges are affine 00109 Point v = this->point(3) - this->point(0); 00110 if (!v.relative_fuzzy_equals(this->point(4) - this->point(1)) || 00111 !v.relative_fuzzy_equals(this->point(5) - this->point(2))) 00112 return false; 00113 // Make sure edges are straight 00114 v /= 2; 00115 if (!v.relative_fuzzy_equals(this->point(9) - this->point(0)) || 00116 !v.relative_fuzzy_equals(this->point(10) - this->point(1)) || 00117 !v.relative_fuzzy_equals(this->point(11) - this->point(2)) || 00118 !v.relative_fuzzy_equals(this->point(15) - this->point(6)) || 00119 !v.relative_fuzzy_equals(this->point(16) - this->point(7)) || 00120 !v.relative_fuzzy_equals(this->point(17) - this->point(8))) 00121 return false; 00122 v = (this->point(1) - this->point(0))/2; 00123 if (!v.relative_fuzzy_equals(this->point(6) - this->point(0)) || 00124 !v.relative_fuzzy_equals(this->point(12) - this->point(3))) 00125 return false; 00126 v = (this->point(2) - this->point(0))/2; 00127 if (!v.relative_fuzzy_equals(this->point(8) - this->point(0)) || 00128 !v.relative_fuzzy_equals(this->point(14) - this->point(3))) 00129 return false; 00130 v = (this->point(2) - this->point(1))/2; 00131 if (!v.relative_fuzzy_equals(this->point(7) - this->point(1)) || 00132 !v.relative_fuzzy_equals(this->point(13) - this->point(4))) 00133 return false; 00134 return true; 00135 } 00136 00137 00138 00139 dof_id_type Prism18::key (const unsigned int s) const 00140 { 00141 libmesh_assert_less (s, this->n_sides()); 00142 00143 switch (s) 00144 { 00145 case 0: // the triangular face at z=0 00146 { 00147 return Prism::key(0); 00148 } 00149 case 1: // the quad face at y=0 00150 { 00151 return Elem::compute_key (this->node(15)); 00152 } 00153 case 2: // the other quad face 00154 { 00155 return Elem::compute_key (this->node(16)); 00156 } 00157 case 3: // the quad face at x=0 00158 { 00159 return Elem::compute_key (this->node(17)); 00160 } 00161 case 4: // the triangular face at z=1 00162 { 00163 return Prism::key(4); 00164 } 00165 default: 00166 libmesh_error_msg("Invalid side " << s); 00167 } 00168 00169 libmesh_error_msg("We'll never get here!"); 00170 return 0; 00171 } 00172 00173 00174 00175 00176 00177 UniquePtr<Elem> Prism18::build_side (const unsigned int i, 00178 bool proxy) const 00179 { 00180 libmesh_assert_less (i, this->n_sides()); 00181 00182 if (proxy) 00183 { 00184 switch(i) 00185 { 00186 case 0: 00187 case 4: 00188 return UniquePtr<Elem>(new Side<Tri6,Prism18>(this,i)); 00189 00190 case 1: 00191 case 2: 00192 case 3: 00193 return UniquePtr<Elem>(new Side<Quad9,Prism18>(this,i)); 00194 00195 default: 00196 libmesh_error_msg("Invalid side i = " << i); 00197 } 00198 } 00199 00200 else 00201 { 00202 // Create NULL pointer to be initialized, returned later. 00203 Elem* face = NULL; 00204 00205 switch (i) 00206 { 00207 case 0: // the triangular face at z=-1 00208 { 00209 face = new Tri6; 00210 00211 face->set_node(0) = this->get_node(0); 00212 face->set_node(1) = this->get_node(2); 00213 face->set_node(2) = this->get_node(1); 00214 face->set_node(3) = this->get_node(8); 00215 face->set_node(4) = this->get_node(7); 00216 face->set_node(5) = this->get_node(6); 00217 00218 break; 00219 } 00220 case 1: // the quad face at y=0 00221 { 00222 face = new Quad9; 00223 00224 face->set_node(0) = this->get_node(0); 00225 face->set_node(1) = this->get_node(1); 00226 face->set_node(2) = this->get_node(4); 00227 face->set_node(3) = this->get_node(3); 00228 face->set_node(4) = this->get_node(6); 00229 face->set_node(5) = this->get_node(10); 00230 face->set_node(6) = this->get_node(12); 00231 face->set_node(7) = this->get_node(9); 00232 face->set_node(8) = this->get_node(15); 00233 00234 break; 00235 } 00236 case 2: // the other quad face 00237 { 00238 face = new Quad9; 00239 00240 face->set_node(0) = this->get_node(1); 00241 face->set_node(1) = this->get_node(2); 00242 face->set_node(2) = this->get_node(5); 00243 face->set_node(3) = this->get_node(4); 00244 face->set_node(4) = this->get_node(7); 00245 face->set_node(5) = this->get_node(11); 00246 face->set_node(6) = this->get_node(13); 00247 face->set_node(7) = this->get_node(10); 00248 face->set_node(8) = this->get_node(16); 00249 00250 break; 00251 } 00252 case 3: // the quad face at x=0 00253 { 00254 face = new Quad9; 00255 00256 face->set_node(0) = this->get_node(2); 00257 face->set_node(1) = this->get_node(0); 00258 face->set_node(2) = this->get_node(3); 00259 face->set_node(3) = this->get_node(5); 00260 face->set_node(4) = this->get_node(8); 00261 face->set_node(5) = this->get_node(9); 00262 face->set_node(6) = this->get_node(14); 00263 face->set_node(7) = this->get_node(11); 00264 face->set_node(8) = this->get_node(17); 00265 00266 break; 00267 } 00268 case 4: // the triangular face at z=1 00269 { 00270 face = new Tri6; 00271 00272 face->set_node(0) = this->get_node(3); 00273 face->set_node(1) = this->get_node(4); 00274 face->set_node(2) = this->get_node(5); 00275 face->set_node(3) = this->get_node(12); 00276 face->set_node(4) = this->get_node(13); 00277 face->set_node(5) = this->get_node(14); 00278 00279 break; 00280 } 00281 default: 00282 libmesh_error_msg("Invalid side i = " << i); 00283 } 00284 00285 face->subdomain_id() = this->subdomain_id(); 00286 return UniquePtr<Elem>(face); 00287 } 00288 00289 libmesh_error_msg("We'll never get here!"); 00290 return UniquePtr<Elem>(); 00291 } 00292 00293 00294 00295 UniquePtr<Elem> Prism18::build_edge (const unsigned int i) const 00296 { 00297 libmesh_assert_less (i, this->n_edges()); 00298 00299 return UniquePtr<Elem>(new SideEdge<Edge3,Prism18>(this,i)); 00300 } 00301 00302 00303 00304 void Prism18::connectivity(const unsigned int sc, 00305 const IOPackage iop, 00306 std::vector<dof_id_type>& conn) const 00307 { 00308 libmesh_assert(_nodes); 00309 libmesh_assert_less (sc, this->n_sub_elem()); 00310 libmesh_assert_not_equal_to (iop, INVALID_IO_PACKAGE); 00311 00312 switch (iop) 00313 { 00314 case TECPLOT: 00315 { 00316 conn.resize(8); 00317 switch (sc) 00318 { 00319 00320 case 0: 00321 { 00322 conn[0] = this->node(0)+1; 00323 conn[1] = this->node(6)+1; 00324 conn[2] = this->node(8)+1; 00325 conn[3] = this->node(8)+1; 00326 conn[4] = this->node(9)+1; 00327 conn[5] = this->node(15)+1; 00328 conn[6] = this->node(17)+1; 00329 conn[7] = this->node(17)+1; 00330 00331 return; 00332 } 00333 00334 case 1: 00335 { 00336 conn[0] = this->node(6)+1; 00337 conn[1] = this->node(1)+1; 00338 conn[2] = this->node(7)+1; 00339 conn[3] = this->node(7)+1; 00340 conn[4] = this->node(15)+1; 00341 conn[5] = this->node(10)+1; 00342 conn[6] = this->node(16)+1; 00343 conn[7] = this->node(16)+1; 00344 00345 return; 00346 } 00347 00348 case 2: 00349 { 00350 conn[0] = this->node(8)+1; 00351 conn[1] = this->node(7)+1; 00352 conn[2] = this->node(2)+1; 00353 conn[3] = this->node(2)+1; 00354 conn[4] = this->node(17)+1; 00355 conn[5] = this->node(16)+1; 00356 conn[6] = this->node(11)+1; 00357 conn[7] = this->node(11)+1; 00358 00359 return; 00360 } 00361 00362 case 3: 00363 { 00364 conn[0] = this->node(6)+1; 00365 conn[1] = this->node(7)+1; 00366 conn[2] = this->node(8)+1; 00367 conn[3] = this->node(8)+1; 00368 conn[4] = this->node(15)+1; 00369 conn[5] = this->node(16)+1; 00370 conn[6] = this->node(17)+1; 00371 conn[7] = this->node(17)+1; 00372 00373 return; 00374 } 00375 00376 case 4: 00377 { 00378 conn[0] = this->node(9)+1; 00379 conn[1] = this->node(15)+1; 00380 conn[2] = this->node(17)+1; 00381 conn[3] = this->node(17)+1; 00382 conn[4] = this->node(3)+1; 00383 conn[5] = this->node(12)+1; 00384 conn[6] = this->node(14)+1; 00385 conn[7] = this->node(14)+1; 00386 00387 return; 00388 } 00389 00390 case 5: 00391 { 00392 conn[0] = this->node(15)+1; 00393 conn[1] = this->node(10)+1; 00394 conn[2] = this->node(16)+1; 00395 conn[3] = this->node(16)+1; 00396 conn[4] = this->node(12)+1; 00397 conn[5] = this->node(4)+1; 00398 conn[6] = this->node(13)+1; 00399 conn[7] = this->node(13)+1; 00400 00401 return; 00402 } 00403 00404 case 6: 00405 { 00406 conn[0] = this->node(17)+1; 00407 conn[1] = this->node(16)+1; 00408 conn[2] = this->node(11)+1; 00409 conn[3] = this->node(11)+1; 00410 conn[4] = this->node(14)+1; 00411 conn[5] = this->node(13)+1; 00412 conn[6] = this->node(5)+1; 00413 conn[7] = this->node(5)+1; 00414 00415 return; 00416 } 00417 00418 case 7: 00419 { 00420 conn[0] = this->node(15)+1; 00421 conn[1] = this->node(16)+1; 00422 conn[2] = this->node(17)+1; 00423 conn[3] = this->node(17)+1; 00424 conn[4] = this->node(12)+1; 00425 conn[5] = this->node(13)+1; 00426 conn[6] = this->node(14)+1; 00427 conn[7] = this->node(14)+1; 00428 00429 return; 00430 } 00431 00432 default: 00433 libmesh_error_msg("Invalid sc = " << sc); 00434 } 00435 00436 } 00437 00438 case VTK: 00439 { 00440 // VTK now supports VTK_BIQUADRATIC_QUADRATIC_WEDGE directly 00441 conn.resize(18); 00442 00443 // VTK's VTK_BIQUADRATIC_QUADRATIC_WEDGE first 9 (vertex) and 00444 // last 3 (mid-face) nodes match. The middle and top layers 00445 // of mid-edge nodes are reversed from LibMesh's. 00446 for (unsigned i=0; i<conn.size(); ++i) 00447 conn[i] = this->node(i); 00448 00449 // top "ring" of mid-edge nodes 00450 conn[9] = this->node(12); 00451 conn[10] = this->node(13); 00452 conn[11] = this->node(14); 00453 00454 // middle "ring" of mid-edge nodes 00455 conn[12] = this->node(9); 00456 conn[13] = this->node(10); 00457 conn[14] = this->node(11); 00458 00459 return; 00460 00461 /* 00462 conn.resize(6); 00463 switch (sc) 00464 { 00465 00466 case 0: 00467 { 00468 conn[0] = this->node(0); 00469 conn[1] = this->node(6); 00470 conn[2] = this->node(8); 00471 conn[3] = this->node(9); 00472 conn[4] = this->node(15); 00473 conn[5] = this->node(17); 00474 00475 return; 00476 } 00477 00478 case 1: 00479 { 00480 conn[0] = this->node(6); 00481 conn[1] = this->node(1); 00482 conn[2] = this->node(7); 00483 conn[3] = this->node(15); 00484 conn[4] = this->node(10); 00485 conn[5] = this->node(16); 00486 00487 return; 00488 } 00489 00490 case 2: 00491 { 00492 conn[0] = this->node(8); 00493 conn[1] = this->node(7); 00494 conn[2] = this->node(2); 00495 conn[3] = this->node(17); 00496 conn[4] = this->node(16); 00497 conn[5] = this->node(11); 00498 00499 return; 00500 } 00501 00502 case 3: 00503 { 00504 conn[0] = this->node(6); 00505 conn[1] = this->node(7); 00506 conn[2] = this->node(8); 00507 conn[3] = this->node(15); 00508 conn[4] = this->node(16); 00509 conn[5] = this->node(17); 00510 00511 return; 00512 } 00513 00514 case 4: 00515 { 00516 conn[0] = this->node(9); 00517 conn[1] = this->node(15); 00518 conn[2] = this->node(17); 00519 conn[3] = this->node(3); 00520 conn[4] = this->node(12); 00521 conn[5] = this->node(14); 00522 00523 return; 00524 } 00525 00526 case 5: 00527 { 00528 conn[0] = this->node(15); 00529 conn[1] = this->node(10); 00530 conn[2] = this->node(16); 00531 conn[3] = this->node(12); 00532 conn[4] = this->node(4); 00533 conn[5] = this->node(13); 00534 00535 return; 00536 } 00537 00538 case 6: 00539 { 00540 conn[0] = this->node(17); 00541 conn[1] = this->node(16); 00542 conn[2] = this->node(11); 00543 conn[3] = this->node(14); 00544 conn[4] = this->node(13); 00545 conn[5] = this->node(5); 00546 00547 return; 00548 } 00549 00550 case 7: 00551 { 00552 conn[0] = this->node(15); 00553 conn[1] = this->node(16); 00554 conn[2] = this->node(17); 00555 conn[3] = this->node(12); 00556 conn[4] = this->node(13); 00557 conn[5] = this->node(14); 00558 00559 return; 00560 } 00561 00562 default: 00563 libmesh_error_msg("Invalid sc = " << sc); 00564 } 00565 */ 00566 } 00567 00568 default: 00569 libmesh_error_msg("Unsupported IO package " << iop); 00570 } 00571 } 00572 00573 00574 00575 00576 unsigned int Prism18::n_second_order_adjacent_vertices (const unsigned int n) const 00577 { 00578 switch (n) 00579 { 00580 case 6: 00581 case 7: 00582 case 8: 00583 case 9: 00584 case 10: 00585 case 11: 00586 case 12: 00587 case 13: 00588 case 14: 00589 return 2; 00590 00591 case 15: 00592 case 16: 00593 case 17: 00594 return 4; 00595 00596 default: 00597 libmesh_error_msg("Invalid node n = " << n); 00598 } 00599 00600 libmesh_error_msg("We'll never get here!"); 00601 return libMesh::invalid_uint; 00602 } 00603 00604 00605 00606 00607 00608 unsigned short int Prism18::second_order_adjacent_vertex (const unsigned int n, 00609 const unsigned int v) const 00610 { 00611 libmesh_assert_greater_equal (n, this->n_vertices()); 00612 libmesh_assert_less (n, this->n_nodes()); 00613 00614 switch (n) 00615 { 00616 /* 00617 * These nodes are unique to \p Prism18, 00618 * let our _remaining_... matrix handle 00619 * this. 00620 */ 00621 case 15: 00622 case 16: 00623 case 17: 00624 { 00625 libmesh_assert_less (v, 4); 00626 return _remaining_second_order_adjacent_vertices[n-15][v]; 00627 } 00628 00629 /* 00630 * All other second-order nodes (6,...,14) are 00631 * identical with Prism15 and are therefore 00632 * delegated to the _second_order matrix of 00633 * \p Prism 00634 */ 00635 default: 00636 { 00637 libmesh_assert_less (v, 2); 00638 return _second_order_adjacent_vertices[n-this->n_vertices()][v]; 00639 } 00640 00641 } 00642 00643 libmesh_error_msg("We'll never ge here!"); 00644 return static_cast<unsigned short int>(-1); 00645 } 00646 00647 00648 00649 const unsigned short int Prism18::_remaining_second_order_adjacent_vertices[3][4] = 00650 { 00651 { 0, 1, 3, 4}, // vertices adjacent to node 15 00652 { 1, 2, 4, 5}, // vertices adjacent to node 16 00653 { 0, 2, 3, 5} // vertices adjacent to node 17 00654 }; 00655 00656 00657 00658 std::pair<unsigned short int, unsigned short int> 00659 Prism18::second_order_child_vertex (const unsigned int n) const 00660 { 00661 libmesh_assert_greater_equal (n, this->n_vertices()); 00662 libmesh_assert_less (n, this->n_nodes()); 00663 00664 return std::pair<unsigned short int, unsigned short int> 00665 (_second_order_vertex_child_number[n], 00666 _second_order_vertex_child_index[n]); 00667 } 00668 00669 00670 00671 00672 00673 00674 00675 #ifdef LIBMESH_ENABLE_AMR 00676 00677 const float Prism18::_embedding_matrix[8][18][18] = 00678 { 00679 // embedding matrix for child 0 00680 { 00681 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00682 { 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0 00683 { 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1 00684 { 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2 00685 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.}, // 3 00686 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 4 00687 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 5 00688 { 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6 00689 { 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7 00690 { 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8 00691 { 0.375, 0., 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0.}, // 9 00692 { 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0., 0.}, // 10 00693 { 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75}, // 11 00694 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0.}, // 12 00695 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 13 00696 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0.75}, // 14 00697 { 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 00698 { 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 00699 { 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 00700 }, 00701 00702 // embedding matrix for child 1 00703 { 00704 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00705 { 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0 00706 { 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1 00707 { 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2 00708 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 3 00709 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.}, // 4 00710 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 5 00711 { -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6 00712 { 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7 00713 { -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8 00714 { 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0., 0.}, // 9 00715 { 0., 0.375, 0., 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0.}, // 10 00716 { 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0.}, // 11 00717 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0.}, // 12 00718 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0.}, // 13 00719 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 14 00720 {-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 00721 { 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 00722 {-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 00723 }, 00724 00725 // embedding matrix for child 2 00726 { 00727 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00728 { 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0 00729 { 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1 00730 { 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2 00731 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 3 00732 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 4 00733 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.}, // 5 00734 { -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6 00735 { 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7 00736 { -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8 00737 { 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75}, // 9 00738 { 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0.}, // 10 00739 { 0., 0., 0.375, 0., 0., -0.125, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0.}, // 11 00740 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 12 00741 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0.}, // 13 00742 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0.75}, // 14 00743 {-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 00744 { 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 00745 {-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 00746 }, 00747 00748 // embedding matrix for child 3 00749 { 00750 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00751 { 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0 00752 { 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 1 00753 { 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 2 00754 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 3 00755 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 4 00756 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 5 00757 { -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 6 00758 { -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 7 00759 { 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 8 00760 { 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0., 0.}, // 9 00761 { 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75, 0.}, // 10 00762 { 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., 0., 0., 0., 0., -0.125, 0., 0., 0.75}, // 11 00763 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 12 00764 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 13 00765 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 14 00766 {-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 00767 {-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 00768 { 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 00769 }, 00770 00771 // embedding matrix for child 4 00772 { 00773 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00774 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.}, // 0 00775 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 1 00776 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 2 00777 { 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 3 00778 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.}, // 4 00779 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.}, // 5 00780 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0., 0.}, // 6 00781 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 7 00782 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0.75}, // 8 00783 { -0.125, 0., 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0., 0.}, // 9 00784 { 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0., 0.}, // 10 00785 { 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75}, // 11 00786 { 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0.}, // 12 00787 { 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0.}, // 13 00788 { 0., 0., 0., 0.375, 0., -0.125, 0., 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0.}, // 14 00789 {-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 00790 { 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 00791 {-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 00792 }, 00793 00794 // embedding matrix for child 5 00795 { 00796 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00797 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 0 00798 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.}, // 1 00799 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 2 00800 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.}, // 3 00801 { 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 4 00802 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.}, // 5 00803 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0., 0.}, // 6 00804 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0.75, 0.}, // 7 00805 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 8 00806 { 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0., 0.}, // 9 00807 { 0., -0.125, 0., 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0., 0.}, // 10 00808 { 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0.}, // 11 00809 { 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0.}, // 12 00810 { 0., 0., 0., 0., 0.375, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0.}, // 13 00811 { 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0.}, // 14 00812 { 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 00813 { 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 00814 { 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 00815 }, 00816 00817 // embedding matrix for child 6 00818 { 00819 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00820 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 0 00821 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 1 00822 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.}, // 2 00823 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.}, // 3 00824 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.}, // 4 00825 { 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}, // 5 00826 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 6 00827 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0.75, 0.}, // 7 00828 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0.75}, // 8 00829 { 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75}, // 9 00830 { 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0.}, // 10 00831 { 0., 0., -0.125, 0., 0., 0.375, 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0., 0., 0.}, // 11 00832 { 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0.}, // 12 00833 { 0., 0., 0., 0., -0.125, 0.375, 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0., 0.}, // 13 00834 { 0., 0., 0., -0.125, 0., 0.375, 0., 0., 0., 0., 0., 0., 0., 0., 0.75, 0., 0., 0.}, // 14 00835 { 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 00836 { 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 00837 { 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 00838 }, 00839 00840 // embedding matrix for child 7 00841 { 00842 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 00843 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.}, // 0 00844 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.}, // 1 00845 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}, // 2 00846 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.}, // 3 00847 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.}, // 4 00848 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.}, // 5 00849 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0.5, 0.5, 0.25}, // 6 00850 { 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0.25, 0.5, 0.5}, // 7 00851 { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0.5, 0.25, 0.5}, // 8 00852 { 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0., 0.}, // 9 00853 { 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75, 0.}, // 10 00854 { 0., 0., 0., 0., 0., 0., 0., 0., -0.125, 0., 0., 0., 0., 0., 0.375, 0., 0., 0.75}, // 11 00855 { 0., 0., 0., -0.125, 0., -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.5, 0.25, 0., 0., 0.}, // 12 00856 { 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0., 0.25, 0.5, 0.5, 0., 0., 0.}, // 13 00857 { 0., 0., 0., 0., -0.125, -0.125, 0., 0., 0., 0., 0., 0., 0.5, 0.25, 0.5, 0., 0., 0.}, // 14 00858 { 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 00859 { 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 00860 { 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 00861 } 00862 }; 00863 00864 #endif 00865 00866 } // namespace libMesh