20 #include "libmesh/fe.h" 21 #include "libmesh/elem.h" 22 #include "libmesh/fe_interface.h" 23 #include "libmesh/enum_to_string.h" 37 Real d1d2n, d1d3n, d2d3n, d2d1n, d3d1n, d3d2n;
38 Real d1xd1x, d1xd1y, d1xd2n, d1xd3n;
39 Real d1yd1x, d1yd1y, d1yd2n, d1yd3n;
40 Real d2xd2x, d2xd2y, d2xd3n, d2xd1n;
41 Real d2yd2x, d2yd2y, d2yd3n, d2yd1n;
42 Real d3xd3x, d3xd3y, d3xd1n, d3xd2n;
43 Real d3yd3x, d3yd3y, d3yd1n, d3yd2n;
44 Real d1nd1n, d2nd2n, d3nd3n;
47 Real N01x, N01y, N10x, N10y;
48 Real N02x, N02y, N20x, N20y;
49 Real N21x, N21y, N12x, N12y;
52 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 54 Real clough_raw_shape_second_deriv(
const unsigned int basis_num,
55 const unsigned int deriv_type,
59 Real clough_raw_shape_deriv(
const unsigned int basis_num,
60 const unsigned int deriv_type,
62 Real clough_raw_shape(
const unsigned int basis_num,
64 unsigned char subtriangle_lookup(
const Point & p);
68 void clough_compute_coefs(
const Elem * elem, CloughCoefs & coefs)
75 const int n_mapping_shape_functions =
79 std::vector<Point> dofpt;
80 dofpt.push_back(
Point(0,0));
81 dofpt.push_back(
Point(1,0));
82 dofpt.push_back(
Point(0,1));
83 dofpt.push_back(
Point(1/2.,1/2.));
84 dofpt.push_back(
Point(0,1/2.));
85 dofpt.push_back(
Point(1/2.,0));
88 std::vector<Real> dxdxi(6), dxdeta(6), dydxi(6), dydeta(6);
89 std::vector<Real> dxidx(6), detadx(6), dxidy(6), detady(6);
94 for (
int p = 0; p != 6; ++p)
97 for (
int i = 0; i != n_mapping_shape_functions; ++i)
99 const Real ddxi = shape_deriv_ptr
100 (map_fe_type, elem, i, 0, dofpt[p],
false);
101 const Real ddeta = shape_deriv_ptr
102 (map_fe_type, elem, i, 1, dofpt[p],
false);
107 dxdxi[p] += elem->
point(i)(0) * ddxi;
108 dydxi[p] += elem->
point(i)(1) * ddxi;
109 dxdeta[p] += elem->
point(i)(0) * ddeta;
110 dydeta[p] += elem->
point(i)(1) * ddeta;
123 const Real inv_jac = 1. / (dxdxi[p]*dydeta[p] -
125 dxidx[p] = dydeta[p] * inv_jac;
126 dxidy[p] = - dxdeta[p] * inv_jac;
127 detadx[p] = - dydxi[p] * inv_jac;
128 detady[p] = dxdxi[p] * inv_jac;
132 Real N1x = dydeta[3] - dydxi[3];
133 Real N1y = dxdxi[3] - dxdeta[3];
134 Real Nlength = std::sqrt(static_cast<Real>(N1x*N1x + N1y*N1y));
135 N1x /= Nlength; N1y /= Nlength;
137 Real N2x = - dydeta[4];
138 Real N2y = dxdeta[4];
139 Nlength = std::sqrt(static_cast<Real>(N2x*N2x + N2y*N2y));
140 N2x /= Nlength; N2y /= Nlength;
143 Real N3y = - dxdxi[5];
144 Nlength = std::sqrt(static_cast<Real>(N3x*N3x + N3y*N3y));
145 N3x /= Nlength; N3y /= Nlength;
148 coefs.N01x = dydxi[0];
149 coefs.N01y = - dxdxi[0];
150 Nlength = std::sqrt(static_cast<Real>(coefs.N01x*coefs.N01x + coefs.N01y*coefs.N01y));
151 coefs.N01x /= Nlength; coefs.N01y /= Nlength;
153 coefs.N10x = dydxi[1];
154 coefs.N10y = - dxdxi[1];
155 Nlength = std::sqrt(static_cast<Real>(coefs.N10x*coefs.N10x + coefs.N10y*coefs.N10y));
156 coefs.N10x /= Nlength; coefs.N10y /= Nlength;
158 coefs.N02x = - dydeta[0];
159 coefs.N02y = dxdeta[0];
160 Nlength = std::sqrt(static_cast<Real>(coefs.N02x*coefs.N02x + coefs.N02y*coefs.N02y));
161 coefs.N02x /= Nlength; coefs.N02y /= Nlength;
163 coefs.N20x = - dydeta[2];
164 coefs.N20y = dxdeta[2];
165 Nlength = std::sqrt(static_cast<Real>(coefs.N20x*coefs.N20x + coefs.N20y*coefs.N20y));
166 coefs.N20x /= Nlength; coefs.N20y /= Nlength;
168 coefs.N12x = dydeta[1] - dydxi[1];
169 coefs.N12y = dxdxi[1] - dxdeta[1];
170 Nlength = std::sqrt(static_cast<Real>(coefs.N12x*coefs.N12x + coefs.N12y*coefs.N12y));
171 coefs.N12x /= Nlength; coefs.N12y /= Nlength;
173 coefs.N21x = dydeta[1] - dydxi[1];
174 coefs.N21y = dxdxi[1] - dxdeta[1];
175 Nlength = std::sqrt(static_cast<Real>(coefs.N21x*coefs.N21x + coefs.N21y*coefs.N21y));
176 coefs.N21x /= Nlength; coefs.N21y /= Nlength;
198 N1x = -N1x; N1y = -N1y;
199 coefs.N12x = -coefs.N12x; coefs.N12y = -coefs.N12y;
200 coefs.N21x = -coefs.N21x; coefs.N21y = -coefs.N21y;
216 N2x = -N2x; N2y = -N2y;
217 coefs.N02x = -coefs.N02x; coefs.N02y = -coefs.N02y;
218 coefs.N20x = -coefs.N20x; coefs.N20y = -coefs.N20y;
236 coefs.N01x = -coefs.N01x; coefs.N01y = -coefs.N01y;
237 coefs.N10x = -coefs.N10x; coefs.N10y = -coefs.N10y;
257 Real d1d2ndxi = clough_raw_shape_deriv(0, 0, dofpt[4]);
258 Real d1d2ndeta = clough_raw_shape_deriv(0, 1, dofpt[4]);
259 Real d1d2ndx = d1d2ndxi * dxidx[4] + d1d2ndeta * detadx[4];
260 Real d1d2ndy = d1d2ndxi * dxidy[4] + d1d2ndeta * detady[4];
261 Real d1d3ndxi = clough_raw_shape_deriv(0, 0, dofpt[5]);
262 Real d1d3ndeta = clough_raw_shape_deriv(0, 1, dofpt[5]);
263 Real d1d3ndx = d1d3ndxi * dxidx[5] + d1d3ndeta * detadx[5];
264 Real d1d3ndy = d1d3ndxi * dxidy[5] + d1d3ndeta * detady[5];
265 Real d2d3ndxi = clough_raw_shape_deriv(1, 0, dofpt[5]);
266 Real d2d3ndeta = clough_raw_shape_deriv(1, 1, dofpt[5]);
267 Real d2d3ndx = d2d3ndxi * dxidx[5] + d2d3ndeta * detadx[5];
268 Real d2d3ndy = d2d3ndxi * dxidy[5] + d2d3ndeta * detady[5];
269 Real d2d1ndxi = clough_raw_shape_deriv(1, 0, dofpt[3]);
270 Real d2d1ndeta = clough_raw_shape_deriv(1, 1, dofpt[3]);
271 Real d2d1ndx = d2d1ndxi * dxidx[3] + d2d1ndeta * detadx[3];
272 Real d2d1ndy = d2d1ndxi * dxidy[3] + d2d1ndeta * detady[3];
273 Real d3d1ndxi = clough_raw_shape_deriv(2, 0, dofpt[3]);
274 Real d3d1ndeta = clough_raw_shape_deriv(2, 1, dofpt[3]);
275 Real d3d1ndx = d3d1ndxi * dxidx[3] + d3d1ndeta * detadx[3];
276 Real d3d1ndy = d3d1ndxi * dxidy[3] + d3d1ndeta * detady[3];
277 Real d3d2ndxi = clough_raw_shape_deriv(2, 0, dofpt[4]);
278 Real d3d2ndeta = clough_raw_shape_deriv(2, 1, dofpt[4]);
279 Real d3d2ndx = d3d2ndxi * dxidx[4] + d3d2ndeta * detadx[4];
280 Real d3d2ndy = d3d2ndxi * dxidy[4] + d3d2ndeta * detady[4];
281 Real d1xd2ndxi = clough_raw_shape_deriv(3, 0, dofpt[4]);
282 Real d1xd2ndeta = clough_raw_shape_deriv(3, 1, dofpt[4]);
283 Real d1xd2ndx = d1xd2ndxi * dxidx[4] + d1xd2ndeta * detadx[4];
284 Real d1xd2ndy = d1xd2ndxi * dxidy[4] + d1xd2ndeta * detady[4];
285 Real d1xd3ndxi = clough_raw_shape_deriv(3, 0, dofpt[5]);
286 Real d1xd3ndeta = clough_raw_shape_deriv(3, 1, dofpt[5]);
287 Real d1xd3ndx = d1xd3ndxi * dxidx[5] + d1xd3ndeta * detadx[5];
288 Real d1xd3ndy = d1xd3ndxi * dxidy[5] + d1xd3ndeta * detady[5];
289 Real d1yd2ndxi = clough_raw_shape_deriv(4, 0, dofpt[4]);
290 Real d1yd2ndeta = clough_raw_shape_deriv(4, 1, dofpt[4]);
291 Real d1yd2ndx = d1yd2ndxi * dxidx[4] + d1yd2ndeta * detadx[4];
292 Real d1yd2ndy = d1yd2ndxi * dxidy[4] + d1yd2ndeta * detady[4];
293 Real d1yd3ndxi = clough_raw_shape_deriv(4, 0, dofpt[5]);
294 Real d1yd3ndeta = clough_raw_shape_deriv(4, 1, dofpt[5]);
295 Real d1yd3ndx = d1yd3ndxi * dxidx[5] + d1yd3ndeta * detadx[5];
296 Real d1yd3ndy = d1yd3ndxi * dxidy[5] + d1yd3ndeta * detady[5];
297 Real d2xd3ndxi = clough_raw_shape_deriv(5, 0, dofpt[5]);
298 Real d2xd3ndeta = clough_raw_shape_deriv(5, 1, dofpt[5]);
299 Real d2xd3ndx = d2xd3ndxi * dxidx[5] + d2xd3ndeta * detadx[5];
300 Real d2xd3ndy = d2xd3ndxi * dxidy[5] + d2xd3ndeta * detady[5];
301 Real d2xd1ndxi = clough_raw_shape_deriv(5, 0, dofpt[3]);
302 Real d2xd1ndeta = clough_raw_shape_deriv(5, 1, dofpt[3]);
303 Real d2xd1ndx = d2xd1ndxi * dxidx[3] + d2xd1ndeta * detadx[3];
304 Real d2xd1ndy = d2xd1ndxi * dxidy[3] + d2xd1ndeta * detady[3];
305 Real d2yd3ndxi = clough_raw_shape_deriv(6, 0, dofpt[5]);
306 Real d2yd3ndeta = clough_raw_shape_deriv(6, 1, dofpt[5]);
307 Real d2yd3ndx = d2yd3ndxi * dxidx[5] + d2yd3ndeta * detadx[5];
308 Real d2yd3ndy = d2yd3ndxi * dxidy[5] + d2yd3ndeta * detady[5];
309 Real d2yd1ndxi = clough_raw_shape_deriv(6, 0, dofpt[3]);
310 Real d2yd1ndeta = clough_raw_shape_deriv(6, 1, dofpt[3]);
311 Real d2yd1ndx = d2yd1ndxi * dxidx[3] + d2yd1ndeta * detadx[3];
312 Real d2yd1ndy = d2yd1ndxi * dxidy[3] + d2yd1ndeta * detady[3];
313 Real d3xd1ndxi = clough_raw_shape_deriv(7, 0, dofpt[3]);
314 Real d3xd1ndeta = clough_raw_shape_deriv(7, 1, dofpt[3]);
315 Real d3xd1ndx = d3xd1ndxi * dxidx[3] + d3xd1ndeta * detadx[3];
316 Real d3xd1ndy = d3xd1ndxi * dxidy[3] + d3xd1ndeta * detady[3];
317 Real d3xd2ndxi = clough_raw_shape_deriv(7, 0, dofpt[4]);
318 Real d3xd2ndeta = clough_raw_shape_deriv(7, 1, dofpt[4]);
319 Real d3xd2ndx = d3xd2ndxi * dxidx[4] + d3xd2ndeta * detadx[4];
320 Real d3xd2ndy = d3xd2ndxi * dxidy[4] + d3xd2ndeta * detady[4];
321 Real d3yd1ndxi = clough_raw_shape_deriv(8, 0, dofpt[3]);
322 Real d3yd1ndeta = clough_raw_shape_deriv(8, 1, dofpt[3]);
323 Real d3yd1ndx = d3yd1ndxi * dxidx[3] + d3yd1ndeta * detadx[3];
324 Real d3yd1ndy = d3yd1ndxi * dxidy[3] + d3yd1ndeta * detady[3];
325 Real d3yd2ndxi = clough_raw_shape_deriv(8, 0, dofpt[4]);
326 Real d3yd2ndeta = clough_raw_shape_deriv(8, 1, dofpt[4]);
327 Real d3yd2ndx = d3yd2ndxi * dxidx[4] + d3yd2ndeta * detadx[4];
328 Real d3yd2ndy = d3yd2ndxi * dxidy[4] + d3yd2ndeta * detady[4];
329 Real d1nd1ndxi = clough_raw_shape_deriv(9, 0, dofpt[3]);
330 Real d1nd1ndeta = clough_raw_shape_deriv(9, 1, dofpt[3]);
331 Real d1nd1ndx = d1nd1ndxi * dxidx[3] + d1nd1ndeta * detadx[3];
332 Real d1nd1ndy = d1nd1ndxi * dxidy[3] + d1nd1ndeta * detady[3];
333 Real d2nd2ndxi = clough_raw_shape_deriv(10, 0, dofpt[4]);
334 Real d2nd2ndeta = clough_raw_shape_deriv(10, 1, dofpt[4]);
335 Real d2nd2ndx = d2nd2ndxi * dxidx[4] + d2nd2ndeta * detadx[4];
336 Real d2nd2ndy = d2nd2ndxi * dxidy[4] + d2nd2ndeta * detady[4];
337 Real d3nd3ndxi = clough_raw_shape_deriv(11, 0, dofpt[5]);
338 Real d3nd3ndeta = clough_raw_shape_deriv(11, 1, dofpt[5]);
339 Real d3nd3ndx = d3nd3ndxi * dxidx[3] + d3nd3ndeta * detadx[3];
340 Real d3nd3ndy = d3nd3ndxi * dxidy[3] + d3nd3ndeta * detady[3];
342 Real d1xd1dxi = clough_raw_shape_deriv(3, 0, dofpt[0]);
343 Real d1xd1deta = clough_raw_shape_deriv(3, 1, dofpt[0]);
344 Real d1xd1dx = d1xd1dxi * dxidx[0] + d1xd1deta * detadx[0];
345 Real d1xd1dy = d1xd1dxi * dxidy[0] + d1xd1deta * detady[0];
346 Real d1yd1dxi = clough_raw_shape_deriv(4, 0, dofpt[0]);
347 Real d1yd1deta = clough_raw_shape_deriv(4, 1, dofpt[0]);
348 Real d1yd1dx = d1yd1dxi * dxidx[0] + d1yd1deta * detadx[0];
349 Real d1yd1dy = d1yd1dxi * dxidy[0] + d1yd1deta * detady[0];
350 Real d2xd2dxi = clough_raw_shape_deriv(5, 0, dofpt[1]);
351 Real d2xd2deta = clough_raw_shape_deriv(5, 1, dofpt[1]);
352 Real d2xd2dx = d2xd2dxi * dxidx[1] + d2xd2deta * detadx[1];
353 Real d2xd2dy = d2xd2dxi * dxidy[1] + d2xd2deta * detady[1];
373 Real d2yd2dxi = clough_raw_shape_deriv(6, 0, dofpt[1]);
374 Real d2yd2deta = clough_raw_shape_deriv(6, 1, dofpt[1]);
375 Real d2yd2dx = d2yd2dxi * dxidx[1] + d2yd2deta * detadx[1];
376 Real d2yd2dy = d2yd2dxi * dxidy[1] + d2yd2deta * detady[1];
377 Real d3xd3dxi = clough_raw_shape_deriv(7, 0, dofpt[2]);
378 Real d3xd3deta = clough_raw_shape_deriv(7, 1, dofpt[2]);
379 Real d3xd3dx = d3xd3dxi * dxidx[1] + d3xd3deta * detadx[1];
380 Real d3xd3dy = d3xd3dxi * dxidy[1] + d3xd3deta * detady[1];
381 Real d3yd3dxi = clough_raw_shape_deriv(8, 0, dofpt[2]);
382 Real d3yd3deta = clough_raw_shape_deriv(8, 1, dofpt[2]);
383 Real d3yd3dx = d3yd3dxi * dxidx[1] + d3yd3deta * detadx[1];
384 Real d3yd3dy = d3yd3dxi * dxidy[1] + d3yd3deta * detady[1];
388 Real d1nd1ndn = d1nd1ndx * N1x + d1nd1ndy * N1y;
389 Real d1xd2ndn = d1xd2ndx * N2x + d1xd2ndy * N2y;
390 Real d1xd3ndn = d1xd3ndx * N3x + d1xd3ndy * N3y;
391 Real d1yd2ndn = d1yd2ndx * N2x + d1yd2ndy * N2y;
392 Real d1yd3ndn = d1yd3ndx * N3x + d1yd3ndy * N3y;
394 Real d2nd2ndn = d2nd2ndx * N2x + d2nd2ndy * N2y;
395 Real d2xd3ndn = d2xd3ndx * N3x + d2xd3ndy * N3y;
396 Real d2xd1ndn = d2xd1ndx * N1x + d2xd1ndy * N1y;
397 Real d2yd3ndn = d2yd3ndx * N3x + d2yd3ndy * N3y;
398 Real d2yd1ndn = d2yd1ndx * N1x + d2yd1ndy * N1y;
400 Real d3nd3ndn = d3nd3ndx * N3x + d3nd3ndy * N3y;
401 Real d3xd1ndn = d3xd1ndx * N1x + d3xd1ndy * N1y;
402 Real d3xd2ndn = d3xd2ndx * N2x + d3xd2ndy * N2y;
403 Real d3yd1ndn = d3yd1ndx * N1x + d3yd1ndy * N1y;
404 Real d3yd2ndn = d3yd2ndx * N2x + d3yd2ndy * N2y;
408 coefs.d1nd1n = 1. / d1nd1ndn;
409 coefs.d2nd2n = 1. / d2nd2ndn;
410 coefs.d3nd3n = 1. / d3nd3ndn;
415 coefs.d1d2n = -(d1d2ndx * N2x + d1d2ndy * N2y) / d2nd2ndn;
416 coefs.d1d3n = -(d1d3ndx * N3x + d1d3ndy * N3y) / d3nd3ndn;
417 coefs.d2d3n = -(d2d3ndx * N3x + d2d3ndy * N3y) / d3nd3ndn;
418 coefs.d2d1n = -(d2d1ndx * N1x + d2d1ndy * N1y) / d1nd1ndn;
419 coefs.d3d1n = -(d3d1ndx * N1x + d3d1ndy * N1y) / d1nd1ndn;
420 coefs.d3d2n = -(d3d2ndx * N2x + d3d2ndy * N2y) / d2nd2ndn;
424 coefs.d1xd1x = d1yd1dy / (d1yd1dy * d1xd1dx - d1xd1dy * d1yd1dx);
425 coefs.d1xd1y = d1xd1dy / (d1xd1dy * d1yd1dx - d1xd1dx * d1yd1dy);
427 coefs.d1yd1y = d1xd1dx / (d1xd1dx * d1yd1dy - d1yd1dx * d1xd1dy);
428 coefs.d1yd1x = d1yd1dx / (d1yd1dx * d1xd1dy - d1yd1dy * d1xd1dx);
430 coefs.d2xd2x = d2yd2dy / (d2yd2dy * d2xd2dx - d2xd2dy * d2yd2dx);
431 coefs.d2xd2y = d2xd2dy / (d2xd2dy * d2yd2dx - d2xd2dx * d2yd2dy);
433 coefs.d2yd2y = d2xd2dx / (d2xd2dx * d2yd2dy - d2yd2dx * d2xd2dy);
434 coefs.d2yd2x = d2yd2dx / (d2yd2dx * d2xd2dy - d2yd2dy * d2xd2dx);
436 coefs.d3xd3x = d3yd3dy / (d3yd3dy * d3xd3dx - d3xd3dy * d3yd3dx);
437 coefs.d3xd3y = d3xd3dy / (d3xd3dy * d3yd3dx - d3xd3dx * d3yd3dy);
439 coefs.d3yd3y = d3xd3dx / (d3xd3dx * d3yd3dy - d3yd3dx * d3xd3dy);
440 coefs.d3yd3x = d3yd3dx / (d3yd3dx * d3xd3dy - d3yd3dy * d3xd3dx);
459 coefs.d1xd2n = -(coefs.d1xd1x * d1xd2ndn + coefs.d1xd1y * d1yd2ndn) / d2nd2ndn;
460 coefs.d1yd2n = -(coefs.d1yd1y * d1yd2ndn + coefs.d1yd1x * d1xd2ndn) / d2nd2ndn;
461 coefs.d1xd3n = -(coefs.d1xd1x * d1xd3ndn + coefs.d1xd1y * d1yd3ndn) / d3nd3ndn;
462 coefs.d1yd3n = -(coefs.d1yd1y * d1yd3ndn + coefs.d1yd1x * d1xd3ndn) / d3nd3ndn;
463 coefs.d2xd3n = -(coefs.d2xd2x * d2xd3ndn + coefs.d2xd2y * d2yd3ndn) / d3nd3ndn;
464 coefs.d2yd3n = -(coefs.d2yd2y * d2yd3ndn + coefs.d2yd2x * d2xd3ndn) / d3nd3ndn;
465 coefs.d2xd1n = -(coefs.d2xd2x * d2xd1ndn + coefs.d2xd2y * d2yd1ndn) / d1nd1ndn;
466 coefs.d2yd1n = -(coefs.d2yd2y * d2yd1ndn + coefs.d2yd2x * d2xd1ndn) / d1nd1ndn;
467 coefs.d3xd1n = -(coefs.d3xd3x * d3xd1ndn + coefs.d3xd3y * d3yd1ndn) / d1nd1ndn;
468 coefs.d3yd1n = -(coefs.d3yd3y * d3yd1ndn + coefs.d3yd3x * d3xd1ndn) / d1nd1ndn;
469 coefs.d3xd2n = -(coefs.d3xd3x * d3xd2ndn + coefs.d3xd3y * d3yd2ndn) / d2nd2ndn;
470 coefs.d3yd2n = -(coefs.d3yd3y * d3yd2ndn + coefs.d3yd3x * d3xd2ndn) / d2nd2ndn;
517 unsigned char subtriangle_lookup(
const Point & p)
519 if ((p(0) >= p(1)) && (p(0) + 2 * p(1) <= 1))
521 if ((p(0) <= p(1)) && (p(1) + 2 * p(0) <= 1))
527 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 530 Real clough_raw_shape_second_deriv(
const unsigned int basis_num,
531 const unsigned int deriv_type,
534 Real xi = p(0), eta = p(1);
544 switch (subtriangle_lookup(p))
549 return -30 + 42*xi + 42*eta;
551 return -6 + 18*xi - 6*eta;
554 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
555 subtriangle_lookup(p));
558 switch (subtriangle_lookup(p))
563 return 18 - 27*xi - 21*eta;
565 return 6 - 15*xi + 3*eta;
568 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
569 subtriangle_lookup(p));
572 switch (subtriangle_lookup(p))
577 return 12 - 15*xi - 21*eta;
579 return -3*xi + 3*eta;
582 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
583 subtriangle_lookup(p));
586 switch (subtriangle_lookup(p))
591 return -9 + 13*xi + 8*eta;
593 return -1 - 7*xi + 4*eta;
596 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
597 subtriangle_lookup(p));
600 switch (subtriangle_lookup(p))
605 return 1 - 2*xi + 3*eta;
607 return -3 + 14*xi - eta;
610 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
611 subtriangle_lookup(p));
614 switch (subtriangle_lookup(p))
619 return -4 + 17./2.*xi + 7./2.*eta;
621 return -2 + 13./2.*xi - 1./2.*eta;
624 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
625 subtriangle_lookup(p));
628 switch (subtriangle_lookup(p))
633 return 9 - 23./2.*xi - 23./2.*eta;
635 return -1 + 5./2.*xi + 9./2.*eta;
638 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
639 subtriangle_lookup(p));
642 switch (subtriangle_lookup(p))
647 return 7 - 17./2.*xi - 25./2.*eta;
649 return 1 - 13./2.*xi + 7./2.*eta;
652 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
653 subtriangle_lookup(p));
656 switch (subtriangle_lookup(p))
661 return -2 + 5./2.*xi + 7./2.*eta;
663 return 1./2.*xi - 1./2.*eta;
666 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
667 subtriangle_lookup(p));
670 switch (subtriangle_lookup(p))
675 return std::sqrt(
Real(2)) * (8 - 10*xi - 14*eta);
677 return std::sqrt(
Real(2)) * (-2*xi + 2*eta);
680 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
681 subtriangle_lookup(p));
684 switch (subtriangle_lookup(p))
689 return -4 + 4*xi + 8*eta;
691 return -4 + 20*xi - 8*eta;
694 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
695 subtriangle_lookup(p));
698 switch (subtriangle_lookup(p))
703 return -12 + 16*xi + 12*eta;
705 return 4 - 16*xi - 4*eta;
708 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
709 subtriangle_lookup(p));
713 libmesh_error_msg(
"Invalid shape function index i = " <<
722 switch (subtriangle_lookup(p))
733 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
734 subtriangle_lookup(p));
737 switch (subtriangle_lookup(p))
742 return 15 - 21*xi - 21*eta;
747 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
748 subtriangle_lookup(p));
751 switch (subtriangle_lookup(p))
756 return 15 - 21*xi - 21*eta;
761 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
762 subtriangle_lookup(p));
765 switch (subtriangle_lookup(p))
770 return -4 + 8*xi + 3*eta;
772 return -3 + 4*xi + 4*eta;
775 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
776 subtriangle_lookup(p));
779 switch (subtriangle_lookup(p))
782 return -3 + 4*xi + 4*eta;
784 return - 4 + 3*xi + 8*eta;
789 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
790 subtriangle_lookup(p));
793 switch (subtriangle_lookup(p))
798 return -5./2. + 7./2.*xi + 7./2.*eta;
803 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
804 subtriangle_lookup(p));
807 switch (subtriangle_lookup(p))
810 return -1 + 4*xi + 7./2.*eta;
812 return 19./2. - 23./2.*xi - 25./2.*eta;
817 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
818 subtriangle_lookup(p));
821 switch (subtriangle_lookup(p))
826 return 19./2. - 25./2.*xi - 23./2.*eta;
828 return -1 + 7./2.*xi + 4*eta;
831 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
832 subtriangle_lookup(p));
835 switch (subtriangle_lookup(p))
840 return -5./2. + 7./2.*xi + 7./2.*eta;
845 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
846 subtriangle_lookup(p));
849 switch (subtriangle_lookup(p))
852 return std::sqrt(
Real(2)) * (2*eta);
854 return std::sqrt(
Real(2)) * (10 - 14*xi - 14*eta);
856 return std::sqrt(
Real(2)) * (2*xi);
859 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
860 subtriangle_lookup(p));
863 switch (subtriangle_lookup(p))
868 return - 8 + 8*xi + 12*eta;
870 return 4 - 8*xi - 8*eta;
873 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
874 subtriangle_lookup(p));
877 switch (subtriangle_lookup(p))
880 return 4 - 8*xi - 8*eta;
882 return -8 + 12*xi + 8*eta;
887 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
888 subtriangle_lookup(p));
892 libmesh_error_msg(
"Invalid shape function index i = " <<
901 switch (subtriangle_lookup(p))
904 return -6 - 6*xi + 18*eta;
906 return -30 + 42*xi + 42*eta;
911 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
912 subtriangle_lookup(p));
915 switch (subtriangle_lookup(p))
920 return 12 - 21*xi - 15*eta;
925 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
926 subtriangle_lookup(p));
929 switch (subtriangle_lookup(p))
932 return 6 + 3*xi - 15*eta;
934 return 18 - 21.*xi - 27*eta;
939 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
940 subtriangle_lookup(p));
943 switch (subtriangle_lookup(p))
946 return -3 - xi + 14*eta;
948 return 1 + 3*xi - 2*eta;
953 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
954 subtriangle_lookup(p));
957 switch (subtriangle_lookup(p))
960 return -1 + 4*xi - 7*eta;
962 return -9 + 8*xi + 13*eta;
967 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
968 subtriangle_lookup(p));
971 switch (subtriangle_lookup(p))
974 return - 1./2.*xi + 1./2.*eta;
976 return -2 + 7./2.*xi + 5./2.*eta;
981 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
982 subtriangle_lookup(p));
985 switch (subtriangle_lookup(p))
988 return 1 + 7./2.*xi - 13./2.*eta;
990 return 7 - 25./2.*xi - 17./2.*eta;
995 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
996 subtriangle_lookup(p));
999 switch (subtriangle_lookup(p))
1002 return -1 + 9./2.*xi + 5./2.*eta;
1004 return 9 - 23./2.*xi - 23./2.*eta;
1009 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1010 subtriangle_lookup(p));
1013 switch (subtriangle_lookup(p))
1016 return -2 - 1./2.*xi + 13./2.*eta;
1018 return -4 + 7./2.*xi + 17./2.*eta;
1023 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1024 subtriangle_lookup(p));
1027 switch (subtriangle_lookup(p))
1030 return std::sqrt(
Real(2)) * (2*xi - 2*eta);
1032 return std::sqrt(
Real(2)) * (8 - 14*xi - 10*eta);
1037 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1038 subtriangle_lookup(p));
1041 switch (subtriangle_lookup(p))
1044 return 4 - 4*xi - 16*eta;
1046 return -12 + 12*xi + 16*eta;
1051 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1052 subtriangle_lookup(p));
1055 switch (subtriangle_lookup(p))
1058 return -4 - 8*xi + 20*eta;
1060 return -4 + 8*xi + 4*eta;
1065 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1066 subtriangle_lookup(p));
1070 libmesh_error_msg(
"Invalid shape function index i = " <<
1075 libmesh_error_msg(
"Invalid shape function derivative j = " <<
1084 Real clough_raw_shape_deriv(
const unsigned int basis_num,
1085 const unsigned int deriv_type,
1088 Real xi = p(0), eta = p(1);
1097 switch (subtriangle_lookup(p))
1100 return -6*xi + 6*xi*xi
1103 return 9 - 30*xi + 21*xi*xi
1104 - 30*eta + 42*xi*eta
1107 return -6*xi + 9*xi*xi
1111 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1112 subtriangle_lookup(p));
1115 switch (subtriangle_lookup(p))
1118 return 6*xi - 6*xi*xi
1121 return - 9./2. + 18*xi - 27./2.*xi*xi
1122 + 15*eta - 21*xi*eta
1125 return 6*xi - 15./2.*xi*xi
1129 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1130 subtriangle_lookup(p));
1133 switch (subtriangle_lookup(p))
1136 return 3./2.*eta*eta;
1138 return - 9./2. + 12*xi - 15./2.*xi*xi
1139 + 15*eta - 21*xi*eta
1146 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1147 subtriangle_lookup(p));
1150 switch (subtriangle_lookup(p))
1153 return 1 - 4*xi + 3*xi*xi
1156 return 5./2. - 9*xi + 13./2.*xi*xi
1160 return 1 - xi - 7./2.*xi*xi
1165 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1166 subtriangle_lookup(p));
1169 switch (subtriangle_lookup(p))
1172 return - 3*eta + 4*xi*eta
1179 return -3*xi + 7*xi*xi
1183 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1184 subtriangle_lookup(p));
1187 switch (subtriangle_lookup(p))
1190 return -2*xi + 3*xi*xi
1193 return 3./4. - 4*xi + 17./4.*xi*xi
1194 - 5./2.*eta + 7./2.*xi*eta
1197 return -2*xi + 13./4.*xi*xi
1201 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1202 subtriangle_lookup(p));
1205 switch (subtriangle_lookup(p))
1208 return -eta + 4*xi*eta
1211 return -13./4. + 9*xi - 23./4.*xi*xi
1212 + 19./2.*eta - 23./2.*xi*eta
1215 return -xi + 5./4.*xi*xi
1219 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1220 subtriangle_lookup(p));
1223 switch (subtriangle_lookup(p))
1226 return 9./4.*eta*eta;
1228 return - 11./4. + 7*xi - 17./4.*xi*xi
1229 + 19./2.*eta - 25./2.*xi*eta
1232 return xi - 13./4.*xi*xi
1233 - eta + 7./2.*xi*eta + 2*eta*eta;
1236 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1237 subtriangle_lookup(p));
1240 switch (subtriangle_lookup(p))
1243 return - 1./4.*eta*eta;
1245 return 3./4. - 2*xi + 5./4.*xi*xi
1246 - 5./2.*eta + 7./2.*xi*eta
1253 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1254 subtriangle_lookup(p));
1257 switch (subtriangle_lookup(p))
1260 return std::sqrt(
Real(2)) * eta*eta;
1262 return std::sqrt(
Real(2)) * (-3 + 8*xi - 5*xi*xi
1263 + 10*eta - 14*xi*eta
1266 return std::sqrt(
Real(2)) * (-xi*xi + 2*xi*eta);
1269 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1270 subtriangle_lookup(p));
1273 switch (subtriangle_lookup(p))
1278 return 2 - 4*xi + 2*xi*xi
1282 return -4*xi + 10*xi*xi
1287 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1288 subtriangle_lookup(p));
1291 switch (subtriangle_lookup(p))
1294 return 4*eta - 8*xi*eta
1297 return 4 - 12*xi + 8*xi*xi
1301 return 4*xi - 8*xi*xi
1305 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1306 subtriangle_lookup(p));
1310 libmesh_error_msg(
"Invalid shape function index i = " <<
1319 switch (subtriangle_lookup(p))
1322 return - 6*eta - 6*xi*eta + 9*eta*eta;
1324 return 9 - 30*xi + 21*xi*xi
1325 - 30*eta + 42*xi*eta + 21*eta*eta;
1328 - 6*eta + 6*eta*eta;
1331 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1332 subtriangle_lookup(p));
1335 switch (subtriangle_lookup(p))
1341 return - 9./2. + 15*xi - 21./2.*xi*xi
1342 + 12*eta - 21*xi*eta - 15./2.*eta*eta;
1344 return + 3./2.*xi*xi;
1347 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1348 subtriangle_lookup(p));
1351 switch (subtriangle_lookup(p))
1354 return 6*eta + 3*xi*eta - 15./2.*eta*eta;
1356 return - 9./2. + 15*xi - 21./2.*xi*xi
1357 + 18*eta - 21.*xi*eta - 27./2.*eta*eta;
1360 + 6*eta - 6*eta*eta;
1363 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1364 subtriangle_lookup(p));
1367 switch (subtriangle_lookup(p))
1370 return - 3*eta - xi*eta + 7*eta*eta;
1372 return - 4*xi + 4*xi*xi
1373 + eta + 3*xi*eta - eta*eta;
1375 return - 3*xi + 2*xi*xi
1379 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1380 subtriangle_lookup(p));
1383 switch (subtriangle_lookup(p))
1386 return 1 - 3*xi + 2*xi*xi
1387 - eta + 4*xi*eta - 7./2.*eta*eta;
1389 return 5./2. - 4*xi + 3./2.*xi*xi
1390 - 9.*eta + 8*xi*eta + 13./2.*eta*eta;
1392 return 1 - 1./2.*xi*xi - 4*eta + 3*eta*eta;
1395 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1396 subtriangle_lookup(p));
1399 switch (subtriangle_lookup(p))
1402 return - 1./2.*xi*eta + 1./4.*eta*eta;
1404 return 3./4. - 5./2.*xi + 7./4.*xi*xi
1405 - 2*eta + 7./2.*xi*eta + 5./4.*eta*eta;
1407 return - 1./4.*xi*xi;
1410 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1411 subtriangle_lookup(p));
1414 switch (subtriangle_lookup(p))
1417 return -xi + 2*xi*xi
1418 + eta + 7./2.*xi*eta - 13./4.*eta*eta;
1420 return - 11./4. + 19./2.*xi - 23./4.*xi*xi
1421 + 7*eta - 25./2.*xi*eta - 17./4.*eta*eta;
1426 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1427 subtriangle_lookup(p));
1430 switch (subtriangle_lookup(p))
1433 return -eta + 9./2.*xi*eta + 5./4.*eta*eta;
1435 return - 13./4. + 19./2.*xi - 25./4.*xi*xi
1436 + 9*eta - 23./2.*xi*eta - 23./4.*eta*eta;
1438 return - xi + 7./4.*xi*xi + 4*xi*eta;
1441 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1442 subtriangle_lookup(p));
1445 switch (subtriangle_lookup(p))
1448 return -2*eta - 1./2.*xi*eta + 13./4.*eta*eta;
1450 return 3./4. - 5./2.*xi + 7./4.*xi*xi
1451 - 4*eta + 7./2.*xi*eta + 17./4.*eta*eta;
1453 return - 1./4.*xi*xi
1454 - 2*eta + 3*eta*eta;
1457 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1458 subtriangle_lookup(p));
1461 switch (subtriangle_lookup(p))
1464 return std::sqrt(
Real(2)) * (2*xi*eta - eta*eta);
1466 return std::sqrt(
Real(2)) * (- 3 + 10*xi - 7*xi*xi
1467 + 8*eta - 14*xi*eta - 5*eta*eta);
1469 return std::sqrt(
Real(2)) * (xi*xi);
1472 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1473 subtriangle_lookup(p));
1476 switch (subtriangle_lookup(p))
1479 return 4*eta - 4*xi*eta - 8*eta*eta;
1481 return 4 - 8*xi + 4*xi*xi
1482 - 12*eta + 12*xi*eta + 8*eta*eta;
1484 return 4*xi - 4*xi*xi
1488 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1489 subtriangle_lookup(p));
1492 switch (subtriangle_lookup(p))
1495 return 4*xi - 4*xi*xi
1496 - 4*eta - 8*xi*eta + 10.*eta*eta;
1498 return 2 - 8*xi + 6*xi*xi
1499 - 4*eta + 8*xi*eta + 2*eta*eta;
1504 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1505 subtriangle_lookup(p));
1509 libmesh_error_msg(
"Invalid shape function index i = " <<
1514 libmesh_error_msg(
"Invalid shape function derivative j = " <<
1519 Real clough_raw_shape(
const unsigned int basis_num,
1522 Real xi = p(0), eta = p(1);
1527 switch (subtriangle_lookup(p))
1530 return 1 - 3*xi*xi + 2*xi*xi*xi
1531 - 3*eta*eta - 3*xi*eta*eta + 3*eta*eta*eta;
1533 return -1 + 9*xi - 15*xi*xi + 7*xi*xi*xi
1534 + 9*eta - 30*xi*eta +21*xi*xi*eta
1535 - 15*eta*eta + 21*xi*eta*eta + 7*eta*eta*eta;
1537 return 1 - 3*xi*xi + 3*xi*xi*xi
1539 - 3*eta*eta + 2*eta*eta*eta;
1542 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1543 subtriangle_lookup(p));
1546 switch (subtriangle_lookup(p))
1549 return 3*xi*xi - 2*xi*xi*xi
1551 - 1./2.*eta*eta*eta;
1553 return 1 - 9./2.*xi + 9*xi*xi - 9./2.*xi*xi*xi
1554 - 9./2.*eta + 15*xi*eta - 21./2.*xi*xi*eta
1555 + 6*eta*eta - 21./2.*xi*eta*eta - 5./2.*eta*eta*eta;
1557 return 3*xi*xi - 5./2.*xi*xi*xi
1561 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1562 subtriangle_lookup(p));
1565 switch (subtriangle_lookup(p))
1568 return 3*eta*eta + 3./2.*xi*eta*eta - 5./2.*eta*eta*eta;
1570 return 1 - 9./2.*xi + 6*xi*xi - 5./2.*xi*xi*xi
1571 - 9./2.*eta + 15*xi*eta - 21./2.*xi*xi*eta
1572 + 9*eta*eta - 21./2.*xi*eta*eta - 9./2.*eta*eta*eta;
1574 return -1./2.*xi*xi*xi
1576 + 3*eta*eta - 2*eta*eta*eta;
1579 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1580 subtriangle_lookup(p));
1583 switch (subtriangle_lookup(p))
1586 return xi - 2*xi*xi + xi*xi*xi
1587 - 3./2.*eta*eta - 1./2.*xi*eta*eta + 7./
Real(3)*eta*eta*eta;
1589 return -1./
Real(6) + 5./2.*xi - 9./2.*xi*xi + 13./
Real(6)*xi*xi*xi
1590 - 4*xi*eta + 4*xi*xi*eta
1591 + 1./2.*eta*eta + 3./2.*xi*eta*eta - 1./
Real(3)*eta*eta*eta;
1593 return xi - 1./2.*xi*xi - 7./
Real(6)*xi*xi*xi
1594 - 3*xi*eta + 2*xi*xi*eta
1598 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1599 subtriangle_lookup(p));
1602 switch (subtriangle_lookup(p))
1605 return eta - 3*xi*eta + 2*xi*xi*eta
1606 - 1./2.*eta*eta + 2*xi*eta*eta - 7./
Real(6)*eta*eta*eta;
1608 return -1./
Real(6) + 1./2.*xi*xi - 1./
Real(3)*xi*xi*xi
1609 + 5./2.*eta - 4*xi*eta + 3./2.*xi*xi*eta
1610 - 9./2.*eta*eta + 4*xi*eta*eta + 13./
Real(6)*eta*eta*eta;
1612 return -3./2.*xi*xi + 7./
Real(3)*xi*xi*xi
1613 + eta - 1./2.*xi*xi*eta - 2*eta*eta + eta*eta*eta;
1616 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1617 subtriangle_lookup(p));
1620 switch (subtriangle_lookup(p))
1623 return -xi*xi + xi*xi*xi
1624 - 1./4.*xi*eta*eta + 1./
Real(12)*eta*eta*eta;
1626 return -1./
Real(6) + 3./4.*xi - 2*xi*xi + 17./
Real(12)*xi*xi*xi
1627 + 3./4.*eta - 5./2.*xi*eta + 7./4.*xi*xi*eta
1628 - eta*eta + 7./4.*xi*eta*eta + 5./
Real(12)*eta*eta*eta;
1630 return -xi*xi + 13./
Real(12)*xi*xi*xi
1634 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1635 subtriangle_lookup(p));
1638 switch (subtriangle_lookup(p))
1641 return -xi*eta + 2*xi*xi*eta
1642 + 1./2.*eta*eta + 7./4.*xi*eta*eta - 13./
Real(12)*eta*eta*eta;
1644 return 2./
Real(3) - 13./4.*xi + 9./2.*xi*xi - 23./
Real(12)*xi*xi*xi
1645 - 11./4.*eta + 19./2.*xi*eta - 23./4.*xi*xi*eta
1646 + 7./2.*eta*eta - 25./4.*xi*eta*eta - 17./
Real(12)*eta*eta*eta;
1648 return -1./2.*xi*xi + 5./
Real(12)*xi*xi*xi
1652 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1653 subtriangle_lookup(p));
1656 switch (subtriangle_lookup(p))
1659 return -1./2.*eta*eta + 9./4.*xi*eta*eta + 5./
Real(12)*eta*eta*eta;
1661 return 2./
Real(3) - 11./4.*xi + 7./2.*xi*xi - 17./
Real(12)*xi*xi*xi
1662 - 13./4.*eta + 19./2.*xi*eta - 25./4.*xi*xi*eta
1663 + 9./2.*eta*eta - 23./4.*xi*eta*eta - 23./
Real(12)*eta*eta*eta;
1665 return 1./2.*xi*xi - 13./
Real(12)*xi*xi*xi
1666 - xi*eta + 7./4.*xi*xi*eta + 2*xi*eta*eta;
1669 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1670 subtriangle_lookup(p));
1673 switch (subtriangle_lookup(p))
1676 return -eta*eta - 1./4.*xi*eta*eta + 13./
Real(12)*eta*eta*eta;
1678 return -1./
Real(6) + 3./4.*xi - xi*xi + 5./
Real(12)*xi*xi*xi
1679 + 3./4.*eta - 5./2.*xi*eta + 7./4.*xi*xi*eta
1680 - 2*eta*eta + 7./4.*xi*eta*eta + 17./
Real(12)*eta*eta*eta;
1682 return 1./
Real(12)*xi*xi*xi
1684 - eta*eta + eta*eta*eta;
1687 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1688 subtriangle_lookup(p));
1691 switch (subtriangle_lookup(p))
1694 return std::sqrt(
Real(2)) * (xi*eta*eta - 1./
Real(3)*eta*eta*eta);
1696 return std::sqrt(
Real(2)) * (2./
Real(3) - 3*xi + 4*xi*xi - 5./
Real(3)*xi*xi*xi
1697 - 3*eta + 10*xi*eta - 7*xi*xi*eta
1698 + 4*eta*eta - 7*xi*eta*eta - 5./
Real(3)*eta*eta*eta);
1700 return std::sqrt(
Real(2)) * (-1./
Real(3)*xi*xi*xi + xi*xi*eta);
1703 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1704 subtriangle_lookup(p));
1707 switch (subtriangle_lookup(p))
1710 return 2*eta*eta - 2*xi*eta*eta - 8./
Real(3)*eta*eta*eta;
1712 return -2./
Real(3) + 2*xi - 2*xi*xi + 2./
Real(3)*xi*xi*xi
1713 + 4*eta - 8*xi*eta + 4*xi*xi*eta
1714 - 6*eta*eta + 6*xi*eta*eta + 8./
Real(3)*eta*eta*eta;
1716 return -2*xi*xi + 10./
Real(3)*xi*xi*xi
1717 + 4*xi*eta - 4*xi*xi*eta
1721 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1722 subtriangle_lookup(p));
1725 switch (subtriangle_lookup(p))
1728 return 4*xi*eta - 4*xi*xi*eta
1729 - 2*eta*eta - 4*xi*eta*eta + 10./
Real(3)*eta*eta*eta;
1731 return -2./
Real(3) + 4*xi - 6*xi*xi + 8./
Real(3)*xi*xi*xi
1732 + 2*eta - 8*xi*eta + 6*xi*xi*eta
1733 - 2*eta*eta + 4*xi*eta*eta + 2./
Real(3)*eta*eta*eta;
1735 return 2*xi*xi - 8./
Real(3)*xi*xi*xi
1739 libmesh_error_msg(
"Invalid subtriangle lookup = " <<
1740 subtriangle_lookup(p));
1744 libmesh_error_msg(
"Invalid shape function index i = " <<
1763 const unsigned int i,
1765 const bool add_p_level)
1770 clough_compute_coefs(elem, coefs);
1774 const Order totalorder =
1775 order + add_p_level*elem->
p_level();
1785 libmesh_experimental();
1792 libmesh_assert_less (i, 9);
1801 return clough_raw_shape(0, p)
1802 + coefs.d1d2n * clough_raw_shape(10, p)
1803 + coefs.d1d3n * clough_raw_shape(11, p);
1805 return clough_raw_shape(1, p)
1806 + coefs.d2d3n * clough_raw_shape(11, p)
1807 + coefs.d2d1n * clough_raw_shape(9, p);
1809 return clough_raw_shape(2, p)
1810 + coefs.d3d1n * clough_raw_shape(9, p)
1811 + coefs.d3d2n * clough_raw_shape(10, p);
1813 return coefs.d1xd1x * clough_raw_shape(3, p)
1814 + coefs.d1xd1y * clough_raw_shape(4, p)
1815 + coefs.d1xd2n * clough_raw_shape(10, p)
1816 + coefs.d1xd3n * clough_raw_shape(11, p)
1817 + 0.5 * coefs.N01x * coefs.d3nd3n * clough_raw_shape(11, p)
1818 + 0.5 * coefs.N02x * coefs.d2nd2n * clough_raw_shape(10, p);
1820 return coefs.d1yd1y * clough_raw_shape(4, p)
1821 + coefs.d1yd1x * clough_raw_shape(3, p)
1822 + coefs.d1yd2n * clough_raw_shape(10, p)
1823 + coefs.d1yd3n * clough_raw_shape(11, p)
1824 + 0.5 * coefs.N01y * coefs.d3nd3n * clough_raw_shape(11, p)
1825 + 0.5 * coefs.N02y * coefs.d2nd2n * clough_raw_shape(10, p);
1827 return coefs.d2xd2x * clough_raw_shape(5, p)
1828 + coefs.d2xd2y * clough_raw_shape(6, p)
1829 + coefs.d2xd3n * clough_raw_shape(11, p)
1830 + coefs.d2xd1n * clough_raw_shape(9, p)
1831 + 0.5 * coefs.N10x * coefs.d3nd3n * clough_raw_shape(11, p)
1832 + 0.5 * coefs.N12x * coefs.d1nd1n * clough_raw_shape(9, p);
1834 return coefs.d2yd2y * clough_raw_shape(6, p)
1835 + coefs.d2yd2x * clough_raw_shape(5, p)
1836 + coefs.d2yd3n * clough_raw_shape(11, p)
1837 + coefs.d2yd1n * clough_raw_shape(9, p)
1838 + 0.5 * coefs.N10y * coefs.d3nd3n * clough_raw_shape(11, p)
1839 + 0.5 * coefs.N12y * coefs.d1nd1n * clough_raw_shape(9, p);
1841 return coefs.d3xd3x * clough_raw_shape(7, p)
1842 + coefs.d3xd3y * clough_raw_shape(8, p)
1843 + coefs.d3xd1n * clough_raw_shape(9, p)
1844 + coefs.d3xd2n * clough_raw_shape(10, p)
1845 + 0.5 * coefs.N20x * coefs.d2nd2n * clough_raw_shape(10, p)
1846 + 0.5 * coefs.N21x * coefs.d1nd1n * clough_raw_shape(9, p);
1848 return coefs.d3yd3y * clough_raw_shape(8, p)
1849 + coefs.d3yd3x * clough_raw_shape(7, p)
1850 + coefs.d3yd1n * clough_raw_shape(9, p)
1851 + coefs.d3yd2n * clough_raw_shape(10, p)
1852 + 0.5 * coefs.N20y * coefs.d2nd2n * clough_raw_shape(10, p)
1853 + 0.5 * coefs.N21y * coefs.d1nd1n * clough_raw_shape(9, p);
1855 libmesh_error_msg(
"Invalid shape function index i = " << i);
1871 libmesh_assert_less (i, 12);
1881 return clough_raw_shape(0, p)
1882 + coefs.d1d2n * clough_raw_shape(10, p)
1883 + coefs.d1d3n * clough_raw_shape(11, p);
1885 return clough_raw_shape(1, p)
1886 + coefs.d2d3n * clough_raw_shape(11, p)
1887 + coefs.d2d1n * clough_raw_shape(9, p);
1889 return clough_raw_shape(2, p)
1890 + coefs.d3d1n * clough_raw_shape(9, p)
1891 + coefs.d3d2n * clough_raw_shape(10, p);
1893 return coefs.d1xd1x * clough_raw_shape(3, p)
1894 + coefs.d1xd1y * clough_raw_shape(4, p)
1895 + coefs.d1xd2n * clough_raw_shape(10, p)
1896 + coefs.d1xd3n * clough_raw_shape(11, p);
1898 return coefs.d1yd1y * clough_raw_shape(4, p)
1899 + coefs.d1yd1x * clough_raw_shape(3, p)
1900 + coefs.d1yd2n * clough_raw_shape(10, p)
1901 + coefs.d1yd3n * clough_raw_shape(11, p);
1903 return coefs.d2xd2x * clough_raw_shape(5, p)
1904 + coefs.d2xd2y * clough_raw_shape(6, p)
1905 + coefs.d2xd3n * clough_raw_shape(11, p)
1906 + coefs.d2xd1n * clough_raw_shape(9, p);
1908 return coefs.d2yd2y * clough_raw_shape(6, p)
1909 + coefs.d2yd2x * clough_raw_shape(5, p)
1910 + coefs.d2yd3n * clough_raw_shape(11, p)
1911 + coefs.d2yd1n * clough_raw_shape(9, p);
1913 return coefs.d3xd3x * clough_raw_shape(7, p)
1914 + coefs.d3xd3y * clough_raw_shape(8, p)
1915 + coefs.d3xd1n * clough_raw_shape(9, p)
1916 + coefs.d3xd2n * clough_raw_shape(10, p);
1918 return coefs.d3yd3y * clough_raw_shape(8, p)
1919 + coefs.d3yd3x * clough_raw_shape(7, p)
1920 + coefs.d3yd1n * clough_raw_shape(9, p)
1921 + coefs.d3yd2n * clough_raw_shape(10, p);
1923 return coefs.d1nd1n * clough_raw_shape(9, p);
1925 return coefs.d2nd2n * clough_raw_shape(10, p);
1927 return coefs.d3nd3n * clough_raw_shape(11, p);
1930 libmesh_error_msg(
"Invalid shape function index i = " << i);
1939 libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
1951 libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
1959 const unsigned int i,
1961 const bool add_p_level)
1972 const unsigned int i,
1973 const unsigned int j,
1975 const bool add_p_level)
1980 clough_compute_coefs(elem, coefs);
1984 const Order totalorder =
1985 order + add_p_level*elem->
p_level();
1995 libmesh_experimental();
2002 libmesh_assert_less (i, 9);
2011 return clough_raw_shape_deriv(0, j, p)
2012 + coefs.d1d2n * clough_raw_shape_deriv(10, j, p)
2013 + coefs.d1d3n * clough_raw_shape_deriv(11, j, p);
2015 return clough_raw_shape_deriv(1, j, p)
2016 + coefs.d2d3n * clough_raw_shape_deriv(11, j, p)
2017 + coefs.d2d1n * clough_raw_shape_deriv(9, j, p);
2019 return clough_raw_shape_deriv(2, j, p)
2020 + coefs.d3d1n * clough_raw_shape_deriv(9, j, p)
2021 + coefs.d3d2n * clough_raw_shape_deriv(10, j, p);
2023 return coefs.d1xd1x * clough_raw_shape_deriv(3, j, p)
2024 + coefs.d1xd1y * clough_raw_shape_deriv(4, j, p)
2025 + coefs.d1xd2n * clough_raw_shape_deriv(10, j, p)
2026 + coefs.d1xd3n * clough_raw_shape_deriv(11, j, p)
2027 + 0.5 * coefs.N01x * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
2028 + 0.5 * coefs.N02x * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p);
2030 return coefs.d1yd1y * clough_raw_shape_deriv(4, j, p)
2031 + coefs.d1yd1x * clough_raw_shape_deriv(3, j, p)
2032 + coefs.d1yd2n * clough_raw_shape_deriv(10, j, p)
2033 + coefs.d1yd3n * clough_raw_shape_deriv(11, j, p)
2034 + 0.5 * coefs.N01y * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
2035 + 0.5 * coefs.N02y * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p);
2037 return coefs.d2xd2x * clough_raw_shape_deriv(5, j, p)
2038 + coefs.d2xd2y * clough_raw_shape_deriv(6, j, p)
2039 + coefs.d2xd3n * clough_raw_shape_deriv(11, j, p)
2040 + coefs.d2xd1n * clough_raw_shape_deriv(9, j, p)
2041 + 0.5 * coefs.N10x * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
2042 + 0.5 * coefs.N12x * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
2044 return coefs.d2yd2y * clough_raw_shape_deriv(6, j, p)
2045 + coefs.d2yd2x * clough_raw_shape_deriv(5, j, p)
2046 + coefs.d2yd3n * clough_raw_shape_deriv(11, j, p)
2047 + coefs.d2yd1n * clough_raw_shape_deriv(9, j, p)
2048 + 0.5 * coefs.N10y * coefs.d3nd3n * clough_raw_shape_deriv(11, j, p)
2049 + 0.5 * coefs.N12y * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
2051 return coefs.d3xd3x * clough_raw_shape_deriv(7, j, p)
2052 + coefs.d3xd3y * clough_raw_shape_deriv(8, j, p)
2053 + coefs.d3xd1n * clough_raw_shape_deriv(9, j, p)
2054 + coefs.d3xd2n * clough_raw_shape_deriv(10, j, p)
2055 + 0.5 * coefs.N20x * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p)
2056 + 0.5 * coefs.N21x * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
2058 return coefs.d3yd3y * clough_raw_shape_deriv(8, j, p)
2059 + coefs.d3yd3x * clough_raw_shape_deriv(7, j, p)
2060 + coefs.d3yd1n * clough_raw_shape_deriv(9, j, p)
2061 + coefs.d3yd2n * clough_raw_shape_deriv(10, j, p)
2062 + 0.5 * coefs.N20y * coefs.d2nd2n * clough_raw_shape_deriv(10, j, p)
2063 + 0.5 * coefs.N21y * coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
2065 libmesh_error_msg(
"Invalid shape function index i = " << i);
2081 libmesh_assert_less (i, 12);
2091 return clough_raw_shape_deriv(0, j, p)
2092 + coefs.d1d2n * clough_raw_shape_deriv(10, j, p)
2093 + coefs.d1d3n * clough_raw_shape_deriv(11, j, p);
2095 return clough_raw_shape_deriv(1, j, p)
2096 + coefs.d2d3n * clough_raw_shape_deriv(11, j, p)
2097 + coefs.d2d1n * clough_raw_shape_deriv(9, j, p);
2099 return clough_raw_shape_deriv(2, j, p)
2100 + coefs.d3d1n * clough_raw_shape_deriv(9, j, p)
2101 + coefs.d3d2n * clough_raw_shape_deriv(10, j, p);
2103 return coefs.d1xd1x * clough_raw_shape_deriv(3, j, p)
2104 + coefs.d1xd1y * clough_raw_shape_deriv(4, j, p)
2105 + coefs.d1xd2n * clough_raw_shape_deriv(10, j, p)
2106 + coefs.d1xd3n * clough_raw_shape_deriv(11, j, p);
2108 return coefs.d1yd1y * clough_raw_shape_deriv(4, j, p)
2109 + coefs.d1yd1x * clough_raw_shape_deriv(3, j, p)
2110 + coefs.d1yd2n * clough_raw_shape_deriv(10, j, p)
2111 + coefs.d1yd3n * clough_raw_shape_deriv(11, j, p);
2113 return coefs.d2xd2x * clough_raw_shape_deriv(5, j, p)
2114 + coefs.d2xd2y * clough_raw_shape_deriv(6, j, p)
2115 + coefs.d2xd3n * clough_raw_shape_deriv(11, j, p)
2116 + coefs.d2xd1n * clough_raw_shape_deriv(9, j, p);
2118 return coefs.d2yd2y * clough_raw_shape_deriv(6, j, p)
2119 + coefs.d2yd2x * clough_raw_shape_deriv(5, j, p)
2120 + coefs.d2yd3n * clough_raw_shape_deriv(11, j, p)
2121 + coefs.d2yd1n * clough_raw_shape_deriv(9, j, p);
2123 return coefs.d3xd3x * clough_raw_shape_deriv(7, j, p)
2124 + coefs.d3xd3y * clough_raw_shape_deriv(8, j, p)
2125 + coefs.d3xd1n * clough_raw_shape_deriv(9, j, p)
2126 + coefs.d3xd2n * clough_raw_shape_deriv(10, j, p);
2128 return coefs.d3yd3y * clough_raw_shape_deriv(8, j, p)
2129 + coefs.d3yd3x * clough_raw_shape_deriv(7, j, p)
2130 + coefs.d3yd1n * clough_raw_shape_deriv(9, j, p)
2131 + coefs.d3yd2n * clough_raw_shape_deriv(10, j, p);
2133 return coefs.d1nd1n * clough_raw_shape_deriv(9, j, p);
2135 return coefs.d2nd2n * clough_raw_shape_deriv(10, j, p);
2137 return coefs.d3nd3n * clough_raw_shape_deriv(11, j, p);
2140 libmesh_error_msg(
"Invalid shape function index i = " << i);
2149 libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
2161 libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
2169 const unsigned int i,
2170 const unsigned int j,
2172 const bool add_p_level)
2179 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 2185 const unsigned int i,
2186 const unsigned int j,
2188 const bool add_p_level)
2193 clough_compute_coefs(elem, coefs);
2197 const Order totalorder =
2198 order + add_p_level*elem->
p_level();
2211 libmesh_assert_less (i, 9);
2220 return clough_raw_shape_second_deriv(0, j, p)
2221 + coefs.d1d2n * clough_raw_shape_second_deriv(10, j, p)
2222 + coefs.d1d3n * clough_raw_shape_second_deriv(11, j, p);
2224 return clough_raw_shape_second_deriv(1, j, p)
2225 + coefs.d2d3n * clough_raw_shape_second_deriv(11, j, p)
2226 + coefs.d2d1n * clough_raw_shape_second_deriv(9, j, p);
2228 return clough_raw_shape_second_deriv(2, j, p)
2229 + coefs.d3d1n * clough_raw_shape_second_deriv(9, j, p)
2230 + coefs.d3d2n * clough_raw_shape_second_deriv(10, j, p);
2232 return coefs.d1xd1x * clough_raw_shape_second_deriv(3, j, p)
2233 + coefs.d1xd1y * clough_raw_shape_second_deriv(4, j, p)
2234 + coefs.d1xd2n * clough_raw_shape_second_deriv(10, j, p)
2235 + coefs.d1xd3n * clough_raw_shape_second_deriv(11, j, p)
2236 + 0.5 * coefs.N01x * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2237 + 0.5 * coefs.N02x * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p);
2239 return coefs.d1yd1y * clough_raw_shape_second_deriv(4, j, p)
2240 + coefs.d1yd1x * clough_raw_shape_second_deriv(3, j, p)
2241 + coefs.d1yd2n * clough_raw_shape_second_deriv(10, j, p)
2242 + coefs.d1yd3n * clough_raw_shape_second_deriv(11, j, p)
2243 + 0.5 * coefs.N01y * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2244 + 0.5 * coefs.N02y * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p);
2246 return coefs.d2xd2x * clough_raw_shape_second_deriv(5, j, p)
2247 + coefs.d2xd2y * clough_raw_shape_second_deriv(6, j, p)
2248 + coefs.d2xd3n * clough_raw_shape_second_deriv(11, j, p)
2249 + coefs.d2xd1n * clough_raw_shape_second_deriv(9, j, p)
2250 + 0.5 * coefs.N10x * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2251 + 0.5 * coefs.N12x * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2253 return coefs.d2yd2y * clough_raw_shape_second_deriv(6, j, p)
2254 + coefs.d2yd2x * clough_raw_shape_second_deriv(5, j, p)
2255 + coefs.d2yd3n * clough_raw_shape_second_deriv(11, j, p)
2256 + coefs.d2yd1n * clough_raw_shape_second_deriv(9, j, p)
2257 + 0.5 * coefs.N10y * coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p)
2258 + 0.5 * coefs.N12y * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2260 return coefs.d3xd3x * clough_raw_shape_second_deriv(7, j, p)
2261 + coefs.d3xd3y * clough_raw_shape_second_deriv(8, j, p)
2262 + coefs.d3xd1n * clough_raw_shape_second_deriv(9, j, p)
2263 + coefs.d3xd2n * clough_raw_shape_second_deriv(10, j, p)
2264 + 0.5 * coefs.N20x * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p)
2265 + 0.5 * coefs.N21x * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2267 return coefs.d3yd3y * clough_raw_shape_second_deriv(8, j, p)
2268 + coefs.d3yd3x * clough_raw_shape_second_deriv(7, j, p)
2269 + coefs.d3yd1n * clough_raw_shape_second_deriv(9, j, p)
2270 + coefs.d3yd2n * clough_raw_shape_second_deriv(10, j, p)
2271 + 0.5 * coefs.N20y * coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p)
2272 + 0.5 * coefs.N21y * coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2274 libmesh_error_msg(
"Invalid shape function index i = " << i);
2290 libmesh_assert_less (i, 12);
2300 return clough_raw_shape_second_deriv(0, j, p)
2301 + coefs.d1d2n * clough_raw_shape_second_deriv(10, j, p)
2302 + coefs.d1d3n * clough_raw_shape_second_deriv(11, j, p);
2304 return clough_raw_shape_second_deriv(1, j, p)
2305 + coefs.d2d3n * clough_raw_shape_second_deriv(11, j, p)
2306 + coefs.d2d1n * clough_raw_shape_second_deriv(9, j, p);
2308 return clough_raw_shape_second_deriv(2, j, p)
2309 + coefs.d3d1n * clough_raw_shape_second_deriv(9, j, p)
2310 + coefs.d3d2n * clough_raw_shape_second_deriv(10, j, p);
2312 return coefs.d1xd1x * clough_raw_shape_second_deriv(3, j, p)
2313 + coefs.d1xd1y * clough_raw_shape_second_deriv(4, j, p)
2314 + coefs.d1xd2n * clough_raw_shape_second_deriv(10, j, p)
2315 + coefs.d1xd3n * clough_raw_shape_second_deriv(11, j, p);
2317 return coefs.d1yd1y * clough_raw_shape_second_deriv(4, j, p)
2318 + coefs.d1yd1x * clough_raw_shape_second_deriv(3, j, p)
2319 + coefs.d1yd2n * clough_raw_shape_second_deriv(10, j, p)
2320 + coefs.d1yd3n * clough_raw_shape_second_deriv(11, j, p);
2322 return coefs.d2xd2x * clough_raw_shape_second_deriv(5, j, p)
2323 + coefs.d2xd2y * clough_raw_shape_second_deriv(6, j, p)
2324 + coefs.d2xd3n * clough_raw_shape_second_deriv(11, j, p)
2325 + coefs.d2xd1n * clough_raw_shape_second_deriv(9, j, p);
2327 return coefs.d2yd2y * clough_raw_shape_second_deriv(6, j, p)
2328 + coefs.d2yd2x * clough_raw_shape_second_deriv(5, j, p)
2329 + coefs.d2yd3n * clough_raw_shape_second_deriv(11, j, p)
2330 + coefs.d2yd1n * clough_raw_shape_second_deriv(9, j, p);
2332 return coefs.d3xd3x * clough_raw_shape_second_deriv(7, j, p)
2333 + coefs.d3xd3y * clough_raw_shape_second_deriv(8, j, p)
2334 + coefs.d3xd1n * clough_raw_shape_second_deriv(9, j, p)
2335 + coefs.d3xd2n * clough_raw_shape_second_deriv(10, j, p);
2337 return coefs.d3yd3y * clough_raw_shape_second_deriv(8, j, p)
2338 + coefs.d3yd3x * clough_raw_shape_second_deriv(7, j, p)
2339 + coefs.d3yd1n * clough_raw_shape_second_deriv(9, j, p)
2340 + coefs.d3yd2n * clough_raw_shape_second_deriv(10, j, p);
2342 return coefs.d1nd1n * clough_raw_shape_second_deriv(9, j, p);
2344 return coefs.d2nd2n * clough_raw_shape_second_deriv(10, j, p);
2346 return coefs.d3nd3n * clough_raw_shape_second_deriv(11, j, p);
2349 libmesh_error_msg(
"Invalid shape function index i = " << i);
2358 libmesh_error_msg(
"ERROR: Unsupported polynomial order = " << order);
2370 libmesh_error_msg(
"Clough-Tocher elements require the real element \nto construct gradient-based degrees of freedom.");
2377 const unsigned int i,
2378 const unsigned int j,
2380 const bool add_p_level)
Real(* shape_deriv_ptr)(const FEType fet, const Elem *elem, const unsigned int i, const unsigned int j, const Point &p, const bool add_p_level)
Typedef for pointer to a function that returns FE shape function derivative values.
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
ElemType
Defines an enum for geometric element types.
Order
defines an enum for polynomial orders.
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
This is the base class from which all geometric element types are derived.
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
unsigned int p_level() const
OrderWrapper order
The approximation order of the element.
The libMesh namespace provides an interface to certain functionality in the library.
LIBMESH_DEFAULT_VECTORIZED_FE(template<>Real FE< 0, BERNSTEIN)
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static shape_deriv_ptr shape_deriv_function(const unsigned int dim, const FEType &fe_t, const ElemType t)
std::string enum_to_string(const T e)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
FEFamily
defines an enum for finite element families.
virtual Order default_order() const =0
virtual ElemType type() const =0
A Point defines a location in LIBMESH_DIM dimensional Real space.
const Point & point(const unsigned int i) const
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
static FEFamily map_fe_type(const Elem &elem)