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 clough_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());
50 FEType fe_type(totalorder,
CLOUGH);
60 const unsigned int n_sf =
64 std::vector<Point> refspace_nodes;
66 libmesh_assert_equal_to (refspace_nodes.size(),
n_nodes);
68 for (
unsigned int n=0; n<
n_nodes; n++)
70 libmesh_assert_equal_to (elem_soln.size(), n_sf);
76 for (
unsigned int i=0; i<n_sf; i++)
77 nodal_soln[n] += elem_soln[i] *
86 libmesh_error_msg(
"ERROR: Invalid total order " << totalorder);
134 unsigned int clough_n_dofs_at_node(
const ElemType t,
136 const unsigned int n)
161 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for TRI6!");
190 libmesh_error_msg(
"ERROR: Invalid node ID " << n <<
" selected for TRI6!");
206 unsigned int clough_n_dofs_per_elem(
const ElemType t,
const Order o)
243 const std::vector<Number> & elem_soln,
244 std::vector<Number> & nodal_soln)
245 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, 0); }
250 const std::vector<Number> & elem_soln,
251 std::vector<Number> & nodal_soln)
252 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, 1); }
257 const std::vector<Number> & elem_soln,
258 std::vector<Number> & nodal_soln)
259 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, 2); }
264 const std::vector<Number> & elem_soln,
265 std::vector<Number> & nodal_soln)
266 { clough_nodal_soln(elem, order, elem_soln, nodal_soln, 3); }
300 #ifdef LIBMESH_ENABLE_AMR
305 const unsigned int variable_number,
307 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
312 const unsigned int variable_number,
314 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
315 #endif // #ifdef LIBMESH_ENABLE_AMR