20 #include "libmesh/fe.h" 
   21 #include "libmesh/elem.h" 
   22 #include "libmesh/fe_lagrange_shape_1D.h" 
   42 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
   44 Real fe_lagrange_3D_shape_second_deriv(
const ElemType type,
 
   50 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES 
   63   return fe_lagrange_3D_shape(type, order, i, p);
 
   74   return fe_lagrange_3D_shape(type, order, i, p);
 
   84                            const bool add_p_level)
 
   89   return fe_lagrange_3D_shape(elem->
type(), static_cast<Order>(order + add_p_level * elem->
p_level()), i, p);
 
   99                               const bool add_p_level)
 
  104   return fe_lagrange_3D_shape(elem->
type(), static_cast<Order>(order + add_p_level * elem->
p_level()), i, p);
 
  112                                  const unsigned int i,
 
  113                                  const unsigned int j,
 
  116   return fe_lagrange_3D_shape_deriv(type, order, i, j, p);
 
  124                                     const unsigned int i,
 
  125                                     const unsigned int j,
 
  128   return fe_lagrange_3D_shape_deriv(type, order, i, j, p);
 
  136                                  const unsigned int i,
 
  137                                  const unsigned int j,
 
  139                                  const bool add_p_level)
 
  144   return fe_lagrange_3D_shape_deriv(elem->
type(), static_cast<Order>(order + add_p_level * elem->
p_level()), i, j, p);
 
  151                                     const unsigned int i,
 
  152                                     const unsigned int j,
 
  154                                     const bool add_p_level)
 
  159   return fe_lagrange_3D_shape_deriv(elem->
type(), static_cast<Order>(order + add_p_level * elem->
p_level()), i, j, p);
 
  164 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
  169                                         const unsigned int i,
 
  170                                         const unsigned int j,
 
  173   return fe_lagrange_3D_shape_second_deriv(type, order, i, j, p);
 
  181                                            const unsigned int i,
 
  182                                            const unsigned int j,
 
  185   return fe_lagrange_3D_shape_second_deriv(type, order, i, j, p);
 
  193                                         const unsigned int i,
 
  194                                         const unsigned int j,
 
  196                                         const bool add_p_level)
 
  201   return fe_lagrange_3D_shape_second_deriv
 
  202     (elem->
type(), static_cast<Order>(order + add_p_level * elem->
p_level()), i, j, p);
 
  210                                            const unsigned int i,
 
  211                                            const unsigned int j,
 
  213                                            const bool add_p_level)
 
  218   return fe_lagrange_3D_shape_second_deriv
 
  219     (elem->
type(), static_cast<Order>(order + add_p_level * elem->
p_level()), i, j, p);
 
  222 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES 
  234                           const unsigned int i,
 
  251               libmesh_assert_less (i, 8);
 
  254               const Real xi   = p(0);
 
  255               const Real eta  = p(1);
 
  256               const Real zeta = p(2);
 
  259               static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0};
 
  260               static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1};
 
  261               static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1};
 
  272               libmesh_assert_less (i, 4);
 
  275               const Real zeta1 = p(0);
 
  276               const Real zeta2 = p(1);
 
  277               const Real zeta3 = p(2);
 
  278               const Real zeta0 = 1. - zeta1 - zeta2 - zeta3;
 
  295                   libmesh_error_msg(
"Invalid i = " << i);
 
  304               libmesh_assert_less (i, 6);
 
  309               Point p2d(p(0),p(1));
 
  313               static const unsigned int i0[] = {0, 0, 0, 1, 1, 1};
 
  314               static const unsigned int i1[] = {0, 1, 2, 0, 1, 2};
 
  325               libmesh_assert_less (i, 5);
 
  327               const Real xi   = p(0);
 
  328               const Real eta  = p(1);
 
  329               const Real zeta = p(2);
 
  330               const Real eps  = 1.e-35;
 
  335                   return .25*(zeta + xi - 1.)*(zeta + eta - 1.)/((1. - zeta) + eps);
 
  338                   return .25*(zeta - xi - 1.)*(zeta + eta - 1.)/((1. - zeta) + eps);
 
  341                   return .25*(zeta - xi - 1.)*(zeta - eta - 1.)/((1. - zeta) + eps);
 
  344                   return .25*(zeta + xi - 1.)*(zeta - eta - 1.)/((1. - zeta) + eps);
 
  350                   libmesh_error_msg(
"Invalid i = " << i);
 
  356             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << type);
 
  370               libmesh_assert_less (i, 20);
 
  372               const Real xi   = p(0);
 
  373               const Real eta  = p(1);
 
  374               const Real zeta = p(2);
 
  378               const Real x = .5*(xi   + 1.);
 
  379               const Real y = .5*(eta  + 1.);
 
  380               const Real z = .5*(zeta + 1.);
 
  385                   return (1. - x)*(1. - y)*(1. - z)*(1. - 2.*x - 2.*y - 2.*z);
 
  388                   return x*(1. - y)*(1. - z)*(2.*x - 2.*y - 2.*z - 1.);
 
  391                   return x*y*(1. - z)*(2.*x + 2.*y - 2.*z - 3.);
 
  394                   return (1. - x)*y*(1. - z)*(2.*y - 2.*x - 2.*z - 1.);
 
  397                   return (1. - x)*(1. - y)*z*(2.*z - 2.*x - 2.*y - 1.);
 
  400                   return x*(1. - y)*z*(2.*x - 2.*y + 2.*z - 3.);
 
  403                   return x*y*z*(2.*x + 2.*y + 2.*z - 5.);
 
  406                   return (1. - x)*y*z*(2.*y - 2.*x + 2.*z - 3.);
 
  409                   return 4.*x*(1. - x)*(1. - y)*(1. - z);
 
  412                   return 4.*x*y*(1. - y)*(1. - z);
 
  415                   return 4.*x*(1. - x)*y*(1. - z);
 
  418                   return 4.*(1. - x)*y*(1. - y)*(1. - z);
 
  421                   return 4.*(1. - x)*(1. - y)*z*(1. - z);
 
  424                   return 4.*x*(1. - y)*z*(1. - z);
 
  427                   return 4.*x*y*z*(1. - z);
 
  430                   return 4.*(1. - x)*y*z*(1. - z);
 
  433                   return 4.*x*(1. - x)*(1. - y)*z;
 
  436                   return 4.*x*y*(1. - y)*z;
 
  439                   return 4.*x*(1. - x)*y*z;
 
  442                   return 4.*(1. - x)*y*(1. - y)*z;
 
  445                   libmesh_error_msg(
"Invalid i = " << i);
 
  452               libmesh_assert_less (i, 27);
 
  455               const Real xi   = p(0);
 
  456               const Real eta  = p(1);
 
  457               const Real zeta = p(2);
 
  463               static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 0, 2, 2, 1, 2, 0, 2, 2};
 
  464               static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 2, 0, 2, 1, 2, 2, 2};
 
  465               static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1, 2};
 
  475               libmesh_assert_less (i, 10);
 
  478               const Real zeta1 = p(0);
 
  479               const Real zeta2 = p(1);
 
  480               const Real zeta3 = p(2);
 
  481               const Real zeta0 = 1. - zeta1 - zeta2 - zeta3;
 
  486                   return zeta0*(2.*zeta0 - 1.);
 
  489                   return zeta1*(2.*zeta1 - 1.);
 
  492                   return zeta2*(2.*zeta2 - 1.);
 
  495                   return zeta3*(2.*zeta3 - 1.);
 
  498                   return 4.*zeta0*zeta1;
 
  501                   return 4.*zeta1*zeta2;
 
  504                   return 4.*zeta2*zeta0;
 
  507                   return 4.*zeta0*zeta3;
 
  510                   return 4.*zeta1*zeta3;
 
  513                   return 4.*zeta2*zeta3;
 
  516                   libmesh_error_msg(
"Invalid i = " << i);
 
  523               libmesh_assert_less (i, 15);
 
  525               const Real xi   = p(0);
 
  526               const Real eta  = p(1);
 
  527               const Real zeta = p(2);
 
  532                   return (1. - zeta)*(xi + eta - 1.)*(xi + eta + 0.5*zeta);
 
  535                   return (1. - zeta)*xi*(xi - 1. - 0.5*zeta);
 
  538                   return (1. - zeta)*eta*(eta - 1. - 0.5*zeta);
 
  541                   return (1. + zeta)*(xi + eta - 1.)*(xi + eta - 0.5*zeta);
 
  544                   return (1. + zeta)*xi*(xi - 1. + 0.5*zeta);
 
  547                   return (1. + zeta)*eta*(eta - 1. + 0.5*zeta);
 
  550                   return 2.*(1. - zeta)*xi*(1. - xi - eta);
 
  553                   return 2.*(1. - zeta)*xi*eta;
 
  556                   return 2.*(1. - zeta)*eta*(1. - xi - eta);
 
  559                   return (1. - zeta)*(1. + zeta)*(1. - xi - eta);
 
  562                   return (1. - zeta)*(1. + zeta)*xi;
 
  565                   return (1. - zeta)*(1. + zeta)*eta;
 
  568                   return 2.*(1. + zeta)*xi*(1. - xi - eta);
 
  571                   return 2.*(1. + zeta)*xi*eta;
 
  574                   return 2.*(1. + zeta)*eta*(1. - xi - eta);
 
  577                   libmesh_error_msg(
"Invalid i = " << i);
 
  584               libmesh_assert_less (i, 18);
 
  589               Point p2d(p(0),p(1));
 
  593               static const unsigned int i0[] = {0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2, 1, 1, 1, 2, 2, 2};
 
  594               static const unsigned int i1[] = {0, 1, 2, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 3, 4, 5};
 
  605               libmesh_assert_less (i, 13);
 
  607               const Real xi   = p(0);
 
  608               const Real eta  = p(1);
 
  609               const Real zeta = p(2);
 
  610               const Real eps  = 1.e-35;
 
  614               Real den = (1. - zeta + eps);
 
  619                   return 0.25*(-xi - eta - 1.)*((1. - xi)*(1. - eta) - zeta + xi*eta*zeta/den);
 
  622                   return 0.25*(-eta + xi - 1.)*((1. + xi)*(1. - eta) - zeta - xi*eta*zeta/den);
 
  625                   return 0.25*(xi + eta - 1.)*((1. + xi)*(1. + eta) - zeta + xi*eta*zeta/den);
 
  628                   return 0.25*(eta - xi - 1.)*((1. - xi)*(1. + eta) - zeta - xi*eta*zeta/den);
 
  631                   return zeta*(2.*zeta - 1.);
 
  634                   return 0.5*(1. + xi - zeta)*(1. - xi - zeta)*(1. - eta - zeta)/den;
 
  637                   return 0.5*(1. + eta - zeta)*(1. - eta - zeta)*(1. + xi - zeta)/den;
 
  640                   return 0.5*(1. + xi - zeta)*(1. - xi - zeta)*(1. + eta - zeta)/den;
 
  643                   return 0.5*(1. + eta - zeta)*(1. - eta - zeta)*(1. - xi - zeta)/den;
 
  646                   return zeta*(1. - xi - zeta)*(1. - eta - zeta)/den;
 
  649                   return zeta*(1. + xi - zeta)*(1. - eta - zeta)/den;
 
  652                   return zeta*(1. + eta - zeta)*(1. + xi - zeta)/den;
 
  655                   return zeta*(1. - xi - zeta)*(1. + eta - zeta)/den;
 
  658                   libmesh_error_msg(
"Invalid i = " << i);
 
  667               libmesh_assert_less (i, 14);
 
  669               const Real xi   = p(0);
 
  670               const Real eta  = p(1);
 
  671               const Real zeta = p(2);
 
  672               const Real eps  = 1.e-35;
 
  677                 p1 = 0.5*(1. - eta - zeta), 
 
  678                 p2 = 0.5*(1. + xi  - zeta), 
 
  679                 p3 = 0.5*(1. + eta - zeta), 
 
  680                 p4 = 0.5*(1. - xi  - zeta); 
 
  685                 den = (-1. + zeta + eps),
 
  691                   return p4*p1*(xi*eta - zeta + zeta*zeta)/den2;
 
  694                   return -p1*p2*(xi*eta + zeta - zeta*zeta)/den2;
 
  697                   return p2*p3*(xi*eta - zeta + zeta*zeta)/den2;
 
  700                   return -p3*p4*(xi*eta + zeta - zeta*zeta)/den2;
 
  703                   return zeta*(2.*zeta - 1.);
 
  706                   return -4.*p2*p1*p4*eta/den2;
 
  709                   return 4.*p1*p2*p3*xi/den2;
 
  712                   return 4.*p2*p3*p4*eta/den2;
 
  715                   return -4.*p3*p4*p1*xi/den2;
 
  718                   return -4.*p1*p4*zeta/den;
 
  721                   return -4.*p2*p1*zeta/den;
 
  724                   return -4.*p3*p2*zeta/den;
 
  727                   return -4.*p4*p3*zeta/den;
 
  730                   return 16.*p1*p2*p3*p4/den2;
 
  733                   libmesh_error_msg(
"Invalid i = " << i);
 
  739             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << type);
 
  746       libmesh_error_msg(
"ERROR: Unsupported 3D FE order!: " << order);
 
  749 #else // LIBMESH_DIM != 3 
  751   libmesh_not_implemented();
 
  759                                 const unsigned int i,
 
  760                                 const unsigned int j,
 
  765   libmesh_assert_less (j, 3);
 
  779               libmesh_assert_less (i, 8);
 
  782               const Real xi   = p(0);
 
  783               const Real eta  = p(1);
 
  784               const Real zeta = p(2);
 
  786               static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0};
 
  787               static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1};
 
  788               static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1};
 
  808                   libmesh_error_msg(
"Invalid j = " << j);
 
  816               libmesh_assert_less (i, 4);
 
  819               const Real dzeta0dxi = -1.;
 
  820               const Real dzeta1dxi =  1.;
 
  821               const Real dzeta2dxi =  0.;
 
  822               const Real dzeta3dxi =  0.;
 
  824               const Real dzeta0deta = -1.;
 
  825               const Real dzeta1deta =  0.;
 
  826               const Real dzeta2deta =  1.;
 
  827               const Real dzeta3deta =  0.;
 
  829               const Real dzeta0dzeta = -1.;
 
  830               const Real dzeta1dzeta =  0.;
 
  831               const Real dzeta2dzeta =  0.;
 
  832               const Real dzeta3dzeta =  1.;
 
  854                         libmesh_error_msg(
"Invalid i = " << i);
 
  876                         libmesh_error_msg(
"Invalid i = " << i);
 
  898                         libmesh_error_msg(
"Invalid i = " << i);
 
  903                   libmesh_error_msg(
"Invalid shape function derivative j = " << j);
 
  912               libmesh_assert_less (i, 6);
 
  917               Point p2d(p(0),p(1));
 
  921               static const unsigned int i0[] = {0, 0, 0, 1, 1, 1};
 
  922               static const unsigned int i1[] = {0, 1, 2, 0, 1, 2};
 
  942                   libmesh_error_msg(
"Invalid shape function derivative j = " << j);
 
  951               libmesh_assert_less (i, 5);
 
  953               const Real xi   = p(0);
 
  954               const Real eta  = p(1);
 
  955               const Real zeta = p(2);
 
  956               const Real eps  = 1.e-35;
 
  965                       return  .25*(zeta + eta - 1.)/((1. - zeta) + eps);
 
  968                       return -.25*(zeta + eta - 1.)/((1. - zeta) + eps);
 
  971                       return -.25*(zeta - eta - 1.)/((1. - zeta) + eps);
 
  974                       return  .25*(zeta - eta - 1.)/((1. - zeta) + eps);
 
  980                       libmesh_error_msg(
"Invalid i = " << i);
 
  989                       return  .25*(zeta + xi - 1.)/((1. - zeta) + eps);
 
  992                       return  .25*(zeta - xi - 1.)/((1. - zeta) + eps);
 
  995                       return -.25*(zeta - xi - 1.)/((1. - zeta) + eps);
 
  998                       return -.25*(zeta + xi - 1.)/((1. - zeta) + eps);
 
 1004                       libmesh_error_msg(
"Invalid i = " << i);
 
 1014                       num = zeta*(2. - zeta) - 1.,
 
 1015                       den = (1. - zeta + eps)*(1. - zeta + eps);
 
 1021                         return .25*(num + xi*eta)/den;
 
 1025                         return .25*(num - xi*eta)/den;
 
 1031                         libmesh_error_msg(
"Invalid i = " << i);
 
 1036                   libmesh_error_msg(
"Invalid j = " << j);
 
 1042             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << type);
 
 1056               libmesh_assert_less (i, 20);
 
 1058               const Real xi   = p(0);
 
 1059               const Real eta  = p(1);
 
 1060               const Real zeta = p(2);
 
 1064               const Real x = .5*(xi   + 1.);
 
 1065               const Real y = .5*(eta  + 1.);
 
 1066               const Real z = .5*(zeta + 1.);
 
 1078                       return .5*(1. - y)*(1. - z)*((1. - x)*(-2.) +
 
 1079                                                    (-1.)*(1. - 2.*x - 2.*y - 2.*z));
 
 1082                       return .5*(1. - y)*(1. - z)*(x*(2.) +
 
 1083                                                    (1.)*(2.*x - 2.*y - 2.*z - 1.));
 
 1086                       return .5*y*(1. - z)*(x*(2.) +
 
 1087                                             (1.)*(2.*x + 2.*y - 2.*z - 3.));
 
 1090                       return .5*y*(1. - z)*((1. - x)*(-2.) +
 
 1091                                             (-1.)*(2.*y - 2.*x - 2.*z - 1.));
 
 1094                       return .5*(1. - y)*z*((1. - x)*(-2.) +
 
 1095                                             (-1.)*(2.*z - 2.*x - 2.*y - 1.));
 
 1098                       return .5*(1. - y)*z*(x*(2.) +
 
 1099                                             (1.)*(2.*x - 2.*y + 2.*z - 3.));
 
 1102                       return .5*y*z*(x*(2.) +
 
 1103                                      (1.)*(2.*x + 2.*y + 2.*z - 5.));
 
 1106                       return .5*y*z*((1. - x)*(-2.) +
 
 1107                                      (-1.)*(2.*y - 2.*x + 2.*z - 3.));
 
 1110                       return 2.*(1. - y)*(1. - z)*(1. - 2.*x);
 
 1113                       return 2.*y*(1. - y)*(1. - z);
 
 1116                       return 2.*y*(1. - z)*(1. - 2.*x);
 
 1119                       return 2.*y*(1. - y)*(1. - z)*(-1.);
 
 1122                       return 2.*(1. - y)*z*(1. - z)*(-1.);
 
 1125                       return 2.*(1. - y)*z*(1. - z);
 
 1128                       return 2.*y*z*(1. - z);
 
 1131                       return 2.*y*z*(1. - z)*(-1.);
 
 1134                       return 2.*(1. - y)*z*(1. - 2.*x);
 
 1137                       return 2.*y*(1. - y)*z;
 
 1140                       return 2.*y*z*(1. - 2.*x);
 
 1143                       return 2.*y*(1. - y)*z*(-1.);
 
 1146                       libmesh_error_msg(
"Invalid i = " << i);
 
 1155                       return .5*(1. - x)*(1. - z)*((1. - y)*(-2.) +
 
 1156                                                    (-1.)*(1. - 2.*x - 2.*y - 2.*z));
 
 1159                       return .5*x*(1. - z)*((1. - y)*(-2.) +
 
 1160                                             (-1.)*(2.*x - 2.*y - 2.*z - 1.));
 
 1163                       return .5*x*(1. - z)*(y*(2.) +
 
 1164                                             (1.)*(2.*x + 2.*y - 2.*z - 3.));
 
 1167                       return .5*(1. - x)*(1. - z)*(y*(2.) +
 
 1168                                                    (1.)*(2.*y - 2.*x - 2.*z - 1.));
 
 1171                       return .5*(1. - x)*z*((1. - y)*(-2.) +
 
 1172                                             (-1.)*(2.*z - 2.*x - 2.*y - 1.));
 
 1175                       return .5*x*z*((1. - y)*(-2.) +
 
 1176                                      (-1.)*(2.*x - 2.*y + 2.*z - 3.));
 
 1179                       return .5*x*z*(y*(2.) +
 
 1180                                      (1.)*(2.*x + 2.*y + 2.*z - 5.));
 
 1183                       return .5*(1. - x)*z*(y*(2.) +
 
 1184                                             (1.)*(2.*y - 2.*x + 2.*z - 3.));
 
 1187                       return 2.*x*(1. - x)*(1. - z)*(-1.);
 
 1190                       return 2.*x*(1. - z)*(1. - 2.*y);
 
 1193                       return 2.*x*(1. - x)*(1. - z);
 
 1196                       return 2.*(1. - x)*(1. - z)*(1. - 2.*y);
 
 1199                       return 2.*(1. - x)*z*(1. - z)*(-1.);
 
 1202                       return 2.*x*z*(1. - z)*(-1.);
 
 1205                       return 2.*x*z*(1. - z);
 
 1208                       return 2.*(1. - x)*z*(1. - z);
 
 1211                       return 2.*x*(1. - x)*z*(-1.);
 
 1214                       return 2.*x*z*(1. - 2.*y);
 
 1217                       return 2.*x*(1. - x)*z;
 
 1220                       return 2.*(1. - x)*z*(1. - 2.*y);
 
 1223                       libmesh_error_msg(
"Invalid i = " << i);
 
 1232                       return .5*(1. - x)*(1. - y)*((1. - z)*(-2.) +
 
 1233                                                    (-1.)*(1. - 2.*x - 2.*y - 2.*z));
 
 1236                       return .5*x*(1. - y)*((1. - z)*(-2.) +
 
 1237                                             (-1.)*(2.*x - 2.*y - 2.*z - 1.));
 
 1240                       return .5*x*y*((1. - z)*(-2.) +
 
 1241                                      (-1.)*(2.*x + 2.*y - 2.*z - 3.));
 
 1244                       return .5*(1. - x)*y*((1. - z)*(-2.) +
 
 1245                                             (-1.)*(2.*y - 2.*x - 2.*z - 1.));
 
 1248                       return .5*(1. - x)*(1. - y)*(z*(2.) +
 
 1249                                                    (1.)*(2.*z - 2.*x - 2.*y - 1.));
 
 1252                       return .5*x*(1. - y)*(z*(2.) +
 
 1253                                             (1.)*(2.*x - 2.*y + 2.*z - 3.));
 
 1256                       return .5*x*y*(z*(2.) +
 
 1257                                      (1.)*(2.*x + 2.*y + 2.*z - 5.));
 
 1260                       return .5*(1. - x)*y*(z*(2.) +
 
 1261                                             (1.)*(2.*y - 2.*x + 2.*z - 3.));
 
 1264                       return 2.*x*(1. - x)*(1. - y)*(-1.);
 
 1267                       return 2.*x*y*(1. - y)*(-1.);
 
 1270                       return 2.*x*(1. - x)*y*(-1.);
 
 1273                       return 2.*(1. - x)*y*(1. - y)*(-1.);
 
 1276                       return 2.*(1. - x)*(1. - y)*(1. - 2.*z);
 
 1279                       return 2.*x*(1. - y)*(1. - 2.*z);
 
 1282                       return 2.*x*y*(1. - 2.*z);
 
 1285                       return 2.*(1. - x)*y*(1. - 2.*z);
 
 1288                       return 2.*x*(1. - x)*(1. - y);
 
 1291                       return 2.*x*y*(1. - y);
 
 1294                       return 2.*x*(1. - x)*y;
 
 1297                       return 2.*(1. - x)*y*(1. - y);
 
 1300                       libmesh_error_msg(
"Invalid i = " << i);
 
 1304                   libmesh_error_msg(
"Invalid shape function derivative j = " << j);
 
 1311               libmesh_assert_less (i, 27);
 
 1314               const Real xi   = p(0);
 
 1315               const Real eta  = p(1);
 
 1316               const Real zeta = p(2);
 
 1322               static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 0, 2, 2, 1, 2, 0, 2, 2};
 
 1323               static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 2, 0, 2, 1, 2, 2, 2};
 
 1324               static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1, 2};
 
 1344                   libmesh_error_msg(
"Invalid j = " << j);
 
 1351               libmesh_assert_less (i, 10);
 
 1354               const Real zeta1 = p(0);
 
 1355               const Real zeta2 = p(1);
 
 1356               const Real zeta3 = p(2);
 
 1357               const Real zeta0 = 1. - zeta1 - zeta2 - zeta3;
 
 1359               const Real dzeta0dxi = -1.;
 
 1360               const Real dzeta1dxi =  1.;
 
 1361               const Real dzeta2dxi =  0.;
 
 1362               const Real dzeta3dxi =  0.;
 
 1364               const Real dzeta0deta = -1.;
 
 1365               const Real dzeta1deta =  0.;
 
 1366               const Real dzeta2deta =  1.;
 
 1367               const Real dzeta3deta =  0.;
 
 1369               const Real dzeta0dzeta = -1.;
 
 1370               const Real dzeta1dzeta =  0.;
 
 1371               const Real dzeta2dzeta =  0.;
 
 1372               const Real dzeta3dzeta =  1.;
 
 1382                         return (4.*zeta0 - 1.)*dzeta0dxi;
 
 1385                         return (4.*zeta1 - 1.)*dzeta1dxi;
 
 1388                         return (4.*zeta2 - 1.)*dzeta2dxi;
 
 1391                         return (4.*zeta3 - 1.)*dzeta3dxi;
 
 1394                         return 4.*(zeta0*dzeta1dxi + dzeta0dxi*zeta1);
 
 1397                         return 4.*(zeta1*dzeta2dxi + dzeta1dxi*zeta2);
 
 1400                         return 4.*(zeta0*dzeta2dxi + dzeta0dxi*zeta2);
 
 1403                         return 4.*(zeta0*dzeta3dxi + dzeta0dxi*zeta3);
 
 1406                         return 4.*(zeta1*dzeta3dxi + dzeta1dxi*zeta3);
 
 1409                         return 4.*(zeta2*dzeta3dxi + dzeta2dxi*zeta3);
 
 1412                         libmesh_error_msg(
"Invalid i = " << i);
 
 1422                         return (4.*zeta0 - 1.)*dzeta0deta;
 
 1425                         return (4.*zeta1 - 1.)*dzeta1deta;
 
 1428                         return (4.*zeta2 - 1.)*dzeta2deta;
 
 1431                         return (4.*zeta3 - 1.)*dzeta3deta;
 
 1434                         return 4.*(zeta0*dzeta1deta + dzeta0deta*zeta1);
 
 1437                         return 4.*(zeta1*dzeta2deta + dzeta1deta*zeta2);
 
 1440                         return 4.*(zeta0*dzeta2deta + dzeta0deta*zeta2);
 
 1443                         return 4.*(zeta0*dzeta3deta + dzeta0deta*zeta3);
 
 1446                         return 4.*(zeta1*dzeta3deta + dzeta1deta*zeta3);
 
 1449                         return 4.*(zeta2*dzeta3deta + dzeta2deta*zeta3);
 
 1452                         libmesh_error_msg(
"Invalid i = " << i);
 
 1462                         return (4.*zeta0 - 1.)*dzeta0dzeta;
 
 1465                         return (4.*zeta1 - 1.)*dzeta1dzeta;
 
 1468                         return (4.*zeta2 - 1.)*dzeta2dzeta;
 
 1471                         return (4.*zeta3 - 1.)*dzeta3dzeta;
 
 1474                         return 4.*(zeta0*dzeta1dzeta + dzeta0dzeta*zeta1);
 
 1477                         return 4.*(zeta1*dzeta2dzeta + dzeta1dzeta*zeta2);
 
 1480                         return 4.*(zeta0*dzeta2dzeta + dzeta0dzeta*zeta2);
 
 1483                         return 4.*(zeta0*dzeta3dzeta + dzeta0dzeta*zeta3);
 
 1486                         return 4.*(zeta1*dzeta3dzeta + dzeta1dzeta*zeta3);
 
 1489                         return 4.*(zeta2*dzeta3dzeta + dzeta2dzeta*zeta3);
 
 1492                         libmesh_error_msg(
"Invalid i = " << i);
 
 1497                   libmesh_error_msg(
"Invalid j = " << j);
 
 1505               libmesh_assert_less (i, 15);
 
 1507               const Real xi   = p(0);
 
 1508               const Real eta  = p(1);
 
 1509               const Real zeta = p(2);
 
 1519                         return (2.*xi + 2.*eta + 0.5*zeta - 1.)*(1. - zeta);
 
 1521                         return (2.*xi - 1. - 0.5*zeta)*(1. - zeta);
 
 1525                         return (2.*xi + 2.*eta - 0.5*zeta - 1.)*(1. + zeta);
 
 1527                         return (2.*xi - 1. + 0.5*zeta)*(1. + zeta);
 
 1531                         return (4.*xi + 2.*eta - 2.)*(zeta - 1.);
 
 1533                         return -2.*(zeta - 1.)*eta;
 
 1535                         return 2.*(zeta - 1.)*eta;
 
 1537                         return (zeta - 1.)*(1. + zeta);
 
 1539                         return (1. - zeta)*(1. + zeta);
 
 1543                         return (-4.*xi - 2.*eta + 2.)*(1. + zeta);
 
 1545                         return 2.*(1. + zeta)*eta;
 
 1547                         return -2.*(1. + zeta)*eta;
 
 1549                         libmesh_error_msg(
"Invalid i = " << i);
 
 1559                         return (2.*xi + 2.*eta + 0.5*zeta - 1.)*(1. - zeta);
 
 1563                         return (2.*eta - 1. - 0.5*zeta)*(1. - zeta);
 
 1565                         return (2.*xi + 2.*eta - 0.5*zeta - 1.)*(1. + zeta);
 
 1569                         return (2.*eta - 1. + 0.5*zeta)*(1. + zeta);
 
 1571                         return 2.*(zeta - 1.)*xi;
 
 1573                         return 2.*(1. - zeta)*xi;
 
 1575                         return (2.*xi + 4.*eta - 2.)*(zeta - 1.);
 
 1577                         return (zeta - 1.)*(1. + zeta);
 
 1581                         return (1. - zeta)*(1. + zeta);
 
 1583                         return -2.*(1. + zeta)*xi;
 
 1585                         return 2.*(1. + zeta)*xi;
 
 1587                         return (-2.*xi - 4.*eta + 2.)*(1. + zeta);
 
 1590                         libmesh_error_msg(
"Invalid i = " << i);
 
 1600                         return (-xi - eta - zeta + 0.5)*(xi + eta - 1.);
 
 1602                         return -0.5*xi*(2.*xi - 1. - 2.*zeta);
 
 1604                         return -0.5*eta*(2.*eta - 1. - 2.*zeta);
 
 1606                         return (xi + eta - zeta - 0.5)*(xi + eta - 1.);
 
 1608                         return 0.5*xi*(2.*xi - 1. + 2.*zeta);
 
 1610                         return 0.5*eta*(2.*eta - 1. + 2.*zeta);
 
 1612                         return 2.*xi*(xi + eta - 1.);
 
 1616                         return 2.*eta*(xi + eta - 1.);
 
 1618                         return 2.*zeta*(xi + eta - 1.);
 
 1622                         return -2.*eta*zeta;
 
 1624                         return 2.*xi*(1. - xi - eta);
 
 1628                         return 2.*eta*(1. - xi - eta);
 
 1631                         libmesh_error_msg(
"Invalid i = " << i);
 
 1636                   libmesh_error_msg(
"Invalid j = " << j);
 
 1645               libmesh_assert_less (i, 18);
 
 1650               Point p2d(p(0),p(1));
 
 1654               static const unsigned int i0[] = {0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2, 1, 1, 1, 2, 2, 2};
 
 1655               static const unsigned int i1[] = {0, 1, 2, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 3, 4, 5};
 
 1675                   libmesh_error_msg(
"Invalid shape function derivative j = " << j);
 
 1684               libmesh_assert_less (i, 13);
 
 1686               const Real xi   = p(0);
 
 1687               const Real eta  = p(1);
 
 1688               const Real zeta = p(2);
 
 1689               const Real eps  = 1.e-35;
 
 1694                 den = (-1. + zeta + eps),
 
 1708                       return 0.25*(-zeta - eta + 2.*eta*zeta - 2.*xi + 2.*zeta*xi + 2.*eta*xi + zeta2 + eta2)/den;
 
 1711                       return -0.25*(-zeta - eta + 2.*eta*zeta + 2.*xi - 2.*zeta*xi - 2.*eta*xi + zeta2 + eta2)/den;
 
 1714                       return -0.25*(-zeta + eta - 2.*eta*zeta + 2.*xi - 2.*zeta*xi + 2.*eta*xi + zeta2 + eta2)/den;
 
 1717                       return 0.25*(-zeta + eta - 2.*eta*zeta - 2.*xi + 2.*zeta*xi - 2.*eta*xi + zeta2 + eta2)/den;
 
 1723                       return -(-1. + eta + zeta)*xi/den;
 
 1726                       return 0.5*(-1. + eta + zeta)*(1. + eta - zeta)/den;
 
 1729                       return (1. + eta - zeta)*xi/den;
 
 1732                       return -0.5*(-1. + eta + zeta)*(1. + eta - zeta)/den;
 
 1735                       return -(-1. + eta + zeta)*zeta/den;
 
 1738                       return (-1. + eta + zeta)*zeta/den;
 
 1741                       return -(1. + eta - zeta)*zeta/den;
 
 1744                       return (1. + eta - zeta)*zeta/den;
 
 1747                       libmesh_error_msg(
"Invalid i = " << i);
 
 1755                       return 0.25*(-zeta - 2.*eta + 2.*eta*zeta - xi + 2.*zeta*xi + 2.*eta*xi + zeta2 + xi2)/den;
 
 1758                       return -0.25*(zeta + 2.*eta - 2.*eta*zeta - xi + 2.*zeta*xi + 2.*eta*xi - zeta2 - xi2)/den;
 
 1761                       return -0.25*(-zeta + 2.*eta - 2.*eta*zeta + xi - 2.*zeta*xi + 2.*eta*xi + zeta2 + xi2)/den;
 
 1764                       return 0.25*(zeta - 2.*eta + 2.*eta*zeta + xi - 2.*zeta*xi + 2.*eta*xi - zeta2 - xi2)/den;
 
 1770                       return -0.5*(-1. + xi + zeta)*(1. + xi - zeta)/den;
 
 1773                       return (1. + xi - zeta)*eta/den;
 
 1776                       return 0.5*(-1. + xi + zeta)*(1. + xi - zeta)/den;
 
 1779                       return -(-1. + xi + zeta)*eta/den;
 
 1782                       return -(-1. + xi + zeta)*zeta/den;
 
 1785                       return (1. + xi - zeta)*zeta/den;
 
 1788                       return -(1. + xi - zeta)*zeta/den;
 
 1791                       return (-1. + xi + zeta)*zeta/den;
 
 1794                       libmesh_error_msg(
"Invalid i = " << i);
 
 1803                         return -0.25*(xi + eta + 1.)*(-1. + 2.*zeta - zeta2 + eta*xi)/den2;
 
 1806                         return 0.25*(eta - xi + 1.)*(1. - 2.*zeta + zeta2 + eta*xi)/den2;
 
 1809                         return 0.25*(xi + eta - 1.)*(-1. + 2.*zeta - zeta2 + eta*xi)/den2;
 
 1812                         return -0.25*(eta - xi - 1.)*(1. - 2.*zeta + zeta2 + eta*xi)/den2;
 
 1815                         return 4.*zeta - 1.;
 
 1818                         return 0.5*(-2 + eta + 6.*zeta + eta*xi2 + eta*zeta2 - 6.*zeta2 + 2.*zeta3 - 2.*eta*zeta)/den2;
 
 1821                         return -0.5*(2 - 6.*zeta + xi + xi*zeta2 + eta2*xi + 6.*zeta2 - 2.*zeta3 - 2.*zeta*xi)/den2;
 
 1824                         return -0.5*(2 + eta - 6.*zeta + eta*xi2 + eta*zeta2 + 6.*zeta2 - 2.*zeta3 - 2.*eta*zeta)/den2;
 
 1827                         return 0.5*(-2 + 6.*zeta + xi + xi*zeta2 + eta2*xi - 6.*zeta2 + 2.*zeta3 - 2.*zeta*xi)/den2;
 
 1830                         return (1. - eta - 4.*zeta - xi - xi*zeta2 - eta*zeta2 + eta*xi + 5.*zeta2 - 2.*zeta3 + 2.*eta*zeta + 2.*zeta*xi)/den2;
 
 1833                         return -(-1. + eta + 4.*zeta - xi - xi*zeta2 + eta*zeta2 + eta*xi - 5.*zeta2 + 2.*zeta3 - 2.*eta*zeta + 2.*zeta*xi)/den2;
 
 1836                         return (1. + eta - 4.*zeta + xi + xi*zeta2 + eta*zeta2 + eta*xi + 5.*zeta2 - 2.*zeta3 - 2.*eta*zeta - 2.*zeta*xi)/den2;
 
 1839                         return -(-1. - eta + 4.*zeta + xi + xi*zeta2 - eta*zeta2 + eta*xi - 5.*zeta2 + 2.*zeta3 + 2.*eta*zeta - 2.*zeta*xi)/den2;
 
 1842                         libmesh_error_msg(
"Invalid i = " << i);
 
 1847                   libmesh_error_msg(
"Invalid j = " << j);
 
 1856               libmesh_assert_less (i, 14);
 
 1858               const Real xi   = p(0);
 
 1859               const Real eta  = p(1);
 
 1860               const Real zeta = p(2);
 
 1861               const Real eps  = 1.e-35;
 
 1866                 p1 = 0.5*(1. - eta - zeta), 
 
 1867                 p2 = 0.5*(1. + xi  - zeta), 
 
 1868                 p3 = 0.5*(1. + eta - zeta), 
 
 1869                 p4 = 0.5*(1. - xi  - zeta); 
 
 1874                 den = (-1. + zeta + eps),
 
 1885                       return 0.5*p1*(-xi*eta + zeta - zeta*zeta + 2.*p4*eta)/den2;
 
 1888                       return -0.5*p1*(xi*eta + zeta - zeta*zeta + 2.*p2*eta)/den2;
 
 1891                       return 0.5*p3*(xi*eta - zeta + zeta*zeta + 2.*p2*eta)/den2;
 
 1894                       return -0.5*p3*(-xi*eta - zeta + zeta*zeta + 2.*p4*eta)/den2;
 
 1900                       return 2.*p1*eta*xi/den2;
 
 1903                       return 2.*p1*p3*(xi + 2.*p2)/den2;
 
 1906                       return -2.*p3*eta*xi/den2;
 
 1909                       return -2.*p1*p3*(-xi + 2.*p4)/den2;
 
 1912                       return 2.*p1*zeta/den;
 
 1915                       return -2.*p1*zeta/den;
 
 1918                       return -2.*p3*zeta/den;
 
 1921                       return 2.*p3*zeta/den;
 
 1924                       return -8.*p1*p3*xi/den2;
 
 1927                       libmesh_error_msg(
"Invalid i = " << i);
 
 1935                       return -0.5*p4*(xi*eta - zeta + zeta*zeta - 2.*p1*xi)/den2;
 
 1938                       return 0.5*p2*(xi*eta + zeta - zeta*zeta - 2.*p1*xi)/den2;
 
 1941                       return 0.5*p2*(xi*eta - zeta + zeta*zeta + 2.*p3*xi)/den2;
 
 1944                       return -0.5*p4*(xi*eta + zeta - zeta*zeta + 2.*p3*xi)/den2;
 
 1950                       return 2.*p2*p4*(eta - 2.*p1)/den2;
 
 1953                       return -2.*p2*xi*eta/den2;
 
 1956                       return 2.*p2*p4*(eta + 2.*p3)/den2;
 
 1959                       return 2.*p4*xi*eta/den2;
 
 1962                       return 2.*p4*zeta/den;
 
 1965                       return 2.*p2*zeta/den;
 
 1968                       return -2.*p2*zeta/den;
 
 1971                       return -2.*p4*zeta/den;
 
 1974                       return -8.*p2*p4*eta/den2;
 
 1977                       libmesh_error_msg(
"Invalid i = " << i);
 
 1987                         return -0.5*p1*(xi*eta - zeta + zeta*zeta)/den2
 
 1988                           - 0.5*p4*(xi*eta - zeta + zeta*zeta)/den2
 
 1989                           + p4*p1*(2.*zeta - 1)/den2
 
 1990                           - 2.*p4*p1*(xi*eta - zeta + zeta*zeta)/den3;
 
 1993                         return 0.5*p2*(xi*eta + zeta - zeta*zeta)/den2
 
 1994                           + 0.5*p1*(xi*eta + zeta - zeta*zeta)/den2
 
 1995                           - p1*p2*(1 - 2.*zeta)/den2
 
 1996                           + 2.*p1*p2*(xi*eta + zeta - zeta*zeta)/den3;
 
 1999                         return -0.5*p3*(xi*eta - zeta + zeta*zeta)/den2
 
 2000                           - 0.5*p2*(xi*eta - zeta + zeta*zeta)/den2
 
 2001                           + p2*p3*(2.*zeta - 1)/den2
 
 2002                           - 2.*p2*p3*(xi*eta - zeta + zeta*zeta)/den3;
 
 2005                         return 0.5*p4*(xi*eta + zeta - zeta*zeta)/den2
 
 2006                           + 0.5*p3*(xi*eta + zeta - zeta*zeta)/den2
 
 2007                           - p3*p4*(1 - 2.*zeta)/den2
 
 2008                           + 2.*p3*p4*(xi*eta + zeta - zeta*zeta)/den3;
 
 2011                         return 4.*zeta - 1.;
 
 2014                         return 2.*p4*p1*eta/den2
 
 2017                           + 8.*p2*p1*p4*eta/den3;
 
 2020                         return -2.*p2*p3*xi/den2
 
 2023                           - 8.*p1*p2*p3*xi/den3;
 
 2026                         return -2.*p3*p4*eta/den2
 
 2029                           - 8.*p2*p3*p4*eta/den3;
 
 2032                         return 2.*p4*p1*xi/den2
 
 2035                           + 8.*p3*p4*p1*xi/den3;
 
 2038                         return 2.*p4*zeta/den
 
 2041                           + 4.*p1*p4*zeta/den2;
 
 2044                         return 2.*p1*zeta/den
 
 2047                           + 4.*p2*p1*zeta/den2;
 
 2050                         return 2.*p2*zeta/den
 
 2053                           + 4.*p3*p2*zeta/den2;
 
 2056                         return 2.*p3*zeta/den
 
 2059                           + 4.*p4*p3*zeta/den2;
 
 2062                         return -8.*p2*p3*p4/den2
 
 2066                           - 32.*p1*p2*p3*p4/den3;
 
 2069                         libmesh_error_msg(
"Invalid i = " << i);
 
 2074                   libmesh_error_msg(
"Invalid j = " << j);
 
 2080             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << type);
 
 2087       libmesh_error_msg(
"ERROR: Unsupported 3D FE order!: " << order);
 
 2090 #else // LIBMESH_DIM != 3 
 2092   libmesh_not_implemented();
 
 2098 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
 2100 Real fe_lagrange_3D_shape_second_deriv(
const ElemType type,
 
 2102                                        const unsigned int i,
 
 2103                                        const unsigned int j,
 
 2106 #if LIBMESH_DIM == 3 
 2108   libmesh_assert_less (j, 6);
 
 2132               libmesh_assert_less (i, 6);
 
 2137               Point p2d(p(0),p(1));
 
 2141               static const unsigned int i0[] = {0, 0, 0, 1, 1, 1};
 
 2142               static const unsigned int i1[] = {0, 1, 2, 0, 1, 2};
 
 2164                   libmesh_error_msg(
"Invalid j = " << j);
 
 2172               libmesh_assert_less (i, 5);
 
 2174               const Real xi   = p(0);
 
 2175               const Real eta  = p(1);
 
 2176               const Real zeta = p(2);
 
 2177               const Real eps  = 1.e-35;
 
 2192                         return 0.25/(1. - zeta + eps);
 
 2195                         return -0.25/(1. - zeta + eps);
 
 2199                         libmesh_error_msg(
"Invalid i = " << i);
 
 2205                     Real den = (1. - zeta + eps)*(1. - zeta + eps);
 
 2211                         return 0.25*eta/den;
 
 2214                         return -0.25*eta/den;
 
 2218                         libmesh_error_msg(
"Invalid i = " << i);
 
 2224                     Real den = (1. - zeta + eps)*(1. - zeta + eps);
 
 2233                         return -0.25*xi/den;
 
 2237                         libmesh_error_msg(
"Invalid i = " << i);
 
 2243                     Real den = (1. - zeta + eps)*(1. - zeta + eps)*(1. - zeta + eps);
 
 2249                         return 0.5*xi*eta/den;
 
 2252                         return -0.5*xi*eta/den;
 
 2256                         libmesh_error_msg(
"Invalid i = " << i);
 
 2261                   libmesh_error_msg(
"Invalid j = " << j);
 
 2270               libmesh_assert_less (i, 8);
 
 2273               const Real xi   = p(0);
 
 2274               const Real eta  = p(1);
 
 2275               const Real zeta = p(2);
 
 2277               static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0};
 
 2278               static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1};
 
 2279               static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1};
 
 2307                   libmesh_error_msg(
"Invalid j = " << j);
 
 2312             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << type);
 
 2326               libmesh_assert_less (i, 20);
 
 2328               const Real xi   = p(0);
 
 2329               const Real eta  = p(1);
 
 2330               const Real zeta = p(2);
 
 2334               const Real x = .5*(xi   + 1.);
 
 2335               const Real y = .5*(eta  + 1.);
 
 2336               const Real z = .5*(zeta + 1.);
 
 2346                         return (1. - y) * (1. - z);
 
 2349                         return y * (1. - z);
 
 2352                         return (1. - y) * z;
 
 2357                         return -2. * (1. - y) * (1. - z);
 
 2359                         return -2. * y * (1. - z);
 
 2361                         return -2. * (1. - y) * z;
 
 2374                         libmesh_error_msg(
"Invalid i = " << i);
 
 2382                         return (1.25 - x - y - .5*z) * (1. - z);
 
 2384                         return (-x + y + .5*z - .25) * (1. - z);
 
 2386                         return (x + y - .5*z - .75) * (1. - z);
 
 2388                         return (-y + x + .5*z - .25) * (1. - z);
 
 2390                         return -.25*z * (4.*x + 4.*y - 2.*z - 3);
 
 2392                         return -.25*z * (-4.*y + 4.*x + 2.*z - 1.);
 
 2394                         return .25*z * (-5 + 4.*x + 4.*y + 2.*z);
 
 2396                         return .25*z * (4.*x - 4.*y - 2.*z + 1.);
 
 2398                         return (-1. + 2.*x) * (1. - z);
 
 2400                         return (1. - 2.*y) * (1. - z);
 
 2402                         return (1. - 2.*x) * (1. - z);
 
 2404                         return (-1. + 2.*y) * (1. - z);
 
 2406                         return z * (1. - z);
 
 2408                         return -z * (1. - z);
 
 2410                         return z * (1. - z);
 
 2412                         return -z * (1. - z);
 
 2414                         return (-1. + 2.*x) * z;
 
 2416                         return (1. - 2.*y) * z;
 
 2418                         return (1. - 2.*x) * z;
 
 2420                         return (-1. + 2.*y) * z;
 
 2422                         libmesh_error_msg(
"Invalid i = " << i);
 
 2430                       return (1. - x) * (1. - z);
 
 2433                       return x * (1. - z);
 
 2436                       return (1. - x) * z;
 
 2441                       return -2. * x * (1. - z);
 
 2443                       return -2. * (1. - x) * (1. - z);
 
 2447                       return -2. * (1. - x) * z;
 
 2458                       libmesh_error_msg(
"Invalid i = " << i);
 
 2464                       return (1.25 - x - .5*y - z) * (1. - y);
 
 2466                       return (-x + .5*y + z - .25) * (1. - y);
 
 2468                       return -.25*y * (2.*y + 4.*x - 4.*z - 1.);
 
 2470                       return -.25*y * (-2.*y + 4.*x + 4.*z - 3);
 
 2472                       return (-z + x + .5*y - .25) * (1. - y);
 
 2474                       return (x - .5*y + z - .75) * (1. - y);
 
 2476                       return .25*y * (2.*y + 4.*x + 4.*z - 5);
 
 2478                       return .25*y * (-2.*y + 4.*x - 4.*z + 1.);
 
 2480                       return (-1. + 2.*x) * (1. - y);
 
 2482                       return -y * (1. - y);
 
 2484                       return (-1. + 2.*x) * y;
 
 2486                       return y * (1. - y);
 
 2488                       return (-1. + 2.*z) * (1. - y);
 
 2490                       return (1. - 2.*z) * (1. - y);
 
 2492                       return (1. - 2.*z) * y;
 
 2494                       return (-1. + 2.*z) * y;
 
 2496                       return (1. - 2.*x) * (1. - y);
 
 2498                       return y * (1. - y);
 
 2500                       return (1. - 2.*x) * y;
 
 2502                       return -y * (1. - y);
 
 2504                       libmesh_error_msg(
"Invalid i = " << i);
 
 2510                       return (1.25 - .5*x - y - z) * (1. - x);
 
 2512                       return .25*x * (2.*x - 4.*y - 4.*z + 3.);
 
 2514                       return -.25*x * (2.*x + 4.*y - 4.*z - 1.);
 
 2516                       return (-y + .5*x + z - .25) * (1. - x);
 
 2518                       return (-z + .5*x + y - .25) * (1. - x);
 
 2520                       return -.25*x * (2.*x - 4.*y + 4.*z - 1.);
 
 2522                       return .25*x * (2.*x + 4.*y + 4.*z - 5);
 
 2524                       return (y - .5*x + z - .75) * (1. - x);
 
 2526                       return x * (1. - x);
 
 2528                       return (-1. + 2.*y) * x;
 
 2530                       return -x * (1. - x);
 
 2532                       return (-1. + 2.*y) * (1. - x);
 
 2534                       return (-1. + 2.*z) * (1. - x);
 
 2536                       return (-1. + 2.*z) * x;
 
 2538                       return (1. - 2.*z) * x;
 
 2540                       return (1. - 2.*z) * (1. - x);
 
 2542                       return -x * (1. - x);
 
 2544                       return (1. - 2.*y) * x;
 
 2546                       return x * (1. - x);
 
 2548                       return (1. - 2.*y) * (1. - x);
 
 2550                       libmesh_error_msg(
"Invalid i = " << i);
 
 2557                       return (1. - x) * (1. - y);
 
 2560                       return x * (1. - y);
 
 2566                       return (1. - x) * y;
 
 2568                       return -2. * (1. - x) * (1. - y);
 
 2570                       return -2. * x * (1. - y);
 
 2574                       return -2. * (1. - x) * y;
 
 2585                       libmesh_error_msg(
"Invalid i = " << i);
 
 2588                   libmesh_error_msg(
"Invalid j = " << j);
 
 2595               libmesh_assert_less (i, 27);
 
 2598               const Real xi   = p(0);
 
 2599               const Real eta  = p(1);
 
 2600               const Real zeta = p(2);
 
 2606               static const unsigned int i0[] = {0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 0, 2, 2, 1, 2, 0, 2, 2};
 
 2607               static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 1, 2, 0, 0, 1, 1, 0, 2, 1, 2, 2, 0, 2, 1, 2, 2, 2};
 
 2608               static const unsigned int i2[] = {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 2, 2, 2, 1, 2};
 
 2649                   libmesh_error_msg(
"Invalid j = " << j);
 
 2662               static const Real dzetadxi[4][3] =
 
 2672               static const unsigned short int independent_var_indices[6][2] =
 
 2686               static const unsigned short int zeta_indices[10][2] =
 
 2701               const unsigned int my_j = independent_var_indices[j][0];
 
 2702               const unsigned int my_k = independent_var_indices[j][1];
 
 2706                   return 4.*dzetadxi[i][my_j]*dzetadxi[i][my_k];
 
 2711                   const unsigned short int my_m = zeta_indices[i][0];
 
 2712                   const unsigned short int my_n = zeta_indices[i][1];
 
 2714                   return 4.*(dzetadxi[my_n][my_j]*dzetadxi[my_m][my_k] +
 
 2715                              dzetadxi[my_m][my_j]*dzetadxi[my_n][my_k] );
 
 2718                 libmesh_error_msg(
"Invalid shape function index " << i);
 
 2726               libmesh_assert_less (i, 15);
 
 2728               const Real xi   = p(0);
 
 2729               const Real eta  = p(1);
 
 2730               const Real zeta = p(2);
 
 2741                         return 2.*(1. - zeta);
 
 2754                         return 2.*(1. + zeta);
 
 2756                         return 4.*(zeta - 1);
 
 2758                         return -4.*(1. + zeta);
 
 2760                         libmesh_error_msg(
"Invalid i = " << i);
 
 2771                         return 2.*(1. - zeta);
 
 2782                         return 2.*(1. + zeta);
 
 2785                         return 2.*(zeta - 1.);
 
 2788                         return -2.*(1. + zeta);
 
 2790                         libmesh_error_msg(
"Invalid i = " << i);
 
 2801                         return 2.*(1. - zeta);
 
 2814                         return 2.*(1. + zeta);
 
 2816                         return 4.*(zeta - 1.);
 
 2818                         return -4.*(1. + zeta);
 
 2820                         libmesh_error_msg(
"Invalid i = " << i);
 
 2830                         return 1.5 - zeta - 2.*xi - 2.*eta;
 
 2832                         return 0.5 + zeta - 2.*xi;
 
 2838                         return -1.5 - zeta + 2.*xi + 2.*eta;
 
 2840                         return -0.5 + zeta + 2.*xi;
 
 2842                         return 4.*xi + 2.*eta - 2.;
 
 2852                         return -4.*xi - 2.*eta + 2.;
 
 2858                         libmesh_error_msg(
"Invalid i = " << i);
 
 2868                         return 1.5 - zeta - 2.*xi - 2.*eta;
 
 2874                         return .5 + zeta - 2.*eta;
 
 2876                         return -1.5 - zeta + 2.*xi + 2.*eta;
 
 2878                         return -.5 + zeta + 2.*eta;
 
 2884                         return 2.*xi + 4.*eta - 2.;
 
 2894                         return -2.*xi - 4.*eta + 2.;
 
 2896                         libmesh_error_msg(
"Invalid i = " << i);
 
 2907                         return 1. - xi - eta;
 
 2922                         return 2.*xi + 2.*eta - 2.;
 
 2928                         libmesh_error_msg(
"Invalid i = " << i);
 
 2933                   libmesh_error_msg(
"Invalid j = " << j);
 
 2942               libmesh_assert_less (i, 18);
 
 2947               Point p2d(p(0),p(1));
 
 2951               static const unsigned int i0[] = {0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 2, 2, 1, 1, 1, 2, 2, 2};
 
 2952               static const unsigned int i1[] = {0, 1, 2, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 3, 4, 5};
 
 2987                   libmesh_error_msg(
"Invalid shape function derivative j = " << j);
 
 2997               libmesh_assert_less (i, 14);
 
 2999               const Real xi   = p(0);
 
 3000               const Real eta  = p(1);
 
 3001               const Real zeta = p(2);
 
 3002               const Real eps  = 1.e-35;
 
 3007                 p1 = 0.5*(1. - eta - zeta), 
 
 3008                 p2 = 0.5*(1. + xi  - zeta), 
 
 3009                 p3 = 0.5*(1. + eta - zeta), 
 
 3010                 p4 = 0.5*(1. - xi  - zeta); 
 
 3015                 den = (-1. + zeta + eps),
 
 3022                 numer_mp = xi*eta - zeta + zeta*zeta,
 
 3023                 numer_pm = xi*eta + zeta - zeta*zeta;
 
 3033                         return -p1*eta/den2;
 
 3044                         return 2.*p1*eta/den2;
 
 3047                         return 4.*p1*p3/den2;
 
 3049                         return -2.*p3*eta/den2;
 
 3051                         return -8.*p1*p3/den2;
 
 3053                         libmesh_error_msg(
"Invalid i = " << i);
 
 3062                         return 0.25*numer_mp/den2
 
 3068                         return 0.25*numer_pm/den2
 
 3074                         return 0.25*numer_mp/den2
 
 3080                         return 0.25*numer_pm/den2
 
 3121                         return 4.*p4*p1/den2
 
 3127                         libmesh_error_msg(
"Invalid i = " << i);
 
 3150                         return 4.*p2*p4/den2;
 
 3152                         return -2.*p2*xi/den2;
 
 3154                         return 2.*p4*xi/den2;
 
 3156                         return -8.*p2*p4/den2;
 
 3158                         libmesh_error_msg(
"Invalid i = " << i);
 
 3168                         return 0.25*numer_mp/den2
 
 3169                           - 0.5*p1*(2.*zeta - 1.)/den2
 
 3173                           - 2.*p4*p1*eta/den3;
 
 3176                         return 0.25*numer_pm/den2
 
 3177                           - 0.5*p1*(1 - 2.*zeta)/den2
 
 3181                           + 2.*p1*p2*eta/den3;
 
 3184                         return -0.25*numer_mp/den2
 
 3185                           + 0.5*p3*(2.*zeta - 1.)/den2
 
 3189                           - 2.*p2*p3*eta/den3;
 
 3192                         return -0.25*numer_pm/den2
 
 3193                           + 0.5*p3*(1 - 2.*zeta)/den2
 
 3197                           + 2.*p3*p4*eta/den3;
 
 3206                           - 4.*p1*p2*eta/den3;
 
 3221                           + 4.*p2*p3*eta/den3;
 
 3253                         return -4.*p4*p1/den2
 
 3258                           + 16.*p1*p2*p3/den3;
 
 3261                         libmesh_error_msg(
"Invalid i = " << i);
 
 3270                         return 0.25*numer_mp/den2
 
 3271                           - 0.5*p4*(2.*zeta - 1.)/den2
 
 3278                         return -0.25*numer_pm/den2
 
 3279                           + 0.5*p2*(1. - 2.*zeta)/den2
 
 3286                         return -0.25*numer_mp/den2
 
 3287                           + 0.5*p2*(2.*zeta - 1.)/den2
 
 3294                         return 0.25*numer_pm/den2
 
 3295                           - 0.5*p4*(1. - 2.*zeta)/den2
 
 3355                         return 4.*p3*p4/den2
 
 3360                           - 16.*p2*p1*p4/den3;
 
 3363                         libmesh_error_msg(
"Invalid i = " << i);
 
 3372                         return 0.5*numer_mp/den2
 
 3373                           - p1*(2.*zeta - 1.)/den2
 
 3374                           + 2.*p1*numer_mp/den3
 
 3375                           - p4*(2.*zeta - 1.)/den2
 
 3376                           + 2.*p4*numer_mp/den3
 
 3378                           - 4.*p4*p1*(2.*zeta - 1.)/den3
 
 3379                           + 6.*p4*p1*numer_mp/den4;
 
 3382                         return -0.5*numer_pm/den2
 
 3383                           + p2*(1 - 2.*zeta)/den2
 
 3384                           - 2.*p2*numer_pm/den3
 
 3385                           + p1*(1 - 2.*zeta)/den2
 
 3386                           - 2.*p1*numer_pm/den3
 
 3388                           + 4.*p1*p2*(1 - 2.*zeta)/den3
 
 3389                           - 6.*p1*p2*numer_pm/den4;
 
 3392                         return 0.5*numer_mp/den2
 
 3393                           - p3*(2.*zeta - 1.)/den2
 
 3394                           + 2.*p3*numer_mp/den3
 
 3395                           - p2*(2.*zeta - 1.)/den2
 
 3396                           + 2.*p2*numer_mp/den3
 
 3398                           - 4.*p2*p3*(2.*zeta - 1.)/den3
 
 3399                           + 6.*p2*p3*numer_mp/den4;
 
 3402                         return -0.5*numer_pm/den2
 
 3403                           + p4*(1 - 2.*zeta)/den2
 
 3404                           - 2.*p4*numer_pm/den3
 
 3405                           + p3*(1 - 2.*zeta)/den2
 
 3406                           - 2.*p3*numer_pm/den3
 
 3408                           + 4.*p3*p4*(1 - 2.*zeta)/den3
 
 3409                           - 6.*p3*p4*numer_pm/den4;
 
 3415                         return -2.*p1*eta/den2
 
 3421                           - 24.*p2*p1*p4*eta/den4;
 
 3424                         return 2.*p3*xi/den2
 
 3430                           + 24.*p1*p2*p3*xi/den4;
 
 3433                         return 2.*p4*eta/den2
 
 3439                           + 24.*p2*p3*p4*eta/den4;
 
 3442                         return -2.*p1*xi/den2
 
 3448                           - 24.*p3*p4*p1*xi/den4;
 
 3457                           - 8.*p1*p4*zeta/den3;
 
 3466                           - 8.*p2*p1*zeta/den3;
 
 3475                           - 8.*p3*p2*zeta/den3;
 
 3484                           - 8.*p4*p3*zeta/den3;
 
 3487                         return 8.*p3*p4/den2
 
 3497                           + 96.*p1*p2*p3*p4/den4;
 
 3500                         libmesh_error_msg(
"Invalid i = " << i);
 
 3505                   libmesh_error_msg(
"Invalid j = " << j);
 
 3514               libmesh_assert_less (i, 13);
 
 3516               const Real xi   = p(0);
 
 3517               const Real eta  = p(1);
 
 3518               const Real zeta = p(2);
 
 3519               const Real eps  = 1.e-35;
 
 3524                 den = (-1. + zeta + eps),
 
 3540                         return 0.5*(-1. + zeta + eta)/den;
 
 3544                         return 0.5*(-1. + zeta - eta)/den;
 
 3556                         return (1. - eta - zeta)/den;
 
 3559                         return (1. + eta - zeta)/den;
 
 3562                         libmesh_error_msg(
"Invalid i = " << i);
 
 3571                         return  0.25*(-1. + 2.*zeta + 2.*xi + 2.*eta)/den;
 
 3574                         return -0.25*(-1. + 2.*zeta - 2.*xi + 2.*eta)/den;
 
 3577                         return -0.25*(1. - 2.*zeta + 2.*xi + 2.*eta)/den;
 
 3580                         return  0.25*(1. - 2.*zeta - 2.*xi + 2.*eta)/den;
 
 3610                         libmesh_error_msg(
"Invalid i = " << i);
 
 3621                         return 0.5*(-1. + zeta + xi)/den;
 
 3625                         return 0.5*(-1. + zeta - xi)/den;
 
 3637                         return (1. + xi - zeta)/den;
 
 3640                         return (1. - xi - zeta)/den;
 
 3643                         libmesh_error_msg(
"Invalid i = " << i);
 
 3653                         return -0.25*(-1. + 2.*zeta - zeta2 + eta + 2.*eta*xi + eta2)/den2;
 
 3656                         return 0.25*(-1. + 2.*zeta - zeta2 + eta - 2.*eta*xi + eta2)/den2;
 
 3659                         return 0.25*(-1. + 2.*zeta - zeta2 - eta + 2.*eta*xi + eta2)/den2;
 
 3662                         return -0.25*(-1. + 2.*zeta - zeta2 - eta - 2.*eta*xi + eta2)/den2;
 
 3671                         return -0.5*(1. + zeta2 + eta2 - 2.*zeta)/den2;
 
 3674                         return -eta*xi/den2;
 
 3677                         return 0.5*(1. + zeta2 + eta2 - 2.*zeta)/den2;
 
 3680                         return (-1. - zeta2 + eta + 2.*zeta)/den2;
 
 3683                         return -(-1. - zeta2 + eta + 2.*zeta)/den2;
 
 3686                         return (1. + zeta2 + eta - 2.*zeta)/den2;
 
 3689                         return -(1. + zeta2 + eta - 2.*zeta)/den2;
 
 3692                         libmesh_error_msg(
"Invalid i = " << i);
 
 3701                         return -0.25*(-1. + 2.*zeta - zeta2 + xi + 2.*eta*xi + xi2)/den2;
 
 3704                         return 0.25*(1. - 2.*zeta + zeta2 + xi + 2.*eta*xi - xi2)/den2;
 
 3707                         return 0.25*(-1. + 2.*zeta - zeta2 - xi + 2.*eta*xi + xi2)/den2;
 
 3710                         return -0.25*(1. - 2.*zeta + zeta2 - xi + 2.*eta*xi - xi2)/den2;
 
 3716                         return 0.5*(1. + xi2 + zeta2 - 2.*zeta)/den2;
 
 3719                         return -eta*xi/den2;
 
 3722                         return -0.5*(1. + xi2 + zeta2 - 2.*zeta)/den2;
 
 3728                         return (-1. - zeta2 + xi + 2.*zeta)/den2;
 
 3731                         return -(1. + zeta2 + xi - 2.*zeta)/den2;
 
 3734                         return (1. + zeta2 + xi - 2.*zeta)/den2;
 
 3737                         return -(-1. - zeta2 + xi + 2.*zeta)/den2;
 
 3740                         libmesh_error_msg(
"Invalid i = " << i);
 
 3749                         return 0.5*(xi + eta + 1.)*eta*xi/den3;
 
 3752                         return -0.5*(eta - xi + 1.)*eta*xi/den3;
 
 3755                         return -0.5*(xi + eta - 1.)*eta*xi/den3;
 
 3758                         return 0.5*(eta - xi - 1.)*eta*xi/den3;
 
 3764                         return -(1. - 3.*zeta + 3.*zeta2 - zeta3 + eta*xi2)/den3;
 
 3767                         return (-1. + 3.*zeta - 3.*zeta2 + zeta3 + eta2*xi)/den3;
 
 3770                         return (-1. + 3.*zeta - 3.*zeta2 + zeta3 + eta*xi2)/den3;
 
 3773                         return -(1. - 3.*zeta + 3.*zeta2 - zeta3 + eta2*xi)/den3;
 
 3776                         return -2.*(-1. + 3.*zeta - 3.*zeta2 + zeta3 + eta*xi)/den3;
 
 3779                         return 2.*(1. - 3.*zeta + 3.*zeta2 - zeta3 + eta*xi)/den3;
 
 3782                         return -2.*(-1. + 3.*zeta - 3.*zeta2 + zeta3 + eta*xi)/den3;
 
 3785                         return 2.*(1. - 3.*zeta + 3.*zeta2 - zeta3 + eta*xi)/den3;
 
 3788                         libmesh_error_msg(
"Invalid i = " << i);
 
 3793                   libmesh_error_msg(
"Invalid j = " << j);
 
 3798             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << type);
 
 3805       libmesh_error_msg(
"ERROR: Unsupported 3D FE order!: " << order);
 
 3808 #else // LIBMESH_DIM != 3 
 3810   libmesh_not_implemented();
 
 3814 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES