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_GLL>>(fet);
107 return std::make_unique<FE<0,L2_LAGRANGE_VEC>>(fet);
110 return std::make_unique<FE<0,HIERARCHIC_VEC>>(fet);
113 return std::make_unique<FE<0,HIERARCHIC>>(fet);
116 return std::make_unique<FE<0,L2_HIERARCHIC>>(fet);
119 return std::make_unique<FE<0,L2_HIERARCHIC_VEC>>(fet);
122 return std::make_unique<FE<0,SIDE_HIERARCHIC>>(fet);
125 return std::make_unique<FE<0,MONOMIAL>>(fet);
128 return std::make_unique<FE<0,MONOMIAL_VEC>>(fet);
130#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
132 return std::make_unique<FE<0,SZABAB>>(fet);
135 return std::make_unique<FE<0,BERNSTEIN>>(fet);
138 return std::make_unique<FE<0,RATIONAL_BERNSTEIN>>(fet);
142 return std::make_unique<FEXYZ<0>>(fet);
145 return std::make_unique<FEScalar<0>>(fet);
148 return std::make_unique<FENedelecOne<0>>(fet);
151 return std::make_unique<FERaviartThomas<0>>(fet);
154 return std::make_unique<FEL2RaviartThomas<0>>(fet);
157 return std::make_unique<FESubdivision>(fet);
169 return std::make_unique<FE<1,CLOUGH>>(fet);
172 return std::make_unique<FE<1,HERMITE>>(fet);
175 return std::make_unique<FE<1,LAGRANGE>>(fet);
178 return std::make_unique<FE<1,LAGRANGE_VEC>>(fet);
181 return std::make_unique<FE<1,L2_LAGRANGE>>(fet);
184 return std::make_unique<FE<1,L2_LAGRANGE_GLL>>(fet);
187 return std::make_unique<FE<1,L2_LAGRANGE_VEC>>(fet);
190 return std::make_unique<FE<1,HIERARCHIC_VEC>>(fet);
193 return std::make_unique<FE<1,HIERARCHIC>>(fet);
196 return std::make_unique<FE<1,L2_HIERARCHIC>>(fet);
199 return std::make_unique<FE<1,L2_HIERARCHIC_VEC>>(fet);
202 return std::make_unique<FE<1,SIDE_HIERARCHIC>>(fet);
205 return std::make_unique<FE<1,MONOMIAL>>(fet);
208 return std::make_unique<FE<1,MONOMIAL_VEC>>(fet);
210#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
212 return std::make_unique<FE<1,SZABAB>>(fet);
215 return std::make_unique<FE<1,BERNSTEIN>>(fet);
218 return std::make_unique<FE<1,RATIONAL_BERNSTEIN>>(fet);
222 return std::make_unique<FEXYZ<1>>(fet);
225 return std::make_unique<FEScalar<1>>(fet);
228 return std::make_unique<FENedelecOne<1>>(fet);
231 return std::make_unique<FERaviartThomas<1>>(fet);
234 return std::make_unique<FEL2RaviartThomas<1>>(fet);
237 return std::make_unique<FESubdivision>(fet);
251 return std::make_unique<FE<2,CLOUGH>>(fet);
254 return std::make_unique<FE<2,HERMITE>>(fet);
257 return std::make_unique<FE<2,LAGRANGE>>(fet);
260 return std::make_unique<FE<2,LAGRANGE_VEC>>(fet);
263 return std::make_unique<FE<2,L2_LAGRANGE>>(fet);
266 return std::make_unique<FE<2,L2_LAGRANGE_GLL>>(fet);
269 return std::make_unique<FE<2,L2_LAGRANGE_VEC>>(fet);
272 return std::make_unique<FE<2,HIERARCHIC_VEC>>(fet);
275 return std::make_unique<FE<2,HIERARCHIC>>(fet);
278 return std::make_unique<FE<2,L2_HIERARCHIC>>(fet);
281 return std::make_unique<FE<2,L2_HIERARCHIC_VEC>>(fet);
284 return std::make_unique<FE<2,SIDE_HIERARCHIC>>(fet);
287 return std::make_unique<FE<2,MONOMIAL>>(fet);
290 return std::make_unique<FE<2,MONOMIAL_VEC>>(fet);
292#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
294 return std::make_unique<FE<2,SZABAB>>(fet);
297 return std::make_unique<FE<2,BERNSTEIN>>(fet);
300 return std::make_unique<FE<2,RATIONAL_BERNSTEIN>>(fet);
304 return std::make_unique<FEXYZ<2>>(fet);
307 return std::make_unique<FEScalar<2>>(fet);
310 return std::make_unique<FENedelecOne<2>>(fet);
313 return std::make_unique<FERaviartThomas<2>>(fet);
316 return std::make_unique<FEL2RaviartThomas<2>>(fet);
319 return std::make_unique<FESubdivision>(fet);
333 libmesh_error_msg(
"ERROR: Clough-Tocher elements currently only support 1D and 2D");
336 return std::make_unique<FE<3,HERMITE>>(fet);
339 return std::make_unique<FE<3,LAGRANGE>>(fet);
342 return std::make_unique<FE<3,LAGRANGE_VEC>>(fet);
345 return std::make_unique<FE<3,L2_LAGRANGE>>(fet);
348 return std::make_unique<FE<3,L2_LAGRANGE_GLL>>(fet);
351 return std::make_unique<FE<3,L2_LAGRANGE_VEC>>(fet);
354 return std::make_unique<FE<3,HIERARCHIC_VEC>>(fet);
357 return std::make_unique<FE<3,HIERARCHIC>>(fet);
360 return std::make_unique<FE<3,L2_HIERARCHIC>>(fet);
363 return std::make_unique<FE<3,L2_HIERARCHIC_VEC>>(fet);
366 return std::make_unique<FE<3,SIDE_HIERARCHIC>>(fet);
369 return std::make_unique<FE<3,MONOMIAL>>(fet);
372 return std::make_unique<FE<3,MONOMIAL_VEC>>(fet);
374#ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
376 return std::make_unique<FE<3,SZABAB>>(fet);
379 return std::make_unique<FE<3,BERNSTEIN>>(fet);
382 return std::make_unique<FE<3,RATIONAL_BERNSTEIN>>(fet);
386 return std::make_unique<FEXYZ<3>>(fet);
389 return std::make_unique<FEScalar<3>>(fet);
392 return std::make_unique<FENedelecOne<3>>(fet);
395 return std::make_unique<FERaviartThomas<3>>(fet);
398 return std::make_unique<FEL2RaviartThomas<3>>(fet);
406 libmesh_error_msg(
"Invalid dimension dim = " <<
dim);
903 const unsigned int Dim = elem->
dim();
914#ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
924 inf_fe_family_mapping_switch(2, inf_compute_node_constraints (constraints, elem) , ,;
break;);
929 inf_fe_family_mapping_switch(3, inf_compute_node_constraints (constraints, elem) , ,;
break;);
933 libmesh_error_msg(
"Invalid dim = " << Dim);
943 std::vector<const Node *> my_nodes, parent_nodes;
944 std::unique_ptr<const Elem> my_side, parent_side;
965 const unsigned int n_side_nodes = my_side->n_nodes();
968 my_nodes.reserve (n_side_nodes);
969 parent_nodes.clear();
970 parent_nodes.reserve (n_side_nodes);
972 for (
unsigned int n=0; n != n_side_nodes; ++n)
973 my_nodes.push_back(my_side->node_ptr(n));
975 for (
unsigned int n=0; n != n_side_nodes; ++n)
976 parent_nodes.push_back(parent_side->node_ptr(n));
978 for (
unsigned int my_side_n=0;
979 my_side_n < n_side_nodes;
989 const int side_max_order =
993 side_fe_type.
order = side_max_order;
1001 const Node * my_node = my_nodes[my_side_n];
1004 const Point & support_point = *my_node;
1012 for (
unsigned int their_side_n=0;
1013 their_side_n < n_side_nodes;
1021 parent_side.get()));
1023 const Node * their_node = parent_nodes[their_side_n];
1033 const Real their_mag = std::abs(their_value);
1037 if (their_mag > 0.999)
1039 libmesh_assert_equal_to (my_node, their_node);
1040 libmesh_assert_less (std::abs(their_value - 1.), 0.001);
1049 if (their_mag < 1.e-5)
1059 constraint_row.emplace(their_node, 0.);
1074 constraint_row.emplace(their_node, their_value);
1097 if (boundaries.empty())
1106 const unsigned int Dim = elem->
dim();
1112 std::vector<const Node *> my_nodes, neigh_nodes;
1113 std::unique_ptr<const Elem> my_side, neigh_side;
1117 std::vector<boundary_id_type> bc_ids;
1123 mesh.get_boundary_info().boundary_ids (elem, s, bc_ids);
1124 for (
const auto & boundary_id : bc_ids)
1132 unsigned int s_neigh;
1133 const Elem * neigh = boundaries.
neighbor(boundary_id, *point_locator, elem, s, &s_neigh);
1135 libmesh_error_msg_if
1136 (!neigh,
"PeriodicBoundaries can't find a periodic neighbor for element " <<
1137 elem->
id() <<
" side " << s);
1145#ifdef LIBMESH_ENABLE_AMR
1152 const unsigned int n_side_nodes = my_side->n_nodes();
1155 my_nodes.reserve (n_side_nodes);
1156 neigh_nodes.clear();
1157 neigh_nodes.reserve (n_side_nodes);
1159 for (
unsigned int n=0; n != n_side_nodes; ++n)
1160 my_nodes.push_back(my_side->node_ptr(n));
1162 for (
unsigned int n=0; n != n_side_nodes; ++n)
1163 neigh_nodes.push_back(neigh_side->node_ptr(n));
1169 std::vector<bool> skip_constraint(n_side_nodes,
false);
1171 for (
unsigned int my_side_n=0;
1172 my_side_n < n_side_nodes;
1178 const Node * my_node = my_nodes[my_side_n];
1186 if (constraints.count(my_node))
1188 skip_constraint[my_side_n] =
true;
1194 for (
unsigned int their_side_n=0;
1195 their_side_n < n_side_nodes;
1201 const Node * their_node = neigh_nodes[their_side_n];
1210 if (!constraints.count(their_node))
1214 constraints[their_node].first;
1216 for (
unsigned int orig_side_n=0;
1217 orig_side_n < n_side_nodes;
1223 const Node * orig_node = my_nodes[orig_side_n];
1225 if (their_constraint_row.count(orig_node))
1226 skip_constraint[orig_side_n] =
true;
1231 for (
unsigned int my_side_n=0;
1232 my_side_n < n_side_nodes;
1238 if (skip_constraint[my_side_n])
1241 const Node * my_node = my_nodes[my_side_n];
1247 const Point mapped_point =
1251 for (
unsigned int their_side_n=0;
1252 their_side_n < n_side_nodes;
1258 const Node * their_node = neigh_nodes[their_side_n];
1275 constraints[my_node].first;
1277 constraint_row.emplace(their_node, their_value);