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);