19#include "libmesh/fe.h"
20#include "libmesh/elem.h"
21#include "libmesh/fe_interface.h"
22#include "libmesh/utility.h"
23#include "libmesh/enum_to_string.h"
30void hermite_compute_coefs(
const Elem * elem,
Real & d1xd1x,
Real & d2xd2x)
37 const int n_mapping_shape_functions =
44 std::vector<Real> dxdxi(2);
45 std::vector<Real> dxidx(2);
50 for (
int p = 0; p != 2; ++p)
53 for (
int i = 0; i != n_mapping_shape_functions; ++i)
55 const Real ddxi = shape_deriv_ptr
56 (map_fe_type, elem, i, 0, dofpt[p],
false);
57 dxdxi[p] += elem->
point(i)(0) * ddxi;
77#ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
91 return 0.5 * (-1. + 3.*xi);
93 return 0.5 * (1. + 3.*xi);
95 return (8.*xi*xi + 4.*(xi*xi-1.))/24.;
97 return (8.*xi*xi*xi + 12.*xi*(xi*xi-1.))/120.;
102 Real denominator = 720., xipower = 1.;
103 for (
unsigned n=6; n != i; ++n)
106 denominator *= (n+1);
108 return (8.*pow<4>(xi)*xipower +
109 (8.*(i-4)+4.)*xi*xi*xipower*(xi*xi-1.) +
110 (i-4)*(i-5)*xipower*(xi*xi-1.)*(xi*xi-1.))/denominator;
123 return 0.75 * (-1. + xi*xi);
125 return 0.75 * (1. - xi*xi);
127 return 0.25 * (-1. - 2.*xi + 3.*xi*xi);
129 return 0.25 * (-1. + 2.*xi + 3.*xi*xi);
131 return 4.*xi * (xi*xi-1.)/24.;
133 return (4*xi*xi*(xi*xi-1.) + (xi*xi-1.)*(xi*xi-1.))/120.;
137 Real denominator = 720., xipower = 1.;
138 for (
unsigned n=6; n != i; ++n)
141 denominator *= (n+1);
143 return (4*xi*xi*xi*xipower*(xi*xi-1.) +
144 (i-4)*xi*xipower*(xi*xi-1.)*(xi*xi-1.))/denominator;
154 return 0.25 * (2. - 3.*xi + xi*xi*xi);
156 return 0.25 * (2. + 3.*xi - xi*xi*xi);
158 return 0.25 * (1. - xi - xi*xi + xi*xi*xi);
160 return 0.25 * (-1. - xi + xi*xi + xi*xi*xi);
163 return (xi*xi-1.) * (xi*xi-1.)/24.;
165 return xi * (xi*xi-1.) * (xi*xi-1.)/120.;
169 Real denominator = 720., xipower = 1.;
170 for (
unsigned n=6; n != i; ++n)
173 denominator *= (n+1);
175 return (xi*xi*xipower*(xi*xi-1.)*(xi*xi-1.))/denominator;
183 const Order libmesh_dbg_var(order),
184 const unsigned int i,
186 const bool libmesh_dbg_var(add_p_level))
195 hermite_compute_coefs(elem, d1xd1x, d2xd2x);
200 const unsigned int totalorder =
201 order + add_p_level * elem->
p_level();
210 libmesh_assert_less (i, totalorder+1);
239 libmesh_error_msg(
"Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
247 const unsigned int i,
249 const bool add_p_level)
257 const Order libmesh_dbg_var(order),
258 const unsigned int i,
261 const bool libmesh_dbg_var(add_p_level))
270 hermite_compute_coefs(elem, d1xd1x, d2xd2x);
275 const unsigned int totalorder =
276 order + add_p_level * elem->
p_level();
285 libmesh_assert_less (i, totalorder+1);
314 libmesh_error_msg(
"Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
321 const unsigned int i,
322 const unsigned int j,
324 const bool add_p_level)
329#ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
334 const Order libmesh_dbg_var(order),
335 const unsigned int i,
338 const bool libmesh_dbg_var(add_p_level))
347 hermite_compute_coefs(elem, d1xd1x, d2xd2x);
352 const unsigned int totalorder =
353 order + add_p_level * elem->
p_level();
362 libmesh_assert_less (i, totalorder+1);
391 libmesh_error_msg(
"Hermite elements require the real element \nto construct gradient-based degrees of freedom.");
398 const unsigned int i,
399 const unsigned int j,
401 const bool add_p_level)
This is the base class from which all geometric element types are derived.
const Point & point(const unsigned int i) const
virtual Order default_order() const =0
virtual ElemType type() const =0
unsigned int p_level() const
static Real hermite_raw_shape(const unsigned int basis_num, const Real xi)
static Real hermite_raw_shape_deriv(const unsigned int basis_num, const Real xi)
static Real hermite_raw_shape_second_deriv(const unsigned int basis_num, const Real xi)
1D hermite functions on unit interval
static shape_deriv_ptr shape_deriv_function(const unsigned int dim, const FEType &fe_t, const ElemType t)
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.
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static FEFamily map_fe_type(const Elem &elem)
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
OrderWrapper order
The approximation order of the element (at 0 p-refinement level).
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
A Point defines a location in LIBMESH_DIM dimensional Real space.
std::string enum_to_string(const T e)
The libMesh namespace provides an interface to certain functionality in the library.
LIBMESH_DEFAULT_VECTORIZED_FE(template<>Real FE< 0, BERNSTEIN)
ElemType
Defines an enum for geometric element types.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real