19 #include "libmesh/face_quad.h"
20 #include "libmesh/edge_edge2.h"
21 #include "libmesh/face_quad4.h"
22 #include "libmesh/enum_elem_quality.h"
57 libmesh_assert_less (s, this->
n_sides());
66 unsigned int side_node)
const
68 libmesh_assert_less (side, this->
n_sides());
69 libmesh_assert_less (side_node, 2);
88 libmesh_assert_less (i, this->
n_sides());
90 std::unique_ptr<Elem> edge = libmesh_make_unique<Edge2>();
92 for (
auto n : edge->node_index_range())
101 const unsigned int i)
103 this->simple_side_ptr<Quad,Quad4>(side, i,
EDGE2);
109 const unsigned int s)
const
112 libmesh_assert_less (s, this->
n_sides());
116 unsigned int n = (c < 2) ? c : 5-c;
117 return (n == s || n == (s+1)%4);
124 libmesh_assert_less (side_in, 4);
126 return (side_in + 2) % 4;
132 const unsigned int side_in)
const
134 libmesh_assert_less (node_in, 8);
135 libmesh_assert_less (node_in, this->
n_nodes());
136 libmesh_assert_less (side_in, this->
n_sides());
139 static const unsigned char side02_nodes_map[] =
140 {3, 2, 1, 0, 6, 255, 4, 255};
141 static const unsigned char side13_nodes_map[] =
142 {1, 0, 3, 2, 255, 7, 255, 5};
148 return side02_nodes_map[node_in];
151 return side13_nodes_map[node_in];
153 libmesh_error_msg(
"Unsupported side_in = " << side_in);
168 max = *std::max_element(lengths, lengths+4),
169 min = *std::min_element(lengths, lengths+4);
190 if ((d02 > 0.) && (d13 >0.))
191 if (d02 < d13)
return d02 / d13;
192 else return d13 / d02;
203 Real min_edge = *std::min_element(lengths, lengths+4);
219 typedef std::array<Real, 4> Array4;
220 typedef std::array<Real, 6> Array6;
230 std::array<Array6, 4>
A;
231 for (
unsigned int k=0; k<4; ++k)
234 kp1 = k+1 > 3 ? k+1-4 : k+1,
235 kp3 = k+3 > 3 ? k+3-4 : k+3;
239 A[k] = {{x[kp1] - x[k], x[kp3] - x[k],
240 y[kp1] - y[k], y[kp3] - y[k],
241 z[kp1] - z[k], z[kp3] - z[k]}};
246 std::array<Array4, 4> T;
247 for (
unsigned int k=0; k<4; ++k)
250 top_left =
A[k][0]*
A[k][0] +
A[k][2]*
A[k][2] +
A[k][4]*
A[k][4],
251 off_diag =
A[k][0]*
A[k][1] +
A[k][2]*
A[k][3] +
A[k][4]*
A[k][5],
252 bot_rigt =
A[k][1]*
A[k][1] +
A[k][3]*
A[k][3] +
A[k][5]*
A[k][5];
254 T[k] = {{top_left, off_diag,
255 off_diag, bot_rigt}};
262 for (
unsigned int k=0; k<4; ++k)
263 alpha[k] =
std::sqrt(T[k][0]*T[k][3] - T[k][1]*T[k][2]);
269 if (*std::min_element(alpha.begin(), alpha.end()) == 0.)
277 for (
unsigned int k=0; k<4; ++k)
278 den += (T[k][0] + T[k][3]) / alpha[k];
279 return (den == 0.) ? 0 : (8. / den);
283 for (
unsigned int k=0; k<4; ++k)
284 den +=
std::sqrt(T[k][0] * T[k][3]) / alpha[k];
285 return (den == 0.) ? 0 : (4. / den);
301 std::pair<Real, Real> bounds;
338 bounds.second = 135.;
364 libMesh::out <<
"Warning: Invalid quality measure chosen." << std::endl;
403 #ifdef LIBMESH_ENABLE_AMR
410 { 0, 2, 12, 10, 1, 7, 11, 5, 6},
413 { 2, 4, 14, 12, 3, 9, 13, 7, 8},
416 { 10, 12, 22, 20, 11, 17, 21, 15, 16},
419 { 12, 14, 24, 22, 13, 19, 23, 17, 18}