21 #include "libmesh/elem.h"
22 #include "libmesh/fe.h"
23 #include "libmesh/fe_interface.h"
24 #include "libmesh/enum_to_string.h"
35 void hierarchic_nodal_soln(
const Elem * elem,
37 const std::vector<Number> & elem_soln,
38 std::vector<Number> & nodal_soln,
41 const unsigned int n_nodes = elem->n_nodes();
43 const ElemType elem_type = elem->type();
47 const Order totalorder = static_cast<Order>(order + elem->p_level());
57 libmesh_assert_equal_to (elem_soln.size(), 1);
59 const Number val = elem_soln[0];
61 for (
unsigned int n=0; n<
n_nodes; n++)
73 const unsigned int n_sf =
77 std::vector<Point> refspace_nodes;
79 libmesh_assert_equal_to (refspace_nodes.size(),
n_nodes);
81 for (
unsigned int n=0; n<
n_nodes; n++)
83 libmesh_assert_equal_to (elem_soln.size(), n_sf);
89 for (
unsigned int i=0; i<n_sf; i++)
90 nodal_soln[n] += elem_soln[i] *
103 unsigned int hierarchic_n_dofs(
const ElemType t,
const Order o)
105 libmesh_assert_greater (o, 0);
115 libmesh_assert_less (o, 2);
116 libmesh_fallthrough();
120 return ((o+1)*(o+1));
122 libmesh_assert_less (o, 2);
123 libmesh_fallthrough();
125 libmesh_assert_less (o, 2);
126 libmesh_fallthrough();
128 return ((o+1)*(o+1)*(o+1));
130 libmesh_assert_less (o, 2);
131 libmesh_fallthrough();
133 return ((o+1)*(o+2)/2);
137 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for HIERARCHIC FE family!");
144 unsigned int hierarchic_n_dofs_at_node(
const ElemType t,
146 const unsigned int n)
148 libmesh_assert_greater (o, 0);
162 libmesh_assert_equal_to(t,
EDGE3);
165 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for EDGE2/3!");
168 libmesh_assert_less (n, 3);
169 libmesh_assert_less (o, 2);
170 libmesh_fallthrough();
186 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for TRI6!");
190 libmesh_assert_less (n, 4);
191 libmesh_assert_less (o, 2);
192 libmesh_fallthrough();
215 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for QUAD4/8/9!");
218 libmesh_assert_less (n, 8);
219 libmesh_assert_less (o, 2);
220 libmesh_fallthrough();
222 libmesh_assert_less (n, 20);
223 libmesh_assert_less (o, 2);
224 libmesh_fallthrough();
258 return ((o-1)*(o-1));
264 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for HEX8/20/27!");
278 unsigned int hierarchic_n_dofs_per_elem(
const ElemType t,
281 libmesh_assert_greater (o, 0);
295 return ((o-1)*(o-2)/2);
299 return ((o-1)*(o-1));
302 libmesh_assert_less (o, 2);
305 return ((o-1)*(o-1)*(o-1));
325 const std::vector<Number> & elem_soln,
326 std::vector<Number> & nodal_soln)
327 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, 0); }
332 const std::vector<Number> & elem_soln,
333 std::vector<Number> & nodal_soln)
334 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, 1); }
339 const std::vector<Number> & elem_soln,
340 std::vector<Number> & nodal_soln)
341 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, 2); }
346 const std::vector<Number> & elem_soln,
347 std::vector<Number> & nodal_soln)
348 { hierarchic_nodal_soln(elem, order, elem_soln, nodal_soln, 3); }
381 #ifdef LIBMESH_ENABLE_AMR
386 const unsigned int variable_number,
388 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
393 const unsigned int variable_number,
395 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
396 #endif // #ifdef LIBMESH_ENABLE_AMR