20 #include "libmesh/side.h" 
   21 #include "libmesh/cell_pyramid13.h" 
   22 #include "libmesh/edge_edge3.h" 
   23 #include "libmesh/face_tri6.h" 
   24 #include "libmesh/face_quad8.h" 
   25 #include "libmesh/enum_io_package.h" 
   26 #include "libmesh/enum_order.h" 
   45     {0, 1, 4, 5, 10,  9, 99, 99}, 
 
   46     {1, 2, 4, 6, 11, 10, 99, 99}, 
 
   47     {2, 3, 4, 7, 12, 11, 99, 99}, 
 
   48     {3, 0, 4, 8,  9, 12, 99, 99}, 
 
   49     {0, 3, 2, 1,  8,  7,  6,  5}  
 
   95                                 const unsigned int s)
 const 
   97   libmesh_assert_less (s, 
n_sides());
 
  103 std::vector<unsigned>
 
  106   libmesh_assert_less(s, 
n_sides());
 
  107   auto trim = (s == 4) ? 0 : 2;
 
  112                                 const unsigned int e)
 const 
  114   libmesh_assert_less (e, 
n_edges());
 
  139                                         unsigned int side_node)
 const 
  141   libmesh_assert_less (side, this->
n_sides());
 
  156   libmesh_assert_less (i, this->
n_sides());
 
  166           return libmesh_make_unique<Side<Tri6,Pyramid13>>(
this,i);
 
  169           return libmesh_make_unique<Side<Quad8,Pyramid13>>(
this,i);
 
  172           libmesh_error_msg(
"Invalid side i = " << i);
 
  179       std::unique_ptr<Elem> face;
 
  188             face = libmesh_make_unique<Tri6>();
 
  193             face = libmesh_make_unique<Quad8>();
 
  197           libmesh_error_msg(
"Invalid side i = " << i);
 
  203       for (
auto n : face->node_index_range())
 
  204         face->set_node(n) = this->
node_ptr(Pyramid13::side_nodes_map[i][n]);
 
  213                                 const unsigned int i)
 
  215   libmesh_assert_less (i, this->
n_sides());
 
  224         if (!side.get() || side->type() != 
TRI6)
 
  233         if (!side.get() || side->type() != 
QUAD8)
 
  241       libmesh_error_msg(
"Invalid side i = " << i);
 
  247   for (
auto n : side->node_index_range())
 
  248     side->set_node(n) = this->
node_ptr(Pyramid13::side_nodes_map[i][n]);
 
  255   libmesh_assert_less (i, this->
n_edges());
 
  257   return libmesh_make_unique<SideEdge<Edge3,Pyramid13>>(
this,i);
 
  264                              std::vector<dof_id_type> & )
 const 
  275         libmesh_not_implemented();
 
  281         libmesh_not_implemented();
 
  285       libmesh_error_msg(
"Unsupported IO package " << iop);
 
  306       libmesh_error_msg(
"Invalid node n = " << n);
 
  312                                                             const unsigned int v)
 const 
  314   libmesh_assert_greater_equal (n, this->
n_vertices());
 
  315   libmesh_assert_less (n, this->
n_nodes());
 
  328         libmesh_assert_less (v, 2);
 
  333         unsigned short node_list[8][2] =
 
  345         return node_list[n-5][v];
 
  349       libmesh_error_msg(
"Invalid n = " << n);
 
  373       x0/4 - x1/4 + x10 + x11 - x12 - x2/4 + x3/4 - 3*x6/2 + 3*x8/2 - x9,
 
  374       -x0/2 + x1/2 - 2*x10 - 2*x11 + 2*x12 + x2/2 - x3/2 + 3*x6/2 - 3*x8/2 + 2*x9,
 
  375       x0/4 - x1/4 + x10 + x11 - x12 - x2/4 + x3/4 - x6/2 + x8/2 - x9,
 
  376       x0/4 - x1/4 + x2/4 - x3/4,
 
  377       -3*x0/4 + 3*x1/4 - x10 + x11 - x12 - 3*x2/4 + 3*x3/4 + x9,
 
  378       x0/2 - x1/2 + x10 - x11 + x12 + x2/2 - x3/2 - x9,
 
  379       -x0/4 + x1/4 + x2/4 - x3/4 - x6/2 + x8/2,
 
  380       x0/4 - x1/4 - x2/4 + x3/4 + x6/2 - x8/2,
 
  381       x0/2 + x1/2 + x2/2 + x3/2 - x5 - x7,
 
  382       -x0 - x1 - x2 - x3 + 2*x5 + 2*x7,
 
  383       x0/2 + x1/2 + x2/2 + x3/2 - x5 - x7,
 
  384       -x0/2 - x1/2 + x2/2 + x3/2 + x5 - x7,
 
  385       x0/2 + x1/2 - x2/2 - x3/2 - x5 + x7
 
  393       x0/4 + x1/4 - x10 + x11 + x12 - x2/4 - x3/4 + 3*x5/2 - 3*x7/2 - x9,
 
  394       -x0/2 - x1/2 + 2*x10 - 2*x11 - 2*x12 + x2/2 + x3/2 - 3*x5/2 + 3*x7/2 + 2*x9,
 
  395       x0/4 + x1/4 - x10 + x11 + x12 - x2/4 - x3/4 + x5/2 - x7/2 - x9,
 
  396       x0/2 + x1/2 + x2/2 + x3/2 - x6 - x8,
 
  397       -x0 - x1 - x2 - x3 + 2*x6 + 2*x8,
 
  398       x0/2 + x1/2 + x2/2 + x3/2 - x6 - x8,
 
  399       x0/4 - x1/4 + x2/4 - x3/4,
 
  400       -3*x0/4 + 3*x1/4 - x10 + x11 - x12 - 3*x2/4 + 3*x3/4 + x9,
 
  401       x0/2 - x1/2 + x10 - x11 + x12 + x2/2 - x3/2 - x9,
 
  402       -x0/2 + x1/2 + x2/2 - x3/2 - x6 + x8,
 
  403       x0/2 - x1/2 - x2/2 + x3/2 + x6 - x8,
 
  404       -x0/4 - x1/4 + x2/4 + x3/4 + x5/2 - x7/2,
 
  405       x0/4 + x1/4 - x2/4 - x3/4 - x5/2 + x7/2
 
  412       x0/4 + x1/4 + x10 + x11 + x12 + x2/4 + x3/4 - x4 - x5 - x6 - x7 - x8 + x9,
 
  413       -3*x0/4 - 3*x1/4 - 5*x10 - 5*x11 - 5*x12 - 3*x2/4 - 3*x3/4 + 7*x4 + 4*x5 + 4*x6 + 4*x7 + 4*x8 - 5*x9,
 
  414       3*x0/4 + 3*x1/4 + 9*x10 + 9*x11 + 9*x12 + 3*x2/4 + 3*x3/4 - 15*x4 - 6*x5 - 6*x6 - 6*x7 - 6*x8 + 9*x9,
 
  415       -x0/4 - x1/4 - 7*x10 - 7*x11 - 7*x12 - x2/4 - x3/4 + 13*x4 + 4*x5 + 4*x6 + 4*x7 + 4*x8 - 7*x9,
 
  416       2*x10 + 2*x11 + 2*x12 - 4*x4 - x5 - x6 - x7 - x8 + 2*x9,
 
  417       x0/4 + x1/4 - x10 + x11 + x12 - x2/4 - x3/4 + x5/2 - x7/2 - x9,
 
  418       -3*x0/4 - 3*x1/4 + 3*x10 - 3*x11 - 3*x12 + 3*x2/4 + 3*x3/4 - 3*x5/2 + 3*x7/2 + 3*x9,
 
  419       3*x0/4 + 3*x1/4 - 3*x10 + 3*x11 + 3*x12 - 3*x2/4 - 3*x3/4 + 3*x5/2 - 3*x7/2 - 3*x9,
 
  420       -x0/4 - x1/4 + x10 - x11 - x12 + x2/4 + x3/4 - x5/2 + x7/2 + x9,
 
  421       x0/4 - x1/4 + x10 + x11 - x12 - x2/4 + x3/4 - x6/2 + x8/2 - x9,
 
  422       -3*x0/4 + 3*x1/4 - 3*x10 - 3*x11 + 3*x12 + 3*x2/4 - 3*x3/4 + 3*x6/2 - 3*x8/2 + 3*x9,
 
  423       3*x0/4 - 3*x1/4 + 3*x10 + 3*x11 - 3*x12 - 3*x2/4 + 3*x3/4 - 3*x6/2 + 3*x8/2 - 3*x9,
 
  424       -x0/4 + x1/4 - x10 - x11 + x12 + x2/4 - x3/4 + x6/2 - x8/2 + x9,
 
  425       -x0/4 + x1/4 - x10 + x11 - x12 - x2/4 + x3/4 + x9,
 
  426       x0/4 - x1/4 + x10 - x11 + x12 + x2/4 - x3/4 - x9,
 
  427       -x0/4 + x1/4 + x2/4 - x3/4 - x6/2 + x8/2,
 
  428       x0/4 - x1/4 - x2/4 + x3/4 + x6/2 - x8/2,
 
  429       -x0/4 - x1/4 + x2/4 + x3/4 + x5/2 - x7/2,
 
  430       x0/4 + x1/4 - x2/4 - x3/4 - x5/2 + x7/2
 
  434   static const int dx_dxi_exponents[14][3] =
 
  453   static const int dx_deta_exponents[14][3] =
 
  472   static const int dx_dzeta_exponents[19][3] =
 
  501     a1 = 
Real(-7.1805574131988893873307823958101e-01L),
 
  502     a2 = 
Real(-5.0580870785392503961340276902425e-01L),
 
  503     a3 = 
Real(-2.2850430565396735359574351631314e-01L),
 
  505     b1 = 
Real( 7.2994024073149732155837979012003e-02L),
 
  506     b2 = 
Real( 3.4700376603835188472176354340395e-01L),
 
  507     b3 = 
Real( 7.0500220988849838312239847758405e-01L),
 
  510     w1 = 
Real( 4.8498876871878584357513834016440e-02L),
 
  511     w2 = 
Real( 4.5137737425884574692441981593901e-02L),
 
  512     w3 = 
Real( 9.2440441384508327195915094925393e-03L),
 
  513     w4 = 
Real( 7.7598202995005734972022134426305e-02L),
 
  514     w5 = 
Real( 7.2220379881415319507907170550242e-02L),
 
  515     w6 = 
Real( 1.4790470621521332351346415188063e-02L),
 
  516     w7 = 
Real( 1.2415712479200917595523541508209e-01L),
 
  517     w8 = 
Real( 1.1555260781026451121265147288039e-01L),
 
  518     w9 = 
Real( 2.3664752994434131762154264300901e-02L);
 
  521   static const Real xi[N][3] =
 
  552   static const Real eta[N][3] =
 
  583   static const Real zeta[N][5] =
 
  585       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  586       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  587       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  588       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  589       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  590       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  591       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  592       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  593       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  594       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  595       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  596       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  597       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  598       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  599       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  600       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  601       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  602       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  603       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  604       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  605       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  606       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  607       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  608       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3},
 
  609       { 1., b1, b1*b1, b1*b1*b1, b1*b1*b1*b1},
 
  610       { 1., b2, b2*b2, b2*b2*b2, b2*b2*b2*b2},
 
  611       { 1., b3, b3*b3, b3*b3*b3, b3*b3*b3*b3}
 
  614   static const Real w[N] = {w1, w2, w3, w4, w5, w6, 
 
  615                             w1, w2, w3, w4, w5, w6, 
 
  616                             w7, w8, w9, w4, w5, w6, 
 
  617                             w1, w2, w3, w4, w5, w6, 
 
  621   for (
int q=0; q<N; ++q)
 
  625         den2 = (1. - zeta[q][1])*(1. - zeta[q][1]),
 
  626         den3 = den2*(1. - zeta[q][1]);
 
  629       Point dx_dxi_q, dx_deta_q;
 
  630       for (
int c=0; c<14; ++c)
 
  633             xi[q][dx_dxi_exponents[c][0]]*
 
  634             eta[q][dx_dxi_exponents[c][1]]*
 
  635             zeta[q][dx_dxi_exponents[c][2]]*dx_dxi[c];
 
  638             xi[q][dx_deta_exponents[c][0]]*
 
  639             eta[q][dx_deta_exponents[c][1]]*
 
  640             zeta[q][dx_deta_exponents[c][2]]*dx_deta[c];
 
  645       for (
int c=0; c<19; ++c)
 
  648             xi[q][dx_dzeta_exponents[c][0]]*
 
  649             eta[q][dx_dzeta_exponents[c][1]]*
 
  650             zeta[q][dx_dzeta_exponents[c][2]]*dx_dzeta[c];