89 return std::make_unique<FE<0,CLOUGH>>(fet);
92 return std::make_unique<FE<0,HERMITE>>(fet);
95 return std::make_unique<FE<0,LAGRANGE>>(fet);
98 return std::make_unique<FE<0,LAGRANGE_VEC>>(fet);
101 return std::make_unique<FE<0,L2_LAGRANGE>>(fet);
104 return std::make_unique<FE<0,L2_LAGRANGE_VEC>>(fet);
107 return std::make_unique<FE<0,HIERARCHIC_VEC>>(fet);
110 return std::make_unique<FE<0,HIERARCHIC>>(fet);
113 return std::make_unique<FE<0,L2_HIERARCHIC>>(fet);
116 return std::make_unique<FE<0,L2_HIERARCHIC_VEC>>(fet);
119 return std::make_unique<FE<0,SIDE_HIERARCHIC>>(fet);
122 return std::make_unique<FE<0,MONOMIAL>>(fet);
125 return std::make_unique<FE<0,MONOMIAL_VEC>>(fet);
127#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
129 return std::make_unique<FE<0,SZABAB>>(fet);
132 return std::make_unique<FE<0,BERNSTEIN>>(fet);
135 return std::make_unique<FE<0,RATIONAL_BERNSTEIN>>(fet);
139 return std::make_unique<FEXYZ<0>>(fet);
142 return std::make_unique<FEScalar<0>>(fet);
145 return std::make_unique<FENedelecOne<0>>(fet);
148 return std::make_unique<FERaviartThomas<0>>(fet);
151 return std::make_unique<FEL2RaviartThomas<0>>(fet);
154 return std::make_unique<FESubdivision>(fet);
166 return std::make_unique<FE<1,CLOUGH>>(fet);
169 return std::make_unique<FE<1,HERMITE>>(fet);
172 return std::make_unique<FE<1,LAGRANGE>>(fet);
175 return std::make_unique<FE<1,LAGRANGE_VEC>>(fet);
178 return std::make_unique<FE<1,L2_LAGRANGE>>(fet);
181 return std::make_unique<FE<1,L2_LAGRANGE_VEC>>(fet);
184 return std::make_unique<FE<1,HIERARCHIC_VEC>>(fet);
187 return std::make_unique<FE<1,HIERARCHIC>>(fet);
190 return std::make_unique<FE<1,L2_HIERARCHIC>>(fet);
193 return std::make_unique<FE<1,L2_HIERARCHIC_VEC>>(fet);
196 return std::make_unique<FE<1,SIDE_HIERARCHIC>>(fet);
199 return std::make_unique<FE<1,MONOMIAL>>(fet);
202 return std::make_unique<FE<1,MONOMIAL_VEC>>(fet);
204#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
206 return std::make_unique<FE<1,SZABAB>>(fet);
209 return std::make_unique<FE<1,BERNSTEIN>>(fet);
212 return std::make_unique<FE<1,RATIONAL_BERNSTEIN>>(fet);
216 return std::make_unique<FEXYZ<1>>(fet);
219 return std::make_unique<FEScalar<1>>(fet);
222 return std::make_unique<FENedelecOne<1>>(fet);
225 return std::make_unique<FERaviartThomas<1>>(fet);
228 return std::make_unique<FEL2RaviartThomas<1>>(fet);
231 return std::make_unique<FESubdivision>(fet);
245 return std::make_unique<FE<2,CLOUGH>>(fet);
248 return std::make_unique<FE<2,HERMITE>>(fet);
251 return std::make_unique<FE<2,LAGRANGE>>(fet);
254 return std::make_unique<FE<2,LAGRANGE_VEC>>(fet);
257 return std::make_unique<FE<2,L2_LAGRANGE>>(fet);
260 return std::make_unique<FE<2,L2_LAGRANGE_VEC>>(fet);
263 return std::make_unique<FE<2,HIERARCHIC_VEC>>(fet);
266 return std::make_unique<FE<2,HIERARCHIC>>(fet);
269 return std::make_unique<FE<2,L2_HIERARCHIC>>(fet);
272 return std::make_unique<FE<2,L2_HIERARCHIC_VEC>>(fet);
275 return std::make_unique<FE<2,SIDE_HIERARCHIC>>(fet);
278 return std::make_unique<FE<2,MONOMIAL>>(fet);
281 return std::make_unique<FE<2,MONOMIAL_VEC>>(fet);
283#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
285 return std::make_unique<FE<2,SZABAB>>(fet);
288 return std::make_unique<FE<2,BERNSTEIN>>(fet);
291 return std::make_unique<FE<2,RATIONAL_BERNSTEIN>>(fet);
295 return std::make_unique<FEXYZ<2>>(fet);
298 return std::make_unique<FEScalar<2>>(fet);
301 return std::make_unique<FENedelecOne<2>>(fet);
304 return std::make_unique<FERaviartThomas<2>>(fet);
307 return std::make_unique<FEL2RaviartThomas<2>>(fet);
310 return std::make_unique<FESubdivision>(fet);
324 libmesh_error_msg(
"ERROR: Clough-Tocher elements currently only support 1D and 2D");
327 return std::make_unique<FE<3,HERMITE>>(fet);
330 return std::make_unique<FE<3,LAGRANGE>>(fet);
333 return std::make_unique<FE<3,LAGRANGE_VEC>>(fet);
336 return std::make_unique<FE<3,L2_LAGRANGE>>(fet);
339 return std::make_unique<FE<3,L2_LAGRANGE_VEC>>(fet);
342 return std::make_unique<FE<3,HIERARCHIC_VEC>>(fet);
345 return std::make_unique<FE<3,HIERARCHIC>>(fet);
348 return std::make_unique<FE<3,L2_HIERARCHIC>>(fet);
351 return std::make_unique<FE<3,L2_HIERARCHIC_VEC>>(fet);
354 return std::make_unique<FE<3,SIDE_HIERARCHIC>>(fet);
357 return std::make_unique<FE<3,MONOMIAL>>(fet);
360 return std::make_unique<FE<3,MONOMIAL_VEC>>(fet);
362#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
364 return std::make_unique<FE<3,SZABAB>>(fet);
367 return std::make_unique<FE<3,BERNSTEIN>>(fet);
370 return std::make_unique<FE<3,RATIONAL_BERNSTEIN>>(fet);
374 return std::make_unique<FEXYZ<3>>(fet);
377 return std::make_unique<FEScalar<3>>(fet);
380 return std::make_unique<FENedelecOne<3>>(fet);
383 return std::make_unique<FERaviartThomas<3>>(fet);
386 return std::make_unique<FEL2RaviartThomas<3>>(fet);
394 libmesh_error_msg(
"Invalid dimension dim = " <<
dim);
891 const unsigned int Dim = elem->
dim();
902#ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
912 inf_fe_family_mapping_switch(2, inf_compute_node_constraints (constraints, elem) , ,;
break;);
917 inf_fe_family_mapping_switch(3, inf_compute_node_constraints (constraints, elem) , ,;
break;);
921 libmesh_error_msg(
"Invalid dim = " << Dim);
931 std::vector<const Node *> my_nodes, parent_nodes;
932 std::unique_ptr<const Elem> my_side, parent_side;
953 const unsigned int n_side_nodes = my_side->n_nodes();
956 my_nodes.reserve (n_side_nodes);
957 parent_nodes.clear();
958 parent_nodes.reserve (n_side_nodes);
960 for (
unsigned int n=0; n != n_side_nodes; ++n)
961 my_nodes.push_back(my_side->node_ptr(n));
963 for (
unsigned int n=0; n != n_side_nodes; ++n)
964 parent_nodes.push_back(parent_side->node_ptr(n));
966 for (
unsigned int my_side_n=0;
967 my_side_n < n_side_nodes;
977 const int side_max_order =
981 side_fe_type.
order = side_max_order;
989 const Node * my_node = my_nodes[my_side_n];
992 const Point & support_point = *my_node;
1000 for (
unsigned int their_side_n=0;
1001 their_side_n < n_side_nodes;
1009 parent_side.get()));
1011 const Node * their_node = parent_nodes[their_side_n];
1021 const Real their_mag = std::abs(their_value);
1025 if (their_mag > 0.999)
1027 libmesh_assert_equal_to (my_node, their_node);
1028 libmesh_assert_less (std::abs(their_value - 1.), 0.001);
1037 if (their_mag < 1.e-5)
1047 constraint_row.emplace(their_node, 0.);
1062 constraint_row.emplace(their_node, their_value);
1085 if (boundaries.empty())
1094 const unsigned int Dim = elem->
dim();
1100 std::vector<const Node *> my_nodes, neigh_nodes;
1101 std::unique_ptr<const Elem> my_side, neigh_side;
1105 std::vector<boundary_id_type> bc_ids;
1111 mesh.get_boundary_info().boundary_ids (elem, s, bc_ids);
1112 for (
const auto & boundary_id : bc_ids)
1120 unsigned int s_neigh;
1121 const Elem * neigh = boundaries.
neighbor(boundary_id, *point_locator, elem, s, &s_neigh);
1123 libmesh_error_msg_if
1124 (!neigh,
"PeriodicBoundaries can't find a periodic neighbor for element " <<
1125 elem->
id() <<
" side " << s);
1133#ifdef LIBMESH_ENABLE_AMR
1140 const unsigned int n_side_nodes = my_side->n_nodes();
1143 my_nodes.reserve (n_side_nodes);
1144 neigh_nodes.clear();
1145 neigh_nodes.reserve (n_side_nodes);
1147 for (
unsigned int n=0; n != n_side_nodes; ++n)
1148 my_nodes.push_back(my_side->node_ptr(n));
1150 for (
unsigned int n=0; n != n_side_nodes; ++n)
1151 neigh_nodes.push_back(neigh_side->node_ptr(n));
1157 std::vector<bool> skip_constraint(n_side_nodes,
false);
1159 for (
unsigned int my_side_n=0;
1160 my_side_n < n_side_nodes;
1166 const Node * my_node = my_nodes[my_side_n];
1174 if (constraints.count(my_node))
1176 skip_constraint[my_side_n] =
true;
1182 for (
unsigned int their_side_n=0;
1183 their_side_n < n_side_nodes;
1189 const Node * their_node = neigh_nodes[their_side_n];
1198 if (!constraints.count(their_node))
1202 constraints[their_node].first;
1204 for (
unsigned int orig_side_n=0;
1205 orig_side_n < n_side_nodes;
1211 const Node * orig_node = my_nodes[orig_side_n];
1213 if (their_constraint_row.count(orig_node))
1214 skip_constraint[orig_side_n] =
true;
1219 for (
unsigned int my_side_n=0;
1220 my_side_n < n_side_nodes;
1226 if (skip_constraint[my_side_n])
1229 const Node * my_node = my_nodes[my_side_n];
1235 const Point mapped_point =
1239 for (
unsigned int their_side_n=0;
1240 their_side_n < n_side_nodes;
1246 const Node * their_node = neigh_nodes[their_side_n];
1263 constraints[my_node].first;
1265 constraint_row.emplace(their_node, their_value);