22 #include "libmesh/fe.h" 
   23 #include "libmesh/elem.h" 
   24 #include "libmesh/fe_interface.h" 
   25 #include "libmesh/utility.h" 
   32 void hermite_compute_coefs(
const Elem * elem, 
Real & d1xd1x, 
Real & d2xd2x)
 
   38   const FEType map_fe_type(mapping_order, mapping_family);
 
   40   const int n_mapping_shape_functions =
 
   45   std::vector<Point> dofpt;
 
   46   dofpt.push_back(
Point(-1));
 
   47   dofpt.push_back(
Point(1));
 
   50   std::vector<Real> dxdxi(2);
 
   51   std::vector<Real> dxidx(2);
 
   56   for (
int p = 0; p != 2; ++p)
 
   59       for (
int i = 0; i != n_mapping_shape_functions; ++i)
 
   61           const Real ddxi = shape_deriv_ptr
 
   62             (elem, mapping_order, i, 0, dofpt[p], 
false);
 
   63           dxdxi[p] += elem->
point(i)(0) * ddxi;
 
   80 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
   94       return 0.5 * (-1. + 3.*xi);
 
   96       return 0.5 * (1. + 3.*xi);
 
   98       return (8.*xi*xi + 4.*(xi*xi-1.))/24.;
 
  100       return (8.*xi*xi*xi + 12.*xi*(xi*xi-1.))/120.;
 
  105       Real denominator = 720., xipower = 1.;
 
  106       for (
unsigned n=6; n != i; ++n)
 
  109           denominator *= (n+1);
 
  111       return (8.*pow<4>(xi)*xipower +
 
  112               (8.*(i-4)+4.)*xi*xi*xipower*(xi*xi-1.) +
 
  113               (i-4)*(i-5)*xipower*(xi*xi-1.)*(xi*xi-1.))/denominator;
 
  126       return 0.75 * (-1. + xi*xi);
 
  128       return 0.75 * (1. - xi*xi);
 
  130       return 0.25 * (-1. - 2.*xi + 3.*xi*xi);
 
  132       return 0.25 * (-1. + 2.*xi + 3.*xi*xi);
 
  134       return 4.*xi * (xi*xi-1.)/24.;
 
  136       return (4*xi*xi*(xi*xi-1.) + (xi*xi-1.)*(xi*xi-1.))/120.;
 
  140       Real denominator = 720., xipower = 1.;
 
  141       for (
unsigned n=6; n != i; ++n)
 
  144           denominator *= (n+1);
 
  146       return (4*xi*xi*xi*xipower*(xi*xi-1.) +
 
  147               (i-4)*xi*xipower*(xi*xi-1.)*(xi*xi-1.))/denominator;
 
  157       return 0.25 * (2. - 3.*xi + xi*xi*xi);
 
  159       return 0.25 * (2. + 3.*xi - xi*xi*xi);
 
  161       return 0.25 * (1. - xi - xi*xi + xi*xi*xi);
 
  163       return 0.25 * (-1. - xi + xi*xi + xi*xi*xi);
 
  166       return (xi*xi-1.) * (xi*xi-1.)/24.;
 
  168       return xi * (xi*xi-1.) * (xi*xi-1.)/120.;
 
  172       Real denominator = 720., xipower = 1.;
 
  173       for (
unsigned n=6; n != i; ++n)
 
  176           denominator *= (n+1);
 
  178       return (xi*xi*xipower*(xi*xi-1.)*(xi*xi-1.))/denominator;
 
  190   libmesh_error_msg(
"Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
 
  198                           const Order libmesh_dbg_var(order),
 
  199                           const unsigned int i,
 
  201                           const bool libmesh_dbg_var(add_p_level))
 
  210   hermite_compute_coefs(elem, d1xd1x, d2xd2x);
 
  215   const unsigned int totalorder =
 
  216     order + add_p_level * elem->
p_level();
 
  225         libmesh_assert_less (i, totalorder+1);
 
  242       libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
  255   libmesh_error_msg(
"Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
 
  263                                 const Order libmesh_dbg_var(order),
 
  264                                 const unsigned int i,
 
  267                                 const bool libmesh_dbg_var(add_p_level))
 
  276   hermite_compute_coefs(elem, d1xd1x, d2xd2x);
 
  281   const unsigned int totalorder =
 
  282     order + add_p_level * elem->
p_level();
 
  291         libmesh_assert_less (i, totalorder+1);
 
  308       libmesh_error_msg(
"ERROR: Unsupported element type = " << type);
 
  313 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
  322   libmesh_error_msg(
"Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
 
  329                                        const Order libmesh_dbg_var(order),
 
  330                                        const unsigned int i,
 
  333                                        const bool libmesh_dbg_var(add_p_level))
 
  342   hermite_compute_coefs(elem, d1xd1x, d2xd2x);
 
  347   const unsigned int totalorder =
 
  348     order + add_p_level * elem->
p_level();
 
  357         libmesh_assert_less (i, totalorder+1);
 
  374       libmesh_error_msg(
"ERROR: Unsupported element type = " << type);