19#include "libmesh/libmesh_config.h"
21#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
24#include "libmesh/fe.h"
25#include "libmesh/elem.h"
26#include "libmesh/utility.h"
27#include "libmesh/enum_to_string.h"
38static const Real sqrt2 = std::sqrt(2.);
39static const Real sqrt6 = std::sqrt(6.);
40static const Real sqrt10 = std::sqrt(10.);
41static const Real sqrt14 = std::sqrt(14.);
42static const Real sqrt22 = std::sqrt(22.);
43static const Real sqrt26 = std::sqrt(26.);
49 const unsigned int totalorder,
52 libmesh_assert_less (i, (totalorder+1u)*(totalorder+1u));
55 if (i < 4 || i >= 4*totalorder)
58 const int edge = (i-4) / (totalorder-1);
59 libmesh_assert_less(edge, 4);
60 libmesh_assert_greater_equal(edge, 0);
62 const int edge_i = i - 4 - edge*(totalorder-1);
89 const bool add_p_level)
95 const Order totalorder = order + add_p_level*elem->
p_level();
116 const Real l1 = 1-p(0)-p(1);
117 const Real l2 = p(0);
118 const Real l3 = p(1);
120 libmesh_assert_less (i, 6);
128 case 3:
return l1*l2*(-4.*sqrt6);
129 case 4:
return l2*l3*(-4.*sqrt6);
130 case 5:
return l3*l1*(-4.*sqrt6);
133 libmesh_error_msg(
"Invalid i = " << i);
147 const Real xi = p(0);
148 const Real eta = p(1);
150 libmesh_assert_less (i, 9);
153 static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
154 static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
177 Real l1 = 1-p(0)-p(1);
183 libmesh_assert_less (i, 10);
199 case 3:
return l1*l2*(-4.*sqrt6);
200 case 4:
return f*l1*l2*(-4.*sqrt10)*(l2-l1);
202 case 5:
return l2*l3*(-4.*sqrt6);
203 case 6:
return f*l2*l3*(-4.*sqrt10)*(l3-l2);
205 case 7:
return l3*l1*(-4.*sqrt6);
206 case 8:
return f*l3*l1*(-4.*sqrt10)*(l1-l3);
209 case 9:
return l1*l2*l3;
212 libmesh_error_msg(
"Invalid i = " << i);
224 const Real xi = p(0);
225 const Real eta = p(1);
227 libmesh_assert_less (i, 16);
230 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 1, 1, 2, 3, 0, 0, 2, 3, 2, 3};
231 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 2, 2, 3, 3};
233 const Real f = quad_flip(elem, totalorder, i);
256 Real l1 = 1-p(0)-p(1);
262 libmesh_assert_less (i, 15);
278 case 3:
return l1*l2*(-4.*sqrt6);
279 case 4:
return f*l1*l2*(-4.*sqrt10)*(l2-l1);
280 case 5:
return l1*l2*(-sqrt14)*(5.*pow<2>(l2-l1)-1);
282 case 6:
return l2*l3*(-4.*sqrt6);
283 case 7:
return f*l2*l3*(-4.*sqrt10)*(l3-l2);
284 case 8:
return l2*l3*(-sqrt14)*(5.*pow<2>(l3-l2)-1);
286 case 9:
return l3*l1*(-4.*sqrt6);
287 case 10:
return f*l3*l1*(-4.*sqrt10)*(l1-l3);
288 case 11:
return l3*l1*(-sqrt14)*(5.*pow<2>(l1-l3)-1);
291 case 12:
return l1*l2*l3;
293 case 13:
return l1*l2*l3*(l2-l1);
294 case 14:
return l1*l2*l3*(2*l3-1);
297 libmesh_error_msg(
"Invalid i = " << i);
309 const Real xi = p(0);
310 const Real eta = p(1);
312 libmesh_assert_less (i, 25);
315 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4};
316 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4};
318 const Real f = quad_flip(elem, totalorder, i);
341 Real l1 = 1-p(0)-p(1);
346 const Real y=2.*l3-1;
350 libmesh_assert_less (i, 21);
366 case 3:
return l1*l2*(-4.*sqrt6);
367 case 4:
return f*l1*l2*(-4.*sqrt10)*(l2-l1);
368 case 5:
return -sqrt14*l1*l2*(5.0*l1*l1-1.0+(-10.0*l1+5.0*l2)*l2);
369 case 6:
return f*(-sqrt2)*l1*l2*((9.-21.*l1*l1)*l1+(-9.+63.*l1*l1+(-63.*l1+21.*l2)*l2)*l2);
371 case 7:
return l2*l3*(-4.*sqrt6);
372 case 8:
return f*l2*l3*(-4.*sqrt10)*(l3-l2);
373 case 9:
return -sqrt14*l2*l3*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l2)*l2);
374 case 10:
return -f*sqrt2*l2*l3*((-9.0+21.0*l3*l3)*l3+(-63.0*l3*l3+9.0+(63.0*l3-21.0*l2)*l2)*l2);
376 case 11:
return l3*l1*(-4.*sqrt6);
377 case 12:
return f*l3*l1*(-4.*sqrt10)*(l1-l3);
378 case 13:
return -sqrt14*l3*l1*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l1)*l1);
379 case 14:
return f*(-sqrt2)*l3*l1*((9.0-21.0*l3*l3)*l3+(-9.0+63.0*l3*l3+(-63.0*l3+21.0*l1)*l1)*l1);
382 case 15:
return l1*l2*l3;
384 case 16:
return l1*l2*l3*x;
385 case 17:
return l1*l2*l3*y;
387 case 18:
return l1*l2*l3*(1.5*l1*l1-.5+(-3.0*l1+1.5*l2)*l2);
388 case 19:
return l1*l2*l3*x*y;
389 case 20:
return l1*l2*l3*(1.0+(-6.0+6.0*l3)*l3);
392 libmesh_error_msg(
"Invalid i = " << i);
403 const Real xi = p(0);
404 const Real eta = p(1);
406 libmesh_assert_less (i, 36);
409 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5};
410 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
412 const Real f = quad_flip(elem, totalorder, i);
435 Real l1 = 1-p(0)-p(1);
440 const Real y=2.*l3-1;
444 libmesh_assert_less (i, 28);
460 case 3:
return l1*l2*(-4.*sqrt6);
461 case 4:
return f*l1*l2*(-4.*sqrt10)*(l2-l1);
462 case 5:
return -sqrt14*l1*l2*(5.0*l1*l1-1.0+(-10.0*l1+5.0*l2)*l2);
463 case 6:
return f*(-sqrt2)*l1*l2*((9.0-21.0*l1*l1)*l1+(-9.0+63.0*l1*l1+(-63.0*l1+21.0*l2)*l2)*l2);
464 case 7:
return -sqrt22*l1*l2*(0.5+(-7.0+0.105E2*l1*l1)*l1*l1+((14.0-0.42E2*l1*l1)*l1+(-7.0+0.63E2*l1*l1+(-0.42E2*l1+0.105E2*l2)*l2)*l2)*l2);
466 case 8:
return l2*l3*(-4.*sqrt6);
467 case 9:
return f*l2*l3*(-4.*sqrt10)*(l3-l2);
468 case 10:
return -sqrt14*l2*l3*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l2)*l2);
469 case 11:
return f*(-sqrt2)*l2*l3*((-9.0+21.0*l3*l3)*l3+(-63.0*l3*l3+9.0+(63.0*l3-21.0*l2)*l2)*l2);
470 case 12:
return -sqrt22*l2*l3*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l2)*l2)*l2)*l2);
472 case 13:
return l3*l1*(-4.*sqrt6);
473 case 14:
return f*l3*l1*(-4.*sqrt10)*(l1-l3);
474 case 15:
return -sqrt14*l3*l1*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l1)*l1);
475 case 16:
return f*(-sqrt2)*l3*l1*((9.0-21.0*l3*l3)*l3+(-9.0+63.0*l3*l3+(-63.0*l3+21.0*l1)*l1)*l1);
476 case 17:
return -sqrt22*l3*l1*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l1)*l1)*l1)*l1);
481 case 18:
return l1*l2*l3;
483 case 19:
return l1*l2*l3*x;
484 case 20:
return l1*l2*l3*y;
486 case 21:
return 0.5*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2);
487 case 22:
return l1*l2*l3*(l2-l1)*(2.0*l3-1.0);
488 case 23:
return 0.5*l1*l2*l3*(2.0+(-12.0+12.0*l3)*l3);
489 case 24:
return 0.5*l1*l2*l3*((3.0-5.0*l1*l1)*l1+(-3.0+15.0*l1*l1+(-15.0*l1+5.0*l2)*l2)*l2);
490 case 25:
return 0.5*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2)*(2.0*l3-1.0);
491 case 26:
return 0.5*l1*l2*l3*(2.0+(-12.0+12.0*l3)*l3)*(l2-l1);
492 case 27:
return 0.5*l1*l2*l3*(-2.0+(24.0+(-60.0+40.0*l3)*l3)*l3);
496 libmesh_error_msg(
"Invalid i = " << i);
507 const Real xi = p(0);
508 const Real eta = p(1);
510 libmesh_assert_less (i, 49);
513 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6};
514 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6};
516 const Real f = quad_flip(elem, totalorder, i);
541 Real l1 = 1-p(0)-p(1);
546 const Real y=2.*l3-1.;
550 libmesh_assert_less (i, 36);
566 case 3:
return l1*l2*(-4.*sqrt6);
567 case 4:
return f*l1*l2*(-4.*sqrt10)*(l2-l1);
569 case 5:
return -sqrt14*l1*l2*(5.0*l1*l1-1.0+(-10.0*l1+5.0*l2)*l2);
570 case 6:
return f*-sqrt2*l1*l2*((9.0-21.0*l1*l1)*l1+(-9.0+63.0*l1*l1+(-63.0*l1+21.0*l2)*l2)*l2);
571 case 7:
return -sqrt22*l1*l2*(0.5+(-7.0+0.105E2*l1*l1)*l1*l1+((14.0-0.42E2*l1*l1)*l1+(-7.0+0.63E2*l1*l1+(-0.42E2*l1+0.105E2*l2)*l2)*l2)*l2);
572 case 8:
return f*-sqrt26*l1*l2*((-0.25E1+(15.0-0.165E2*l1*l1)*l1*l1)*l1+(0.25E1+(-45.0+0.825E2*l1*l1)*l1*l1+((45.0-0.165E3*l1*l1)*l1+(-15.0+0.165E3*l1*l1+(-0.825E2*l1+0.165E2*l2)*l2)*l2)*l2)*l2);
574 case 9:
return l2*l3*(-4.*sqrt6);
575 case 10:
return f*l2*l3*(-4.*sqrt10)*(l3-l2);
577 case 11:
return -sqrt14*l2*l3*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l2)*l2);
578 case 12:
return f*-sqrt2*l2*l3*((-9.0+21.0*l3*l3)*l3+(-63.0*l3*l3+9.0+(63.0*l3-21.0*l2)*l2)*l2);
579 case 13:
return -sqrt22*l2*l3*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l2)*l2)*l2)*l2);
580 case 14:
return f*-sqrt26*l2*l3*((0.25E1+(-15.0+0.165E2*l3*l3)*l3*l3)*l3+(-0.25E1+(45.0-0.825E2*l3*l3)*l3*l3+((-45.0+0.165E3*l3*l3)*l3+(15.0-0.165E3*l3*l3+(0.825E2*l3-0.165E2*l2)*l2)*l2)*l2)*l2);
582 case 15:
return l3*l1*(-4.*sqrt6);
583 case 16:
return f*l3*l1*(-4.*sqrt10)*(l1-l3);
585 case 17:
return -sqrt14*l3*l1*(5.0*l3*l3-1.0+(-10.0*l3+5.0*l1)*l1);
586 case 18:
return -f*sqrt2*l3*l1*((9.-21.*l3*l3)*l3+(-9.+63.*l3*l3+(-63.*l3+21.*l1)*l1)*l1);
587 case 19:
return -sqrt22*l3*l1*(0.5+(-7.0+0.105E2*l3*l3)*l3*l3+((14.0-0.42E2*l3*l3)*l3+(-7.0+0.63E2*l3*l3+(-0.42E2*l3+0.105E2*l1)*l1)*l1)*l1);
588 case 20:
return f*-sqrt26*l3*l1*((-0.25E1+(15.0-0.165E2*l3*l3)*l3*l3)*l3+(0.25E1+(-45.0+0.825E2*l3*l3)*l3*l3+((45.0-0.165E3*l3*l3)*l3+(-15.0+0.165E3*l3*l3+(-0.825E2*l3+0.165E2*l1)*l1)*l1)*l1)*l1);
592 case 21:
return l1*l2*l3;
594 case 22:
return l1*l2*l3*x;
595 case 23:
return l1*l2*l3*y;
597 case 24:
return l1*l2*l3*0.5*(3.*pow<2>(x)-1.);
598 case 25:
return l1*l2*l3*x*y;
599 case 26:
return l1*l2*l3*0.5*(3.*pow<2>(y)-1.);
601 case 27:
return 0.5*l1*l2*l3*((3.0-5.0*l1*l1)*l1+(-3.0+15.0*l1*l1+(-15.0*l1+5.0*l2)*l2)*l2);
602 case 28:
return 0.5*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2)*(2.0*l3-1.0);
603 case 29:
return 0.5*l1*l2*l3*(2.0+(-12.0+12.0*l3)*l3)*(l2-l1);
604 case 30:
return 0.5*l1*l2*l3*(-2.0+(24.0+(-60.0+40.0*l3)*l3)*l3);
605 case 31:
return 0.125*l1*l2*l3*((-15.0+(70.0-63.0*l1*l1)*l1*l1)*l1+(15.0+(-210.0+315.0*l1*l1)*l1*l1+((210.0-630.0*l1*l1)*l1+(-70.0+630.0*l1*l1+(-315.0*l1+63.0*l2)*l2)*l2)*l2)*l2);
606 case 32:
return 0.5*l1*l2*l3*((3.0-5.0*l1*l1)*l1+(-3.0+15.0*l1*l1+(-15.0*l1+5.0*l2)*l2)*l2)*(2.0*l3-1.0);
607 case 33:
return 0.25*l1*l2*l3*(3.0*l1*l1-1.0+(-6.0*l1+3.0*l2)*l2)*(2.0+(-12.0+12.0*l3)*l3);
608 case 34:
return 0.5*l1*l2*l3*(-2.0+(24.0+(-60.0+40.0*l3)*l3)*l3)*(l2-l1);
609 case 35:
return 0.125*l1*l2*l3*(-8.0+(240.0+(-1680.0+(4480.0+(-5040.0+2016.0*l3)*l3)*l3)*l3)*l3);
612 libmesh_error_msg(
"Invalid i = " << i);
623 const Real xi = p(0);
624 const Real eta = p(1);
626 libmesh_assert_less (i, 64);
629 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7};
630 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7};
632 const Real f = quad_flip(elem, totalorder, i);
649 libmesh_error_msg(
"ERROR: Unsupported polynomial order!");
663 libmesh_error_msg(
"Szabo-Babuska polynomials require the element type \nbecause edge orientation is needed.");
672 const unsigned int i,
674 const bool add_p_level)
686 const unsigned int i,
687 const unsigned int j,
689 const bool add_p_level)
695 const Order totalorder = order + add_p_level*elem->
p_level();
726 const Real xi = p(0);
727 const Real eta = p(1);
729 libmesh_assert_less (i, 9);
732 static const unsigned int i0[] = {0, 1, 1, 0, 2, 1, 2, 0, 2};
733 static const unsigned int i1[] = {0, 0, 1, 1, 0, 2, 1, 2, 2};
748 libmesh_error_msg(
"Invalid j = " << j);
779 const Real xi = p(0);
780 const Real eta = p(1);
782 libmesh_assert_less (i, 16);
785 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 1, 1, 2, 3, 0, 0, 2, 3, 2, 3};
786 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 2, 3, 1, 1, 2, 3, 2, 2, 3, 3};
788 const Real f = quad_flip(elem, totalorder, i);
803 libmesh_error_msg(
"Invalid j = " << j);
836 const Real xi = p(0);
837 const Real eta = p(1);
839 libmesh_assert_less (i, 25);
842 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 0, 0, 0, 2, 3, 4, 2, 3, 4, 2, 3, 4};
843 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 2, 3, 4, 1, 1, 1, 2, 3, 4, 2, 2, 2, 3, 3, 3, 4, 4, 4};
845 const Real f = quad_flip(elem, totalorder, i);
860 libmesh_error_msg(
"Invalid j = " << j);
893 const Real xi = p(0);
894 const Real eta = p(1);
896 libmesh_assert_less (i, 36);
899 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5};
900 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 2, 3, 4, 5, 1, 1, 1, 1, 2, 3, 4, 5, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
902 const Real f = quad_flip(elem, totalorder, i);
917 libmesh_error_msg(
"Invalid j = " << j);
948 const Real xi = p(0);
949 const Real eta = p(1);
951 libmesh_assert_less (i, 49);
954 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6};
955 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6};
957 const Real f = quad_flip(elem, totalorder, i);
972 libmesh_error_msg(
"Invalid j = " << j);
1003 const Real xi = p(0);
1004 const Real eta = p(1);
1006 libmesh_assert_less (i, 64);
1009 static const unsigned int i0[] = {0, 1, 1, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7};
1010 static const unsigned int i1[] = {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7};
1012 const Real f = quad_flip(elem, totalorder, i);
1027 libmesh_error_msg(
"Invalid j = " << j);
1040 libmesh_error_msg(
"ERROR: Unsupported polynomial order!");
1055 libmesh_error_msg(
"Szabo-Babuska polynomials require the element type \nbecause edge orientation is needed.");
1063 const unsigned int i,
1064 const unsigned int j,
1066 const bool add_p_level)
1074#ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
1083 static bool warning_given =
false;
1086 libMesh::err <<
"Second derivatives for Szabab elements "
1087 <<
" are not yet implemented!"
1090 warning_given =
true;
1104 static bool warning_given =
false;
1107 libMesh::err <<
"Second derivatives for Szabab elements "
1108 <<
" are not yet implemented!"
1111 warning_given =
true;
1124 static bool warning_given =
false;
1127 libMesh::err <<
"Second derivatives for Szabab elements "
1128 <<
" are not yet implemented!"
1131 warning_given =
true;
This is the base class from which all geometric element types are derived.
bool positive_edge_orientation(const unsigned int i) const
virtual ElemType type() const =0
unsigned int p_level() const
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
OrderWrapper order
The approximation order of the element (at 0 p-refinement level).
A specific instantiation of the FEBase class.
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
A Point defines a location in LIBMESH_DIM dimensional Real space.
std::string enum_to_string(const T e)
The libMesh namespace provides an interface to certain functionality in the library.
LIBMESH_DEFAULT_VECTORIZED_FE(template<>Real FE< 0, BERNSTEIN)
OutputShape fe_fdm_deriv(const Elem *elem, const Order order, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level, OutputShape(*shape_func)(const Elem *, const Order, const unsigned int, const Point &, const bool))
Helper functions for finite differenced derivatives in cases where analytical calculations haven't be...
ElemType
Defines an enum for geometric element types.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real