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