20 #include "libmesh/fe.h"    21 #include "libmesh/elem.h"    22 #include "libmesh/fe_interface.h"    23 #include "libmesh/enum_to_string.h"    37 Real d1d2n, d1d3n, d2d3n, d2d1n, d3d1n, d3d2n;
    38 Real d1xd1x, d1xd1y, d1xd2n, d1xd3n;
    39 Real d1yd1x, d1yd1y, d1yd2n, d1yd3n;
    40 Real d2xd2x, d2xd2y, d2xd3n, d2xd1n;
    41 Real d2yd2x, d2yd2y, d2yd3n, d2yd1n;
    42 Real d3xd3x, d3xd3y, d3xd1n, d3xd2n;
    43 Real d3yd3x, d3yd3y, d3yd1n, d3yd2n;
    44 Real d1nd1n, d2nd2n, d3nd3n;
    47 Real N01x, N01y, N10x, N10y;
    48 Real N02x, N02y, N20x, N20y;
    49 Real N21x, N21y, N12x, N12y;
    52 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES    54 Real clough_raw_shape_second_deriv(
const unsigned int basis_num,
    55                                    const unsigned int deriv_type,
    59 Real clough_raw_shape_deriv(
const unsigned int basis_num,
    60                             const unsigned int deriv_type,
    62 Real clough_raw_shape(
const unsigned int basis_num,
    64 unsigned char subtriangle_lookup(
const Point & p);
    68 void clough_compute_coefs(
const Elem * elem, CloughCoefs & coefs)
    75   const int n_mapping_shape_functions =
    79   std::vector<Point> dofpt;
    80   dofpt.push_back(
Point(0,0));
    81   dofpt.push_back(
Point(1,0));
    82   dofpt.push_back(
Point(0,1));
    83   dofpt.push_back(
Point(1/2.,1/2.));
    84   dofpt.push_back(
Point(0,1/2.));
    85   dofpt.push_back(
Point(1/2.,0));
    88   std::vector<Real> dxdxi(6), dxdeta(6), dydxi(6), dydeta(6);
    89   std::vector<Real> dxidx(6), detadx(6), dxidy(6), detady(6);
    94   for (
int p = 0; p != 6; ++p)
    97       for (
int i = 0; i != n_mapping_shape_functions; ++i)
    99           const Real ddxi = shape_deriv_ptr
   100             (map_fe_type, elem, i, 0, dofpt[p], 
false);
   101           const Real ddeta = shape_deriv_ptr
   102             (map_fe_type, elem, i, 1, dofpt[p], 
false);
   107           dxdxi[p] += elem->
point(i)(0) * ddxi;
   108           dydxi[p] += elem->
point(i)(1) * ddxi;
   109           dxdeta[p] += elem->
point(i)(0) * ddeta;
   110           dydeta[p] += elem->
point(i)(1) * ddeta;
   123       const Real inv_jac = 1. / (dxdxi[p]*dydeta[p] -
   125       dxidx[p] = dydeta[p] * inv_jac;
   126       dxidy[p] = - dxdeta[p] * inv_jac;
   127       detadx[p] = - dydxi[p] * inv_jac;
   128       detady[p] = dxdxi[p] * inv_jac;
   132   Real N1x = dydeta[3] - dydxi[3];
   133   Real N1y = dxdxi[3] - dxdeta[3];
   134   Real Nlength = std::sqrt(static_cast<Real>(N1x*N1x + N1y*N1y));
   135   N1x /= Nlength; N1y /= Nlength;
   137   Real N2x = - dydeta[4];
   138   Real N2y = dxdeta[4];
   139   Nlength = std::sqrt(static_cast<Real>(N2x*N2x + N2y*N2y));
   140   N2x /= Nlength; N2y /= Nlength;
   143   Real N3y = - dxdxi[5];
   144   Nlength = std::sqrt(static_cast<Real>(N3x*N3x + N3y*N3y));
   145   N3x /= Nlength; N3y /= Nlength;
   148   coefs.N01x = dydxi[0];
   149   coefs.N01y = - dxdxi[0];
   150   Nlength = std::sqrt(static_cast<Real>(coefs.N01x*coefs.N01x + coefs.N01y*coefs.N01y));
   151   coefs.N01x /= Nlength; coefs.N01y /= Nlength;
   153   coefs.N10x = dydxi[1];
   154   coefs.N10y = - dxdxi[1];
   155   Nlength = std::sqrt(static_cast<Real>(coefs.N10x*coefs.N10x + coefs.N10y*coefs.N10y));
   156   coefs.N10x /= Nlength; coefs.N10y /= Nlength;
   158   coefs.N02x = - dydeta[0];
   159   coefs.N02y = dxdeta[0];
   160   Nlength = std::sqrt(static_cast<Real>(coefs.N02x*coefs.N02x + coefs.N02y*coefs.N02y));
   161   coefs.N02x /= Nlength; coefs.N02y /= Nlength;
   163   coefs.N20x = - dydeta[2];
   164   coefs.N20y = dxdeta[2];
   165   Nlength = std::sqrt(static_cast<Real>(coefs.N20x*coefs.N20x + coefs.N20y*coefs.N20y));
   166   coefs.N20x /= Nlength; coefs.N20y /= Nlength;
   168   coefs.N12x = dydeta[1] - dydxi[1];
   169   coefs.N12y = dxdxi[1] - dxdeta[1];
   170   Nlength = std::sqrt(static_cast<Real>(coefs.N12x*coefs.N12x + coefs.N12y*coefs.N12y));
   171   coefs.N12x /= Nlength; coefs.N12y /= Nlength;
   173   coefs.N21x = dydeta[1] - dydxi[1];
   174   coefs.N21y = dxdxi[1] - dxdeta[1];
   175   Nlength = std::sqrt(static_cast<Real>(coefs.N21x*coefs.N21x + coefs.N21y*coefs.N21y));
   176   coefs.N21x /= Nlength; coefs.N21y /= Nlength;
   198       N1x = -N1x; N1y = -N1y;
   199       coefs.N12x = -coefs.N12x; coefs.N12y = -coefs.N12y;
   200       coefs.N21x = -coefs.N21x; coefs.N21y = -coefs.N21y;
   216       N2x = -N2x; N2y = -N2y;
   217       coefs.N02x = -coefs.N02x; coefs.N02y = -coefs.N02y;
   218       coefs.N20x = -coefs.N20x; coefs.N20y = -coefs.N20y;
   236       coefs.N01x = -coefs.N01x; coefs.N01y = -coefs.N01y;
   237       coefs.N10x = -coefs.N10x; coefs.N10y = -coefs.N10y;
   257   Real d1d2ndxi   = clough_raw_shape_deriv(0, 0, dofpt[4]);
   258   Real d1d2ndeta  = clough_raw_shape_deriv(0, 1, dofpt[4]);
   259   Real d1d2ndx = d1d2ndxi * dxidx[4] + d1d2ndeta * detadx[4];
   260   Real d1d2ndy = d1d2ndxi * dxidy[4] + d1d2ndeta * detady[4];
   261   Real d1d3ndxi   = clough_raw_shape_deriv(0, 0, dofpt[5]);
   262   Real d1d3ndeta  = clough_raw_shape_deriv(0, 1, dofpt[5]);
   263   Real d1d3ndx = d1d3ndxi * dxidx[5] + d1d3ndeta * detadx[5];
   264   Real d1d3ndy = d1d3ndxi * dxidy[5] + d1d3ndeta * detady[5];
   265   Real d2d3ndxi   = clough_raw_shape_deriv(1, 0, dofpt[5]);
   266   Real d2d3ndeta  = clough_raw_shape_deriv(1, 1, dofpt[5]);
   267   Real d2d3ndx = d2d3ndxi * dxidx[5] + d2d3ndeta * detadx[5];
   268   Real d2d3ndy = d2d3ndxi * dxidy[5] + d2d3ndeta * detady[5];
   269   Real d2d1ndxi   = clough_raw_shape_deriv(1, 0, dofpt[3]);
   270   Real d2d1ndeta  = clough_raw_shape_deriv(1, 1, dofpt[3]);
   271   Real d2d1ndx = d2d1ndxi * dxidx[3] + d2d1ndeta * detadx[3];
   272   Real d2d1ndy = d2d1ndxi * dxidy[3] + d2d1ndeta * detady[3];
   273   Real d3d1ndxi   = clough_raw_shape_deriv(2, 0, dofpt[3]);
   274   Real d3d1ndeta  = clough_raw_shape_deriv(2, 1, dofpt[3]);
   275   Real d3d1ndx = d3d1ndxi * dxidx[3] + d3d1ndeta * detadx[3];
   276   Real d3d1ndy = d3d1ndxi * dxidy[3] + d3d1ndeta * detady[3];
   277   Real d3d2ndxi   = clough_raw_shape_deriv(2, 0, dofpt[4]);
   278   Real d3d2ndeta  = clough_raw_shape_deriv(2, 1, dofpt[4]);
   279   Real d3d2ndx = d3d2ndxi * dxidx[4] + d3d2ndeta * detadx[4];
   280   Real d3d2ndy = d3d2ndxi * dxidy[4] + d3d2ndeta * detady[4];
   281   Real d1xd2ndxi  = clough_raw_shape_deriv(3, 0, dofpt[4]);
   282   Real d1xd2ndeta = clough_raw_shape_deriv(3, 1, dofpt[4]);
   283   Real d1xd2ndx = d1xd2ndxi * dxidx[4] + d1xd2ndeta * detadx[4];
   284   Real d1xd2ndy = d1xd2ndxi * dxidy[4] + d1xd2ndeta * detady[4];
   285   Real d1xd3ndxi  = clough_raw_shape_deriv(3, 0, dofpt[5]);
   286   Real d1xd3ndeta = clough_raw_shape_deriv(3, 1, dofpt[5]);
   287   Real d1xd3ndx = d1xd3ndxi * dxidx[5] + d1xd3ndeta * detadx[5];
   288   Real d1xd3ndy = d1xd3ndxi * dxidy[5] + d1xd3ndeta * detady[5];
   289   Real d1yd2ndxi  = clough_raw_shape_deriv(4, 0, dofpt[4]);
   290   Real d1yd2ndeta = clough_raw_shape_deriv(4, 1, dofpt[4]);
   291   Real d1yd2ndx = d1yd2ndxi * dxidx[4] + d1yd2ndeta * detadx[4];
   292   Real d1yd2ndy = d1yd2ndxi * dxidy[4] + d1yd2ndeta * detady[4];
   293   Real d1yd3ndxi  = clough_raw_shape_deriv(4, 0, dofpt[5]);
   294   Real d1yd3ndeta = clough_raw_shape_deriv(4, 1, dofpt[5]);
   295   Real d1yd3ndx = d1yd3ndxi * dxidx[5] + d1yd3ndeta * detadx[5];
   296   Real d1yd3ndy = d1yd3ndxi * dxidy[5] + d1yd3ndeta * detady[5];
   297   Real d2xd3ndxi  = clough_raw_shape_deriv(5, 0, dofpt[5]);
   298   Real d2xd3ndeta = clough_raw_shape_deriv(5, 1, dofpt[5]);
   299   Real d2xd3ndx = d2xd3ndxi * dxidx[5] + d2xd3ndeta * detadx[5];
   300   Real d2xd3ndy = d2xd3ndxi * dxidy[5] + d2xd3ndeta * detady[5];
   301   Real d2xd1ndxi  = clough_raw_shape_deriv(5, 0, dofpt[3]);
   302   Real d2xd1ndeta = clough_raw_shape_deriv(5, 1, dofpt[3]);
   303   Real d2xd1ndx = d2xd1ndxi * dxidx[3] + d2xd1ndeta * detadx[3];
   304   Real d2xd1ndy = d2xd1ndxi * dxidy[3] + d2xd1ndeta * detady[3];
   305   Real d2yd3ndxi  = clough_raw_shape_deriv(6, 0, dofpt[5]);
   306   Real d2yd3ndeta = clough_raw_shape_deriv(6, 1, dofpt[5]);
   307   Real d2yd3ndx = d2yd3ndxi * dxidx[5] + d2yd3ndeta * detadx[5];
   308   Real d2yd3ndy = d2yd3ndxi * dxidy[5] + d2yd3ndeta * detady[5];
   309   Real d2yd1ndxi  = clough_raw_shape_deriv(6, 0, dofpt[3]);
   310   Real d2yd1ndeta = clough_raw_shape_deriv(6, 1, dofpt[3]);
   311   Real d2yd1ndx = d2yd1ndxi * dxidx[3] + d2yd1ndeta * detadx[3];
   312   Real d2yd1ndy = d2yd1ndxi * dxidy[3] + d2yd1ndeta * detady[3];
   313   Real d3xd1ndxi  = clough_raw_shape_deriv(7, 0, dofpt[3]);
   314   Real d3xd1ndeta = clough_raw_shape_deriv(7, 1, dofpt[3]);
   315   Real d3xd1ndx = d3xd1ndxi * dxidx[3] + d3xd1ndeta * detadx[3];
   316   Real d3xd1ndy = d3xd1ndxi * dxidy[3] + d3xd1ndeta * detady[3];
   317   Real d3xd2ndxi  = clough_raw_shape_deriv(7, 0, dofpt[4]);
   318   Real d3xd2ndeta = clough_raw_shape_deriv(7, 1, dofpt[4]);
   319   Real d3xd2ndx = d3xd2ndxi * dxidx[4] + d3xd2ndeta * detadx[4];
   320   Real d3xd2ndy = d3xd2ndxi * dxidy[4] + d3xd2ndeta * detady[4];
   321   Real d3yd1ndxi  = clough_raw_shape_deriv(8, 0, dofpt[3]);
   322   Real d3yd1ndeta = clough_raw_shape_deriv(8, 1, dofpt[3]);
   323   Real d3yd1ndx = d3yd1ndxi * dxidx[3] + d3yd1ndeta * detadx[3];
   324   Real d3yd1ndy = d3yd1ndxi * dxidy[3] + d3yd1ndeta * detady[3];
   325   Real d3yd2ndxi  = clough_raw_shape_deriv(8, 0, dofpt[4]);
   326   Real d3yd2ndeta = clough_raw_shape_deriv(8, 1, dofpt[4]);
   327   Real d3yd2ndx = d3yd2ndxi * dxidx[4] + d3yd2ndeta * detadx[4];
   328   Real d3yd2ndy = d3yd2ndxi * dxidy[4] + d3yd2ndeta * detady[4];
   329   Real d1nd1ndxi  = clough_raw_shape_deriv(9, 0, dofpt[3]);
   330   Real d1nd1ndeta = clough_raw_shape_deriv(9, 1, dofpt[3]);
   331   Real d1nd1ndx = d1nd1ndxi * dxidx[3] + d1nd1ndeta * detadx[3];
   332   Real d1nd1ndy = d1nd1ndxi * dxidy[3] + d1nd1ndeta * detady[3];
   333   Real d2nd2ndxi  = clough_raw_shape_deriv(10, 0, dofpt[4]);
   334   Real d2nd2ndeta = clough_raw_shape_deriv(10, 1, dofpt[4]);
   335   Real d2nd2ndx = d2nd2ndxi * dxidx[4] + d2nd2ndeta * detadx[4];
   336   Real d2nd2ndy = d2nd2ndxi * dxidy[4] + d2nd2ndeta * detady[4];
   337   Real d3nd3ndxi  = clough_raw_shape_deriv(11, 0, dofpt[5]);
   338   Real d3nd3ndeta = clough_raw_shape_deriv(11, 1, dofpt[5]);
   339   Real d3nd3ndx = d3nd3ndxi * dxidx[3] + d3nd3ndeta * detadx[3];
   340   Real d3nd3ndy = d3nd3ndxi * dxidy[3] + d3nd3ndeta * detady[3];
   342   Real d1xd1dxi   = clough_raw_shape_deriv(3, 0, dofpt[0]);
   343   Real d1xd1deta  = clough_raw_shape_deriv(3, 1, dofpt[0]);
   344   Real d1xd1dx    = d1xd1dxi * dxidx[0] + d1xd1deta * detadx[0];
   345   Real d1xd1dy    = d1xd1dxi * dxidy[0] + d1xd1deta * detady[0];
   346   Real d1yd1dxi   = clough_raw_shape_deriv(4, 0, dofpt[0]);
   347   Real d1yd1deta  = clough_raw_shape_deriv(4, 1, dofpt[0]);
   348   Real d1yd1dx    = d1yd1dxi * dxidx[0] + d1yd1deta * detadx[0];
   349   Real d1yd1dy    = d1yd1dxi * dxidy[0] + d1yd1deta * detady[0];
   350   Real d2xd2dxi   = clough_raw_shape_deriv(5, 0, dofpt[1]);
   351   Real d2xd2deta  = clough_raw_shape_deriv(5, 1, dofpt[1]);
   352   Real d2xd2dx    = d2xd2dxi * dxidx[1] + d2xd2deta * detadx[1];
   353   Real d2xd2dy    = d2xd2dxi * dxidy[1] + d2xd2deta * detady[1];
   373   Real d2yd2dxi   = clough_raw_shape_deriv(6, 0, dofpt[1]);
   374   Real d2yd2deta  = clough_raw_shape_deriv(6, 1, dofpt[1]);
   375   Real d2yd2dx    = d2yd2dxi * dxidx[1] + d2yd2deta * detadx[1];
   376   Real d2yd2dy    = d2yd2dxi * dxidy[1] + d2yd2deta * detady[1];
   377   Real d3xd3dxi   = clough_raw_shape_deriv(7, 0, dofpt[2]);
   378   Real d3xd3deta  = clough_raw_shape_deriv(7, 1, dofpt[2]);
   379   Real d3xd3dx    = d3xd3dxi * dxidx[1] + d3xd3deta * detadx[1];
   380   Real d3xd3dy    = d3xd3dxi * dxidy[1] + d3xd3deta * detady[1];
   381   Real d3yd3dxi   = clough_raw_shape_deriv(8, 0, dofpt[2]);
   382   Real d3yd3deta  = clough_raw_shape_deriv(8, 1, dofpt[2]);
   383   Real d3yd3dx    = d3yd3dxi * dxidx[1] + d3yd3deta * detadx[1];
   384   Real d3yd3dy    = d3yd3dxi * dxidy[1] + d3yd3deta * detady[1];
   388   Real d1nd1ndn = d1nd1ndx * N1x + d1nd1ndy * N1y;
   389   Real d1xd2ndn = d1xd2ndx * N2x + d1xd2ndy * N2y;
   390   Real d1xd3ndn = d1xd3ndx * N3x + d1xd3ndy * N3y;
   391   Real d1yd2ndn = d1yd2ndx * N2x + d1yd2ndy * N2y;
   392   Real d1yd3ndn = d1yd3ndx * N3x + d1yd3ndy * N3y;
   394   Real d2nd2ndn = d2nd2ndx * N2x + d2nd2ndy * N2y;
   395   Real d2xd3ndn = d2xd3ndx * N3x + d2xd3ndy * N3y;
   396   Real d2xd1ndn = d2xd1ndx * N1x + d2xd1ndy * N1y;
   397   Real d2yd3ndn = d2yd3ndx * N3x + d2yd3ndy * N3y;
   398   Real d2yd1ndn = d2yd1ndx * N1x + d2yd1ndy * N1y;
   400   Real d3nd3ndn = d3nd3ndx * N3x + d3nd3ndy * N3y;
   401   Real d3xd1ndn = d3xd1ndx * N1x + d3xd1ndy * N1y;
   402   Real d3xd2ndn = d3xd2ndx * N2x + d3xd2ndy * N2y;
   403   Real d3yd1ndn = d3yd1ndx * N1x + d3yd1ndy * N1y;
   404   Real d3yd2ndn = d3yd2ndx * N2x + d3yd2ndy * N2y;
   408   coefs.d1nd1n = 1. / d1nd1ndn;
   409   coefs.d2nd2n = 1. / d2nd2ndn;
   410   coefs.d3nd3n = 1. / d3nd3ndn;
   415   coefs.d1d2n = -(d1d2ndx * N2x + d1d2ndy * N2y) / d2nd2ndn;
   416   coefs.d1d3n = -(d1d3ndx * N3x + d1d3ndy * N3y) / d3nd3ndn;
   417   coefs.d2d3n = -(d2d3ndx * N3x + d2d3ndy * N3y) / d3nd3ndn;
   418   coefs.d2d1n = -(d2d1ndx * N1x + d2d1ndy * N1y) / d1nd1ndn;
   419   coefs.d3d1n = -(d3d1ndx * N1x + d3d1ndy * N1y) / d1nd1ndn;
   420   coefs.d3d2n = -(d3d2ndx * N2x + d3d2ndy * N2y) / d2nd2ndn;
   424   coefs.d1xd1x = d1yd1dy / (d1yd1dy * d1xd1dx - d1xd1dy * d1yd1dx);
   425   coefs.d1xd1y = d1xd1dy / (d1xd1dy * d1yd1dx - d1xd1dx * d1yd1dy);
   427   coefs.d1yd1y = d1xd1dx / (d1xd1dx * d1yd1dy - d1yd1dx * d1xd1dy);
   428   coefs.d1yd1x = d1yd1dx / (d1yd1dx * d1xd1dy - d1yd1dy * d1xd1dx);
   430   coefs.d2xd2x = d2yd2dy / (d2yd2dy * d2xd2dx - d2xd2dy * d2yd2dx);
   431   coefs.d2xd2y = d2xd2dy / (d2xd2dy * d2yd2dx - d2xd2dx * d2yd2dy);
   433   coefs.d2yd2y = d2xd2dx / (d2xd2dx * d2yd2dy - d2yd2dx * d2xd2dy);
   434   coefs.d2yd2x = d2yd2dx / (d2yd2dx * d2xd2dy - d2yd2dy * d2xd2dx);
   436   coefs.d3xd3x = d3yd3dy / (d3yd3dy * d3xd3dx - d3xd3dy * d3yd3dx);
   437   coefs.d3xd3y = d3xd3dy / (d3xd3dy * d3yd3dx - d3xd3dx * d3yd3dy);
   439   coefs.d3yd3y = d3xd3dx / (d3xd3dx * d3yd3dy - d3yd3dx * d3xd3dy);
   440   coefs.d3yd3x = d3yd3dx / (d3yd3dx * d3xd3dy - d3yd3dy * d3xd3dx);
   459   coefs.d1xd2n = -(coefs.d1xd1x * d1xd2ndn + coefs.d1xd1y * d1yd2ndn) / d2nd2ndn;
   460   coefs.d1yd2n = -(coefs.d1yd1y * d1yd2ndn + coefs.d1yd1x * d1xd2ndn) / d2nd2ndn;
   461   coefs.d1xd3n = -(coefs.d1xd1x * d1xd3ndn + coefs.d1xd1y * d1yd3ndn) / d3nd3ndn;
   462   coefs.d1yd3n = -(coefs.d1yd1y * d1yd3ndn + coefs.d1yd1x * d1xd3ndn) / d3nd3ndn;
   463   coefs.d2xd3n = -(coefs.d2xd2x * d2xd3ndn + coefs.d2xd2y * d2yd3ndn) / d3nd3ndn;
   464   coefs.d2yd3n = -(coefs.d2yd2y * d2yd3ndn + coefs.d2yd2x * d2xd3ndn) / d3nd3ndn;
   465   coefs.d2xd1n = -(coefs.d2xd2x * d2xd1ndn + coefs.d2xd2y * d2yd1ndn) / d1nd1ndn;
   466   coefs.d2yd1n = -(coefs.d2yd2y * d2yd1ndn + coefs.d2yd2x * d2xd1ndn) / d1nd1ndn;
   467   coefs.d3xd1n = -(coefs.d3xd3x * d3xd1ndn + coefs.d3xd3y * d3yd1ndn) / d1nd1ndn;
   468   coefs.d3yd1n = -(coefs.d3yd3y * d3yd1ndn + coefs.d3yd3x * d3xd1ndn) / d1nd1ndn;
   469   coefs.d3xd2n = -(coefs.d3xd3x * d3xd2ndn + coefs.d3xd3y * d3yd2ndn) / d2nd2ndn;
   470   coefs.d3yd2n = -(coefs.d3yd3y * d3yd2ndn + coefs.d3yd3x * d3xd2ndn) / d2nd2ndn;
   517 unsigned char subtriangle_lookup(
const Point & p)
   519   if ((p(0) >= p(1)) && (p(0) + 2 * p(1) <= 1))
   521   if ((p(0) <= p(1)) && (p(1) + 2 * p(0) <= 1))
   527 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES   530 Real clough_raw_shape_second_deriv(
const unsigned int basis_num,
   531                                    const unsigned int deriv_type,
   534   Real xi = p(0), eta = p(1);
   544           switch (subtriangle_lookup(p))
   549               return -30 + 42*xi + 42*eta;
   551               return -6 + 18*xi - 6*eta;
   554               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   555                                 subtriangle_lookup(p));
   558           switch (subtriangle_lookup(p))
   563               return 18 - 27*xi - 21*eta;
   565               return 6 - 15*xi + 3*eta;
   568               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   569                                 subtriangle_lookup(p));
   572           switch (subtriangle_lookup(p))
   577               return 12 - 15*xi - 21*eta;
   579               return -3*xi + 3*eta;
   582               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   583                                 subtriangle_lookup(p));
   586           switch (subtriangle_lookup(p))
   591               return -9 + 13*xi + 8*eta;
   593               return -1 - 7*xi + 4*eta;
   596               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   597                                 subtriangle_lookup(p));
   600           switch (subtriangle_lookup(p))
   605               return 1 - 2*xi + 3*eta;
   607               return -3 + 14*xi - eta;
   610               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   611                                 subtriangle_lookup(p));
   614           switch (subtriangle_lookup(p))
   619               return -4 + 17./2.*xi + 7./2.*eta;
   621               return -2 + 13./2.*xi - 1./2.*eta;
   624               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   625                                 subtriangle_lookup(p));
   628           switch (subtriangle_lookup(p))
   633               return 9 - 23./2.*xi - 23./2.*eta;
   635               return -1 + 5./2.*xi + 9./2.*eta;
   638               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   639                                 subtriangle_lookup(p));
   642           switch (subtriangle_lookup(p))
   647               return 7 - 17./2.*xi - 25./2.*eta;
   649               return 1 - 13./2.*xi + 7./2.*eta;
   652               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   653                                 subtriangle_lookup(p));
   656           switch (subtriangle_lookup(p))
   661               return -2 + 5./2.*xi + 7./2.*eta;
   663               return 1./2.*xi - 1./2.*eta;
   666               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   667                                 subtriangle_lookup(p));
   670           switch (subtriangle_lookup(p))
   675               return std::sqrt(
Real(2)) * (8 - 10*xi - 14*eta);
   677               return std::sqrt(
Real(2)) * (-2*xi + 2*eta);
   680               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   681                                 subtriangle_lookup(p));
   684           switch (subtriangle_lookup(p))
   689               return -4 + 4*xi + 8*eta;
   691               return -4 + 20*xi - 8*eta;
   694               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   695                                 subtriangle_lookup(p));
   698           switch (subtriangle_lookup(p))
   703               return -12 + 16*xi + 12*eta;
   705               return 4 - 16*xi - 4*eta;
   708               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   709                                 subtriangle_lookup(p));
   713           libmesh_error_msg(
"Invalid shape function index i = " <<
   722           switch (subtriangle_lookup(p))
   733               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   734                                 subtriangle_lookup(p));
   737           switch (subtriangle_lookup(p))
   742               return 15 - 21*xi - 21*eta;
   747               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   748                                 subtriangle_lookup(p));
   751           switch (subtriangle_lookup(p))
   756               return 15 - 21*xi - 21*eta;
   761               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   762                                 subtriangle_lookup(p));
   765           switch (subtriangle_lookup(p))
   770               return -4 + 8*xi + 3*eta;
   772               return -3 + 4*xi + 4*eta;
   775               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   776                                 subtriangle_lookup(p));
   779           switch (subtriangle_lookup(p))
   782               return -3 + 4*xi + 4*eta;
   784               return - 4 + 3*xi + 8*eta;
   789               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   790                                 subtriangle_lookup(p));
   793           switch (subtriangle_lookup(p))
   798               return -5./2. + 7./2.*xi + 7./2.*eta;
   803               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   804                                 subtriangle_lookup(p));
   807           switch (subtriangle_lookup(p))
   810               return -1 + 4*xi + 7./2.*eta;
   812               return 19./2. - 23./2.*xi - 25./2.*eta;
   817               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   818                                 subtriangle_lookup(p));
   821           switch (subtriangle_lookup(p))
   826               return 19./2. - 25./2.*xi - 23./2.*eta;
   828               return -1 + 7./2.*xi + 4*eta;
   831               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   832                                 subtriangle_lookup(p));
   835           switch (subtriangle_lookup(p))
   840               return -5./2. + 7./2.*xi + 7./2.*eta;
   845               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   846                                 subtriangle_lookup(p));
   849           switch (subtriangle_lookup(p))
   852               return std::sqrt(
Real(2)) * (2*eta);
   854               return std::sqrt(
Real(2)) * (10 - 14*xi - 14*eta);
   856               return std::sqrt(
Real(2)) * (2*xi);
   859               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   860                                 subtriangle_lookup(p));
   863           switch (subtriangle_lookup(p))
   868               return - 8 + 8*xi + 12*eta;
   870               return 4 - 8*xi - 8*eta;
   873               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   874                                 subtriangle_lookup(p));
   877           switch (subtriangle_lookup(p))
   880               return 4 - 8*xi - 8*eta;
   882               return -8 + 12*xi + 8*eta;
   887               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   888                                 subtriangle_lookup(p));
   892           libmesh_error_msg(
"Invalid shape function index i = " <<
   901           switch (subtriangle_lookup(p))
   904               return -6 - 6*xi + 18*eta;
   906               return -30 + 42*xi + 42*eta;
   911               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   912                                 subtriangle_lookup(p));
   915           switch (subtriangle_lookup(p))
   920               return 12 - 21*xi - 15*eta;
   925               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   926                                 subtriangle_lookup(p));
   929           switch (subtriangle_lookup(p))
   932               return 6 + 3*xi - 15*eta;
   934               return 18 - 21.*xi - 27*eta;
   939               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   940                                 subtriangle_lookup(p));
   943           switch (subtriangle_lookup(p))
   946               return -3 - xi + 14*eta;
   948               return 1 + 3*xi - 2*eta;
   953               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   954                                 subtriangle_lookup(p));
   957           switch (subtriangle_lookup(p))
   960               return -1 + 4*xi - 7*eta;
   962               return -9 + 8*xi + 13*eta;
   967               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   968                                 subtriangle_lookup(p));
   971           switch (subtriangle_lookup(p))
   974               return - 1./2.*xi + 1./2.*eta;
   976               return -2 + 7./2.*xi + 5./2.*eta;
   981               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   982                                 subtriangle_lookup(p));
   985           switch (subtriangle_lookup(p))
   988               return 1 + 7./2.*xi - 13./2.*eta;
   990               return 7 - 25./2.*xi - 17./2.*eta;
   995               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
   996                                 subtriangle_lookup(p));
   999           switch (subtriangle_lookup(p))
  1002               return -1 + 9./2.*xi + 5./2.*eta;
  1004               return 9 - 23./2.*xi - 23./2.*eta;
  1009               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1010                                 subtriangle_lookup(p));
  1013           switch (subtriangle_lookup(p))
  1016               return -2 - 1./2.*xi + 13./2.*eta;
  1018               return -4 + 7./2.*xi + 17./2.*eta;
  1023               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1024                                 subtriangle_lookup(p));
  1027           switch (subtriangle_lookup(p))
  1030               return std::sqrt(
Real(2)) * (2*xi - 2*eta);
  1032               return std::sqrt(
Real(2)) * (8 - 14*xi - 10*eta);
  1037               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1038                                 subtriangle_lookup(p));
  1041           switch (subtriangle_lookup(p))
  1044               return 4 - 4*xi - 16*eta;
  1046               return -12 + 12*xi + 16*eta;
  1051               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1052                                 subtriangle_lookup(p));
  1055           switch (subtriangle_lookup(p))
  1058               return -4 - 8*xi + 20*eta;
  1060               return -4 + 8*xi + 4*eta;
  1065               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1066                                 subtriangle_lookup(p));
  1070           libmesh_error_msg(
"Invalid shape function index i = " <<
  1075       libmesh_error_msg(
"Invalid shape function derivative j = " <<
  1084 Real clough_raw_shape_deriv(
const unsigned int basis_num,
  1085                             const unsigned int deriv_type,
  1088   Real xi = p(0), eta = p(1);
  1097           switch (subtriangle_lookup(p))
  1100               return -6*xi + 6*xi*xi
  1103               return 9 - 30*xi + 21*xi*xi
  1104                 - 30*eta + 42*xi*eta
  1107               return -6*xi + 9*xi*xi
  1111               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1112                                 subtriangle_lookup(p));
  1115           switch (subtriangle_lookup(p))
  1118               return 6*xi - 6*xi*xi
  1121               return - 9./2. + 18*xi - 27./2.*xi*xi
  1122                 + 15*eta - 21*xi*eta
  1125               return 6*xi - 15./2.*xi*xi
  1129               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1130                                 subtriangle_lookup(p));
  1133           switch (subtriangle_lookup(p))
  1136               return 3./2.*eta*eta;
  1138               return - 9./2. + 12*xi - 15./2.*xi*xi
  1139                 + 15*eta - 21*xi*eta
  1146               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1147                                 subtriangle_lookup(p));
  1150           switch (subtriangle_lookup(p))
  1153               return 1 - 4*xi + 3*xi*xi
  1156               return 5./2. - 9*xi + 13./2.*xi*xi
  1160               return 1 - xi - 7./2.*xi*xi
  1165               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1166                                 subtriangle_lookup(p));
  1169           switch (subtriangle_lookup(p))
  1172               return - 3*eta + 4*xi*eta
  1179               return -3*xi + 7*xi*xi
  1183               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1184                                 subtriangle_lookup(p));
  1187           switch (subtriangle_lookup(p))
  1190               return -2*xi + 3*xi*xi
  1193               return 3./4. - 4*xi + 17./4.*xi*xi
  1194                 - 5./2.*eta + 7./2.*xi*eta
  1197               return -2*xi + 13./4.*xi*xi
  1201               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1202                                 subtriangle_lookup(p));
  1205           switch (subtriangle_lookup(p))
  1208               return -eta + 4*xi*eta
  1211               return -13./4. + 9*xi - 23./4.*xi*xi
  1212                 + 19./2.*eta - 23./2.*xi*eta
  1215               return -xi + 5./4.*xi*xi
  1219               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1220                                 subtriangle_lookup(p));
  1223           switch (subtriangle_lookup(p))
  1226               return 9./4.*eta*eta;
  1228               return - 11./4. + 7*xi - 17./4.*xi*xi
  1229                 + 19./2.*eta - 25./2.*xi*eta
  1232               return xi - 13./4.*xi*xi
  1233                 - eta + 7./2.*xi*eta + 2*eta*eta;
  1236               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1237                                 subtriangle_lookup(p));
  1240           switch (subtriangle_lookup(p))
  1243               return - 1./4.*eta*eta;
  1245               return 3./4. - 2*xi + 5./4.*xi*xi
  1246                 - 5./2.*eta + 7./2.*xi*eta
  1253               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1254                                 subtriangle_lookup(p));
  1257           switch (subtriangle_lookup(p))
  1260               return std::sqrt(
Real(2)) * eta*eta;
  1262               return std::sqrt(
Real(2)) * (-3 + 8*xi - 5*xi*xi
  1263                                       + 10*eta - 14*xi*eta
  1266               return std::sqrt(
Real(2)) * (-xi*xi + 2*xi*eta);
  1269               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1270                                 subtriangle_lookup(p));
  1273           switch (subtriangle_lookup(p))
  1278               return 2 - 4*xi + 2*xi*xi
  1282               return -4*xi + 10*xi*xi
  1287               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1288                                 subtriangle_lookup(p));
  1291           switch (subtriangle_lookup(p))
  1294               return 4*eta - 8*xi*eta
  1297               return 4 - 12*xi + 8*xi*xi
  1301               return 4*xi - 8*xi*xi
  1305               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1306                                 subtriangle_lookup(p));
  1310           libmesh_error_msg(
"Invalid shape function index i = " <<
  1319           switch (subtriangle_lookup(p))
  1322               return - 6*eta - 6*xi*eta + 9*eta*eta;
  1324               return 9 - 30*xi + 21*xi*xi
  1325                 - 30*eta + 42*xi*eta + 21*eta*eta;
  1328                 - 6*eta + 6*eta*eta;
  1331               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1332                                 subtriangle_lookup(p));
  1335           switch (subtriangle_lookup(p))
  1341               return - 9./2. + 15*xi - 21./2.*xi*xi
  1342                 + 12*eta - 21*xi*eta - 15./2.*eta*eta;
  1344               return + 3./2.*xi*xi;
  1347               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1348                                 subtriangle_lookup(p));
  1351           switch (subtriangle_lookup(p))
  1354               return 6*eta + 3*xi*eta - 15./2.*eta*eta;
  1356               return - 9./2. + 15*xi - 21./2.*xi*xi
  1357                 + 18*eta - 21.*xi*eta - 27./2.*eta*eta;
  1360                 + 6*eta - 6*eta*eta;
  1363               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1364                                 subtriangle_lookup(p));
  1367           switch (subtriangle_lookup(p))
  1370               return - 3*eta - xi*eta + 7*eta*eta;
  1372               return - 4*xi + 4*xi*xi
  1373                 + eta + 3*xi*eta - eta*eta;
  1375               return - 3*xi + 2*xi*xi
  1379               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1380                                 subtriangle_lookup(p));
  1383           switch (subtriangle_lookup(p))
  1386               return 1 - 3*xi + 2*xi*xi
  1387                 - eta + 4*xi*eta - 7./2.*eta*eta;
  1389               return 5./2. - 4*xi + 3./2.*xi*xi
  1390                 - 9.*eta + 8*xi*eta + 13./2.*eta*eta;
  1392               return 1 - 1./2.*xi*xi - 4*eta + 3*eta*eta;
  1395               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1396                                 subtriangle_lookup(p));
  1399           switch (subtriangle_lookup(p))
  1402               return - 1./2.*xi*eta + 1./4.*eta*eta;
  1404               return 3./4. - 5./2.*xi + 7./4.*xi*xi
  1405                 - 2*eta + 7./2.*xi*eta + 5./4.*eta*eta;
  1407               return - 1./4.*xi*xi;
  1410               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1411                                 subtriangle_lookup(p));
  1414           switch (subtriangle_lookup(p))
  1417               return -xi + 2*xi*xi
  1418                 + eta + 7./2.*xi*eta - 13./4.*eta*eta;
  1420               return - 11./4. + 19./2.*xi - 23./4.*xi*xi
  1421                 + 7*eta - 25./2.*xi*eta - 17./4.*eta*eta;
  1426               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1427                                 subtriangle_lookup(p));
  1430           switch (subtriangle_lookup(p))
  1433               return -eta + 9./2.*xi*eta + 5./4.*eta*eta;
  1435               return - 13./4. + 19./2.*xi - 25./4.*xi*xi
  1436                 + 9*eta - 23./2.*xi*eta - 23./4.*eta*eta;
  1438               return - xi + 7./4.*xi*xi + 4*xi*eta;
  1441               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1442                                 subtriangle_lookup(p));
  1445           switch (subtriangle_lookup(p))
  1448               return -2*eta - 1./2.*xi*eta + 13./4.*eta*eta;
  1450               return 3./4. - 5./2.*xi + 7./4.*xi*xi
  1451                 - 4*eta + 7./2.*xi*eta + 17./4.*eta*eta;
  1453               return - 1./4.*xi*xi
  1454                 - 2*eta + 3*eta*eta;
  1457               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1458                                 subtriangle_lookup(p));
  1461           switch (subtriangle_lookup(p))
  1464               return std::sqrt(
Real(2)) * (2*xi*eta - eta*eta);
  1466               return std::sqrt(
Real(2)) * (- 3 + 10*xi - 7*xi*xi
  1467                                       + 8*eta - 14*xi*eta - 5*eta*eta);
  1469               return std::sqrt(
Real(2)) * (xi*xi);
  1472               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1473                                 subtriangle_lookup(p));
  1476           switch (subtriangle_lookup(p))
  1479               return 4*eta - 4*xi*eta - 8*eta*eta;
  1481               return 4 - 8*xi + 4*xi*xi
  1482                 - 12*eta + 12*xi*eta + 8*eta*eta;
  1484               return 4*xi - 4*xi*xi
  1488               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1489                                 subtriangle_lookup(p));
  1492           switch (subtriangle_lookup(p))
  1495               return 4*xi - 4*xi*xi
  1496                 - 4*eta - 8*xi*eta + 10.*eta*eta;
  1498               return 2 - 8*xi + 6*xi*xi
  1499                 - 4*eta + 8*xi*eta + 2*eta*eta;
  1504               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1505                                 subtriangle_lookup(p));
  1509           libmesh_error_msg(
"Invalid shape function index i = " <<
  1514       libmesh_error_msg(
"Invalid shape function derivative j = " <<
  1519 Real clough_raw_shape(
const unsigned int basis_num,
  1522   Real xi = p(0), eta = p(1);
  1527       switch (subtriangle_lookup(p))
  1530           return 1 - 3*xi*xi + 2*xi*xi*xi
  1531             - 3*eta*eta - 3*xi*eta*eta + 3*eta*eta*eta;
  1533           return -1 + 9*xi - 15*xi*xi + 7*xi*xi*xi
  1534             + 9*eta - 30*xi*eta +21*xi*xi*eta
  1535             - 15*eta*eta + 21*xi*eta*eta + 7*eta*eta*eta;
  1537           return 1 - 3*xi*xi + 3*xi*xi*xi
  1539             - 3*eta*eta + 2*eta*eta*eta;
  1542           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1543                             subtriangle_lookup(p));
  1546       switch (subtriangle_lookup(p))
  1549           return 3*xi*xi - 2*xi*xi*xi
  1551             - 1./2.*eta*eta*eta;
  1553           return 1 - 9./2.*xi + 9*xi*xi - 9./2.*xi*xi*xi
  1554             - 9./2.*eta + 15*xi*eta - 21./2.*xi*xi*eta
  1555             + 6*eta*eta - 21./2.*xi*eta*eta - 5./2.*eta*eta*eta;
  1557           return 3*xi*xi - 5./2.*xi*xi*xi
  1561           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1562                             subtriangle_lookup(p));
  1565       switch (subtriangle_lookup(p))
  1568           return 3*eta*eta + 3./2.*xi*eta*eta - 5./2.*eta*eta*eta;
  1570           return 1 - 9./2.*xi + 6*xi*xi - 5./2.*xi*xi*xi
  1571             - 9./2.*eta + 15*xi*eta - 21./2.*xi*xi*eta
  1572             + 9*eta*eta - 21./2.*xi*eta*eta - 9./2.*eta*eta*eta;
  1574           return -1./2.*xi*xi*xi
  1576             + 3*eta*eta - 2*eta*eta*eta;
  1579           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1580                             subtriangle_lookup(p));
  1583       switch (subtriangle_lookup(p))
  1586           return xi - 2*xi*xi + xi*xi*xi
  1587             - 3./2.*eta*eta - 1./2.*xi*eta*eta + 7./
Real(3)*eta*eta*eta;
  1589           return -1./
Real(6) + 5./2.*xi - 9./2.*xi*xi + 13./
Real(6)*xi*xi*xi
  1590             - 4*xi*eta + 4*xi*xi*eta
  1591             + 1./2.*eta*eta + 3./2.*xi*eta*eta - 1./
Real(3)*eta*eta*eta;
  1593           return xi - 1./2.*xi*xi - 7./
Real(6)*xi*xi*xi
  1594             - 3*xi*eta + 2*xi*xi*eta
  1598           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1599                             subtriangle_lookup(p));
  1602       switch (subtriangle_lookup(p))
  1605           return eta - 3*xi*eta + 2*xi*xi*eta
  1606             - 1./2.*eta*eta + 2*xi*eta*eta - 7./
Real(6)*eta*eta*eta;
  1608           return -1./
Real(6) + 1./2.*xi*xi - 1./
Real(3)*xi*xi*xi
  1609             + 5./2.*eta - 4*xi*eta + 3./2.*xi*xi*eta
  1610             - 9./2.*eta*eta + 4*xi*eta*eta + 13./
Real(6)*eta*eta*eta;
  1612           return -3./2.*xi*xi + 7./
Real(3)*xi*xi*xi
  1613             + eta - 1./2.*xi*xi*eta - 2*eta*eta + eta*eta*eta;
  1616           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1617                             subtriangle_lookup(p));
  1620       switch (subtriangle_lookup(p))
  1623           return -xi*xi + xi*xi*xi
  1624             - 1./4.*xi*eta*eta + 1./
Real(12)*eta*eta*eta;
  1626           return -1./
Real(6) + 3./4.*xi - 2*xi*xi + 17./
Real(12)*xi*xi*xi
  1627             + 3./4.*eta - 5./2.*xi*eta + 7./4.*xi*xi*eta
  1628             - eta*eta + 7./4.*xi*eta*eta + 5./
Real(12)*eta*eta*eta;
  1630           return -xi*xi + 13./
Real(12)*xi*xi*xi
  1634           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1635                             subtriangle_lookup(p));
  1638       switch (subtriangle_lookup(p))
  1641           return -xi*eta + 2*xi*xi*eta
  1642             + 1./2.*eta*eta + 7./4.*xi*eta*eta - 13./
Real(12)*eta*eta*eta;
  1644           return 2./
Real(3) - 13./4.*xi + 9./2.*xi*xi - 23./
Real(12)*xi*xi*xi
  1645             - 11./4.*eta + 19./2.*xi*eta - 23./4.*xi*xi*eta
  1646             + 7./2.*eta*eta - 25./4.*xi*eta*eta - 17./
Real(12)*eta*eta*eta;
  1648           return -1./2.*xi*xi + 5./
Real(12)*xi*xi*xi
  1652           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1653                             subtriangle_lookup(p));
  1656       switch (subtriangle_lookup(p))
  1659           return -1./2.*eta*eta + 9./4.*xi*eta*eta + 5./
Real(12)*eta*eta*eta;
  1661           return 2./
Real(3) - 11./4.*xi + 7./2.*xi*xi - 17./
Real(12)*xi*xi*xi
  1662             - 13./4.*eta + 19./2.*xi*eta - 25./4.*xi*xi*eta
  1663             + 9./2.*eta*eta - 23./4.*xi*eta*eta - 23./
Real(12)*eta*eta*eta;
  1665           return 1./2.*xi*xi - 13./
Real(12)*xi*xi*xi
  1666             - xi*eta + 7./4.*xi*xi*eta + 2*xi*eta*eta;
  1669           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1670                             subtriangle_lookup(p));
  1673       switch (subtriangle_lookup(p))
  1676           return -eta*eta - 1./4.*xi*eta*eta + 13./
Real(12)*eta*eta*eta;
  1678           return -1./
Real(6) + 3./4.*xi - xi*xi + 5./
Real(12)*xi*xi*xi
  1679             + 3./4.*eta - 5./2.*xi*eta + 7./4.*xi*xi*eta
  1680             - 2*eta*eta + 7./4.*xi*eta*eta + 17./
Real(12)*eta*eta*eta;
  1682           return 1./
Real(12)*xi*xi*xi
  1684             - eta*eta + eta*eta*eta;
  1687           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1688                             subtriangle_lookup(p));
  1691       switch (subtriangle_lookup(p))
  1694           return std::sqrt(
Real(2)) * (xi*eta*eta - 1./
Real(3)*eta*eta*eta);
  1696           return std::sqrt(
Real(2)) * (2./
Real(3) - 3*xi + 4*xi*xi - 5./
Real(3)*xi*xi*xi
  1697                                   - 3*eta + 10*xi*eta - 7*xi*xi*eta
  1698                                   + 4*eta*eta - 7*xi*eta*eta - 5./
Real(3)*eta*eta*eta);
  1700           return std::sqrt(
Real(2)) * (-1./
Real(3)*xi*xi*xi + xi*xi*eta);
  1703           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1704                             subtriangle_lookup(p));
  1707       switch (subtriangle_lookup(p))
  1710           return 2*eta*eta - 2*xi*eta*eta - 8./
Real(3)*eta*eta*eta;
  1712           return -2./
Real(3) + 2*xi - 2*xi*xi + 2./
Real(3)*xi*xi*xi
  1713             + 4*eta - 8*xi*eta + 4*xi*xi*eta
  1714             - 6*eta*eta + 6*xi*eta*eta + 8./
Real(3)*eta*eta*eta;
  1716           return -2*xi*xi + 10./
Real(3)*xi*xi*xi
  1717             + 4*xi*eta - 4*xi*xi*eta
  1721           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1722                             subtriangle_lookup(p));
  1725       switch (subtriangle_lookup(p))
  1728           return 4*xi*eta - 4*xi*xi*eta
  1729             - 2*eta*eta - 4*xi*eta*eta + 10./
Real(3)*eta*eta*eta;
  1731           return -2./
Real(3) + 4*xi - 6*xi*xi + 8./
Real(3)*xi*xi*xi
  1732             + 2*eta - 8*xi*eta + 6*xi*xi*eta
  1733             - 2*eta*eta + 4*xi*eta*eta + 2./
Real(3)*eta*eta*eta;
  1735           return 2*xi*xi - 8./
Real(3)*xi*xi*xi
  1739           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
  1740                             subtriangle_lookup(p));
  1744       libmesh_error_msg(
"Invalid shape function index i = " <<
  1763                          const unsigned int i,
  1765                          const bool add_p_level)
  1770   clough_compute_coefs(elem, coefs);
  1774   const Order totalorder =
  1775     order + add_p_level*elem->
p_level();
  1785         libmesh_experimental();
  1792               libmesh_assert_less (i, 9);
  1801                   return clough_raw_shape(0, p)
  1802                     + coefs.d1d2n * clough_raw_shape(10, p)
  1803                     + coefs.d1d3n * clough_raw_shape(11, p);
  1805                   return clough_raw_shape(1, p)
  1806                     + coefs.d2d3n * clough_raw_shape(11, p)
  1807                     + coefs.d2d1n * clough_raw_shape(9, p);
  1809                   return clough_raw_shape(2, p)
  1810                     + coefs.d3d1n * clough_raw_shape(9, p)
  1811                     + coefs.d3d2n * clough_raw_shape(10, p);
  1813                   return coefs.d1xd1x * clough_raw_shape(3, p)
  1814                     + coefs.d1xd1y * clough_raw_shape(4, p)
  1815                     + coefs.d1xd2n * clough_raw_shape(10, p)
  1816                     + coefs.d1xd3n * clough_raw_shape(11, p)
  1817                     + 0.5 * coefs.N01x * coefs.d3nd3n * clough_raw_shape(11, p)
  1818                     + 0.5 * coefs.N02x * coefs.d2nd2n * clough_raw_shape(10, p);
  1820                   return coefs.d1yd1y * clough_raw_shape(4, p)
  1821                     + coefs.d1yd1x * clough_raw_shape(3, p)
  1822                     + coefs.d1yd2n * clough_raw_shape(10, p)
  1823                     + coefs.d1yd3n * clough_raw_shape(11, p)
  1824                     + 0.5 * coefs.N01y * coefs.d3nd3n * clough_raw_shape(11, p)
  1825                     + 0.5 * coefs.N02y * coefs.d2nd2n * clough_raw_shape(10, p);
  1827                   return coefs.d2xd2x * clough_raw_shape(5, p)
  1828                     + coefs.d2xd2y * clough_raw_shape(6, p)
  1829                     + coefs.d2xd3n * clough_raw_shape(11, p)
  1830                     + coefs.d2xd1n * clough_raw_shape(9, p)
  1831                     + 0.5 * coefs.N10x * coefs.d3nd3n * clough_raw_shape(11, p)
  1832                     + 0.5 * coefs.N12x * coefs.d1nd1n * clough_raw_shape(9, p);
  1834                   return coefs.d2yd2y * clough_raw_shape(6, p)
  1835                     + coefs.d2yd2x * clough_raw_shape(5, p)
  1836                     + coefs.d2yd3n * clough_raw_shape(11, p)
  1837                     + coefs.d2yd1n * clough_raw_shape(9, p)
  1838                     + 0.5 * coefs.N10y * coefs.d3nd3n * clough_raw_shape(11, p)
  1839                     + 0.5 * coefs.N12y * coefs.d1nd1n * clough_raw_shape(9, p);
  1841                   return coefs.d3xd3x * clough_raw_shape(7, p)
  1842                     + coefs.d3xd3y * clough_raw_shape(8, p)
  1843                     + coefs.d3xd1n * clough_raw_shape(9, p)
  1844                     + coefs.d3xd2n * clough_raw_shape(10, p)
  1845                     + 0.5 * coefs.N20x * coefs.d2nd2n * clough_raw_shape(10, p)
  1846                     + 0.5 * coefs.N21x * coefs.d1nd1n * clough_raw_shape(9, p);
  1848                   return coefs.d3yd3y * clough_raw_shape(8, p)
  1849                     + coefs.d3yd3x * clough_raw_shape(7, p)
  1850                     + coefs.d3yd1n * clough_raw_shape(9, p)
  1851                     + coefs.d3yd2n * clough_raw_shape(10, p)
  1852                     + 0.5 * coefs.N20y * coefs.d2nd2n * clough_raw_shape(10, p)
  1853                     + 0.5 * coefs.N21y * coefs.d1nd1n * clough_raw_shape(9, p);
  1855                   libmesh_error_msg(
"Invalid shape function index i = " << i);
  1871               libmesh_assert_less (i, 12);
  1881                   return clough_raw_shape(0, p)
  1882                     + coefs.d1d2n * clough_raw_shape(10, p)
  1883                     + coefs.d1d3n * clough_raw_shape(11, p);
  1885                   return clough_raw_shape(1, p)
  1886                     + coefs.d2d3n * clough_raw_shape(11, p)
  1887                     + coefs.d2d1n * clough_raw_shape(9, p);
  1889                   return clough_raw_shape(2, p)
  1890                     + coefs.d3d1n * clough_raw_shape(9, p)
  1891                     + coefs.d3d2n * clough_raw_shape(10, p);
  1893                   return coefs.d1xd1x * clough_raw_shape(3, p)
  1894                     + coefs.d1xd1y * clough_raw_shape(4, p)
  1895                     + coefs.d1xd2n * clough_raw_shape(10, p)
  1896                     + coefs.d1xd3n * clough_raw_shape(11, p);
  1898                   return coefs.d1yd1y * clough_raw_shape(4, p)
  1899                     + coefs.d1yd1x * clough_raw_shape(3, p)
  1900                     + coefs.d1yd2n * clough_raw_shape(10, p)
  1901                     + coefs.d1yd3n * clough_raw_shape(11, p);
  1903                   return coefs.d2xd2x * clough_raw_shape(5, p)
  1904                     + coefs.d2xd2y * clough_raw_shape(6, p)
  1905                     + coefs.d2xd3n * clough_raw_shape(11, p)
  1906                     + coefs.d2xd1n * clough_raw_shape(9, p);
  1908                   return coefs.d2yd2y * clough_raw_shape(6, p)
  1909                     + coefs.d2yd2x * clough_raw_shape(5, p)
  1910                     + coefs.d2yd3n * clough_raw_shape(11, p)
  1911                     + coefs.d2yd1n * clough_raw_shape(9, p);
  1913                   return coefs.d3xd3x * clough_raw_shape(7, p)
  1914                     + coefs.d3xd3y * clough_raw_shape(8, p)
  1915                     + coefs.d3xd1n * clough_raw_shape(9, p)
  1916                     + coefs.d3xd2n * clough_raw_shape(10, p);
  1918                   return coefs.d3yd3y * clough_raw_shape(8, p)
  1919                     + coefs.d3yd3x * clough_raw_shape(7, p)
  1920                     + coefs.d3yd1n * clough_raw_shape(9, p)
  1921                     + coefs.d3yd2n * clough_raw_shape(10, p);
  1923                   return coefs.d1nd1n * clough_raw_shape(9, p);
  1925                   return coefs.d2nd2n * clough_raw_shape(10, p);
  1927                   return coefs.d3nd3n * clough_raw_shape(11, p);
  1930                   libmesh_error_msg(
"Invalid shape function index i = " << i);
  1939       libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
  1951   libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
  1959                          const unsigned int i,
  1961                          const bool add_p_level)
  1972                                const unsigned int i,
  1973                                const unsigned int j,
  1975                                const bool add_p_level)
  1980   clough_compute_coefs(elem, coefs);
  1984   const Order totalorder =
  1985     order + add_p_level*elem->
p_level();
  1995         libmesh_experimental();
  2002               libmesh_assert_less (i, 9);
  2011                   return clough_raw_shape_deriv(0, j, p)
  2012                     + coefs.d1d2n * clough_raw_shape_deriv(10, j, p)
  2013                     + coefs.d1d3n * clough_raw_shape_deriv(11, j, p);
  2015                   return clough_raw_shape_deriv(1, j, p)
  2016                     + coefs.d2d3n * clough_raw_shape_deriv(11, j, p)
  2017                     + coefs.d2d1n * clough_raw_shape_deriv(9, j, p);
  2019                   return clough_raw_shape_deriv(2, j, p)
  2020                     + coefs.d3d1n * clough_raw_shape_deriv(9, j, p)
  2021                     + coefs.d3d2n * clough_raw_shape_deriv(10, j, p);
  2023                   return coefs.d1xd1x * clough_raw_shape_deriv(3, j, p)
  2024                     + coefs.d1xd1y * clough_raw_shape_deriv(4, j, p)
  2025                     + coefs.d1xd2n * clough_raw_shape_deriv(10, j, p)
  2026                     + coefs.d1xd3n * clough_raw_shape_deriv(11, j, p)
  2027                     + 0.5 * coefs.N01x * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
  2028                     + 0.5 * coefs.N02x * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p);
  2030                   return coefs.d1yd1y * clough_raw_shape_deriv(4, j, p)
  2031                     + coefs.d1yd1x * clough_raw_shape_deriv(3, j, p)
  2032                     + coefs.d1yd2n * clough_raw_shape_deriv(10, j, p)
  2033                     + coefs.d1yd3n * clough_raw_shape_deriv(11, j, p)
  2034                     + 0.5 * coefs.N01y * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
  2035                     + 0.5 * coefs.N02y * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p);
  2037                   return coefs.d2xd2x * clough_raw_shape_deriv(5, j, p)
  2038                     + coefs.d2xd2y * clough_raw_shape_deriv(6, j, p)
  2039                     + coefs.d2xd3n * clough_raw_shape_deriv(11, j, p)
  2040                     + coefs.d2xd1n * clough_raw_shape_deriv(9, j, p)
  2041                     + 0.5 * coefs.N10x * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
  2042                     + 0.5 * coefs.N12x * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
  2044                   return coefs.d2yd2y * clough_raw_shape_deriv(6, j, p)
  2045                     + coefs.d2yd2x * clough_raw_shape_deriv(5, j, p)
  2046                     + coefs.d2yd3n * clough_raw_shape_deriv(11, j, p)
  2047                     + coefs.d2yd1n * clough_raw_shape_deriv(9, j, p)
  2048                     + 0.5 * coefs.N10y * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
  2049                     + 0.5 * coefs.N12y * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
  2051                   return coefs.d3xd3x * clough_raw_shape_deriv(7, j, p)
  2052                     + coefs.d3xd3y * clough_raw_shape_deriv(8, j, p)
  2053                     + coefs.d3xd1n * clough_raw_shape_deriv(9, j, p)
  2054                     + coefs.d3xd2n * clough_raw_shape_deriv(10, j, p)
  2055                     + 0.5 * coefs.N20x * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p)
  2056                     + 0.5 * coefs.N21x * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
  2058                   return coefs.d3yd3y * clough_raw_shape_deriv(8, j, p)
  2059                     + coefs.d3yd3x * clough_raw_shape_deriv(7, j, p)
  2060                     + coefs.d3yd1n * clough_raw_shape_deriv(9, j, p)
  2061                     + coefs.d3yd2n * clough_raw_shape_deriv(10, j, p)
  2062                     + 0.5 * coefs.N20y * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p)
  2063                     + 0.5 * coefs.N21y * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
  2065                   libmesh_error_msg(
"Invalid shape function index i = " << i);
  2081               libmesh_assert_less (i, 12);
  2091                   return clough_raw_shape_deriv(0, j, p)
  2092                     + coefs.d1d2n * clough_raw_shape_deriv(10, j, p)
  2093                     + coefs.d1d3n * clough_raw_shape_deriv(11, j, p);
  2095                   return clough_raw_shape_deriv(1, j, p)
  2096                     + coefs.d2d3n * clough_raw_shape_deriv(11, j, p)
  2097                     + coefs.d2d1n * clough_raw_shape_deriv(9, j, p);
  2099                   return clough_raw_shape_deriv(2, j, p)
  2100                     + coefs.d3d1n * clough_raw_shape_deriv(9, j, p)
  2101                     + coefs.d3d2n * clough_raw_shape_deriv(10, j, p);
  2103                   return coefs.d1xd1x * clough_raw_shape_deriv(3, j, p)
  2104                     + coefs.d1xd1y * clough_raw_shape_deriv(4, j, p)
  2105                     + coefs.d1xd2n * clough_raw_shape_deriv(10, j, p)
  2106                     + coefs.d1xd3n * clough_raw_shape_deriv(11, j, p);
  2108                   return coefs.d1yd1y * clough_raw_shape_deriv(4, j, p)
  2109                     + coefs.d1yd1x * clough_raw_shape_deriv(3, j, p)
  2110                     + coefs.d1yd2n * clough_raw_shape_deriv(10, j, p)
  2111                     + coefs.d1yd3n * clough_raw_shape_deriv(11, j, p);
  2113                   return coefs.d2xd2x * clough_raw_shape_deriv(5, j, p)
  2114                     + coefs.d2xd2y * clough_raw_shape_deriv(6, j, p)
  2115                     + coefs.d2xd3n * clough_raw_shape_deriv(11, j, p)
  2116                     + coefs.d2xd1n * clough_raw_shape_deriv(9, j, p);
  2118                   return coefs.d2yd2y * clough_raw_shape_deriv(6, j, p)
  2119                     + coefs.d2yd2x * clough_raw_shape_deriv(5, j, p)
  2120                     + coefs.d2yd3n * clough_raw_shape_deriv(11, j, p)
  2121                     + coefs.d2yd1n * clough_raw_shape_deriv(9, j, p);
  2123                   return coefs.d3xd3x * clough_raw_shape_deriv(7, j, p)
  2124                     + coefs.d3xd3y * clough_raw_shape_deriv(8, j, p)
  2125                     + coefs.d3xd1n * clough_raw_shape_deriv(9, j, p)
  2126                     + coefs.d3xd2n * clough_raw_shape_deriv(10, j, p);
  2128                   return coefs.d3yd3y * clough_raw_shape_deriv(8, j, p)
  2129                     + coefs.d3yd3x * clough_raw_shape_deriv(7, j, p)
  2130                     + coefs.d3yd1n * clough_raw_shape_deriv(9, j, p)
  2131                     + coefs.d3yd2n * clough_raw_shape_deriv(10, j, p);
  2133                   return coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
  2135                   return coefs.d2nd2n * clough_raw_shape_deriv(10, j, p);
  2137                   return coefs.d3nd3n * clough_raw_shape_deriv(11, j, p);
  2140                   libmesh_error_msg(
"Invalid shape function index i = " << i);
  2149       libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
  2161   libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
  2169                                const unsigned int i,
  2170                                const unsigned int j,
  2172                                const bool add_p_level)
  2179 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES  2185                                       const unsigned int i,
  2186                                       const unsigned int j,
  2188                                       const bool add_p_level)
  2193   clough_compute_coefs(elem, coefs);
  2197   const Order totalorder =
  2198     order + add_p_level*elem->
p_level();
  2211               libmesh_assert_less (i, 9);
  2220                   return clough_raw_shape_second_deriv(0, j, p)
  2221                     + coefs.d1d2n * clough_raw_shape_second_deriv(10, j, p)
  2222                     + coefs.d1d3n * clough_raw_shape_second_deriv(11, j, p);
  2224                   return clough_raw_shape_second_deriv(1, j, p)
  2225                     + coefs.d2d3n * clough_raw_shape_second_deriv(11, j, p)
  2226                     + coefs.d2d1n * clough_raw_shape_second_deriv(9, j, p);
  2228                   return clough_raw_shape_second_deriv(2, j, p)
  2229                     + coefs.d3d1n * clough_raw_shape_second_deriv(9, j, p)
  2230                     + coefs.d3d2n * clough_raw_shape_second_deriv(10, j, p);
  2232                   return coefs.d1xd1x * clough_raw_shape_second_deriv(3, j, p)
  2233                     + coefs.d1xd1y * clough_raw_shape_second_deriv(4, j, p)
  2234                     + coefs.d1xd2n * clough_raw_shape_second_deriv(10, j, p)
  2235                     + coefs.d1xd3n * clough_raw_shape_second_deriv(11, j, p)
  2236                     + 0.5 * coefs.N01x * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
  2237                     + 0.5 * coefs.N02x * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p);
  2239                   return coefs.d1yd1y * clough_raw_shape_second_deriv(4, j, p)
  2240                     + coefs.d1yd1x * clough_raw_shape_second_deriv(3, j, p)
  2241                     + coefs.d1yd2n * clough_raw_shape_second_deriv(10, j, p)
  2242                     + coefs.d1yd3n * clough_raw_shape_second_deriv(11, j, p)
  2243                     + 0.5 * coefs.N01y * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
  2244                     + 0.5 * coefs.N02y * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p);
  2246                   return coefs.d2xd2x * clough_raw_shape_second_deriv(5, j, p)
  2247                     + coefs.d2xd2y * clough_raw_shape_second_deriv(6, j, p)
  2248                     + coefs.d2xd3n * clough_raw_shape_second_deriv(11, j, p)
  2249                     + coefs.d2xd1n * clough_raw_shape_second_deriv(9, j, p)
  2250                     + 0.5 * coefs.N10x * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
  2251                     + 0.5 * coefs.N12x * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
  2253                   return coefs.d2yd2y * clough_raw_shape_second_deriv(6, j, p)
  2254                     + coefs.d2yd2x * clough_raw_shape_second_deriv(5, j, p)
  2255                     + coefs.d2yd3n * clough_raw_shape_second_deriv(11, j, p)
  2256                     + coefs.d2yd1n * clough_raw_shape_second_deriv(9, j, p)
  2257                     + 0.5 * coefs.N10y * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
  2258                     + 0.5 * coefs.N12y * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
  2260                   return coefs.d3xd3x * clough_raw_shape_second_deriv(7, j, p)
  2261                     + coefs.d3xd3y * clough_raw_shape_second_deriv(8, j, p)
  2262                     + coefs.d3xd1n * clough_raw_shape_second_deriv(9, j, p)
  2263                     + coefs.d3xd2n * clough_raw_shape_second_deriv(10, j, p)
  2264                     + 0.5 * coefs.N20x * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p)
  2265                     + 0.5 * coefs.N21x * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
  2267                   return coefs.d3yd3y * clough_raw_shape_second_deriv(8, j, p)
  2268                     + coefs.d3yd3x * clough_raw_shape_second_deriv(7, j, p)
  2269                     + coefs.d3yd1n * clough_raw_shape_second_deriv(9, j, p)
  2270                     + coefs.d3yd2n * clough_raw_shape_second_deriv(10, j, p)
  2271                     + 0.5 * coefs.N20y * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p)
  2272                     + 0.5 * coefs.N21y * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
  2274                   libmesh_error_msg(
"Invalid shape function index i = " << i);
  2290               libmesh_assert_less (i, 12);
  2300                   return clough_raw_shape_second_deriv(0, j, p)
  2301                     + coefs.d1d2n * clough_raw_shape_second_deriv(10, j, p)
  2302                     + coefs.d1d3n * clough_raw_shape_second_deriv(11, j, p);
  2304                   return clough_raw_shape_second_deriv(1, j, p)
  2305                     + coefs.d2d3n * clough_raw_shape_second_deriv(11, j, p)
  2306                     + coefs.d2d1n * clough_raw_shape_second_deriv(9, j, p);
  2308                   return clough_raw_shape_second_deriv(2, j, p)
  2309                     + coefs.d3d1n * clough_raw_shape_second_deriv(9, j, p)
  2310                     + coefs.d3d2n * clough_raw_shape_second_deriv(10, j, p);
  2312                   return coefs.d1xd1x * clough_raw_shape_second_deriv(3, j, p)
  2313                     + coefs.d1xd1y * clough_raw_shape_second_deriv(4, j, p)
  2314                     + coefs.d1xd2n * clough_raw_shape_second_deriv(10, j, p)
  2315                     + coefs.d1xd3n * clough_raw_shape_second_deriv(11, j, p);
  2317                   return coefs.d1yd1y * clough_raw_shape_second_deriv(4, j, p)
  2318                     + coefs.d1yd1x * clough_raw_shape_second_deriv(3, j, p)
  2319                     + coefs.d1yd2n * clough_raw_shape_second_deriv(10, j, p)
  2320                     + coefs.d1yd3n * clough_raw_shape_second_deriv(11, j, p);
  2322                   return coefs.d2xd2x * clough_raw_shape_second_deriv(5, j, p)
  2323                     + coefs.d2xd2y * clough_raw_shape_second_deriv(6, j, p)
  2324                     + coefs.d2xd3n * clough_raw_shape_second_deriv(11, j, p)
  2325                     + coefs.d2xd1n * clough_raw_shape_second_deriv(9, j, p);
  2327                   return coefs.d2yd2y * clough_raw_shape_second_deriv(6, j, p)
  2328                     + coefs.d2yd2x * clough_raw_shape_second_deriv(5, j, p)
  2329                     + coefs.d2yd3n * clough_raw_shape_second_deriv(11, j, p)
  2330                     + coefs.d2yd1n * clough_raw_shape_second_deriv(9, j, p);
  2332                   return coefs.d3xd3x * clough_raw_shape_second_deriv(7, j, p)
  2333                     + coefs.d3xd3y * clough_raw_shape_second_deriv(8, j, p)
  2334                     + coefs.d3xd1n * clough_raw_shape_second_deriv(9, j, p)
  2335                     + coefs.d3xd2n * clough_raw_shape_second_deriv(10, j, p);
  2337                   return coefs.d3yd3y * clough_raw_shape_second_deriv(8, j, p)
  2338                     + coefs.d3yd3x * clough_raw_shape_second_deriv(7, j, p)
  2339                     + coefs.d3yd1n * clough_raw_shape_second_deriv(9, j, p)
  2340                     + coefs.d3yd2n * clough_raw_shape_second_deriv(10, j, p);
  2342                   return coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
  2344                   return coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p);
  2346                   return coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p);
  2349                   libmesh_error_msg(
"Invalid shape function index i = " << i);
  2358       libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
  2370   libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
  2377                                       const unsigned int i,
  2378                                       const unsigned int j,
  2380                                       const bool add_p_level)
 Real(* shape_deriv_ptr)(const FEType fet, const Elem *elem, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
Typedef for pointer to a function that returns FE shape function derivative values. 
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
ElemType
Defines an enum for geometric element types. 
Order
defines an enum for polynomial orders. 
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
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)
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static shape_deriv_ptr shape_deriv_function(const unsigned int dim, const FEType &fe_t, const ElemType t)
std::string enum_to_string(const T e)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
FEFamily
defines an enum for finite element families. 
virtual Order default_order() const =0
virtual ElemType type() const =0
A Point defines a location in LIBMESH_DIM dimensional Real space. 
const Point & point(const unsigned int i) const
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
static FEFamily map_fe_type(const Elem &elem)