20#include "libmesh/fe.h"
21#include "libmesh/elem.h"
22#include "libmesh/fe_interface.h"
23#include "libmesh/enum_to_string.h"
37Real d1d2n, d1d3n, d2d3n, d2d1n, d3d1n, d3d2n;
38Real d1xd1x, d1xd1y, d1xd2n, d1xd3n;
39Real d1yd1x, d1yd1y, d1yd2n, d1yd3n;
40Real d2xd2x, d2xd2y, d2xd3n, d2xd1n;
41Real d2yd2x, d2yd2y, d2yd3n, d2yd1n;
42Real d3xd3x, d3xd3y, d3xd1n, d3xd2n;
43Real d3yd3x, d3yd3y, d3yd1n, d3yd2n;
44Real d1nd1n, d2nd2n, d3nd3n;
47Real N01x, N01y, N10x, N10y;
48Real N02x, N02y, N20x, N20y;
49Real N21x, N21y, N12x, N12y;
52#ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
54Real clough_raw_shape_second_deriv(
const unsigned int basis_num,
55 const unsigned int deriv_type,
59Real clough_raw_shape_deriv(
const unsigned int basis_num,
60 const unsigned int deriv_type,
62Real clough_raw_shape(
const unsigned int basis_num,
64unsigned char subtriangle_lookup(
const Point & p);
68void 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;
517unsigned 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
530Real 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 = " <<
1084Real 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 = " <<
1519Real 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)
This is the base class from which all geometric element types are derived.
const Point & point(const unsigned int i) const
virtual Order default_order() const =0
virtual ElemType type() const =0
unsigned int p_level() const
static shape_deriv_ptr shape_deriv_function(const unsigned int dim, const FEType &fe_t, const ElemType t)
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.
static unsigned int n_shape_functions(const unsigned int dim, const FEType &fe_t, const ElemType t)
static FEFamily map_fe_type(const Elem &elem)
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
OrderWrapper order
The approximation order of the element (at 0 p-refinement level).
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
static OutputShape shape_second_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
static OutputShape shape_deriv(const ElemType t, const Order o, const unsigned int i, const unsigned int j, const Point &p)
A Point defines a location in LIBMESH_DIM dimensional Real space.
std::string enum_to_string(const T e)
The libMesh namespace provides an interface to certain functionality in the library.
LIBMESH_DEFAULT_VECTORIZED_FE(template<>Real FE< 0, BERNSTEIN)
ElemType
Defines an enum for geometric element types.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real