20 #include "libmesh/fe.h"    21 #include "libmesh/elem.h"    22 #include "libmesh/fe_lagrange_shape_1D.h"    23 #include "libmesh/enum_to_string.h"    24 #include "libmesh/face_c0polygon.h"    48 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES    51 Real fe_lagrange_2D_shape_second_deriv(
const ElemType type,
    58 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES    78   return fe_lagrange_2D_shape<LAGRANGE>(type, 
nullptr, order, i, p);
    89   return fe_lagrange_2D_shape<L2_LAGRANGE>(type, 
nullptr, order, i, p);
    98                            const bool add_p_level)
   103   return fe_lagrange_2D_shape<LAGRANGE>(elem->
type(), elem, order + add_p_level*elem->
p_level(), i, p);
   111                               const unsigned int i,
   113                               const bool add_p_level)
   118   return fe_lagrange_2D_shape<L2_LAGRANGE>(elem->
type(), elem, order + add_p_level*elem->
p_level(), i, p);
   125                            const unsigned int i,
   127                            const bool add_p_level)
   130   return fe_lagrange_2D_shape<LAGRANGE>(elem->
type(), elem, fet.
order + add_p_level*elem->
p_level(), i, p);
   138                               const unsigned int i,
   140                               const bool add_p_level)
   143   return fe_lagrange_2D_shape<L2_LAGRANGE>(elem->
type(), elem, fet.
order + add_p_level*elem->
p_level(), i, p);
   150                                  const unsigned int i,
   151                                  const unsigned int j,
   154   return fe_lagrange_2D_shape_deriv<LAGRANGE>(type, 
nullptr, order, i, j, p);
   162                                     const unsigned int i,
   163                                     const unsigned int j,
   166   return fe_lagrange_2D_shape_deriv<L2_LAGRANGE>(type, 
nullptr, order, i, j, p);
   174                                  const unsigned int i,
   175                                  const unsigned int j,
   177                                  const bool add_p_level)
   182   return fe_lagrange_2D_shape_deriv<LAGRANGE>(elem->
type(), elem, order + add_p_level*elem->
p_level(), i, j, p);
   190                                     const unsigned int i,
   191                                     const unsigned int j,
   193                                     const bool add_p_level)
   198   return fe_lagrange_2D_shape_deriv<L2_LAGRANGE>(elem->
type(), elem, order + add_p_level*elem->
p_level(), i, j, p);
   205                                  const unsigned int i,
   206                                  const unsigned int j,
   208                                  const bool add_p_level)
   211   return fe_lagrange_2D_shape_deriv<LAGRANGE>(elem->
type(), elem, fet.
order + add_p_level*elem->
p_level(), i, j, p);
   219                                     const unsigned int i,
   220                                     const unsigned int j,
   222                                     const bool add_p_level)
   225   return fe_lagrange_2D_shape_deriv<L2_LAGRANGE>(elem->
type(), elem, fet.
order + add_p_level*elem->
p_level(), i, j, p);
   230 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES   235                                         const unsigned int i,
   236                                         const unsigned int j,
   239   return fe_lagrange_2D_shape_second_deriv<LAGRANGE>(type, 
nullptr, order, i, j, p);
   247                                            const unsigned int i,
   248                                            const unsigned int j,
   251   return fe_lagrange_2D_shape_second_deriv<L2_LAGRANGE>(type, 
nullptr, order, i, j, p);
   259                                         const unsigned int i,
   260                                         const unsigned int j,
   262                                         const bool add_p_level)
   267   return fe_lagrange_2D_shape_second_deriv<LAGRANGE>(elem->
type(), elem, order + add_p_level*elem->
p_level(), i, j, p);
   275                                            const unsigned int i,
   276                                            const unsigned int j,
   278                                            const bool add_p_level)
   283   return fe_lagrange_2D_shape_second_deriv<L2_LAGRANGE>(elem->
type(), elem, order + add_p_level*elem->
p_level(), i, j, p);
   290                                         const unsigned int i,
   291                                         const unsigned int j,
   293                                         const bool add_p_level)
   296   return fe_lagrange_2D_shape_second_deriv<LAGRANGE>(elem->
type(), elem, fet.
order + add_p_level*elem->
p_level(), i, j, p);
   304                                            const unsigned int i,
   305                                            const unsigned int j,
   307                                            const bool add_p_level)
   310   return fe_lagrange_2D_shape_second_deriv<L2_LAGRANGE>(elem->
type(), elem, fet.
order + add_p_level*elem->
p_level(), i, j, p);
   313 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES   325 template <FEFamily T>
   329                           const unsigned int i,
   349               const Real xi  = p(0);
   350               const Real eta = p(1);
   352               libmesh_assert_less (i, 4);
   355               static const unsigned int i0[] = {0, 1, 1, 0};
   356               static const unsigned int i1[] = {0, 0, 1, 1};
   367               const Real zeta1 = p(0);
   368               const Real zeta2 = p(1);
   369               const Real zeta0 = 1. - zeta1 - zeta2;
   371               libmesh_assert_less (i, 3);
   385                   libmesh_error_msg(
"Invalid shape function index i = " << i);
   393                 libmesh_error_msg(
"Code (see stack trace) used an outdated FE function overload.\n"   394                                   "Shape functions on a C0Polygon are not defined by its ElemType alone.");
   398               const C0Polygon & poly = *cast_ptr<const C0Polygon *>(elem);
   406               libmesh_assert_less(s, poly.n_subtriangles());
   408               const auto subtri = poly.subtriangle(s);
   412               if (nodei == subtri[0])
   414               if (nodei == subtri[1])
   416               if (nodei == subtri[2])
   437               const Real xi  = p(0);
   438               const Real eta = p(1);
   440               libmesh_assert_less (i, 8);
   445                   return .25*(1. - xi)*(1. - eta)*(-1. - xi - eta);
   448                   return .25*(1. + xi)*(1. - eta)*(-1. + xi - eta);
   451                   return .25*(1. + xi)*(1. + eta)*(-1. + xi + eta);
   454                   return .25*(1. - xi)*(1. + eta)*(-1. - xi + eta);
   457                   return .5*(1. - xi*xi)*(1. - eta);
   460                   return .5*(1. + xi)*(1. - eta*eta);
   463                   return .5*(1. - xi*xi)*(1. + eta);
   466                   return .5*(1. - xi)*(1. - eta*eta);
   469                   libmesh_error_msg(
"Invalid shape function index i = " << i);
   475                                "High order on first order elements only supported for L2 families");
   476             libmesh_fallthrough();
   482               const Real xi  = p(0);
   483               const Real eta = p(1);
   485               libmesh_assert_less (i, 9);
   488               static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
   489               static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
   497                                "High order on first order elements only supported for L2 families");
   498             libmesh_fallthrough();
   502               const Real zeta1 = p(0);
   503               const Real zeta2 = p(1);
   504               const Real zeta0 = 1. - zeta1 - zeta2;
   506               libmesh_assert_less (i, 6);
   511                   return 2.*zeta0*(zeta0-0.5);
   514                   return 2.*zeta1*(zeta1-0.5);
   517                   return 2.*zeta2*(zeta2-0.5);
   520                   return 4.*zeta0*zeta1;
   523                   return 4.*zeta1*zeta2;
   526                   return 4.*zeta2*zeta0;
   529                   libmesh_error_msg(
"Invalid shape function index i = " << i);
   547               const Real zeta1 = p(0);
   548               const Real zeta2 = p(1);
   549               const Real zeta0 = 1. - zeta1 - zeta2;
   550               const Real bubble_27th = zeta0*zeta1*zeta2;
   552               libmesh_assert_less (i, 7);
   557                   return 2.*zeta0*(zeta0-0.5) + 3.*bubble_27th;
   560                   return 2.*zeta1*(zeta1-0.5) + 3.*bubble_27th;
   563                   return 2.*zeta2*(zeta2-0.5) + 3.*bubble_27th;
   566                   return 4.*zeta0*zeta1 - 12.*bubble_27th;
   569                   return 4.*zeta1*zeta2 - 12.*bubble_27th;
   572                   return 4.*zeta2*zeta0 - 12.*bubble_27th;
   575                   return 27.*bubble_27th;
   578                   libmesh_error_msg(
"Invalid shape function index i = " << i);
   591       libmesh_error_msg(
"ERROR: Unsupported 2D FE order: " << order);
   593 #else // LIBMESH_DIM > 1   595   libmesh_not_implemented();
   601 template <FEFamily T>
   605                                 const unsigned int i,
   606                                 const unsigned int j,
   611   libmesh_assert_less (j, 2);
   628               const Real xi  = p(0);
   629               const Real eta = p(1);
   631               libmesh_assert_less (i, 4);
   634               static const unsigned int i0[] = {0, 1, 1, 0};
   635               static const unsigned int i1[] = {0, 0, 1, 1};
   650                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
   659               libmesh_assert_less (i, 3);
   661               const Real dzeta0dxi  = -1.;
   662               const Real dzeta1dxi  = 1.;
   663               const Real dzeta2dxi  = 0.;
   665               const Real dzeta0deta = -1.;
   666               const Real dzeta1deta = 0.;
   667               const Real dzeta2deta = 1.;
   686                         libmesh_error_msg(
"Invalid shape function index i = " << i);
   704                         libmesh_error_msg(
"Invalid shape function index i = " << i);
   708                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
   716                 libmesh_error_msg(
"Code (see stack trace) used an outdated FE function overload.\n"   717                                   "Shape functions on a C0Polygon are not defined by its ElemType alone.");
   721               const C0Polygon & poly = *cast_ptr<const C0Polygon *>(elem);
   729               libmesh_assert_less(s, poly.n_subtriangles());
   731               const auto subtri = poly.subtriangle(s);
   735               Real du_da = 0, du_db = 0;
   739               if (nodei == subtri[0])
   741               else if (nodei == subtri[1])
   743               else if (nodei == subtri[2])
   755               const auto master_points = poly.master_subtriangle(s);
   757               const Real dxi_da = master_points[1](0) - master_points[0](0);
   758               const Real dxi_db = master_points[2](0) - master_points[0](0);
   759               const Real deta_da = master_points[1](1) - master_points[0](1);
   760               const Real deta_db = master_points[2](1) - master_points[0](1);
   761               const Real jac = dxi_da*deta_db - dxi_db*deta_da;
   768                     const Real da_dxi = deta_db / jac;
   769                     const Real db_dxi = -deta_da / jac;
   770                     return du_da*da_dxi + du_db*db_dxi;
   775                     const Real da_deta = -dxi_db / jac;
   776                     const Real db_deta = dxi_da / jac;
   777                     return du_da*da_deta + du_db*db_deta;
   780                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
   798               const Real xi  = p(0);
   799               const Real eta = p(1);
   801               libmesh_assert_less (i, 8);
   810                       return .25*(1. - eta)*((1. - xi)*(-1.) +
   811                                              (-1.)*(-1. - xi - eta));
   814                       return .25*(1. - eta)*((1. + xi)*(1.) +
   815                                              (1.)*(-1. + xi - eta));
   818                       return .25*(1. + eta)*((1. + xi)*(1.) +
   819                                              (1.)*(-1. + xi + eta));
   822                       return .25*(1. + eta)*((1. - xi)*(-1.) +
   823                                              (-1.)*(-1. - xi + eta));
   826                       return .5*(-2.*xi)*(1. - eta);
   829                       return .5*(1.)*(1. - eta*eta);
   832                       return .5*(-2.*xi)*(1. + eta);
   835                       return .5*(-1.)*(1. - eta*eta);
   838                       libmesh_error_msg(
"Invalid shape function index i = " << i);
   846                       return .25*(1. - xi)*((1. - eta)*(-1.) +
   847                                             (-1.)*(-1. - xi - eta));
   850                       return .25*(1. + xi)*((1. - eta)*(-1.) +
   851                                             (-1.)*(-1. + xi - eta));
   854                       return .25*(1. + xi)*((1. + eta)*(1.) +
   855                                             (1.)*(-1. + xi + eta));
   858                       return .25*(1. - xi)*((1. + eta)*(1.) +
   859                                             (1.)*(-1. - xi + eta));
   862                       return .5*(1. - xi*xi)*(-1.);
   865                       return .5*(1. + xi)*(-2.*eta);
   868                       return .5*(1. - xi*xi)*(1.);
   871                       return .5*(1. - xi)*(-2.*eta);
   874                       libmesh_error_msg(
"Invalid shape function index i = " << i);
   878                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
   884                                "High order on first order elements only supported for L2 families");
   885             libmesh_fallthrough();
   890               const Real xi  = p(0);
   891               const Real eta = p(1);
   893               libmesh_assert_less (i, 9);
   896               static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
   897               static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
   912                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
   918                                "High order on first order elements only supported for L2 families");
   919             libmesh_fallthrough();
   923               libmesh_assert_less (i, 6);
   925               const Real zeta1 = p(0);
   926               const Real zeta2 = p(1);
   927               const Real zeta0 = 1. - zeta1 - zeta2;
   929               const Real dzeta0dxi  = -1.;
   930               const Real dzeta1dxi  = 1.;
   931               const Real dzeta2dxi  = 0.;
   933               const Real dzeta0deta = -1.;
   934               const Real dzeta1deta = 0.;
   935               const Real dzeta2deta = 1.;
   944                         return (4.*zeta0-1.)*dzeta0dxi;
   947                         return (4.*zeta1-1.)*dzeta1dxi;
   950                         return (4.*zeta2-1.)*dzeta2dxi;
   953                         return 4.*zeta1*dzeta0dxi + 4.*zeta0*dzeta1dxi;
   956                         return 4.*zeta2*dzeta1dxi + 4.*zeta1*dzeta2dxi;
   959                         return 4.*zeta2*dzeta0dxi + 4*zeta0*dzeta2dxi;
   962                         libmesh_error_msg(
"Invalid shape function index i = " << i);
   971                         return (4.*zeta0-1.)*dzeta0deta;
   974                         return (4.*zeta1-1.)*dzeta1deta;
   977                         return (4.*zeta2-1.)*dzeta2deta;
   980                         return 4.*zeta1*dzeta0deta + 4.*zeta0*dzeta1deta;
   983                         return 4.*zeta2*dzeta1deta + 4.*zeta1*dzeta2deta;
   986                         return 4.*zeta2*dzeta0deta + 4*zeta0*dzeta2deta;
   989                         libmesh_error_msg(
"Invalid shape function index i = " << i);
   993                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
  1011               libmesh_assert_less (i, 7);
  1013               const Real zeta1 = p(0);
  1014               const Real zeta2 = p(1);
  1015               const Real zeta0 = 1. - zeta1 - zeta2;
  1018               const Real dzeta0dxi  = -1.;
  1019               const Real dzeta1dxi  = 1.;
  1020               const Real dzeta2dxi  = 0.;
  1021               const Real dbubbledxi = zeta2 * (1. - 2.*zeta1 - zeta2);
  1023               const Real dzeta0deta = -1.;
  1024               const Real dzeta1deta = 0.;
  1025               const Real dzeta2deta = 1.;
  1026               const Real dbubbledeta= zeta1 * (1. - zeta1 - 2.*zeta2);
  1035                         return (4.*zeta0-1.)*dzeta0dxi + 3.*dbubbledxi;
  1038                         return (4.*zeta1-1.)*dzeta1dxi + 3.*dbubbledxi;
  1041                         return (4.*zeta2-1.)*dzeta2dxi + 3.*dbubbledxi;
  1044                         return 4.*zeta1*dzeta0dxi + 4.*zeta0*dzeta1dxi - 12.*dbubbledxi;
  1047                         return 4.*zeta2*dzeta1dxi + 4.*zeta1*dzeta2dxi - 12.*dbubbledxi;
  1050                         return 4.*zeta2*dzeta0dxi + 4*zeta0*dzeta2dxi - 12.*dbubbledxi;
  1053                         return 27.*dbubbledxi;
  1056                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1065                         return (4.*zeta0-1.)*dzeta0deta + 3.*dbubbledeta;
  1068                         return (4.*zeta1-1.)*dzeta1deta + 3.*dbubbledeta;
  1071                         return (4.*zeta2-1.)*dzeta2deta + 3.*dbubbledeta;
  1074                         return 4.*zeta1*dzeta0deta + 4.*zeta0*dzeta1deta - 12.*dbubbledeta;
  1077                         return 4.*zeta2*dzeta1deta + 4.*zeta1*dzeta2deta - 12.*dbubbledeta;
  1080                         return 4.*zeta2*dzeta0deta + 4*zeta0*dzeta2deta - 12.*dbubbledeta;
  1083                         return 27.*dbubbledeta;
  1086                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1090                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
  1103       libmesh_error_msg(
"ERROR: Unsupported 2D FE order: " << order);
  1105 #else // LIBMESH_DIM > 1  1107   libmesh_not_implemented();
  1113 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES  1115 template <FEFamily T>
  1116 Real fe_lagrange_2D_shape_second_deriv(
const ElemType type,
  1119                                        const unsigned int i,
  1120                                        const unsigned int j,
  1128   libmesh_assert_less (j, 3);
  1145               const Real xi  = p(0);
  1146               const Real eta = p(1);
  1148               libmesh_assert_less (i, 4);
  1151               static const unsigned int i0[] = {0, 1, 1, 0};
  1152               static const unsigned int i1[] = {0, 0, 1, 1};
  1170                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
  1203               const Real xi  = p(0);
  1204               const Real eta = p(1);
  1206               libmesh_assert_less (j, 3);
  1217                         return 0.5*(1.-eta);
  1221                         return 0.5*(1.+eta);
  1234                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1244                         return 0.25*( 1. - 2.*xi - 2.*eta);
  1247                         return 0.25*(-1. - 2.*xi + 2.*eta);
  1250                         return 0.25*( 1. + 2.*xi + 2.*eta);
  1253                         return 0.25*(-1. + 2.*xi - 2.*eta);
  1268                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1296                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1301                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
  1307                                "High order on first order elements only supported for L2 families");
  1308             libmesh_fallthrough();
  1313               const Real xi  = p(0);
  1314               const Real eta = p(1);
  1316               libmesh_assert_less (i, 9);
  1319               static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
  1320               static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
  1340                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
  1346                                "High order on first order elements only supported for L2 families");
  1347             libmesh_fallthrough();
  1351               const Real dzeta0dxi  = -1.;
  1352               const Real dzeta1dxi  = 1.;
  1353               const Real dzeta2dxi  = 0.;
  1355               const Real dzeta0deta = -1.;
  1356               const Real dzeta1deta = 0.;
  1357               const Real dzeta2deta = 1.;
  1359               libmesh_assert_less (j, 3);
  1369                         return 4.*dzeta0dxi*dzeta0dxi;
  1372                         return 4.*dzeta1dxi*dzeta1dxi;
  1375                         return 4.*dzeta2dxi*dzeta2dxi;
  1378                         return 8.*dzeta0dxi*dzeta1dxi;
  1381                         return 8.*dzeta1dxi*dzeta2dxi;
  1384                         return 8.*dzeta0dxi*dzeta2dxi;
  1387                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1397                         return 4.*dzeta0dxi*dzeta0deta;
  1400                         return 4.*dzeta1dxi*dzeta1deta;
  1403                         return 4.*dzeta2dxi*dzeta2deta;
  1406                         return 4.*dzeta1deta*dzeta0dxi + 4.*dzeta0deta*dzeta1dxi;
  1409                         return 4.*dzeta2deta*dzeta1dxi + 4.*dzeta1deta*dzeta2dxi;
  1412                         return 4.*dzeta2deta*dzeta0dxi + 4.*dzeta0deta*dzeta2dxi;
  1415                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1425                         return 4.*dzeta0deta*dzeta0deta;
  1428                         return 4.*dzeta1deta*dzeta1deta;
  1431                         return 4.*dzeta2deta*dzeta2deta;
  1434                         return 8.*dzeta0deta*dzeta1deta;
  1437                         return 8.*dzeta1deta*dzeta2deta;
  1440                         return 8.*dzeta0deta*dzeta2deta;
  1443                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1448                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
  1466                                "High order on first order elements only supported for L2 families");
  1467             libmesh_fallthrough();
  1471               const Real zeta1 = p(0);
  1472               const Real zeta2 = p(1);
  1475               const Real dzeta0dxi  = -1.;
  1476               const Real dzeta1dxi  = 1.;
  1477               const Real dzeta2dxi  = 0.;
  1479               const Real d2bubbledxi2 = -2. * zeta2;
  1481               const Real dzeta0deta = -1.;
  1482               const Real dzeta1deta = 0.;
  1483               const Real dzeta2deta = 1.;
  1485               const Real d2bubbledeta2 = -2. * zeta1;
  1487               const Real d2bubbledxideta = (1. - 2.*zeta1 - 2.*zeta2);
  1489               libmesh_assert_less (j, 3);
  1499                         return 4.*dzeta0dxi*dzeta0dxi + 3.*d2bubbledxi2;
  1502                         return 4.*dzeta1dxi*dzeta1dxi + 3.*d2bubbledxi2;
  1505                         return 4.*dzeta2dxi*dzeta2dxi + 3.*d2bubbledxi2;
  1508                         return 8.*dzeta0dxi*dzeta1dxi - 12.*d2bubbledxi2;
  1511                         return 8.*dzeta1dxi*dzeta2dxi - 12.*d2bubbledxi2;
  1514                         return 8.*dzeta0dxi*dzeta2dxi - 12.*d2bubbledxi2;
  1517                         return 27.*d2bubbledxi2;
  1520                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1530                         return 4.*dzeta0dxi*dzeta0deta + 3.*d2bubbledxideta;
  1533                         return 4.*dzeta1dxi*dzeta1deta + 3.*d2bubbledxideta;
  1536                         return 4.*dzeta2dxi*dzeta2deta + 3.*d2bubbledxideta;
  1539                         return 4.*dzeta1deta*dzeta0dxi + 4.*dzeta0deta*dzeta1dxi - 12.*d2bubbledxideta;
  1542                         return 4.*dzeta2deta*dzeta1dxi + 4.*dzeta1deta*dzeta2dxi - 12.*d2bubbledxideta;
  1545                         return 4.*dzeta2deta*dzeta0dxi + 4.*dzeta0deta*dzeta2dxi - 12.*d2bubbledxideta;
  1548                         return 27.*d2bubbledxideta;
  1551                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1561                         return 4.*dzeta0deta*dzeta0deta + 3.*d2bubbledeta2;
  1564                         return 4.*dzeta1deta*dzeta1deta + 3.*d2bubbledeta2;
  1567                         return 4.*dzeta2deta*dzeta2deta + 3.*d2bubbledeta2;
  1570                         return 8.*dzeta0deta*dzeta1deta - 12.*d2bubbledeta2;
  1573                         return 8.*dzeta1deta*dzeta2deta - 12.*d2bubbledeta2;
  1576                         return 8.*dzeta0deta*dzeta2deta - 12.*d2bubbledeta2;
  1579                         return 27.*d2bubbledeta2;
  1582                         libmesh_error_msg(
"Invalid shape function index i = " << i);
  1587                   libmesh_error_msg(
"ERROR: Invalid derivative index j = " << j);
  1598       libmesh_error_msg(
"ERROR: Unsupported 2D FE order: " << order);
  1602 #else // LIBMESH_DIM > 1  1604   libmesh_not_implemented();
  1608 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES Real fe_lagrange_1D_quadratic_shape_second_deriv(const unsigned int i, const unsigned int libmesh_dbg_var(j), const Real)
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
Real fe_lagrange_1D_linear_shape_deriv(const unsigned int i, const unsigned int libmesh_dbg_var(j), const Real)
ElemType
Defines an enum for geometric element types. 
Order
defines an enum for polynomial orders. 
Real fe_lagrange_1D_quadratic_shape_deriv(const unsigned int i, const unsigned int libmesh_dbg_var(j), const Real xi)
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
Real fe_lagrange_1D_quadratic_shape(const unsigned int i, const Real xi)
std::tuple< unsigned int, Real, Real > subtriangle_coordinates(const Point &p, Real tol=TOLERANCE *TOLERANCE) const
This is the base class from which all geometric element types are derived. 
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
unsigned int p_level() const
OrderWrapper order
The approximation order of the element. 
The libMesh namespace provides an interface to certain functionality in the library. 
LIBMESH_DEFAULT_VECTORIZED_FE(template<>Real FE< 0, BERNSTEIN)
void libmesh_ignore(const Args &...)
std::string enum_to_string(const T e)
The C0Polygon is an element in 2D with an arbitrary (but fixed) number of first-order (EDGE2) sides...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual ElemType type() const =0
A Point defines a location in LIBMESH_DIM dimensional Real space. 
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
Real fe_lagrange_1D_linear_shape(const unsigned int i, const Real xi)