21 #include "libmesh/libmesh_config.h" 23 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES 25 #include "libmesh/elem.h" 26 #include "libmesh/enum_to_string.h" 27 #include "libmesh/fe.h" 28 #include "libmesh/fe_interface.h" 29 #include "libmesh/fe_macro.h" 40 void bernstein_nodal_soln(
const Elem * elem,
42 const std::vector<Number> & elem_soln,
43 std::vector<Number> & nodal_soln,
44 const bool add_p_level)
46 const unsigned int n_nodes = elem->n_nodes();
48 const ElemType elem_type = elem->type();
52 const Order totalorder = order + add_p_level*elem->p_level();
62 libmesh_assert_equal_to (elem_soln.size(), 1);
64 std::fill(nodal_soln.begin(), nodal_soln.end(), elem_soln[0]);
79 const unsigned int n_sf =
82 std::vector<Point> refspace_nodes;
84 libmesh_assert_equal_to (refspace_nodes.size(),
n_nodes);
85 libmesh_assert_equal_to (elem_soln.size(), n_sf);
88 std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
90 for (
unsigned int n=0; n<
n_nodes; n++)
92 for (
unsigned int i=0; i<n_sf; i++)
93 nodal_soln[n] += elem_soln[i] *
100 libmesh_error_msg(
"ERROR: Invalid total order " << totalorder);
106 unsigned int BERNSTEIN_n_dofs(
const ElemType t,
const Order o)
117 libmesh_assert_less (o, 2);
118 libmesh_fallthrough();
127 libmesh_error_msg(
"ERROR: Invalid Order " <<
Utility::enum_to_string(o) <<
" selected for BERNSTEIN FE family!");
131 return ((o+1)*(o+1));
133 libmesh_assert_less (o, 2);
134 libmesh_fallthrough();
142 libmesh_error_msg(
"ERROR: Invalid Order " <<
Utility::enum_to_string(o) <<
" selected for BERNSTEIN FE family!");
145 return ((o+1)*(o+1)*(o+1));
148 libmesh_assert_less (o, 2);
149 libmesh_fallthrough();
152 return ((o+1)*(o+2)/2);
154 libmesh_assert_less (o, 2);
155 libmesh_fallthrough();
158 libmesh_assert_less (o, 3);
159 return ((o+1)*(o+2)*(o+3)/6);
163 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for BERNSTEIN FE family!");
169 unsigned int BERNSTEIN_n_dofs(
const Elem * e,
const Order o)
172 return BERNSTEIN_n_dofs(e->type(), o);
177 unsigned int BERNSTEIN_n_dofs_at_node(
const ElemType t,
179 const unsigned int n)
197 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for EDGE2/3!");
200 libmesh_assert_less (n, 3);
201 libmesh_assert_less (o, 2);
202 libmesh_fallthrough();
205 libmesh_assert_less (n, 6);
206 libmesh_fallthrough();
221 return ((o-1)*(o-2)/2);
223 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for TRI!");
226 libmesh_assert_less (n, 4);
227 libmesh_assert_less (o, 2);
228 libmesh_fallthrough();
230 libmesh_assert_less (n, 8);
231 libmesh_assert_less (o, 3);
232 libmesh_fallthrough();
250 return ((o-1)*(o-1));
253 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for QUAD9!");
257 libmesh_assert_less (n, 8);
258 libmesh_assert_less (o, 2);
259 libmesh_fallthrough();
261 libmesh_assert_less (n, 20);
262 libmesh_assert_less (o, 3);
263 libmesh_fallthrough();
297 return ((o-1)*(o-1));
300 return ((o-1)*(o-1)*(o-1));
303 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for HEX27!");
306 libmesh_assert_less (n, 4);
307 libmesh_assert_less (o, 2);
308 libmesh_fallthrough();
310 libmesh_assert_less (n, 10);
311 libmesh_fallthrough();
313 libmesh_assert_less (o, 3);
337 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for TET4/10/14!");
342 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for BERNSTEIN FE family!");
348 unsigned int BERNSTEIN_n_dofs_at_node(
const Elem & e,
350 const unsigned int n)
352 return BERNSTEIN_n_dofs_at_node(e.type(), o, n);
357 unsigned int BERNSTEIN_n_dofs_per_elem(
const ElemType t,
const Order o)
371 return ((o-1)*(o-2)/2);
378 libmesh_fallthrough();
383 libmesh_assert_less (o, 2);
386 libmesh_assert_less (o, 3);
391 libmesh_assert_less (o, 2);
392 libmesh_fallthrough();
395 libmesh_assert_less (o, 3);
400 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for BERNSTEIN FE family!");
406 unsigned int BERNSTEIN_n_dofs_per_elem(
const Elem & e,
const Order o)
408 return BERNSTEIN_n_dofs_per_elem(e.type(), o);
433 #ifdef LIBMESH_ENABLE_AMR 438 const unsigned int variable_number,
440 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
445 const unsigned int variable_number,
447 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
448 #endif // #ifdef LIBMESH_ENABLE_AMR 459 #endif //LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
ElemType
Defines an enum for geometric element types.
Order
defines an enum for polynomial orders.
This is the base class from which all geometric element types are derived.
virtual bool shapes_need_reinit() const override
The libMesh namespace provides an interface to certain functionality in the library.
LIBMESH_FE_NODAL_SOLN(LIBMESH_FE_SIDE_NODAL_SOLN() LIBMESH_DEFAULT_NDOFS(BERNSTEIN) template<> FEContinuity FE< 0 BERNSTEIN, bernstein_nodal_soln)
virtual bool is_hierarchic() const override
This class handles the numbering of degrees of freedom on a mesh.
LIBMESH_FE_SIDE_NODAL_SOLN(HIERARCHIC_VEC)
const dof_id_type n_nodes
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static Real shape(const unsigned int dim, const FEType &fe_t, const ElemType t, const unsigned int i, const Point &p)
static void get_refspace_nodes(const ElemType t, std::vector< Point > &nodes)
virtual FEContinuity get_continuity() const override
std::string enum_to_string(const T e)
static void compute_constraints(DofConstraints &constraints, DofMap &dof_map, const unsigned int variable_number, const Elem *elem)
Computes the constraint matrix contributions (for non-conforming adapted meshes) corresponding to var...
FEContinuity
defines an enum for finite element types to libmesh_assert a certain level (or type? Hcurl?) of continuity.
The constraint matrix storage format.