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)