21 #include "libmesh/elem.h" 22 #include "libmesh/enum_to_string.h" 23 #include "libmesh/fe.h" 24 #include "libmesh/fe_interface.h" 25 #include "libmesh/fe_macro.h" 36 void side_hierarchic_nodal_soln(
const Elem * elem,
38 const std::vector<Number> & ,
39 std::vector<Number> & nodal_soln,
42 const unsigned int n_nodes = elem->n_nodes();
44 std::fill(nodal_soln.begin(), nodal_soln.end(), 0);
54 void side_hierarchic_side_nodal_soln
55 (
const Elem * elem,
const Order o,
56 const unsigned int side,
57 const std::vector<Number> & elem_soln,
58 std::vector<Number> & nodal_soln_on_side,
63 const std::vector<unsigned int> side_nodes =
64 elem->nodes_on_side(side);
65 const std::size_t n_side_nodes = side_nodes.size();
70 for (
auto n : side_nodes)
71 side_center += elem->master_point(n);
72 side_center /= n_side_nodes;
74 nodal_soln_on_side.resize(n_side_nodes);
77 const auto n = side_nodes[i];
78 Point master_p = elem->master_point(n);
81 const unsigned int n_sf =
84 nodal_soln_on_side[i] = 0;
86 nodal_soln_on_side[i] += elem_soln[j] *
93 unsigned int side_hierarchic_n_dofs_at_node(
const ElemType t,
115 if (n > 19 && n < 26)
127 return (o+1)*(o+2)/2;
135 return (o+1)*(o+2)/2;
143 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for SIDE_HIERARCHIC FE family!");
149 unsigned int side_hierarchic_n_dofs_at_node(
const Elem & e,
151 const unsigned int n)
153 return side_hierarchic_n_dofs_at_node(e.type(), o, n);
158 unsigned int side_hierarchic_n_dofs(
const ElemType t,
const Order o)
172 return ((o+1)*(o+1)*6);
177 return (o+1)*(o+2)*2;
180 return (o+1)*(o+1)*3+(o+1)*(o+2);
185 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for HIERARCHIC FE family!");
191 unsigned int side_hierarchic_n_dofs(
const Elem * e,
const Order o)
193 return side_hierarchic_n_dofs(e->type(), o);
209 const std::vector<Number> &,
210 std::vector<Number> &,
214 libmesh_error_msg(
"No side variables in 0D!");
220 const unsigned int side,
221 const std::vector<Number> & elem_soln,
222 std::vector<Number> & nodal_soln_on_side,
226 libmesh_assert_less(side, 2);
227 nodal_soln_on_side.resize(1);
228 nodal_soln_on_side[0] = elem_soln[side];
235 const unsigned int side,
236 const std::vector<Number> & elem_soln,
237 std::vector<Number> & nodal_soln_on_side,
238 const bool add_p_level,
241 libmesh_assert_equal_to(elem->
dim(), 2);
242 side_hierarchic_side_nodal_soln(elem, o, side, elem_soln,
251 const unsigned int side,
252 const std::vector<Number> & elem_soln,
253 std::vector<Number> & nodal_soln_on_side,
254 const bool add_p_level,
257 libmesh_assert_equal_to(elem->
dim(), 3);
258 side_hierarchic_side_nodal_soln(elem, o, side, elem_soln,
310 #ifdef LIBMESH_ENABLE_AMR 315 const unsigned int variable_number,
317 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
322 const unsigned int variable_number,
324 { compute_proj_constraints(constraints, dof_map, variable_number, elem); }
325 #endif // #ifdef LIBMESH_ENABLE_AMR static unsigned int n_dofs(const ElemType t, const Order o)
ElemType
Defines an enum for geometric element types.
Order
defines an enum for polynomial orders.
static constexpr Real TOLERANCE
This is the base class from which all geometric element types are derived.
static unsigned int n_dofs_at_node(const ElemType t, const Order o, const unsigned int n)
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.
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 unsigned int n_dofs_per_elem(const ElemType t, const Order o)
virtual FEContinuity get_continuity() const override
static void side_nodal_soln(const Elem *elem, const Order o, const unsigned int side, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln_on_side, bool add_p_level=true, const unsigned vdim=1)
Build the nodal soln on one side from the (full) element soln.
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...
virtual unsigned short dim() const =0
FEContinuity
defines an enum for finite element types to libmesh_assert a certain level (or type? Hcurl?) of continuity.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
The constraint matrix storage format.