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"
26#include "libmesh/int_range.h"
37void side_hierarchic_nodal_soln(
const Elem * elem,
39 const std::vector<Number> & elem_soln,
40 std::vector<Number> & nodal_soln,
41 const bool add_p_level)
43 const unsigned int n_nodes = elem->n_nodes();
51 std::vector<unsigned int> nodal_soln_count(
n_nodes, 0);
53 std::vector<Number> nodal_soln_on_side;
55 for (
const auto side : elem->side_index_range())
57 const std::vector<unsigned int> side_nodes =
58 elem->nodes_on_side(side);
66 libmesh_assert_equal_to(nodal_soln_on_side.size(), side_nodes.size());
70 const auto n = side_nodes[i];
71 nodal_soln[n] += nodal_soln_on_side[i];
72 ++nodal_soln_count[n];
77 if (nodal_soln_count[n])
78 nodal_soln[n] /= nodal_soln_count[n];
82void side_hierarchic_side_nodal_soln
83 (
const Elem * elem,
const Order o,
84 const unsigned int side,
85 const std::vector<Number> & elem_soln,
86 std::vector<Number> & nodal_soln_on_side,
91 const std::vector<unsigned int> side_nodes =
92 elem->nodes_on_side(side);
93 const std::size_t n_side_nodes = side_nodes.size();
98 for (
auto n : side_nodes)
99 side_center += elem->master_point(n);
100 side_center /= n_side_nodes;
102 nodal_soln_on_side.resize(n_side_nodes);
105 const auto n = side_nodes[i];
106 Point master_p = elem->master_point(n);
109 const unsigned int n_sf =
112 nodal_soln_on_side[i] = 0;
114 nodal_soln_on_side[i] += elem_soln[j] *
115 FEInterface::shape(fe_type, elem, j, master_p);
121unsigned int side_hierarchic_n_dofs_at_node(
const ElemType t,
123 const unsigned int n)
143 if (n > 19 && n < 26)
155 return (o+1)*(o+2)/2;
163 return (o+1)*(o+2)/2;
171 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for SIDE_HIERARCHIC FE family!");
177unsigned int side_hierarchic_n_dofs_at_node(
const Elem & e,
179 const unsigned int n)
181 return side_hierarchic_n_dofs_at_node(e.type(), o, n);
186unsigned int side_hierarchic_n_dofs(
const ElemType t,
const Order o)
200 return ((o+1)*(o+1)*6);
205 return (o+1)*(o+2)*2;
208 return (o+1)*(o+1)*3+(o+1)*(o+2);
213 libmesh_error_msg(
"ERROR: Invalid ElemType " <<
Utility::enum_to_string(t) <<
" selected for HIERARCHIC FE family!");
219unsigned int side_hierarchic_n_dofs(
const Elem * e,
const Order o)
221 return side_hierarchic_n_dofs(e->type(), o);
237 const std::vector<Number> &,
238 std::vector<Number> &,
242 libmesh_error_msg(
"No side variables in 0D!");
248 const unsigned int side,
249 const std::vector<Number> & elem_soln,
250 std::vector<Number> & nodal_soln_on_side,
254 libmesh_assert_less(side, 2);
255 nodal_soln_on_side.resize(1);
256 nodal_soln_on_side[0] = elem_soln[side];
263 const unsigned int side,
264 const std::vector<Number> & elem_soln,
265 std::vector<Number> & nodal_soln_on_side,
266 const bool add_p_level,
269 libmesh_assert_equal_to(elem->
dim(), 2);
270 side_hierarchic_side_nodal_soln(elem, o, side, elem_soln,
279 const unsigned int side,
280 const std::vector<Number> & elem_soln,
281 std::vector<Number> & nodal_soln_on_side,
282 const bool add_p_level,
285 libmesh_assert_equal_to(elem->
dim(), 3);
286 side_hierarchic_side_nodal_soln(elem, o, side, elem_soln,
338#ifdef LIBMESH_ENABLE_AMR
343 const unsigned int variable_number,
345{ compute_proj_constraints(constraints, dof_map, variable_number, elem); }
350 const unsigned int variable_number,
352{ compute_proj_constraints(constraints, dof_map, variable_number, elem); }
The constraint matrix storage format.
This class handles the numbering of degrees of freedom on a mesh.
This is the base class from which all geometric element types are derived.
virtual unsigned short dim() const =0
static void side_nodal_soln(const FEType &fe_t, const Elem *elem, const unsigned int side, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln, const bool add_p_level=true, const unsigned int vdim=1)
Build the nodal soln on one side from the (full) element soln.
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
virtual bool is_hierarchic() const override
static unsigned int n_dofs_per_elem(const ElemType t, const Order o)
virtual FEContinuity get_continuity() const override
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...
static unsigned int n_dofs(const ElemType t, const Order o)
static unsigned int n_dofs_at_node(const ElemType t, const Order o, const unsigned int n)
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.
virtual bool shapes_need_reinit() const override
std::string enum_to_string(const T e)
The libMesh namespace provides an interface to certain functionality in the library.
LIBMESH_FE_NODAL_SOLN(BERNSTEIN, bernstein_nodal_soln)
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
ElemType
Defines an enum for geometric element types.
static constexpr Real TOLERANCE
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...
const dof_id_type n_nodes