22 #include "libmesh/fe.h" 
   23 #include "libmesh/elem.h" 
   24 #include "libmesh/fe_interface.h" 
   37 static const Elem * old_elem_ptr = 
nullptr;
 
   42 static Real d1d2n, d1d3n, d2d3n, d2d1n, d3d1n, d3d2n;
 
   43 static Real d1xd1x, d1xd1y, d1xd2n, d1xd3n;
 
   44 static Real d1yd1x, d1yd1y, d1yd2n, d1yd3n;
 
   45 static Real d2xd2x, d2xd2y, d2xd3n, d2xd1n;
 
   46 static Real d2yd2x, d2yd2y, d2yd3n, d2yd1n;
 
   47 static Real d3xd3x, d3xd3y, d3xd1n, d3xd2n;
 
   48 static Real d3yd3x, d3yd3y, d3yd1n, d3yd2n;
 
   49 static Real d1nd1n, d2nd2n, d3nd3n;
 
   52 static Real N01x, N01y, N10x, N10y;
 
   53 static Real N02x, N02y, N20x, N20y;
 
   54 static Real N21x, N21y, N12x, N12y;
 
   56 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
   58 Real clough_raw_shape_second_deriv(
const unsigned int basis_num,
 
   59                                    const unsigned int deriv_type,
 
   63 Real clough_raw_shape_deriv(
const unsigned int basis_num,
 
   64                             const unsigned int deriv_type,
 
   66 Real clough_raw_shape(
const unsigned int basis_num,
 
   68 unsigned char subtriangle_lookup(
const Point & p);
 
   72 void clough_compute_coefs(
const Elem * elem)
 
   81   if (elem->
id() == old_elem_id &&
 
   87   const Order mapping_order        (elem->default_order());
 
   88   const ElemType mapping_elem_type (elem->type());
 
   90   const FEType map_fe_type(mapping_order, mapping_family);
 
   92   const int n_mapping_shape_functions =
 
   96   std::vector<Point> dofpt;
 
   97   dofpt.push_back(
Point(0,0));
 
   98   dofpt.push_back(
Point(1,0));
 
   99   dofpt.push_back(
Point(0,1));
 
  100   dofpt.push_back(
Point(1/2.,1/2.));
 
  101   dofpt.push_back(
Point(0,1/2.));
 
  102   dofpt.push_back(
Point(1/2.,0));
 
  105   std::vector<Real> dxdxi(6), dxdeta(6), dydxi(6), dydeta(6);
 
  106   std::vector<Real> dxidx(6), detadx(6), dxidy(6), detady(6);
 
  111   for (
int p = 0; p != 6; ++p)
 
  114       for (
int i = 0; i != n_mapping_shape_functions; ++i)
 
  116           const Real ddxi = shape_deriv_ptr
 
  117             (elem, mapping_order, i, 0, dofpt[p], 
false);
 
  118           const Real ddeta = shape_deriv_ptr
 
  119             (elem, mapping_order, i, 1, dofpt[p], 
false);
 
  124           dxdxi[p] += elem->point(i)(0) * ddxi;
 
  125           dydxi[p] += elem->point(i)(1) * ddxi;
 
  126           dxdeta[p] += elem->point(i)(0) * ddeta;
 
  127           dydeta[p] += elem->point(i)(1) * ddeta;
 
  140       const Real inv_jac = 1. / (dxdxi[p]*dydeta[p] -
 
  142       dxidx[p] = dydeta[p] * inv_jac;
 
  143       dxidy[p] = - dxdeta[p] * inv_jac;
 
  144       detadx[p] = - dydxi[p] * inv_jac;
 
  145       detady[p] = dxdxi[p] * inv_jac;
 
  149   Real N1x = dydeta[3] - dydxi[3];
 
  150   Real N1y = dxdxi[3] - dxdeta[3];
 
  151   Real Nlength = 
std::sqrt(static_cast<Real>(N1x*N1x + N1y*N1y));
 
  152   N1x /= Nlength; N1y /= Nlength;
 
  154   Real N2x = - dydeta[4];
 
  155   Real N2y = dxdeta[4];
 
  156   Nlength = 
std::sqrt(static_cast<Real>(N2x*N2x + N2y*N2y));
 
  157   N2x /= Nlength; N2y /= Nlength;
 
  160   Real N3y = - dxdxi[5];
 
  161   Nlength = 
std::sqrt(static_cast<Real>(N3x*N3x + N3y*N3y));
 
  162   N3x /= Nlength; N3y /= Nlength;
 
  167   Nlength = 
std::sqrt(static_cast<Real>(N01x*N01x + N01y*N01y));
 
  168   N01x /= Nlength; N01y /= Nlength;
 
  172   Nlength = 
std::sqrt(static_cast<Real>(N10x*N10x + N10y*N10y));
 
  173   N10x /= Nlength; N10y /= Nlength;
 
  177   Nlength = 
std::sqrt(static_cast<Real>(N02x*N02x + N02y*N02y));
 
  178   N02x /= Nlength; N02y /= Nlength;
 
  182   Nlength = 
std::sqrt(static_cast<Real>(N20x*N20x + N20y*N20y));
 
  183   N20x /= Nlength; N20y /= Nlength;
 
  185   N12x = dydeta[1] - dydxi[1];
 
  186   N12y = dxdxi[1] - dxdeta[1];
 
  187   Nlength = 
std::sqrt(static_cast<Real>(N12x*N12x + N12y*N12y));
 
  188   N12x /= Nlength; N12y /= Nlength;
 
  190   N21x = dydeta[1] - dydxi[1];
 
  191   N21y = dxdxi[1] - dxdeta[1];
 
  192   Nlength = 
std::sqrt(static_cast<Real>(N21x*N21x + N21y*N21y));
 
  193   N21x /= Nlength; N21y /= Nlength;
 
  209   if (elem->point(2) < elem->point(1))
 
  215       N1x = -N1x; N1y = -N1y;
 
  216       N12x = -N12x; N12y = -N12y;
 
  217       N21x = -N21x; N21y = -N21y;
 
  226   if (elem->point(0) < elem->point(2))
 
  233       N2x = -N2x; N2y = -N2y;
 
  234       N02x = -N02x; N02y = -N02y;
 
  235       N20x = -N20x; N20y = -N20y;
 
  245   if (elem->point(1) < elem->point(0))
 
  253       N01x = -N01x; N01y = -N01y;
 
  254       N10x = -N10x; N10y = -N10y;
 
  274   Real d1d2ndxi   = clough_raw_shape_deriv(0, 0, dofpt[4]);
 
  275   Real d1d2ndeta  = clough_raw_shape_deriv(0, 1, dofpt[4]);
 
  276   Real d1d2ndx = d1d2ndxi * dxidx[4] + d1d2ndeta * detadx[4];
 
  277   Real d1d2ndy = d1d2ndxi * dxidy[4] + d1d2ndeta * detady[4];
 
  278   Real d1d3ndxi   = clough_raw_shape_deriv(0, 0, dofpt[5]);
 
  279   Real d1d3ndeta  = clough_raw_shape_deriv(0, 1, dofpt[5]);
 
  280   Real d1d3ndx = d1d3ndxi * dxidx[5] + d1d3ndeta * detadx[5];
 
  281   Real d1d3ndy = d1d3ndxi * dxidy[5] + d1d3ndeta * detady[5];
 
  282   Real d2d3ndxi   = clough_raw_shape_deriv(1, 0, dofpt[5]);
 
  283   Real d2d3ndeta  = clough_raw_shape_deriv(1, 1, dofpt[5]);
 
  284   Real d2d3ndx = d2d3ndxi * dxidx[5] + d2d3ndeta * detadx[5];
 
  285   Real d2d3ndy = d2d3ndxi * dxidy[5] + d2d3ndeta * detady[5];
 
  286   Real d2d1ndxi   = clough_raw_shape_deriv(1, 0, dofpt[3]);
 
  287   Real d2d1ndeta  = clough_raw_shape_deriv(1, 1, dofpt[3]);
 
  288   Real d2d1ndx = d2d1ndxi * dxidx[3] + d2d1ndeta * detadx[3];
 
  289   Real d2d1ndy = d2d1ndxi * dxidy[3] + d2d1ndeta * detady[3];
 
  290   Real d3d1ndxi   = clough_raw_shape_deriv(2, 0, dofpt[3]);
 
  291   Real d3d1ndeta  = clough_raw_shape_deriv(2, 1, dofpt[3]);
 
  292   Real d3d1ndx = d3d1ndxi * dxidx[3] + d3d1ndeta * detadx[3];
 
  293   Real d3d1ndy = d3d1ndxi * dxidy[3] + d3d1ndeta * detady[3];
 
  294   Real d3d2ndxi   = clough_raw_shape_deriv(2, 0, dofpt[4]);
 
  295   Real d3d2ndeta  = clough_raw_shape_deriv(2, 1, dofpt[4]);
 
  296   Real d3d2ndx = d3d2ndxi * dxidx[4] + d3d2ndeta * detadx[4];
 
  297   Real d3d2ndy = d3d2ndxi * dxidy[4] + d3d2ndeta * detady[4];
 
  298   Real d1xd2ndxi  = clough_raw_shape_deriv(3, 0, dofpt[4]);
 
  299   Real d1xd2ndeta = clough_raw_shape_deriv(3, 1, dofpt[4]);
 
  300   Real d1xd2ndx = d1xd2ndxi * dxidx[4] + d1xd2ndeta * detadx[4];
 
  301   Real d1xd2ndy = d1xd2ndxi * dxidy[4] + d1xd2ndeta * detady[4];
 
  302   Real d1xd3ndxi  = clough_raw_shape_deriv(3, 0, dofpt[5]);
 
  303   Real d1xd3ndeta = clough_raw_shape_deriv(3, 1, dofpt[5]);
 
  304   Real d1xd3ndx = d1xd3ndxi * dxidx[5] + d1xd3ndeta * detadx[5];
 
  305   Real d1xd3ndy = d1xd3ndxi * dxidy[5] + d1xd3ndeta * detady[5];
 
  306   Real d1yd2ndxi  = clough_raw_shape_deriv(4, 0, dofpt[4]);
 
  307   Real d1yd2ndeta = clough_raw_shape_deriv(4, 1, dofpt[4]);
 
  308   Real d1yd2ndx = d1yd2ndxi * dxidx[4] + d1yd2ndeta * detadx[4];
 
  309   Real d1yd2ndy = d1yd2ndxi * dxidy[4] + d1yd2ndeta * detady[4];
 
  310   Real d1yd3ndxi  = clough_raw_shape_deriv(4, 0, dofpt[5]);
 
  311   Real d1yd3ndeta = clough_raw_shape_deriv(4, 1, dofpt[5]);
 
  312   Real d1yd3ndx = d1yd3ndxi * dxidx[5] + d1yd3ndeta * detadx[5];
 
  313   Real d1yd3ndy = d1yd3ndxi * dxidy[5] + d1yd3ndeta * detady[5];
 
  314   Real d2xd3ndxi  = clough_raw_shape_deriv(5, 0, dofpt[5]);
 
  315   Real d2xd3ndeta = clough_raw_shape_deriv(5, 1, dofpt[5]);
 
  316   Real d2xd3ndx = d2xd3ndxi * dxidx[5] + d2xd3ndeta * detadx[5];
 
  317   Real d2xd3ndy = d2xd3ndxi * dxidy[5] + d2xd3ndeta * detady[5];
 
  318   Real d2xd1ndxi  = clough_raw_shape_deriv(5, 0, dofpt[3]);
 
  319   Real d2xd1ndeta = clough_raw_shape_deriv(5, 1, dofpt[3]);
 
  320   Real d2xd1ndx = d2xd1ndxi * dxidx[3] + d2xd1ndeta * detadx[3];
 
  321   Real d2xd1ndy = d2xd1ndxi * dxidy[3] + d2xd1ndeta * detady[3];
 
  322   Real d2yd3ndxi  = clough_raw_shape_deriv(6, 0, dofpt[5]);
 
  323   Real d2yd3ndeta = clough_raw_shape_deriv(6, 1, dofpt[5]);
 
  324   Real d2yd3ndx = d2yd3ndxi * dxidx[5] + d2yd3ndeta * detadx[5];
 
  325   Real d2yd3ndy = d2yd3ndxi * dxidy[5] + d2yd3ndeta * detady[5];
 
  326   Real d2yd1ndxi  = clough_raw_shape_deriv(6, 0, dofpt[3]);
 
  327   Real d2yd1ndeta = clough_raw_shape_deriv(6, 1, dofpt[3]);
 
  328   Real d2yd1ndx = d2yd1ndxi * dxidx[3] + d2yd1ndeta * detadx[3];
 
  329   Real d2yd1ndy = d2yd1ndxi * dxidy[3] + d2yd1ndeta * detady[3];
 
  330   Real d3xd1ndxi  = clough_raw_shape_deriv(7, 0, dofpt[3]);
 
  331   Real d3xd1ndeta = clough_raw_shape_deriv(7, 1, dofpt[3]);
 
  332   Real d3xd1ndx = d3xd1ndxi * dxidx[3] + d3xd1ndeta * detadx[3];
 
  333   Real d3xd1ndy = d3xd1ndxi * dxidy[3] + d3xd1ndeta * detady[3];
 
  334   Real d3xd2ndxi  = clough_raw_shape_deriv(7, 0, dofpt[4]);
 
  335   Real d3xd2ndeta = clough_raw_shape_deriv(7, 1, dofpt[4]);
 
  336   Real d3xd2ndx = d3xd2ndxi * dxidx[4] + d3xd2ndeta * detadx[4];
 
  337   Real d3xd2ndy = d3xd2ndxi * dxidy[4] + d3xd2ndeta * detady[4];
 
  338   Real d3yd1ndxi  = clough_raw_shape_deriv(8, 0, dofpt[3]);
 
  339   Real d3yd1ndeta = clough_raw_shape_deriv(8, 1, dofpt[3]);
 
  340   Real d3yd1ndx = d3yd1ndxi * dxidx[3] + d3yd1ndeta * detadx[3];
 
  341   Real d3yd1ndy = d3yd1ndxi * dxidy[3] + d3yd1ndeta * detady[3];
 
  342   Real d3yd2ndxi  = clough_raw_shape_deriv(8, 0, dofpt[4]);
 
  343   Real d3yd2ndeta = clough_raw_shape_deriv(8, 1, dofpt[4]);
 
  344   Real d3yd2ndx = d3yd2ndxi * dxidx[4] + d3yd2ndeta * detadx[4];
 
  345   Real d3yd2ndy = d3yd2ndxi * dxidy[4] + d3yd2ndeta * detady[4];
 
  346   Real d1nd1ndxi  = clough_raw_shape_deriv(9, 0, dofpt[3]);
 
  347   Real d1nd1ndeta = clough_raw_shape_deriv(9, 1, dofpt[3]);
 
  348   Real d1nd1ndx = d1nd1ndxi * dxidx[3] + d1nd1ndeta * detadx[3];
 
  349   Real d1nd1ndy = d1nd1ndxi * dxidy[3] + d1nd1ndeta * detady[3];
 
  350   Real d2nd2ndxi  = clough_raw_shape_deriv(10, 0, dofpt[4]);
 
  351   Real d2nd2ndeta = clough_raw_shape_deriv(10, 1, dofpt[4]);
 
  352   Real d2nd2ndx = d2nd2ndxi * dxidx[4] + d2nd2ndeta * detadx[4];
 
  353   Real d2nd2ndy = d2nd2ndxi * dxidy[4] + d2nd2ndeta * detady[4];
 
  354   Real d3nd3ndxi  = clough_raw_shape_deriv(11, 0, dofpt[5]);
 
  355   Real d3nd3ndeta = clough_raw_shape_deriv(11, 1, dofpt[5]);
 
  356   Real d3nd3ndx = d3nd3ndxi * dxidx[3] + d3nd3ndeta * detadx[3];
 
  357   Real d3nd3ndy = d3nd3ndxi * dxidy[3] + d3nd3ndeta * detady[3];
 
  359   Real d1xd1dxi   = clough_raw_shape_deriv(3, 0, dofpt[0]);
 
  360   Real d1xd1deta  = clough_raw_shape_deriv(3, 1, dofpt[0]);
 
  361   Real d1xd1dx    = d1xd1dxi * dxidx[0] + d1xd1deta * detadx[0];
 
  362   Real d1xd1dy    = d1xd1dxi * dxidy[0] + d1xd1deta * detady[0];
 
  363   Real d1yd1dxi   = clough_raw_shape_deriv(4, 0, dofpt[0]);
 
  364   Real d1yd1deta  = clough_raw_shape_deriv(4, 1, dofpt[0]);
 
  365   Real d1yd1dx    = d1yd1dxi * dxidx[0] + d1yd1deta * detadx[0];
 
  366   Real d1yd1dy    = d1yd1dxi * dxidy[0] + d1yd1deta * detady[0];
 
  367   Real d2xd2dxi   = clough_raw_shape_deriv(5, 0, dofpt[1]);
 
  368   Real d2xd2deta  = clough_raw_shape_deriv(5, 1, dofpt[1]);
 
  369   Real d2xd2dx    = d2xd2dxi * dxidx[1] + d2xd2deta * detadx[1];
 
  370   Real d2xd2dy    = d2xd2dxi * dxidy[1] + d2xd2deta * detady[1];
 
  390   Real d2yd2dxi   = clough_raw_shape_deriv(6, 0, dofpt[1]);
 
  391   Real d2yd2deta  = clough_raw_shape_deriv(6, 1, dofpt[1]);
 
  392   Real d2yd2dx    = d2yd2dxi * dxidx[1] + d2yd2deta * detadx[1];
 
  393   Real d2yd2dy    = d2yd2dxi * dxidy[1] + d2yd2deta * detady[1];
 
  394   Real d3xd3dxi   = clough_raw_shape_deriv(7, 0, dofpt[2]);
 
  395   Real d3xd3deta  = clough_raw_shape_deriv(7, 1, dofpt[2]);
 
  396   Real d3xd3dx    = d3xd3dxi * dxidx[1] + d3xd3deta * detadx[1];
 
  397   Real d3xd3dy    = d3xd3dxi * dxidy[1] + d3xd3deta * detady[1];
 
  398   Real d3yd3dxi   = clough_raw_shape_deriv(8, 0, dofpt[2]);
 
  399   Real d3yd3deta  = clough_raw_shape_deriv(8, 1, dofpt[2]);
 
  400   Real d3yd3dx    = d3yd3dxi * dxidx[1] + d3yd3deta * detadx[1];
 
  401   Real d3yd3dy    = d3yd3dxi * dxidy[1] + d3yd3deta * detady[1];
 
  405   Real d1nd1ndn = d1nd1ndx * N1x + d1nd1ndy * N1y;
 
  406   Real d1xd2ndn = d1xd2ndx * N2x + d1xd2ndy * N2y;
 
  407   Real d1xd3ndn = d1xd3ndx * N3x + d1xd3ndy * N3y;
 
  408   Real d1yd2ndn = d1yd2ndx * N2x + d1yd2ndy * N2y;
 
  409   Real d1yd3ndn = d1yd3ndx * N3x + d1yd3ndy * N3y;
 
  411   Real d2nd2ndn = d2nd2ndx * N2x + d2nd2ndy * N2y;
 
  412   Real d2xd3ndn = d2xd3ndx * N3x + d2xd3ndy * N3y;
 
  413   Real d2xd1ndn = d2xd1ndx * N1x + d2xd1ndy * N1y;
 
  414   Real d2yd3ndn = d2yd3ndx * N3x + d2yd3ndy * N3y;
 
  415   Real d2yd1ndn = d2yd1ndx * N1x + d2yd1ndy * N1y;
 
  417   Real d3nd3ndn = d3nd3ndx * N3x + d3nd3ndy * N3y;
 
  418   Real d3xd1ndn = d3xd1ndx * N1x + d3xd1ndy * N1y;
 
  419   Real d3xd2ndn = d3xd2ndx * N2x + d3xd2ndy * N2y;
 
  420   Real d3yd1ndn = d3yd1ndx * N1x + d3yd1ndy * N1y;
 
  421   Real d3yd2ndn = d3yd2ndx * N2x + d3yd2ndy * N2y;
 
  425   d1nd1n = 1. / d1nd1ndn;
 
  426   d2nd2n = 1. / d2nd2ndn;
 
  427   d3nd3n = 1. / d3nd3ndn;
 
  435   if (elem->id() == old_elem_id &&
 
  436       elem == old_elem_ptr)
 
  438       libmesh_assert_equal_to(d1d2n, -(d1d2ndx * N2x + d1d2ndy * N2y) / d2nd2ndn);
 
  439       libmesh_assert_equal_to(d1d3n, -(d1d3ndx * N3x + d1d3ndy * N3y) / d3nd3ndn);
 
  440       libmesh_assert_equal_to(d2d3n, -(d2d3ndx * N3x + d2d3ndy * N3y) / d3nd3ndn);
 
  441       libmesh_assert_equal_to(d2d1n, -(d2d1ndx * N1x + d2d1ndy * N1y) / d1nd1ndn);
 
  442       libmesh_assert_equal_to(d3d1n, -(d3d1ndx * N1x + d3d1ndy * N1y) / d1nd1ndn);
 
  443       libmesh_assert_equal_to(d3d2n, -(d3d2ndx * N2x + d3d2ndy * N2y) / d2nd2ndn);
 
  444       libmesh_assert_equal_to(d1xd1x, 1. / (d1xd1dx - d1xd1dy * d1yd1dx / d1yd1dy));
 
  445       libmesh_assert_equal_to(d1xd1y, 1. / (d1yd1dx - d1xd1dx * d1yd1dy / d1xd1dy));
 
  446       libmesh_assert_equal_to(d1yd1y, 1. / (d1yd1dy - d1yd1dx * d1xd1dy / d1xd1dx));
 
  447       libmesh_assert_equal_to(d1yd1x, 1. / (d1xd1dy - d1yd1dy * d1xd1dx / d1yd1dx));
 
  448       libmesh_assert_equal_to(d2xd2x, 1. / (d2xd2dx - d2xd2dy * d2yd2dx / d2yd2dy));
 
  449       libmesh_assert_equal_to(d2xd2y, 1. / (d2yd2dx - d2xd2dx * d2yd2dy / d2xd2dy));
 
  450       libmesh_assert_equal_to(d2yd2y, 1. / (d2yd2dy - d2yd2dx * d2xd2dy / d2xd2dx));
 
  451       libmesh_assert_equal_to(d2yd2x, 1. / (d2xd2dy - d2yd2dy * d2xd2dx / d2yd2dx));
 
  452       libmesh_assert_equal_to(d3xd3x, 1. / (d3xd3dx - d3xd3dy * d3yd3dx / d3yd3dy));
 
  453       libmesh_assert_equal_to(d3xd3y, 1. / (d3yd3dx - d3xd3dx * d3yd3dy / d3xd3dy));
 
  454       libmesh_assert_equal_to(d3yd3y, 1. / (d3yd3dy - d3yd3dx * d3xd3dy / d3xd3dx));
 
  455       libmesh_assert_equal_to(d3yd3x, 1. / (d3xd3dy - d3yd3dy * d3xd3dx / d3yd3dx));
 
  456       libmesh_assert_equal_to(d1xd2n, -(d1xd1x * d1xd2ndn + d1xd1y * d1yd2ndn) / d2nd2ndn);
 
  457       libmesh_assert_equal_to(d1yd2n, -(d1yd1y * d1yd2ndn + d1yd1x * d1xd2ndn) / d2nd2ndn);
 
  458       libmesh_assert_equal_to(d1xd3n, -(d1xd1x * d1xd3ndn + d1xd1y * d1yd3ndn) / d3nd3ndn);
 
  459       libmesh_assert_equal_to(d1yd3n, -(d1yd1y * d1yd3ndn + d1yd1x * d1xd3ndn) / d3nd3ndn);
 
  460       libmesh_assert_equal_to(d2xd3n, -(d2xd2x * d2xd3ndn + d2xd2y * d2yd3ndn) / d3nd3ndn);
 
  461       libmesh_assert_equal_to(d2yd3n, -(d2yd2y * d2yd3ndn + d2yd2x * d2xd3ndn) / d3nd3ndn);
 
  462       libmesh_assert_equal_to(d2xd1n, -(d2xd2x * d2xd1ndn + d2xd2y * d2yd1ndn) / d1nd1ndn);
 
  463       libmesh_assert_equal_to(d2yd1n, -(d2yd2y * d2yd1ndn + d2yd2x * d2xd1ndn) / d1nd1ndn);
 
  464       libmesh_assert_equal_to(d3xd1n, -(d3xd3x * d3xd1ndn + d3xd3y * d3yd1ndn) / d1nd1ndn);
 
  465       libmesh_assert_equal_to(d3yd1n, -(d3yd3y * d3yd1ndn + d3yd3x * d3xd1ndn) / d1nd1ndn);
 
  466       libmesh_assert_equal_to(d3xd2n, -(d3xd3x * d3xd2ndn + d3xd3y * d3yd2ndn) / d2nd2ndn);
 
  467       libmesh_assert_equal_to(d3yd2n, -(d3yd3y * d3yd2ndn + d3yd3x * d3xd2ndn) / d2nd2ndn);
 
  471   d1d2n = -(d1d2ndx * N2x + d1d2ndy * N2y) / d2nd2ndn;
 
  472   d1d3n = -(d1d3ndx * N3x + d1d3ndy * N3y) / d3nd3ndn;
 
  473   d2d3n = -(d2d3ndx * N3x + d2d3ndy * N3y) / d3nd3ndn;
 
  474   d2d1n = -(d2d1ndx * N1x + d2d1ndy * N1y) / d1nd1ndn;
 
  475   d3d1n = -(d3d1ndx * N1x + d3d1ndy * N1y) / d1nd1ndn;
 
  476   d3d2n = -(d3d2ndx * N2x + d3d2ndy * N2y) / d2nd2ndn;
 
  480   d1xd1x = 1. / (d1xd1dx - d1xd1dy * d1yd1dx / d1yd1dy);
 
  481   d1xd1y = 1. / (d1yd1dx - d1xd1dx * d1yd1dy / d1xd1dy);
 
  483   d1yd1y = 1. / (d1yd1dy - d1yd1dx * d1xd1dy / d1xd1dx);
 
  484   d1yd1x = 1. / (d1xd1dy - d1yd1dy * d1xd1dx / d1yd1dx);
 
  486   d2xd2x = 1. / (d2xd2dx - d2xd2dy * d2yd2dx / d2yd2dy);
 
  487   d2xd2y = 1. / (d2yd2dx - d2xd2dx * d2yd2dy / d2xd2dy);
 
  489   d2yd2y = 1. / (d2yd2dy - d2yd2dx * d2xd2dy / d2xd2dx);
 
  490   d2yd2x = 1. / (d2xd2dy - d2yd2dy * d2xd2dx / d2yd2dx);
 
  492   d3xd3x = 1. / (d3xd3dx - d3xd3dy * d3yd3dx / d3yd3dy);
 
  493   d3xd3y = 1. / (d3yd3dx - d3xd3dx * d3yd3dy / d3xd3dy);
 
  495   d3yd3y = 1. / (d3yd3dy - d3yd3dx * d3xd3dy / d3xd3dx);
 
  496   d3yd3x = 1. / (d3xd3dy - d3yd3dy * d3xd3dx / d3yd3dx);
 
  515   d1xd2n = -(d1xd1x * d1xd2ndn + d1xd1y * d1yd2ndn) / d2nd2ndn;
 
  516   d1yd2n = -(d1yd1y * d1yd2ndn + d1yd1x * d1xd2ndn) / d2nd2ndn;
 
  517   d1xd3n = -(d1xd1x * d1xd3ndn + d1xd1y * d1yd3ndn) / d3nd3ndn;
 
  518   d1yd3n = -(d1yd1y * d1yd3ndn + d1yd1x * d1xd3ndn) / d3nd3ndn;
 
  519   d2xd3n = -(d2xd2x * d2xd3ndn + d2xd2y * d2yd3ndn) / d3nd3ndn;
 
  520   d2yd3n = -(d2yd2y * d2yd3ndn + d2yd2x * d2xd3ndn) / d3nd3ndn;
 
  521   d2xd1n = -(d2xd2x * d2xd1ndn + d2xd2y * d2yd1ndn) / d1nd1ndn;
 
  522   d2yd1n = -(d2yd2y * d2yd1ndn + d2yd2x * d2xd1ndn) / d1nd1ndn;
 
  523   d3xd1n = -(d3xd3x * d3xd1ndn + d3xd3y * d3yd1ndn) / d1nd1ndn;
 
  524   d3yd1n = -(d3yd3y * d3yd1ndn + d3yd3x * d3xd1ndn) / d1nd1ndn;
 
  525   d3xd2n = -(d3xd3x * d3xd2ndn + d3xd3y * d3yd2ndn) / d2nd2ndn;
 
  526   d3yd2n = -(d3yd3y * d3yd2ndn + d3yd3x * d3xd2ndn) / d2nd2ndn;
 
  528   old_elem_id = elem->id();
 
  576 unsigned char subtriangle_lookup(
const Point & p)
 
  578   if ((p(0) >= p(1)) && (p(0) + 2 * p(1) <= 1))
 
  580   if ((p(0) <= p(1)) && (p(1) + 2 * p(0) <= 1))
 
  586 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
  589 Real clough_raw_shape_second_deriv(
const unsigned int basis_num,
 
  590                                    const unsigned int deriv_type,
 
  593   Real xi = p(0), eta = p(1);
 
  603           switch (subtriangle_lookup(p))
 
  608               return -30 + 42*xi + 42*eta;
 
  610               return -6 + 18*xi - 6*eta;
 
  613               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  614                                 subtriangle_lookup(p));
 
  617           switch (subtriangle_lookup(p))
 
  622               return 18 - 27*xi - 21*eta;
 
  624               return 6 - 15*xi + 3*eta;
 
  627               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  628                                 subtriangle_lookup(p));
 
  631           switch (subtriangle_lookup(p))
 
  636               return 12 - 15*xi - 21*eta;
 
  638               return -3*xi + 3*eta;
 
  641               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  642                                 subtriangle_lookup(p));
 
  645           switch (subtriangle_lookup(p))
 
  650               return -9 + 13*xi + 8*eta;
 
  652               return -1 - 7*xi + 4*eta;
 
  655               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  656                                 subtriangle_lookup(p));
 
  659           switch (subtriangle_lookup(p))
 
  664               return 1 - 2*xi + 3*eta;
 
  666               return -3 + 14*xi - eta;
 
  669               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  670                                 subtriangle_lookup(p));
 
  673           switch (subtriangle_lookup(p))
 
  678               return -4 + 17./2.*xi + 7./2.*eta;
 
  680               return -2 + 13./2.*xi - 1./2.*eta;
 
  683               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  684                                 subtriangle_lookup(p));
 
  687           switch (subtriangle_lookup(p))
 
  692               return 9 - 23./2.*xi - 23./2.*eta;
 
  694               return -1 + 5./2.*xi + 9./2.*eta;
 
  697               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  698                                 subtriangle_lookup(p));
 
  701           switch (subtriangle_lookup(p))
 
  706               return 7 - 17./2.*xi - 25./2.*eta;
 
  708               return 1 - 13./2.*xi + 7./2.*eta;
 
  711               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  712                                 subtriangle_lookup(p));
 
  715           switch (subtriangle_lookup(p))
 
  720               return -2 + 5./2.*xi + 7./2.*eta;
 
  722               return 1./2.*xi - 1./2.*eta;
 
  725               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  726                                 subtriangle_lookup(p));
 
  729           switch (subtriangle_lookup(p))
 
  734               return std::sqrt(2.) * (8 - 10*xi - 14*eta);
 
  739               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  740                                 subtriangle_lookup(p));
 
  743           switch (subtriangle_lookup(p))
 
  748               return -4 + 4*xi + 8*eta;
 
  750               return -4 + 20*xi - 8*eta;
 
  753               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  754                                 subtriangle_lookup(p));
 
  757           switch (subtriangle_lookup(p))
 
  762               return -12 + 16*xi + 12*eta;
 
  764               return 4 - 16*xi - 4*eta;
 
  767               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  768                                 subtriangle_lookup(p));
 
  772           libmesh_error_msg(
"Invalid shape function index i = " <<
 
  781           switch (subtriangle_lookup(p))
 
  792               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  793                                 subtriangle_lookup(p));
 
  796           switch (subtriangle_lookup(p))
 
  801               return 15 - 21*xi - 21*eta;
 
  806               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  807                                 subtriangle_lookup(p));
 
  810           switch (subtriangle_lookup(p))
 
  815               return 15 - 21*xi - 21*eta;
 
  820               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  821                                 subtriangle_lookup(p));
 
  824           switch (subtriangle_lookup(p))
 
  829               return -4 + 8*xi + 3*eta;
 
  831               return -3 + 4*xi + 4*eta;
 
  834               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  835                                 subtriangle_lookup(p));
 
  838           switch (subtriangle_lookup(p))
 
  841               return -3 + 4*xi + 4*eta;
 
  843               return - 4 + 3*xi + 8*eta;
 
  848               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  849                                 subtriangle_lookup(p));
 
  852           switch (subtriangle_lookup(p))
 
  857               return -5./2. + 7./2.*xi + 7./2.*eta;
 
  862               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  863                                 subtriangle_lookup(p));
 
  866           switch (subtriangle_lookup(p))
 
  869               return -1 + 4*xi + 7./2.*eta;
 
  871               return 19./2. - 23./2.*xi - 25./2.*eta;
 
  876               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  877                                 subtriangle_lookup(p));
 
  880           switch (subtriangle_lookup(p))
 
  885               return 19./2. - 25./2.*xi - 23./2.*eta;
 
  887               return -1 + 7./2.*xi + 4*eta;
 
  890               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  891                                 subtriangle_lookup(p));
 
  894           switch (subtriangle_lookup(p))
 
  899               return -5./2. + 7./2.*xi + 7./2.*eta;
 
  904               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  905                                 subtriangle_lookup(p));
 
  908           switch (subtriangle_lookup(p))
 
  913               return std::sqrt(2.) * (10 - 14*xi - 14*eta);
 
  918               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  919                                 subtriangle_lookup(p));
 
  922           switch (subtriangle_lookup(p))
 
  927               return - 8 + 8*xi + 12*eta;
 
  929               return 4 - 8*xi - 8*eta;
 
  932               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  933                                 subtriangle_lookup(p));
 
  936           switch (subtriangle_lookup(p))
 
  939               return 4 - 8*xi - 8*eta;
 
  941               return -8 + 12*xi + 8*eta;
 
  946               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  947                                 subtriangle_lookup(p));
 
  951           libmesh_error_msg(
"Invalid shape function index i = " <<
 
  960           switch (subtriangle_lookup(p))
 
  963               return -6 - 6*xi + 18*eta;
 
  965               return -30 + 42*xi + 42*eta;
 
  970               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  971                                 subtriangle_lookup(p));
 
  974           switch (subtriangle_lookup(p))
 
  979               return 12 - 21*xi - 15*eta;
 
  984               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  985                                 subtriangle_lookup(p));
 
  988           switch (subtriangle_lookup(p))
 
  991               return 6 + 3*xi - 15*eta;
 
  993               return 18 - 21.*xi - 27*eta;
 
  998               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
  999                                 subtriangle_lookup(p));
 
 1002           switch (subtriangle_lookup(p))
 
 1005               return -3 - xi + 14*eta;
 
 1007               return 1 + 3*xi - 2*eta;
 
 1012               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1013                                 subtriangle_lookup(p));
 
 1016           switch (subtriangle_lookup(p))
 
 1019               return -1 + 4*xi - 7*eta;
 
 1021               return -9 + 8*xi + 13*eta;
 
 1026               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1027                                 subtriangle_lookup(p));
 
 1030           switch (subtriangle_lookup(p))
 
 1033               return - 1./2.*xi + 1./2.*eta;
 
 1035               return -2 + 7./2.*xi + 5./2.*eta;
 
 1040               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1041                                 subtriangle_lookup(p));
 
 1044           switch (subtriangle_lookup(p))
 
 1047               return 1 + 7./2.*xi - 13./2.*eta;
 
 1049               return 7 - 25./2.*xi - 17./2.*eta;
 
 1054               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1055                                 subtriangle_lookup(p));
 
 1058           switch (subtriangle_lookup(p))
 
 1061               return -1 + 9./2.*xi + 5./2.*eta;
 
 1063               return 9 - 23./2.*xi - 23./2.*eta;
 
 1068               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1069                                 subtriangle_lookup(p));
 
 1072           switch (subtriangle_lookup(p))
 
 1075               return -2 - 1./2.*xi + 13./2.*eta;
 
 1077               return -4 + 7./2.*xi + 17./2.*eta;
 
 1082               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1083                                 subtriangle_lookup(p));
 
 1086           switch (subtriangle_lookup(p))
 
 1091               return std::sqrt(2.) * (8 - 14*xi - 10*eta);
 
 1096               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1097                                 subtriangle_lookup(p));
 
 1100           switch (subtriangle_lookup(p))
 
 1103               return 4 - 4*xi - 16*eta;
 
 1105               return -12 + 12*xi + 16*eta;
 
 1110               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1111                                 subtriangle_lookup(p));
 
 1114           switch (subtriangle_lookup(p))
 
 1117               return -4 - 8*xi + 20*eta;
 
 1119               return -4 + 8*xi + 4*eta;
 
 1124               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1125                                 subtriangle_lookup(p));
 
 1129           libmesh_error_msg(
"Invalid shape function index i = " <<
 
 1134       libmesh_error_msg(
"Invalid shape function derivative j = " <<
 
 1143 Real clough_raw_shape_deriv(
const unsigned int basis_num,
 
 1144                             const unsigned int deriv_type,
 
 1147   Real xi = p(0), eta = p(1);
 
 1156           switch (subtriangle_lookup(p))
 
 1159               return -6*xi + 6*xi*xi
 
 1162               return 9 - 30*xi + 21*xi*xi
 
 1163                 - 30*eta + 42*xi*eta
 
 1166               return -6*xi + 9*xi*xi
 
 1170               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1171                                 subtriangle_lookup(p));
 
 1174           switch (subtriangle_lookup(p))
 
 1177               return 6*xi - 6*xi*xi
 
 1180               return - 9./2. + 18*xi - 27./2.*xi*xi
 
 1181                 + 15*eta - 21*xi*eta
 
 1184               return 6*xi - 15./2.*xi*xi
 
 1188               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1189                                 subtriangle_lookup(p));
 
 1192           switch (subtriangle_lookup(p))
 
 1195               return 3./2.*eta*eta;
 
 1197               return - 9./2. + 12*xi - 15./2.*xi*xi
 
 1198                 + 15*eta - 21*xi*eta
 
 1205               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1206                                 subtriangle_lookup(p));
 
 1209           switch (subtriangle_lookup(p))
 
 1212               return 1 - 4*xi + 3*xi*xi
 
 1215               return 5./2. - 9*xi + 13./2.*xi*xi
 
 1219               return 1 - xi - 7./2.*xi*xi
 
 1224               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1225                                 subtriangle_lookup(p));
 
 1228           switch (subtriangle_lookup(p))
 
 1231               return - 3*eta + 4*xi*eta
 
 1238               return -3*xi + 7*xi*xi
 
 1242               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1243                                 subtriangle_lookup(p));
 
 1246           switch (subtriangle_lookup(p))
 
 1249               return -2*xi + 3*xi*xi
 
 1252               return 3./4. - 4*xi + 17./4.*xi*xi
 
 1253                 - 5./2.*eta + 7./2.*xi*eta
 
 1256               return -2*xi + 13./4.*xi*xi
 
 1260               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1261                                 subtriangle_lookup(p));
 
 1264           switch (subtriangle_lookup(p))
 
 1267               return -eta + 4*xi*eta
 
 1270               return -13./4. + 9*xi - 23./4.*xi*xi
 
 1271                 + 19./2.*eta - 23./2.*xi*eta
 
 1274               return -xi + 5./4.*xi*xi
 
 1278               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1279                                 subtriangle_lookup(p));
 
 1282           switch (subtriangle_lookup(p))
 
 1285               return 9./4.*eta*eta;
 
 1287               return - 11./4. + 7*xi - 17./4.*xi*xi
 
 1288                 + 19./2.*eta - 25./2.*xi*eta
 
 1291               return xi - 13./4.*xi*xi
 
 1292                 - eta + 7./2.*xi*eta + 2*eta*eta;
 
 1295               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1296                                 subtriangle_lookup(p));
 
 1299           switch (subtriangle_lookup(p))
 
 1302               return - 1./4.*eta*eta;
 
 1304               return 3./4. - 2*xi + 5./4.*xi*xi
 
 1305                 - 5./2.*eta + 7./2.*xi*eta
 
 1312               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1313                                 subtriangle_lookup(p));
 
 1316           switch (subtriangle_lookup(p))
 
 1321               return std::sqrt(2.) * (-3 + 8*xi - 5*xi*xi
 
 1322                                       + 10*eta - 14*xi*eta
 
 1325               return std::sqrt(2.) * (-xi*xi + 2*xi*eta);
 
 1328               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1329                                 subtriangle_lookup(p));
 
 1332           switch (subtriangle_lookup(p))
 
 1337               return 2 - 4*xi + 2*xi*xi
 
 1341               return -4*xi + 10*xi*xi
 
 1346               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1347                                 subtriangle_lookup(p));
 
 1350           switch (subtriangle_lookup(p))
 
 1353               return 4*eta - 8*xi*eta
 
 1356               return 4 - 12*xi + 8*xi*xi
 
 1360               return 4*xi - 8*xi*xi
 
 1364               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1365                                 subtriangle_lookup(p));
 
 1369           libmesh_error_msg(
"Invalid shape function index i = " <<
 
 1378           switch (subtriangle_lookup(p))
 
 1381               return - 6*eta - 6*xi*eta + 9*eta*eta;
 
 1383               return 9 - 30*xi + 21*xi*xi
 
 1384                 - 30*eta + 42*xi*eta + 21*eta*eta;
 
 1387                 - 6*eta + 6*eta*eta;
 
 1390               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1391                                 subtriangle_lookup(p));
 
 1394           switch (subtriangle_lookup(p))
 
 1400               return - 9./2. + 15*xi - 21./2.*xi*xi
 
 1401                 + 12*eta - 21*xi*eta - 15./2.*eta*eta;
 
 1403               return + 3./2.*xi*xi;
 
 1406               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1407                                 subtriangle_lookup(p));
 
 1410           switch (subtriangle_lookup(p))
 
 1413               return 6*eta + 3*xi*eta - 15./2.*eta*eta;
 
 1415               return - 9./2. + 15*xi - 21./2.*xi*xi
 
 1416                 + 18*eta - 21.*xi*eta - 27./2.*eta*eta;
 
 1419                 + 6*eta - 6*eta*eta;
 
 1422               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1423                                 subtriangle_lookup(p));
 
 1426           switch (subtriangle_lookup(p))
 
 1429               return - 3*eta - xi*eta + 7*eta*eta;
 
 1431               return - 4*xi + 4*xi*xi
 
 1432                 + eta + 3*xi*eta - eta*eta;
 
 1434               return - 3*xi + 2*xi*xi
 
 1438               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1439                                 subtriangle_lookup(p));
 
 1442           switch (subtriangle_lookup(p))
 
 1445               return 1 - 3*xi + 2*xi*xi
 
 1446                 - eta + 4*xi*eta - 7./2.*eta*eta;
 
 1448               return 5./2. - 4*xi + 3./2.*xi*xi
 
 1449                 - 9.*eta + 8*xi*eta + 13./2.*eta*eta;
 
 1451               return 1 - 1./2.*xi*xi - 4*eta + 3*eta*eta;
 
 1454               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1455                                 subtriangle_lookup(p));
 
 1458           switch (subtriangle_lookup(p))
 
 1461               return - 1./2.*xi*eta + 1./4.*eta*eta;
 
 1463               return 3./4. - 5./2.*xi + 7./4.*xi*xi
 
 1464                 - 2*eta + 7./2.*xi*eta + 5./4.*eta*eta;
 
 1466               return - 1./4.*xi*xi;
 
 1469               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1470                                 subtriangle_lookup(p));
 
 1473           switch (subtriangle_lookup(p))
 
 1476               return -xi + 2*xi*xi
 
 1477                 + eta + 7./2.*xi*eta - 13./4.*eta*eta;
 
 1479               return - 11./4. + 19./2.*xi - 23./4.*xi*xi
 
 1480                 + 7*eta - 25./2.*xi*eta - 17./4.*eta*eta;
 
 1485               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1486                                 subtriangle_lookup(p));
 
 1489           switch (subtriangle_lookup(p))
 
 1492               return -eta + 9./2.*xi*eta + 5./4.*eta*eta;
 
 1494               return - 13./4. + 19./2.*xi - 25./4.*xi*xi
 
 1495                 + 9*eta - 23./2.*xi*eta - 23./4.*eta*eta;
 
 1497               return - xi + 7./4.*xi*xi + 4*xi*eta;
 
 1500               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1501                                 subtriangle_lookup(p));
 
 1504           switch (subtriangle_lookup(p))
 
 1507               return -2*eta - 1./2.*xi*eta + 13./4.*eta*eta;
 
 1509               return 3./4. - 5./2.*xi + 7./4.*xi*xi
 
 1510                 - 4*eta + 7./2.*xi*eta + 17./4.*eta*eta;
 
 1512               return - 1./4.*xi*xi
 
 1513                 - 2*eta + 3*eta*eta;
 
 1516               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1517                                 subtriangle_lookup(p));
 
 1520           switch (subtriangle_lookup(p))
 
 1523               return std::sqrt(2.) * (2*xi*eta - eta*eta);
 
 1525               return std::sqrt(2.) * (- 3 + 10*xi - 7*xi*xi
 
 1526                                       + 8*eta - 14*xi*eta - 5*eta*eta);
 
 1531               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1532                                 subtriangle_lookup(p));
 
 1535           switch (subtriangle_lookup(p))
 
 1538               return 4*eta - 4*xi*eta - 8*eta*eta;
 
 1540               return 4 - 8*xi + 4*xi*xi
 
 1541                 - 12*eta + 12*xi*eta + 8*eta*eta;
 
 1543               return 4*xi - 4*xi*xi
 
 1547               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1548                                 subtriangle_lookup(p));
 
 1551           switch (subtriangle_lookup(p))
 
 1554               return 4*xi - 4*xi*xi
 
 1555                 - 4*eta - 8*xi*eta + 10.*eta*eta;
 
 1557               return 2 - 8*xi + 6*xi*xi
 
 1558                 - 4*eta + 8*xi*eta + 2*eta*eta;
 
 1563               libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1564                                 subtriangle_lookup(p));
 
 1568           libmesh_error_msg(
"Invalid shape function index i = " <<
 
 1573       libmesh_error_msg(
"Invalid shape function derivative j = " <<
 
 1578 Real clough_raw_shape(
const unsigned int basis_num,
 
 1581   Real xi = p(0), eta = p(1);
 
 1586       switch (subtriangle_lookup(p))
 
 1589           return 1 - 3*xi*xi + 2*xi*xi*xi
 
 1590             - 3*eta*eta - 3*xi*eta*eta + 3*eta*eta*eta;
 
 1592           return -1 + 9*xi - 15*xi*xi + 7*xi*xi*xi
 
 1593             + 9*eta - 30*xi*eta +21*xi*xi*eta
 
 1594             - 15*eta*eta + 21*xi*eta*eta + 7*eta*eta*eta;
 
 1596           return 1 - 3*xi*xi + 3*xi*xi*xi
 
 1598             - 3*eta*eta + 2*eta*eta*eta;
 
 1601           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1602                             subtriangle_lookup(p));
 
 1605       switch (subtriangle_lookup(p))
 
 1608           return 3*xi*xi - 2*xi*xi*xi
 
 1610             - 1./2.*eta*eta*eta;
 
 1612           return 1 - 9./2.*xi + 9*xi*xi - 9./2.*xi*xi*xi
 
 1613             - 9./2.*eta + 15*xi*eta - 21./2.*xi*xi*eta
 
 1614             + 6*eta*eta - 21./2.*xi*eta*eta - 5./2.*eta*eta*eta;
 
 1616           return 3*xi*xi - 5./2.*xi*xi*xi
 
 1620           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1621                             subtriangle_lookup(p));
 
 1624       switch (subtriangle_lookup(p))
 
 1627           return 3*eta*eta + 3./2.*xi*eta*eta - 5./2.*eta*eta*eta;
 
 1629           return 1 - 9./2.*xi + 6*xi*xi - 5./2.*xi*xi*xi
 
 1630             - 9./2.*eta + 15*xi*eta - 21./2.*xi*xi*eta
 
 1631             + 9*eta*eta - 21./2.*xi*eta*eta - 9./2.*eta*eta*eta;
 
 1633           return -1./2.*xi*xi*xi
 
 1635             + 3*eta*eta - 2*eta*eta*eta;
 
 1638           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1639                             subtriangle_lookup(p));
 
 1642       switch (subtriangle_lookup(p))
 
 1645           return xi - 2*xi*xi + xi*xi*xi
 
 1646             - 3./2.*eta*eta - 1./2.*xi*eta*eta + 7./3.*eta*eta*eta;
 
 1648           return -1./6. + 5./2.*xi - 9./2.*xi*xi + 13./6.*xi*xi*xi
 
 1649             - 4*xi*eta + 4*xi*xi*eta
 
 1650             + 1./2.*eta*eta + 3./2.*xi*eta*eta - 1./3.*eta*eta*eta;
 
 1652           return xi - 1./2.*xi*xi - 7./6.*xi*xi*xi
 
 1653             - 3*xi*eta + 2*xi*xi*eta
 
 1657           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1658                             subtriangle_lookup(p));
 
 1661       switch (subtriangle_lookup(p))
 
 1664           return eta - 3*xi*eta + 2*xi*xi*eta
 
 1665             - 1./2.*eta*eta + 2*xi*eta*eta - 7./6.*eta*eta*eta;
 
 1667           return -1./6. + 1./2.*xi*xi - 1./3.*xi*xi*xi
 
 1668             + 5./2.*eta - 4*xi*eta + 3./2.*xi*xi*eta
 
 1669             - 9./2.*eta*eta + 4*xi*eta*eta + 13./6.*eta*eta*eta;
 
 1671           return -3./2.*xi*xi + 7./3.*xi*xi*xi
 
 1672             + eta - 1./2.*xi*xi*eta - 2*eta*eta + eta*eta*eta;
 
 1675           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1676                             subtriangle_lookup(p));
 
 1679       switch (subtriangle_lookup(p))
 
 1682           return -xi*xi + xi*xi*xi
 
 1683             - 1./4.*xi*eta*eta + 1./12.*eta*eta*eta;
 
 1685           return -1./6. + 3./4.*xi - 2*xi*xi + 17./12.*xi*xi*xi
 
 1686             + 3./4.*eta - 5./2.*xi*eta + 7./4.*xi*xi*eta
 
 1687             - eta*eta + 7./4.*xi*eta*eta + 5./12.*eta*eta*eta;
 
 1689           return -xi*xi + 13./12.*xi*xi*xi
 
 1693           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1694                             subtriangle_lookup(p));
 
 1697       switch (subtriangle_lookup(p))
 
 1700           return -xi*eta + 2*xi*xi*eta
 
 1701             + 1./2.*eta*eta + 7./4.*xi*eta*eta - 13./12.*eta*eta*eta;
 
 1703           return 2./3. - 13./4.*xi + 9./2.*xi*xi - 23./12.*xi*xi*xi
 
 1704             - 11./4.*eta + 19./2.*xi*eta - 23./4.*xi*xi*eta
 
 1705             + 7./2.*eta*eta - 25./4.*xi*eta*eta - 17./12.*eta*eta*eta;
 
 1707           return -1./2.*xi*xi + 5./12.*xi*xi*xi
 
 1711           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1712                             subtriangle_lookup(p));
 
 1715       switch (subtriangle_lookup(p))
 
 1718           return -1./2.*eta*eta + 9./4.*xi*eta*eta + 5./12.*eta*eta*eta;
 
 1720           return 2./3. - 11./4.*xi + 7./2.*xi*xi - 17./12.*xi*xi*xi
 
 1721             - 13./4.*eta + 19./2.*xi*eta - 25./4.*xi*xi*eta
 
 1722             + 9./2.*eta*eta - 23./4.*xi*eta*eta - 23./12.*eta*eta*eta;
 
 1724           return 1./2.*xi*xi - 13./12.*xi*xi*xi
 
 1725             - xi*eta + 7./4.*xi*xi*eta + 2*xi*eta*eta;
 
 1728           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1729                             subtriangle_lookup(p));
 
 1732       switch (subtriangle_lookup(p))
 
 1735           return -eta*eta - 1./4.*xi*eta*eta + 13./12.*eta*eta*eta;
 
 1737           return -1./6. + 3./4.*xi - xi*xi + 5./12.*xi*xi*xi
 
 1738             + 3./4.*eta - 5./2.*xi*eta + 7./4.*xi*xi*eta
 
 1739             - 2*eta*eta + 7./4.*xi*eta*eta + 17./12.*eta*eta*eta;
 
 1741           return 1./12.*xi*xi*xi
 
 1743             - eta*eta + eta*eta*eta;
 
 1746           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1747                             subtriangle_lookup(p));
 
 1750       switch (subtriangle_lookup(p))
 
 1753           return std::sqrt(2.) * (xi*eta*eta - 1./3.*eta*eta*eta);
 
 1755           return std::sqrt(2.) * (2./3. - 3*xi + 4*xi*xi - 5./3.*xi*xi*xi
 
 1756                                   - 3*eta + 10*xi*eta - 7*xi*xi*eta
 
 1757                                   + 4*eta*eta - 7*xi*eta*eta - 5./3.*eta*eta*eta);
 
 1759           return std::sqrt(2.) * (-1./3.*xi*xi*xi + xi*xi*eta);
 
 1762           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1763                             subtriangle_lookup(p));
 
 1766       switch (subtriangle_lookup(p))
 
 1769           return 2*eta*eta - 2*xi*eta*eta - 8./3.*eta*eta*eta;
 
 1771           return -2./3. + 2*xi - 2*xi*xi + 2./3.*xi*xi*xi
 
 1772             + 4*eta - 8*xi*eta + 4*xi*xi*eta
 
 1773             - 6*eta*eta + 6*xi*eta*eta + 8./3.*eta*eta*eta;
 
 1775           return -2*xi*xi + 10./3.*xi*xi*xi
 
 1776             + 4*xi*eta - 4*xi*xi*eta
 
 1780           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1781                             subtriangle_lookup(p));
 
 1784       switch (subtriangle_lookup(p))
 
 1787           return 4*xi*eta - 4*xi*xi*eta
 
 1788             - 2*eta*eta - 4*xi*eta*eta + 10./3.*eta*eta*eta;
 
 1790           return -2./3. + 4*xi - 6*xi*xi + 8./3.*xi*xi*xi
 
 1791             + 2*eta - 8*xi*eta + 6*xi*xi*eta
 
 1792             - 2*eta*eta + 4*xi*eta*eta + 2./3.*eta*eta*eta;
 
 1794           return 2*xi*xi - 8./3.*xi*xi*xi
 
 1798           libmesh_error_msg(
"Invalid subtriangle lookup = " <<
 
 1799                             subtriangle_lookup(p));
 
 1803       libmesh_error_msg(
"Invalid shape function index i = " <<
 
 1822   libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
 
 1831                          const unsigned int i,
 
 1833                          const bool add_p_level)
 
 1837   clough_compute_coefs(elem);
 
 1841   const Order totalorder =
 
 1842     static_cast<Order>(order + add_p_level * elem->
p_level());
 
 1852         libmesh_experimental();
 
 1858               libmesh_assert_less (i, 9);
 
 1867                   return clough_raw_shape(0, p)
 
 1868                     + d1d2n * clough_raw_shape(10, p)
 
 1869                     + d1d3n * clough_raw_shape(11, p);
 
 1871                   return clough_raw_shape(1, p)
 
 1872                     + d2d3n * clough_raw_shape(11, p)
 
 1873                     + d2d1n * clough_raw_shape(9, p);
 
 1875                   return clough_raw_shape(2, p)
 
 1876                     + d3d1n * clough_raw_shape(9, p)
 
 1877                     + d3d2n * clough_raw_shape(10, p);
 
 1879                   return d1xd1x * clough_raw_shape(3, p)
 
 1880                     + d1xd1y * clough_raw_shape(4, p)
 
 1881                     + d1xd2n * clough_raw_shape(10, p)
 
 1882                     + d1xd3n * clough_raw_shape(11, p)
 
 1883                     + 0.5 * N01x * d3nd3n * clough_raw_shape(11, p)
 
 1884                     + 0.5 * N02x * d2nd2n * clough_raw_shape(10, p);
 
 1886                   return d1yd1y * clough_raw_shape(4, p)
 
 1887                     + d1yd1x * clough_raw_shape(3, p)
 
 1888                     + d1yd2n * clough_raw_shape(10, p)
 
 1889                     + d1yd3n * clough_raw_shape(11, p)
 
 1890                     + 0.5 * N01y * d3nd3n * clough_raw_shape(11, p)
 
 1891                     + 0.5 * N02y * d2nd2n * clough_raw_shape(10, p);
 
 1893                   return d2xd2x * clough_raw_shape(5, p)
 
 1894                     + d2xd2y * clough_raw_shape(6, p)
 
 1895                     + d2xd3n * clough_raw_shape(11, p)
 
 1896                     + d2xd1n * clough_raw_shape(9, p)
 
 1897                     + 0.5 * N10x * d3nd3n * clough_raw_shape(11, p)
 
 1898                     + 0.5 * N12x * d1nd1n * clough_raw_shape(9, p);
 
 1900                   return d2yd2y * clough_raw_shape(6, p)
 
 1901                     + d2yd2x * clough_raw_shape(5, p)
 
 1902                     + d2yd3n * clough_raw_shape(11, p)
 
 1903                     + d2yd1n * clough_raw_shape(9, p)
 
 1904                     + 0.5 * N10y * d3nd3n * clough_raw_shape(11, p)
 
 1905                     + 0.5 * N12y * d1nd1n * clough_raw_shape(9, p);
 
 1907                   return d3xd3x * clough_raw_shape(7, p)
 
 1908                     + d3xd3y * clough_raw_shape(8, p)
 
 1909                     + d3xd1n * clough_raw_shape(9, p)
 
 1910                     + d3xd2n * clough_raw_shape(10, p)
 
 1911                     + 0.5 * N20x * d2nd2n * clough_raw_shape(10, p)
 
 1912                     + 0.5 * N21x * d1nd1n * clough_raw_shape(9, p);
 
 1914                   return d3yd3y * clough_raw_shape(8, p)
 
 1915                     + d3yd3x * clough_raw_shape(7, p)
 
 1916                     + d3yd1n * clough_raw_shape(9, p)
 
 1917                     + d3yd2n * clough_raw_shape(10, p)
 
 1918                     + 0.5 * N20y * d2nd2n * clough_raw_shape(10, p)
 
 1919                     + 0.5 * N21y * d1nd1n * clough_raw_shape(9, p);
 
 1921                   libmesh_error_msg(
"Invalid shape function index i = " << i);
 
 1925             libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
 1936               libmesh_assert_less (i, 12);
 
 1946                   return clough_raw_shape(0, p)
 
 1947                     + d1d2n * clough_raw_shape(10, p)
 
 1948                     + d1d3n * clough_raw_shape(11, p);
 
 1950                   return clough_raw_shape(1, p)
 
 1951                     + d2d3n * clough_raw_shape(11, p)
 
 1952                     + d2d1n * clough_raw_shape(9, p);
 
 1954                   return clough_raw_shape(2, p)
 
 1955                     + d3d1n * clough_raw_shape(9, p)
 
 1956                     + d3d2n * clough_raw_shape(10, p);
 
 1958                   return d1xd1x * clough_raw_shape(3, p)
 
 1959                     + d1xd1y * clough_raw_shape(4, p)
 
 1960                     + d1xd2n * clough_raw_shape(10, p)
 
 1961                     + d1xd3n * clough_raw_shape(11, p);
 
 1963                   return d1yd1y * clough_raw_shape(4, p)
 
 1964                     + d1yd1x * clough_raw_shape(3, p)
 
 1965                     + d1yd2n * clough_raw_shape(10, p)
 
 1966                     + d1yd3n * clough_raw_shape(11, p);
 
 1968                   return d2xd2x * clough_raw_shape(5, p)
 
 1969                     + d2xd2y * clough_raw_shape(6, p)
 
 1970                     + d2xd3n * clough_raw_shape(11, p)
 
 1971                     + d2xd1n * clough_raw_shape(9, p);
 
 1973                   return d2yd2y * clough_raw_shape(6, p)
 
 1974                     + d2yd2x * clough_raw_shape(5, p)
 
 1975                     + d2yd3n * clough_raw_shape(11, p)
 
 1976                     + d2yd1n * clough_raw_shape(9, p);
 
 1978                   return d3xd3x * clough_raw_shape(7, p)
 
 1979                     + d3xd3y * clough_raw_shape(8, p)
 
 1980                     + d3xd1n * clough_raw_shape(9, p)
 
 1981                     + d3xd2n * clough_raw_shape(10, p);
 
 1983                   return d3yd3y * clough_raw_shape(8, p)
 
 1984                     + d3yd3x * clough_raw_shape(7, p)
 
 1985                     + d3yd1n * clough_raw_shape(9, p)
 
 1986                     + d3yd2n * clough_raw_shape(10, p);
 
 1988                   return d1nd1n * clough_raw_shape(9, p);
 
 1990                   return d2nd2n * clough_raw_shape(10, p);
 
 1992                   return d3nd3n * clough_raw_shape(11, p);
 
 1995                   libmesh_error_msg(
"Invalid shape function index i = " << i);
 
 1999             libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
 2004       libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
 
 2017   libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
 
 2026                                const unsigned int i,
 
 2027                                const unsigned int j,
 
 2029                                const bool add_p_level)
 
 2033   clough_compute_coefs(elem);
 
 2037   const Order totalorder =
 
 2038     static_cast<Order>(order + add_p_level * elem->
p_level());
 
 2048         libmesh_experimental();
 
 2054               libmesh_assert_less (i, 9);
 
 2063                   return clough_raw_shape_deriv(0, j, p)
 
 2064                     + d1d2n * clough_raw_shape_deriv(10, j, p)
 
 2065                     + d1d3n * clough_raw_shape_deriv(11, j, p);
 
 2067                   return clough_raw_shape_deriv(1, j, p)
 
 2068                     + d2d3n * clough_raw_shape_deriv(11, j, p)
 
 2069                     + d2d1n * clough_raw_shape_deriv(9, j, p);
 
 2071                   return clough_raw_shape_deriv(2, j, p)
 
 2072                     + d3d1n * clough_raw_shape_deriv(9, j, p)
 
 2073                     + d3d2n * clough_raw_shape_deriv(10, j, p);
 
 2075                   return d1xd1x * clough_raw_shape_deriv(3, j, p)
 
 2076                     + d1xd1y * clough_raw_shape_deriv(4, j, p)
 
 2077                     + d1xd2n * clough_raw_shape_deriv(10, j, p)
 
 2078                     + d1xd3n * clough_raw_shape_deriv(11, j, p)
 
 2079                     + 0.5 * N01x * d3nd3n * clough_raw_shape_deriv(11, j, p)
 
 2080                     + 0.5 * N02x * d2nd2n * clough_raw_shape_deriv(10, j, p);
 
 2082                   return d1yd1y * clough_raw_shape_deriv(4, j, p)
 
 2083                     + d1yd1x * clough_raw_shape_deriv(3, j, p)
 
 2084                     + d1yd2n * clough_raw_shape_deriv(10, j, p)
 
 2085                     + d1yd3n * clough_raw_shape_deriv(11, j, p)
 
 2086                     + 0.5 * N01y * d3nd3n * clough_raw_shape_deriv(11, j, p)
 
 2087                     + 0.5 * N02y * d2nd2n * clough_raw_shape_deriv(10, j, p);
 
 2089                   return d2xd2x * clough_raw_shape_deriv(5, j, p)
 
 2090                     + d2xd2y * clough_raw_shape_deriv(6, j, p)
 
 2091                     + d2xd3n * clough_raw_shape_deriv(11, j, p)
 
 2092                     + d2xd1n * clough_raw_shape_deriv(9, j, p)
 
 2093                     + 0.5 * N10x * d3nd3n * clough_raw_shape_deriv(11, j, p)
 
 2094                     + 0.5 * N12x * d1nd1n * clough_raw_shape_deriv(9, j, p);
 
 2096                   return d2yd2y * clough_raw_shape_deriv(6, j, p)
 
 2097                     + d2yd2x * clough_raw_shape_deriv(5, j, p)
 
 2098                     + d2yd3n * clough_raw_shape_deriv(11, j, p)
 
 2099                     + d2yd1n * clough_raw_shape_deriv(9, j, p)
 
 2100                     + 0.5 * N10y * d3nd3n * clough_raw_shape_deriv(11, j, p)
 
 2101                     + 0.5 * N12y * d1nd1n * clough_raw_shape_deriv(9, j, p);
 
 2103                   return d3xd3x * clough_raw_shape_deriv(7, j, p)
 
 2104                     + d3xd3y * clough_raw_shape_deriv(8, j, p)
 
 2105                     + d3xd1n * clough_raw_shape_deriv(9, j, p)
 
 2106                     + d3xd2n * clough_raw_shape_deriv(10, j, p)
 
 2107                     + 0.5 * N20x * d2nd2n * clough_raw_shape_deriv(10, j, p)
 
 2108                     + 0.5 * N21x * d1nd1n * clough_raw_shape_deriv(9, j, p);
 
 2110                   return d3yd3y * clough_raw_shape_deriv(8, j, p)
 
 2111                     + d3yd3x * clough_raw_shape_deriv(7, j, p)
 
 2112                     + d3yd1n * clough_raw_shape_deriv(9, j, p)
 
 2113                     + d3yd2n * clough_raw_shape_deriv(10, j, p)
 
 2114                     + 0.5 * N20y * d2nd2n * clough_raw_shape_deriv(10, j, p)
 
 2115                     + 0.5 * N21y * d1nd1n * clough_raw_shape_deriv(9, j, p);
 
 2117                   libmesh_error_msg(
"Invalid shape function index i = " << i);
 
 2121             libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
 2132               libmesh_assert_less (i, 12);
 
 2142                   return clough_raw_shape_deriv(0, j, p)
 
 2143                     + d1d2n * clough_raw_shape_deriv(10, j, p)
 
 2144                     + d1d3n * clough_raw_shape_deriv(11, j, p);
 
 2146                   return clough_raw_shape_deriv(1, j, p)
 
 2147                     + d2d3n * clough_raw_shape_deriv(11, j, p)
 
 2148                     + d2d1n * clough_raw_shape_deriv(9, j, p);
 
 2150                   return clough_raw_shape_deriv(2, j, p)
 
 2151                     + d3d1n * clough_raw_shape_deriv(9, j, p)
 
 2152                     + d3d2n * clough_raw_shape_deriv(10, j, p);
 
 2154                   return d1xd1x * clough_raw_shape_deriv(3, j, p)
 
 2155                     + d1xd1y * clough_raw_shape_deriv(4, j, p)
 
 2156                     + d1xd2n * clough_raw_shape_deriv(10, j, p)
 
 2157                     + d1xd3n * clough_raw_shape_deriv(11, j, p);
 
 2159                   return d1yd1y * clough_raw_shape_deriv(4, j, p)
 
 2160                     + d1yd1x * clough_raw_shape_deriv(3, j, p)
 
 2161                     + d1yd2n * clough_raw_shape_deriv(10, j, p)
 
 2162                     + d1yd3n * clough_raw_shape_deriv(11, j, p);
 
 2164                   return d2xd2x * clough_raw_shape_deriv(5, j, p)
 
 2165                     + d2xd2y * clough_raw_shape_deriv(6, j, p)
 
 2166                     + d2xd3n * clough_raw_shape_deriv(11, j, p)
 
 2167                     + d2xd1n * clough_raw_shape_deriv(9, j, p);
 
 2169                   return d2yd2y * clough_raw_shape_deriv(6, j, p)
 
 2170                     + d2yd2x * clough_raw_shape_deriv(5, j, p)
 
 2171                     + d2yd3n * clough_raw_shape_deriv(11, j, p)
 
 2172                     + d2yd1n * clough_raw_shape_deriv(9, j, p);
 
 2174                   return d3xd3x * clough_raw_shape_deriv(7, j, p)
 
 2175                     + d3xd3y * clough_raw_shape_deriv(8, j, p)
 
 2176                     + d3xd1n * clough_raw_shape_deriv(9, j, p)
 
 2177                     + d3xd2n * clough_raw_shape_deriv(10, j, p);
 
 2179                   return d3yd3y * clough_raw_shape_deriv(8, j, p)
 
 2180                     + d3yd3x * clough_raw_shape_deriv(7, j, p)
 
 2181                     + d3yd1n * clough_raw_shape_deriv(9, j, p)
 
 2182                     + d3yd2n * clough_raw_shape_deriv(10, j, p);
 
 2184                   return d1nd1n * clough_raw_shape_deriv(9, j, p);
 
 2186                   return d2nd2n * clough_raw_shape_deriv(10, j, p);
 
 2188                   return d3nd3n * clough_raw_shape_deriv(11, j, p);
 
 2191                   libmesh_error_msg(
"Invalid shape function index i = " << i);
 
 2195             libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
 2200       libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
 
 2206 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
 2215   libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
 
 2223                                       const unsigned int i,
 
 2224                                       const unsigned int j,
 
 2226                                       const bool add_p_level)
 
 2230   clough_compute_coefs(elem);
 
 2234   const Order totalorder =
 
 2235     static_cast<Order>(order + add_p_level * elem->
p_level());
 
 2247               libmesh_assert_less (i, 9);
 
 2256                   return clough_raw_shape_second_deriv(0, j, p)
 
 2257                     + d1d2n * clough_raw_shape_second_deriv(10, j, p)
 
 2258                     + d1d3n * clough_raw_shape_second_deriv(11, j, p);
 
 2260                   return clough_raw_shape_second_deriv(1, j, p)
 
 2261                     + d2d3n * clough_raw_shape_second_deriv(11, j, p)
 
 2262                     + d2d1n * clough_raw_shape_second_deriv(9, j, p);
 
 2264                   return clough_raw_shape_second_deriv(2, j, p)
 
 2265                     + d3d1n * clough_raw_shape_second_deriv(9, j, p)
 
 2266                     + d3d2n * clough_raw_shape_second_deriv(10, j, p);
 
 2268                   return d1xd1x * clough_raw_shape_second_deriv(3, j, p)
 
 2269                     + d1xd1y * clough_raw_shape_second_deriv(4, j, p)
 
 2270                     + d1xd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2271                     + d1xd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2272                     + 0.5 * N01x * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2273                     + 0.5 * N02x * d2nd2n * clough_raw_shape_second_deriv(10, j, p);
 
 2275                   return d1yd1y * clough_raw_shape_second_deriv(4, j, p)
 
 2276                     + d1yd1x * clough_raw_shape_second_deriv(3, j, p)
 
 2277                     + d1yd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2278                     + d1yd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2279                     + 0.5 * N01y * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2280                     + 0.5 * N02y * d2nd2n * clough_raw_shape_second_deriv(10, j, p);
 
 2282                   return d2xd2x * clough_raw_shape_second_deriv(5, j, p)
 
 2283                     + d2xd2y * clough_raw_shape_second_deriv(6, j, p)
 
 2284                     + d2xd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2285                     + d2xd1n * clough_raw_shape_second_deriv(9, j, p)
 
 2286                     + 0.5 * N10x * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2287                     + 0.5 * N12x * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
 
 2289                   return d2yd2y * clough_raw_shape_second_deriv(6, j, p)
 
 2290                     + d2yd2x * clough_raw_shape_second_deriv(5, j, p)
 
 2291                     + d2yd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2292                     + d2yd1n * clough_raw_shape_second_deriv(9, j, p)
 
 2293                     + 0.5 * N10y * d3nd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2294                     + 0.5 * N12y * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
 
 2296                   return d3xd3x * clough_raw_shape_second_deriv(7, j, p)
 
 2297                     + d3xd3y * clough_raw_shape_second_deriv(8, j, p)
 
 2298                     + d3xd1n * clough_raw_shape_second_deriv(9, j, p)
 
 2299                     + d3xd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2300                     + 0.5 * N20x * d2nd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2301                     + 0.5 * N21x * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
 
 2303                   return d3yd3y * clough_raw_shape_second_deriv(8, j, p)
 
 2304                     + d3yd3x * clough_raw_shape_second_deriv(7, j, p)
 
 2305                     + d3yd1n * clough_raw_shape_second_deriv(9, j, p)
 
 2306                     + d3yd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2307                     + 0.5 * N20y * d2nd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2308                     + 0.5 * N21y * d1nd1n * clough_raw_shape_second_deriv(9, j, p);
 
 2310                   libmesh_error_msg(
"Invalid shape function index i = " << i);
 
 2314             libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
 2325               libmesh_assert_less (i, 12);
 
 2335                   return clough_raw_shape_second_deriv(0, j, p)
 
 2336                     + d1d2n * clough_raw_shape_second_deriv(10, j, p)
 
 2337                     + d1d3n * clough_raw_shape_second_deriv(11, j, p);
 
 2339                   return clough_raw_shape_second_deriv(1, j, p)
 
 2340                     + d2d3n * clough_raw_shape_second_deriv(11, j, p)
 
 2341                     + d2d1n * clough_raw_shape_second_deriv(9, j, p);
 
 2343                   return clough_raw_shape_second_deriv(2, j, p)
 
 2344                     + d3d1n * clough_raw_shape_second_deriv(9, j, p)
 
 2345                     + d3d2n * clough_raw_shape_second_deriv(10, j, p);
 
 2347                   return d1xd1x * clough_raw_shape_second_deriv(3, j, p)
 
 2348                     + d1xd1y * clough_raw_shape_second_deriv(4, j, p)
 
 2349                     + d1xd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2350                     + d1xd3n * clough_raw_shape_second_deriv(11, j, p);
 
 2352                   return d1yd1y * clough_raw_shape_second_deriv(4, j, p)
 
 2353                     + d1yd1x * clough_raw_shape_second_deriv(3, j, p)
 
 2354                     + d1yd2n * clough_raw_shape_second_deriv(10, j, p)
 
 2355                     + d1yd3n * clough_raw_shape_second_deriv(11, j, p);
 
 2357                   return d2xd2x * clough_raw_shape_second_deriv(5, j, p)
 
 2358                     + d2xd2y * clough_raw_shape_second_deriv(6, j, p)
 
 2359                     + d2xd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2360                     + d2xd1n * clough_raw_shape_second_deriv(9, j, p);
 
 2362                   return d2yd2y * clough_raw_shape_second_deriv(6, j, p)
 
 2363                     + d2yd2x * clough_raw_shape_second_deriv(5, j, p)
 
 2364                     + d2yd3n * clough_raw_shape_second_deriv(11, j, p)
 
 2365                     + d2yd1n * clough_raw_shape_second_deriv(9, j, p);
 
 2367                   return d3xd3x * clough_raw_shape_second_deriv(7, j, p)
 
 2368                     + d3xd3y * clough_raw_shape_second_deriv(8, j, p)
 
 2369                     + d3xd1n * clough_raw_shape_second_deriv(9, j, p)
 
 2370                     + d3xd2n * clough_raw_shape_second_deriv(10, j, p);
 
 2372                   return d3yd3y * clough_raw_shape_second_deriv(8, j, p)
 
 2373                     + d3yd3x * clough_raw_shape_second_deriv(7, j, p)
 
 2374                     + d3yd1n * clough_raw_shape_second_deriv(9, j, p)
 
 2375                     + d3yd2n * clough_raw_shape_second_deriv(10, j, p);
 
 2377                   return d1nd1n * clough_raw_shape_second_deriv(9, j, p);
 
 2379                   return d2nd2n * clough_raw_shape_second_deriv(10, j, p);
 
 2381                   return d3nd3n * clough_raw_shape_second_deriv(11, j, p);
 
 2384                   libmesh_error_msg(
"Invalid shape function index i = " << i);
 
 2388             libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
 2393       libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);