LCOV - code coverage report
Current view: top level - src/geom - cell_tet14.C (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4554 (5a536d) with base 54e0d5 Lines: 152 271 56.1 %
Date: 2026-09-16 12:37:14 Functions: 22 26 84.6 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // The libMesh Finite Element Library.
       2             : // Copyright (C) 2002-2026 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             : // Local includes
      20             : #include "libmesh/cell_tet14.h"
      21             : #include "libmesh/fe_reference_element_traits.h"
      22             : #include "libmesh/edge_edge3.h"
      23             : #include "libmesh/face_tri7.h"
      24             : #include "libmesh/enum_io_package.h"
      25             : #include "libmesh/enum_order.h"
      26             : 
      27             : #ifdef LIBMESH_ENABLE_AMR
      28             : namespace {
      29             :   constexpr libMesh::Real r18 = 18;
      30             :   constexpr libMesh::Real r64 = 64;
      31             :   constexpr libMesh::Real r72 = 72;
      32             : }
      33             : #endif
      34             : 
      35             : namespace libMesh
      36             : {
      37             : 
      38             : 
      39             : 
      40             : // ------------------------------------------------------------
      41             : // Tet14 class static member initializations
      42             : const int Tet14::num_nodes;
      43             : const int Tet14::nodes_per_side;
      44             : const int Tet14::nodes_per_edge;
      45             : 
      46             : const ReferenceElementTable<Tet14::num_sides, Tet14::nodes_per_side>
      47             : Tet14::side_nodes_map = build_side_nodes<Tet14::num_sides, Tet14::nodes_per_side>(TET14);
      48             : 
      49             : const ReferenceElementTable<Tet14::num_edges, Tet14::nodes_per_edge>
      50             : Tet14::edge_nodes_map = tet_edge_nodes();
      51             : 
      52             : // ------------------------------------------------------------
      53             : // Tet14 class member functions
      54             : 
      55    17179937 : bool Tet14::is_vertex(const unsigned int i) const
      56             : {
      57    17179937 :   if (i < 4)
      58     4868763 :     return true;
      59     3239568 :   return false;
      60             : }
      61             : 
      62       46080 : bool Tet14::is_edge(const unsigned int i) const
      63             : {
      64       46080 :   if (i < 4 || i > 9)
      65       18432 :     return false;
      66        6912 :   return true;
      67             : }
      68             : 
      69     2785038 : bool Tet14::is_face(const unsigned int i) const
      70             : {
      71     2785038 :   if (i > 9)
      72      543948 :     return true;
      73      561910 :   return false;
      74             : }
      75             : 
      76     1292612 : bool Tet14::is_node_on_side(const unsigned int n,
      77             :                             const unsigned int s) const
      78             : {
      79      325453 :   libmesh_assert_less (s, n_sides());
      80      325453 :   return std::find(std::begin(side_nodes_map[s]),
      81      325453 :                    std::end(side_nodes_map[s]),
      82     1292612 :                    n) != std::end(side_nodes_map[s]);
      83             : }
      84             : 
      85             : std::vector<unsigned>
      86    28282914 : Tet14::nodes_on_side(const unsigned int s) const
      87             : {
      88     6501714 :   libmesh_assert_less(s, n_sides());
      89    28282914 :   return {std::begin(side_nodes_map[s]), std::end(side_nodes_map[s])};
      90             : }
      91             : 
      92             : std::vector<unsigned>
      93       32298 : Tet14::nodes_on_edge(const unsigned int e) const
      94             : {
      95        8076 :   libmesh_assert_less(e, n_edges());
      96       32298 :   return {std::begin(edge_nodes_map[e]), std::end(edge_nodes_map[e])};
      97             : }
      98             : 
      99      257916 : bool Tet14::is_node_on_edge(const unsigned int n,
     100             :                             const unsigned int e) const
     101             : {
     102       68640 :   libmesh_assert_less (e, n_edges());
     103       68640 :   return std::find(std::begin(edge_nodes_map[e]),
     104       68640 :                    std::end(edge_nodes_map[e]),
     105      257916 :                    n) != std::end(edge_nodes_map[e]);
     106             : }
     107             : 
     108             : 
     109             : #ifdef LIBMESH_ENABLE_AMR
     110             : 
     111             : // This function only works if LIBMESH_ENABLE_AMR...
     112      756672 : bool Tet14::is_child_on_side(const unsigned int c,
     113             :                              const unsigned int s) const
     114             : {
     115             :   // Table of local IDs for the midege nodes on the side opposite a given node.
     116             :   // See the ASCII art in the header file for this class to confirm this.
     117      756672 :   const unsigned int midedge_nodes_opposite[4][3] =
     118             :     {
     119             :       {5,8,9}, // midedge nodes opposite node 0
     120             :       {6,7,9}, // midedge nodes opposite node 1
     121             :       {4,7,8}, // midedge nodes opposite node 2
     122             :       {4,5,6}  // midedge nodes opposite node 3
     123             :     };
     124             : 
     125             :   // Call the base class helper function
     126     1209216 :   return Tet::is_child_on_side_helper(c, s, midedge_nodes_opposite);
     127             : }
     128             : 
     129             : #else
     130             : 
     131             : bool Tet14::is_child_on_side(const unsigned int /*c*/,
     132             :                              const unsigned int /*s*/) const
     133             : {
     134             :   libmesh_not_implemented();
     135             :   return false;
     136             : }
     137             : 
     138             : #endif //LIBMESH_ENABLE_AMR
     139             : 
     140             : 
     141             : 
     142     5469915 : bool Tet14::has_affine_map() const
     143             : {
     144             :   // Make sure edges are straight
     145     2735906 :   Point v10 = this->point(1) - this->point(0);
     146     6837870 :   if (!v10.relative_fuzzy_equals
     147     5469915 :       ((this->point(4) - this->point(0))*2))
     148        1166 :     return false;
     149     2733574 :   Point v21 = this->point(2) - this->point(1);
     150     6832071 :   if (!v21.relative_fuzzy_equals
     151     5465282 :       ((this->point(5) - this->point(1))*2))
     152           0 :     return false;
     153     2733574 :   Point v20 = this->point(2) - this->point(0);
     154     6832071 :   if (!v20.relative_fuzzy_equals
     155     5465282 :       ((this->point(6) - this->point(0))*2))
     156           0 :     return false;
     157     2733574 :   Point v30 = this->point(3) - this->point(0);
     158     6832071 :   if (!v30.relative_fuzzy_equals
     159     5465282 :       ((this->point(7) - this->point(0))*2))
     160           0 :     return false;
     161     2733574 :   Point v31 = this->point(3) - this->point(1);
     162     6832071 :   if (!v31.relative_fuzzy_equals
     163     5465282 :       ((this->point(8) - this->point(1))*2))
     164           0 :     return false;
     165     2733574 :   Point v32 = this->point(3) - this->point(2);
     166     6832071 :   if (!v32.relative_fuzzy_equals
     167     5465282 :       ((this->point(9) - this->point(2))*2))
     168           0 :     return false;
     169             : 
     170             :   // Make sure midface nodes are midface
     171     5465282 :   if (!(v20+v10).relative_fuzzy_equals
     172     5465282 :       ((this->point(10) - this->point(0))*3))
     173           0 :     return false;
     174     5465282 :   if (!(v30+v10).relative_fuzzy_equals
     175     5465282 :       ((this->point(11) - this->point(0))*3))
     176           0 :     return false;
     177     5465282 :   if (!(v31+v21).relative_fuzzy_equals
     178     5465282 :       ((this->point(12) - this->point(1))*3))
     179           0 :     return false;
     180     5465282 :   if (!(v30+v20).relative_fuzzy_equals
     181     5465282 :       ((this->point(13) - this->point(0))*3))
     182           0 :     return false;
     183             : 
     184     1366789 :   return true;
     185             : }
     186             : 
     187             : 
     188             : 
     189    24432855 : Order Tet14::default_order() const
     190             : {
     191    24432855 :   return THIRD;
     192             : }
     193             : 
     194             : 
     195             : 
     196    27622156 : unsigned int Tet14::local_side_node(unsigned int side,
     197             :                                     unsigned int side_node) const
     198             : {
     199     6843984 :   libmesh_assert_less (side, this->n_sides());
     200     6843984 :   libmesh_assert_less (side_node, Tet14::nodes_per_side);
     201             : 
     202    27622156 :   return Tet14::side_nodes_map[side][side_node];
     203             : }
     204             : 
     205             : 
     206             : 
     207    13016464 : unsigned int Tet14::local_edge_node(unsigned int edge,
     208             :                                     unsigned int edge_node) const
     209             : {
     210     2244276 :   libmesh_assert_less (edge, this->n_edges());
     211     2244276 :   libmesh_assert_less (edge_node, Tet14::nodes_per_edge);
     212             : 
     213    13016464 :   return Tet14::edge_nodes_map[edge][edge_node];
     214             : }
     215             : 
     216             : 
     217             : 
     218     5264454 : std::unique_ptr<Elem> Tet14::build_side_ptr (const unsigned int i)
     219             : {
     220     5264454 :   return this->simple_build_side_ptr<Tri7, Tet14>(i);
     221             : }
     222             : 
     223             : 
     224             : 
     225     1390996 : void Tet14::build_side_ptr (std::unique_ptr<Elem> & side,
     226             :                             const unsigned int i)
     227             : {
     228     1390996 :   this->simple_build_side_ptr<Tet14>(side, i, TRI7);
     229     1390996 : }
     230             : 
     231             : 
     232             : 
     233     2280102 : std::unique_ptr<Elem> Tet14::build_edge_ptr (const unsigned int i)
     234             : {
     235     2280102 :   return this->simple_build_edge_ptr<Edge3,Tet14>(i);
     236             : }
     237             : 
     238             : 
     239             : 
     240           0 : void Tet14::build_edge_ptr (std::unique_ptr<Elem> & edge, const unsigned int i)
     241             : {
     242           0 :   this->simple_build_edge_ptr<Tet14>(edge, i, EDGE3);
     243           0 : }
     244             : 
     245             : 
     246             : 
     247           0 : void Tet14::connectivity(const unsigned int sc,
     248             :                          const IOPackage iop,
     249             :                          std::vector<dof_id_type> & conn) const
     250             : {
     251           0 :   libmesh_assert(_nodes);
     252           0 :   libmesh_assert_less (sc, this->n_sub_elem());
     253           0 :   libmesh_assert_not_equal_to (iop, INVALID_IO_PACKAGE);
     254             : 
     255           0 :   switch (iop)
     256             :     {
     257           0 :     case TECPLOT:
     258             :       {
     259           0 :         conn.resize(8);
     260           0 :         switch (sc)
     261             :           {
     262             : 
     263             : 
     264             :             // Linear sub-tet 0
     265           0 :           case 0:
     266             : 
     267           0 :             conn[0] = this->node_id(0)+1;
     268           0 :             conn[1] = this->node_id(4)+1;
     269           0 :             conn[2] = this->node_id(6)+1;
     270           0 :             conn[3] = this->node_id(6)+1;
     271           0 :             conn[4] = this->node_id(7)+1;
     272           0 :             conn[5] = this->node_id(7)+1;
     273           0 :             conn[6] = this->node_id(7)+1;
     274           0 :             conn[7] = this->node_id(7)+1;
     275             : 
     276           0 :             return;
     277             : 
     278             :             // Linear sub-tet 1
     279           0 :           case 1:
     280             : 
     281           0 :             conn[0] = this->node_id(4)+1;
     282           0 :             conn[1] = this->node_id(1)+1;
     283           0 :             conn[2] = this->node_id(5)+1;
     284           0 :             conn[3] = this->node_id(5)+1;
     285           0 :             conn[4] = this->node_id(8)+1;
     286           0 :             conn[5] = this->node_id(8)+1;
     287           0 :             conn[6] = this->node_id(8)+1;
     288           0 :             conn[7] = this->node_id(8)+1;
     289             : 
     290           0 :             return;
     291             : 
     292             :             // Linear sub-tet 2
     293           0 :           case 2:
     294             : 
     295           0 :             conn[0] = this->node_id(5)+1;
     296           0 :             conn[1] = this->node_id(2)+1;
     297           0 :             conn[2] = this->node_id(6)+1;
     298           0 :             conn[3] = this->node_id(6)+1;
     299           0 :             conn[4] = this->node_id(9)+1;
     300           0 :             conn[5] = this->node_id(9)+1;
     301           0 :             conn[6] = this->node_id(9)+1;
     302           0 :             conn[7] = this->node_id(9)+1;
     303             : 
     304           0 :             return;
     305             : 
     306             :             // Linear sub-tet 3
     307           0 :           case 3:
     308             : 
     309           0 :             conn[0] = this->node_id(7)+1;
     310           0 :             conn[1] = this->node_id(8)+1;
     311           0 :             conn[2] = this->node_id(9)+1;
     312           0 :             conn[3] = this->node_id(9)+1;
     313           0 :             conn[4] = this->node_id(3)+1;
     314           0 :             conn[5] = this->node_id(3)+1;
     315           0 :             conn[6] = this->node_id(3)+1;
     316           0 :             conn[7] = this->node_id(3)+1;
     317             : 
     318           0 :             return;
     319             : 
     320             :             // Linear sub-tet 4
     321           0 :           case 4:
     322             : 
     323           0 :             conn[0] = this->node_id(4)+1;
     324           0 :             conn[1] = this->node_id(8)+1;
     325           0 :             conn[2] = this->node_id(6)+1;
     326           0 :             conn[3] = this->node_id(6)+1;
     327           0 :             conn[4] = this->node_id(7)+1;
     328           0 :             conn[5] = this->node_id(7)+1;
     329           0 :             conn[6] = this->node_id(7)+1;
     330           0 :             conn[7] = this->node_id(7)+1;
     331             : 
     332           0 :             return;
     333             : 
     334             :             // Linear sub-tet 5
     335           0 :           case 5:
     336             : 
     337           0 :             conn[0] = this->node_id(4)+1;
     338           0 :             conn[1] = this->node_id(5)+1;
     339           0 :             conn[2] = this->node_id(6)+1;
     340           0 :             conn[3] = this->node_id(6)+1;
     341           0 :             conn[4] = this->node_id(8)+1;
     342           0 :             conn[5] = this->node_id(8)+1;
     343           0 :             conn[6] = this->node_id(8)+1;
     344           0 :             conn[7] = this->node_id(8)+1;
     345             : 
     346           0 :             return;
     347             : 
     348             :             // Linear sub-tet 6
     349           0 :           case 6:
     350             : 
     351           0 :             conn[0] = this->node_id(5)+1;
     352           0 :             conn[1] = this->node_id(9)+1;
     353           0 :             conn[2] = this->node_id(6)+1;
     354           0 :             conn[3] = this->node_id(6)+1;
     355           0 :             conn[4] = this->node_id(8)+1;
     356           0 :             conn[5] = this->node_id(8)+1;
     357           0 :             conn[6] = this->node_id(8)+1;
     358           0 :             conn[7] = this->node_id(8)+1;
     359             : 
     360           0 :             return;
     361             : 
     362             :             // Linear sub-tet 7
     363           0 :           case 7:
     364             : 
     365           0 :             conn[0] = this->node_id(7)+1;
     366           0 :             conn[1] = this->node_id(6)+1;
     367           0 :             conn[2] = this->node_id(9)+1;
     368           0 :             conn[3] = this->node_id(9)+1;
     369           0 :             conn[4] = this->node_id(8)+1;
     370           0 :             conn[5] = this->node_id(8)+1;
     371           0 :             conn[6] = this->node_id(8)+1;
     372           0 :             conn[7] = this->node_id(8)+1;
     373             : 
     374           0 :             return;
     375             : 
     376             : 
     377           0 :           default:
     378           0 :             libmesh_error_msg("Invalid sc = " << sc);
     379             :           }
     380             :       }
     381             : 
     382           0 :     case VTK:
     383             :       {
     384             :         // VTK has vtkHigherOrderTetra which might have the same
     385             :         // connectivity as our Tet14, but this has not been tested
     386             :         // yet.
     387             :         libmesh_experimental();
     388           0 :         conn.resize(Tet14::num_nodes);
     389           0 :         for (auto i : index_range(conn))
     390           0 :           conn[i] = this->node_id(i);
     391           0 :         return;
     392             :       }
     393             : 
     394           0 :     default:
     395           0 :       libmesh_error_msg("Unsupported IO package " << iop);
     396             :     }
     397             : }
     398             : 
     399             : 
     400             : 
     401     2228240 : unsigned int Tet14::n_second_order_adjacent_vertices (const unsigned int n) const
     402             : {
     403     2228240 :   switch (n)
     404             :     {
     405      358944 :     case 4:
     406             :     case 5:
     407             :     case 6:
     408             :     case 7:
     409             :     case 8:
     410             :     case 9:
     411      358944 :       return 2;
     412             : 
     413      891296 :     case 10:
     414             :     case 11:
     415             :     case 12:
     416             :     case 13:
     417      891296 :       return 3;
     418             : 
     419           0 :     default:
     420           0 :       libmesh_error_msg("Invalid n = " << n);
     421             :     }
     422             : }
     423             : 
     424             : 
     425             : 
     426             : 
     427             : const unsigned short int Tet14::_second_order_vertex_child_number[14] =
     428             :   {
     429             :     99,99,99,99, // Vertices
     430             :     0,1,0,0,1,2, // Edges
     431             :     5,4,6,7      // Faces
     432             :   };
     433             : 
     434             : 
     435             : 
     436             : const unsigned short int Tet14::_second_order_vertex_child_index[14] =
     437             :   {
     438             :     99,99,99,99, // Vertices
     439             :     1,2,2,3,3,3, // Edges
     440             :     10,13,12,13  // Faces
     441             :   };
     442             : 
     443             : 
     444             : 
     445             : std::pair<unsigned short int, unsigned short int>
     446           0 : Tet14::second_order_child_vertex (const unsigned int n) const
     447             : {
     448           0 :   libmesh_assert_greater_equal (n, this->n_vertices());
     449           0 :   libmesh_assert_less (n, this->n_nodes());
     450           0 :   return std::pair<unsigned short int, unsigned short int>
     451           0 :     (_second_order_vertex_child_number[n],
     452           0 :      _second_order_vertex_child_index[n]);
     453             : }
     454             : 
     455             : 
     456             : 
     457     5347776 : unsigned short int Tet14::second_order_adjacent_vertex (const unsigned int n,
     458             :                                                         const unsigned int v) const
     459             : {
     460     1435776 :   libmesh_assert_greater_equal (n, this->n_vertices());
     461     1435776 :   libmesh_assert_less (n, this->n_nodes());
     462     1435776 :   libmesh_assert_less (v, 3);
     463     1435776 :   libmesh_assert (n > 9 || v < 2); // Only face nodes have multiple adjacencies
     464     5347776 :   return _second_order_adjacent_vertices[n-this->n_vertices()][v];
     465             : }
     466             : 
     467             : 
     468             : 
     469             : const unsigned short int Tet14::_second_order_adjacent_vertices[10][3] =
     470             :   {
     471             :     {0, 1, 99}, // vertices adjacent to node 4
     472             :     {1, 2, 99}, // vertices adjacent to node 5
     473             :     {0, 2, 99}, // vertices adjacent to node 6
     474             :     {0, 3, 99}, // vertices adjacent to node 7
     475             :     {1, 3, 99}, // vertices adjacent to node 8
     476             :     {2, 3, 99}, // vertices adjacent to node 9
     477             :     {0, 1,  2}, // vertices adjacent to node 10
     478             :     {0, 1,  3}, // vertices adjacent to node 11
     479             :     {1, 2,  3}, // vertices adjacent to node 12
     480             :     {0, 2,  3}, // vertices adjacent to node 13
     481             :   };
     482             : 
     483             : 
     484             : 
     485             : 
     486             : 
     487             : #ifdef LIBMESH_ENABLE_AMR
     488             : 
     489             : const Real Tet14::_embedding_matrix[Tet14::num_children][Tet14::num_nodes][Tet14::num_nodes] =
     490             :   {
     491             :     // embedding matrix for child 0
     492             :     {
     493             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     494             :       {    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     495             :       {    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 1
     496             :       {    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 2
     497             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.}, // 3
     498             :       { 0.375,-0.125,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 4
     499             :       {.09375,-.03125,-.03125,  0., 0.125,-0.125, 0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 5
     500             :       { 0.375,    0.,-0.125,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 6
     501             :       { 0.375,    0.,    0.,-0.125,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.}, // 7
     502             :       {.09375,-.03125,   0.,-.03125,0.125,    0.,    0., 0.125,-0.125,    0.,    0.,.84375,    0.,    0.}, // 8
     503             :       {.09375,    0.,-.03125,-.03125,  0.,    0., 0.125, 0.125,    0.,-0.125,    0.,    0.,    0.,.84375}, // 9
     504             :       { 5/r18,-1/r18,-1/r18,    0., 4/r18,-2/r18, 4/r18,    0.,    0.,    0.,   0.5,    0.,    0.,    0.}, // 10
     505             :       { 5/r18,-1/r18,    0.,-1/r18, 4/r18,    0.,    0., 4/r18,-2/r18,    0.,    0.,   0.5,    0.,    0.}, // 11
     506             :       { 0.125,-1/r72,-1/r72,-1/r72,    0.,-2/r18,    0.,    0.,-2/r18,-2/r18, 0.375, 0.375, 0.125, 0.375}, // 12
     507             :       { 5/r18,    0.,-1/r18,-1/r18,    0.,    0., 4/r18, 4/r18,    0.,-2/r18,    0.,    0.,    0.,   0.5}  // 13
     508             :     },
     509             : 
     510             :     // embedding matrix for child 1?
     511             :     {
     512             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     513             :       {    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     514             :       {    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 1
     515             :       {    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 2
     516             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.}, // 3
     517             :       {-0.125, 0.375,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 4
     518             :       {    0., 0.375,-0.125,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 5
     519             :       {-.03125,.09375,-.03125,  0., 0.125, 0.125,-0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 6
     520             :       {-.03125,.09375,   0.,-.03125,0.125,    0.,    0.,-0.125, 0.125,    0.,    0.,.84375,    0.,    0.}, // 7
     521             :       {    0., 0.375,    0.,-0.125,    0.,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.}, // 8
     522             :       {    0.,.09375,-0.03125,-0.03125,0., 0.125,    0.,    0., 0.125,-0.125,    0.,    0.,.84375,    0.}, // 9
     523             :       {-1/r18, 5/r18,-1/r18,    0., 4/r18, 4/r18,-2/r18,    0.,    0.,    0.,   0.5,    0.,    0.,    0.}, // 10
     524             :       {-1/r18, 5/r18,    0.,-1/r18, 4/r18,    0.,    0.,-2/r18, 4/r18,    0.,    0.,   0.5,    0.,    0.}, // 11
     525             :       {    0., 5/r18,-1/r18,-1/r18,    0., 4/r18,    0.,    0., 4/r18,-2/r18,    0.,    0.,   0.5,    0.}, // 12
     526             :       {-1/r72, 0.125,-1/r72,-1/r72,    0.,    0.,-2/r18,-2/r18,    0.,-2/r18, 0.375, 0.375, 0.375, 0.125}  // 13
     527             :     },
     528             : 
     529             :     // embedding matrix for child 2
     530             :     {
     531             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     532             :       {    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     533             :       {    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 1
     534             :       {    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 2
     535             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.}, // 3
     536             :       {-.03125,-.03125,.09375,  0.,-0.125, 0.125, 0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 4
     537             :       {    0.,-0.125, 0.375,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 5
     538             :       {-0.125,    0., 0.375,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 6
     539             :       {-.03125,   0.,.09375,-.03125,   0.,    0., 0.125,-0.125,    0., 0.125,    0.,    0.,    0.,.84375}, // 7
     540             :       {    0.,-.03125,.09375,-.03125,  0., 0.125,    0.,    0.,-0.125, 0.125,    0.,    0.,.84375,    0.}, // 8
     541             :       {    0.,    0., 0.375,-0.125,    0.,    0.,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.}, // 9
     542             :       {-1/r18,-1/r18, 5/r18,    0.,-2/r18, 4/r18, 4/r18,    0.,    0.,    0.,   0.5,    0.,    0.,    0.}, // 10
     543             :       {-1/r72,-1/r72, 0.125,-1/r72,-2/r18,    0.,    0.,-2/r18,-2/r18,    0., 0.375, 0.125, 0.375, 0.375}, // 11
     544             :       {    0.,-1/r18, 5/r18,-1/r18,    0., 4/r18,    0.,    0.,-2/r18, 4/r18,    0.,    0.,   0.5,    0.}, // 12
     545             :       {-1/r18,    0., 5/r18,-1/r18,    0.,    0., 4/r18,-2/r18,    0., 4/r18,    0.,    0.,    0.,   0.5}  // 13
     546             :     },
     547             : 
     548             :     // embedding matrix for child 3
     549             :     {
     550             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     551             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     552             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.}, // 1
     553             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.}, // 2
     554             :       {    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 3
     555             :       {-.03125,-.03125,  0.,.09375,-0.125,    0.,    0., 0.125, 0.125,    0.,    0.,.84375,    0.,    0.}, // 4
     556             :       {    0.,-.03125,-.03125,.09375,  0.,-0.125,    0.,    0., 0.125, 0.125,    0.,    0.,.84375,    0.}, // 5
     557             :       {-.03125,    0.,-.03125,.09375,  0.,    0.,-0.125, 0.125,    0., 0.125,    0.,    0.,    0.,.84375}, // 6
     558             :       {-0.125,    0.,    0., 0.375,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.,    0.}, // 7
     559             :       {    0.,-0.125,    0., 0.375,    0.,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.,    0.}, // 8
     560             :       {    0.,    0.,-0.125, 0.375,    0.,    0.,    0.,    0.,    0.,  0.75,    0.,    0.,    0.,    0.}, // 9
     561             :       {-1/r72,-1/r72,-1/r72, 0.125,-2/r18,-2/r18,-2/r18,    0.,    0.,    0., 0.125, 0.375, 0.375, 0.375}, // 10
     562             :       {-1/r18,-1/r18,    0., 5/r18,-2/r18,    0.,    0., 4/r18, 4/r18,    0.,    0.,   0.5,    0.,    0.}, // 11
     563             :       {    0.,-1/r18,-1/r18, 5/r18,    0.,-2/r18,    0.,    0., 4/r18, 4/r18,    0.,    0.,   0.5,    0.}, // 12
     564             :       {-1/r18,    0.,-1/r18, 5/r18,    0.,    0.,-2/r18, 4/r18,    0., 4/r18,    0.,    0.,    0.,   0.5}  // 13
     565             :     },
     566             : 
     567             :     // embedding matrix for child 4
     568             :     {
     569             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     570             :       {    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     571             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.}, // 1
     572             :       {    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 2
     573             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.}, // 3
     574             :       {-.03125,.09375,   0.,-.03125,0.125,    0.,    0.,-0.125, 0.125,    0.,    0.,.84375,    0.,    0.}, // 4
     575             :       { 1/r64, 1/r64, 1/r64, 1/r64,-0.125,-0.125,-0.125,-0.125,-0.125,-0.125,27/r64,27/r64,27/r64,27/r64}, // 5
     576             :       {.09375,-.03125,-.03125,  0., 0.125,-0.125, 0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 6
     577             :       {.09375,-.03125,   0.,-.03125,0.125,    0.,    0., 0.125,-0.125,    0.,    0.,.84375,    0.,    0.}, // 7
     578             :       {-.03125,-.03125,  0.,.09375,-0.125,    0.,    0., 0.125, 0.125,    0.,    0.,.84375,    0.,    0.}, // 8
     579             :       {.09375,    0.,-.03125,-.03125,  0.,    0., 0.125, 0.125,    0.,-0.125,    0.,    0.,    0.,.84375}, // 9
     580             :       { 2/r72, 2/r72,    0.,    0.,    0.,-2/r18,-2/r18,-2/r18,-2/r18,-2/r18,   0.5,   0.5,  0.25,  0.25}, // 10
     581             :       {    0.,    0,     0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.}, // 11
     582             :       { 2/r72,    0.,    0., 2/r72,-2/r18,-2/r18,-2/r18,    0.,-2/r18,-2/r18,  0.25,   0.5,  0.25,   0.5}, // 12
     583             :       { 0.125,-1/r72,-1/r72,-1/r72,    0.,-2/r18,    0.,    0.,-2/r18,-2/r18, 0.375, 0.375, 0.125, 0.375}  // 13
     584             :     },
     585             : 
     586             :     // embedding matrix for child 5?
     587             :     {
     588             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     589             :       {    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     590             :       {    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 1
     591             :       {    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 2
     592             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.}, // 3
     593             :       {-.03125,.09375,-.03125,  0., 0.125, 0.125,-0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 4
     594             :       {-.03125,-.03125,.09375,  0.,-0.125, 0.125, 0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 5
     595             :       {.09375,-.03125,-.03125,  0., 0.125,-0.125, 0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 6
     596             :       {-.03125,.09375,   0.,-.03125,0.125,    0.,    0.,-0.125, 0.125,    0.,    0.,.84375,    0.,    0.}, // 7
     597             :       {    0.,.09375,-.03125,-.03125,  0., 0.125,    0.,    0., 0.125,-0.125,    0.,    0.,.84375,    0.}, // 8
     598             :       { 1/r64, 1/r64, 1/r64, 1/r64,-0.125,-0.125,-0.125,-0.125,-0.125,-0.125,27/r64,27/r64,27/r64,27/r64}, // 9
     599             :       {    0.,    0,     0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.}, // 10
     600             :       {-1/r72, 0.125,-1/r72,-1/r72,    0.,    0.,-2/r18,-2/r18,    0.,-2/r18, 0.375, 0.375, 0.375, 0.125}, // 11
     601             :       {    0., 2/r72, 2/r72,    0.,-2/r18,    0.,-2/r18,-2/r18,-2/r18,-2/r18,   0.5,  0.25,   0.5,  0.25}, // 12
     602             :       { 2/r72, 2/r72,    0.,    0.,    0.,-2/r18,-2/r18,-2/r18,-2/r18,-2/r18,   0.5,   0.5,  0.25,  0.25}  // 13
     603             :     },
     604             : 
     605             :     // embedding matrix for child 6?
     606             :     {
     607             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     608             :       {    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     609             :       {    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 1
     610             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.}, // 2
     611             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.}, // 3
     612             :       {-.03125,-.03125,.09375,  0.,-0.125, 0.125, 0.125,    0.,    0.,    0.,.84375,    0.,    0.,    0.}, // 4
     613             :       {    0.,-.03125,.09375,-.03125,  0., 0.125,    0.,    0.,-0.125, 0.125,    0.,    0.,.84375,    0.}, // 5
     614             :       {-.03125,    0.,.09375,-.03125,  0.,    0., 0.125,-0.125,    0., 0.125,    0.,    0.,    0.,.84375}, // 6
     615             :       { 1/r64, 1/r64, 1/r64, 1/r64,-0.125,-0.125,-0.125,-0.125,-0.125,-0.125,27/r64,27/r64,27/r64,27/r64}, // 7
     616             :       {    0.,.09375,-.03125,-.03125,  0., 0.125,    0.,    0., 0.125,-0.125,    0.,    0.,.84375,    0.}, // 8
     617             :       {    0.,-.03125,-.03125,.09375,  0.,-0.125,    0.,    0., 0.125, 0.125,    0.,    0.,.84375,    0.}, // 9
     618             :       {-1/r72,-1/r72, 0.125,-1/r72,-2/r18,    0.,    0.,-2/r18,-2/r18,    0., 0.375, 0.125, 0.375, 0.375}, // 10
     619             :       {    0., 2/r72, 2/r72,    0.,-2/r18,    0.,-2/r18,-2/r18,-2/r18,-2/r18,   0.5,  0.25,   0.5,  0.25}, // 11
     620             :       {    0.,    0,     0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.}, // 12
     621             :       {    0.,    0., 2/r72, 2/r72,-2/r18,-2/r18,-2/r18,-2/r18,-2/r18,    0.,  0.25,  0.25,   0.5,   0.5}  // 13
     622             :     },
     623             : 
     624             :     // embedding matrix for child 7?
     625             :     {
     626             :       //    0      1      2      3      4      5      6      7      8      9     10     11     12     13
     627             :       {    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.,    0.}, // 0
     628             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.}, // 1
     629             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.}, // 2
     630             :       {    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.,    0.,    0.,    0.,    0.,    0.,    0.}, // 3
     631             :       { 1/r64, 1/r64, 1/r64, 1/r64,-0.125,-0.125,-0.125,-0.125,-0.125,-0.125,27/r64,27/r64,27/r64,27/r64}, // 4
     632             :       {    0.,-.03125,-.03125,.09375,  0.,-0.125,    0.,    0., 0.125, 0.125,    0.,    0.,.84375,    0.}, // 5
     633             :       {-.03125,    0.,.09375,-.03125,  0.,    0., 0.125,-0.125,    0., 0.125,    0.,    0.,    0.,.84375}, // 6
     634             :       {.09375,    0.,-.03125,-.03125,  0.,    0., 0.125, 0.125,    0.,-0.125,    0.,    0.,    0.,.84375}, // 7
     635             :       {-.03125,-.03125,  0.,.09375,-0.125,    0.,    0., 0.125, 0.125,    0.,    0.,.84375,    0.,    0.}, // 8
     636             :       {-.03125,    0.,-.03125,.09375,  0.,    0.,-0.125, 0.125,    0., 0.125,    0.,    0.,    0.,.84375}, // 9
     637             :       {    0.,    0., 2/r72, 2/r72,-2/r18,-2/r18,-2/r18,-2/r18,-2/r18,    0.,  0.25,  0.25,   0.5,   0.5}, // 10
     638             :       { 2/r72,    0.,    0., 2/r72,-2/r18,-2/r18,-2/r18,    0.,-2/r18,-2/r18,  0.25,   0.5,  0.25,   0.5}, // 11
     639             :       {-1/r72,-1/r72,-1/r72, 0.125,-2/r18,-2/r18,-2/r18,    0.,    0.,    0., 0.125, 0.375, 0.375, 0.375}, // 12
     640             :       {    0.,    0,     0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1.}, // 13
     641             :     }
     642             :   };
     643             : 
     644             : 
     645             : 
     646     5867161 : Real Tet14::embedding_matrix (const unsigned int i,
     647             :                               const unsigned int j,
     648             :                               const unsigned int k) const
     649             : {
     650             :   // Choose an optimal diagonal, if one has not already been selected
     651     5867161 :   this->choose_diagonal();
     652             : 
     653             :   // Permuted j and k indices
     654             :   unsigned int
     655     2039726 :     jp=j,
     656     2039726 :     kp=k;
     657             : 
     658     5867161 :   if ((i>3) && (this->_diagonal_selection!=DIAG_02_13))
     659             :     {
     660             :       // Just the enum value cast to an unsigned int...
     661      246236 :       const unsigned ds = static_cast<unsigned int>(this->_diagonal_selection); // == 1 or 2
     662             : 
     663             :       // Instead of doing a lot of arithmetic, use these
     664             :       // straightforward arrays for the permutations.  Note that 3 ->
     665             :       // 3 and 10 -> 10, and the first array consists of "forward"
     666             :       // permutations of the sets {0,1,2}, {4,5,6}, {7,8,9}, and
     667             :       // {11,12,13} while the second array consists of "reverse"
     668             :       // permutations of the same sets.
     669             : 
     670      588226 :       const unsigned int perms[2][14] =
     671             :         {
     672             :           {1, 2, 0, 3, 5, 6, 4, 8, 9, 7, 10, 12, 13, 11},
     673             :           {2, 0, 1, 3, 6, 4, 5, 9, 7, 8, 10, 13, 11, 12}
     674             :         };
     675             : 
     676             :       // Permute j
     677      588226 :       jp = perms[ds-1][j];
     678             :       //      if (jp<3)
     679             :       //        jp = (jp+ds)%3;
     680             :       //      else if (jp>3)
     681             :       //        jp = (jp-1+ds)%3 + 1 + 3*((jp-1)/3);
     682             : 
     683             :       // Permute k
     684      588226 :       kp = perms[ds-1][k];
     685             :       //      if (kp<3)
     686             :       //        kp = (kp+ds)%3;
     687             :       //      else if (kp>3)
     688             :       //        kp = (kp-1+ds)%3 + 1 + 3*((kp-1)/3);
     689             :     }
     690             : 
     691             :   // Debugging:
     692             :   // libMesh::err << "Selected diagonal " << _diagonal_selection << std::endl;
     693             :   // libMesh::err << "j=" << j << std::endl;
     694             :   // libMesh::err << "k=" << k << std::endl;
     695             :   // libMesh::err << "jp=" << jp << std::endl;
     696             :   // libMesh::err << "kp=" << kp << std::endl;
     697             : 
     698             :   // Call embedding matrix with permuted indices
     699     5867161 :   return this->_embedding_matrix[i][jp][kp];
     700             : }
     701             : 
     702             : 
     703             : const std::vector<std::pair<unsigned char, unsigned char>> &
     704     1184736 : Tet14::parent_bracketing_nodes(unsigned int c,
     705             :                                unsigned int n) const
     706             : {
     707             :   // Choose an optimal diagonal, if one has not already been selected
     708     1184736 :   this->choose_diagonal();
     709             : 
     710             :   // Just the enum value cast to an unsigned int...
     711     1184736 :   const unsigned ds = static_cast<unsigned int>(this->_diagonal_selection);
     712             : 
     713     1184736 :   return Tet14::_parent_bracketing_nodes[ds][c][n];
     714             : }
     715             : 
     716             : 
     717             : const std::vector<std::pair<unsigned char, unsigned char>>
     718             :   Tet14::_parent_bracketing_nodes[3][Tet14::num_children][Tet14::num_nodes] =
     719             : {
     720             :   // DIAG_02_13
     721             :   {
     722             :     // Node 0,      1,      2,      3,      4,      5,      6,      7,      8,      9,
     723             :     //             10,             11,             12,             13
     724             :     // Child 0
     725             :     {      {},{{0,1}},{{0,2}},{{0,3}},{{0,4}},{{4,6}},{{0,6}},{{0,7}},{{4,7}},{{6,7}},{{0,10}},{{0,11}},{{0,12}},{{0,13}} },
     726             :     // Child 1
     727             :     { {{0,1}},     {},{{1,2}},{{1,3}},{{1,4}},{{1,5}},{{4,5}},{{4,8}},{{1,8}},{{5,8}},{{1,10}},{{1,11}},{{1,12}},{{1,13}} },
     728             :     // Child 2
     729             :     { {{0,2}},{{1,2}},     {},{{2,3}},{{5,6}},{{2,5}},{{2,6}},{{6,9}},{{5,9}},{{2,9}},{{2,10}},{{2,11}},{{2,12}},{{2,13}} },
     730             :     // Child 3
     731             :     { {{0,3}},{{1,3}},{{2,3}},     {},{{7,8}},{{8,9}},{{7,9}},{{3,7}},{{3,8}},{{3,9}},{{3,10}},{{3,11}},{{3,12}},{{3,13}} },
     732             :     // Child 4
     733             :     { {{0,1}},{{1,3}},{{0,2}},{{0,3}},{{4,8}},{{6,8}},{{4,6}},{{4,7}},{{7,8}},{{6,7}},
     734             :             {{10,11}},{{0,8},{1,7},{3,4}},  {{11,13}},       {{0,12}} },
     735             :     // Child 5
     736             :     { {{0,1}},{{1,2}},{{0,2}},{{1,3}},{{4,5}},{{5,6}},{{4,6}},{{4,8}},{{5,8}},{{6,8}},
     737             :   {{0,5},{1,6},{2,4}},       {{1,13}},      {{10,12}},      {{10,11}} },
     738             :     // Child 6
     739             :     { {{0,2}},{{1,2}},{{2,3}},{{1,3}},{{5,6}},{{5,9}},{{6,9}},{{6,8}},{{5,8}},{{8,9}},
     740             :              {{2,11}},      {{10,12}},{{1,9},{2,8},{3,5}},  {{12,13}} },
     741             :     // Child 7
     742             :     { {{0,2}},{{1,3}},{{2,3}},{{0,3}},{{6,8}},{{8,9}},{{6,9}},{{6,7}},{{7,8}},{{7,9}},
     743             :             {{12,13}},      {{11,13}},       {{3,10}},{{0,9},{2,7},{3,6}} }
     744             :   },
     745             :   // DIAG_03_12
     746             :   {
     747             :     // Node 0,      1,      2,      3,      4,      5,      6,      7,      8,      9,
     748             :     //             10,             11,             12,             13
     749             :     // Child 0
     750             :     {      {},{{0,1}},{{0,2}},{{0,3}},{{0,4}},{{4,6}},{{0,6}},{{0,7}},{{4,7}},{{6,7}},{{0,10}},{{0,11}},{{0,12}},{{0,13}} },
     751             :     // Child 1
     752             :     { {{0,1}},     {},{{1,2}},{{1,3}},{{1,4}},{{1,5}},{{4,5}},{{4,8}},{{1,8}},{{5,8}},{{1,10}},{{1,11}},{{1,12}},{{1,13}} },
     753             :     // Child 2
     754             :     { {{0,2}},{{1,2}},     {},{{2,3}},{{5,6}},{{2,5}},{{2,6}},{{6,9}},{{5,9}},{{2,9}},{{2,10}},{{2,11}},{{2,12}},{{2,13}} },
     755             :     // Child 3
     756             :     { {{0,3}},{{1,3}},{{2,3}},     {},{{7,8}},{{8,9}},{{7,9}},{{3,7}},{{3,8}},{{3,9}},{{3,10}},{{3,11}},{{3,12}},{{3,13}} },
     757             :     // Child 4
     758             :     { {{0,3}},{{1,2}},{{0,2}},{{2,3}},{{5,7}},{{5,6}},{{6,7}},{{7,9}},{{5,9}},{{6,9}},
     759             :             {{10,13}},      {{12,13}},       {{2,11}},{{0,9},{2,7},{3,6}} },
     760             :     // Child 5
     761             :     { {{0,1}},{{1,2}},{{0,2}},{{0,3}},{{4,5}},{{5,6}},{{4,6}},{{4,7}},{{5,7}},{{6,7}},
     762             :   {{0,5},{1,6},{2,4}},      {{10,11}},      {{10,13}},       {{0,12}} },
     763             :     // Child 6
     764             :     { {{0,1}},{{1,3}},{{1,2}},{{0,3}},{{4,8}},{{5,8}},{{4,5}},{{4,7}},{{7,8}},{{5,7}},
     765             :              {{1,13}},{{0,8},{1,7},{3,4}},  {{11,12}},      {{10,11}} },
     766             :     // Child 7
     767             :     { {{0,3}},{{1,3}},{{1,2}},{{2,3}},{{7,8}},{{5,8}},{{5,7}},{{7,9}},{{8,9}},{{5,9}},
     768             :             {{11,12}},       {{3,10}},{{1,9},{2,8},{3,5}},  {{12,13}} }
     769             :   },
     770             :   // DIAG_01_23
     771             :   {
     772             :     // Node 0,      1,      2,      3,      4,      5,      6,      7,      8,      9,
     773             :     //             10,             11,             12,             13
     774             :     // Child 0
     775             :     {      {},{{0,1}},{{0,2}},{{0,3}},{{0,4}},{{4,6}},{{0,6}},{{0,7}},{{4,7}},{{6,7}},{{0,10}},{{0,11}},{{0,12}},{{0,13}} },
     776             :     // Child 1
     777             :     { {{0,1}},     {},{{1,2}},{{1,3}},{{1,4}},{{1,5}},{{4,5}},{{4,8}},{{1,8}},{{5,8}},{{1,10}},{{1,11}},{{1,12}},{{1,13}} },
     778             :     // Child 2
     779             :     { {{0,2}},{{1,2}},     {},{{2,3}},{{5,6}},{{2,5}},{{2,6}},{{6,9}},{{5,9}},{{2,9}},{{2,10}},{{2,11}},{{2,12}},{{2,13}} },
     780             :     // Child 3
     781             :     { {{0,3}},{{1,3}},{{2,3}},     {},{{7,8}},{{8,9}},{{7,9}},{{3,7}},{{3,8}},{{3,9}},{{3,10}},{{3,11}},{{3,12}},{{3,13}} },
     782             :     // Child 4
     783             :     { {{0,1}},{{1,2}},{{2,3}},{{1,3}},{{4,5}},{{5,9}},{{4,9}},{{4,8}},{{5,8}},{{8,9}},
     784             :             {{10,12}},       {{1,13}},{{1,9},{2,8},{3,5}},  {{11,12}} },
     785             :     // Child 5
     786             :     { {{0,1}},{{1,2}},{{0,2}},{{2,3}},{{4,5}},{{5,6}},{{4,6}},{{4,9}},{{5,9}},{{6,9}},
     787             :   {{0,5},{1,6},{2,4}},      {{10,12}},       {{2,11}},      {{10,13}} },
     788             :     // Child 6
     789             :     { {{0,3}},{{0,1}},{{0,2}},{{2,3}},{{4,7}},{{4,6}},{{6,7}},{{7,9}},{{4,9}},{{6,9}},
     790             :              {{0,12}},      {{11,13}},      {{10,13}},{{0,9},{2,7},{3,6}} },
     791             :     // Child 7
     792             :     { {{0,3}},{{0,1}},{{2,3}},{{1,3}},{{4,7}},{{4,9}},{{7,9}},{{7,8}},{{4,8}},{{8,9}},
     793             :             {{11,13}},{{0,8},{1,7},{3,4}},  {{11,12}},       {{3,10}} }
     794             :   }
     795             : };
     796             : 
     797             : #endif // #ifdef LIBMESH_ENABLE_AMR
     798             : 
     799             : 
     800             : 
     801      188928 : void Tet14::permute(unsigned int perm_num)
     802             : {
     803       50688 :   libmesh_assert_less (perm_num, 12);
     804             : 
     805      188928 :   const unsigned int side = perm_num % 4;
     806      188928 :   const unsigned int rotate = perm_num / 4;
     807             : 
     808      378745 :   for (unsigned int i = 0; i != rotate; ++i)
     809             :     {
     810      189817 :       swap3nodes(0,1,2);
     811      138871 :       swap3nodes(4,5,6);
     812      138871 :       swap3nodes(7,8,9);
     813      138871 :       swap3nodes(11,12,13);
     814      138871 :       swap3neighbors(1,2,3);
     815             :     }
     816             : 
     817      188928 :   switch (side) {
     818       13426 :   case 0:
     819       13426 :     break;
     820       44703 :   case 1:
     821       44703 :     swap3nodes(0,2,3);
     822       32729 :     swap3nodes(4,5,8);
     823       32729 :     swap3nodes(6,9,7);
     824       32729 :     swap3nodes(10,12,11);
     825       32729 :     swap3neighbors(0,2,1);
     826       32729 :     break;
     827       46850 :   case 2:
     828       46850 :     swap3nodes(2,0,3);
     829       34286 :     swap3nodes(5,4,8);
     830       34286 :     swap3nodes(6,7,9);
     831       34286 :     swap3nodes(10,11,12);
     832       34286 :     swap3neighbors(0,1,2);
     833       34286 :     break;
     834       47432 :   case 3:
     835       47432 :     swap3nodes(2,1,3);
     836       34708 :     swap3nodes(5,8,9);
     837       34708 :     swap3nodes(6,4,7);
     838       34708 :     swap3nodes(10,11,13);
     839       34708 :     swap3neighbors(0,1,3);
     840       34708 :     break;
     841           0 :   default:
     842           0 :     libmesh_error();
     843             :   }
     844      188928 : }
     845             : 
     846             : 
     847        2304 : void Tet14::flip(BoundaryInfo * boundary_info)
     848             : {
     849         576 :   libmesh_assert(boundary_info);
     850             : 
     851        2304 :   swap2nodes(0,2);
     852        2304 :   swap2nodes(4,5);
     853        2304 :   swap2nodes(7,9);
     854        2304 :   swap2nodes(11,12);
     855         576 :   swap2neighbors(1,2);
     856        2304 :   swap2boundarysides(1,2,boundary_info);
     857        2304 :   swap2boundaryedges(0,1,boundary_info);
     858        2304 :   swap2boundaryedges(3,5,boundary_info);
     859        2304 : }
     860             : 
     861             : 
     862    28131120 : ElemType Tet14::side_type (const unsigned int libmesh_dbg_var(s)) const
     863             : {
     864     6442976 :   libmesh_assert_less (s, 4);
     865    28131120 :   return TRI7;
     866             : }
     867             : 
     868             : 
     869             : } // namespace libMesh

Generated by: LCOV version 1.14