18#ifndef __B2ELEMENT_CONTINUUM_SHAPE_H__
19#define __B2ELEMENT_CONTINUUM_SHAPE_H__
21#include "elements/properties/b2solid_mechanics.H"
22#include "elements/smr/b2element_continuum_integrate.H"
23#include "elements/smr/b2element_continuum_util.H"
24#include "utils/b2linear_algebra.H"
32class P_Shape_Evaluator {
34 static const int num_nodes = 1;
35 static const int num_dimensions = 0;
36 static const int order = 0;
37 static const int num_edge = 0;
38 static const int num_face = 0;
39 typedef IS_P ischeme_type;
41 static ischeme_type create_ischeme() {
46 static ischeme_type create_ischeme(SolidMechanics& property) {
51 static const char name[2];
53 static void eval_h(
const double internal_coor[1],
double h[1]) { h[0] = 1.; }
55 static void eval_h_derived(
const double internal_coor[1],
double d[1][1]) { d[0][0] = 0; }
58 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
59 eval_h(internal_coor, &h[0]);
62 static void eval_h_derived(
63 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
65 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
73class L2_Shape_Evaluator {
75 static const int num_nodes = 2;
76 static const int num_dimensions = 1;
77 static const int order = 1;
78 typedef IS_L ischeme_type;
80 static ischeme_type create_ischeme() {
82 ischeme.set_order(order);
86 static ischeme_type create_ischeme(SolidMechanics& property) {
88 ischeme.set_order(2 * order);
89 ischeme.init(property);
93 static const double r_node[2];
95 static const char name[3];
97 typedef L2_Shape_Evaluator edge_shape_type_0;
98 typedef L2_Shape_Evaluator edge_shape_type_1;
99 static const int num_edge = 1;
100 static const int edge_node[1][2];
101 static const int num_face = 0;
103 static void eval_h(
const double internal_coor[1],
double h[2]) {
104 const double r2 = 0.5 * internal_coor[0];
110 static void eval_h_derived(
const double internal_coor[1],
double d[2][1]) {
117 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
118 eval_h(internal_coor, &h[0]);
121 static void eval_h_derived(
122 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
123 d.resize(1, num_nodes);
124 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
128class L3_Shape_Evaluator {
130 static const int num_nodes = 3;
131 static const int num_dimensions = 1;
132 static const int order = 2;
133 typedef IS_L ischeme_type;
135 static ischeme_type create_ischeme() {
136 ischeme_type ischeme;
137 ischeme.set_order(order);
141 static ischeme_type create_ischeme(SolidMechanics& property) {
142 ischeme_type ischeme;
143 ischeme.set_order(2 * order);
144 ischeme.init(property);
148 static const double r_node[3];
150 static const char name[3];
152 typedef L3_Shape_Evaluator edge_shape_type_0;
153 typedef L3_Shape_Evaluator edge_shape_type_1;
154 static const int num_edge = 1;
155 static const int edge_node[1][3];
156 static const int num_face = 0;
158 static void eval_h(
const double internal_coor[1],
double h[3]) {
159 const double r = internal_coor[0];
161 h[0] = 0.5 * r * (r - 1);
162 h[1] = 0.5 * r * (r + 1);
166 static void eval_h_derived(
const double internal_coor[1],
double d[3][1]) {
167 const double r = internal_coor[0];
176 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
177 eval_h(internal_coor, &h[0]);
180 static void eval_h_derived(
181 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
182 d.resize(1, num_nodes);
183 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
187class L4_Shape_Evaluator {
189 static const int num_nodes = 4;
190 static const int num_dimensions = 1;
191 static const int order = 3;
192 typedef IS_L ischeme_type;
194 static ischeme_type create_ischeme() {
195 ischeme_type ischeme;
196 ischeme.set_order(order);
200 static ischeme_type create_ischeme(SolidMechanics& property) {
201 ischeme_type ischeme;
202 ischeme.set_order(2 * order);
203 ischeme.init(property);
207 static const double r_node[4];
209 static const char name[3];
211 typedef L4_Shape_Evaluator edge_shape_type_0;
212 typedef L4_Shape_Evaluator edge_shape_type_1;
213 static const int num_edge = 1;
214 static const int edge_node[1][4];
215 static const int num_face = 0;
217 static void eval_h(
const double internal_coor[1],
double h[4]) {
218 const double r = internal_coor[0];
220 h[0] = -(1 - r) * (1 - 9 * r * r) / 16;
221 h[1] = -(1 + r) * (1 - 9 * r * r) / 16;
222 h[2] = +9 * (1 - r * r) * (1 - 3 * r) / 16;
223 h[3] = +9 * (1 - r * r) * (1 + 3 * r) / 16;
226 static void eval_h_derived(
const double internal_coor[1],
double d[4][1]) {
227 const double r = internal_coor[0];
230 d[0][0] = (+1 + 18 * r - 27 * r * r) / 16;
231 d[1][0] = (-1 + 18 * r + 27 * r * r) / 16;
232 d[2][0] = (-27 - 18 * r + 81 * r * r) / 16;
233 d[3][0] = (+27 - 18 * r - 81 * r * r) / 16;
237 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
238 eval_h(internal_coor, &h[0]);
241 static void eval_h_derived(
242 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
243 d.resize(1, num_nodes);
244 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
248class L5_Shape_Evaluator {
250 static const int num_nodes = 5;
251 static const int num_dimensions = 1;
252 static const int order = 4;
253 typedef IS_L ischeme_type;
255 static ischeme_type create_ischeme() {
256 ischeme_type ischeme;
257 ischeme.set_order(order);
261 static ischeme_type create_ischeme(SolidMechanics& property) {
262 ischeme_type ischeme;
263 ischeme.set_order(2 * order);
264 ischeme.init(property);
268 static const double r_node[5];
270 static const char name[3];
272 typedef L5_Shape_Evaluator edge_shape_type_0;
273 typedef L5_Shape_Evaluator edge_shape_type_1;
274 static const int num_edge = 1;
275 static const int edge_node[1][5];
276 static const int num_face = 0;
278 static void eval_h(
const double internal_coor[1],
double h[5]) {
279 const double r = internal_coor[0];
281 const double rm = r - 1;
282 const double rp = r + 1;
283 const double r2m = (2 * r - 1);
284 const double r2p = (2 * r + 1);
286 h[0] = +(rm * r * r2m * r2p) / 6;
287 h[1] = +(r * rp * r2m * r2p) / 6;
288 h[2] = -(4 * rm * r * rp * r2m) / 3;
289 h[3] = +rm * rp * r2m * r2p;
290 h[4] = -(4 * rm * r * rp * r2p) / 3;
293 static void eval_h_derived(
const double internal_coor[1],
double d[5][1]) {
294 const double r = internal_coor[0];
295 const double r4m = 4 * r - 1;
296 const double r4p = 4 * r + 1;
298 d[0][0] = +(r4m * (4 * r * r - 2 * r - 1)) / 6;
299 d[1][0] = +(r4p * (4 * r * r + 2 * r - 1)) / 6;
300 d[2][0] = -(4 * (8 * r * r * r - 3 * r * r - 4 * r + 1)) / 3;
301 d[3][0] = +2 * r * (8 * r * r - 5);
302 d[4][0] = -(4 * (8 * r * r * r + 3 * r * r - 4 * r - 1)) / 3;
306 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
307 eval_h(internal_coor, &h[0]);
310 static void eval_h_derived(
311 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
312 d.resize(1, num_nodes);
313 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
317class L6_Shape_Evaluator {
319 static const int num_nodes = 6;
320 static const int num_dimensions = 1;
321 static const int order = 5;
322 typedef IS_L ischeme_type;
324 static ischeme_type create_ischeme() {
325 ischeme_type ischeme;
326 ischeme.set_order(order);
330 static ischeme_type create_ischeme(SolidMechanics& property) {
331 ischeme_type ischeme;
332 ischeme.set_order(2 * order);
333 ischeme.init(property);
337 static const double r_node[6];
339 static const char name[3];
341 typedef L6_Shape_Evaluator edge_shape_type_0;
342 typedef L6_Shape_Evaluator edge_shape_type_1;
343 static const int num_edge = 1;
344 static const int edge_node[1][6];
345 static const int num_face = 0;
347 static void eval_h(
const double internal_coor[1],
double h[6]) {
348 const double r = internal_coor[0];
350 const double rm = r - 1;
351 const double rp = r + 1;
352 const double r5m = 5 * r - 1;
353 const double r5p = 5 * r + 1;
354 h[0] = -(rm * (5 * r - 3) * r5m * r5p * (5 * r + 3)) / 768;
355 h[1] = +(rp * (5 * r - 3) * r5m * r5p * (5 * r + 3)) / 768;
356 h[2] = +(25 * rm * rp * (5 * r - 3) * r5m * r5p) / 768;
357 h[3] = -(25 * rm * rp * (5 * r - 3) * r5m * (5 * r + 3)) / 384;
358 h[4] = +(25 * rm * rp * (5 * r - 3) * r5p * (5 * r + 3)) / 384;
359 h[5] = -(25 * rm * rp * r5m * r5p * (5 * r + 3)) / 768;
362 static void eval_h_derived(
const double internal_coor[1],
double d[6][1]) {
363 const double r = internal_coor[0];
364 d[0][0] = -(3125 * r * r * r * r - 2500 * r * r * r - 750 * r * r + 500 * r + 9) / 768;
365 d[1][0] = +(3125 * r * r * r * r + 2500 * r * r * r - 750 * r * r - 500 * r + 9) / 768;
366 d[2][0] = +(25 * (625 * r * r * r * r - 300 * r * r * r - 390 * r * r + 156 * r + 5)) / 768;
367 d[3][0] = -(25 * (625 * r * r * r * r - 100 * r * r * r - 510 * r * r + 68 * r + 45)) / 384;
368 d[4][0] = +(25 * (625 * r * r * r * r + 100 * r * r * r - 510 * r * r - 68 * r + 45)) / 384;
369 d[5][0] = -(25 * (625 * r * r * r * r + 300 * r * r * r - 390 * r * r - 156 * r + 5)) / 768;
373 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
374 eval_h(internal_coor, &h[0]);
377 static void eval_h_derived(
378 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
379 d.resize(1, num_nodes);
380 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
384class L7_Shape_Evaluator {
386 static const int num_nodes = 7;
387 static const int num_dimensions = 1;
388 static const int order = 6;
389 typedef IS_L ischeme_type;
391 static ischeme_type create_ischeme() {
392 ischeme_type ischeme;
393 ischeme.set_order(order);
397 static ischeme_type create_ischeme(SolidMechanics& property) {
398 ischeme_type ischeme;
399 ischeme.set_order(2 * order);
400 ischeme.init(property);
404 static const double r_node[7];
406 static const char name[3];
408 typedef L7_Shape_Evaluator edge_shape_type_0;
409 typedef L7_Shape_Evaluator edge_shape_type_1;
410 static const int num_edge = 1;
411 static const int edge_node[1][7];
412 static const int num_face = 0;
414 static void eval_h(
const double internal_coor[1],
double h[7]) {
415 const double r = internal_coor[0];
417 const double rm = r - 1;
418 const double rp = r + 1;
419 const double r3m = 3 * r - 1;
420 const double r3p = 3 * r + 1;
422 h[0] = +(rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2)) / 80;
423 h[1] = +(r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)) / 80;
424 h[2] = -(9 * rm * r * rp * (3 * r - 2) * r3m * r3p) / 40;
425 h[3] = +(9 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2)) / 16;
426 h[4] = -(rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)) / 4;
427 h[5] = +(9 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2)) / 16;
428 h[6] = -(9 * rm * r * rp * r3m * r3p * (3 * r + 2)) / 40;
431 static void eval_h_derived(
const double internal_coor[1],
double d[7][1]) {
432 const double r = internal_coor[0];
434 +((6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)) / 80;
436 +((6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)) / 80;
438 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
442 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
445 d[4][0] = -(r * (9 * r * r - 7) * (27 * r * r - 7)) / 2;
447 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
451 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
457 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
458 eval_h(internal_coor, &h[0]);
461 static void eval_h_derived(
462 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
463 d.resize(1, num_nodes);
464 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
468class B4_Shape_Evaluator {
470 static const int num_nodes = 4;
471 static const int num_dimensions = 1;
472 static const int order = 3;
473 typedef IS_L ischeme_type;
475 static ischeme_type create_ischeme() {
476 ischeme_type ischeme;
477 ischeme.set_order(order);
481 static ischeme_type create_ischeme(SolidMechanics& property) {
482 ischeme_type ischeme;
483 ischeme.set_order(2 * order);
484 ischeme.init(property);
488 static const double r_node[4];
490 static const char name[3];
492 typedef B4_Shape_Evaluator edge_shape_type_0;
493 typedef B4_Shape_Evaluator edge_shape_type_1;
494 static const int num_edge = 1;
495 static const int edge_node[1][4];
496 static const int num_face = 0;
498 static void eval_h(
const double internal_coor[1],
double h[4]) {
499 const double r = internal_coor[0];
501 const double rm = 1 - r;
502 const double rp = 1 + r;
503 h[0] = 0.125 * rm * rm * rm;
504 h[2] = 0.375 * rm * rm * rp;
505 h[3] = 0.375 * rm * rp * rp;
506 h[1] = 0.125 * rp * rp * rp;
509 static void eval_h_derived(
const double internal_coor[1],
double d[4][1]) {
510 const double r = internal_coor[0];
513 const double rm = 1 - r;
514 const double rp = 1 + r;
515 d[0][0] = -0.375 * rm * rm;
516 d[2][0] = -0.375 * rm * (1 + 3 * r);
517 d[3][0] = +0.375 * rp * (1 - 3 * r);
518 d[1][0] = +0.375 * rp * rp;
522 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
523 eval_h(internal_coor, &h[0]);
526 static void eval_h_derived(
527 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
528 d.resize(1, num_nodes);
529 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
533class P4_Shape_Evaluator {
535 static const int num_nodes = 4;
536 static const int num_dimensions = 1;
537 static const int order = 3;
538 typedef IS_L ischeme_type;
540 static ischeme_type create_ischeme() {
541 ischeme_type ischeme;
542 ischeme.set_order(order);
546 static ischeme_type create_ischeme(SolidMechanics& property) {
547 ischeme_type ischeme;
548 ischeme.set_order(2 * order);
549 ischeme.init(property);
553 static const double r_node[4];
555 static const char name[3];
557 typedef P4_Shape_Evaluator edge_shape_type_0;
558 typedef P4_Shape_Evaluator edge_shape_type_1;
559 static const int num_edge = 1;
560 static const int edge_node[1][4];
561 static const int num_face = 0;
563 static constexpr double f2 = 0.6123724356957945;
564 static constexpr double f3 = 0.790569415042095;
566 static void eval_h(
const double internal_coor[1],
double h[4]) {
567 const double r = internal_coor[0];
571 h[2] = f2 * (r * r - 1);
572 h[3] = f3 * r * (r * r - 1);
575 static void eval_h_derived(
const double internal_coor[1],
double d[4][1]) {
576 const double r = internal_coor[0];
581 d[2][0] = f2 * 2 * r;
582 d[3][0] = f3 * (3 * r * r - 1);
586 const double internal_coor[1], b2linalg::Vector<double, b2linalg::Vdense>& h) {
587 eval_h(internal_coor, &h[0]);
590 static void eval_h_derived(
591 const double internal_coor[1], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
592 d.resize(1, num_nodes);
593 eval_h_derived(internal_coor, (
double(*)[1]) & d[0][0]);
601class T3_Shape_Evaluator {
603 static const int num_nodes = 3;
604 static const int num_dimensions = 2;
605 static const int order = 1;
606 typedef IS_T ischeme_type;
608 static ischeme_type create_ischeme() {
609 ischeme_type ischeme;
610 ischeme.set_order(order);
614 static ischeme_type create_ischeme(SolidMechanics& property) {
615 ischeme_type ischeme;
616 ischeme.set_order(2 * order);
617 ischeme.init(property);
621 static const double r_node[3];
622 static const double s_node[3];
623 static const double t_node[3];
625 static const char name[3];
627 typedef L2_Shape_Evaluator edge_shape_type_0;
628 typedef L2_Shape_Evaluator edge_shape_type_1;
629 static const int num_edge = 3;
630 static const int edge_node[3][2];
631 static const int edge_type_index[3];
633 typedef T3_Shape_Evaluator face_shape_type_0;
634 typedef T3_Shape_Evaluator face_shape_type_1;
635 static const int num_face = 2;
636 static const int face_node[2][3];
637 static const int face_type_index[2];
638 static const bool is_t_face[2];
640 static void eval_h(
const double internal_coor[2],
double h[3]) {
641 const double r = internal_coor[0];
642 const double s = internal_coor[1];
649 static void eval_h_derived(
const double internal_coor[2],
double d[3][2]) {
662 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
663 eval_h(internal_coor, &h[0]);
666 static void eval_h_derived(
667 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
668 d.resize(2, num_nodes);
669 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
673class T6_Shape_Evaluator {
675 static const int num_nodes = 6;
676 static const int num_dimensions = 2;
677 static const int order = 2;
678 typedef IS_T ischeme_type;
680 static ischeme_type create_ischeme() {
681 ischeme_type ischeme;
682 ischeme.set_order(order);
686 static ischeme_type create_ischeme(SolidMechanics& property) {
687 ischeme_type ischeme;
688 ischeme.set_order(2 * order);
689 ischeme.init(property);
693 static const double r_node[6];
694 static const double s_node[6];
695 static const double t_node[6];
697 static const char name[3];
699 typedef L3_Shape_Evaluator edge_shape_type_0;
700 typedef L3_Shape_Evaluator edge_shape_type_1;
701 static const int num_edge = 3;
702 static const int edge_node[3][3];
703 static const int edge_type_index[3];
705 typedef T6_Shape_Evaluator face_shape_type_0;
706 typedef T6_Shape_Evaluator face_shape_type_1;
707 static const int num_face = 2;
708 static const int face_node[2][6];
709 static const int face_type_index[2];
710 static const bool is_t_face[2];
712 static void eval_h(
const double internal_coor[2],
double h[6]) {
713 const double r = internal_coor[0];
714 const double s = internal_coor[1];
715 const double t = 1. - r - s;
717 h[0] = t * (2 * t - 1);
718 h[1] = r * (2 * r - 1);
719 h[2] = s * (2 * s - 1);
725 static void eval_h_derived(
const double internal_coor[2],
double d[6][2]) {
726 const double r = internal_coor[0];
727 const double s = internal_coor[1];
730 d[0][0] = +4 * r + 4 * s - 3;
731 d[1][0] = +4 * r - 1;
733 d[3][0] = -4 * (s + 2 * r - 1);
738 d[0][1] = +4 * r + 4 * s - 3;
740 d[2][1] = +4 * s - 1;
743 d[5][1] = -4 * (2 * s + r - 1);
747 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
748 eval_h(internal_coor, &h[0]);
751 static void eval_h_derived(
752 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
753 d.resize(2, num_nodes);
754 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
758class T10_Shape_Evaluator {
760 static const int num_nodes = 10;
761 static const int num_dimensions = 2;
762 static const int order = 3;
763 typedef IS_T ischeme_type;
765 static ischeme_type create_ischeme() {
766 ischeme_type ischeme;
767 ischeme.set_order(order);
771 static ischeme_type create_ischeme(SolidMechanics& property) {
772 ischeme_type ischeme;
773 ischeme.set_order(2 * order);
774 ischeme.init(property);
778 static const double r_node[10];
779 static const double s_node[10];
780 static const double t_node[10];
782 static const char name[4];
784 typedef L4_Shape_Evaluator edge_shape_type_0;
785 typedef L4_Shape_Evaluator edge_shape_type_1;
786 static const int num_edge = 3;
787 static const int edge_node[3][4];
788 static const int edge_type_index[3];
790 typedef T10_Shape_Evaluator face_shape_type_0;
791 typedef T10_Shape_Evaluator face_shape_type_1;
792 static const int num_face = 2;
793 static const int face_node[2][10];
794 static const int face_type_index[2];
795 static const bool is_t_face[2];
797 static void eval_h(
const double internal_coor[2],
double h[10]) {
798 const double r = internal_coor[0];
799 const double s = internal_coor[1];
801 const double r3m = 3 * r - 1;
802 const double s3m = 3 * s - 1;
804 h[0] = -((s + r - 1) * (3 * s + 3 * r - 2) * (3 * s + 3 * r - 1)) / 2;
805 h[1] = +(r * (3 * r - 2) * r3m) / 2;
806 h[2] = +(s * (3 * s - 2) * s3m) / 2;
807 h[3] = +(9 * r * (s + r - 1) * (3 * s + 3 * r - 2)) / 2;
808 h[4] = -(9 * r * r3m * (s + r - 1)) / 2;
809 h[5] = +(9 * s * (s + r - 1) * (3 * s + 3 * r - 2)) / 2;
810 h[6] = -27 * r * s * (s + r - 1);
811 h[7] = +(9 * r * r3m * s) / 2;
812 h[8] = -(9 * s * (s + r - 1) * s3m) / 2;
813 h[9] = +(9 * r * s * s3m) / 2;
816 static void eval_h_derived(
const double internal_coor[2],
double d[10][2]) {
817 const double r = internal_coor[0];
818 const double s = internal_coor[1];
820 const double r3m = 3 * r - 1;
821 const double s3m = 3 * s - 1;
823 d[0][0] = -(27 * s * s + 54 * r * s - 36 * s + 27 * r * r - 36 * r + 11) / 2;
824 d[1][0] = +(27 * r * r - 18 * r + 2) / 2;
826 d[3][0] = +(9 * (3 * s * s + 12 * r * s - 5 * s + 9 * r * r - 10 * r + 2)) / 2;
827 d[4][0] = -(9 * (6 * r * s - s + 9 * r * r - 8 * r + 1)) / 2;
828 d[5][0] = +(9 * s * (6 * s + 6 * r - 5)) / 2;
829 d[6][0] = -27 * s * (s + 2 * r - 1);
830 d[7][0] = +(9 * (6 * r - 1) * s) / 2;
831 d[8][0] = -(9 * s * s3m) / 2;
832 d[9][0] = +(9 * s * s3m) / 2;
833 d[0][1] = -(27 * s * s + 54 * r * s - 36 * s + 27 * r * r - 36 * r + 11) / 2;
835 d[2][1] = +(27 * s * s - 18 * s + 2) / 2;
836 d[3][1] = +(9 * r * (6 * s + 6 * r - 5)) / 2;
837 d[4][1] = -(9 * r * r3m) / 2;
838 d[5][1] = +(9 * (9 * s * s + 12 * r * s - 10 * s + 3 * r * r - 5 * r + 2)) / 2;
839 d[6][1] = -27 * r * (2 * s + r - 1);
840 d[7][1] = +(9 * r * r3m) / 2;
841 d[8][1] = -(9 * (9 * s * s + 6 * r * s - 8 * s - r + 1)) / 2;
842 d[9][1] = +(9 * r * (6 * s - 1)) / 2;
846 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
847 eval_h(internal_coor, &h[0]);
850 static void eval_h_derived(
851 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
852 d.resize(2, num_nodes);
853 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
857class T15_Shape_Evaluator {
859 static const int num_nodes = 15;
860 static const int num_dimensions = 2;
861 static const int order = 4;
862 typedef IS_T ischeme_type;
864 static ischeme_type create_ischeme() {
865 ischeme_type ischeme;
866 ischeme.set_order(order);
870 static ischeme_type create_ischeme(SolidMechanics& property) {
871 ischeme_type ischeme;
872 ischeme.set_order(2 * order);
873 ischeme.init(property);
877 static const double r_node[15];
878 static const double s_node[15];
879 static const double t_node[15];
881 static const char name[4];
883 typedef L5_Shape_Evaluator edge_shape_type_0;
884 typedef L5_Shape_Evaluator edge_shape_type_1;
885 static const int num_edge = 3;
886 static const int edge_node[3][5];
887 static const int edge_type_index[3];
889 typedef T15_Shape_Evaluator face_shape_type_0;
890 typedef T15_Shape_Evaluator face_shape_type_1;
891 static const int num_face = 2;
892 static const int face_node[2][15];
893 static const int face_type_index[2];
894 static const bool is_t_face[2];
896 static void eval_h(
const double internal_coor[2],
double h[15]) {
897 const double r = internal_coor[0];
898 const double s = internal_coor[1];
900 const double r2m = (2 * r - 1);
901 const double r4m = (4 * r - 1);
902 const double s2m = (2 * s - 1);
903 const double s4m = (4 * s - 1);
905 h[0] = +((s + r - 1) * (2 * s + 2 * r - 1) * (4 * s + 4 * r - 3) * (4 * s + 4 * r - 1)) / 3;
906 h[1] = +(r * r2m * (4 * r - 3) * r4m) / 3;
907 h[2] = +(s * s2m * (4 * s - 3) * s4m) / 3;
908 h[3] = -(16 * r * (s + r - 1) * (2 * s + 2 * r - 1) * (4 * s + 4 * r - 3)) / 3;
909 h[4] = +4 * r * r4m * (s + r - 1) * (4 * s + 4 * r - 3);
910 h[5] = -(16 * r * r2m * r4m * (s + r - 1)) / 3;
911 h[6] = -(16 * s * (s + r - 1) * (2 * s + 2 * r - 1) * (4 * s + 4 * r - 3)) / 3;
912 h[7] = +32 * r * s * (s + r - 1) * (4 * s + 4 * r - 3);
913 h[8] = -32 * r * r4m * s * (s + r - 1);
914 h[9] = +(16 * r * r2m * r4m * s) / 3;
915 h[10] = +4 * s * (s + r - 1) * s4m * (4 * s + 4 * r - 3);
916 h[11] = -32 * r * s * (s + r - 1) * s4m;
917 h[12] = +4 * r * r4m * s * s4m;
918 h[13] = -(16 * s * (s + r - 1) * s2m * s4m) / 3;
919 h[14] = +(16 * r * s * s2m * s4m) / 3;
922 static void eval_h_derived(
const double internal_coor[2],
double d[15][2]) {
923 const double r = internal_coor[0];
924 const double s = internal_coor[1];
926 const double r2m = (2 * r - 1);
927 const double r4m = (4 * r - 1);
928 const double s2m = (2 * s - 1);
929 const double s4m = (4 * s - 1);
932 +((8 * s + 8 * r - 5) * (16 * s * s + 32 * r * s - 20 * s + 16 * r * r - 20 * r + 5))
934 d[1][0] = +((8 * r - 3) * (16 * r * r - 12 * r + 1)) / 3;
937 * (8 * s * s * s + 48 * r * s * s - 18 * s * s + 72 * r * r * s - 72 * r * s
938 + 13 * s + 32 * r * r * r - 54 * r * r + 26 * r - 3))
940 d[4][0] = +4 * (s + 2 * r - 1) * (32 * r * s - 4 * s + 32 * r * r - 32 * r + 3);
942 -(16 * (24 * r * r * s - 12 * r * s + s + 32 * r * r * r - 42 * r * r + 14 * r - 1))
944 d[6][0] = -(16 * s * (24 * s * s + 48 * r * s - 36 * s + 24 * r * r - 36 * r + 13)) / 3;
945 d[7][0] = +32 * s * (4 * s * s + 16 * r * s - 7 * s + 12 * r * r - 14 * r + 3);
946 d[8][0] = -32 * s * (8 * r * s - s + 12 * r * r - 10 * r + 1);
947 d[9][0] = +(16 * (24 * r * r - 12 * r + 1) * s) / 3;
948 d[10][0] = +4 * s * s4m * (8 * s + 8 * r - 7);
949 d[11][0] = -32 * s * (s + 2 * r - 1) * s4m;
950 d[12][0] = +4 * (8 * r - 1) * s * s4m;
951 d[13][0] = -(16 * s * s2m * s4m) / 3;
952 d[14][0] = +(16 * s * s2m * s4m) / 3;
954 +((8 * s + 8 * r - 5) * (16 * s * s + 32 * r * s - 20 * s + 16 * r * r - 20 * r + 5))
957 d[2][1] = +((8 * s - 3) * (16 * s * s - 12 * s + 1)) / 3;
958 d[3][1] = -(16 * r * (24 * s * s + 48 * r * s - 36 * s + 24 * r * r - 36 * r + 13)) / 3;
959 d[4][1] = +4 * r * r4m * (8 * s + 8 * r - 7);
960 d[5][1] = -(16 * r * r2m * r4m) / 3;
962 * (32 * s * s * s + 72 * r * s * s - 54 * s * s + 48 * r * r * s - 72 * r * s
963 + 26 * s + 8 * r * r * r - 18 * r * r + 13 * r - 3))
965 d[7][1] = +32 * r * (12 * s * s + 16 * r * s - 14 * s + 4 * r * r - 7 * r + 3);
966 d[8][1] = -32 * r * r4m * (2 * s + r - 1);
967 d[9][1] = +(16 * r * r2m * r4m) / 3;
968 d[10][1] = +4 * (2 * s + r - 1) * (32 * s * s + 32 * r * s - 32 * s - 4 * r + 3);
969 d[11][1] = -32 * r * (12 * s * s + 8 * r * s - 10 * s - r + 1);
970 d[12][1] = +4 * r * r4m * (8 * s - 1);
972 -(16 * (32 * s * s * s + 24 * r * s * s - 42 * s * s - 12 * r * s + 14 * s + r - 1))
974 d[14][1] = +(16 * r * (24 * s * s - 12 * s + 1)) / 3;
978 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
979 eval_h(internal_coor, &h[0]);
982 static void eval_h_derived(
983 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
984 d.resize(2, num_nodes);
985 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
989class T21_Shape_Evaluator {
991 static const int num_nodes = 21;
992 static const int num_dimensions = 2;
993 static const int order = 5;
994 typedef IS_T ischeme_type;
996 static ischeme_type create_ischeme() {
997 ischeme_type ischeme;
998 ischeme.set_order(order);
1002 static ischeme_type create_ischeme(SolidMechanics& property) {
1003 ischeme_type ischeme;
1004 ischeme.set_order(2 * order);
1005 ischeme.init(property);
1009 static const double r_node[21];
1010 static const double s_node[21];
1011 static const double t_node[21];
1013 static const char name[4];
1015 typedef L6_Shape_Evaluator edge_shape_type_0;
1016 typedef L6_Shape_Evaluator edge_shape_type_1;
1017 static const int num_edge = 3;
1018 static const int edge_node[3][6];
1019 static const int edge_type_index[3];
1021 typedef T21_Shape_Evaluator face_shape_type_0;
1022 typedef T21_Shape_Evaluator face_shape_type_1;
1023 static const int num_face = 2;
1024 static const int face_node[2][21];
1025 static const int face_type_index[2];
1026 static const bool is_t_face[2];
1028 static void eval_h(
const double internal_coor[2],
double h[21]) {
1029 const double r = internal_coor[0];
1030 const double s = internal_coor[1];
1032 h[0] = -((s + r - 1) * (5 * s + 5 * r - 4) * (5 * s + 5 * r - 3) * (5 * s + 5 * r - 2)
1033 * (5 * s + 5 * r - 1))
1035 h[1] = +(r * (5 * r - 4) * (5 * r - 3) * (5 * r - 2) * (5 * r - 1)) / 24;
1036 h[2] = +(s * (5 * s - 4) * (5 * s - 3) * (5 * s - 2) * (5 * s - 1)) / 24;
1037 h[3] = +(25 * r * (s + r - 1) * (5 * s + 5 * r - 4) * (5 * s + 5 * r - 3)
1038 * (5 * s + 5 * r - 2))
1040 h[4] = -(25 * r * (5 * r - 1) * (s + r - 1) * (5 * s + 5 * r - 4) * (5 * s + 5 * r - 3))
1042 h[5] = +(25 * r * (5 * r - 2) * (5 * r - 1) * (s + r - 1) * (5 * s + 5 * r - 4)) / 12;
1043 h[6] = -(25 * r * (5 * r - 3) * (5 * r - 2) * (5 * r - 1) * (s + r - 1)) / 24;
1044 h[7] = +(25 * s * (s + r - 1) * (5 * s + 5 * r - 4) * (5 * s + 5 * r - 3)
1045 * (5 * s + 5 * r - 2))
1047 h[8] = -(125 * r * s * (s + r - 1) * (5 * s + 5 * r - 4) * (5 * s + 5 * r - 3)) / 6;
1048 h[9] = +(125 * r * (5 * r - 1) * s * (s + r - 1) * (5 * s + 5 * r - 4)) / 4;
1049 h[10] = -(125 * r * (5 * r - 2) * (5 * r - 1) * s * (s + r - 1)) / 6;
1050 h[11] = +(25 * r * (5 * r - 3) * (5 * r - 2) * (5 * r - 1) * s) / 24;
1051 h[12] = -(25 * s * (s + r - 1) * (5 * s - 1) * (5 * s + 5 * r - 4) * (5 * s + 5 * r - 3))
1053 h[13] = +(125 * r * s * (s + r - 1) * (5 * s - 1) * (5 * s + 5 * r - 4)) / 4;
1054 h[14] = -(125 * r * (5 * r - 1) * s * (s + r - 1) * (5 * s - 1)) / 4;
1055 h[15] = +(25 * r * (5 * r - 2) * (5 * r - 1) * s * (5 * s - 1)) / 12;
1056 h[16] = +(25 * s * (s + r - 1) * (5 * s - 2) * (5 * s - 1) * (5 * s + 5 * r - 4)) / 12;
1057 h[17] = -(125 * r * s * (s + r - 1) * (5 * s - 2) * (5 * s - 1)) / 6;
1058 h[18] = +(25 * r * (5 * r - 1) * s * (5 * s - 2) * (5 * s - 1)) / 12;
1059 h[19] = -(25 * s * (s + r - 1) * (5 * s - 3) * (5 * s - 2) * (5 * s - 1)) / 24;
1060 h[20] = +(25 * r * s * (5 * s - 3) * (5 * s - 2) * (5 * s - 1)) / 24;
1063 static void eval_h_derived(
const double internal_coor[2],
double d[21][2]) {
1064 const double r = internal_coor[0];
1065 const double s = internal_coor[1];
1067 d[0][0] = -(3125 * s * s * s * s + 12500 * r * s * s * s - 7500 * s * s * s
1068 + 18750 * r * r * s * s - 22500 * r * s * s + 6375 * s * s
1069 + 12500 * r * r * r * s - 22500 * r * r * s + 12750 * r * s - 2250 * s
1070 + 3125 * r * r * r * r - 7500 * r * r * r + 6375 * r * r - 2250 * r + 274)
1072 d[1][0] = +(3125 * r * r * r * r - 5000 * r * r * r + 2625 * r * r - 500 * r + 24) / 24;
1075 * (125 * s * s * s * s + 1000 * r * s * s * s - 350 * s * s * s
1076 + 2250 * r * r * s * s - 2100 * r * s * s + 355 * s * s
1077 + 2000 * r * r * r * s - 3150 * r * r * s + 1420 * r * s - 154 * s
1078 + 625 * r * r * r * r - 1400 * r * r * r + 1065 * r * r - 308 * r + 24))
1081 * (250 * r * s * s * s - 25 * s * s * s + 1125 * r * r * s * s - 750 * r * s * s
1082 + 60 * s * s + 1500 * r * r * r * s - 2025 * r * r * s + 710 * r * s - 47 * s
1083 + 625 * r * r * r * r - 1300 * r * r * r + 885 * r * r - 214 * r + 12))
1086 * (375 * r * r * s * s - 150 * r * s * s + 10 * s * s + 1000 * r * r * r * s
1087 - 1125 * r * r * s + 310 * r * s - 18 * s + 625 * r * r * r * r
1088 - 1200 * r * r * r + 735 * r * r - 156 * r + 8))
1091 * (500 * r * r * r * s - 450 * r * r * s + 110 * r * s - 6 * s
1092 + 625 * r * r * r * r - 1100 * r * r * r + 615 * r * r - 122 * r + 6))
1094 d[7][0] = +(25 * s * (10 * s + 10 * r - 7)
1095 * (25 * s * s + 50 * r * s - 35 * s + 25 * r * r - 35 * r + 11))
1098 * (25 * s * s * s + 150 * r * s * s - 60 * s * s + 225 * r * r * s - 240 * r * s
1099 + 47 * s + 100 * r * r * r - 180 * r * r + 94 * r - 12))
1101 d[9][0] = +(125 * s * (s + 2 * r - 1) * (50 * r * s - 5 * s + 50 * r * r - 50 * r + 4)) / 4;
1102 d[10][0] = -(125 * s
1103 * (75 * r * r * s - 30 * r * s + 2 * s + 100 * r * r * r - 120 * r * r + 34 * r
1106 d[11][0] = +(25 * (10 * r - 3) * (25 * r * r - 15 * r + 1) * s) / 12;
1107 d[12][0] = -(25 * s * (5 * s - 1)
1108 * (75 * s * s + 150 * r * s - 120 * s + 75 * r * r - 120 * r + 47))
1111 +(125 * s * (5 * s - 1) * (5 * s * s + 20 * r * s - 9 * s + 15 * r * r - 18 * r + 4))
1113 d[14][0] = -(125 * s * (5 * s - 1) * (10 * r * s - s + 15 * r * r - 12 * r + 1)) / 4;
1114 d[15][0] = +(25 * (75 * r * r - 30 * r + 2) * s * (5 * s - 1)) / 12;
1115 d[16][0] = +(25 * s * (5 * s - 2) * (5 * s - 1) * (10 * s + 10 * r - 9)) / 12;
1116 d[17][0] = -(125 * s * (s + 2 * r - 1) * (5 * s - 2) * (5 * s - 1)) / 6;
1117 d[18][0] = +(25 * (10 * r - 1) * s * (5 * s - 2) * (5 * s - 1)) / 12;
1118 d[19][0] = -(25 * s * (5 * s - 3) * (5 * s - 2) * (5 * s - 1)) / 24;
1119 d[20][0] = +(25 * s * (5 * s - 3) * (5 * s - 2) * (5 * s - 1)) / 24;
1120 d[0][1] = -(3125 * s * s * s * s + 12500 * r * s * s * s - 7500 * s * s * s
1121 + 18750 * r * r * s * s - 22500 * r * s * s + 6375 * s * s
1122 + 12500 * r * r * r * s - 22500 * r * r * s + 12750 * r * s - 2250 * s
1123 + 3125 * r * r * r * r - 7500 * r * r * r + 6375 * r * r - 2250 * r + 274)
1126 d[2][1] = +(3125 * s * s * s * s - 5000 * s * s * s + 2625 * s * s - 500 * s + 24) / 24;
1127 d[3][1] = +(25 * r * (10 * s + 10 * r - 7)
1128 * (25 * s * s + 50 * r * s - 35 * s + 25 * r * r - 35 * r + 11))
1130 d[4][1] = -(25 * r * (5 * r - 1)
1131 * (75 * s * s + 150 * r * s - 120 * s + 75 * r * r - 120 * r + 47))
1133 d[5][1] = +(25 * r * (5 * r - 2) * (5 * r - 1) * (10 * s + 10 * r - 9)) / 12;
1134 d[6][1] = -(25 * r * (5 * r - 3) * (5 * r - 2) * (5 * r - 1)) / 24;
1136 * (625 * s * s * s * s + 2000 * r * s * s * s - 1400 * s * s * s
1137 + 2250 * r * r * s * s - 3150 * r * s * s + 1065 * s * s
1138 + 1000 * r * r * r * s - 2100 * r * r * s + 1420 * r * s - 308 * s
1139 + 125 * r * r * r * r - 350 * r * r * r + 355 * r * r - 154 * r + 24))
1142 * (100 * s * s * s + 225 * r * s * s - 180 * s * s + 150 * r * r * s
1143 - 240 * r * s + 94 * s + 25 * r * r * r - 60 * r * r + 47 * r - 12))
1146 +(125 * r * (5 * r - 1) * (15 * s * s + 20 * r * s - 18 * s + 5 * r * r - 9 * r + 4))
1148 d[10][1] = -(125 * r * (5 * r - 2) * (5 * r - 1) * (2 * s + r - 1)) / 6;
1149 d[11][1] = +(25 * r * (5 * r - 3) * (5 * r - 2) * (5 * r - 1)) / 24;
1151 * (625 * s * s * s * s + 1500 * r * s * s * s - 1300 * s * s * s
1152 + 1125 * r * r * s * s - 2025 * r * s * s + 885 * s * s
1153 + 250 * r * r * r * s - 750 * r * r * s + 710 * r * s - 214 * s
1154 - 25 * r * r * r + 60 * r * r - 47 * r + 12))
1157 +(125 * r * (2 * s + r - 1) * (50 * s * s + 50 * r * s - 50 * s - 5 * r + 4)) / 4;
1158 d[14][1] = -(125 * r * (5 * r - 1) * (15 * s * s + 10 * r * s - 12 * s - r + 1)) / 4;
1159 d[15][1] = +(25 * r * (5 * r - 2) * (5 * r - 1) * (10 * s - 1)) / 12;
1161 * (625 * s * s * s * s + 1000 * r * s * s * s - 1200 * s * s * s
1162 + 375 * r * r * s * s - 1125 * r * s * s + 735 * s * s - 150 * r * r * s
1163 + 310 * r * s - 156 * s + 10 * r * r - 18 * r + 8))
1165 d[17][1] = -(125 * r
1166 * (100 * s * s * s + 75 * r * s * s - 120 * s * s - 30 * r * s + 34 * s + 2 * r
1169 d[18][1] = +(25 * r * (5 * r - 1) * (75 * s * s - 30 * s + 2)) / 12;
1171 * (625 * s * s * s * s + 500 * r * s * s * s - 1100 * s * s * s
1172 - 450 * r * s * s + 615 * s * s + 110 * r * s - 122 * s - 6 * r + 6))
1174 d[20][1] = +(25 * r * (10 * s - 3) * (25 * s * s - 15 * s + 1)) / 12;
1178 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
1179 eval_h(internal_coor, &h[0]);
1182 static void eval_h_derived(
1183 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
1184 d.resize(2, num_nodes);
1185 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
1189class T28_Shape_Evaluator {
1191 static const int num_nodes = 28;
1192 static const int num_dimensions = 2;
1193 static const int order = 6;
1194 typedef IS_T ischeme_type;
1196 static ischeme_type create_ischeme() {
1197 ischeme_type ischeme;
1198 ischeme.set_order(order);
1202 static ischeme_type create_ischeme(SolidMechanics& property) {
1203 ischeme_type ischeme;
1204 ischeme.set_order(2 * order);
1205 ischeme.init(property);
1209 static const double r_node[28];
1210 static const double s_node[28];
1211 static const double t_node[28];
1213 static const char name[4];
1215 typedef L6_Shape_Evaluator edge_shape_type_0;
1216 typedef L6_Shape_Evaluator edge_shape_type_1;
1217 static const int num_edge = 3;
1218 static const int edge_node[3][7];
1219 static const int edge_type_index[3];
1221 typedef T28_Shape_Evaluator face_shape_type_0;
1222 typedef T28_Shape_Evaluator face_shape_type_1;
1223 static const int num_face = 2;
1224 static const int face_node[2][28];
1225 static const int face_type_index[2];
1226 static const bool is_t_face[2];
1228 static void eval_h(
const double internal_coor[2],
double h[28]) {
1229 const double r = internal_coor[0];
1230 const double s = internal_coor[1];
1232 const double r2m = (2 * r - 1);
1233 const double r3m = (3 * r - 1);
1234 const double s2m = (2 * s - 1);
1235 const double s3m = (3 * s - 1);
1237 h[0] = +((s + r - 1) * (2 * s + 2 * r - 1) * (3 * s + 3 * r - 2) * (3 * s + 3 * r - 1)
1238 * (6 * s + 6 * r - 5) * (6 * s + 6 * r - 1))
1240 h[1] = +(r * r2m * (3 * r - 2) * r3m * (6 * r - 5) * (6 * r - 1)) / 10;
1241 h[2] = +(s * s2m * (3 * s - 2) * s3m * (6 * s - 5) * (6 * s - 1)) / 10;
1242 h[3] = -(18 * r * (s + r - 1) * (2 * s + 2 * r - 1) * (3 * s + 3 * r - 2)
1243 * (3 * s + 3 * r - 1) * (6 * s + 6 * r - 5))
1245 h[4] = +(9 * r * (6 * r - 1) * (s + r - 1) * (2 * s + 2 * r - 1) * (3 * s + 3 * r - 2)
1246 * (6 * s + 6 * r - 5))
1248 h[5] = -4 * r * r3m * (6 * r - 1) * (s + r - 1) * (3 * s + 3 * r - 2) * (6 * s + 6 * r - 5);
1249 h[6] = +(9 * r * r2m * r3m * (6 * r - 1) * (s + r - 1) * (6 * s + 6 * r - 5)) / 2;
1250 h[7] = -(18 * r * r2m * (3 * r - 2) * r3m * (6 * r - 1) * (s + r - 1)) / 5;
1251 h[8] = -(18 * s * (s + r - 1) * (2 * s + 2 * r - 1) * (3 * s + 3 * r - 2)
1252 * (3 * s + 3 * r - 1) * (6 * s + 6 * r - 5))
1254 h[9] = +54 * r * s * (s + r - 1) * (2 * s + 2 * r - 1) * (3 * s + 3 * r - 2)
1255 * (6 * s + 6 * r - 5);
1256 h[10] = -36 * r * (6 * r - 1) * s * (s + r - 1) * (3 * s + 3 * r - 2) * (6 * s + 6 * r - 5);
1257 h[11] = +36 * r * r3m * (6 * r - 1) * s * (s + r - 1) * (6 * s + 6 * r - 5);
1258 h[12] = -54 * r * r2m * r3m * (6 * r - 1) * s * (s + r - 1);
1259 h[13] = +(18 * r * r2m * (3 * r - 2) * r3m * (6 * r - 1) * s) / 5;
1260 h[14] = +(9 * s * (s + r - 1) * (2 * s + 2 * r - 1) * (3 * s + 3 * r - 2) * (6 * s - 1)
1261 * (6 * s + 6 * r - 5))
1263 h[15] = -36 * r * s * (s + r - 1) * (3 * s + 3 * r - 2) * (6 * s - 1) * (6 * s + 6 * r - 5);
1264 h[16] = +27 * r * (6 * r - 1) * s * (s + r - 1) * (6 * s - 1) * (6 * s + 6 * r - 5);
1265 h[17] = -36 * r * r3m * (6 * r - 1) * s * (s + r - 1) * (6 * s - 1);
1266 h[18] = +(9 * r * r2m * r3m * (6 * r - 1) * s * (6 * s - 1)) / 2;
1268 -4 * s * (s + r - 1) * s3m * (3 * s + 3 * r - 2) * (6 * s - 1) * (6 * s + 6 * r - 5);
1269 h[20] = +36 * r * s * (s + r - 1) * s3m * (6 * s - 1) * (6 * s + 6 * r - 5);
1270 h[21] = -36 * r * (6 * r - 1) * s * (s + r - 1) * s3m * (6 * s - 1);
1271 h[22] = +4 * r * r3m * (6 * r - 1) * s * s3m * (6 * s - 1);
1272 h[23] = +(9 * s * (s + r - 1) * s2m * s3m * (6 * s - 1) * (6 * s + 6 * r - 5)) / 2;
1273 h[24] = -54 * r * s * (s + r - 1) * s2m * s3m * (6 * s - 1);
1274 h[25] = +(9 * r * (6 * r - 1) * s * s2m * s3m * (6 * s - 1)) / 2;
1275 h[26] = -(18 * s * (s + r - 1) * s2m * (3 * s - 2) * s3m * (6 * s - 1)) / 5;
1276 h[27] = +(18 * r * s * s2m * (3 * s - 2) * s3m * (6 * s - 1)) / 5;
1279 static void eval_h_derived(
const double internal_coor[2],
double d[28][2]) {
1280 const double r = internal_coor[0];
1281 const double s = internal_coor[1];
1283 const double r2m = (2 * r - 1);
1284 const double r3m = (3 * r - 1);
1285 const double r4m = (4 * r - 1);
1286 const double s2m = (2 * s - 1);
1287 const double s3m = (3 * s - 1);
1288 const double s4m = (4 * s - 1);
1290 d[0][0] = +((12 * s + 12 * r - 7)
1291 * (324 * s * s * s * s + 1296 * r * s * s * s - 756 * s * s * s
1292 + 1944 * r * r * s * s - 2268 * r * s * s + 609 * s * s
1293 + 1296 * r * r * r * s - 2268 * r * r * s + 1218 * r * s - 196 * s
1294 + 324 * r * r * r * r - 756 * r * r * r + 609 * r * r - 196 * r + 21))
1297 +((12 * r - 5) * (324 * r * r * r * r - 540 * r * r * r + 285 * r * r - 50 * r + 2))
1301 * (108 * s * s * s * s * s + 1080 * r * s * s * s * s - 360 * s * s * s * s
1302 + 3240 * r * r * s * s * s - 2880 * r * s * s * s + 465 * s * s * s
1303 + 4320 * r * r * r * s * s - 6480 * r * r * s * s + 2790 * r * s * s
1304 - 290 * s * s + 2700 * r * r * r * r * s - 5760 * r * r * r * s
1305 + 4185 * r * r * s - 1160 * r * s + 87 * s + 648 * r * r * r * r * r
1306 - 1800 * r * r * r * r + 1860 * r * r * r - 870 * r * r + 174 * r - 10))
1309 * (432 * r * s * s * s * s - 36 * s * s * s * s + 2592 * r * r * s * s * s
1310 - 1584 * r * s * s * s + 108 * s * s * s + 5184 * r * r * r * s * s
1311 - 6480 * r * r * s * s + 2076 * r * s * s - 119 * s * s
1312 + 4320 * r * r * r * r * s - 8352 * r * r * r * s + 5256 * r * r * s
1313 - 1160 * r * s + 57 * s + 1296 * r * r * r * r * r - 3420 * r * r * r * r
1314 + 3288 * r * r * r - 1383 * r * r + 234 * r - 10))
1316 d[5][0] = -4 * (s + 2 * r - 1)
1317 * (972 * r * r * s * s - 324 * r * s * s + 18 * s * s + 1944 * r * r * r * s
1318 - 2268 * r * r * s + 558 * r * s - 27 * s + 972 * r * r * r * r
1319 - 1944 * r * r * r + 1206 * r * r - 234 * r + 10);
1321 * (864 * r * r * r * s * s - 648 * r * r * s * s + 132 * r * s * s - 6 * s * s
1322 + 2160 * r * r * r * r * s - 3312 * r * r * r * s + 1584 * r * r * s
1323 - 266 * r * s + 11 * s + 1296 * r * r * r * r * r - 3060 * r * r * r * r
1324 + 2568 * r * r * r - 921 * r * r + 132 * r - 5))
1327 * (540 * r * r * r * r * s - 720 * r * r * r * s + 315 * r * r * s - 50 * r * s
1328 + 2 * s + 648 * r * r * r * r * r - 1440 * r * r * r * r + 1140 * r * r * r
1329 - 390 * r * r + 54 * r - 2))
1332 * (540 * s * s * s * s + 2160 * r * s * s * s - 1440 * s * s * s
1333 + 3240 * r * r * s * s - 4320 * r * s * s + 1395 * s * s
1334 + 2160 * r * r * r * s - 4320 * r * r * s + 2790 * r * s - 580 * s
1335 + 540 * r * r * r * r - 1440 * r * r * r + 1395 * r * r - 580 * r + 87))
1338 * (36 * s * s * s * s + 288 * r * s * s * s - 108 * s * s * s
1339 + 648 * r * r * s * s - 648 * r * s * s + 119 * s * s + 576 * r * r * r * s
1340 - 972 * r * r * s + 476 * r * s - 57 * s + 180 * r * r * r * r
1341 - 432 * r * r * r + 357 * r * r - 114 * r + 10);
1343 * (216 * r * s * s * s - 18 * s * s * s + 972 * r * r * s * s - 648 * r * s * s
1344 + 45 * s * s + 1296 * r * r * r * s - 1782 * r * r * s + 624 * r * s - 37 * s
1345 + 540 * r * r * r * r - 1152 * r * r * r + 801 * r * r - 194 * r + 10);
1347 * (324 * r * r * s * s - 108 * r * s * s + 6 * s * s + 864 * r * r * r * s
1348 - 918 * r * r * s + 222 * r * s - 11 * s + 540 * r * r * r * r
1349 - 1008 * r * r * r + 585 * r * r - 112 * r + 5);
1351 * (144 * r * r * r * s - 108 * r * r * s + 22 * r * s - s + 180 * r * r * r * r
1352 - 288 * r * r * r + 141 * r * r - 24 * r + 1);
1354 +(18 * (540 * r * r * r * r - 720 * r * r * r + 315 * r * r - 50 * r + 2) * s) / 5;
1355 d[14][0] = +(9 * s * (4 * s + 4 * r - 3) * (6 * s - 1)
1356 * (36 * s * s + 72 * r * s - 54 * s + 36 * r * r - 54 * r + 19))
1358 d[15][0] = -36 * s * (6 * s - 1)
1359 * (18 * s * s * s + 108 * r * s * s - 45 * s * s + 162 * r * r * s - 180 * r * s
1360 + 37 * s + 72 * r * r * r - 135 * r * r + 74 * r - 10);
1361 d[16][0] = +27 * s * (s + 2 * r - 1) * (6 * s - 1)
1362 * (72 * r * s - 6 * s + 72 * r * r - 72 * r + 5);
1363 d[17][0] = -36 * s * (6 * s - 1)
1364 * (54 * r * r * s - 18 * r * s + s + 72 * r * r * r - 81 * r * r + 20 * r - 1);
1365 d[18][0] = +(9 * r4m * (36 * r * r - 18 * r + 1) * s * (6 * s - 1)) / 2;
1366 d[19][0] = -4 * s * s3m * (6 * s - 1)
1367 * (54 * s * s + 108 * r * s - 90 * s + 54 * r * r - 90 * r + 37);
1368 d[20][0] = +36 * s * s3m * (6 * s - 1)
1369 * (6 * s * s + 24 * r * s - 11 * s + 18 * r * r - 22 * r + 5);
1370 d[21][0] = -36 * s * s3m * (6 * s - 1) * (12 * r * s - s + 18 * r * r - 14 * r + 1);
1371 d[22][0] = +4 * (54 * r * r - 18 * r + 1) * s * s3m * (6 * s - 1);
1372 d[23][0] = +(9 * s * s2m * s3m * (6 * s - 1) * (12 * s + 12 * r - 11)) / 2;
1373 d[24][0] = -54 * s * (s + 2 * r - 1) * s2m * s3m * (6 * s - 1);
1374 d[25][0] = +(9 * (12 * r - 1) * s * s2m * s3m * (6 * s - 1)) / 2;
1375 d[26][0] = -(18 * s * s2m * (3 * s - 2) * s3m * (6 * s - 1)) / 5;
1376 d[27][0] = +(18 * s * s2m * (3 * s - 2) * s3m * (6 * s - 1)) / 5;
1377 d[0][1] = +((12 * s + 12 * r - 7)
1378 * (324 * s * s * s * s + 1296 * r * s * s * s - 756 * s * s * s
1379 + 1944 * r * r * s * s - 2268 * r * s * s + 609 * s * s
1380 + 1296 * r * r * r * s - 2268 * r * r * s + 1218 * r * s - 196 * s
1381 + 324 * r * r * r * r - 756 * r * r * r + 609 * r * r - 196 * r + 21))
1385 +((12 * s - 5) * (324 * s * s * s * s - 540 * s * s * s + 285 * s * s - 50 * s + 2))
1388 * (540 * s * s * s * s + 2160 * r * s * s * s - 1440 * s * s * s
1389 + 3240 * r * r * s * s - 4320 * r * s * s + 1395 * s * s
1390 + 2160 * r * r * r * s - 4320 * r * r * s + 2790 * r * s - 580 * s
1391 + 540 * r * r * r * r - 1440 * r * r * r + 1395 * r * r - 580 * r + 87))
1393 d[4][1] = +(9 * r * (6 * r - 1) * (4 * s + 4 * r - 3)
1394 * (36 * s * s + 72 * r * s - 54 * s + 36 * r * r - 54 * r + 19))
1396 d[5][1] = -4 * r * r3m * (6 * r - 1)
1397 * (54 * s * s + 108 * r * s - 90 * s + 54 * r * r - 90 * r + 37);
1398 d[6][1] = +(9 * r * r2m * r3m * (6 * r - 1) * (12 * s + 12 * r - 11)) / 2;
1399 d[7][1] = -(18 * r * r2m * (3 * r - 2) * r3m * (6 * r - 1)) / 5;
1401 * (648 * s * s * s * s * s + 2700 * r * s * s * s * s - 1800 * s * s * s * s
1402 + 4320 * r * r * s * s * s - 5760 * r * s * s * s + 1860 * s * s * s
1403 + 3240 * r * r * r * s * s - 6480 * r * r * s * s + 4185 * r * s * s
1404 - 870 * s * s + 1080 * r * r * r * r * s - 2880 * r * r * r * s
1405 + 2790 * r * r * s - 1160 * r * s + 174 * s + 108 * r * r * r * r * r
1406 - 360 * r * r * r * r + 465 * r * r * r - 290 * r * r + 87 * r - 10))
1409 * (180 * s * s * s * s + 576 * r * s * s * s - 432 * s * s * s
1410 + 648 * r * r * s * s - 972 * r * s * s + 357 * s * s + 288 * r * r * r * s
1411 - 648 * r * r * s + 476 * r * s - 114 * s + 36 * r * r * r * r
1412 - 108 * r * r * r + 119 * r * r - 57 * r + 10);
1413 d[10][1] = -36 * r * (6 * r - 1)
1414 * (72 * s * s * s + 162 * r * s * s - 135 * s * s + 108 * r * r * s - 180 * r * s
1415 + 74 * s + 18 * r * r * r - 45 * r * r + 37 * r - 10);
1416 d[11][1] = +36 * r * r3m * (6 * r - 1)
1417 * (18 * s * s + 24 * r * s - 22 * s + 6 * r * r - 11 * r + 5);
1418 d[12][1] = -54 * r * r2m * r3m * (6 * r - 1) * (2 * s + r - 1);
1419 d[13][1] = +(18 * r * r2m * (3 * r - 2) * r3m * (6 * r - 1)) / 5;
1421 * (1296 * s * s * s * s * s + 4320 * r * s * s * s * s - 3420 * s * s * s * s
1422 + 5184 * r * r * s * s * s - 8352 * r * s * s * s + 3288 * s * s * s
1423 + 2592 * r * r * r * s * s - 6480 * r * r * s * s + 5256 * r * s * s
1424 - 1383 * s * s + 432 * r * r * r * r * s - 1584 * r * r * r * s
1425 + 2076 * r * r * s - 1160 * r * s + 234 * s - 36 * r * r * r * r
1426 + 108 * r * r * r - 119 * r * r + 57 * r - 10))
1430 * (540 * s * s * s * s + 1296 * r * s * s * s - 1152 * s * s * s + 972 * r * r * s * s
1431 - 1782 * r * s * s + 801 * s * s + 216 * r * r * r * s - 648 * r * r * s
1432 + 624 * r * s - 194 * s - 18 * r * r * r + 45 * r * r - 37 * r + 10);
1433 d[16][1] = +27 * r * (6 * r - 1) * (2 * s + r - 1)
1434 * (72 * s * s + 72 * r * s - 72 * s - 6 * r + 5);
1435 d[17][1] = -36 * r * r3m * (6 * r - 1) * (18 * s * s + 12 * r * s - 14 * s - r + 1);
1436 d[18][1] = +(9 * r * r2m * r3m * (6 * r - 1) * (12 * s - 1)) / 2;
1437 d[19][1] = -4 * (2 * s + r - 1)
1438 * (972 * s * s * s * s + 1944 * r * s * s * s - 1944 * s * s * s
1439 + 972 * r * r * s * s - 2268 * r * s * s + 1206 * s * s - 324 * r * r * s
1440 + 558 * r * s - 234 * s + 18 * r * r - 27 * r + 10);
1442 * (540 * s * s * s * s + 864 * r * s * s * s - 1008 * s * s * s
1443 + 324 * r * r * s * s - 918 * r * s * s + 585 * s * s - 108 * r * r * s
1444 + 222 * r * s - 112 * s + 6 * r * r - 11 * r + 5);
1445 d[21][1] = -36 * r * (6 * r - 1)
1446 * (72 * s * s * s + 54 * r * s * s - 81 * s * s - 18 * r * s + 20 * s + r - 1);
1447 d[22][1] = +4 * r * r3m * (6 * r - 1) * (54 * s * s - 18 * s + 1);
1449 * (1296 * s * s * s * s * s + 2160 * r * s * s * s * s - 3060 * s * s * s * s
1450 + 864 * r * r * s * s * s - 3312 * r * s * s * s + 2568 * s * s * s
1451 - 648 * r * r * s * s + 1584 * r * s * s - 921 * s * s + 132 * r * r * s
1452 - 266 * r * s + 132 * s - 6 * r * r + 11 * r - 5))
1455 * (180 * s * s * s * s + 144 * r * s * s * s - 288 * s * s * s - 108 * r * s * s
1456 + 141 * s * s + 22 * r * s - 24 * s - r + 1);
1457 d[25][1] = +(9 * r * (6 * r - 1) * s4m * (36 * s * s - 18 * s + 1)) / 2;
1459 * (648 * s * s * s * s * s + 540 * r * s * s * s * s - 1440 * s * s * s * s
1460 - 720 * r * s * s * s + 1140 * s * s * s + 315 * r * s * s - 390 * s * s
1461 - 50 * r * s + 54 * s + 2 * r - 2))
1464 +(18 * r * (540 * s * s * s * s - 720 * s * s * s + 315 * s * s - 50 * s + 2)) / 5;
1468 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
1469 eval_h(internal_coor, &h[0]);
1472 static void eval_h_derived(
1473 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
1474 d.resize(2, num_nodes);
1475 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
1483class Q4_Shape_Evaluator {
1485 static const int num_nodes = 4;
1486 static const int num_dimensions = 2;
1487 static const int order = 2;
1488 typedef IS_Q ischeme_type;
1490 static ischeme_type create_ischeme() {
1491 ischeme_type ischeme;
1492 ischeme[0].set_order(1);
1493 ischeme[1].set_order(1);
1497 static ischeme_type create_ischeme(SolidMechanics& property) {
1498 ischeme_type ischeme;
1499 ischeme[0].set_order(2);
1500 ischeme[1].set_order(2);
1501 ischeme.init(property);
1505 static const double r_node[4];
1506 static const double s_node[4];
1507 static const double t_node[4];
1509 static const char name[3];
1511 typedef L2_Shape_Evaluator edge_shape_type_0;
1512 typedef L2_Shape_Evaluator edge_shape_type_1;
1513 static const int num_edge = 4;
1514 static const int edge_node[4][2];
1515 static const int edge_type_index[4];
1517 typedef Q4_Shape_Evaluator face_shape_type_0;
1518 typedef Q4_Shape_Evaluator face_shape_type_1;
1519 static const int num_face = 2;
1520 static const int face_node[2][4];
1521 static const int face_type_index[2];
1522 static const bool is_t_face[2];
1524 static void eval_h(
const double internal_coor[2],
double h[4]) {
1525 const double r = internal_coor[0];
1526 const double s = internal_coor[1];
1528 const double rm = 1. - r;
1529 const double sm = 1. - s;
1531 const double rp = 1. + r;
1532 const double sp = 1. + s;
1534 h[0] = 0.25 * rm * sm;
1535 h[1] = 0.25 * rp * sm;
1536 h[2] = 0.25 * rp * sp;
1537 h[3] = 0.25 * rm * sp;
1540 static void eval_h_derived(
const double internal_coor[2],
double d[4][2]) {
1541 const double r = internal_coor[0];
1542 const double s = internal_coor[1];
1544 const double rm = 1. - r;
1545 const double sm = 1. - s;
1547 const double rp = 1. + r;
1548 const double sp = 1. + s;
1550 const double fa = 0.25;
1566 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
1567 eval_h(internal_coor, &h[0]);
1570 static void eval_h_derived(
1571 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
1572 d.resize(2, num_nodes);
1573 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
1577class Q8_Shape_Evaluator {
1579 static const int num_nodes = 8;
1580 static const int num_dimensions = 2;
1581 static const int order = 4;
1582 typedef IS_Q ischeme_type;
1584 static ischeme_type create_ischeme() {
1585 ischeme_type ischeme;
1586 ischeme[0].set_order(2);
1587 ischeme[1].set_order(2);
1591 static ischeme_type create_ischeme(SolidMechanics& property) {
1592 ischeme_type ischeme;
1593 ischeme[0].set_order(2 * 2);
1594 ischeme[1].set_order(2 * 2);
1595 ischeme.init(property);
1599 static const double r_node[8];
1600 static const double s_node[8];
1601 static const double t_node[8];
1603 static const char name[3];
1605 typedef L3_Shape_Evaluator edge_shape_type_0;
1606 typedef L3_Shape_Evaluator edge_shape_type_1;
1607 static const int num_edge = 4;
1608 static const int edge_node[4][3];
1609 static const int edge_type_index[4];
1611 typedef Q8_Shape_Evaluator face_shape_type_0;
1612 typedef Q8_Shape_Evaluator face_shape_type_1;
1613 static const int num_face = 2;
1614 static const int face_node[2][8];
1615 static const int face_type_index[2];
1616 static const bool is_t_face[2];
1618 static void eval_h(
const double internal_coor[2],
double h[8]) {
1619 const double r = internal_coor[0];
1620 const double s = internal_coor[1];
1622 const double rm = 1. - r;
1623 const double sm = 1. - s;
1625 const double rp = 1. + r;
1626 const double sp = 1. + s;
1628 h[0] = -0.25 * rm * sm * (s + r + 1);
1629 h[1] = -0.25 * rp * sm * (s - r + 1);
1630 h[2] = +0.25 * rp * sp * (s + r - 1);
1631 h[3] = +0.25 * rm * sp * (s - r - 1);
1632 h[4] = +0.50 * rm * rp * sm;
1633 h[5] = +0.50 * rp * sm * sp;
1634 h[6] = +0.50 * rm * rp * sp;
1635 h[7] = +0.50 * rm * sm * sp;
1638 static void eval_h_derived(
const double internal_coor[2],
double d[8][2]) {
1639 const double r = internal_coor[0];
1640 const double s = internal_coor[1];
1642 const double rm = 1. - r;
1643 const double sm = 1. - s;
1645 const double rp = 1. + r;
1646 const double sp = 1. + s;
1648 d[0][0] = +0.25 * sm * (s + 2 * r);
1649 d[1][0] = -0.25 * sm * (s - 2 * r);
1650 d[2][0] = +0.25 * sp * (s + 2 * r);
1651 d[3][0] = -0.25 * sp * (s - 2 * r);
1652 d[4][0] = -1.0 * r * sm;
1653 d[5][0] = +0.50 * sm * sp;
1654 d[6][0] = -1.0 * r * sp;
1655 d[7][0] = -0.50 * sm * sp;
1657 d[0][1] = +0.25 * rm * (2 * s + r);
1658 d[1][1] = +0.25 * rp * (2 * s - r);
1659 d[2][1] = +0.25 * rp * (2 * s + r);
1660 d[3][1] = +0.25 * rm * (2 * s - r);
1661 d[4][1] = -0.50 * rm * rp;
1662 d[5][1] = -1.0 * rp * s;
1663 d[6][1] = +0.50 * rm * rp;
1664 d[7][1] = -1.0 * rm * s;
1668 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
1669 eval_h(internal_coor, &h[0]);
1672 static void eval_h_derived(
1673 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
1674 d.resize(2, num_nodes);
1675 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
1679class Q9_Shape_Evaluator {
1681 static const int num_nodes = 9;
1682 static const int num_dimensions = 2;
1683 static const int order = 4;
1684 typedef IS_Q ischeme_type;
1686 static ischeme_type create_ischeme() {
1687 ischeme_type ischeme;
1688 ischeme[0].set_order(2);
1689 ischeme[1].set_order(2);
1693 static ischeme_type create_ischeme(SolidMechanics& property) {
1694 ischeme_type ischeme;
1695 ischeme[0].set_order(2 * 2);
1696 ischeme[1].set_order(2 * 2);
1697 ischeme.init(property);
1701 static const double r_node[9];
1702 static const double s_node[9];
1703 static const double t_node[9];
1705 static const char name[3];
1707 typedef L3_Shape_Evaluator edge_shape_type_0;
1708 typedef L3_Shape_Evaluator edge_shape_type_1;
1709 static const int num_edge = 4;
1710 static const int edge_node[4][3];
1711 static const int edge_type_index[4];
1713 typedef Q9_Shape_Evaluator face_shape_type_0;
1714 typedef Q9_Shape_Evaluator face_shape_type_1;
1715 static const int num_face = 2;
1716 static const int face_node[2][9];
1717 static const int face_type_index[2];
1718 static const bool is_t_face[2];
1720 static void eval_h(
const double internal_coor[2],
double h[9]) {
1721 const double r = internal_coor[0];
1722 const double s = internal_coor[1];
1724 const double rm = 1. - r;
1725 const double sm = 1. - s;
1727 const double rp = 1. + r;
1728 const double sp = 1. + s;
1730 h[0] = +0.25 * rm * r * sm * s;
1731 h[1] = -0.25 * r * rp * sm * s;
1732 h[2] = +0.25 * r * rp * s * sp;
1733 h[3] = -0.25 * rm * r * s * sp;
1734 h[4] = -0.50 * rm * rp * sm * s;
1735 h[5] = +0.50 * r * rp * sm * sp;
1736 h[6] = +0.50 * rm * rp * s * sp;
1737 h[7] = -0.50 * rm * r * sm * sp;
1738 h[8] = +1.0 * rm * rp * sm * sp;
1741 static void eval_h_derived(
const double internal_coor[2],
double d[9][2]) {
1742 const double r = internal_coor[0];
1743 const double s = internal_coor[1];
1745 const double rm = 1. - r;
1746 const double sm = 1. - s;
1748 const double rp = 1. + r;
1749 const double sp = 1. + s;
1751 d[0][0] = -0.25 * sm * s * (2 * r - 1);
1752 d[1][0] = -0.25 * sm * s * (2 * r + 1);
1753 d[2][0] = +0.25 * s * sp * (2 * r + 1);
1754 d[3][0] = +0.25 * s * sp * (2 * r - 1);
1755 d[4][0] = +1.0 * r * sm * s;
1756 d[5][0] = +0.50 * sm * sp * (2 * r + 1);
1757 d[6][0] = -1.0 * r * s * sp;
1758 d[7][0] = +0.50 * sm * sp * (2 * r - 1);
1759 d[8][0] = -2.00 * r * sm * sp;
1761 d[0][1] = -0.25 * rm * r * (2 * s - 1);
1762 d[1][1] = +0.25 * r * rp * (2 * s - 1);
1763 d[2][1] = +0.25 * r * rp * (2 * s + 1);
1764 d[3][1] = -0.25 * rm * r * (2 * s + 1);
1765 d[4][1] = +0.50 * rm * rp * (2 * s - 1);
1766 d[5][1] = -1.0 * r * rp * s;
1767 d[6][1] = +0.50 * rm * rp * (2 * s + 1);
1768 d[7][1] = +1.0 * rm * r * s;
1769 d[8][1] = -2.00 * rm * rp * s;
1773 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
1774 eval_h(internal_coor, &h[0]);
1777 static void eval_h_derived(
1778 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
1779 d.resize(2, num_nodes);
1780 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
1784class Q3X2_Shape_Evaluator {
1786 static const int num_nodes = 6;
1787 static const int num_dimensions = 2;
1788 static const int order = 3;
1789 typedef IS_Q ischeme_type;
1791 static ischeme_type create_ischeme() {
1792 ischeme_type ischeme;
1793 ischeme[0].set_order(2);
1794 ischeme[1].set_order(1);
1798 static ischeme_type create_ischeme(SolidMechanics& property) {
1799 ischeme_type ischeme;
1800 ischeme[0].set_order(2 * 2);
1801 ischeme[1].set_order(2 * 1);
1802 ischeme.init(property);
1806 static const double r_node[6];
1807 static const double s_node[6];
1808 static const double t_node[6];
1810 static const char name[5];
1812 typedef L3_Shape_Evaluator edge_shape_type_0;
1813 typedef L2_Shape_Evaluator edge_shape_type_1;
1814 static const int num_edge = 4;
1815 static const int edge_node[4][3];
1816 static const int edge_type_index[4];
1818 typedef Q3X2_Shape_Evaluator face_shape_type_0;
1819 typedef Q3X2_Shape_Evaluator face_shape_type_1;
1820 static const int num_face = 2;
1821 static const int face_node[2][6];
1822 static const int face_type_index[2];
1823 static const bool is_t_face[2];
1825 static void eval_h(
const double internal_coor[2],
double h[6]) {
1826 const double r = internal_coor[0];
1827 const double s = internal_coor[1];
1829 const double rm = r - 1;
1830 const double rp = r + 1;
1831 const double sm = s - 1;
1832 const double sp = s + 1;
1834 h[0] = -rm * r * sm * 0.25;
1835 h[1] = -r * rp * sm * 0.25;
1836 h[2] = +r * rp * sp * 0.25;
1837 h[3] = +rm * r * sp * 0.25;
1838 h[4] = +rm * rp * sm * 0.5;
1839 h[5] = -rm * rp * sp * 0.5;
1842 static void eval_h_derived(
const double internal_coor[2],
double d[6][2]) {
1843 const double r = internal_coor[0];
1844 const double s = internal_coor[1];
1846 const double rm = r - 1;
1847 const double rp = r + 1;
1848 const double sm = s - 1;
1849 const double sp = s + 1;
1851 d[0][0] = -(2 * r - 1) * sm * 0.25;
1852 d[1][0] = -(2 * r + 1) * sm * 0.25;
1853 d[2][0] = +(2 * r + 1) * sp * 0.25;
1854 d[3][0] = +(2 * r - 1) * sp * 0.25;
1857 d[0][1] = -rm * r * 0.25;
1858 d[1][1] = -r * rp * 0.25;
1859 d[2][1] = +r * rp * 0.25;
1860 d[3][1] = +rm * r * 0.25;
1861 d[4][1] = +rm * rp * 0.5;
1862 d[5][1] = -rm * rp * 0.5;
1866 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
1867 eval_h(internal_coor, &h[0]);
1870 static void eval_h_derived(
1871 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
1872 d.resize(2, num_nodes);
1873 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
1877class Q12_Shape_Evaluator {
1879 static const int num_nodes = 12;
1880 static const int num_dimensions = 2;
1881 static const int order = 6;
1882 typedef IS_Q ischeme_type;
1884 static ischeme_type create_ischeme() {
1885 ischeme_type ischeme;
1886 ischeme[0].set_order(3);
1887 ischeme[1].set_order(3);
1891 static ischeme_type create_ischeme(SolidMechanics& property) {
1892 ischeme_type ischeme;
1893 ischeme[0].set_order(2 * 3);
1894 ischeme[1].set_order(2 * 3);
1895 ischeme.init(property);
1899 static const double r_node[12];
1900 static const double s_node[12];
1901 static const double t_node[12];
1903 static const char name[4];
1905 typedef L4_Shape_Evaluator edge_shape_type_0;
1906 typedef L4_Shape_Evaluator edge_shape_type_1;
1907 static const int num_edge = 4;
1908 static const int edge_node[4][4];
1909 static const int edge_type_index[4];
1911 typedef Q12_Shape_Evaluator face_shape_type_0;
1912 typedef Q12_Shape_Evaluator face_shape_type_1;
1913 static const int num_face = 2;
1914 static const int face_node[2][12];
1915 static const int face_type_index[2];
1916 static const bool is_t_face[2];
1918 static void eval_h(
const double internal_coor[2],
double h[12]) {
1919 const double r = internal_coor[0];
1920 const double s = internal_coor[1];
1922 const double rm = r - 1;
1923 const double rp = r + 1;
1924 const double sm = s - 1;
1925 const double sp = s + 1;
1927 const double r3m = 3 * r - 1;
1928 const double r3p = 3 * r + 1;
1929 const double s3m = 3 * s - 1;
1930 const double s3p = 3 * s + 1;
1932 const double fa = 0.03125;
1934 h[0] = +rm * sm * (9 * s * s + 9 * r * r - 10) * fa;
1935 h[1] = -rp * sm * (9 * s * s + 9 * r * r - 10) * fa;
1936 h[2] = +rp * sp * (9 * s * s + 9 * r * r - 10) * fa;
1937 h[3] = -rm * sp * (9 * s * s + 9 * r * r - 10) * fa;
1938 h[4] = -9 * rm * rp * r3m * sm * fa;
1939 h[5] = +9 * rm * rp * r3p * sm * fa;
1940 h[6] = -9 * rm * sm * sp * s3m * fa;
1941 h[7] = +9 * rp * sm * sp * s3m * fa;
1942 h[8] = +9 * rm * sm * sp * s3p * fa;
1943 h[9] = -9 * rp * sm * sp * s3p * fa;
1944 h[10] = +9 * rm * rp * r3m * sp * fa;
1945 h[11] = -9 * rm * rp * r3p * sp * fa;
1948 static void eval_h_derived(
const double internal_coor[2],
double d[12][2]) {
1949 const double r = internal_coor[0];
1950 const double s = internal_coor[1];
1952 const double rm = r - 1;
1953 const double rp = r + 1;
1954 const double sm = s - 1;
1955 const double sp = s + 1;
1957 const double r3m = 3 * r - 1;
1958 const double r3p = 3 * r + 1;
1959 const double s3m = 3 * s - 1;
1960 const double s3p = 3 * s + 1;
1962 const double fa = 0.03125;
1964 d[0][0] = +sm * (9 * s * s + 27 * r * r - 18 * r - 10) * fa;
1965 d[1][0] = -sm * (9 * s * s + 27 * r * r + 18 * r - 10) * fa;
1966 d[2][0] = +sp * (9 * s * s + 27 * r * r + 18 * r - 10) * fa;
1967 d[3][0] = -sp * (9 * s * s + 27 * r * r - 18 * r - 10) * fa;
1968 d[4][0] = -9 * (9 * r * r - 2 * r - 3) * sm * fa;
1969 d[5][0] = +9 * (9 * r * r + 2 * r - 3) * sm * fa;
1970 d[6][0] = -9 * sm * sp * s3m * fa;
1971 d[7][0] = +9 * sm * sp * s3m * fa;
1972 d[8][0] = +9 * sm * sp * s3p * fa;
1973 d[9][0] = -9 * sm * sp * s3p * fa;
1974 d[10][0] = +9 * (9 * r * r - 2 * r - 3) * sp * fa;
1975 d[11][0] = -9 * (9 * r * r + 2 * r - 3) * sp * fa;
1976 d[0][1] = +rm * (27 * s * s - 18 * s + 9 * r * r - 10) * fa;
1977 d[1][1] = -rp * (27 * s * s - 18 * s + 9 * r * r - 10) * fa;
1978 d[2][1] = +rp * (27 * s * s + 18 * s + 9 * r * r - 10) * fa;
1979 d[3][1] = -rm * (27 * s * s + 18 * s + 9 * r * r - 10) * fa;
1980 d[4][1] = -9 * rm * rp * r3m * fa;
1981 d[5][1] = +9 * rm * rp * r3p * fa;
1982 d[6][1] = -9 * rm * (9 * s * s - 2 * s - 3) * fa;
1983 d[7][1] = +9 * rp * (9 * s * s - 2 * s - 3) * fa;
1984 d[8][1] = +9 * rm * (9 * s * s + 2 * s - 3) * fa;
1985 d[9][1] = -9 * rp * (9 * s * s + 2 * s - 3) * fa;
1986 d[10][1] = +9 * rm * rp * r3m * fa;
1987 d[11][1] = -9 * rm * rp * r3p * fa;
1991 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
1992 eval_h(internal_coor, &h[0]);
1995 static void eval_h_derived(
1996 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
1997 d.resize(2, num_nodes);
1998 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
2002class Q16_Shape_Evaluator {
2004 static const int num_nodes = 16;
2005 static const int num_dimensions = 2;
2006 static const int order = 6;
2007 typedef IS_Q ischeme_type;
2009 static ischeme_type create_ischeme() {
2010 ischeme_type ischeme;
2011 ischeme[0].set_order(3);
2012 ischeme[1].set_order(3);
2016 static ischeme_type create_ischeme(SolidMechanics& property) {
2017 ischeme_type ischeme;
2018 ischeme[0].set_order(2 * 3);
2019 ischeme[1].set_order(2 * 3);
2020 ischeme.init(property);
2024 static const double r_node[16];
2025 static const double s_node[16];
2026 static const double t_node[16];
2028 static const char name[4];
2030 typedef L4_Shape_Evaluator edge_shape_type_0;
2031 typedef L4_Shape_Evaluator edge_shape_type_1;
2032 static const int num_edge = 4;
2033 static const int edge_node[4][4];
2034 static const int edge_type_index[4];
2036 typedef Q16_Shape_Evaluator face_shape_type_0;
2037 typedef Q16_Shape_Evaluator face_shape_type_1;
2038 static const int num_face = 2;
2039 static const int face_node[2][16];
2040 static const int face_type_index[2];
2041 static const bool is_t_face[2];
2043 static void eval_h(
const double internal_coor[2],
double h[16]) {
2044 const double r = internal_coor[0];
2045 const double s = internal_coor[1];
2047 const double rm = r - 1;
2048 const double rp = r + 1;
2049 const double sm = s - 1;
2050 const double sp = s + 1;
2052 const double r3m = 3 * r - 1;
2053 const double r3p = 3 * r + 1;
2054 const double s3m = 3 * s - 1;
2055 const double s3p = 3 * s + 1;
2057 const double fa = 0.00390625;
2059 h[0] = +rm * r3m * r3p * sm * s3m * s3p * fa;
2060 h[1] = -rp * r3m * r3p * sm * s3m * s3p * fa;
2061 h[2] = +rp * r3m * r3p * sp * s3m * s3p * fa;
2062 h[3] = -rm * r3m * r3p * sp * s3m * s3p * fa;
2063 h[4] = -9 * rm * rp * r3m * sm * s3m * s3p * fa;
2064 h[5] = +9 * rm * rp * r3p * sm * s3m * s3p * fa;
2065 h[6] = -9 * rm * r3m * r3p * sm * sp * s3m * fa;
2066 h[7] = +81 * rm * rp * r3m * sm * sp * s3m * fa;
2067 h[8] = -81 * rm * rp * r3p * sm * sp * s3m * fa;
2068 h[9] = +9 * rp * r3m * r3p * sm * sp * s3m * fa;
2069 h[10] = +9 * rm * r3m * r3p * sm * sp * s3p * fa;
2070 h[11] = -81 * rm * rp * r3m * sm * sp * s3p * fa;
2071 h[12] = +81 * rm * rp * r3p * sm * sp * s3p * fa;
2072 h[13] = -9 * rp * r3m * r3p * sm * sp * s3p * fa;
2073 h[14] = +9 * rm * rp * r3m * sp * s3m * s3p * fa;
2074 h[15] = -9 * rm * rp * r3p * sp * s3m * s3p * fa;
2077 static void eval_h_derived(
const double internal_coor[2],
double d[16][2]) {
2078 const double r = internal_coor[0];
2079 const double s = internal_coor[1];
2081 const double rm = r - 1;
2082 const double rp = r + 1;
2083 const double sm = s - 1;
2084 const double sp = s + 1;
2086 const double r3m = 3 * r - 1;
2087 const double r3p = 3 * r + 1;
2088 const double s3m = 3 * s - 1;
2089 const double s3p = 3 * s + 1;
2091 const double fa = 0.00390625;
2093 d[0][0] = +(27 * r * r - 18 * r - 1) * sm * s3m * s3p * fa;
2094 d[1][0] = -(27 * r * r + 18 * r - 1) * sm * s3m * s3p * fa;
2095 d[2][0] = +(27 * r * r + 18 * r - 1) * sp * s3m * s3p * fa;
2096 d[3][0] = -(27 * r * r - 18 * r - 1) * sp * s3m * s3p * fa;
2097 d[4][0] = -9 * (9 * r * r - 2 * r - 3) * sm * s3m * s3p * fa;
2098 d[5][0] = +9 * (9 * r * r + 2 * r - 3) * sm * s3m * s3p * fa;
2099 d[6][0] = -9 * (27 * r * r - 18 * r - 1) * sm * sp * s3m * fa;
2100 d[7][0] = +81 * (9 * r * r - 2 * r - 3) * sm * sp * s3m * fa;
2101 d[8][0] = -81 * (9 * r * r + 2 * r - 3) * sm * sp * s3m * fa;
2102 d[9][0] = +9 * (27 * r * r + 18 * r - 1) * sm * sp * s3m * fa;
2103 d[10][0] = +9 * (27 * r * r - 18 * r - 1) * sm * sp * s3p * fa;
2104 d[11][0] = -81 * (9 * r * r - 2 * r - 3) * sm * sp * s3p * fa;
2105 d[12][0] = +81 * (9 * r * r + 2 * r - 3) * sm * sp * s3p * fa;
2106 d[13][0] = -9 * (27 * r * r + 18 * r - 1) * sm * sp * s3p * fa;
2107 d[14][0] = +9 * (9 * r * r - 2 * r - 3) * sp * s3m * s3p * fa;
2108 d[15][0] = -9 * (9 * r * r + 2 * r - 3) * sp * s3m * s3p * fa;
2109 d[0][1] = +rm * r3m * r3p * (27 * s * s - 18 * s - 1) * fa;
2110 d[1][1] = -rp * r3m * r3p * (27 * s * s - 18 * s - 1) * fa;
2111 d[2][1] = +rp * r3m * r3p * (27 * s * s + 18 * s - 1) * fa;
2112 d[3][1] = -rm * r3m * r3p * (27 * s * s + 18 * s - 1) * fa;
2113 d[4][1] = -9 * rm * rp * r3m * (27 * s * s - 18 * s - 1) * fa;
2114 d[5][1] = +9 * rm * rp * r3p * (27 * s * s - 18 * s - 1) * fa;
2115 d[6][1] = -9 * rm * r3m * r3p * (9 * s * s - 2 * s - 3) * fa;
2116 d[7][1] = +81 * rm * rp * r3m * (9 * s * s - 2 * s - 3) * fa;
2117 d[8][1] = -81 * rm * rp * r3p * (9 * s * s - 2 * s - 3) * fa;
2118 d[9][1] = +9 * rp * r3m * r3p * (9 * s * s - 2 * s - 3) * fa;
2119 d[10][1] = +9 * rm * r3m * r3p * (9 * s * s + 2 * s - 3) * fa;
2120 d[11][1] = -81 * rm * rp * r3m * (9 * s * s + 2 * s - 3) * fa;
2121 d[12][1] = +81 * rm * rp * r3p * (9 * s * s + 2 * s - 3) * fa;
2122 d[13][1] = -9 * rp * r3m * r3p * (9 * s * s + 2 * s - 3) * fa;
2123 d[14][1] = +9 * rm * rp * r3m * (27 * s * s + 18 * s - 1) * fa;
2124 d[15][1] = -9 * rm * rp * r3p * (27 * s * s + 18 * s - 1) * fa;
2128 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
2129 eval_h(internal_coor, &h[0]);
2132 static void eval_h_derived(
2133 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
2134 d.resize(2, num_nodes);
2135 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
2139class Q4X2_Shape_Evaluator {
2141 static const int num_nodes = 8;
2142 static const int num_dimensions = 2;
2143 static const int order = 4;
2144 typedef IS_Q ischeme_type;
2146 static ischeme_type create_ischeme() {
2147 ischeme_type ischeme;
2148 ischeme[0].set_order(3);
2149 ischeme[1].set_order(1);
2153 static ischeme_type create_ischeme(SolidMechanics& property) {
2154 ischeme_type ischeme;
2155 ischeme[0].set_order(2 * 3);
2156 ischeme[1].set_order(2 * 1);
2157 ischeme.init(property);
2161 static const double r_node[8];
2162 static const double s_node[8];
2163 static const double t_node[8];
2165 static const char name[5];
2167 typedef L4_Shape_Evaluator edge_shape_type_0;
2168 typedef L2_Shape_Evaluator edge_shape_type_1;
2169 static const int num_edge = 4;
2170 static const int edge_node[4][4];
2171 static const int edge_type_index[4];
2173 typedef Q4X2_Shape_Evaluator face_shape_type_0;
2174 typedef Q4X2_Shape_Evaluator face_shape_type_1;
2175 static const int num_face = 2;
2176 static const int face_node[2][8];
2177 static const int face_type_index[2];
2178 static const bool is_t_face[2];
2180 static void eval_h(
const double internal_coor[2],
double h[8]) {
2181 const double r = internal_coor[0];
2182 const double s = internal_coor[1];
2184 const double rm = r - 1;
2185 const double rp = r + 1;
2186 const double sm = s - 1;
2187 const double sp = s + 1;
2189 const double r3m = 3 * r - 1;
2190 const double r3p = 3 * r + 1;
2192 h[0] = +rm * r3m * r3p * sm / 32;
2193 h[1] = -rp * r3m * r3p * sm / 32;
2194 h[2] = +rp * r3m * r3p * sp / 32;
2195 h[3] = -rm * r3m * r3p * sp / 32;
2196 h[4] = -9 * rm * rp * r3m * sm / 32;
2197 h[5] = +9 * rm * rp * r3p * sm / 32;
2198 h[6] = +9 * rm * rp * r3m * sp / 32;
2199 h[7] = -9 * rm * rp * r3p * sp / 32;
2202 static void eval_h_derived(
const double internal_coor[2],
double d[8][2]) {
2203 const double r = internal_coor[0];
2204 const double s = internal_coor[1];
2206 const double rm = r - 1;
2207 const double rp = r + 1;
2208 const double sm = s - 1;
2209 const double sp = s + 1;
2211 const double r3m = 3 * r - 1;
2212 const double r3p = 3 * r + 1;
2214 d[0][0] = +(27 * r * r - 18 * r - 1) * sm / 32;
2215 d[1][0] = -(27 * r * r + 18 * r - 1) * sm / 32;
2216 d[2][0] = +(27 * r * r + 18 * r - 1) * sp / 32;
2217 d[3][0] = -(27 * r * r - 18 * r - 1) * sp / 32;
2218 d[4][0] = -9 * (9 * r * r - 2 * r - 3) * sm / 32;
2219 d[5][0] = +9 * (9 * r * r + 2 * r - 3) * sm / 32;
2220 d[6][0] = +9 * (9 * r * r - 2 * r - 3) * sp / 32;
2221 d[7][0] = -9 * (9 * r * r + 2 * r - 3) * sp / 32;
2222 d[0][1] = +rm * r3m * r3p / 32;
2223 d[1][1] = -rp * r3m * r3p / 32;
2224 d[2][1] = +rp * r3m * r3p / 32;
2225 d[3][1] = -rm * r3m * r3p / 32;
2226 d[4][1] = -9 * rm * rp * r3m / 32;
2227 d[5][1] = +9 * rm * rp * r3p / 32;
2228 d[6][1] = +9 * rm * rp * r3m / 32;
2229 d[7][1] = -9 * rm * rp * r3p / 32;
2233 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
2234 eval_h(internal_coor, &h[0]);
2237 static void eval_h_derived(
2238 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
2239 d.resize(2, num_nodes);
2240 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
2244class Q4X3_Shape_Evaluator {
2246 static const int num_nodes = 12;
2247 static const int num_dimensions = 2;
2248 static const int order = 5;
2249 typedef IS_Q ischeme_type;
2251 static ischeme_type create_ischeme() {
2252 ischeme_type ischeme;
2253 ischeme[0].set_order(3);
2254 ischeme[1].set_order(2);
2258 static ischeme_type create_ischeme(SolidMechanics& property) {
2259 ischeme_type ischeme;
2260 ischeme[0].set_order(2 * 3);
2261 ischeme[1].set_order(2 * 2);
2262 ischeme.init(property);
2266 static const double r_node[12];
2267 static const double s_node[12];
2268 static const double t_node[12];
2270 static const char name[5];
2272 typedef L4_Shape_Evaluator edge_shape_type_0;
2273 typedef L3_Shape_Evaluator edge_shape_type_1;
2274 static const int num_edge = 4;
2275 static const int edge_node[4][4];
2276 static const int edge_type_index[4];
2278 typedef Q4X3_Shape_Evaluator face_shape_type_0;
2279 typedef Q4X3_Shape_Evaluator face_shape_type_1;
2280 static const int num_face = 2;
2281 static const int face_node[2][12];
2282 static const int face_type_index[2];
2283 static const bool is_t_face[2];
2285 static void eval_h(
const double internal_coor[2],
double h[12]) {
2286 const double r = internal_coor[0];
2287 const double s = internal_coor[1];
2289 const double rm = r - 1;
2290 const double rp = r + 1;
2291 const double sm = s - 1;
2292 const double sp = s + 1;
2294 const double r3m = 3 * r - 1;
2295 const double r3p = 3 * r + 1;
2297 h[0] = -(rm * r3m * r3p * sm * s) / 32;
2298 h[1] = +(rp * r3m * r3p * sm * s) / 32;
2299 h[2] = +(rp * r3m * r3p * s * sp) / 32;
2300 h[3] = -(rm * r3m * r3p * s * sp) / 32;
2301 h[4] = +(9 * rm * rp * r3m * sm * s) / 32;
2302 h[5] = -(9 * rm * rp * r3p * sm * s) / 32;
2303 h[6] = +(rm * r3m * r3p * sm * sp) / 16;
2304 h[7] = -(9 * rm * rp * r3m * sm * sp) / 16;
2305 h[8] = +(9 * rm * rp * r3p * sm * sp) / 16;
2306 h[9] = -(rp * r3m * r3p * sm * sp) / 16;
2307 h[10] = +(9 * rm * rp * r3m * s * sp) / 32;
2308 h[11] = -(9 * rm * rp * r3p * s * sp) / 32;
2311 static void eval_h_derived(
const double internal_coor[2],
double d[8][2]) {
2312 const double r = internal_coor[0];
2313 const double s = internal_coor[1];
2315 const double rm = r - 1;
2316 const double rp = r + 1;
2317 const double sm = s - 1;
2318 const double sp = s + 1;
2320 const double s2m = 2 * s - 1;
2321 const double s2p = 2 * s + 1;
2322 const double r3m = 3 * r - 1;
2323 const double r3p = 3 * r + 1;
2325 d[0][0] = -((27 * r * r - 18 * r - 1) * sm * s) / 32;
2326 d[1][0] = +((27 * r * r + 18 * r - 1) * sm * s) / 32;
2327 d[2][0] = +((27 * r * r + 18 * r - 1) * s * sp) / 32;
2328 d[3][0] = -((27 * r * r - 18 * r - 1) * s * sp) / 32;
2329 d[4][0] = +(9 * (9 * r * r - 2 * r - 3) * sm * s) / 32;
2330 d[5][0] = -(9 * (9 * r * r + 2 * r - 3) * sm * s) / 32;
2331 d[6][0] = +((27 * r * r - 18 * r - 1) * sm * sp) / 16;
2332 d[7][0] = -(9 * (9 * r * r - 2 * r - 3) * sm * sp) / 16;
2333 d[8][0] = +(9 * (9 * r * r + 2 * r - 3) * sm * sp) / 16;
2334 d[9][0] = -((27 * r * r + 18 * r - 1) * sm * sp) / 16;
2335 d[10][0] = +(9 * (9 * r * r - 2 * r - 3) * s * sp) / 32;
2336 d[11][0] = -(9 * (9 * r * r + 2 * r - 3) * s * sp) / 32;
2337 d[0][1] = -(rm * r3m * r3p * s2m) / 32;
2338 d[1][1] = +(rp * r3m * r3p * s2m) / 32;
2339 d[2][1] = +(rp * r3m * r3p * s2p) / 32;
2340 d[3][1] = -(rm * r3m * r3p * s2p) / 32;
2341 d[4][1] = +(9 * rm * rp * r3m * s2m) / 32;
2342 d[5][1] = -(9 * rm * rp * r3p * s2m) / 32;
2343 d[6][1] = +(rm * r3m * r3p * s) / 8;
2344 d[7][1] = -(9 * rm * rp * r3m * s) / 8;
2345 d[8][1] = +(9 * rm * rp * r3p * s) / 8;
2346 d[9][1] = -(rp * r3m * r3p * s) / 8;
2347 d[10][1] = +(9 * rm * rp * r3m * s2p) / 32;
2348 d[11][1] = -(9 * rm * rp * r3p * s2p) / 32;
2352 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
2353 eval_h(internal_coor, &h[0]);
2356 static void eval_h_derived(
2357 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
2358 d.resize(2, num_nodes);
2359 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
2363class Q25_Shape_Evaluator {
2365 static const int num_nodes = 25;
2366 static const int num_dimensions = 2;
2367 static const int order = 4;
2368 typedef IS_Q ischeme_type;
2370 static ischeme_type create_ischeme() {
2371 ischeme_type ischeme;
2372 ischeme[0].set_order(4);
2373 ischeme[1].set_order(4);
2377 static ischeme_type create_ischeme(SolidMechanics& property) {
2378 ischeme_type ischeme;
2379 ischeme[0].set_order(2 * 4);
2380 ischeme[1].set_order(2 * 4);
2381 ischeme.init(property);
2385 static const double r_node[25];
2386 static const double s_node[25];
2387 static const double t_node[25];
2389 static const char name[4];
2391 typedef L5_Shape_Evaluator edge_shape_type_0;
2392 typedef L5_Shape_Evaluator edge_shape_type_1;
2393 static const int num_edge = 4;
2394 static const int edge_node[4][5];
2395 static const int edge_type_index[4];
2397 typedef Q25_Shape_Evaluator face_shape_type_0;
2398 typedef Q25_Shape_Evaluator face_shape_type_1;
2399 static const int num_face = 2;
2400 static const int face_node[2][25];
2401 static const int face_type_index[2];
2402 static const bool is_t_face[2];
2404 static void eval_h(
const double internal_coor[2],
double h[25]) {
2405 const double r = internal_coor[0];
2406 const double s = internal_coor[1];
2408 const double rm = r - 1;
2409 const double rp = r + 1;
2410 const double sm = s - 1;
2411 const double sp = s + 1;
2413 const double r2m = 2 * r - 1;
2414 const double r2p = 2 * r + 1;
2415 const double s2m = 2 * s - 1;
2416 const double s2p = 2 * s + 1;
2418 h[0] = +rm * r * r2m * r2p * sm * s * s2m * s2p / 36;
2419 h[1] = +r * rp * r2m * r2p * sm * s * s2m * s2p / 36;
2420 h[2] = +r * rp * r2m * r2p * s * sp * s2m * s2p / 36;
2421 h[3] = +rm * r * r2m * r2p * s * sp * s2m * s2p / 36;
2422 h[4] = -2 * rm * r * rp * r2m * sm * s * s2m * s2p / 9;
2423 h[5] = +rm * rp * r2m * r2p * sm * s * s2m * s2p / 6;
2424 h[6] = -2 * rm * r * rp * r2p * sm * s * s2m * s2p / 9;
2425 h[7] = -2 * rm * r * r2m * r2p * sm * s * sp * s2m / 9;
2426 h[8] = +16 * rm * r * rp * r2m * sm * s * sp * s2m / 9;
2427 h[9] = -4 * rm * rp * r2m * r2p * sm * s * sp * s2m / 3;
2428 h[10] = +16 * rm * r * rp * r2p * sm * s * sp * s2m / 9;
2429 h[11] = -2 * r * rp * r2m * r2p * sm * s * sp * s2m / 9;
2430 h[12] = +rm * r * r2m * r2p * sm * sp * s2m * s2p / 6;
2431 h[13] = -4 * rm * r * rp * r2m * sm * sp * s2m * s2p / 3;
2432 h[14] = +rm * rp * r2m * r2p * sm * sp * s2m * s2p;
2433 h[15] = -4 * rm * r * rp * r2p * sm * sp * s2m * s2p / 3;
2434 h[16] = +r * rp * r2m * r2p * sm * sp * s2m * s2p / 6;
2435 h[17] = -2 * rm * r * r2m * r2p * sm * s * sp * s2p / 9;
2436 h[18] = +16 * rm * r * rp * r2m * sm * s * sp * s2p / 9;
2437 h[19] = -4 * rm * rp * r2m * r2p * sm * s * sp * s2p / 3;
2438 h[20] = +16 * rm * r * rp * r2p * sm * s * sp * s2p / 9;
2439 h[21] = -2 * r * rp * r2m * r2p * sm * s * sp * s2p / 9;
2440 h[22] = -2 * rm * r * rp * r2m * s * sp * s2m * s2p / 9;
2441 h[23] = +rm * rp * r2m * r2p * s * sp * s2m * s2p / 6;
2442 h[24] = -2 * rm * r * rp * r2p * s * sp * s2m * s2p / 9;
2445 static void eval_h_derived(
const double internal_coor[2],
double d[25][2]) {
2446 const double r = internal_coor[0];
2447 const double s = internal_coor[1];
2449 const double rm = r - 1;
2450 const double rp = r + 1;
2451 const double sm = s - 1;
2452 const double sp = s + 1;
2454 const double r2m = 2 * r - 1;
2455 const double r2p = 2 * r + 1;
2456 const double s2m = 2 * s - 1;
2457 const double s2p = 2 * s + 1;
2459 const double r4m = 4 * r - 1;
2460 const double r4p = 4 * r + 1;
2461 const double s4m = 4 * s - 1;
2462 const double s4p = 4 * s + 1;
2464 const double rr = r * r;
2465 const double ss = s * s;
2467 d[0][0] = +r4m * (4 * rr - 2 * r - 1) * sm * s * s2m * s2p / 36;
2468 d[1][0] = +r4p * (4 * rr + 2 * r - 1) * sm * s * s2m * s2p / 36;
2469 d[2][0] = +r4p * (4 * rr + 2 * r - 1) * s * sp * s2m * s2p / 36;
2470 d[3][0] = +r4m * (4 * rr - 2 * r - 1) * s * sp * s2m * s2p / 36;
2471 d[4][0] = -2 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * s2m * s2p / 9;
2472 d[5][0] = +r * (8 * rr - 5) * sm * s * s2m * s2p / 3;
2473 d[6][0] = -2 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * s2m * s2p / 9;
2474 d[7][0] = -2 * r4m * (4 * rr - 2 * r - 1) * sm * s * sp * s2m / 9;
2475 d[8][0] = +16 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * sp * s2m / 9;
2476 d[9][0] = -8 * r * (8 * rr - 5) * sm * s * sp * s2m / 3;
2477 d[10][0] = +16 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * sp * s2m / 9;
2478 d[11][0] = -2 * r4p * (4 * rr + 2 * r - 1) * sm * s * sp * s2m / 9;
2479 d[12][0] = +r4m * (4 * rr - 2 * r - 1) * sm * sp * s2m * s2p / 6;
2480 d[13][0] = -4 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * sp * s2m * s2p / 3;
2481 d[14][0] = +2 * r * (8 * rr - 5) * sm * sp * s2m * s2p;
2482 d[15][0] = -4 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * sp * s2m * s2p / 3;
2483 d[16][0] = +r4p * (4 * rr + 2 * r - 1) * sm * sp * s2m * s2p / 6;
2484 d[17][0] = -2 * r4m * (4 * rr - 2 * r - 1) * sm * s * sp * s2p / 9;
2485 d[18][0] = +16 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * sp * s2p / 9;
2486 d[19][0] = -8 * r * (8 * rr - 5) * sm * s * sp * s2p / 3;
2487 d[20][0] = +16 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * sp * s2p / 9;
2488 d[21][0] = -2 * r4p * (4 * rr + 2 * r - 1) * sm * s * sp * s2p / 9;
2489 d[22][0] = -2 * (8 * rr * r - 3 * rr - 4 * r + 1) * s * sp * s2m * s2p / 9;
2490 d[23][0] = +r * (8 * rr - 5) * s * sp * s2m * s2p / 3;
2491 d[24][0] = -2 * (8 * rr * r + 3 * rr - 4 * r - 1) * s * sp * s2m * s2p / 9;
2492 d[0][1] = +rm * r * r2m * r2p * s4m * (4 * ss - 2 * s - 1) / 36;
2493 d[1][1] = +r * rp * r2m * r2p * s4m * (4 * ss - 2 * s - 1) / 36;
2494 d[2][1] = +r * rp * r2m * r2p * s4p * (4 * ss + 2 * s - 1) / 36;
2495 d[3][1] = +rm * r * r2m * r2p * s4p * (4 * ss + 2 * s - 1) / 36;
2496 d[4][1] = -2 * rm * r * rp * r2m * s4m * (4 * ss - 2 * s - 1) / 9;
2497 d[5][1] = +rm * rp * r2m * r2p * s4m * (4 * ss - 2 * s - 1) / 6;
2498 d[6][1] = -2 * rm * r * rp * r2p * s4m * (4 * ss - 2 * s - 1) / 9;
2499 d[7][1] = -2 * rm * r * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) / 9;
2500 d[8][1] = +16 * rm * r * rp * r2m * (8 * ss * s - 3 * ss - 4 * s + 1) / 9;
2501 d[9][1] = -4 * rm * rp * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) / 3;
2502 d[10][1] = +16 * rm * r * rp * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) / 9;
2503 d[11][1] = -2 * r * rp * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) / 9;
2504 d[12][1] = +rm * r * r2m * r2p * s * (8 * ss - 5) / 3;
2505 d[13][1] = -8 * rm * r * rp * r2m * s * (8 * ss - 5) / 3;
2506 d[14][1] = +2 * rm * rp * r2m * r2p * s * (8 * ss - 5);
2507 d[15][1] = -8 * rm * r * rp * r2p * s * (8 * ss - 5) / 3;
2508 d[16][1] = +r * rp * r2m * r2p * s * (8 * ss - 5) / 3;
2509 d[17][1] = -2 * rm * r * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) / 9;
2510 d[18][1] = +16 * rm * r * rp * r2m * (8 * ss * s + 3 * ss - 4 * s - 1) / 9;
2511 d[19][1] = -4 * rm * rp * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) / 3;
2512 d[20][1] = +16 * rm * r * rp * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) / 9;
2513 d[21][1] = -2 * r * rp * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) / 9;
2514 d[22][1] = -2 * rm * r * rp * r2m * s4p * (4 * ss + 2 * s - 1) / 9;
2515 d[23][1] = +rm * rp * r2m * r2p * s4p * (4 * ss + 2 * s - 1) / 6;
2516 d[24][1] = -2 * rm * r * rp * r2p * s4p * (4 * ss + 2 * s - 1) / 9;
2520 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
2521 eval_h(internal_coor, &h[0]);
2524 static void eval_h_derived(
2525 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
2526 d.resize(2, num_nodes);
2527 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
2531class Q5X2_Shape_Evaluator {
2533 static const int num_nodes = 10;
2534 static const int num_dimensions = 2;
2535 static const int order = 5;
2536 typedef IS_Q ischeme_type;
2538 static ischeme_type create_ischeme() {
2539 ischeme_type ischeme;
2540 ischeme[0].set_order(4);
2541 ischeme[1].set_order(1);
2545 static ischeme_type create_ischeme(SolidMechanics& property) {
2546 ischeme_type ischeme;
2547 ischeme[0].set_order(2 * 4);
2548 ischeme[1].set_order(2 * 1);
2549 ischeme.init(property);
2553 static const double r_node[10];
2554 static const double s_node[10];
2555 static const double t_node[10];
2557 static const char name[5];
2559 typedef L5_Shape_Evaluator edge_shape_type_0;
2560 typedef L2_Shape_Evaluator edge_shape_type_1;
2561 static const int num_edge = 4;
2562 static const int edge_node[4][5];
2563 static const int edge_type_index[4];
2565 typedef Q5X2_Shape_Evaluator face_shape_type_0;
2566 typedef Q5X2_Shape_Evaluator face_shape_type_1;
2567 static const int num_face = 2;
2568 static const int face_node[2][10];
2569 static const int face_type_index[2];
2570 static const bool is_t_face[2];
2572 static void eval_h(
const double internal_coor[2],
double h[10]) {
2573 const double r = internal_coor[0];
2574 const double s = internal_coor[1];
2576 const double rm = r - 1;
2577 const double rp = r + 1;
2578 const double sm = s - 1;
2579 const double sp = s + 1;
2581 const double r2m = 2 * r - 1;
2582 const double r2p = 2 * r + 1;
2584 h[0] = -rm * r * r2m * r2p * sm / 12;
2585 h[1] = -r * rp * r2m * r2p * sm / 12;
2586 h[2] = +rm * r * r2m * r2p * sp / 12;
2587 h[3] = +r * rp * r2m * r2p * sp / 12;
2588 h[4] = +2 * rm * r * rp * r2m * sm / 3;
2589 h[5] = -rm * rp * r2m * r2p * sm / 2;
2590 h[6] = +2 * rm * r * rp * r2p * sm / 3;
2591 h[7] = -2 * rm * r * rp * r2m * sp / 3;
2592 h[8] = +rm * rp * r2m * r2p * sp / 2;
2593 h[9] = -2 * rm * r * rp * r2p * sp / 3;
2596 static void eval_h_derived(
const double internal_coor[2],
double d[10][2]) {
2597 const double r = internal_coor[0];
2598 const double s = internal_coor[1];
2600 const double rm = r - 1;
2601 const double rp = r + 1;
2602 const double sm = s - 1;
2603 const double sp = s + 1;
2605 const double r2m = 2 * r - 1;
2606 const double r2p = 2 * r + 1;
2608 const double r4m = 4 * r - 1;
2609 const double r4p = 4 * r + 1;
2611 const double rr = r * r;
2613 d[0][0] = -r4m * (4 * rr - 2 * r - 1) * sm / 12;
2614 d[1][0] = -r4p * (4 * rr + 2 * r - 1) * sm / 12;
2615 d[2][0] = +r4m * (4 * rr - 2 * r - 1) * sp / 12;
2616 d[3][0] = +r4p * (4 * rr + 2 * r - 1) * sp / 12;
2617 d[4][0] = +2 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm / 3;
2618 d[5][0] = -r * (8 * rr - 5) * sm;
2619 d[6][0] = +2 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm / 3;
2620 d[7][0] = -2 * (8 * rr * r - 3 * rr - 4 * r + 1) * sp / 3;
2621 d[8][0] = +r * (8 * rr - 5) * sp;
2622 d[9][0] = -2 * (8 * rr * r + 3 * rr - 4 * r - 1) * sp / 3;
2623 d[0][1] = -rm * r * r2m * r2p / 12;
2624 d[1][1] = -r * rp * r2m * r2p / 12;
2625 d[2][1] = +rm * r * r2m * r2p / 12;
2626 d[3][1] = +r * rp * r2m * r2p / 12;
2627 d[4][1] = +2 * rm * r * rp * r2m / 3;
2628 d[5][1] = -rm * rp * r2m * r2p / 2;
2629 d[6][1] = +2 * rm * r * rp * r2p / 3;
2630 d[7][1] = -2 * rm * r * rp * r2m / 3;
2631 d[8][1] = +rm * rp * r2m * r2p / 2;
2632 d[9][1] = -2 * rm * r * rp * r2p / 3;
2636 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
2637 eval_h(internal_coor, &h[0]);
2640 static void eval_h_derived(
2641 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
2642 d.resize(2, num_nodes);
2643 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
2647class Q36_Shape_Evaluator {
2649 static const int num_nodes = 36;
2650 static const int num_dimensions = 2;
2651 static const int order = 5;
2652 typedef IS_Q ischeme_type;
2654 static ischeme_type create_ischeme() {
2655 ischeme_type ischeme;
2656 ischeme[0].set_order(5);
2657 ischeme[1].set_order(5);
2661 static ischeme_type create_ischeme(SolidMechanics& property) {
2662 ischeme_type ischeme;
2663 ischeme[0].set_order(2 * 5);
2664 ischeme[1].set_order(2 * 5);
2665 ischeme.init(property);
2669 static const double r_node[36];
2670 static const double s_node[36];
2671 static const double t_node[36];
2673 static const char name[4];
2675 typedef L6_Shape_Evaluator edge_shape_type_0;
2676 typedef L6_Shape_Evaluator edge_shape_type_1;
2677 static const int num_edge = 4;
2678 static const int edge_node[4][6];
2679 static const int edge_type_index[4];
2681 typedef Q36_Shape_Evaluator face_shape_type_0;
2682 typedef Q36_Shape_Evaluator face_shape_type_1;
2683 static const int num_face = 2;
2684 static const int face_node[2][36];
2685 static const int face_type_index[2];
2686 static const bool is_t_face[2];
2688 static void eval_h(
const double internal_coor[2],
double h[36]) {
2689 const double r = internal_coor[0];
2690 const double s = internal_coor[1];
2691 const double rm = r - 1;
2692 const double rp = r + 1;
2693 const double sm = s - 1;
2694 const double sp = s + 1;
2696 h[0] = +(rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * (5 * s - 3)
2697 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2699 h[1] = -(rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * (5 * s - 3)
2700 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2702 h[2] = +(rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sp * (5 * s - 3)
2703 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2705 h[3] = -(rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sp * (5 * s - 3)
2706 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2708 h[4] = -(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * sm * (5 * s - 3)
2709 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2711 h[5] = +(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3) * sm * (5 * s - 3)
2712 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2714 h[6] = -(25 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3) * sm * (5 * s - 3)
2715 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2717 h[7] = +(25 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * (5 * s - 3)
2718 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2720 h[8] = -(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2721 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2723 h[9] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * sm * sp * (5 * s - 3)
2724 * (5 * s - 1) * (5 * s + 1))
2726 h[10] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2727 * (5 * s - 1) * (5 * s + 1))
2729 h[11] = +(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2730 * (5 * s - 1) * (5 * s + 1))
2732 h[12] = -(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2733 * (5 * s - 1) * (5 * s + 1))
2735 h[13] = +(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2736 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2738 h[14] = +(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2739 * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2741 h[15] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * sm * sp * (5 * s - 3)
2742 * (5 * s - 1) * (5 * s + 3))
2744 h[16] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2745 * (5 * s - 1) * (5 * s + 3))
2747 h[17] = -(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2748 * (5 * s - 1) * (5 * s + 3))
2750 h[18] = +(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2751 * (5 * s - 1) * (5 * s + 3))
2753 h[19] = -(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2754 * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2756 h[20] = -(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2757 * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2759 h[21] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * sm * sp * (5 * s - 3)
2760 * (5 * s + 1) * (5 * s + 3))
2762 h[22] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2763 * (5 * s + 1) * (5 * s + 3))
2765 h[23] = +(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2766 * (5 * s + 1) * (5 * s + 3))
2768 h[24] = -(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 3)
2769 * (5 * s + 1) * (5 * s + 3))
2771 h[25] = +(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2772 * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2774 h[26] = +(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2775 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2777 h[27] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * sm * sp * (5 * s - 1)
2778 * (5 * s + 1) * (5 * s + 3))
2780 h[28] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3) * sm * sp * (5 * s - 1)
2781 * (5 * s + 1) * (5 * s + 3))
2783 h[29] = -(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 1)
2784 * (5 * s + 1) * (5 * s + 3))
2786 h[30] = +(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp * (5 * s - 1)
2787 * (5 * s + 1) * (5 * s + 3))
2789 h[31] = -(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sm * sp
2790 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2792 h[32] = +(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * sp * (5 * s - 3)
2793 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2795 h[33] = -(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3) * sp * (5 * s - 3)
2796 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2798 h[34] = +(25 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3) * sp * (5 * s - 3)
2799 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2801 h[35] = -(25 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3) * sp * (5 * s - 3)
2802 * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2806 static void eval_h_derived(
const double internal_coor[2],
double d[36][2]) {
2807 const double r = internal_coor[0];
2808 const double s = internal_coor[1];
2809 const double rm = r - 1;
2810 const double rp = r + 1;
2811 const double sm = s - 1;
2812 const double sp = s + 1;
2813 d[0][0] = +((3125 * r * r * r * r - 2500 * r * r * r - 750 * r * r + 500 * r + 9) * sm
2814 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2816 d[1][0] = -((3125 * r * r * r * r + 2500 * r * r * r - 750 * r * r - 500 * r + 9) * sm
2817 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2819 d[2][0] = +((3125 * r * r * r * r + 2500 * r * r * r - 750 * r * r - 500 * r + 9) * sp
2820 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2822 d[3][0] = -((3125 * r * r * r * r - 2500 * r * r * r - 750 * r * r + 500 * r + 9) * sp
2823 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2825 d[4][0] = -(25 * (625 * r * r * r * r - 300 * r * r * r - 390 * r * r + 156 * r + 5) * sm
2826 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2828 d[5][0] = +(25 * (625 * r * r * r * r - 100 * r * r * r - 510 * r * r + 68 * r + 45) * sm
2829 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2831 d[6][0] = -(25 * (625 * r * r * r * r + 100 * r * r * r - 510 * r * r - 68 * r + 45) * sm
2832 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2834 d[7][0] = +(25 * (625 * r * r * r * r + 300 * r * r * r - 390 * r * r - 156 * r + 5) * sm
2835 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2837 d[8][0] = -(25 * (3125 * r * r * r * r - 2500 * r * r * r - 750 * r * r + 500 * r + 9) * sm
2838 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2840 d[9][0] = +(625 * (625 * r * r * r * r - 300 * r * r * r - 390 * r * r + 156 * r + 5) * sm
2841 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2843 d[10][0] = -(625 * (625 * r * r * r * r - 100 * r * r * r - 510 * r * r + 68 * r + 45) * sm
2844 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2846 d[11][0] = +(625 * (625 * r * r * r * r + 100 * r * r * r - 510 * r * r - 68 * r + 45) * sm
2847 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2849 d[12][0] = -(625 * (625 * r * r * r * r + 300 * r * r * r - 390 * r * r - 156 * r + 5) * sm
2850 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2852 d[13][0] = +(25 * (3125 * r * r * r * r + 2500 * r * r * r - 750 * r * r - 500 * r + 9) * sm
2853 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 1))
2855 d[14][0] = +(25 * (3125 * r * r * r * r - 2500 * r * r * r - 750 * r * r + 500 * r + 9) * sm
2856 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2858 d[15][0] = -(625 * (625 * r * r * r * r - 300 * r * r * r - 390 * r * r + 156 * r + 5) * sm
2859 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2861 d[16][0] = +(625 * (625 * r * r * r * r - 100 * r * r * r - 510 * r * r + 68 * r + 45) * sm
2862 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2864 d[17][0] = -(625 * (625 * r * r * r * r + 100 * r * r * r - 510 * r * r - 68 * r + 45) * sm
2865 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2867 d[18][0] = +(625 * (625 * r * r * r * r + 300 * r * r * r - 390 * r * r - 156 * r + 5) * sm
2868 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2870 d[19][0] = -(25 * (3125 * r * r * r * r + 2500 * r * r * r - 750 * r * r - 500 * r + 9) * sm
2871 * sp * (5 * s - 3) * (5 * s - 1) * (5 * s + 3))
2873 d[20][0] = -(25 * (3125 * r * r * r * r - 2500 * r * r * r - 750 * r * r + 500 * r + 9) * sm
2874 * sp * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2876 d[21][0] = +(625 * (625 * r * r * r * r - 300 * r * r * r - 390 * r * r + 156 * r + 5) * sm
2877 * sp * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2879 d[22][0] = -(625 * (625 * r * r * r * r - 100 * r * r * r - 510 * r * r + 68 * r + 45) * sm
2880 * sp * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2882 d[23][0] = +(625 * (625 * r * r * r * r + 100 * r * r * r - 510 * r * r - 68 * r + 45) * sm
2883 * sp * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2885 d[24][0] = -(625 * (625 * r * r * r * r + 300 * r * r * r - 390 * r * r - 156 * r + 5) * sm
2886 * sp * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2888 d[25][0] = +(25 * (3125 * r * r * r * r + 2500 * r * r * r - 750 * r * r - 500 * r + 9) * sm
2889 * sp * (5 * s - 3) * (5 * s + 1) * (5 * s + 3))
2891 d[26][0] = +(25 * (3125 * r * r * r * r - 2500 * r * r * r - 750 * r * r + 500 * r + 9) * sm
2892 * sp * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2894 d[27][0] = -(625 * (625 * r * r * r * r - 300 * r * r * r - 390 * r * r + 156 * r + 5) * sm
2895 * sp * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2897 d[28][0] = +(625 * (625 * r * r * r * r - 100 * r * r * r - 510 * r * r + 68 * r + 45) * sm
2898 * sp * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2900 d[29][0] = -(625 * (625 * r * r * r * r + 100 * r * r * r - 510 * r * r - 68 * r + 45) * sm
2901 * sp * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2903 d[30][0] = +(625 * (625 * r * r * r * r + 300 * r * r * r - 390 * r * r - 156 * r + 5) * sm
2904 * sp * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2906 d[31][0] = -(25 * (3125 * r * r * r * r + 2500 * r * r * r - 750 * r * r - 500 * r + 9) * sm
2907 * sp * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2909 d[32][0] = +(25 * (625 * r * r * r * r - 300 * r * r * r - 390 * r * r + 156 * r + 5) * sp
2910 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2912 d[33][0] = -(25 * (625 * r * r * r * r - 100 * r * r * r - 510 * r * r + 68 * r + 45) * sp
2913 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2915 d[34][0] = +(25 * (625 * r * r * r * r + 100 * r * r * r - 510 * r * r - 68 * r + 45) * sp
2916 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2918 d[35][0] = -(25 * (625 * r * r * r * r + 300 * r * r * r - 390 * r * r - 156 * r + 5) * sp
2919 * (5 * s - 3) * (5 * s - 1) * (5 * s + 1) * (5 * s + 3))
2921 d[0][1] = +(rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2922 * (3125 * s * s * s * s - 2500 * s * s * s - 750 * s * s + 500 * s + 9))
2924 d[1][1] = -(rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2925 * (3125 * s * s * s * s - 2500 * s * s * s - 750 * s * s + 500 * s + 9))
2927 d[2][1] = +(rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2928 * (3125 * s * s * s * s + 2500 * s * s * s - 750 * s * s - 500 * s + 9))
2930 d[3][1] = -(rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2931 * (3125 * s * s * s * s + 2500 * s * s * s - 750 * s * s - 500 * s + 9))
2933 d[4][1] = -(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1)
2934 * (3125 * s * s * s * s - 2500 * s * s * s - 750 * s * s + 500 * s + 9))
2936 d[5][1] = +(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3)
2937 * (3125 * s * s * s * s - 2500 * s * s * s - 750 * s * s + 500 * s + 9))
2939 d[6][1] = -(25 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3)
2940 * (3125 * s * s * s * s - 2500 * s * s * s - 750 * s * s + 500 * s + 9))
2942 d[7][1] = +(25 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2943 * (3125 * s * s * s * s - 2500 * s * s * s - 750 * s * s + 500 * s + 9))
2945 d[8][1] = -(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2946 * (625 * s * s * s * s - 300 * s * s * s - 390 * s * s + 156 * s + 5))
2948 d[9][1] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1)
2949 * (625 * s * s * s * s - 300 * s * s * s - 390 * s * s + 156 * s + 5))
2951 d[10][1] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3)
2952 * (625 * s * s * s * s - 300 * s * s * s - 390 * s * s + 156 * s + 5))
2954 d[11][1] = +(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3)
2955 * (625 * s * s * s * s - 300 * s * s * s - 390 * s * s + 156 * s + 5))
2957 d[12][1] = -(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2958 * (625 * s * s * s * s - 300 * s * s * s - 390 * s * s + 156 * s + 5))
2960 d[13][1] = +(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2961 * (625 * s * s * s * s - 300 * s * s * s - 390 * s * s + 156 * s + 5))
2963 d[14][1] = +(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2964 * (625 * s * s * s * s - 100 * s * s * s - 510 * s * s + 68 * s + 45))
2966 d[15][1] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1)
2967 * (625 * s * s * s * s - 100 * s * s * s - 510 * s * s + 68 * s + 45))
2969 d[16][1] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3)
2970 * (625 * s * s * s * s - 100 * s * s * s - 510 * s * s + 68 * s + 45))
2972 d[17][1] = -(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3)
2973 * (625 * s * s * s * s - 100 * s * s * s - 510 * s * s + 68 * s + 45))
2975 d[18][1] = +(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2976 * (625 * s * s * s * s - 100 * s * s * s - 510 * s * s + 68 * s + 45))
2978 d[19][1] = -(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2979 * (625 * s * s * s * s - 100 * s * s * s - 510 * s * s + 68 * s + 45))
2981 d[20][1] = -(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2982 * (625 * s * s * s * s + 100 * s * s * s - 510 * s * s - 68 * s + 45))
2984 d[21][1] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1)
2985 * (625 * s * s * s * s + 100 * s * s * s - 510 * s * s - 68 * s + 45))
2987 d[22][1] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3)
2988 * (625 * s * s * s * s + 100 * s * s * s - 510 * s * s - 68 * s + 45))
2990 d[23][1] = +(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3)
2991 * (625 * s * s * s * s + 100 * s * s * s - 510 * s * s - 68 * s + 45))
2993 d[24][1] = -(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2994 * (625 * s * s * s * s + 100 * s * s * s - 510 * s * s - 68 * s + 45))
2996 d[25][1] = +(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
2997 * (625 * s * s * s * s + 100 * s * s * s - 510 * s * s - 68 * s + 45))
2999 d[26][1] = +(25 * rm * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
3000 * (625 * s * s * s * s + 300 * s * s * s - 390 * s * s - 156 * s + 5))
3002 d[27][1] = -(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1)
3003 * (625 * s * s * s * s + 300 * s * s * s - 390 * s * s - 156 * s + 5))
3005 d[28][1] = +(625 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3)
3006 * (625 * s * s * s * s + 300 * s * s * s - 390 * s * s - 156 * s + 5))
3008 d[29][1] = -(625 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3)
3009 * (625 * s * s * s * s + 300 * s * s * s - 390 * s * s - 156 * s + 5))
3011 d[30][1] = +(625 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
3012 * (625 * s * s * s * s + 300 * s * s * s - 390 * s * s - 156 * s + 5))
3014 d[31][1] = -(25 * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
3015 * (625 * s * s * s * s + 300 * s * s * s - 390 * s * s - 156 * s + 5))
3017 d[32][1] = +(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 1)
3018 * (3125 * s * s * s * s + 2500 * s * s * s - 750 * s * s - 500 * s + 9))
3020 d[33][1] = -(25 * rm * rp * (5 * r - 3) * (5 * r - 1) * (5 * r + 3)
3021 * (3125 * s * s * s * s + 2500 * s * s * s - 750 * s * s - 500 * s + 9))
3023 d[34][1] = +(25 * rm * rp * (5 * r - 3) * (5 * r + 1) * (5 * r + 3)
3024 * (3125 * s * s * s * s + 2500 * s * s * s - 750 * s * s - 500 * s + 9))
3026 d[35][1] = -(25 * rm * rp * (5 * r - 1) * (5 * r + 1) * (5 * r + 3)
3027 * (3125 * s * s * s * s + 2500 * s * s * s - 750 * s * s - 500 * s + 9))
3032 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
3033 eval_h(internal_coor, &h[0]);
3036 static void eval_h_derived(
3037 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
3038 d.resize(2, num_nodes);
3039 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
3043class Q49_Shape_Evaluator {
3045 static const int num_nodes = 49;
3046 static const int num_dimensions = 2;
3047 static const int order = 6;
3048 typedef IS_Q ischeme_type;
3050 static ischeme_type create_ischeme() {
3051 ischeme_type ischeme;
3052 ischeme[0].set_order(6);
3053 ischeme[1].set_order(6);
3057 static ischeme_type create_ischeme(SolidMechanics& property) {
3058 ischeme_type ischeme;
3059 ischeme[0].set_order(2 * 6);
3060 ischeme[1].set_order(2 * 6);
3061 ischeme.init(property);
3065 static const double r_node[49];
3066 static const double s_node[49];
3067 static const double t_node[49];
3069 static const char name[4];
3071 typedef L7_Shape_Evaluator edge_shape_type_0;
3072 typedef L7_Shape_Evaluator edge_shape_type_1;
3073 static const int num_edge = 4;
3074 static const int edge_node[4][7];
3075 static const int edge_type_index[4];
3077 typedef Q49_Shape_Evaluator face_shape_type_0;
3078 typedef Q49_Shape_Evaluator face_shape_type_1;
3079 static const int num_face = 2;
3080 static const int face_node[2][49];
3081 static const int face_type_index[2];
3082 static const bool is_t_face[2];
3084 static void eval_h(
const double internal_coor[2],
double h[49]) {
3085 const double r = internal_coor[0];
3086 const double s = internal_coor[1];
3087 const double rm = r - 1;
3088 const double rp = r + 1;
3089 const double sm = s - 1;
3090 const double sp = s + 1;
3091 const double r3m = 3 * r - 1;
3092 const double r3p = 3 * r + 1;
3093 const double s3m = 3 * s - 1;
3094 const double s3p = 3 * s + 1;
3096 h[0] = +(rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * (3 * s - 2) * s3m * s3p
3099 h[1] = +(r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * (3 * s - 2) * s3m * s3p
3102 h[2] = +(r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * s * sp * (3 * s - 2) * s3m * s3p
3105 h[3] = +(rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * s * sp * (3 * s - 2) * s3m * s3p
3108 h[4] = -(9 * rm * r * rp * (3 * r - 2) * r3m * r3p * sm * s * (3 * s - 2) * s3m * s3p
3111 h[5] = +(9 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * sm * s * (3 * s - 2) * s3m
3112 * s3p * (3 * s + 2))
3114 h[6] = -(rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * (3 * s - 2) * s3m * s3p
3117 h[7] = +(9 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * sm * s * (3 * s - 2) * s3m
3118 * s3p * (3 * s + 2))
3120 h[8] = -(9 * rm * r * rp * r3m * r3p * (3 * r + 2) * sm * s * (3 * s - 2) * s3m * s3p
3123 h[9] = -(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3127 +(81 * rm * r * rp * (3 * r - 2) * r3m * r3p * sm * s * sp * (3 * s - 2) * s3m * s3p)
3129 h[11] = -(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3132 h[12] = +(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3135 h[13] = -(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3139 +(81 * rm * r * rp * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2) * s3m * s3p)
3141 h[15] = -(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3144 h[16] = +(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3145 * s3m * (3 * s + 2))
3147 h[17] = -(81 * rm * r * rp * (3 * r - 2) * r3m * r3p * sm * s * sp * (3 * s - 2) * s3m
3150 h[18] = +(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3151 * s3m * (3 * s + 2))
3153 h[19] = -(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3154 * s3m * (3 * s + 2))
3156 h[20] = +(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3157 * s3m * (3 * s + 2))
3159 h[21] = -(81 * rm * r * rp * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2) * s3m
3162 h[22] = +(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3163 * s3m * (3 * s + 2))
3165 h[23] = -(rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * sp * (3 * s - 2) * s3m * s3p
3168 h[24] = +(9 * rm * r * rp * (3 * r - 2) * r3m * r3p * sm * sp * (3 * s - 2) * s3m * s3p
3171 h[25] = -(9 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * sm * sp * (3 * s - 2) * s3m
3172 * s3p * (3 * s + 2))
3174 h[26] = +(rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * sp * (3 * s - 2) * s3m
3175 * s3p * (3 * s + 2))
3177 h[27] = -(9 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * sm * sp * (3 * s - 2) * s3m
3178 * s3p * (3 * s + 2))
3180 h[28] = +(9 * rm * r * rp * r3m * r3p * (3 * r + 2) * sm * sp * (3 * s - 2) * s3m * s3p
3183 h[29] = -(r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * sp * (3 * s - 2) * s3m * s3p
3186 h[30] = +(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3187 * s3p * (3 * s + 2))
3189 h[31] = -(81 * rm * r * rp * (3 * r - 2) * r3m * r3p * sm * s * sp * (3 * s - 2) * s3p
3192 h[32] = +(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3193 * s3p * (3 * s + 2))
3195 h[33] = -(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3196 * s3p * (3 * s + 2))
3198 h[34] = +(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3199 * s3p * (3 * s + 2))
3201 h[35] = -(81 * rm * r * rp * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2) * s3p
3204 h[36] = +(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * (3 * s - 2)
3205 * s3p * (3 * s + 2))
3207 h[37] = -(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * s3m * s3p
3211 +(81 * rm * r * rp * (3 * r - 2) * r3m * r3p * sm * s * sp * s3m * s3p * (3 * s + 2))
3213 h[39] = -(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * sm * s * sp * s3m * s3p
3216 h[40] = +(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * s3m * s3p
3219 h[41] = -(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * sm * s * sp * s3m * s3p
3223 +(81 * rm * r * rp * r3m * r3p * (3 * r + 2) * sm * s * sp * s3m * s3p * (3 * s + 2))
3225 h[43] = -(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * sm * s * sp * s3m * s3p
3228 h[44] = -(9 * rm * r * rp * (3 * r - 2) * r3m * r3p * s * sp * (3 * s - 2) * s3m * s3p
3231 h[45] = +(9 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * s * sp * (3 * s - 2) * s3m
3232 * s3p * (3 * s + 2))
3234 h[46] = -(rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * s * sp * (3 * s - 2) * s3m * s3p
3237 h[47] = +(9 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * s * sp * (3 * s - 2) * s3m
3238 * s3p * (3 * s + 2))
3240 h[48] = -(9 * rm * r * rp * r3m * r3p * (3 * r + 2) * s * sp * (3 * s - 2) * s3m * s3p
3245 static void eval_h_derived(
const double internal_coor[2],
double d[49][2]) {
3246 const double r = internal_coor[0];
3247 const double s = internal_coor[1];
3248 const double rm = r - 1;
3249 const double rp = r + 1;
3250 const double sm = s - 1;
3251 const double sp = s + 1;
3252 const double r3m = 3 * r - 1;
3253 const double r3p = 3 * r + 1;
3254 const double s3m = 3 * s - 1;
3255 const double s3p = 3 * s + 1;
3256 d[0][0] = +((6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)
3257 * sm * s * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3259 d[1][0] = +((6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)
3260 * sm * s * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3262 d[2][0] = +((6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)
3263 * s * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3265 d[3][0] = +((6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)
3266 * s * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3269 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
3271 * sm * s * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3274 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
3276 * sm * s * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3278 d[6][0] = -(r * (9 * r * r - 7) * (27 * r * r - 7) * sm * s * (3 * s - 2) * s3m * s3p
3282 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
3284 * sm * s * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3287 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
3289 * sm * s * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3292 -(9 * (6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)
3293 * sm * s * sp * (3 * s - 2) * s3m * s3p)
3296 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
3298 * sm * s * sp * (3 * s - 2) * s3m * s3p)
3301 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
3303 * sm * s * sp * (3 * s - 2) * s3m * s3p)
3306 +(9 * r * (9 * r * r - 7) * (27 * r * r - 7) * sm * s * sp * (3 * s - 2) * s3m * s3p)
3309 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
3311 * sm * s * sp * (3 * s - 2) * s3m * s3p)
3314 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
3316 * sm * s * sp * (3 * s - 2) * s3m * s3p)
3319 -(9 * (6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)
3320 * sm * s * sp * (3 * s - 2) * s3m * s3p)
3323 +(9 * (6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)
3324 * sm * s * sp * (3 * s - 2) * s3m * (3 * s + 2))
3327 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
3329 * sm * s * sp * (3 * s - 2) * s3m * (3 * s + 2))
3332 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
3334 * sm * s * sp * (3 * s - 2) * s3m * (3 * s + 2))
3336 d[19][0] = -(9 * r * (9 * r * r - 7) * (27 * r * r - 7) * sm * s * sp * (3 * s - 2) * s3m
3340 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
3342 * sm * s * sp * (3 * s - 2) * s3m * (3 * s + 2))
3345 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
3347 * sm * s * sp * (3 * s - 2) * s3m * (3 * s + 2))
3350 +(9 * (6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)
3351 * sm * s * sp * (3 * s - 2) * s3m * (3 * s + 2))
3353 d[23][0] = -((6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)
3354 * sm * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3357 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
3359 * sm * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3362 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
3364 * sm * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3366 d[26][0] = +(r * (9 * r * r - 7) * (27 * r * r - 7) * sm * sp * (3 * s - 2) * s3m * s3p
3370 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
3372 * sm * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3375 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
3377 * sm * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3379 d[29][0] = -((6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)
3380 * sm * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3383 +(9 * (6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)
3384 * sm * s * sp * (3 * s - 2) * s3p * (3 * s + 2))
3387 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
3389 * sm * s * sp * (3 * s - 2) * s3p * (3 * s + 2))
3392 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
3394 * sm * s * sp * (3 * s - 2) * s3p * (3 * s + 2))
3396 d[33][0] = -(9 * r * (9 * r * r - 7) * (27 * r * r - 7) * sm * s * sp * (3 * s - 2) * s3p
3400 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
3402 * sm * s * sp * (3 * s - 2) * s3p * (3 * s + 2))
3405 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
3407 * sm * s * sp * (3 * s - 2) * s3p * (3 * s + 2))
3410 +(9 * (6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)
3411 * sm * s * sp * (3 * s - 2) * s3p * (3 * s + 2))
3414 -(9 * (6 * r - 1) * (81 * r * r * r * r - 54 * r * r * r - 39 * r * r + 16 * r + 4)
3415 * sm * s * sp * s3m * s3p * (3 * s + 2))
3418 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
3420 * sm * s * sp * s3m * s3p * (3 * s + 2))
3423 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
3425 * sm * s * sp * s3m * s3p * (3 * s + 2))
3428 +(9 * r * (9 * r * r - 7) * (27 * r * r - 7) * sm * s * sp * s3m * s3p * (3 * s + 2))
3431 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
3433 * sm * s * sp * s3m * s3p * (3 * s + 2))
3436 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
3438 * sm * s * sp * s3m * s3p * (3 * s + 2))
3441 -(9 * (6 * r + 1) * (81 * r * r * r * r + 54 * r * r * r - 39 * r * r - 16 * r + 4)
3442 * sm * s * sp * s3m * s3p * (3 * s + 2))
3445 * (81 * r * r * r * r * r - 45 * r * r * r * r - 60 * r * r * r + 30 * r * r
3447 * s * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3450 * (162 * r * r * r * r * r - 45 * r * r * r * r - 156 * r * r * r + 39 * r * r
3452 * s * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3454 d[46][0] = -(r * (9 * r * r - 7) * (27 * r * r - 7) * s * sp * (3 * s - 2) * s3m * s3p
3458 * (162 * r * r * r * r * r + 45 * r * r * r * r - 156 * r * r * r - 39 * r * r
3460 * s * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3463 * (81 * r * r * r * r * r + 45 * r * r * r * r - 60 * r * r * r - 30 * r * r
3465 * s * sp * (3 * s - 2) * s3m * s3p * (3 * s + 2))
3467 d[0][1] = +(rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * (6 * s - 1)
3468 * (81 * s * s * s * s - 54 * s * s * s - 39 * s * s + 16 * s + 4))
3470 d[1][1] = +(r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * (6 * s - 1)
3471 * (81 * s * s * s * s - 54 * s * s * s - 39 * s * s + 16 * s + 4))
3473 d[2][1] = +(r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * (6 * s + 1)
3474 * (81 * s * s * s * s + 54 * s * s * s - 39 * s * s - 16 * s + 4))
3476 d[3][1] = +(rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * (6 * s + 1)
3477 * (81 * s * s * s * s + 54 * s * s * s - 39 * s * s - 16 * s + 4))
3479 d[4][1] = -(9 * rm * r * rp * (3 * r - 2) * r3m * r3p * (6 * s - 1)
3480 * (81 * s * s * s * s - 54 * s * s * s - 39 * s * s + 16 * s + 4))
3482 d[5][1] = +(9 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * (6 * s - 1)
3483 * (81 * s * s * s * s - 54 * s * s * s - 39 * s * s + 16 * s + 4))
3485 d[6][1] = -(rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * (6 * s - 1)
3486 * (81 * s * s * s * s - 54 * s * s * s - 39 * s * s + 16 * s + 4))
3488 d[7][1] = +(9 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * (6 * s - 1)
3489 * (81 * s * s * s * s - 54 * s * s * s - 39 * s * s + 16 * s + 4))
3491 d[8][1] = -(9 * rm * r * rp * r3m * r3p * (3 * r + 2) * (6 * s - 1)
3492 * (81 * s * s * s * s - 54 * s * s * s - 39 * s * s + 16 * s + 4))
3494 d[9][1] = -(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3495 * (81 * s * s * s * s * s - 45 * s * s * s * s - 60 * s * s * s + 30 * s * s
3498 d[10][1] = +(81 * rm * r * rp * (3 * r - 2) * r3m * r3p
3499 * (81 * s * s * s * s * s - 45 * s * s * s * s - 60 * s * s * s + 30 * s * s
3502 d[11][1] = -(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2)
3503 * (81 * s * s * s * s * s - 45 * s * s * s * s - 60 * s * s * s + 30 * s * s
3506 d[12][1] = +(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3507 * (81 * s * s * s * s * s - 45 * s * s * s * s - 60 * s * s * s + 30 * s * s
3510 d[13][1] = -(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2)
3511 * (81 * s * s * s * s * s - 45 * s * s * s * s - 60 * s * s * s + 30 * s * s
3514 d[14][1] = +(81 * rm * r * rp * r3m * r3p * (3 * r + 2)
3515 * (81 * s * s * s * s * s - 45 * s * s * s * s - 60 * s * s * s + 30 * s * s
3518 d[15][1] = -(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3519 * (81 * s * s * s * s * s - 45 * s * s * s * s - 60 * s * s * s + 30 * s * s
3522 d[16][1] = +(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3523 * (162 * s * s * s * s * s - 45 * s * s * s * s - 156 * s * s * s + 39 * s * s
3526 d[17][1] = -(81 * rm * r * rp * (3 * r - 2) * r3m * r3p
3527 * (162 * s * s * s * s * s - 45 * s * s * s * s - 156 * s * s * s + 39 * s * s
3530 d[18][1] = +(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2)
3531 * (162 * s * s * s * s * s - 45 * s * s * s * s - 156 * s * s * s + 39 * s * s
3534 d[19][1] = -(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3535 * (162 * s * s * s * s * s - 45 * s * s * s * s - 156 * s * s * s + 39 * s * s
3538 d[20][1] = +(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2)
3539 * (162 * s * s * s * s * s - 45 * s * s * s * s - 156 * s * s * s + 39 * s * s
3542 d[21][1] = -(81 * rm * r * rp * r3m * r3p * (3 * r + 2)
3543 * (162 * s * s * s * s * s - 45 * s * s * s * s - 156 * s * s * s + 39 * s * s
3546 d[22][1] = +(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3547 * (162 * s * s * s * s * s - 45 * s * s * s * s - 156 * s * s * s + 39 * s * s
3550 d[23][1] = -(rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2) * s * (9 * s * s - 7)
3554 +(9 * rm * r * rp * (3 * r - 2) * r3m * r3p * s * (9 * s * s - 7) * (27 * s * s - 7))
3556 d[25][1] = -(9 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * s * (9 * s * s - 7)
3559 d[26][1] = +(rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * s * (9 * s * s - 7)
3562 d[27][1] = -(9 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * s * (9 * s * s - 7)
3566 +(9 * rm * r * rp * r3m * r3p * (3 * r + 2) * s * (9 * s * s - 7) * (27 * s * s - 7))
3568 d[29][1] = -(r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * s * (9 * s * s - 7)
3571 d[30][1] = +(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3572 * (162 * s * s * s * s * s + 45 * s * s * s * s - 156 * s * s * s - 39 * s * s
3575 d[31][1] = -(81 * rm * r * rp * (3 * r - 2) * r3m * r3p
3576 * (162 * s * s * s * s * s + 45 * s * s * s * s - 156 * s * s * s - 39 * s * s
3579 d[32][1] = +(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2)
3580 * (162 * s * s * s * s * s + 45 * s * s * s * s - 156 * s * s * s - 39 * s * s
3583 d[33][1] = -(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3584 * (162 * s * s * s * s * s + 45 * s * s * s * s - 156 * s * s * s - 39 * s * s
3587 d[34][1] = +(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2)
3588 * (162 * s * s * s * s * s + 45 * s * s * s * s - 156 * s * s * s - 39 * s * s
3591 d[35][1] = -(81 * rm * r * rp * r3m * r3p * (3 * r + 2)
3592 * (162 * s * s * s * s * s + 45 * s * s * s * s - 156 * s * s * s - 39 * s * s
3595 d[36][1] = +(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3596 * (162 * s * s * s * s * s + 45 * s * s * s * s - 156 * s * s * s - 39 * s * s
3599 d[37][1] = -(9 * rm * r * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3600 * (81 * s * s * s * s * s + 45 * s * s * s * s - 60 * s * s * s - 30 * s * s
3603 d[38][1] = +(81 * rm * r * rp * (3 * r - 2) * r3m * r3p
3604 * (81 * s * s * s * s * s + 45 * s * s * s * s - 60 * s * s * s - 30 * s * s
3607 d[39][1] = -(81 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2)
3608 * (81 * s * s * s * s * s + 45 * s * s * s * s - 60 * s * s * s - 30 * s * s
3611 d[40][1] = +(9 * rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3612 * (81 * s * s * s * s * s + 45 * s * s * s * s - 60 * s * s * s - 30 * s * s
3615 d[41][1] = -(81 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2)
3616 * (81 * s * s * s * s * s + 45 * s * s * s * s - 60 * s * s * s - 30 * s * s
3619 d[42][1] = +(81 * rm * r * rp * r3m * r3p * (3 * r + 2)
3620 * (81 * s * s * s * s * s + 45 * s * s * s * s - 60 * s * s * s - 30 * s * s
3623 d[43][1] = -(9 * r * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2)
3624 * (81 * s * s * s * s * s + 45 * s * s * s * s - 60 * s * s * s - 30 * s * s
3627 d[44][1] = -(9 * rm * r * rp * (3 * r - 2) * r3m * r3p * (6 * s + 1)
3628 * (81 * s * s * s * s + 54 * s * s * s - 39 * s * s - 16 * s + 4))
3630 d[45][1] = +(9 * rm * r * rp * (3 * r - 2) * r3m * (3 * r + 2) * (6 * s + 1)
3631 * (81 * s * s * s * s + 54 * s * s * s - 39 * s * s - 16 * s + 4))
3633 d[46][1] = -(rm * rp * (3 * r - 2) * r3m * r3p * (3 * r + 2) * (6 * s + 1)
3634 * (81 * s * s * s * s + 54 * s * s * s - 39 * s * s - 16 * s + 4))
3636 d[47][1] = +(9 * rm * r * rp * (3 * r - 2) * r3p * (3 * r + 2) * (6 * s + 1)
3637 * (81 * s * s * s * s + 54 * s * s * s - 39 * s * s - 16 * s + 4))
3639 d[48][1] = -(9 * rm * r * rp * r3m * r3p * (3 * r + 2) * (6 * s + 1)
3640 * (81 * s * s * s * s + 54 * s * s * s - 39 * s * s - 16 * s + 4))
3645 const double internal_coor[2], b2linalg::Vector<double, b2linalg::Vdense>& h) {
3646 eval_h(internal_coor, &h[0]);
3649 static void eval_h_derived(
3650 const double internal_coor[2], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
3651 d.resize(2, num_nodes);
3652 eval_h_derived(internal_coor, (
double(*)[2]) & d[0][0]);
3660template <
typename HELPER>
3661class Solid_Shape_Evaluator :
public HELPER {
3663 static double eval_face_directors(
3664 int face,
const double* xi_face,
const double coor[HELPER::num_nodes][3],
3665 double d_coor_d_lcoor[2][3]) {
3666 switch (HELPER::face_type_index[face]) {
3668 return eval_face_directors_for_face<typename HELPER::face_shape_type_0>(
3669 face, xi_face, coor, d_coor_d_lcoor);
3672 return eval_face_directors_for_face<typename HELPER::face_shape_type_1>(
3673 face, xi_face, coor, d_coor_d_lcoor);
3679 static void eval_h(
const double internal_coor[3],
double h[HELPER::num_nodes]) {
3680 HELPER::eval_h(internal_coor, h);
3683 static void eval_h_derived(
const double internal_coor[3],
double d[HELPER::num_nodes][3]) {
3684 HELPER::eval_h_derived(internal_coor, d);
3688 const double internal_coor[3], b2linalg::Vector<double, b2linalg::Vdense>& h) {
3689 HELPER::eval_h(internal_coor, &h[0]);
3692 static void eval_h_derived(
3693 const double internal_coor[3], b2linalg::Matrix<double, b2linalg::Mrectangle>& d) {
3694 d.resize(3, HELPER::num_nodes);
3695 HELPER::eval_h_derived(internal_coor, (
double(*)[3]) & d[0][0]);
3699 template <
typename FSE>
3700 static double eval_face_directors_for_face(
3701 int face,
const double* xi_face,
const double coor[HELPER::num_nodes][3],
3702 double d_coor_d_lcoor[2][3]) {
3704 double X[FSE::num_nodes][3];
3705 for (
int i = 0; i != FSE::num_nodes; ++i) {
3706 const int j = HELPER::face_node[face][i];
3707 std::copy(coor[j], coor[j + 1], X[i]);
3711 double d_H_d_xi[FSE::num_nodes][2];
3712 FSE::eval_h_derived(xi_face, d_H_d_xi);
3716 ffmv::mc_eq_mat_mul_mb<2, 3, FSE::num_nodes>(J, d_H_d_xi, X);
3719 for (
size_t l = 0; l != 2; ++l) {
3720 std::copy(J[l], J[l + 1], d_coor_d_lcoor[l]);
3727 const double surface =
norm_3(c);
3737class TE_Shape_Helper {
3739 static inline void map_element_coor_to_face_coor(
3740 const double element_coor[3],
3742 double face_coor[2]) {
3744 const double a[4][2] = {
3750 const double b[4][2][3] = {
3751 {{+1., 0., 0.}, {0., +1., 0.}},
3752 {{+1., 0., 0.}, {0., 0., +1.}},
3753 {{0., +1., 0.}, {0., 0., +1.}},
3754 {{0., -1., 0.}, {0., 0., +1.}},
3756 for (
int i = 0; i != 2; ++i) {
3757 face_coor[i] = a[face][i];
3758 for (
int j = 0; j != 3; ++j) { face_coor[i] += b[face][i][j] * element_coor[j]; }
3762 static inline void map_face_coor_to_element_coor(
3763 const int face,
const double face_coor[2],
double element_coor[3]) {
3764 const double a[4][3] = {{0., 0., 0.}, {0., 0., 0.}, {+1., 0., 0.}, {0., +1., 0.}};
3765 const double b[4][3][2] = {
3766 {{+1., 0.}, {0., +1.}, {0., 0.}},
3767 {{+1., 0.}, {0., 0.}, {0., +1.}},
3768 {{-1., 0.}, {+1., 0.}, {0., 1.}},
3769 {{+1., 0.}, {-1., 0.}, {0., 1.}},
3771 for (
int i = 0; i != 3; ++i) {
3772 element_coor[i] = a[face][i];
3773 for (
int j = 0; j != 2; ++j) { element_coor[i] += b[face][i][j] * face_coor[j]; }
3778class TE4_Shape_Helper :
public TE_Shape_Helper {
3780 static void eval_h(
const double internal_coor[3],
double h[4]) {
3781 const double r = internal_coor[0];
3782 const double s = internal_coor[1];
3783 const double t = internal_coor[2];
3785 h[0] = 1 - r - s - t;
3791 static void eval_h_derived(
const double internal_coor[3],
double d[4][3]) {
3811 static const int num_nodes = 4;
3812 static const int num_faces = 4;
3813 static const int num_dimensions = 3;
3814 static const int order = 1;
3815 typedef IS_TE ischeme_type;
3817 static ischeme_type create_ischeme() {
3818 ischeme_type ischeme;
3819 ischeme.set_order(order);
3823 static ischeme_type create_ischeme(SolidMechanics& property) {
3824 ischeme_type ischeme;
3825 ischeme.set_order(2 * order);
3826 ischeme.init(property);
3830 static const double r_node[4];
3831 static const double s_node[4];
3832 static const double t_node[4];
3834 static const bool supports_laminates =
false;
3836 static const char name[4];
3838 typedef L2_Shape_Evaluator edge_shape_type_0;
3839 typedef L2_Shape_Evaluator edge_shape_type_1;
3840 static const int num_edge = 6;
3841 static const int edge_node[6][2];
3842 static const int edge_type_index[6];
3844 typedef T3_Shape_Evaluator face_shape_type_0;
3845 typedef T3_Shape_Evaluator face_shape_type_1;
3846 static const int num_face = 4;
3847 static const int face_node[4][3];
3848 static const int face_type_index[4];
3849 static const bool is_t_face[4];
3852typedef Solid_Shape_Evaluator<TE4_Shape_Helper> TE4_Shape_Evaluator;
3854class TE10_Shape_Helper :
public TE_Shape_Helper {
3856 static void eval_h(
const double internal_coor[3],
double h[10]) {
3857 const double r = internal_coor[0];
3858 const double s = internal_coor[1];
3859 const double t = internal_coor[2];
3861 const double a = 1 - r - s - t;
3863 h[0] = a * (2 * a - 1);
3864 h[1] = r * (2 * r - 1);
3865 h[2] = s * (2 * s - 1);
3866 h[3] = t * (2 * t - 1);
3875 static void eval_h_derived(
const double internal_coor[3],
double d[10][3]) {
3876 const double r = internal_coor[0];
3877 const double s = internal_coor[1];
3878 const double t = internal_coor[2];
3880 const double a = 1 - r - s - t;
3883 d[0][0] = +1 - 4 * a;
3884 d[1][0] = +4 * r - 1;
3887 d[4][0] = +4 * (a - r);
3895 d[0][1] = +1 - 4 * a;
3897 d[2][1] = +4 * s - 1;
3901 d[6][1] = +4 * (a - s);
3907 d[0][2] = +1 - 4 * a;
3910 d[3][2] = +4 * t - 1;
3914 d[7][2] = +4 * (a - t);
3919 static const int num_nodes = 10;
3920 static const int num_faces = 4;
3921 static const int num_dimensions = 3;
3922 static const int order = 2;
3923 typedef IS_TE ischeme_type;
3925 static ischeme_type create_ischeme() {
3926 ischeme_type ischeme;
3927 ischeme.set_order(order);
3931 static ischeme_type create_ischeme(SolidMechanics& property) {
3932 ischeme_type ischeme;
3933 ischeme.set_order(2 * order);
3934 ischeme.init(property);
3938 static const double r_node[10];
3939 static const double s_node[10];
3940 static const double t_node[10];
3942 static const bool supports_laminates =
false;
3944 static const char name[5];
3946 typedef L3_Shape_Evaluator edge_shape_type_0;
3947 typedef L3_Shape_Evaluator edge_shape_type_1;
3948 static const int num_edge = 6;
3949 static const int edge_node[6][3];
3950 static const int edge_type_index[6];
3952 typedef T6_Shape_Evaluator face_shape_type_0;
3953 typedef T6_Shape_Evaluator face_shape_type_1;
3954 static const int num_face = 4;
3955 static const int face_node[4][6];
3956 static const int face_type_index[4];
3957 static const bool is_t_face[4];
3960typedef Solid_Shape_Evaluator<TE10_Shape_Helper> TE10_Shape_Evaluator;
3966class PR_Shape_Helper {
3968 static inline void map_element_coor_to_face_coor(
3969 const double element_coor[3],
3971 double face_coor[2]) {
3973 const double a[5][2] = {{0., 0.}, {0., 0.}, {-1., 0.}, {-1., 0.}, {+1., 0.}};
3974 const double b[5][2][3] = {
3975 {{+1., 0., 0.}, {0., +1., 0.}}, {{+1., 0., 0.}, {0., +1., 0.}},
3976 {{+2., 0., 0.}, {0., 0., +1.}}, {{0., +2., 0.}, {0., 0., +1.}},
3977 {{0., -2., 0.}, {0., 0., +1.}},
3979 for (
int i = 0; i != 2; ++i) {
3980 face_coor[i] = a[face][i];
3981 for (
int j = 0; j != 3; ++j) { face_coor[i] += b[face][i][j] * element_coor[j]; }
3985 static inline void map_face_coor_to_element_coor(
3986 const int face,
const double face_coor[2],
double element_coor[3]) {
3987 const double a[5][3] = {
3988 {0., 0., -1.}, {0., 0., +1.}, {+.5, 0., 0.}, {+.5, +.5, 0.}, {0., +.5, 0.}};
3989 const double b[5][3][2] = {
3990 {{+1., 0.}, {0., +1.}, {0., 0.}}, {{+1., 0.}, {0., +1.}, {0., 0.}},
3991 {{+.5, 0.}, {0., 0.}, {0., 1.}}, {{-.5, 0.}, {+.5, 0.}, {0., 1.}},
3992 {{0., 0.}, {-.5, 0.}, {0., 1.}},
3994 for (
int i = 0; i != 3; ++i) {
3995 element_coor[i] = a[face][i];
3996 for (
int j = 0; j != 2; ++j) { element_coor[i] += b[face][i][j] * face_coor[j]; }
4001class PR6_Shape_Helper :
public PR_Shape_Helper {
4003 static void eval_h(
const double internal_coor[3],
double h[6]) {
4004 const double r = internal_coor[0];
4005 const double s = internal_coor[1];
4006 const double t = internal_coor[2];
4008 const double tm = 1. - t;
4009 const double tp = 1. + t;
4011 h[0] = 0.5 * tm * (1. - r - s);
4012 h[1] = 0.5 * tm * r;
4013 h[2] = 0.5 * tm * s;
4014 h[3] = 0.5 * tp * (1. - r - s);
4015 h[4] = 0.5 * tp * r;
4016 h[5] = 0.5 * tp * s;
4019 static void eval_h_derived(
const double internal_coor[3],
double d[6][3]) {
4020 const double r = internal_coor[0];
4021 const double s = internal_coor[1];
4022 const double t = internal_coor[2];
4024 const double tm = 1. - t;
4025 const double tp = 1. + t;
4028 d[0][0] = -0.5 * tm;
4029 d[1][0] = +0.5 * tm;
4031 d[3][0] = -0.5 * tp;
4032 d[4][0] = +0.5 * tp;
4036 d[0][1] = -0.5 * tm;
4038 d[2][1] = +0.5 * tm;
4039 d[3][1] = -0.5 * tp;
4041 d[5][1] = +0.5 * tp;
4044 d[0][2] = +0.5 * (r + s - 1);
4047 d[3][2] = -0.5 * (r + s - 1);
4052 static const int num_nodes = 6;
4053 static const int num_dimensions = 3;
4054 static const int order = 3;
4055 typedef IS_PR ischeme_type;
4057 static ischeme_type create_ischeme() {
4058 ischeme_type ischeme;
4059 ischeme.triangle.set_order(T3_Shape_Evaluator::order);
4060 ischeme.line.set_order(L2_Shape_Evaluator::order);
4064 static ischeme_type create_ischeme(SolidMechanics& property) {
4065 ischeme_type ischeme;
4066 ischeme.triangle.set_order(2 * T3_Shape_Evaluator::order);
4067 ischeme.line.set_order(2 * L2_Shape_Evaluator::order);
4068 ischeme.init(property);
4072 static const double r_node[6];
4073 static const double s_node[6];
4074 static const double t_node[6];
4076 static const bool supports_laminates =
true;
4078 static const char name[4];
4080 typedef L2_Shape_Evaluator edge_shape_type_0;
4081 typedef L2_Shape_Evaluator edge_shape_type_1;
4082 static const int num_edge = 9;
4083 static const int edge_node[9][2];
4084 static const int edge_type_index[9];
4086 typedef T3_Shape_Evaluator face_shape_type_0;
4087 typedef Q4_Shape_Evaluator face_shape_type_1;
4088 static const int num_face = 5;
4089 static const int face_node[5][4];
4090 static const int face_type_index[5];
4091 static const bool is_t_face[5];
4094typedef Solid_Shape_Evaluator<PR6_Shape_Helper> PR6_Shape_Evaluator;
4096class PR15_Shape_Helper :
public PR_Shape_Helper {
4098 static void eval_h(
const double internal_coor[3],
double h[15]) {
4099 double r = internal_coor[0];
4100 double s = internal_coor[1];
4101 double t = internal_coor[2];
4104 double a = 1. - r - s;
4105 h[0] = a * (1. - t) * (a - (1. + 0.5 * t));
4106 h[1] = r * (1. - t) * (r - (1. + 0.5 * t));
4107 h[2] = s * (1. - t) * (s - (1. + 0.5 * t));
4108 h[3] = a * (1. + t) * (a - (1. - 0.5 * t));
4109 h[4] = r * (1. + t) * (r - (1. - 0.5 * t));
4110 h[5] = s * (1. + t) * (s - (1. - 0.5 * t));
4111 h[6] = 2.0 * a * r * (1. - t);
4112 h[7] = 2.0 * r * s * (1. - t);
4113 h[8] = 2.0 * a * s * (1. - t);
4114 h[9] = 2.0 * a * r * (1. + t);
4115 h[10] = 2.0 * r * s * (1. + t);
4116 h[11] = 2.0 * a * s * (1. + t);
4117 h[12] = a * (1. - t * t);
4118 h[13] = r * (1. - t * t);
4119 h[14] = s * (1. - t * t);
4122 static void eval_h_derived(
const double internal_coor[3],
double d[15][3]) {
4123 double r = internal_coor[0];
4124 double s = internal_coor[1];
4125 double t = internal_coor[2];
4128 d[0][0] = -(t - 1.) * (t + 4.0 * s + 4.0 * r - 2.0) * 0.5;
4129 d[1][0] = +(t - 1.) * (t - 4.0 * r + 2.0) * 0.5;
4131 d[3][0] = -(t + 1.) * (t - 4.0 * s - 4.0 * r + 2.0) * 0.5;
4132 d[4][0] = +(t + 1.) * (t + 4.0 * r - 2.0) * 0.5;
4134 d[6][0] = +2.0 * (s + 2.0 * r - 1.) * (t - 1.);
4135 d[7][0] = -2.0 * s * (t - 1.);
4136 d[8][0] = +2.0 * s * (t - 1.);
4137 d[9][0] = -2.0 * (s + 2.0 * r - 1.) * (t + 1.);
4138 d[10][0] = +2.0 * s * (t + 1.);
4139 d[11][0] = -2.0 * s * (t + 1.);
4140 d[12][0] = +(t - 1.) * (t + 1.);
4141 d[13][0] = -(t - 1.) * (t + 1.);
4144 d[0][1] = -(t - 1.) * (t + 4.0 * s + 4.0 * r - 2.0) * 0.5;
4146 d[2][1] = +(t - 1.) * (t - 4.0 * s + 2.0) * 0.5;
4147 d[3][1] = -(t + 1.) * (t - 4.0 * s - 4.0 * r + 2.0) * 0.5;
4149 d[5][1] = +(t + 1.) * (t + 4.0 * s - 2.0) * 0.5;
4150 d[6][1] = +2.0 * r * (t - 1.);
4151 d[7][1] = -2.0 * r * (t - 1.);
4152 d[8][1] = +2.0 * (2.0 * s + r - 1.) * (t - 1.);
4153 d[9][1] = -2.0 * r * (t + 1.);
4154 d[10][1] = +2.0 * r * (t + 1.);
4155 d[11][1] = -2.0 * (2.0 * s + r - 1.) * (t + 1.);
4156 d[12][1] = +(t - 1.) * (t + 1.);
4158 d[14][1] = -(t - 1.) * (t + 1.);
4160 d[0][2] = -(s + r - 1.) * (2.0 * t + 2.0 * s + 2.0 * r - 1.) * 0.5;
4161 d[1][2] = +r * (2.0 * t - 2.0 * r + 1.) * 0.5;
4162 d[2][2] = +s * (2.0 * t - 2.0 * s + 1.) * 0.5;
4163 d[3][2] = -(s + r - 1.) * (2.0 * t - 2.0 * s - 2.0 * r + 1.) * 0.5;
4164 d[4][2] = +r * (2.0 * t + 2.0 * r - 1.) * 0.5;
4165 d[5][2] = +s * (2.0 * t + 2.0 * s - 1.) * 0.5;
4166 d[6][2] = +2.0 * r * (s + r - 1.);
4167 d[7][2] = -2.0 * r * s;
4168 d[8][2] = +2.0 * s * (s + r - 1.);
4169 d[9][2] = -2.0 * r * (s + r - 1.);
4170 d[10][2] = +2.0 * r * s;
4171 d[11][2] = -2.0 * s * (s + r - 1.);
4172 d[12][2] = +2.0 * (s + r - 1.) * t;
4173 d[13][2] = -2.0 * r * t;
4174 d[14][2] = -2.0 * s * t;
4177 static const int num_nodes = 15;
4178 static const int num_dimensions = 3;
4179 static const int order = 6;
4180 typedef IS_PR ischeme_type;
4182 static ischeme_type create_ischeme() {
4183 ischeme_type ischeme;
4184 ischeme.triangle.set_order(T6_Shape_Evaluator::order);
4185 ischeme.line.set_order(L3_Shape_Evaluator::order);
4189 static ischeme_type create_ischeme(SolidMechanics& property) {
4190 ischeme_type ischeme;
4191 ischeme.triangle.set_order(2 * T6_Shape_Evaluator::order);
4192 ischeme.line.set_order(2 * L3_Shape_Evaluator::order);
4193 ischeme.init(property);
4197 static const double r_node[15];
4198 static const double s_node[15];
4199 static const double t_node[15];
4201 static const bool supports_laminates =
true;
4203 static const char name[5];
4205 typedef L3_Shape_Evaluator edge_shape_type_0;
4206 typedef L3_Shape_Evaluator edge_shape_type_1;
4207 static const int num_edge = 9;
4208 static const int edge_node[9][3];
4209 static const int edge_type_index[9];
4211 typedef T6_Shape_Evaluator face_shape_type_0;
4212 typedef Q8_Shape_Evaluator face_shape_type_1;
4213 static const int num_face = 5;
4214 static const int face_node[5][8];
4215 static const int face_type_index[5];
4216 static const bool is_t_face[5];
4219typedef Solid_Shape_Evaluator<PR15_Shape_Helper> PR15_Shape_Evaluator;
4221class PR18_Shape_Helper :
public PR_Shape_Helper {
4223 static void eval_h(
const double internal_coor[3],
double h[18]) {
4225 T6_Shape_Evaluator::eval_h(internal_coor, inplane);
4226 double outofplane[3];
4227 L3_Shape_Evaluator::eval_h(internal_coor + 2, outofplane);
4228 h[0] = inplane[0] * outofplane[0];
4229 h[1] = inplane[1] * outofplane[0];
4230 h[2] = inplane[2] * outofplane[0];
4231 h[3] = inplane[0] * outofplane[1];
4232 h[4] = inplane[1] * outofplane[1];
4233 h[5] = inplane[2] * outofplane[1];
4234 h[6] = inplane[3] * outofplane[0];
4235 h[7] = inplane[4] * outofplane[0];
4236 h[8] = inplane[5] * outofplane[0];
4237 h[9] = inplane[3] * outofplane[1];
4238 h[10] = inplane[4] * outofplane[1];
4239 h[11] = inplane[5] * outofplane[1];
4240 h[12] = inplane[0] * outofplane[2];
4241 h[13] = inplane[1] * outofplane[2];
4242 h[14] = inplane[2] * outofplane[2];
4243 h[15] = inplane[3] * outofplane[2];
4244 h[16] = inplane[4] * outofplane[2];
4245 h[17] = inplane[5] * outofplane[2];
4248 static void eval_h_derived(
const double internal_coor[3],
double d[18][3]) {
4250 T6_Shape_Evaluator::eval_h(internal_coor, inplane);
4251 double outofplane[3];
4252 L3_Shape_Evaluator::eval_h(internal_coor + 2, outofplane);
4254 double inplane_d[6][2];
4255 T6_Shape_Evaluator::eval_h_derived(internal_coor, inplane_d);
4256 double outofplane_d[3][1];
4257 L3_Shape_Evaluator::eval_h_derived(internal_coor + 2, outofplane_d);
4259 d[0][0] = inplane_d[0][0] * outofplane[0];
4260 d[1][0] = inplane_d[1][0] * outofplane[0];
4261 d[2][0] = inplane_d[2][0] * outofplane[0];
4262 d[3][0] = inplane_d[0][0] * outofplane[1];
4263 d[4][0] = inplane_d[1][0] * outofplane[1];
4264 d[5][0] = inplane_d[2][0] * outofplane[1];
4265 d[6][0] = inplane_d[3][0] * outofplane[0];
4266 d[7][0] = inplane_d[4][0] * outofplane[0];
4267 d[8][0] = inplane_d[5][0] * outofplane[0];
4268 d[9][0] = inplane_d[3][0] * outofplane[1];
4269 d[10][0] = inplane_d[4][0] * outofplane[1];
4270 d[11][0] = inplane_d[5][0] * outofplane[1];
4271 d[12][0] = inplane_d[0][0] * outofplane[2];
4272 d[13][0] = inplane_d[1][0] * outofplane[2];
4273 d[14][0] = inplane_d[2][0] * outofplane[2];
4274 d[15][0] = inplane_d[3][0] * outofplane[2];
4275 d[16][0] = inplane_d[4][0] * outofplane[2];
4276 d[17][0] = inplane_d[5][0] * outofplane[2];
4278 d[0][1] = inplane_d[0][1] * outofplane[0];
4279 d[1][1] = inplane_d[1][1] * outofplane[0];
4280 d[2][1] = inplane_d[2][1] * outofplane[0];
4281 d[3][1] = inplane_d[0][1] * outofplane[1];
4282 d[4][1] = inplane_d[1][1] * outofplane[1];
4283 d[5][1] = inplane_d[2][1] * outofplane[1];
4284 d[6][1] = inplane_d[3][1] * outofplane[0];
4285 d[7][1] = inplane_d[4][1] * outofplane[0];
4286 d[8][1] = inplane_d[5][1] * outofplane[0];
4287 d[9][1] = inplane_d[3][1] * outofplane[1];
4288 d[10][1] = inplane_d[4][1] * outofplane[1];
4289 d[11][1] = inplane_d[5][1] * outofplane[1];
4290 d[12][1] = inplane_d[0][1] * outofplane[2];
4291 d[13][1] = inplane_d[1][1] * outofplane[2];
4292 d[14][1] = inplane_d[2][1] * outofplane[2];
4293 d[15][1] = inplane_d[3][1] * outofplane[2];
4294 d[16][1] = inplane_d[4][1] * outofplane[2];
4295 d[17][1] = inplane_d[5][1] * outofplane[2];
4297 d[0][2] = inplane[0] * outofplane_d[0][0];
4298 d[1][2] = inplane[1] * outofplane_d[0][0];
4299 d[2][2] = inplane[2] * outofplane_d[0][0];
4300 d[3][2] = inplane[0] * outofplane_d[1][0];
4301 d[4][2] = inplane[1] * outofplane_d[1][0];
4302 d[5][2] = inplane[2] * outofplane_d[1][0];
4303 d[6][2] = inplane[3] * outofplane_d[0][0];
4304 d[7][2] = inplane[4] * outofplane_d[0][0];
4305 d[8][2] = inplane[5] * outofplane_d[0][0];
4306 d[9][2] = inplane[3] * outofplane_d[1][0];
4307 d[10][2] = inplane[4] * outofplane_d[1][0];
4308 d[11][2] = inplane[5] * outofplane_d[1][0];
4309 d[12][2] = inplane[0] * outofplane_d[2][0];
4310 d[13][2] = inplane[1] * outofplane_d[2][0];
4311 d[14][2] = inplane[2] * outofplane_d[2][0];
4312 d[15][2] = inplane[3] * outofplane_d[2][0];
4313 d[16][2] = inplane[4] * outofplane_d[2][0];
4314 d[17][2] = inplane[5] * outofplane_d[2][0];
4317 static const int num_nodes = 18;
4318 static const int num_dimensions = 3;
4319 static const int order = 6;
4320 typedef IS_PR ischeme_type;
4322 static ischeme_type create_ischeme() {
4323 ischeme_type ischeme;
4324 ischeme.triangle.set_order(T6_Shape_Evaluator::order);
4325 ischeme.line.set_order(L3_Shape_Evaluator::order);
4329 static ischeme_type create_ischeme(SolidMechanics& property) {
4330 ischeme_type ischeme;
4331 ischeme.triangle.set_order(2 * T6_Shape_Evaluator::order);
4332 ischeme.line.set_order(2 * L3_Shape_Evaluator::order);
4333 ischeme.init(property);
4337 static const double r_node[18];
4338 static const double s_node[18];
4339 static const double t_node[18];
4341 static const bool supports_laminates =
true;
4343 static const char name[5];
4345 typedef L3_Shape_Evaluator edge_shape_type_0;
4346 typedef L3_Shape_Evaluator edge_shape_type_1;
4347 static const int num_edge = 9;
4348 static const int edge_node[9][3];
4349 static const int edge_type_index[9];
4351 typedef T6_Shape_Evaluator face_shape_type_0;
4352 typedef Q9_Shape_Evaluator face_shape_type_1;
4353 static const int num_face = 5;
4354 static const int face_node[5][9];
4355 static const int face_type_index[5];
4356 static const bool is_t_face[5];
4359typedef Solid_Shape_Evaluator<PR18_Shape_Helper> PR18_Shape_Evaluator;
4365class HE_Shape_Helper {
4367 static inline void map_element_coor_to_face_coor(
4368 const double element_coor[3],
4370 double face_coor[2]) {
4372 const double coor_map[6][2][3] = {
4373 {{0., -1., 0.}, {0., 0., 1.}}, {{0., 1., 0.}, {0., 0., 1.}},
4374 {{1., 0., 0.}, {0., 0., 1.}}, {{-1., 0., 0.}, {0., 0., 1.}},
4375 {{-1., 0., 0.}, {0., 1., 0.}}, {{1., 0., 0.}, {0., 1., 0.}}};
4376 for (
int i = 0; i != 2; ++i) {
4378 for (
int j = 0; j != 3; ++j) { face_coor[i] += coor_map[face][i][j] * element_coor[j]; }
4382 static inline void map_face_coor_to_element_coor(
4383 const int face,
const double face_coor[2],
double element_coor[3]) {
4384 const double a[3] = {face_coor[0], face_coor[1], 1.};
4385 const double coor_map[6][3][3] = {
4386 {{0., 0., -1.}, {-1., 0., 0.}, {0., 1., 0.}},
4387 {{0., 0., 1.}, {1., 0., 0.}, {0., 1., 0.}},
4388 {{1., 0., 0.}, {0., 0., -1.}, {0., 1., 0.}},
4389 {{-1., 0., 0.}, {0., 0., 1.}, {0., 1., 0.}},
4390 {{-1., 0., 0.}, {0., 1., 0.}, {0., 0., -1.}},
4391 {{1., 0., 0.}, {0., 1., 0.}, {0., 0., 1.}},
4393 for (
int i = 0; i != 3; ++i) {
4394 element_coor[i] = 0.;
4395 for (
int j = 0; j != 3; ++j) { element_coor[i] += coor_map[face][i][j] * a[j]; }
4400class HE8_Shape_Helper :
public HE_Shape_Helper {
4402 static void eval_h(
const double internal_coor[3],
double h[8]) {
4403 const double r = internal_coor[0];
4404 const double s = internal_coor[1];
4405 const double t = internal_coor[2];
4407 const double rm = r - 1;
4408 const double sm = s - 1;
4409 const double tm = t - 1;
4411 const double rp = r + 1;
4412 const double sp = s + 1;
4413 const double tp = t + 1;
4415 h[0] = -0.125 * rm * sm * tm;
4416 h[1] = +0.125 * rp * sm * tm;
4417 h[2] = -0.125 * rp * sp * tm;
4418 h[3] = +0.125 * rm * sp * tm;
4419 h[4] = +0.125 * rm * sm * tp;
4420 h[5] = -0.125 * rp * sm * tp;
4421 h[6] = +0.125 * rp * sp * tp;
4422 h[7] = -0.125 * rm * sp * tp;
4425 static void eval_h_derived(
const double internal_coor[3],
double d[8][3]) {
4426 const double r = internal_coor[0];
4427 const double s = internal_coor[1];
4428 const double t = internal_coor[2];
4430 const double rm = 1. - r;
4431 const double sm = 1. - s;
4432 const double tm = 1. - t;
4434 const double rp = 1. + r;
4435 const double sp = 1. + s;
4436 const double tp = 1. + t;
4438 const double fa = 0.125;
4441 d[0][0] = -fa * sm * tm;
4442 d[1][0] = +fa * sm * tm;
4443 d[2][0] = +fa * sp * tm;
4444 d[3][0] = -fa * sp * tm;
4445 d[4][0] = -fa * sm * tp;
4446 d[5][0] = +fa * sm * tp;
4447 d[6][0] = +fa * sp * tp;
4448 d[7][0] = -fa * sp * tp;
4451 d[0][1] = -fa * rm * tm;
4452 d[1][1] = -fa * rp * tm;
4453 d[2][1] = +fa * rp * tm;
4454 d[3][1] = +fa * rm * tm;
4455 d[4][1] = -fa * rm * tp;
4456 d[5][1] = -fa * rp * tp;
4457 d[6][1] = +fa * rp * tp;
4458 d[7][1] = +fa * rm * tp;
4461 d[0][2] = -fa * rm * sm;
4462 d[1][2] = -fa * rp * sm;
4463 d[2][2] = -fa * rp * sp;
4464 d[3][2] = -fa * rm * sp;
4465 d[4][2] = +fa * rm * sm;
4466 d[5][2] = +fa * rp * sm;
4467 d[6][2] = +fa * rp * sp;
4468 d[7][2] = +fa * rm * sp;
4471 static const int num_nodes = 8;
4472 static const int num_faces = 6;
4473 static const int num_dimensions = 3;
4474 static const int order = 3;
4475 typedef IS_HE ischeme_type;
4477 static ischeme_type create_ischeme() {
4478 ischeme_type ischeme;
4479 ischeme[0].set_order(1);
4480 ischeme[1].set_order(1);
4481 ischeme[2].set_order(1);
4485 static ischeme_type create_ischeme(SolidMechanics& property) {
4486 ischeme_type ischeme;
4487 ischeme[0].set_order(2 * 1);
4488 ischeme[1].set_order(2 * 1);
4489 ischeme[2].set_order(2 * 1);
4490 ischeme.init(property);
4494 static const double r_node[8];
4495 static const double s_node[8];
4496 static const double t_node[8];
4498 static const bool supports_laminates =
true;
4500 static const char name[4];
4502 typedef L2_Shape_Evaluator edge_shape_type_0;
4503 typedef L2_Shape_Evaluator edge_shape_type_1;
4504 static const int num_edge = 12;
4505 static const int edge_node[12][2];
4506 static const int edge_type_index[12];
4508 typedef Q4_Shape_Evaluator face_shape_type_0;
4509 typedef Q4_Shape_Evaluator face_shape_type_1;
4510 static const int num_face = 6;
4511 static const int face_node[6][4];
4512 static const int face_type_index[6];
4513 static const bool is_t_face[6];
4516typedef Solid_Shape_Evaluator<HE8_Shape_Helper> HE8_Shape_Evaluator;
4518class HE20_Shape_Helper :
public HE_Shape_Helper {
4520 static void eval_h(
const double internal_coor[3],
double h[20]) {
4521 const double r = internal_coor[0];
4522 const double s = internal_coor[1];
4523 const double t = internal_coor[2];
4525 const double rm = r - 1;
4526 const double sm = s - 1;
4527 const double tm = t - 1;
4529 const double rp = r + 1;
4530 const double sp = s + 1;
4531 const double tp = t + 1;
4533 h[0] = +0.125 * rm * sm * tm * (t + s + r + 2);
4534 h[1] = -0.125 * rp * sm * tm * (t + s - r + 2);
4535 h[2] = +0.125 * rp * sp * tm * (t - s - r + 2);
4536 h[3] = -0.125 * rm * sp * tm * (t - s + r + 2);
4537 h[4] = +0.125 * rm * sm * tp * (t - s - r - 2);
4538 h[5] = -0.125 * rp * sm * tp * (t - s + r - 2);
4539 h[6] = +0.125 * rp * sp * tp * (t + s + r - 2);
4540 h[7] = -0.125 * rm * sp * tp * (t + s - r - 2);
4541 h[8] = -0.250 * rm * rp * sm * tm;
4542 h[9] = +0.250 * rp * sm * sp * tm;
4543 h[10] = +0.250 * rm * rp * sp * tm;
4544 h[11] = -0.250 * rm * sm * sp * tm;
4545 h[12] = +0.250 * rm * rp * sm * tp;
4546 h[13] = -0.250 * rp * sm * sp * tp;
4547 h[14] = -0.250 * rm * rp * sp * tp;
4548 h[15] = +0.250 * rm * sm * sp * tp;
4549 h[16] = -0.250 * rm * sm * tm * tp;
4550 h[17] = +0.250 * rp * sm * tm * tp;
4551 h[18] = -0.250 * rp * sp * tm * tp;
4552 h[19] = +0.250 * rm * sp * tm * tp;
4555 static void eval_h_derived(
const double internal_coor[3],
double d[20][3]) {
4556 const double r = internal_coor[0];
4557 const double s = internal_coor[1];
4558 const double t = internal_coor[2];
4560 const double rm = r - 1;
4561 const double sm = s - 1;
4562 const double tm = t - 1;
4564 const double rp = 1. + r;
4565 const double sp = 1. + s;
4566 const double tp = 1. + t;
4569 d[0][0] = +0.125 * sm * tm * (t + s + 2 * r + 1);
4570 d[1][0] = -0.125 * sm * tm * (t + s - 2 * r + 1);
4571 d[2][0] = +0.125 * sp * tm * (t - s - 2 * r + 1);
4572 d[3][0] = -0.125 * sp * tm * (t - s + 2 * r + 1);
4573 d[4][0] = +0.125 * sm * tp * (t - s - 2 * r - 1);
4574 d[5][0] = -0.125 * sm * tp * (t - s + 2 * r - 1);
4575 d[6][0] = +0.125 * sp * tp * (t + s + 2 * r - 1);
4576 d[7][0] = -0.125 * sp * tp * (t + s - 2 * r - 1);
4577 d[8][0] = -0.5 * r * sm * tm;
4578 d[9][0] = +0.25 * sm * sp * tm;
4579 d[10][0] = +0.5 * r * sp * tm;
4580 d[11][0] = -0.25 * sm * sp * tm;
4581 d[12][0] = +0.5 * r * sm * tp;
4582 d[13][0] = -0.25 * sm * sp * tp;
4583 d[14][0] = -0.5 * r * sp * tp;
4584 d[15][0] = +0.25 * sm * sp * tp;
4585 d[16][0] = -0.25 * sm * tm * tp;
4586 d[17][0] = +0.25 * sm * tm * tp;
4587 d[18][0] = -0.25 * sp * tm * tp;
4588 d[19][0] = +0.25 * sp * tm * tp;
4591 d[0][1] = +0.125 * rm * tm * (t + 2 * s + r + 1);
4592 d[1][1] = -0.125 * rp * tm * (t + 2 * s - r + 1);
4593 d[2][1] = +0.125 * rp * tm * (t - 2 * s - r + 1);
4594 d[3][1] = -0.125 * rm * tm * (t - 2 * s + r + 1);
4595 d[4][1] = +0.125 * rm * tp * (t - 2 * s - r - 1);
4596 d[5][1] = -0.125 * rp * tp * (t - 2 * s + r - 1);
4597 d[6][1] = +0.125 * rp * tp * (t + 2 * s + r - 1);
4598 d[7][1] = -0.125 * rm * tp * (t + 2 * s - r - 1);
4599 d[8][1] = -0.25 * rm * rp * tm;
4600 d[9][1] = +0.5 * rp * s * tm;
4601 d[10][1] = +0.25 * rm * rp * tm;
4602 d[11][1] = -0.5 * rm * s * tm;
4603 d[12][1] = +0.25 * rm * rp * tp;
4604 d[13][1] = -0.5 * rp * s * tp;
4605 d[14][1] = -0.25 * rm * rp * tp;
4606 d[15][1] = +0.5 * rm * s * tp;
4607 d[16][1] = -0.25 * rm * tm * tp;
4608 d[17][1] = +0.25 * rp * tm * tp;
4609 d[18][1] = -0.25 * rp * tm * tp;
4610 d[19][1] = +0.25 * rm * tm * tp;
4613 d[0][2] = +0.125 * rm * sm * (2 * t + s + r + 1);
4614 d[1][2] = -0.125 * rp * sm * (2 * t + s - r + 1);
4615 d[2][2] = +0.125 * rp * sp * (2 * t - s - r + 1);
4616 d[3][2] = -0.125 * rm * sp * (2 * t - s + r + 1);
4617 d[4][2] = +0.125 * rm * sm * (2 * t - s - r - 1);
4618 d[5][2] = -0.125 * rp * sm * (2 * t - s + r - 1);
4619 d[6][2] = +0.125 * rp * sp * (2 * t + s + r - 1);
4620 d[7][2] = -0.125 * rm * sp * (2 * t + s - r - 1);
4621 d[8][2] = -0.25 * rm * rp * sm;
4622 d[9][2] = +0.25 * rp * sm * sp;
4623 d[10][2] = +0.25 * rm * rp * sp;
4624 d[11][2] = -0.25 * rm * sm * sp;
4625 d[12][2] = +0.25 * rm * rp * sm;
4626 d[13][2] = -0.25 * rp * sm * sp;
4627 d[14][2] = -0.25 * rm * rp * sp;
4628 d[15][2] = +0.25 * rm * sm * sp;
4629 d[16][2] = -0.5 * rm * sm * t;
4630 d[17][2] = +0.5 * rp * sm * t;
4631 d[18][2] = -0.5 * rp * sp * t;
4632 d[19][2] = +0.5 * rm * sp * t;
4635 static const int num_nodes = 20;
4636 static const int num_faces = 6;
4637 static const int num_dimensions = 3;
4638 static const int order = 6;
4639 typedef IS_HE ischeme_type;
4641 static ischeme_type create_ischeme() {
4642 ischeme_type ischeme;
4643 ischeme[0].set_order(2);
4644 ischeme[1].set_order(2);
4645 ischeme[2].set_order(2);
4649 static ischeme_type create_ischeme(SolidMechanics& property) {
4650 ischeme_type ischeme;
4651 ischeme[0].set_order(2 * 2);
4652 ischeme[1].set_order(2 * 2);
4653 ischeme[2].set_order(2 * 2);
4654 ischeme.init(property);
4658 static const double r_node[20];
4659 static const double s_node[20];
4660 static const double t_node[20];
4662 static const bool supports_laminates =
true;
4664 static const char name[5];
4666 typedef L3_Shape_Evaluator edge_shape_type_0;
4667 typedef L3_Shape_Evaluator edge_shape_type_1;
4668 static const int num_edge = 12;
4669 static const int edge_node[12][3];
4670 static const int edge_type_index[12];
4672 typedef Q8_Shape_Evaluator face_shape_type_0;
4673 typedef Q8_Shape_Evaluator face_shape_type_1;
4674 static const int num_face = 6;
4675 static const int face_node[6][8];
4676 static const int face_type_index[6];
4677 static const bool is_t_face[6];
4680typedef Solid_Shape_Evaluator<HE20_Shape_Helper> HE20_Shape_Evaluator;
4682class HE27_Shape_Helper :
public HE_Shape_Helper {
4684 static void eval_h(
const double internal_coor[3],
double h[27]) {
4685 const double r = internal_coor[0];
4686 const double s = internal_coor[1];
4687 const double t = internal_coor[2];
4689 const double rm = r - 1;
4690 const double sm = s - 1;
4691 const double tm = t - 1;
4693 const double rp = r + 1;
4694 const double sp = s + 1;
4695 const double tp = t + 1;
4697 h[0] = +0.125 * rm * r * sm * s * tm * t;
4698 h[1] = +0.125 * rp * r * sm * s * tm * t;
4699 h[2] = +0.125 * rp * r * sp * s * tm * t;
4700 h[3] = +0.125 * rm * r * sp * s * tm * t;
4701 h[4] = +0.125 * rm * r * sm * s * tp * t;
4702 h[5] = +0.125 * rp * r * sm * s * tp * t;
4703 h[6] = +0.125 * rp * r * sp * s * tp * t;
4704 h[7] = +0.125 * rm * r * sp * s * tp * t;
4705 h[8] = -0.250 * rm * rp * sm * s * tm * t;
4706 h[9] = -0.250 * rp * r * sm * sp * tm * t;
4707 h[10] = -0.250 * rm * rp * sp * s * tm * t;
4708 h[11] = -0.250 * rm * r * sm * sp * tm * t;
4709 h[12] = -0.250 * rm * rp * sm * s * tp * t;
4710 h[13] = -0.250 * rp * r * sm * sp * tp * t;
4711 h[14] = -0.250 * rm * rp * sp * s * tp * t;
4712 h[15] = -0.250 * rm * r * sm * sp * tp * t;
4713 h[16] = -0.250 * rm * r * sm * s * tm * tp;
4714 h[17] = -0.250 * rp * r * sm * s * tm * tp;
4715 h[18] = -0.250 * rp * r * sp * s * tm * tp;
4716 h[19] = -0.250 * rm * r * sp * s * tm * tp;
4717 h[20] = +0.500 * rm * r * sm * sp * tm * tp;
4718 h[21] = +0.500 * rp * r * sm * sp * tm * tp;
4719 h[22] = +0.500 * rm * rp * sm * s * tm * tp;
4720 h[23] = +0.500 * rm * rp * sp * s * tm * tp;
4721 h[24] = +0.500 * rm * rp * sm * sp * tm * t;
4722 h[25] = +0.500 * rm * rp * sm * sp * tp * t;
4723 h[26] = -1.00 * rm * rp * sm * sp * tm * tp;
4726 static void eval_h_derived(
const double internal_coor[3],
double d[27][3]) {
4727 const double r = internal_coor[0];
4728 const double s = internal_coor[1];
4729 const double t = internal_coor[2];
4731 const double rm = r - 1;
4732 const double sm = s - 1;
4733 const double tm = t - 1;
4735 const double rp = 1. + r;
4736 const double sp = 1. + s;
4737 const double tp = 1. + t;
4739 const double rm2 = 2.0 * r - 1;
4740 const double rp2 = 2.0 * r + 1;
4741 const double sm2 = 2.0 * s - 1;
4742 const double sp2 = 2.0 * s + 1;
4743 const double tm2 = 2.0 * t - 1;
4744 const double tp2 = 2.0 * t + 1;
4747 d[0][0] = +0.125 * rm2 * sm * s * tm * t;
4748 d[1][0] = +0.125 * rp2 * sm * s * tm * t;
4749 d[2][0] = +0.125 * rp2 * s * sp * tm * t;
4750 d[3][0] = +0.125 * rm2 * s * sp * tm * t;
4751 d[4][0] = +0.125 * rm2 * sm * s * t * tp;
4752 d[5][0] = +0.125 * rp2 * sm * s * t * tp;
4753 d[6][0] = +0.125 * rp2 * s * sp * t * tp;
4754 d[7][0] = +0.125 * rm2 * s * sp * t * tp;
4755 d[8][0] = -0.5 * r * sm * s * tm * t;
4756 d[9][0] = -0.25 * rp2 * sm * sp * tm * t;
4757 d[10][0] = -0.5 * r * s * sp * tm * t;
4758 d[11][0] = -0.25 * rm2 * sm * sp * tm * t;
4759 d[12][0] = -0.5 * r * sm * s * t * tp;
4760 d[13][0] = -0.25 * rp2 * sm * sp * t * tp;
4761 d[14][0] = -0.5 * r * s * sp * t * tp;
4762 d[15][0] = -0.25 * rm2 * sm * sp * t * tp;
4763 d[16][0] = -0.25 * rm2 * sm * s * tm * tp;
4764 d[17][0] = -0.25 * rp2 * sm * s * tm * tp;
4765 d[18][0] = -0.25 * rp2 * s * sp * tm * tp;
4766 d[19][0] = -0.25 * rm2 * s * sp * tm * tp;
4767 d[20][0] = +0.5 * rm2 * sm * sp * tm * tp;
4768 d[21][0] = +0.5 * rp2 * sm * sp * tm * tp;
4769 d[22][0] = +1. * r * sm * s * tm * tp;
4770 d[23][0] = +1. * r * s * sp * tm * tp;
4771 d[24][0] = +1. * r * sm * sp * tm * t;
4772 d[25][0] = +1. * r * sm * sp * t * tp;
4773 d[26][0] = -2.0 * r * sm * sp * tm * tp;
4776 d[0][1] = +0.125 * rm * r * sm2 * tm * t;
4777 d[1][1] = +0.125 * r * rp * sm2 * tm * t;
4778 d[2][1] = +0.125 * r * rp * sp2 * tm * t;
4779 d[3][1] = +0.125 * rm * r * sp2 * tm * t;
4780 d[4][1] = +0.125 * rm * r * sm2 * t * tp;
4781 d[5][1] = +0.125 * r * rp * sm2 * t * tp;
4782 d[6][1] = +0.125 * r * rp * sp2 * t * tp;
4783 d[7][1] = +0.125 * rm * r * sp2 * t * tp;
4784 d[8][1] = -0.25 * rm * rp * sm2 * tm * t;
4785 d[9][1] = -0.5 * r * rp * s * tm * t;
4786 d[10][1] = -0.25 * rm * rp * sp2 * tm * t;
4787 d[11][1] = -0.5 * rm * r * s * tm * t;
4788 d[12][1] = -0.25 * rm * rp * sm2 * t * tp;
4789 d[13][1] = -0.5 * r * rp * s * t * tp;
4790 d[14][1] = -0.25 * rm * rp * sp2 * t * tp;
4791 d[15][1] = -0.5 * rm * r * s * t * tp;
4792 d[16][1] = -0.25 * rm * r * sm2 * tm * tp;
4793 d[17][1] = -0.25 * r * rp * sm2 * tm * tp;
4794 d[18][1] = -0.25 * r * rp * sp2 * tm * tp;
4795 d[19][1] = -0.25 * rm * r * sp2 * tm * tp;
4796 d[20][1] = +1. * rm * r * s * tm * tp;
4797 d[21][1] = +1. * r * rp * s * tm * tp;
4798 d[22][1] = +0.5 * rm * rp * sm2 * tm * tp;
4799 d[23][1] = +0.5 * rm * rp * sp2 * tm * tp;
4800 d[24][1] = +1. * rm * rp * s * tm * t;
4801 d[25][1] = +1. * rm * rp * s * t * tp;
4802 d[26][1] = -2.0 * rm * rp * s * tm * tp;
4805 d[0][2] = +0.125 * rm * r * sm * s * tm2;
4806 d[1][2] = +0.125 * r * rp * sm * s * tm2;
4807 d[2][2] = +0.125 * r * rp * s * sp * tm2;
4808 d[3][2] = +0.125 * rm * r * s * sp * tm2;
4809 d[4][2] = +0.125 * rm * r * sm * s * tp2;
4810 d[5][2] = +0.125 * r * rp * sm * s * tp2;
4811 d[6][2] = +0.125 * r * rp * s * sp * tp2;
4812 d[7][2] = +0.125 * rm * r * s * sp * tp2;
4813 d[8][2] = -0.25 * rm * rp * sm * s * tm2;
4814 d[9][2] = -0.25 * r * rp * sm * sp * tm2;
4815 d[10][2] = -0.25 * rm * rp * s * sp * tm2;
4816 d[11][2] = -0.25 * rm * r * sm * sp * tm2;
4817 d[12][2] = -0.25 * rm * rp * sm * s * tp2;
4818 d[13][2] = -0.25 * r * rp * sm * sp * tp2;
4819 d[14][2] = -0.25 * rm * rp * s * sp * tp2;
4820 d[15][2] = -0.25 * rm * r * sm * sp * tp2;
4821 d[16][2] = -0.5 * rm * r * sm * s * t;
4822 d[17][2] = -0.5 * r * rp * sm * s * t;
4823 d[18][2] = -0.5 * r * rp * s * sp * t;
4824 d[19][2] = -0.5 * rm * r * s * sp * t;
4825 d[20][2] = +1. * rm * r * sm * sp * t;
4826 d[21][2] = +1. * r * rp * sm * sp * t;
4827 d[22][2] = +1. * rm * rp * sm * s * t;
4828 d[23][2] = +1. * rm * rp * s * sp * t;
4829 d[24][2] = +0.5 * rm * rp * sm * sp * tm2;
4830 d[25][2] = +0.5 * rm * rp * sm * sp * tp2;
4831 d[26][2] = -2.0 * rm * rp * sm * sp * t;
4834 static const int num_nodes = 27;
4835 static const int num_faces = 6;
4836 static const int num_dimensions = 3;
4837 static const int order = 6;
4838 typedef IS_HE ischeme_type;
4840 static ischeme_type create_ischeme() {
4841 ischeme_type ischeme;
4842 ischeme[0].set_order(2);
4843 ischeme[1].set_order(2);
4844 ischeme[2].set_order(2);
4848 static ischeme_type create_ischeme(SolidMechanics& property) {
4849 ischeme_type ischeme;
4850 ischeme[0].set_order(2 * 2);
4851 ischeme[1].set_order(2 * 2);
4852 ischeme[2].set_order(2 * 2);
4853 ischeme.init(property);
4857 static const double r_node[27];
4858 static const double s_node[27];
4859 static const double t_node[27];
4861 static const bool supports_laminates =
true;
4863 static const char name[5];
4865 typedef L3_Shape_Evaluator edge_shape_type_0;
4866 typedef L3_Shape_Evaluator edge_shape_type_1;
4867 static const int num_edge = 12;
4868 static const int edge_node[12][3];
4869 static const int edge_type_index[12];
4871 typedef Q9_Shape_Evaluator face_shape_type_0;
4872 typedef Q9_Shape_Evaluator face_shape_type_1;
4873 static const int num_face = 6;
4874 static const int face_node[6][9];
4875 static const int face_type_index[6];
4876 static const bool is_t_face[6];
4879typedef Solid_Shape_Evaluator<HE27_Shape_Helper> HE27_Shape_Evaluator;
4881class HE3X3X2_Shape_Helper :
public HE_Shape_Helper {
4883 static void eval_h(
const double internal_coor[3],
double h[18]) {
4884 const double r = internal_coor[0];
4885 const double s = internal_coor[1];
4886 const double t = internal_coor[2];
4888 const double rm = r - 1;
4889 const double sm = s - 1;
4890 const double tm = t - 1;
4892 const double rp = r + 1;
4893 const double sp = s + 1;
4894 const double tp = t + 1;
4896 h[0] = -rm * r * sm * s * tm / 8;
4897 h[1] = -r * rp * sm * s * tm / 8;
4898 h[2] = -r * rp * s * sp * tm / 8;
4899 h[3] = -rm * r * s * sp * tm / 8;
4900 h[4] = +rm * r * sm * s * tp / 8;
4901 h[5] = +r * rp * sm * s * tp / 8;
4902 h[6] = +r * rp * s * sp * tp / 8;
4903 h[7] = +rm * r * s * sp * tp / 8;
4904 h[8] = +rm * rp * sm * s * tm / 4;
4905 h[9] = +rm * r * sm * sp * tm / 4;
4906 h[10] = -rm * rp * sm * sp * tm / 2;
4907 h[11] = +r * rp * sm * sp * tm / 4;
4908 h[12] = +rm * rp * s * sp * tm / 4;
4909 h[13] = -rm * rp * sm * s * tp / 4;
4910 h[14] = -rm * r * sm * sp * tp / 4;
4911 h[15] = +rm * rp * sm * sp * tp / 2;
4912 h[16] = -r * rp * sm * sp * tp / 4;
4913 h[17] = -rm * rp * s * sp * tp / 4;
4916 static void eval_h_derived(
const double internal_coor[3],
double d[18][3]) {
4917 const double r = internal_coor[0];
4918 const double s = internal_coor[1];
4919 const double t = internal_coor[2];
4921 const double rm = r - 1;
4922 const double sm = s - 1;
4923 const double tm = t - 1;
4925 const double rp = 1. + r;
4926 const double sp = 1. + s;
4927 const double tp = 1. + t;
4929 const double r2m = 2 * r - 1;
4930 const double r2p = 2 * r + 1;
4931 const double s2m = 2 * s - 1;
4932 const double s2p = 2 * s + 1;
4934 d[0][0] = -r2m * sm * s * tm / 8;
4935 d[1][0] = -r2p * sm * s * tm / 8;
4936 d[2][0] = -r2p * s * sp * tm / 8;
4937 d[3][0] = -r2m * s * sp * tm / 8;
4938 d[4][0] = +r2m * sm * s * tp / 8;
4939 d[5][0] = +r2p * sm * s * tp / 8;
4940 d[6][0] = +r2p * s * sp * tp / 8;
4941 d[7][0] = +r2m * s * sp * tp / 8;
4942 d[8][0] = +r * sm * s * tm / 2;
4943 d[9][0] = +r2m * sm * sp * tm / 4;
4944 d[10][0] = -r * sm * sp * tm;
4945 d[11][0] = +r2p * sm * sp * tm / 4;
4946 d[12][0] = +r * s * sp * tm / 2;
4947 d[13][0] = -r * sm * s * tp / 2;
4948 d[14][0] = -r2m * sm * sp * tp / 4;
4949 d[15][0] = +r * sm * sp * tp;
4950 d[16][0] = -r2p * sm * sp * tp / 4;
4951 d[17][0] = -r * s * sp * tp / 2;
4952 d[0][1] = -rm * r * s2m * tm / 8;
4953 d[1][1] = -r * rp * s2m * tm / 8;
4954 d[2][1] = -r * rp * s2p * tm / 8;
4955 d[3][1] = -rm * r * s2p * tm / 8;
4956 d[4][1] = +rm * r * s2m * tp / 8;
4957 d[5][1] = +r * rp * s2m * tp / 8;
4958 d[6][1] = +r * rp * s2p * tp / 8;
4959 d[7][1] = +rm * r * s2p * tp / 8;
4960 d[8][1] = +rm * rp * s2m * tm / 4;
4961 d[9][1] = +rm * r * s * tm / 2;
4962 d[10][1] = -rm * rp * s * tm;
4963 d[11][1] = +r * rp * s * tm / 2;
4964 d[12][1] = +rm * rp * s2p * tm / 4;
4965 d[13][1] = -rm * rp * s2m * tp / 4;
4966 d[14][1] = -rm * r * s * tp / 2;
4967 d[15][1] = +rm * rp * s * tp;
4968 d[16][1] = -r * rp * s * tp / 2;
4969 d[17][1] = -rm * rp * s2p * tp / 4;
4970 d[0][2] = -rm * r * sm * s / 8;
4971 d[1][2] = -r * rp * sm * s / 8;
4972 d[2][2] = -r * rp * s * sp / 8;
4973 d[3][2] = -rm * r * s * sp / 8;
4974 d[4][2] = +rm * r * sm * s / 8;
4975 d[5][2] = +r * rp * sm * s / 8;
4976 d[6][2] = +r * rp * s * sp / 8;
4977 d[7][2] = +rm * r * s * sp / 8;
4978 d[8][2] = +rm * rp * sm * s / 4;
4979 d[9][2] = +rm * r * sm * sp / 4;
4980 d[10][2] = -rm * rp * sm * sp / 2;
4981 d[11][2] = +r * rp * sm * sp / 4;
4982 d[12][2] = +rm * rp * s * sp / 4;
4983 d[13][2] = -rm * rp * sm * s / 4;
4984 d[14][2] = -rm * r * sm * sp / 4;
4985 d[15][2] = +rm * rp * sm * sp / 2;
4986 d[16][2] = -r * rp * sm * sp / 4;
4987 d[17][2] = -rm * rp * s * sp / 4;
4990 static const int num_nodes = 18;
4991 static const int num_faces = 6;
4992 static const int num_dimensions = 3;
4993 static const int order = 5;
4994 typedef IS_HE ischeme_type;
4996 static ischeme_type create_ischeme() {
4997 ischeme_type ischeme;
4998 ischeme[0].set_order(2);
4999 ischeme[1].set_order(2);
5000 ischeme[2].set_order(1);
5004 static ischeme_type create_ischeme(SolidMechanics& property) {
5005 ischeme_type ischeme;
5006 ischeme[0].set_order(2 * 2);
5007 ischeme[1].set_order(2 * 2);
5008 ischeme[2].set_order(2 * 1);
5009 ischeme.init(property);
5013 static const double r_node[18];
5014 static const double s_node[18];
5015 static const double t_node[18];
5017 static const bool supports_laminates =
true;
5019 static const char name[8];
5021 typedef L3_Shape_Evaluator edge_shape_type_0;
5022 typedef L2_Shape_Evaluator edge_shape_type_1;
5023 static const int num_edge = 12;
5024 static const int edge_node[12][3];
5025 static const int edge_type_index[12];
5027 typedef Q3X2_Shape_Evaluator face_shape_type_0;
5028 typedef Q9_Shape_Evaluator face_shape_type_1;
5029 static const int num_face = 6;
5030 static const int face_node[6][9];
5031 static const int face_type_index[6];
5032 static const bool is_t_face[6];
5035typedef Solid_Shape_Evaluator<HE3X3X2_Shape_Helper> HE3X3X2_Shape_Evaluator;
5037class HE32_Shape_Helper :
public HE_Shape_Helper {
5039 static void eval_h(
const double internal_coor[3],
double h[32]) {
5040 const double r = internal_coor[0];
5041 const double s = internal_coor[1];
5042 const double t = internal_coor[2];
5044 const double rm = r - 1;
5045 const double rp = r + 1;
5046 const double sm = s - 1;
5047 const double sp = s + 1;
5048 const double tm = t - 1;
5049 const double tp = t + 1;
5051 const double r3m = 3 * r - 1;
5052 const double r3p = 3 * r + 1;
5053 const double s3m = 3 * s - 1;
5054 const double s3p = 3 * s + 1;
5055 const double t3m = 3 * t - 1;
5056 const double t3p = 3 * t + 1;
5058 const double rr = r * r;
5059 const double ss = s * s;
5060 const double tt = t * t;
5062 const double fa = 0.015625;
5064 h[0] = -rm * sm * tm * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5065 h[1] = +rp * sm * tm * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5066 h[2] = -rp * sp * tm * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5067 h[3] = +rm * sp * tm * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5068 h[4] = +rm * sm * tp * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5069 h[5] = -rp * sm * tp * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5070 h[6] = +rp * sp * tp * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5071 h[7] = -rm * sp * tp * (9 * tt + 9 * ss + 9 * rr - 19) * fa;
5072 h[8] = +9 * rm * rp * r3m * sm * tm * fa;
5073 h[9] = -9 * rm * rp * r3p * sm * tm * fa;
5074 h[10] = +9 * rm * sm * sp * s3m * tm * fa;
5075 h[11] = -9 * rp * sm * sp * s3m * tm * fa;
5076 h[12] = -9 * rm * sm * sp * s3p * tm * fa;
5077 h[13] = +9 * rp * sm * sp * s3p * tm * fa;
5078 h[14] = -9 * rm * rp * r3m * sp * tm * fa;
5079 h[15] = +9 * rm * rp * r3p * sp * tm * fa;
5080 h[16] = +9 * rm * sm * tm * tp * t3m * fa;
5081 h[17] = -9 * rp * sm * tm * tp * t3m * fa;
5082 h[18] = -9 * rm * sp * tm * tp * t3m * fa;
5083 h[19] = +9 * rp * sp * tm * tp * t3m * fa;
5084 h[20] = -9 * rm * sm * tm * tp * t3p * fa;
5085 h[21] = +9 * rp * sm * tm * tp * t3p * fa;
5086 h[22] = +9 * rm * sp * tm * tp * t3p * fa;
5087 h[23] = -9 * rp * sp * tm * tp * t3p * fa;
5088 h[24] = -9 * rm * rp * r3m * sm * tp * fa;
5089 h[25] = +9 * rm * rp * r3p * sm * tp * fa;
5090 h[26] = -9 * rm * sm * sp * s3m * tp * fa;
5091 h[27] = +9 * rp * sm * sp * s3m * tp * fa;
5092 h[28] = +9 * rm * sm * sp * s3p * tp * fa;
5093 h[29] = -9 * rp * sm * sp * s3p * tp * fa;
5094 h[30] = +9 * rm * rp * r3m * sp * tp * fa;
5095 h[31] = -9 * rm * rp * r3p * sp * tp * fa;
5098 static void eval_h_derived(
const double internal_coor[3],
double d[32][3]) {
5099 const double r = internal_coor[0];
5100 const double s = internal_coor[1];
5101 const double t = internal_coor[2];
5103 const double rm = r - 1;
5104 const double rp = r + 1;
5105 const double sm = s - 1;
5106 const double sp = s + 1;
5107 const double tm = t - 1;
5108 const double tp = t + 1;
5110 const double r3m = 3 * r - 1;
5111 const double r3p = 3 * r + 1;
5112 const double s3m = 3 * s - 1;
5113 const double s3p = 3 * s + 1;
5114 const double t3m = 3 * t - 1;
5115 const double t3p = 3 * t + 1;
5117 const double rr = r * r;
5118 const double ss = s * s;
5119 const double tt = t * t;
5121 const double fa = 0.015625;
5123 d[0][0] = -sm * tm * (9 * tt + 9 * ss + 27 * rr - 18 * r - 19) * fa;
5124 d[1][0] = +sm * tm * (9 * tt + 9 * ss + 27 * rr + 18 * r - 19) * fa;
5125 d[2][0] = -sp * tm * (9 * tt + 9 * ss + 27 * rr + 18 * r - 19) * fa;
5126 d[3][0] = +sp * tm * (9 * tt + 9 * ss + 27 * rr - 18 * r - 19) * fa;
5127 d[4][0] = +sm * tp * (9 * tt + 9 * ss + 27 * rr - 18 * r - 19) * fa;
5128 d[5][0] = -sm * tp * (9 * tt + 9 * ss + 27 * rr + 18 * r - 19) * fa;
5129 d[6][0] = +sp * tp * (9 * tt + 9 * ss + 27 * rr + 18 * r - 19) * fa;
5130 d[7][0] = -sp * tp * (9 * tt + 9 * ss + 27 * rr - 18 * r - 19) * fa;
5131 d[8][0] = +9 * (9 * rr - 2 * r - 3) * sm * tm * fa;
5132 d[9][0] = -9 * (9 * rr + 2 * r - 3) * sm * tm * fa;
5133 d[10][0] = +9 * sm * sp * s3m * tm * fa;
5134 d[11][0] = -9 * sm * sp * s3m * tm * fa;
5135 d[12][0] = -9 * sm * sp * s3p * tm * fa;
5136 d[13][0] = +9 * sm * sp * s3p * tm * fa;
5137 d[14][0] = -9 * (9 * rr - 2 * r - 3) * sp * tm * fa;
5138 d[15][0] = +9 * (9 * rr + 2 * r - 3) * sp * tm * fa;
5139 d[16][0] = +9 * sm * tm * tp * t3m * fa;
5140 d[17][0] = -9 * sm * tm * tp * t3m * fa;
5141 d[18][0] = -9 * sp * tm * tp * t3m * fa;
5142 d[19][0] = +9 * sp * tm * tp * t3m * fa;
5143 d[20][0] = -9 * sm * tm * tp * t3p * fa;
5144 d[21][0] = +9 * sm * tm * tp * t3p * fa;
5145 d[22][0] = +9 * sp * tm * tp * t3p * fa;
5146 d[23][0] = -9 * sp * tm * tp * t3p * fa;
5147 d[24][0] = -9 * (9 * rr - 2 * r - 3) * sm * tp * fa;
5148 d[25][0] = +9 * (9 * rr + 2 * r - 3) * sm * tp * fa;
5149 d[26][0] = -9 * sm * sp * s3m * tp * fa;
5150 d[27][0] = +9 * sm * sp * s3m * tp * fa;
5151 d[28][0] = +9 * sm * sp * s3p * tp * fa;
5152 d[29][0] = -9 * sm * sp * s3p * tp * fa;
5153 d[30][0] = +9 * (9 * rr - 2 * r - 3) * sp * tp * fa;
5154 d[31][0] = -9 * (9 * rr + 2 * r - 3) * sp * tp * fa;
5155 d[0][1] = -rm * tm * (9 * tt + 27 * ss - 18 * s + 9 * rr - 19) * fa;
5156 d[1][1] = +rp * tm * (9 * tt + 27 * ss - 18 * s + 9 * rr - 19) * fa;
5157 d[2][1] = -rp * tm * (9 * tt + 27 * ss + 18 * s + 9 * rr - 19) * fa;
5158 d[3][1] = +rm * tm * (9 * tt + 27 * ss + 18 * s + 9 * rr - 19) * fa;
5159 d[4][1] = +rm * tp * (9 * tt + 27 * ss - 18 * s + 9 * rr - 19) * fa;
5160 d[5][1] = -rp * tp * (9 * tt + 27 * ss - 18 * s + 9 * rr - 19) * fa;
5161 d[6][1] = +rp * tp * (9 * tt + 27 * ss + 18 * s + 9 * rr - 19) * fa;
5162 d[7][1] = -rm * tp * (9 * tt + 27 * ss + 18 * s + 9 * rr - 19) * fa;
5163 d[8][1] = +9 * rm * rp * r3m * tm * fa;
5164 d[9][1] = -9 * rm * rp * r3p * tm * fa;
5165 d[10][1] = +9 * rm * (9 * ss - 2 * s - 3) * tm * fa;
5166 d[11][1] = -9 * rp * (9 * ss - 2 * s - 3) * tm * fa;
5167 d[12][1] = -9 * rm * (9 * ss + 2 * s - 3) * tm * fa;
5168 d[13][1] = +9 * rp * (9 * ss + 2 * s - 3) * tm * fa;
5169 d[14][1] = -9 * rm * rp * r3m * tm * fa;
5170 d[15][1] = +9 * rm * rp * r3p * tm * fa;
5171 d[16][1] = +9 * rm * tm * tp * t3m * fa;
5172 d[17][1] = -9 * rp * tm * tp * t3m * fa;
5173 d[18][1] = -9 * rm * tm * tp * t3m * fa;
5174 d[19][1] = +9 * rp * tm * tp * t3m * fa;
5175 d[20][1] = -9 * rm * tm * tp * t3p * fa;
5176 d[21][1] = +9 * rp * tm * tp * t3p * fa;
5177 d[22][1] = +9 * rm * tm * tp * t3p * fa;
5178 d[23][1] = -9 * rp * tm * tp * t3p * fa;
5179 d[24][1] = -9 * rm * rp * r3m * tp * fa;
5180 d[25][1] = +9 * rm * rp * r3p * tp * fa;
5181 d[26][1] = -9 * rm * (9 * ss - 2 * s - 3) * tp * fa;
5182 d[27][1] = +9 * rp * (9 * ss - 2 * s - 3) * tp * fa;
5183 d[28][1] = +9 * rm * (9 * ss + 2 * s - 3) * tp * fa;
5184 d[29][1] = -9 * rp * (9 * ss + 2 * s - 3) * tp * fa;
5185 d[30][1] = +9 * rm * rp * r3m * tp * fa;
5186 d[31][1] = -9 * rm * rp * r3p * tp * fa;
5187 d[0][2] = -rm * sm * (27 * tt - 18 * t + 9 * ss + 9 * rr - 19) * fa;
5188 d[1][2] = +rp * sm * (27 * tt - 18 * t + 9 * ss + 9 * rr - 19) * fa;
5189 d[2][2] = -rp * sp * (27 * tt - 18 * t + 9 * ss + 9 * rr - 19) * fa;
5190 d[3][2] = +rm * sp * (27 * tt - 18 * t + 9 * ss + 9 * rr - 19) * fa;
5191 d[4][2] = +rm * sm * (27 * tt + 18 * t + 9 * ss + 9 * rr - 19) * fa;
5192 d[5][2] = -rp * sm * (27 * tt + 18 * t + 9 * ss + 9 * rr - 19) * fa;
5193 d[6][2] = +rp * sp * (27 * tt + 18 * t + 9 * ss + 9 * rr - 19) * fa;
5194 d[7][2] = -rm * sp * (27 * tt + 18 * t + 9 * ss + 9 * rr - 19) * fa;
5195 d[8][2] = +9 * rm * rp * r3m * sm * fa;
5196 d[9][2] = -9 * rm * rp * r3p * sm * fa;
5197 d[10][2] = +9 * rm * sm * sp * s3m * fa;
5198 d[11][2] = -9 * rp * sm * sp * s3m * fa;
5199 d[12][2] = -9 * rm * sm * sp * s3p * fa;
5200 d[13][2] = +9 * rp * sm * sp * s3p * fa;
5201 d[14][2] = -9 * rm * rp * r3m * sp * fa;
5202 d[15][2] = +9 * rm * rp * r3p * sp * fa;
5203 d[16][2] = +9 * rm * sm * (9 * tt - 2 * t - 3) * fa;
5204 d[17][2] = -9 * rp * sm * (9 * tt - 2 * t - 3) * fa;
5205 d[18][2] = -9 * rm * sp * (9 * tt - 2 * t - 3) * fa;
5206 d[19][2] = +9 * rp * sp * (9 * tt - 2 * t - 3) * fa;
5207 d[20][2] = -9 * rm * sm * (9 * tt + 2 * t - 3) * fa;
5208 d[21][2] = +9 * rp * sm * (9 * tt + 2 * t - 3) * fa;
5209 d[22][2] = +9 * rm * sp * (9 * tt + 2 * t - 3) * fa;
5210 d[23][2] = -9 * rp * sp * (9 * tt + 2 * t - 3) * fa;
5211 d[24][2] = -9 * rm * rp * r3m * sm * fa;
5212 d[25][2] = +9 * rm * rp * r3p * sm * fa;
5213 d[26][2] = -9 * rm * sm * sp * s3m * fa;
5214 d[27][2] = +9 * rp * sm * sp * s3m * fa;
5215 d[28][2] = +9 * rm * sm * sp * s3p * fa;
5216 d[29][2] = -9 * rp * sm * sp * s3p * fa;
5217 d[30][2] = +9 * rm * rp * r3m * sp * fa;
5218 d[31][2] = -9 * rm * rp * r3p * sp * fa;
5221 static const int num_nodes = 32;
5222 static const int num_faces = 6;
5223 static const int num_dimensions = 3;
5224 static const int order = 9;
5225 typedef IS_HE ischeme_type;
5227 static ischeme_type create_ischeme() {
5228 ischeme_type ischeme;
5229 ischeme[0].set_order(3);
5230 ischeme[1].set_order(3);
5231 ischeme[2].set_order(3);
5235 static ischeme_type create_ischeme(SolidMechanics& property) {
5236 ischeme_type ischeme;
5237 ischeme[0].set_order(2 * 3);
5238 ischeme[1].set_order(2 * 3);
5239 ischeme[2].set_order(2 * 3);
5240 ischeme.init(property);
5244 static const double r_node[32];
5245 static const double s_node[32];
5246 static const double t_node[32];
5248 static const bool supports_laminates =
true;
5250 static const char name[5];
5252 typedef L4_Shape_Evaluator edge_shape_type_0;
5253 typedef L4_Shape_Evaluator edge_shape_type_1;
5254 static const int num_edge = 12;
5255 static const int edge_node[12][4];
5256 static const int edge_type_index[12];
5258 typedef Q12_Shape_Evaluator face_shape_type_0;
5259 typedef Q12_Shape_Evaluator face_shape_type_1;
5260 static const int num_face = 6;
5261 static const int face_node[6][12];
5262 static const int face_type_index[6];
5263 static const bool is_t_face[6];
5266typedef Solid_Shape_Evaluator<HE32_Shape_Helper> HE32_Shape_Evaluator;
5268class HE64_Shape_Helper :
public HE_Shape_Helper {
5270 static void eval_h(
const double internal_coor[3],
double h[64]) {
5271 const double r = internal_coor[0];
5272 const double s = internal_coor[1];
5273 const double t = internal_coor[2];
5275 const double rm = r - 1;
5276 const double rp = r + 1;
5277 const double sm = s - 1;
5278 const double sp = s + 1;
5279 const double tm = t - 1;
5280 const double tp = t + 1;
5282 const double r3m = 3 * r - 1;
5283 const double r3p = 3 * r + 1;
5284 const double s3m = 3 * s - 1;
5285 const double s3p = 3 * s + 1;
5286 const double t3m = 3 * t - 1;
5287 const double t3p = 3 * t + 1;
5289 const double fa = 0.000244140625;
5291 h[0] = -rm * r3m * r3p * sm * s3m * s3p * tm * t3m * t3p * fa;
5292 h[1] = +rp * r3m * r3p * sm * s3m * s3p * tm * t3m * t3p * fa;
5293 h[2] = -rp * r3m * r3p * sp * s3m * s3p * tm * t3m * t3p * fa;
5294 h[3] = +rm * r3m * r3p * sp * s3m * s3p * tm * t3m * t3p * fa;
5295 h[4] = +rm * r3m * r3p * sm * s3m * s3p * tp * t3m * t3p * fa;
5296 h[5] = -rp * r3m * r3p * sm * s3m * s3p * tp * t3m * t3p * fa;
5297 h[6] = +rp * r3m * r3p * sp * s3m * s3p * tp * t3m * t3p * fa;
5298 h[7] = -rm * r3m * r3p * sp * s3m * s3p * tp * t3m * t3p * fa;
5299 h[8] = +9 * rm * rp * r3m * sm * s3m * s3p * tm * t3m * t3p * fa;
5300 h[9] = -9 * rm * rp * r3p * sm * s3m * s3p * tm * t3m * t3p * fa;
5301 h[10] = +9 * rm * r3m * r3p * sm * sp * s3m * tm * t3m * t3p * fa;
5302 h[11] = -81 * rm * rp * r3m * sm * sp * s3m * tm * t3m * t3p * fa;
5303 h[12] = +81 * rm * rp * r3p * sm * sp * s3m * tm * t3m * t3p * fa;
5304 h[13] = -9 * rp * r3m * r3p * sm * sp * s3m * tm * t3m * t3p * fa;
5305 h[14] = -9 * rm * r3m * r3p * sm * sp * s3p * tm * t3m * t3p * fa;
5306 h[15] = +81 * rm * rp * r3m * sm * sp * s3p * tm * t3m * t3p * fa;
5307 h[16] = -81 * rm * rp * r3p * sm * sp * s3p * tm * t3m * t3p * fa;
5308 h[17] = +9 * rp * r3m * r3p * sm * sp * s3p * tm * t3m * t3p * fa;
5309 h[18] = -9 * rm * rp * r3m * sp * s3m * s3p * tm * t3m * t3p * fa;
5310 h[19] = +9 * rm * rp * r3p * sp * s3m * s3p * tm * t3m * t3p * fa;
5311 h[20] = +9 * rm * r3m * r3p * sm * s3m * s3p * tm * tp * t3m * fa;
5312 h[21] = -81 * rm * rp * r3m * sm * s3m * s3p * tm * tp * t3m * fa;
5313 h[22] = +81 * rm * rp * r3p * sm * s3m * s3p * tm * tp * t3m * fa;
5314 h[23] = -9 * rp * r3m * r3p * sm * s3m * s3p * tm * tp * t3m * fa;
5315 h[24] = -81 * rm * r3m * r3p * sm * sp * s3m * tm * tp * t3m * fa;
5316 h[25] = +729 * rm * rp * r3m * sm * sp * s3m * tm * tp * t3m * fa;
5317 h[26] = -729 * rm * rp * r3p * sm * sp * s3m * tm * tp * t3m * fa;
5318 h[27] = +81 * rp * r3m * r3p * sm * sp * s3m * tm * tp * t3m * fa;
5319 h[28] = +81 * rm * r3m * r3p * sm * sp * s3p * tm * tp * t3m * fa;
5320 h[29] = -729 * rm * rp * r3m * sm * sp * s3p * tm * tp * t3m * fa;
5321 h[30] = +729 * rm * rp * r3p * sm * sp * s3p * tm * tp * t3m * fa;
5322 h[31] = -81 * rp * r3m * r3p * sm * sp * s3p * tm * tp * t3m * fa;
5323 h[32] = -9 * rm * r3m * r3p * sp * s3m * s3p * tm * tp * t3m * fa;
5324 h[33] = +81 * rm * rp * r3m * sp * s3m * s3p * tm * tp * t3m * fa;
5325 h[34] = -81 * rm * rp * r3p * sp * s3m * s3p * tm * tp * t3m * fa;
5326 h[35] = +9 * rp * r3m * r3p * sp * s3m * s3p * tm * tp * t3m * fa;
5327 h[36] = -9 * rm * r3m * r3p * sm * s3m * s3p * tm * tp * t3p * fa;
5328 h[37] = +81 * rm * rp * r3m * sm * s3m * s3p * tm * tp * t3p * fa;
5329 h[38] = -81 * rm * rp * r3p * sm * s3m * s3p * tm * tp * t3p * fa;
5330 h[39] = +9 * rp * r3m * r3p * sm * s3m * s3p * tm * tp * t3p * fa;
5331 h[40] = +81 * rm * r3m * r3p * sm * sp * s3m * tm * tp * t3p * fa;
5332 h[41] = -729 * rm * rp * r3m * sm * sp * s3m * tm * tp * t3p * fa;
5333 h[42] = +729 * rm * rp * r3p * sm * sp * s3m * tm * tp * t3p * fa;
5334 h[43] = -81 * rp * r3m * r3p * sm * sp * s3m * tm * tp * t3p * fa;
5335 h[44] = -81 * rm * r3m * r3p * sm * sp * s3p * tm * tp * t3p * fa;
5336 h[45] = +729 * rm * rp * r3m * sm * sp * s3p * tm * tp * t3p * fa;
5337 h[46] = -729 * rm * rp * r3p * sm * sp * s3p * tm * tp * t3p * fa;
5338 h[47] = +81 * rp * r3m * r3p * sm * sp * s3p * tm * tp * t3p * fa;
5339 h[48] = +9 * rm * r3m * r3p * sp * s3m * s3p * tm * tp * t3p * fa;
5340 h[49] = -81 * rm * rp * r3m * sp * s3m * s3p * tm * tp * t3p * fa;
5341 h[50] = +81 * rm * rp * r3p * sp * s3m * s3p * tm * tp * t3p * fa;
5342 h[51] = -9 * rp * r3m * r3p * sp * s3m * s3p * tm * tp * t3p * fa;
5343 h[52] = -9 * rm * rp * r3m * sm * s3m * s3p * tp * t3m * t3p * fa;
5344 h[53] = +9 * rm * rp * r3p * sm * s3m * s3p * tp * t3m * t3p * fa;
5345 h[54] = -9 * rm * r3m * r3p * sm * sp * s3m * tp * t3m * t3p * fa;
5346 h[55] = +81 * rm * rp * r3m * sm * sp * s3m * tp * t3m * t3p * fa;
5347 h[56] = -81 * rm * rp * r3p * sm * sp * s3m * tp * t3m * t3p * fa;
5348 h[57] = +9 * rp * r3m * r3p * sm * sp * s3m * tp * t3m * t3p * fa;
5349 h[58] = +9 * rm * r3m * r3p * sm * sp * s3p * tp * t3m * t3p * fa;
5350 h[59] = -81 * rm * rp * r3m * sm * sp * s3p * tp * t3m * t3p * fa;
5351 h[60] = +81 * rm * rp * r3p * sm * sp * s3p * tp * t3m * t3p * fa;
5352 h[61] = -9 * rp * r3m * r3p * sm * sp * s3p * tp * t3m * t3p * fa;
5353 h[62] = +9 * rm * rp * r3m * sp * s3m * s3p * tp * t3m * t3p * fa;
5354 h[63] = -9 * rm * rp * r3p * sp * s3m * s3p * tp * t3m * t3p * fa;
5357 static void eval_h_derived(
const double internal_coor[3],
double d[64][3]) {
5358 const double r = internal_coor[0];
5359 const double s = internal_coor[1];
5360 const double t = internal_coor[2];
5362 const double rm = r - 1;
5363 const double rp = r + 1;
5364 const double sm = s - 1;
5365 const double sp = s + 1;
5366 const double tm = t - 1;
5367 const double tp = t + 1;
5369 const double r3m = 3 * r - 1;
5370 const double r3p = 3 * r + 1;
5371 const double s3m = 3 * s - 1;
5372 const double s3p = 3 * s + 1;
5373 const double t3m = 3 * t - 1;
5374 const double t3p = 3 * t + 1;
5376 const double rr = r * r;
5377 const double ss = s * s;
5378 const double tt = t * t;
5380 const double fa = 0.000244140625;
5382 d[0][0] = -(27 * rr - 18 * r - 1) * sm * s3m * s3p * tm * t3m * t3p * fa;
5383 d[1][0] = +(27 * rr + 18 * r - 1) * sm * s3m * s3p * tm * t3m * t3p * fa;
5384 d[2][0] = -(27 * rr + 18 * r - 1) * sp * s3m * s3p * tm * t3m * t3p * fa;
5385 d[3][0] = +(27 * rr - 18 * r - 1) * sp * s3m * s3p * tm * t3m * t3p * fa;
5386 d[4][0] = +(27 * rr - 18 * r - 1) * sm * s3m * s3p * tp * t3m * t3p * fa;
5387 d[5][0] = -(27 * rr + 18 * r - 1) * sm * s3m * s3p * tp * t3m * t3p * fa;
5388 d[6][0] = +(27 * rr + 18 * r - 1) * sp * s3m * s3p * tp * t3m * t3p * fa;
5389 d[7][0] = -(27 * rr - 18 * r - 1) * sp * s3m * s3p * tp * t3m * t3p * fa;
5390 d[8][0] = +9 * (9 * rr - 2 * r - 3) * sm * s3m * s3p * tm * t3m * t3p * fa;
5391 d[9][0] = -9 * (9 * rr + 2 * r - 3) * sm * s3m * s3p * tm * t3m * t3p * fa;
5392 d[10][0] = +9 * (27 * rr - 18 * r - 1) * sm * sp * s3m * tm * t3m * t3p * fa;
5393 d[11][0] = -81 * (9 * rr - 2 * r - 3) * sm * sp * s3m * tm * t3m * t3p * fa;
5394 d[12][0] = +81 * (9 * rr + 2 * r - 3) * sm * sp * s3m * tm * t3m * t3p * fa;
5395 d[13][0] = -9 * (27 * rr + 18 * r - 1) * sm * sp * s3m * tm * t3m * t3p * fa;
5396 d[14][0] = -9 * (27 * rr - 18 * r - 1) * sm * sp * s3p * tm * t3m * t3p * fa;
5397 d[15][0] = +81 * (9 * rr - 2 * r - 3) * sm * sp * s3p * tm * t3m * t3p * fa;
5398 d[16][0] = -81 * (9 * rr + 2 * r - 3) * sm * sp * s3p * tm * t3m * t3p * fa;
5399 d[17][0] = +9 * (27 * rr + 18 * r - 1) * sm * sp * s3p * tm * t3m * t3p * fa;
5400 d[18][0] = -9 * (9 * rr - 2 * r - 3) * sp * s3m * s3p * tm * t3m * t3p * fa;
5401 d[19][0] = +9 * (9 * rr + 2 * r - 3) * sp * s3m * s3p * tm * t3m * t3p * fa;
5402 d[20][0] = +9 * (27 * rr - 18 * r - 1) * sm * s3m * s3p * tm * tp * t3m * fa;
5403 d[21][0] = -81 * (9 * rr - 2 * r - 3) * sm * s3m * s3p * tm * tp * t3m * fa;
5404 d[22][0] = +81 * (9 * rr + 2 * r - 3) * sm * s3m * s3p * tm * tp * t3m * fa;
5405 d[23][0] = -9 * (27 * rr + 18 * r - 1) * sm * s3m * s3p * tm * tp * t3m * fa;
5406 d[24][0] = -81 * (27 * rr - 18 * r - 1) * sm * sp * s3m * tm * tp * t3m * fa;
5407 d[25][0] = +729 * (9 * rr - 2 * r - 3) * sm * sp * s3m * tm * tp * t3m * fa;
5408 d[26][0] = -729 * (9 * rr + 2 * r - 3) * sm * sp * s3m * tm * tp * t3m * fa;
5409 d[27][0] = +81 * (27 * rr + 18 * r - 1) * sm * sp * s3m * tm * tp * t3m * fa;
5410 d[28][0] = +81 * (27 * rr - 18 * r - 1) * sm * sp * s3p * tm * tp * t3m * fa;
5411 d[29][0] = -729 * (9 * rr - 2 * r - 3) * sm * sp * s3p * tm * tp * t3m * fa;
5412 d[30][0] = +729 * (9 * rr + 2 * r - 3) * sm * sp * s3p * tm * tp * t3m * fa;
5413 d[31][0] = -81 * (27 * rr + 18 * r - 1) * sm * sp * s3p * tm * tp * t3m * fa;
5414 d[32][0] = -9 * (27 * rr - 18 * r - 1) * sp * s3m * s3p * tm * tp * t3m * fa;
5415 d[33][0] = +81 * (9 * rr - 2 * r - 3) * sp * s3m * s3p * tm * tp * t3m * fa;
5416 d[34][0] = -81 * (9 * rr + 2 * r - 3) * sp * s3m * s3p * tm * tp * t3m * fa;
5417 d[35][0] = +9 * (27 * rr + 18 * r - 1) * sp * s3m * s3p * tm * tp * t3m * fa;
5418 d[36][0] = -9 * (27 * rr - 18 * r - 1) * sm * s3m * s3p * tm * tp * t3p * fa;
5419 d[37][0] = +81 * (9 * rr - 2 * r - 3) * sm * s3m * s3p * tm * tp * t3p * fa;
5420 d[38][0] = -81 * (9 * rr + 2 * r - 3) * sm * s3m * s3p * tm * tp * t3p * fa;
5421 d[39][0] = +9 * (27 * rr + 18 * r - 1) * sm * s3m * s3p * tm * tp * t3p * fa;
5422 d[40][0] = +81 * (27 * rr - 18 * r - 1) * sm * sp * s3m * tm * tp * t3p * fa;
5423 d[41][0] = -729 * (9 * rr - 2 * r - 3) * sm * sp * s3m * tm * tp * t3p * fa;
5424 d[42][0] = +729 * (9 * rr + 2 * r - 3) * sm * sp * s3m * tm * tp * t3p * fa;
5425 d[43][0] = -81 * (27 * rr + 18 * r - 1) * sm * sp * s3m * tm * tp * t3p * fa;
5426 d[44][0] = -81 * (27 * rr - 18 * r - 1) * sm * sp * s3p * tm * tp * t3p * fa;
5427 d[45][0] = +729 * (9 * rr - 2 * r - 3) * sm * sp * s3p * tm * tp * t3p * fa;
5428 d[46][0] = -729 * (9 * rr + 2 * r - 3) * sm * sp * s3p * tm * tp * t3p * fa;
5429 d[47][0] = +81 * (27 * rr + 18 * r - 1) * sm * sp * s3p * tm * tp * t3p * fa;
5430 d[48][0] = +9 * (27 * rr - 18 * r - 1) * sp * s3m * s3p * tm * tp * t3p * fa;
5431 d[49][0] = -81 * (9 * rr - 2 * r - 3) * sp * s3m * s3p * tm * tp * t3p * fa;
5432 d[50][0] = +81 * (9 * rr + 2 * r - 3) * sp * s3m * s3p * tm * tp * t3p * fa;
5433 d[51][0] = -9 * (27 * rr + 18 * r - 1) * sp * s3m * s3p * tm * tp * t3p * fa;
5434 d[52][0] = -9 * (9 * rr - 2 * r - 3) * sm * s3m * s3p * tp * t3m * t3p * fa;
5435 d[53][0] = +9 * (9 * rr + 2 * r - 3) * sm * s3m * s3p * tp * t3m * t3p * fa;
5436 d[54][0] = -9 * (27 * rr - 18 * r - 1) * sm * sp * s3m * tp * t3m * t3p * fa;
5437 d[55][0] = +81 * (9 * rr - 2 * r - 3) * sm * sp * s3m * tp * t3m * t3p * fa;
5438 d[56][0] = -81 * (9 * rr + 2 * r - 3) * sm * sp * s3m * tp * t3m * t3p * fa;
5439 d[57][0] = +9 * (27 * rr + 18 * r - 1) * sm * sp * s3m * tp * t3m * t3p * fa;
5440 d[58][0] = +9 * (27 * rr - 18 * r - 1) * sm * sp * s3p * tp * t3m * t3p * fa;
5441 d[59][0] = -81 * (9 * rr - 2 * r - 3) * sm * sp * s3p * tp * t3m * t3p * fa;
5442 d[60][0] = +81 * (9 * rr + 2 * r - 3) * sm * sp * s3p * tp * t3m * t3p * fa;
5443 d[61][0] = -9 * (27 * rr + 18 * r - 1) * sm * sp * s3p * tp * t3m * t3p * fa;
5444 d[62][0] = +9 * (9 * rr - 2 * r - 3) * sp * s3m * s3p * tp * t3m * t3p * fa;
5445 d[63][0] = -9 * (9 * rr + 2 * r - 3) * sp * s3m * s3p * tp * t3m * t3p * fa;
5446 d[0][1] = -rm * r3m * r3p * (27 * ss - 18 * s - 1) * tm * t3m * t3p * fa;
5447 d[1][1] = +rp * r3m * r3p * (27 * ss - 18 * s - 1) * tm * t3m * t3p * fa;
5448 d[2][1] = -rp * r3m * r3p * (27 * ss + 18 * s - 1) * tm * t3m * t3p * fa;
5449 d[3][1] = +rm * r3m * r3p * (27 * ss + 18 * s - 1) * tm * t3m * t3p * fa;
5450 d[4][1] = +rm * r3m * r3p * (27 * ss - 18 * s - 1) * tp * t3m * t3p * fa;
5451 d[5][1] = -rp * r3m * r3p * (27 * ss - 18 * s - 1) * tp * t3m * t3p * fa;
5452 d[6][1] = +rp * r3m * r3p * (27 * ss + 18 * s - 1) * tp * t3m * t3p * fa;
5453 d[7][1] = -rm * r3m * r3p * (27 * ss + 18 * s - 1) * tp * t3m * t3p * fa;
5454 d[8][1] = +9 * rm * rp * r3m * (27 * ss - 18 * s - 1) * tm * t3m * t3p * fa;
5455 d[9][1] = -9 * rm * rp * r3p * (27 * ss - 18 * s - 1) * tm * t3m * t3p * fa;
5456 d[10][1] = +9 * rm * r3m * r3p * (9 * ss - 2 * s - 3) * tm * t3m * t3p * fa;
5457 d[11][1] = -81 * rm * rp * r3m * (9 * ss - 2 * s - 3) * tm * t3m * t3p * fa;
5458 d[12][1] = +81 * rm * rp * r3p * (9 * ss - 2 * s - 3) * tm * t3m * t3p * fa;
5459 d[13][1] = -9 * rp * r3m * r3p * (9 * ss - 2 * s - 3) * tm * t3m * t3p * fa;
5460 d[14][1] = -9 * rm * r3m * r3p * (9 * ss + 2 * s - 3) * tm * t3m * t3p * fa;
5461 d[15][1] = +81 * rm * rp * r3m * (9 * ss + 2 * s - 3) * tm * t3m * t3p * fa;
5462 d[16][1] = -81 * rm * rp * r3p * (9 * ss + 2 * s - 3) * tm * t3m * t3p * fa;
5463 d[17][1] = +9 * rp * r3m * r3p * (9 * ss + 2 * s - 3) * tm * t3m * t3p * fa;
5464 d[18][1] = -9 * rm * rp * r3m * (27 * ss + 18 * s - 1) * tm * t3m * t3p * fa;
5465 d[19][1] = +9 * rm * rp * r3p * (27 * ss + 18 * s - 1) * tm * t3m * t3p * fa;
5466 d[20][1] = +9 * rm * r3m * r3p * (27 * ss - 18 * s - 1) * tm * tp * t3m * fa;
5467 d[21][1] = -81 * rm * rp * r3m * (27 * ss - 18 * s - 1) * tm * tp * t3m * fa;
5468 d[22][1] = +81 * rm * rp * r3p * (27 * ss - 18 * s - 1) * tm * tp * t3m * fa;
5469 d[23][1] = -9 * rp * r3m * r3p * (27 * ss - 18 * s - 1) * tm * tp * t3m * fa;
5470 d[24][1] = -81 * rm * r3m * r3p * (9 * ss - 2 * s - 3) * tm * tp * t3m * fa;
5471 d[25][1] = +729 * rm * rp * r3m * (9 * ss - 2 * s - 3) * tm * tp * t3m * fa;
5472 d[26][1] = -729 * rm * rp * r3p * (9 * ss - 2 * s - 3) * tm * tp * t3m * fa;
5473 d[27][1] = +81 * rp * r3m * r3p * (9 * ss - 2 * s - 3) * tm * tp * t3m * fa;
5474 d[28][1] = +81 * rm * r3m * r3p * (9 * ss + 2 * s - 3) * tm * tp * t3m * fa;
5475 d[29][1] = -729 * rm * rp * r3m * (9 * ss + 2 * s - 3) * tm * tp * t3m * fa;
5476 d[30][1] = +729 * rm * rp * r3p * (9 * ss + 2 * s - 3) * tm * tp * t3m * fa;
5477 d[31][1] = -81 * rp * r3m * r3p * (9 * ss + 2 * s - 3) * tm * tp * t3m * fa;
5478 d[32][1] = -9 * rm * r3m * r3p * (27 * ss + 18 * s - 1) * tm * tp * t3m * fa;
5479 d[33][1] = +81 * rm * rp * r3m * (27 * ss + 18 * s - 1) * tm * tp * t3m * fa;
5480 d[34][1] = -81 * rm * rp * r3p * (27 * ss + 18 * s - 1) * tm * tp * t3m * fa;
5481 d[35][1] = +9 * rp * r3m * r3p * (27 * ss + 18 * s - 1) * tm * tp * t3m * fa;
5482 d[36][1] = -9 * rm * r3m * r3p * (27 * ss - 18 * s - 1) * tm * tp * t3p * fa;
5483 d[37][1] = +81 * rm * rp * r3m * (27 * ss - 18 * s - 1) * tm * tp * t3p * fa;
5484 d[38][1] = -81 * rm * rp * r3p * (27 * ss - 18 * s - 1) * tm * tp * t3p * fa;
5485 d[39][1] = +9 * rp * r3m * r3p * (27 * ss - 18 * s - 1) * tm * tp * t3p * fa;
5486 d[40][1] = +81 * rm * r3m * r3p * (9 * ss - 2 * s - 3) * tm * tp * t3p * fa;
5487 d[41][1] = -729 * rm * rp * r3m * (9 * ss - 2 * s - 3) * tm * tp * t3p * fa;
5488 d[42][1] = +729 * rm * rp * r3p * (9 * ss - 2 * s - 3) * tm * tp * t3p * fa;
5489 d[43][1] = -81 * rp * r3m * r3p * (9 * ss - 2 * s - 3) * tm * tp * t3p * fa;
5490 d[44][1] = -81 * rm * r3m * r3p * (9 * ss + 2 * s - 3) * tm * tp * t3p * fa;
5491 d[45][1] = +729 * rm * rp * r3m * (9 * ss + 2 * s - 3) * tm * tp * t3p * fa;
5492 d[46][1] = -729 * rm * rp * r3p * (9 * ss + 2 * s - 3) * tm * tp * t3p * fa;
5493 d[47][1] = +81 * rp * r3m * r3p * (9 * ss + 2 * s - 3) * tm * tp * t3p * fa;
5494 d[48][1] = +9 * rm * r3m * r3p * (27 * ss + 18 * s - 1) * tm * tp * t3p * fa;
5495 d[49][1] = -81 * rm * rp * r3m * (27 * ss + 18 * s - 1) * tm * tp * t3p * fa;
5496 d[50][1] = +81 * rm * rp * r3p * (27 * ss + 18 * s - 1) * tm * tp * t3p * fa;
5497 d[51][1] = -9 * rp * r3m * r3p * (27 * ss + 18 * s - 1) * tm * tp * t3p * fa;
5498 d[52][1] = -9 * rm * rp * r3m * (27 * ss - 18 * s - 1) * tp * t3m * t3p * fa;
5499 d[53][1] = +9 * rm * rp * r3p * (27 * ss - 18 * s - 1) * tp * t3m * t3p * fa;
5500 d[54][1] = -9 * rm * r3m * r3p * (9 * ss - 2 * s - 3) * tp * t3m * t3p * fa;
5501 d[55][1] = +81 * rm * rp * r3m * (9 * ss - 2 * s - 3) * tp * t3m * t3p * fa;
5502 d[56][1] = -81 * rm * rp * r3p * (9 * ss - 2 * s - 3) * tp * t3m * t3p * fa;
5503 d[57][1] = +9 * rp * r3m * r3p * (9 * ss - 2 * s - 3) * tp * t3m * t3p * fa;
5504 d[58][1] = +9 * rm * r3m * r3p * (9 * ss + 2 * s - 3) * tp * t3m * t3p * fa;
5505 d[59][1] = -81 * rm * rp * r3m * (9 * ss + 2 * s - 3) * tp * t3m * t3p * fa;
5506 d[60][1] = +81 * rm * rp * r3p * (9 * ss + 2 * s - 3) * tp * t3m * t3p * fa;
5507 d[61][1] = -9 * rp * r3m * r3p * (9 * ss + 2 * s - 3) * tp * t3m * t3p * fa;
5508 d[62][1] = +9 * rm * rp * r3m * (27 * ss + 18 * s - 1) * tp * t3m * t3p * fa;
5509 d[63][1] = -9 * rm * rp * r3p * (27 * ss + 18 * s - 1) * tp * t3m * t3p * fa;
5510 d[0][2] = -rm * r3m * r3p * sm * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5511 d[1][2] = +rp * r3m * r3p * sm * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5512 d[2][2] = -rp * r3m * r3p * sp * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5513 d[3][2] = +rm * r3m * r3p * sp * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5514 d[4][2] = +rm * r3m * r3p * sm * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5515 d[5][2] = -rp * r3m * r3p * sm * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5516 d[6][2] = +rp * r3m * r3p * sp * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5517 d[7][2] = -rm * r3m * r3p * sp * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5518 d[8][2] = +9 * rm * rp * r3m * sm * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5519 d[9][2] = -9 * rm * rp * r3p * sm * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5520 d[10][2] = +9 * rm * r3m * r3p * sm * sp * s3m * (27 * tt - 18 * t - 1) * fa;
5521 d[11][2] = -81 * rm * rp * r3m * sm * sp * s3m * (27 * tt - 18 * t - 1) * fa;
5522 d[12][2] = +81 * rm * rp * r3p * sm * sp * s3m * (27 * tt - 18 * t - 1) * fa;
5523 d[13][2] = -9 * rp * r3m * r3p * sm * sp * s3m * (27 * tt - 18 * t - 1) * fa;
5524 d[14][2] = -9 * rm * r3m * r3p * sm * sp * s3p * (27 * tt - 18 * t - 1) * fa;
5525 d[15][2] = +81 * rm * rp * r3m * sm * sp * s3p * (27 * tt - 18 * t - 1) * fa;
5526 d[16][2] = -81 * rm * rp * r3p * sm * sp * s3p * (27 * tt - 18 * t - 1) * fa;
5527 d[17][2] = +9 * rp * r3m * r3p * sm * sp * s3p * (27 * tt - 18 * t - 1) * fa;
5528 d[18][2] = -9 * rm * rp * r3m * sp * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5529 d[19][2] = +9 * rm * rp * r3p * sp * s3m * s3p * (27 * tt - 18 * t - 1) * fa;
5530 d[20][2] = +9 * rm * r3m * r3p * sm * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5531 d[21][2] = -81 * rm * rp * r3m * sm * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5532 d[22][2] = +81 * rm * rp * r3p * sm * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5533 d[23][2] = -9 * rp * r3m * r3p * sm * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5534 d[24][2] = -81 * rm * r3m * r3p * sm * sp * s3m * (9 * tt - 2 * t - 3) * fa;
5535 d[25][2] = +729 * rm * rp * r3m * sm * sp * s3m * (9 * tt - 2 * t - 3) * fa;
5536 d[26][2] = -729 * rm * rp * r3p * sm * sp * s3m * (9 * tt - 2 * t - 3) * fa;
5537 d[27][2] = +81 * rp * r3m * r3p * sm * sp * s3m * (9 * tt - 2 * t - 3) * fa;
5538 d[28][2] = +81 * rm * r3m * r3p * sm * sp * s3p * (9 * tt - 2 * t - 3) * fa;
5539 d[29][2] = -729 * rm * rp * r3m * sm * sp * s3p * (9 * tt - 2 * t - 3) * fa;
5540 d[30][2] = +729 * rm * rp * r3p * sm * sp * s3p * (9 * tt - 2 * t - 3) * fa;
5541 d[31][2] = -81 * rp * r3m * r3p * sm * sp * s3p * (9 * tt - 2 * t - 3) * fa;
5542 d[32][2] = -9 * rm * r3m * r3p * sp * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5543 d[33][2] = +81 * rm * rp * r3m * sp * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5544 d[34][2] = -81 * rm * rp * r3p * sp * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5545 d[35][2] = +9 * rp * r3m * r3p * sp * s3m * s3p * (9 * tt - 2 * t - 3) * fa;
5546 d[36][2] = -9 * rm * r3m * r3p * sm * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5547 d[37][2] = +81 * rm * rp * r3m * sm * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5548 d[38][2] = -81 * rm * rp * r3p * sm * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5549 d[39][2] = +9 * rp * r3m * r3p * sm * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5550 d[40][2] = +81 * rm * r3m * r3p * sm * sp * s3m * (9 * tt + 2 * t - 3) * fa;
5551 d[41][2] = -729 * rm * rp * r3m * sm * sp * s3m * (9 * tt + 2 * t - 3) * fa;
5552 d[42][2] = +729 * rm * rp * r3p * sm * sp * s3m * (9 * tt + 2 * t - 3) * fa;
5553 d[43][2] = -81 * rp * r3m * r3p * sm * sp * s3m * (9 * tt + 2 * t - 3) * fa;
5554 d[44][2] = -81 * rm * r3m * r3p * sm * sp * s3p * (9 * tt + 2 * t - 3) * fa;
5555 d[45][2] = +729 * rm * rp * r3m * sm * sp * s3p * (9 * tt + 2 * t - 3) * fa;
5556 d[46][2] = -729 * rm * rp * r3p * sm * sp * s3p * (9 * tt + 2 * t - 3) * fa;
5557 d[47][2] = +81 * rp * r3m * r3p * sm * sp * s3p * (9 * tt + 2 * t - 3) * fa;
5558 d[48][2] = +9 * rm * r3m * r3p * sp * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5559 d[49][2] = -81 * rm * rp * r3m * sp * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5560 d[50][2] = +81 * rm * rp * r3p * sp * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5561 d[51][2] = -9 * rp * r3m * r3p * sp * s3m * s3p * (9 * tt + 2 * t - 3) * fa;
5562 d[52][2] = -9 * rm * rp * r3m * sm * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5563 d[53][2] = +9 * rm * rp * r3p * sm * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5564 d[54][2] = -9 * rm * r3m * r3p * sm * sp * s3m * (27 * tt + 18 * t - 1) * fa;
5565 d[55][2] = +81 * rm * rp * r3m * sm * sp * s3m * (27 * tt + 18 * t - 1) * fa;
5566 d[56][2] = -81 * rm * rp * r3p * sm * sp * s3m * (27 * tt + 18 * t - 1) * fa;
5567 d[57][2] = +9 * rp * r3m * r3p * sm * sp * s3m * (27 * tt + 18 * t - 1) * fa;
5568 d[58][2] = +9 * rm * r3m * r3p * sm * sp * s3p * (27 * tt + 18 * t - 1) * fa;
5569 d[59][2] = -81 * rm * rp * r3m * sm * sp * s3p * (27 * tt + 18 * t - 1) * fa;
5570 d[60][2] = +81 * rm * rp * r3p * sm * sp * s3p * (27 * tt + 18 * t - 1) * fa;
5571 d[61][2] = -9 * rp * r3m * r3p * sm * sp * s3p * (27 * tt + 18 * t - 1) * fa;
5572 d[62][2] = +9 * rm * rp * r3m * sp * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5573 d[63][2] = -9 * rm * rp * r3p * sp * s3m * s3p * (27 * tt + 18 * t - 1) * fa;
5576 static const int num_nodes = 64;
5577 static const int num_faces = 6;
5578 static const int num_dimensions = 3;
5579 static const int order = 9;
5580 typedef IS_HE ischeme_type;
5582 static ischeme_type create_ischeme() {
5583 ischeme_type ischeme;
5584 ischeme[0].set_order(3);
5585 ischeme[1].set_order(3);
5586 ischeme[2].set_order(3);
5590 static ischeme_type create_ischeme(SolidMechanics& property) {
5591 ischeme_type ischeme;
5592 ischeme[0].set_order(2 * 3);
5593 ischeme[1].set_order(2 * 3);
5594 ischeme[2].set_order(2 * 3);
5595 ischeme.init(property);
5599 static const double r_node[64];
5600 static const double s_node[64];
5601 static const double t_node[64];
5603 static const bool supports_laminates =
true;
5605 static const char name[5];
5607 typedef L4_Shape_Evaluator edge_shape_type_0;
5608 typedef L4_Shape_Evaluator edge_shape_type_1;
5609 static const int num_edge = 12;
5610 static const int edge_node[12][4];
5611 static const int edge_type_index[12];
5613 typedef Q16_Shape_Evaluator face_shape_type_0;
5614 typedef Q16_Shape_Evaluator face_shape_type_1;
5615 static const int num_face = 6;
5616 static const int face_node[6][16];
5617 static const int face_type_index[6];
5618 static const bool is_t_face[6];
5621typedef Solid_Shape_Evaluator<HE64_Shape_Helper> HE64_Shape_Evaluator;
5623class HE4X4X2_Shape_Helper :
public HE_Shape_Helper {
5625 static void eval_h(
const double internal_coor[3],
double h[32]) {
5626 const double r = internal_coor[0];
5627 const double s = internal_coor[1];
5628 const double t = internal_coor[2];
5630 const double rm = r - 1;
5631 const double rp = r + 1;
5632 const double sm = s - 1;
5633 const double sp = s + 1;
5634 const double tm = t - 1;
5635 const double tp = t + 1;
5637 const double r3m = 3 * r - 1;
5638 const double r3p = 3 * r + 1;
5639 const double s3m = 3 * s - 1;
5640 const double s3p = 3 * s + 1;
5642 const double fa = 0.001953125;
5644 h[0] = -rm * r3m * r3p * sm * s3m * s3p * tm * fa;
5645 h[1] = +rp * r3m * r3p * sm * s3m * s3p * tm * fa;
5646 h[2] = -rp * r3m * r3p * sp * s3m * s3p * tm * fa;
5647 h[3] = +rm * r3m * r3p * sp * s3m * s3p * tm * fa;
5648 h[4] = +rm * r3m * r3p * sm * s3m * s3p * tp * fa;
5649 h[5] = -rp * r3m * r3p * sm * s3m * s3p * tp * fa;
5650 h[6] = +rp * r3m * r3p * sp * s3m * s3p * tp * fa;
5651 h[7] = -rm * r3m * r3p * sp * s3m * s3p * tp * fa;
5652 h[8] = +9 * rm * rp * r3m * sm * s3m * s3p * tm * fa;
5653 h[9] = -9 * rm * rp * r3p * sm * s3m * s3p * tm * fa;
5654 h[10] = +9 * rm * r3m * r3p * sm * sp * s3m * tm * fa;
5655 h[11] = -81 * rm * rp * r3m * sm * sp * s3m * tm * fa;
5656 h[12] = +81 * rm * rp * r3p * sm * sp * s3m * tm * fa;
5657 h[13] = -9 * rp * r3m * r3p * sm * sp * s3m * tm * fa;
5658 h[14] = -9 * rm * r3m * r3p * sm * sp * s3p * tm * fa;
5659 h[15] = +81 * rm * rp * r3m * sm * sp * s3p * tm * fa;
5660 h[16] = -81 * rm * rp * r3p * sm * sp * s3p * tm * fa;
5661 h[17] = +9 * rp * r3m * r3p * sm * sp * s3p * tm * fa;
5662 h[18] = -9 * rm * rp * r3m * sp * s3m * s3p * tm * fa;
5663 h[19] = +9 * rm * rp * r3p * sp * s3m * s3p * tm * fa;
5664 h[20] = -9 * rm * rp * r3m * sm * s3m * s3p * tp * fa;
5665 h[21] = +9 * rm * rp * r3p * sm * s3m * s3p * tp * fa;
5666 h[22] = -9 * rm * r3m * r3p * sm * sp * s3m * tp * fa;
5667 h[23] = +81 * rm * rp * r3m * sm * sp * s3m * tp * fa;
5668 h[24] = -81 * rm * rp * r3p * sm * sp * s3m * tp * fa;
5669 h[25] = +9 * rp * r3m * r3p * sm * sp * s3m * tp * fa;
5670 h[26] = +9 * rm * r3m * r3p * sm * sp * s3p * tp * fa;
5671 h[27] = -81 * rm * rp * r3m * sm * sp * s3p * tp * fa;
5672 h[28] = +81 * rm * rp * r3p * sm * sp * s3p * tp * fa;
5673 h[29] = -9 * rp * r3m * r3p * sm * sp * s3p * tp * fa;
5674 h[30] = +9 * rm * rp * r3m * sp * s3m * s3p * tp * fa;
5675 h[31] = -9 * rm * rp * r3p * sp * s3m * s3p * tp * fa;
5678 static void eval_h_derived(
const double internal_coor[3],
double d[32][3]) {
5679 const double r = internal_coor[0];
5680 const double s = internal_coor[1];
5681 const double t = internal_coor[2];
5683 const double rm = r - 1;
5684 const double rp = r + 1;
5685 const double sm = s - 1;
5686 const double sp = s + 1;
5687 const double tm = t - 1;
5688 const double tp = t + 1;
5690 const double r3m = 3 * r - 1;
5691 const double r3p = 3 * r + 1;
5692 const double s3m = 3 * s - 1;
5693 const double s3p = 3 * s + 1;
5695 const double fa = 0.001953125;
5697 d[0][0] = -(27 * r * r - 18 * r - 1) * sm * s3m * s3p * tm * fa;
5698 d[1][0] = +(27 * r * r + 18 * r - 1) * sm * s3m * s3p * tm * fa;
5699 d[2][0] = -(27 * r * r + 18 * r - 1) * sp * s3m * s3p * tm * fa;
5700 d[3][0] = +(27 * r * r - 18 * r - 1) * sp * s3m * s3p * tm * fa;
5701 d[4][0] = +(27 * r * r - 18 * r - 1) * sm * s3m * s3p * tp * fa;
5702 d[5][0] = -(27 * r * r + 18 * r - 1) * sm * s3m * s3p * tp * fa;
5703 d[6][0] = +(27 * r * r + 18 * r - 1) * sp * s3m * s3p * tp * fa;
5704 d[7][0] = -(27 * r * r - 18 * r - 1) * sp * s3m * s3p * tp * fa;
5705 d[8][0] = +9 * (9 * r * r - 2 * r - 3) * sm * s3m * s3p * tm * fa;
5706 d[9][0] = -9 * (9 * r * r + 2 * r - 3) * sm * s3m * s3p * tm * fa;
5707 d[10][0] = +9 * (27 * r * r - 18 * r - 1) * sm * sp * s3m * tm * fa;
5708 d[11][0] = -81 * (9 * r * r - 2 * r - 3) * sm * sp * s3m * tm * fa;
5709 d[12][0] = +81 * (9 * r * r + 2 * r - 3) * sm * sp * s3m * tm * fa;
5710 d[13][0] = -9 * (27 * r * r + 18 * r - 1) * sm * sp * s3m * tm * fa;
5711 d[14][0] = -9 * (27 * r * r - 18 * r - 1) * sm * sp * s3p * tm * fa;
5712 d[15][0] = +81 * (9 * r * r - 2 * r - 3) * sm * sp * s3p * tm * fa;
5713 d[16][0] = -81 * (9 * r * r + 2 * r - 3) * sm * sp * s3p * tm * fa;
5714 d[17][0] = +9 * (27 * r * r + 18 * r - 1) * sm * sp * s3p * tm * fa;
5715 d[18][0] = -9 * (9 * r * r - 2 * r - 3) * sp * s3m * s3p * tm * fa;
5716 d[19][0] = +9 * (9 * r * r + 2 * r - 3) * sp * s3m * s3p * tm * fa;
5717 d[20][0] = -9 * (9 * r * r - 2 * r - 3) * sm * s3m * s3p * tp * fa;
5718 d[21][0] = +9 * (9 * r * r + 2 * r - 3) * sm * s3m * s3p * tp * fa;
5719 d[22][0] = -9 * (27 * r * r - 18 * r - 1) * sm * sp * s3m * tp * fa;
5720 d[23][0] = +81 * (9 * r * r - 2 * r - 3) * sm * sp * s3m * tp * fa;
5721 d[24][0] = -81 * (9 * r * r + 2 * r - 3) * sm * sp * s3m * tp * fa;
5722 d[25][0] = +9 * (27 * r * r + 18 * r - 1) * sm * sp * s3m * tp * fa;
5723 d[26][0] = +9 * (27 * r * r - 18 * r - 1) * sm * sp * s3p * tp * fa;
5724 d[27][0] = -81 * (9 * r * r - 2 * r - 3) * sm * sp * s3p * tp * fa;
5725 d[28][0] = +81 * (9 * r * r + 2 * r - 3) * sm * sp * s3p * tp * fa;
5726 d[29][0] = -9 * (27 * r * r + 18 * r - 1) * sm * sp * s3p * tp * fa;
5727 d[30][0] = +9 * (9 * r * r - 2 * r - 3) * sp * s3m * s3p * tp * fa;
5728 d[31][0] = -9 * (9 * r * r + 2 * r - 3) * sp * s3m * s3p * tp * fa;
5729 d[0][1] = -rm * r3m * r3p * (27 * s * s - 18 * s - 1) * tm * fa;
5730 d[1][1] = +rp * r3m * r3p * (27 * s * s - 18 * s - 1) * tm * fa;
5731 d[2][1] = -rp * r3m * r3p * (27 * s * s + 18 * s - 1) * tm * fa;
5732 d[3][1] = +rm * r3m * r3p * (27 * s * s + 18 * s - 1) * tm * fa;
5733 d[4][1] = +rm * r3m * r3p * (27 * s * s - 18 * s - 1) * tp * fa;
5734 d[5][1] = -rp * r3m * r3p * (27 * s * s - 18 * s - 1) * tp * fa;
5735 d[6][1] = +rp * r3m * r3p * (27 * s * s + 18 * s - 1) * tp * fa;
5736 d[7][1] = -rm * r3m * r3p * (27 * s * s + 18 * s - 1) * tp * fa;
5737 d[8][1] = +9 * rm * rp * r3m * (27 * s * s - 18 * s - 1) * tm * fa;
5738 d[9][1] = -9 * rm * rp * r3p * (27 * s * s - 18 * s - 1) * tm * fa;
5739 d[10][1] = +9 * rm * r3m * r3p * (9 * s * s - 2 * s - 3) * tm * fa;
5740 d[11][1] = -81 * rm * rp * r3m * (9 * s * s - 2 * s - 3) * tm * fa;
5741 d[12][1] = +81 * rm * rp * r3p * (9 * s * s - 2 * s - 3) * tm * fa;
5742 d[13][1] = -9 * rp * r3m * r3p * (9 * s * s - 2 * s - 3) * tm * fa;
5743 d[14][1] = -9 * rm * r3m * r3p * (9 * s * s + 2 * s - 3) * tm * fa;
5744 d[15][1] = +81 * rm * rp * r3m * (9 * s * s + 2 * s - 3) * tm * fa;
5745 d[16][1] = -81 * rm * rp * r3p * (9 * s * s + 2 * s - 3) * tm * fa;
5746 d[17][1] = +9 * rp * r3m * r3p * (9 * s * s + 2 * s - 3) * tm * fa;
5747 d[18][1] = -9 * rm * rp * r3m * (27 * s * s + 18 * s - 1) * tm * fa;
5748 d[19][1] = +9 * rm * rp * r3p * (27 * s * s + 18 * s - 1) * tm * fa;
5749 d[20][1] = -9 * rm * rp * r3m * (27 * s * s - 18 * s - 1) * tp * fa;
5750 d[21][1] = +9 * rm * rp * r3p * (27 * s * s - 18 * s - 1) * tp * fa;
5751 d[22][1] = -9 * rm * r3m * r3p * (9 * s * s - 2 * s - 3) * tp * fa;
5752 d[23][1] = +81 * rm * rp * r3m * (9 * s * s - 2 * s - 3) * tp * fa;
5753 d[24][1] = -81 * rm * rp * r3p * (9 * s * s - 2 * s - 3) * tp * fa;
5754 d[25][1] = +9 * rp * r3m * r3p * (9 * s * s - 2 * s - 3) * tp * fa;
5755 d[26][1] = +9 * rm * r3m * r3p * (9 * s * s + 2 * s - 3) * tp * fa;
5756 d[27][1] = -81 * rm * rp * r3m * (9 * s * s + 2 * s - 3) * tp * fa;
5757 d[28][1] = +81 * rm * rp * r3p * (9 * s * s + 2 * s - 3) * tp * fa;
5758 d[29][1] = -9 * rp * r3m * r3p * (9 * s * s + 2 * s - 3) * tp * fa;
5759 d[30][1] = +9 * rm * rp * r3m * (27 * s * s + 18 * s - 1) * tp * fa;
5760 d[31][1] = -9 * rm * rp * r3p * (27 * s * s + 18 * s - 1) * tp * fa;
5761 d[0][2] = -rm * r3m * r3p * sm * s3m * s3p * fa;
5762 d[1][2] = +rp * r3m * r3p * sm * s3m * s3p * fa;
5763 d[2][2] = -rp * r3m * r3p * sp * s3m * s3p * fa;
5764 d[3][2] = +rm * r3m * r3p * sp * s3m * s3p * fa;
5765 d[4][2] = +rm * r3m * r3p * sm * s3m * s3p * fa;
5766 d[5][2] = -rp * r3m * r3p * sm * s3m * s3p * fa;
5767 d[6][2] = +rp * r3m * r3p * sp * s3m * s3p * fa;
5768 d[7][2] = -rm * r3m * r3p * sp * s3m * s3p * fa;
5769 d[8][2] = +9 * rm * rp * r3m * sm * s3m * s3p * fa;
5770 d[9][2] = -9 * rm * rp * r3p * sm * s3m * s3p * fa;
5771 d[10][2] = +9 * rm * r3m * r3p * sm * sp * s3m * fa;
5772 d[11][2] = -81 * rm * rp * r3m * sm * sp * s3m * fa;
5773 d[12][2] = +81 * rm * rp * r3p * sm * sp * s3m * fa;
5774 d[13][2] = -9 * rp * r3m * r3p * sm * sp * s3m * fa;
5775 d[14][2] = -9 * rm * r3m * r3p * sm * sp * s3p * fa;
5776 d[15][2] = +81 * rm * rp * r3m * sm * sp * s3p * fa;
5777 d[16][2] = -81 * rm * rp * r3p * sm * sp * s3p * fa;
5778 d[17][2] = +9 * rp * r3m * r3p * sm * sp * s3p * fa;
5779 d[18][2] = -9 * rm * rp * r3m * sp * s3m * s3p * fa;
5780 d[19][2] = +9 * rm * rp * r3p * sp * s3m * s3p * fa;
5781 d[20][2] = -9 * rm * rp * r3m * sm * s3m * s3p * fa;
5782 d[21][2] = +9 * rm * rp * r3p * sm * s3m * s3p * fa;
5783 d[22][2] = -9 * rm * r3m * r3p * sm * sp * s3m * fa;
5784 d[23][2] = +81 * rm * rp * r3m * sm * sp * s3m * fa;
5785 d[24][2] = -81 * rm * rp * r3p * sm * sp * s3m * fa;
5786 d[25][2] = +9 * rp * r3m * r3p * sm * sp * s3m * fa;
5787 d[26][2] = +9 * rm * r3m * r3p * sm * sp * s3p * fa;
5788 d[27][2] = -81 * rm * rp * r3m * sm * sp * s3p * fa;
5789 d[28][2] = +81 * rm * rp * r3p * sm * sp * s3p * fa;
5790 d[29][2] = -9 * rp * r3m * r3p * sm * sp * s3p * fa;
5791 d[30][2] = +9 * rm * rp * r3m * sp * s3m * s3p * fa;
5792 d[31][2] = -9 * rm * rp * r3p * sp * s3m * s3p * fa;
5795 static const int num_nodes = 32;
5796 static const int num_faces = 6;
5797 static const int num_dimensions = 3;
5798 static const int order = 7;
5799 typedef IS_HE ischeme_type;
5801 static ischeme_type create_ischeme() {
5802 ischeme_type ischeme;
5803 ischeme[0].set_order(3);
5804 ischeme[1].set_order(3);
5805 ischeme[2].set_order(1);
5809 static ischeme_type create_ischeme(SolidMechanics& property) {
5810 ischeme_type ischeme;
5811 ischeme[0].set_order(2 * 3);
5812 ischeme[1].set_order(2 * 3);
5813 ischeme[2].set_order(2 * 1);
5814 ischeme.init(property);
5818 static const double r_node[32];
5819 static const double s_node[32];
5820 static const double t_node[32];
5822 static const bool supports_laminates =
true;
5824 static const char name[8];
5826 typedef L4_Shape_Evaluator edge_shape_type_0;
5827 typedef L2_Shape_Evaluator edge_shape_type_1;
5828 static const int num_edge = 12;
5829 static const int edge_node[12][4];
5830 static const int edge_type_index[12];
5832 typedef Q4X2_Shape_Evaluator face_shape_type_0;
5833 typedef Q16_Shape_Evaluator face_shape_type_1;
5834 static const int num_face = 6;
5835 static const int face_node[6][16];
5836 static const int face_type_index[6];
5837 static const bool is_t_face[6];
5840typedef Solid_Shape_Evaluator<HE4X4X2_Shape_Helper> HE4X4X2_Shape_Evaluator;
5842class HE5X5X2_Shape_Helper :
public HE_Shape_Helper {
5844 static void eval_h(
const double internal_coor[3],
double h[50]) {
5845 const double r = internal_coor[0];
5846 const double s = internal_coor[1];
5847 const double t = internal_coor[2];
5849 const double rm = r - 1;
5850 const double rp = r + 1;
5851 const double sm = s - 1;
5852 const double sp = s + 1;
5853 const double tm = t - 1;
5854 const double tp = t + 1;
5856 const double r2m = 2 * r - 1;
5857 const double r2p = 2 * r + 1;
5858 const double s2m = 2 * s - 1;
5859 const double s2p = 2 * s + 1;
5861 h[0] = -rm * r * r2m * r2p * sm * s * s2m * s2p * tm / 72;
5862 h[1] = -r * rp * r2m * r2p * sm * s * s2m * s2p * tm / 72;
5863 h[2] = -r * rp * r2m * r2p * s * sp * s2m * s2p * tm / 72;
5864 h[3] = -rm * r * r2m * r2p * s * sp * s2m * s2p * tm / 72;
5865 h[4] = +rm * r * r2m * r2p * sm * s * s2m * s2p * tp / 72;
5866 h[5] = +r * rp * r2m * r2p * sm * s * s2m * s2p * tp / 72;
5867 h[6] = +r * rp * r2m * r2p * s * sp * s2m * s2p * tp / 72;
5868 h[7] = +rm * r * r2m * r2p * s * sp * s2m * s2p * tp / 72;
5869 h[8] = +rm * r * rp * r2m * sm * s * s2m * s2p * tm / 9;
5870 h[9] = -rm * rp * r2m * r2p * sm * s * s2m * s2p * tm / 12;
5871 h[10] = +rm * r * rp * r2p * sm * s * s2m * s2p * tm / 9;
5872 h[11] = +rm * r * r2m * r2p * sm * s * sp * s2m * tm / 9;
5873 h[12] = -8 * rm * r * rp * r2m * sm * s * sp * s2m * tm / 9;
5874 h[13] = +2 * rm * rp * r2m * r2p * sm * s * sp * s2m * tm / 3;
5875 h[14] = -8 * rm * r * rp * r2p * sm * s * sp * s2m * tm / 9;
5876 h[15] = +r * rp * r2m * r2p * sm * s * sp * s2m * tm / 9;
5877 h[16] = -rm * r * r2m * r2p * sm * sp * s2m * s2p * tm / 12;
5878 h[17] = +2 * rm * r * rp * r2m * sm * sp * s2m * s2p * tm / 3;
5879 h[18] = -rm * rp * r2m * r2p * sm * sp * s2m * s2p * tm / 2;
5880 h[19] = +2 * rm * r * rp * r2p * sm * sp * s2m * s2p * tm / 3;
5881 h[20] = -r * rp * r2m * r2p * sm * sp * s2m * s2p * tm / 12;
5882 h[21] = +rm * r * r2m * r2p * sm * s * sp * s2p * tm / 9;
5883 h[22] = -8 * rm * r * rp * r2m * sm * s * sp * s2p * tm / 9;
5884 h[23] = +2 * rm * rp * r2m * r2p * sm * s * sp * s2p * tm / 3;
5885 h[24] = -8 * rm * r * rp * r2p * sm * s * sp * s2p * tm / 9;
5886 h[25] = +r * rp * r2m * r2p * sm * s * sp * s2p * tm / 9;
5887 h[26] = +rm * r * rp * r2m * s * sp * s2m * s2p * tm / 9;
5888 h[27] = -rm * rp * r2m * r2p * s * sp * s2m * s2p * tm / 12;
5889 h[28] = +rm * r * rp * r2p * s * sp * s2m * s2p * tm / 9;
5890 h[29] = -rm * r * rp * r2m * sm * s * s2m * s2p * tp / 9;
5891 h[30] = +rm * rp * r2m * r2p * sm * s * s2m * s2p * tp / 12;
5892 h[31] = -rm * r * rp * r2p * sm * s * s2m * s2p * tp / 9;
5893 h[32] = -rm * r * r2m * r2p * sm * s * sp * s2m * tp / 9;
5894 h[33] = +8 * rm * r * rp * r2m * sm * s * sp * s2m * tp / 9;
5895 h[34] = -2 * rm * rp * r2m * r2p * sm * s * sp * s2m * tp / 3;
5896 h[35] = +8 * rm * r * rp * r2p * sm * s * sp * s2m * tp / 9;
5897 h[36] = -r * rp * r2m * r2p * sm * s * sp * s2m * tp / 9;
5898 h[37] = +rm * r * r2m * r2p * sm * sp * s2m * s2p * tp / 12;
5899 h[38] = -2 * rm * r * rp * r2m * sm * sp * s2m * s2p * tp / 3;
5900 h[39] = +rm * rp * r2m * r2p * sm * sp * s2m * s2p * tp / 2;
5901 h[40] = -2 * rm * r * rp * r2p * sm * sp * s2m * s2p * tp / 3;
5902 h[41] = +r * rp * r2m * r2p * sm * sp * s2m * s2p * tp / 12;
5903 h[42] = -rm * r * r2m * r2p * sm * s * sp * s2p * tp / 9;
5904 h[43] = +8 * rm * r * rp * r2m * sm * s * sp * s2p * tp / 9;
5905 h[44] = -2 * rm * rp * r2m * r2p * sm * s * sp * s2p * tp / 3;
5906 h[45] = +8 * rm * r * rp * r2p * sm * s * sp * s2p * tp / 9;
5907 h[46] = -r * rp * r2m * r2p * sm * s * sp * s2p * tp / 9;
5908 h[47] = -rm * r * rp * r2m * s * sp * s2m * s2p * tp / 9;
5909 h[48] = +rm * rp * r2m * r2p * s * sp * s2m * s2p * tp / 12;
5910 h[49] = -rm * r * rp * r2p * s * sp * s2m * s2p * tp / 9;
5913 static void eval_h_derived(
const double internal_coor[3],
double d[50][3]) {
5914 const double r = internal_coor[0];
5915 const double s = internal_coor[1];
5916 const double t = internal_coor[2];
5918 const double rm = r - 1;
5919 const double rp = r + 1;
5920 const double sm = s - 1;
5921 const double sp = s + 1;
5922 const double tm = t - 1;
5923 const double tp = t + 1;
5925 const double r2m = 2 * r - 1;
5926 const double r2p = 2 * r + 1;
5927 const double s2m = 2 * s - 1;
5928 const double s2p = 2 * s + 1;
5930 const double r4m = 4 * r - 1;
5931 const double r4p = 4 * r + 1;
5932 const double s4m = 4 * s - 1;
5933 const double s4p = 4 * s + 1;
5935 const double rr = r * r;
5936 const double ss = s * s;
5938 d[0][0] = -r4m * (4 * rr - 2 * r - 1) * sm * s * s2m * s2p * tm / 72;
5939 d[1][0] = -r4p * (4 * rr + 2 * r - 1) * sm * s * s2m * s2p * tm / 72;
5940 d[2][0] = -r4p * (4 * rr + 2 * r - 1) * s * sp * s2m * s2p * tm / 72;
5941 d[3][0] = -r4m * (4 * rr - 2 * r - 1) * s * sp * s2m * s2p * tm / 72;
5942 d[4][0] = +r4m * (4 * rr - 2 * r - 1) * sm * s * s2m * s2p * tp / 72;
5943 d[5][0] = +r4p * (4 * rr + 2 * r - 1) * sm * s * s2m * s2p * tp / 72;
5944 d[6][0] = +r4p * (4 * rr + 2 * r - 1) * s * sp * s2m * s2p * tp / 72;
5945 d[7][0] = +r4m * (4 * rr - 2 * r - 1) * s * sp * s2m * s2p * tp / 72;
5946 d[8][0] = +(8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * s2m * s2p * tm / 9;
5947 d[9][0] = -r * (8 * rr - 5) * sm * s * s2m * s2p * tm / 6;
5948 d[10][0] = +(8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * s2m * s2p * tm / 9;
5949 d[11][0] = +r4m * (4 * rr - 2 * r - 1) * sm * s * sp * s2m * tm / 9;
5950 d[12][0] = -8 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * sp * s2m * tm / 9;
5951 d[13][0] = +4 * r * (8 * rr - 5) * sm * s * sp * s2m * tm / 3;
5952 d[14][0] = -8 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * sp * s2m * tm / 9;
5953 d[15][0] = +r4p * (4 * rr + 2 * r - 1) * sm * s * sp * s2m * tm / 9;
5954 d[16][0] = -r4m * (4 * rr - 2 * r - 1) * sm * sp * s2m * s2p * tm / 12;
5955 d[17][0] = +2 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * sp * s2m * s2p * tm / 3;
5956 d[18][0] = -r * (8 * rr - 5) * sm * sp * s2m * s2p * tm;
5957 d[19][0] = +2 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * sp * s2m * s2p * tm / 3;
5958 d[20][0] = -r4p * (4 * rr + 2 * r - 1) * sm * sp * s2m * s2p * tm / 12;
5959 d[21][0] = +r4m * (4 * rr - 2 * r - 1) * sm * s * sp * s2p * tm / 9;
5960 d[22][0] = -8 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * sp * s2p * tm / 9;
5961 d[23][0] = +4 * r * (8 * rr - 5) * sm * s * sp * s2p * tm / 3;
5962 d[24][0] = -8 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * sp * s2p * tm / 9;
5963 d[25][0] = +r4p * (4 * rr + 2 * r - 1) * sm * s * sp * s2p * tm / 9;
5964 d[26][0] = +(8 * rr * r - 3 * rr - 4 * r + 1) * s * sp * s2m * s2p * tm / 9;
5965 d[27][0] = -r * (8 * rr - 5) * s * sp * s2m * s2p * tm / 6;
5966 d[28][0] = +(8 * rr * r + 3 * rr - 4 * r - 1) * s * sp * s2m * s2p * tm / 9;
5967 d[29][0] = -(8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * s2m * s2p * tp / 9;
5968 d[30][0] = +r * (8 * rr - 5) * sm * s * s2m * s2p * tp / 6;
5969 d[31][0] = -(8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * s2m * s2p * tp / 9;
5970 d[32][0] = -r4m * (4 * rr - 2 * r - 1) * sm * s * sp * s2m * tp / 9;
5971 d[33][0] = +8 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * sp * s2m * tp / 9;
5972 d[34][0] = -4 * r * (8 * rr - 5) * sm * s * sp * s2m * tp / 3;
5973 d[35][0] = +8 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * sp * s2m * tp / 9;
5974 d[36][0] = -r4p * (4 * rr + 2 * r - 1) * sm * s * sp * s2m * tp / 9;
5975 d[37][0] = +r4m * (4 * rr - 2 * r - 1) * sm * sp * s2m * s2p * tp / 12;
5976 d[38][0] = -2 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * sp * s2m * s2p * tp / 3;
5977 d[39][0] = +r * (8 * rr - 5) * sm * sp * s2m * s2p * tp;
5978 d[40][0] = -2 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * sp * s2m * s2p * tp / 3;
5979 d[41][0] = +r4p * (4 * rr + 2 * r - 1) * sm * sp * s2m * s2p * tp / 12;
5980 d[42][0] = -r4m * (4 * rr - 2 * r - 1) * sm * s * sp * s2p * tp / 9;
5981 d[43][0] = +8 * (8 * rr * r - 3 * rr - 4 * r + 1) * sm * s * sp * s2p * tp / 9;
5982 d[44][0] = -4 * r * (8 * rr - 5) * sm * s * sp * s2p * tp / 3;
5983 d[45][0] = +8 * (8 * rr * r + 3 * rr - 4 * r - 1) * sm * s * sp * s2p * tp / 9;
5984 d[46][0] = -r4p * (4 * rr + 2 * r - 1) * sm * s * sp * s2p * tp / 9;
5985 d[47][0] = -(8 * rr * r - 3 * rr - 4 * r + 1) * s * sp * s2m * s2p * tp / 9;
5986 d[48][0] = +r * (8 * rr - 5) * s * sp * s2m * s2p * tp / 6;
5987 d[49][0] = -(8 * rr * r + 3 * rr - 4 * r - 1) * s * sp * s2m * s2p * tp / 9;
5988 d[0][1] = -rm * r * r2m * r2p * s4m * (4 * ss - 2 * s - 1) * tm / 72;
5989 d[1][1] = -r * rp * r2m * r2p * s4m * (4 * ss - 2 * s - 1) * tm / 72;
5990 d[2][1] = -r * rp * r2m * r2p * s4p * (4 * ss + 2 * s - 1) * tm / 72;
5991 d[3][1] = -rm * r * r2m * r2p * s4p * (4 * ss + 2 * s - 1) * tm / 72;
5992 d[4][1] = +rm * r * r2m * r2p * s4m * (4 * ss - 2 * s - 1) * tp / 72;
5993 d[5][1] = +r * rp * r2m * r2p * s4m * (4 * ss - 2 * s - 1) * tp / 72;
5994 d[6][1] = +r * rp * r2m * r2p * s4p * (4 * ss + 2 * s - 1) * tp / 72;
5995 d[7][1] = +rm * r * r2m * r2p * s4p * (4 * ss + 2 * s - 1) * tp / 72;
5996 d[8][1] = +rm * r * rp * r2m * s4m * (4 * ss - 2 * s - 1) * tm / 9;
5997 d[9][1] = -rm * rp * r2m * r2p * s4m * (4 * ss - 2 * s - 1) * tm / 12;
5998 d[10][1] = +rm * r * rp * r2p * s4m * (4 * ss - 2 * s - 1) * tm / 9;
5999 d[11][1] = +rm * r * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tm / 9;
6000 d[12][1] = -8 * rm * r * rp * r2m * (8 * ss * s - 3 * ss - 4 * s + 1) * tm / 9;
6001 d[13][1] = +2 * rm * rp * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tm / 3;
6002 d[14][1] = -8 * rm * r * rp * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tm / 9;
6003 d[15][1] = +r * rp * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tm / 9;
6004 d[16][1] = -rm * r * r2m * r2p * s * (8 * ss - 5) * tm / 6;
6005 d[17][1] = +4 * rm * r * rp * r2m * s * (8 * ss - 5) * tm / 3;
6006 d[18][1] = -rm * rp * r2m * r2p * s * (8 * ss - 5) * tm;
6007 d[19][1] = +4 * rm * r * rp * r2p * s * (8 * ss - 5) * tm / 3;
6008 d[20][1] = -r * rp * r2m * r2p * s * (8 * ss - 5) * tm / 6;
6009 d[21][1] = +rm * r * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tm / 9;
6010 d[22][1] = -8 * rm * r * rp * r2m * (8 * ss * s + 3 * ss - 4 * s - 1) * tm / 9;
6011 d[23][1] = +2 * rm * rp * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tm / 3;
6012 d[24][1] = -8 * rm * r * rp * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tm / 9;
6013 d[25][1] = +r * rp * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tm / 9;
6014 d[26][1] = +rm * r * rp * r2m * s4p * (4 * ss + 2 * s - 1) * tm / 9;
6015 d[27][1] = -rm * rp * r2m * r2p * s4p * (4 * ss + 2 * s - 1) * tm / 12;
6016 d[28][1] = +rm * r * rp * r2p * s4p * (4 * ss + 2 * s - 1) * tm / 9;
6017 d[29][1] = -rm * r * rp * r2m * s4m * (4 * ss - 2 * s - 1) * tp / 9;
6018 d[30][1] = +rm * rp * r2m * r2p * s4m * (4 * ss - 2 * s - 1) * tp / 12;
6019 d[31][1] = -rm * r * rp * r2p * s4m * (4 * ss - 2 * s - 1) * tp / 9;
6020 d[32][1] = -rm * r * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tp / 9;
6021 d[33][1] = +8 * rm * r * rp * r2m * (8 * ss * s - 3 * ss - 4 * s + 1) * tp / 9;
6022 d[34][1] = -2 * rm * rp * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tp / 3;
6023 d[35][1] = +8 * rm * r * rp * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tp / 9;
6024 d[36][1] = -r * rp * r2m * r2p * (8 * ss * s - 3 * ss - 4 * s + 1) * tp / 9;
6025 d[37][1] = +rm * r * r2m * r2p * s * (8 * ss - 5) * tp / 6;
6026 d[38][1] = -4 * rm * r * rp * r2m * s * (8 * ss - 5) * tp / 3;
6027 d[39][1] = +rm * rp * r2m * r2p * s * (8 * ss - 5) * tp;
6028 d[40][1] = -4 * rm * r * rp * r2p * s * (8 * ss - 5) * tp / 3;
6029 d[41][1] = +r * rp * r2m * r2p * s * (8 * ss - 5) * tp / 6;
6030 d[42][1] = -rm * r * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tp / 9;
6031 d[43][1] = +8 * rm * r * rp * r2m * (8 * ss * s + 3 * ss - 4 * s - 1) * tp / 9;
6032 d[44][1] = -2 * rm * rp * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tp / 3;
6033 d[45][1] = +8 * rm * r * rp * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tp / 9;
6034 d[46][1] = -r * rp * r2m * r2p * (8 * ss * s + 3 * ss - 4 * s - 1) * tp / 9;
6035 d[47][1] = -rm * r * rp * r2m * s4p * (4 * ss + 2 * s - 1) * tp / 9;
6036 d[48][1] = +rm * rp * r2m * r2p * s4p * (4 * ss + 2 * s - 1) * tp / 12;
6037 d[49][1] = -rm * r * rp * r2p * s4p * (4 * ss + 2 * s - 1) * tp / 9;
6038 d[0][2] = -rm * r * r2m * r2p * sm * s * s2m * s2p / 72;
6039 d[1][2] = -r * rp * r2m * r2p * sm * s * s2m * s2p / 72;
6040 d[2][2] = -r * rp * r2m * r2p * s * sp * s2m * s2p / 72;
6041 d[3][2] = -rm * r * r2m * r2p * s * sp * s2m * s2p / 72;
6042 d[4][2] = +rm * r * r2m * r2p * sm * s * s2m * s2p / 72;
6043 d[5][2] = +r * rp * r2m * r2p * sm * s * s2m * s2p / 72;
6044 d[6][2] = +r * rp * r2m * r2p * s * sp * s2m * s2p / 72;
6045 d[7][2] = +rm * r * r2m * r2p * s * sp * s2m * s2p / 72;
6046 d[8][2] = +rm * r * rp * r2m * sm * s * s2m * s2p / 9;
6047 d[9][2] = -rm * rp * r2m * r2p * sm * s * s2m * s2p / 12;
6048 d[10][2] = +rm * r * rp * r2p * sm * s * s2m * s2p / 9;
6049 d[11][2] = +rm * r * r2m * r2p * sm * s * sp * s2m / 9;
6050 d[12][2] = -8 * rm * r * rp * r2m * sm * s * sp * s2m / 9;
6051 d[13][2] = +2 * rm * rp * r2m * r2p * sm * s * sp * s2m / 3;
6052 d[14][2] = -8 * rm * r * rp * r2p * sm * s * sp * s2m / 9;
6053 d[15][2] = +r * rp * r2m * r2p * sm * s * sp * s2m / 9;
6054 d[16][2] = -rm * r * r2m * r2p * sm * sp * s2m * s2p / 12;
6055 d[17][2] = +2 * rm * r * rp * r2m * sm * sp * s2m * s2p / 3;
6056 d[18][2] = -rm * rp * r2m * r2p * sm * sp * s2m * s2p / 2;
6057 d[19][2] = +2 * rm * r * rp * r2p * sm * sp * s2m * s2p / 3;
6058 d[20][2] = -r * rp * r2m * r2p * sm * sp * s2m * s2p / 12;
6059 d[21][2] = +rm * r * r2m * r2p * sm * s * sp * s2p / 9;
6060 d[22][2] = -8 * rm * r * rp * r2m * sm * s * sp * s2p / 9;
6061 d[23][2] = +2 * rm * rp * r2m * r2p * sm * s * sp * s2p / 3;
6062 d[24][2] = -8 * rm * r * rp * r2p * sm * s * sp * s2p / 9;
6063 d[25][2] = +r * rp * r2m * r2p * sm * s * sp * s2p / 9;
6064 d[26][2] = +rm * r * rp * r2m * s * sp * s2m * s2p / 9;
6065 d[27][2] = -rm * rp * r2m * r2p * s * sp * s2m * s2p / 12;
6066 d[28][2] = +rm * r * rp * r2p * s * sp * s2m * s2p / 9;
6067 d[29][2] = -rm * r * rp * r2m * sm * s * s2m * s2p / 9;
6068 d[30][2] = +rm * rp * r2m * r2p * sm * s * s2m * s2p / 12;
6069 d[31][2] = -rm * r * rp * r2p * sm * s * s2m * s2p / 9;
6070 d[32][2] = -rm * r * r2m * r2p * sm * s * sp * s2m / 9;
6071 d[33][2] = +8 * rm * r * rp * r2m * sm * s * sp * s2m / 9;
6072 d[34][2] = -2 * rm * rp * r2m * r2p * sm * s * sp * s2m / 3;
6073 d[35][2] = +8 * rm * r * rp * r2p * sm * s * sp * s2m / 9;
6074 d[36][2] = -r * rp * r2m * r2p * sm * s * sp * s2m / 9;
6075 d[37][2] = +rm * r * r2m * r2p * sm * sp * s2m * s2p / 12;
6076 d[38][2] = -2 * rm * r * rp * r2m * sm * sp * s2m * s2p / 3;
6077 d[39][2] = +rm * rp * r2m * r2p * sm * sp * s2m * s2p / 2;
6078 d[40][2] = -2 * rm * r * rp * r2p * sm * sp * s2m * s2p / 3;
6079 d[41][2] = +r * rp * r2m * r2p * sm * sp * s2m * s2p / 12;
6080 d[42][2] = -rm * r * r2m * r2p * sm * s * sp * s2p / 9;
6081 d[43][2] = +8 * rm * r * rp * r2m * sm * s * sp * s2p / 9;
6082 d[44][2] = -2 * rm * rp * r2m * r2p * sm * s * sp * s2p / 3;
6083 d[45][2] = +8 * rm * r * rp * r2p * sm * s * sp * s2p / 9;
6084 d[46][2] = -r * rp * r2m * r2p * sm * s * sp * s2p / 9;
6085 d[47][2] = -rm * r * rp * r2m * s * sp * s2m * s2p / 9;
6086 d[48][2] = +rm * rp * r2m * r2p * s * sp * s2m * s2p / 12;
6087 d[49][2] = -rm * r * rp * r2p * s * sp * s2m * s2p / 9;
6090 static const int num_nodes = 50;
6091 static const int num_faces = 6;
6092 static const int num_dimensions = 3;
6093 static const int order = 9;
6094 typedef IS_HE ischeme_type;
6096 static ischeme_type create_ischeme() {
6097 ischeme_type ischeme;
6098 ischeme[0].set_order(4);
6099 ischeme[1].set_order(4);
6100 ischeme[2].set_order(1);
6104 static ischeme_type create_ischeme(SolidMechanics& property) {
6105 ischeme_type ischeme;
6106 ischeme[0].set_order(2 * 4);
6107 ischeme[1].set_order(2 * 4);
6108 ischeme[2].set_order(2 * 1);
6109 ischeme.init(property);
6113 static const double r_node[50];
6114 static const double s_node[50];
6115 static const double t_node[50];
6117 static const bool supports_laminates =
true;
6119 static const char name[8];
6121 typedef L5_Shape_Evaluator edge_shape_type_0;
6122 typedef L2_Shape_Evaluator edge_shape_type_1;
6123 static const int num_edge = 12;
6124 static const int edge_node[12][5];
6125 static const int edge_type_index[12];
6127 typedef Q5X2_Shape_Evaluator face_shape_type_0;
6128 typedef Q25_Shape_Evaluator face_shape_type_1;
6129 static const int num_face = 6;
6130 static const int face_node[6][25];
6131 static const int face_type_index[6];
6132 static const bool is_t_face[6];
6135typedef Solid_Shape_Evaluator<HE5X5X2_Shape_Helper> HE5X5X2_Shape_Evaluator;
6137class HE4X4X3_Shape_Helper :
public HE_Shape_Helper {
6139 static void eval_h(
const double internal_coor[3],
double h[48]) {
6140 const double r = internal_coor[0];
6141 const double s = internal_coor[1];
6142 const double t = internal_coor[2];
6144 const double rm = r - 1;
6145 const double rp = r + 1;
6146 const double sm = s - 1;
6147 const double sp = s + 1;
6148 const double tm = t - 1;
6149 const double tp = t + 1;
6151 const double r3m = 3 * r - 1;
6152 const double r3p = 3 * r + 1;
6153 const double s3m = 3 * s - 1;
6154 const double s3p = 3 * s + 1;
6156 h[0] = +(rm * r3m * r3p * sm * s3m * s3p * tm * t) / 512;
6157 h[1] = -(rp * r3m * r3p * sm * s3m * s3p * tm * t) / 512;
6158 h[2] = +(rp * r3m * r3p * sp * s3m * s3p * tm * t) / 512;
6159 h[3] = -(rm * r3m * r3p * sp * s3m * s3p * tm * t) / 512;
6160 h[4] = +(rm * r3m * r3p * sm * s3m * s3p * t * tp) / 512;
6161 h[5] = -(rp * r3m * r3p * sm * s3m * s3p * t * tp) / 512;
6162 h[6] = +(rp * r3m * r3p * sp * s3m * s3p * t * tp) / 512;
6163 h[7] = -(rm * r3m * r3p * sp * s3m * s3p * t * tp) / 512;
6164 h[8] = -(rm * r3m * r3p * sm * s3m * s3p * tm * tp) / 256;
6165 h[9] = +(rp * r3m * r3p * sm * s3m * s3p * tm * tp) / 256;
6166 h[10] = -(rp * r3m * r3p * sp * s3m * s3p * tm * tp) / 256;
6167 h[11] = +(rm * r3m * r3p * sp * s3m * s3p * tm * tp) / 256;
6168 h[12] = -(9 * rm * rp * r3m * sm * s3m * s3p * tm * t) / 512;
6169 h[13] = +(9 * rm * rp * r3p * sm * s3m * s3p * tm * t) / 512;
6170 h[14] = -(9 * rm * r3m * r3p * sm * sp * s3m * tm * t) / 512;
6171 h[15] = +(81 * rm * rp * r3m * sm * sp * s3m * tm * t) / 512;
6172 h[16] = -(81 * rm * rp * r3p * sm * sp * s3m * tm * t) / 512;
6173 h[17] = +(9 * rp * r3m * r3p * sm * sp * s3m * tm * t) / 512;
6174 h[18] = +(9 * rm * r3m * r3p * sm * sp * s3p * tm * t) / 512;
6175 h[19] = -(81 * rm * rp * r3m * sm * sp * s3p * tm * t) / 512;
6176 h[20] = +(81 * rm * rp * r3p * sm * sp * s3p * tm * t) / 512;
6177 h[21] = -(9 * rp * r3m * r3p * sm * sp * s3p * tm * t) / 512;
6178 h[22] = +(9 * rm * rp * r3m * sp * s3m * s3p * tm * t) / 512;
6179 h[23] = -(9 * rm * rp * r3p * sp * s3m * s3p * tm * t) / 512;
6180 h[24] = -(9 * rm * rp * r3m * sm * s3m * s3p * t * tp) / 512;
6181 h[25] = +(9 * rm * rp * r3p * sm * s3m * s3p * t * tp) / 512;
6182 h[26] = -(9 * rm * r3m * r3p * sm * sp * s3m * t * tp) / 512;
6183 h[27] = +(81 * rm * rp * r3m * sm * sp * s3m * t * tp) / 512;
6184 h[28] = -(81 * rm * rp * r3p * sm * sp * s3m * t * tp) / 512;
6185 h[29] = +(9 * rp * r3m * r3p * sm * sp * s3m * t * tp) / 512;
6186 h[30] = +(9 * rm * r3m * r3p * sm * sp * s3p * t * tp) / 512;
6187 h[31] = -(81 * rm * rp * r3m * sm * sp * s3p * t * tp) / 512;
6188 h[32] = +(81 * rm * rp * r3p * sm * sp * s3p * t * tp) / 512;
6189 h[33] = -(9 * rp * r3m * r3p * sm * sp * s3p * t * tp) / 512;
6190 h[34] = +(9 * rm * rp * r3m * sp * s3m * s3p * t * tp) / 512;
6191 h[35] = -(9 * rm * rp * r3p * sp * s3m * s3p * t * tp) / 512;
6192 h[36] = +(9 * rm * rp * r3m * sm * s3m * s3p * tm * tp) / 256;
6193 h[37] = -(9 * rm * rp * r3p * sm * s3m * s3p * tm * tp) / 256;
6194 h[38] = +(9 * rm * r3m * r3p * sm * sp * s3m * tm * tp) / 256;
6195 h[39] = -(81 * rm * rp * r3m * sm * sp * s3m * tm * tp) / 256;
6196 h[40] = +(81 * rm * rp * r3p * sm * sp * s3m * tm * tp) / 256;
6197 h[41] = -(9 * rp * r3m * r3p * sm * sp * s3m * tm * tp) / 256;
6198 h[42] = -(9 * rm * r3m * r3p * sm * sp * s3p * tm * tp) / 256;
6199 h[43] = +(81 * rm * rp * r3m * sm * sp * s3p * tm * tp) / 256;
6200 h[44] = -(81 * rm * rp * r3p * sm * sp * s3p * tm * tp) / 256;
6201 h[45] = +(9 * rp * r3m * r3p * sm * sp * s3p * tm * tp) / 256;
6202 h[46] = -(9 * rm * rp * r3m * sp * s3m * s3p * tm * tp) / 256;
6203 h[47] = +(9 * rm * rp * r3p * sp * s3m * s3p * tm * tp) / 256;
6206 static void eval_h_derived(
const double internal_coor[3],
double d[48][3]) {
6207 const double r = internal_coor[0];
6208 const double s = internal_coor[1];
6209 const double t = internal_coor[2];
6211 const double rm = r - 1;
6212 const double rp = r + 1;
6213 const double sm = s - 1;
6214 const double sp = s + 1;
6215 const double tm = t - 1;
6216 const double tp = t + 1;
6218 const double t2m = 2 * t - 1;
6219 const double t2p = 2 * t + 1;
6221 const double r3m = 3 * r - 1;
6222 const double r3p = 3 * r + 1;
6223 const double s3m = 3 * s - 1;
6224 const double s3p = 3 * s + 1;
6226 d[0][0] = +((27 * r * r - 18 * r - 1) * sm * s3m * s3p * tm * t) / 512;
6227 d[1][0] = -((27 * r * r + 18 * r - 1) * sm * s3m * s3p * tm * t) / 512;
6228 d[2][0] = +((27 * r * r + 18 * r - 1) * sp * s3m * s3p * tm * t) / 512;
6229 d[3][0] = -((27 * r * r - 18 * r - 1) * sp * s3m * s3p * tm * t) / 512;
6230 d[4][0] = +((27 * r * r - 18 * r - 1) * sm * s3m * s3p * t * tp) / 512;
6231 d[5][0] = -((27 * r * r + 18 * r - 1) * sm * s3m * s3p * t * tp) / 512;
6232 d[6][0] = +((27 * r * r + 18 * r - 1) * sp * s3m * s3p * t * tp) / 512;
6233 d[7][0] = -((27 * r * r - 18 * r - 1) * sp * s3m * s3p * t * tp) / 512;
6234 d[8][0] = -((27 * r * r - 18 * r - 1) * sm * s3m * s3p * tm * tp) / 256;
6235 d[9][0] = +((27 * r * r + 18 * r - 1) * sm * s3m * s3p * tm * tp) / 256;
6236 d[10][0] = -((27 * r * r + 18 * r - 1) * sp * s3m * s3p * tm * tp) / 256;
6237 d[11][0] = +((27 * r * r - 18 * r - 1) * sp * s3m * s3p * tm * tp) / 256;
6238 d[12][0] = -(9 * (9 * r * r - 2 * r - 3) * sm * s3m * s3p * tm * t) / 512;
6239 d[13][0] = +(9 * (9 * r * r + 2 * r - 3) * sm * s3m * s3p * tm * t) / 512;
6240 d[14][0] = -(9 * (27 * r * r - 18 * r - 1) * sm * sp * s3m * tm * t) / 512;
6241 d[15][0] = +(81 * (9 * r * r - 2 * r - 3) * sm * sp * s3m * tm * t) / 512;
6242 d[16][0] = -(81 * (9 * r * r + 2 * r - 3) * sm * sp * s3m * tm * t) / 512;
6243 d[17][0] = +(9 * (27 * r * r + 18 * r - 1) * sm * sp * s3m * tm * t) / 512;
6244 d[18][0] = +(9 * (27 * r * r - 18 * r - 1) * sm * sp * s3p * tm * t) / 512;
6245 d[19][0] = -(81 * (9 * r * r - 2 * r - 3) * sm * sp * s3p * tm * t) / 512;
6246 d[20][0] = +(81 * (9 * r * r + 2 * r - 3) * sm * sp * s3p * tm * t) / 512;
6247 d[21][0] = -(9 * (27 * r * r + 18 * r - 1) * sm * sp * s3p * tm * t) / 512;
6248 d[22][0] = +(9 * (9 * r * r - 2 * r - 3) * sp * s3m * s3p * tm * t) / 512;
6249 d[23][0] = -(9 * (9 * r * r + 2 * r - 3) * sp * s3m * s3p * tm * t) / 512;
6250 d[24][0] = -(9 * (9 * r * r - 2 * r - 3) * sm * s3m * s3p * t * tp) / 512;
6251 d[25][0] = +(9 * (9 * r * r + 2 * r - 3) * sm * s3m * s3p * t * tp) / 512;
6252 d[26][0] = -(9 * (27 * r * r - 18 * r - 1) * sm * sp * s3m * t * tp) / 512;
6253 d[27][0] = +(81 * (9 * r * r - 2 * r - 3) * sm * sp * s3m * t * tp) / 512;
6254 d[28][0] = -(81 * (9 * r * r + 2 * r - 3) * sm * sp * s3m * t * tp) / 512;
6255 d[29][0] = +(9 * (27 * r * r + 18 * r - 1) * sm * sp * s3m * t * tp) / 512;
6256 d[30][0] = +(9 * (27 * r * r - 18 * r - 1) * sm * sp * s3p * t * tp) / 512;
6257 d[31][0] = -(81 * (9 * r * r - 2 * r - 3) * sm * sp * s3p * t * tp) / 512;
6258 d[32][0] = +(81 * (9 * r * r + 2 * r - 3) * sm * sp * s3p * t * tp) / 512;
6259 d[33][0] = -(9 * (27 * r * r + 18 * r - 1) * sm * sp * s3p * t * tp) / 512;
6260 d[34][0] = +(9 * (9 * r * r - 2 * r - 3) * sp * s3m * s3p * t * tp) / 512;
6261 d[35][0] = -(9 * (9 * r * r + 2 * r - 3) * sp * s3m * s3p * t * tp) / 512;
6262 d[36][0] = +(9 * (9 * r * r - 2 * r - 3) * sm * s3m * s3p * tm * tp) / 256;
6263 d[37][0] = -(9 * (9 * r * r + 2 * r - 3) * sm * s3m * s3p * tm * tp) / 256;
6264 d[38][0] = +(9 * (27 * r * r - 18 * r - 1) * sm * sp * s3m * tm * tp) / 256;
6265 d[39][0] = -(81 * (9 * r * r - 2 * r - 3) * sm * sp * s3m * tm * tp) / 256;
6266 d[40][0] = +(81 * (9 * r * r + 2 * r - 3) * sm * sp * s3m * tm * tp) / 256;
6267 d[41][0] = -(9 * (27 * r * r + 18 * r - 1) * sm * sp * s3m * tm * tp) / 256;
6268 d[42][0] = -(9 * (27 * r * r - 18 * r - 1) * sm * sp * s3p * tm * tp) / 256;
6269 d[43][0] = +(81 * (9 * r * r - 2 * r - 3) * sm * sp * s3p * tm * tp) / 256;
6270 d[44][0] = -(81 * (9 * r * r + 2 * r - 3) * sm * sp * s3p * tm * tp) / 256;
6271 d[45][0] = +(9 * (27 * r * r + 18 * r - 1) * sm * sp * s3p * tm * tp) / 256;
6272 d[46][0] = -(9 * (9 * r * r - 2 * r - 3) * sp * s3m * s3p * tm * tp) / 256;
6273 d[47][0] = +(9 * (9 * r * r + 2 * r - 3) * sp * s3m * s3p * tm * tp) / 256;
6274 d[0][1] = +(rm * r3m * r3p * (27 * s * s - 18 * s - 1) * tm * t) / 512;
6275 d[1][1] = -(rp * r3m * r3p * (27 * s * s - 18 * s - 1) * tm * t) / 512;
6276 d[2][1] = +(rp * r3m * r3p * (27 * s * s + 18 * s - 1) * tm * t) / 512;
6277 d[3][1] = -(rm * r3m * r3p * (27 * s * s + 18 * s - 1) * tm * t) / 512;
6278 d[4][1] = +(rm * r3m * r3p * (27 * s * s - 18 * s - 1) * t * tp) / 512;
6279 d[5][1] = -(rp * r3m * r3p * (27 * s * s - 18 * s - 1) * t * tp) / 512;
6280 d[6][1] = +(rp * r3m * r3p * (27 * s * s + 18 * s - 1) * t * tp) / 512;
6281 d[7][1] = -(rm * r3m * r3p * (27 * s * s + 18 * s - 1) * t * tp) / 512;
6282 d[8][1] = -(rm * r3m * r3p * (27 * s * s - 18 * s - 1) * tm * tp) / 256;
6283 d[9][1] = +(rp * r3m * r3p * (27 * s * s - 18 * s - 1) * tm * tp) / 256;
6284 d[10][1] = -(rp * r3m * r3p * (27 * s * s + 18 * s - 1) * tm * tp) / 256;
6285 d[11][1] = +(rm * r3m * r3p * (27 * s * s + 18 * s - 1) * tm * tp) / 256;
6286 d[12][1] = -(9 * rm * rp * r3m * (27 * s * s - 18 * s - 1) * tm * t) / 512;
6287 d[13][1] = +(9 * rm * rp * r3p * (27 * s * s - 18 * s - 1) * tm * t) / 512;
6288 d[14][1] = -(9 * rm * r3m * r3p * (9 * s * s - 2 * s - 3) * tm * t) / 512;
6289 d[15][1] = +(81 * rm * rp * r3m * (9 * s * s - 2 * s - 3) * tm * t) / 512;
6290 d[16][1] = -(81 * rm * rp * r3p * (9 * s * s - 2 * s - 3) * tm * t) / 512;
6291 d[17][1] = +(9 * rp * r3m * r3p * (9 * s * s - 2 * s - 3) * tm * t) / 512;
6292 d[18][1] = +(9 * rm * r3m * r3p * (9 * s * s + 2 * s - 3) * tm * t) / 512;
6293 d[19][1] = -(81 * rm * rp * r3m * (9 * s * s + 2 * s - 3) * tm * t) / 512;
6294 d[20][1] = +(81 * rm * rp * r3p * (9 * s * s + 2 * s - 3) * tm * t) / 512;
6295 d[21][1] = -(9 * rp * r3m * r3p * (9 * s * s + 2 * s - 3) * tm * t) / 512;
6296 d[22][1] = +(9 * rm * rp * r3m * (27 * s * s + 18 * s - 1) * tm * t) / 512;
6297 d[23][1] = -(9 * rm * rp * r3p * (27 * s * s + 18 * s - 1) * tm * t) / 512;
6298 d[24][1] = -(9 * rm * rp * r3m * (27 * s * s - 18 * s - 1) * t * tp) / 512;
6299 d[25][1] = +(9 * rm * rp * r3p * (27 * s * s - 18 * s - 1) * t * tp) / 512;
6300 d[26][1] = -(9 * rm * r3m * r3p * (9 * s * s - 2 * s - 3) * t * tp) / 512;
6301 d[27][1] = +(81 * rm * rp * r3m * (9 * s * s - 2 * s - 3) * t * tp) / 512;
6302 d[28][1] = -(81 * rm * rp * r3p * (9 * s * s - 2 * s - 3) * t * tp) / 512;
6303 d[29][1] = +(9 * rp * r3m * r3p * (9 * s * s - 2 * s - 3) * t * tp) / 512;
6304 d[30][1] = +(9 * rm * r3m * r3p * (9 * s * s + 2 * s - 3) * t * tp) / 512;
6305 d[31][1] = -(81 * rm * rp * r3m * (9 * s * s + 2 * s - 3) * t * tp) / 512;
6306 d[32][1] = +(81 * rm * rp * r3p * (9 * s * s + 2 * s - 3) * t * tp) / 512;
6307 d[33][1] = -(9 * rp * r3m * r3p * (9 * s * s + 2 * s - 3) * t * tp) / 512;
6308 d[34][1] = +(9 * rm * rp * r3m * (27 * s * s + 18 * s - 1) * t * tp) / 512;
6309 d[35][1] = -(9 * rm * rp * r3p * (27 * s * s + 18 * s - 1) * t * tp) / 512;
6310 d[36][1] = +(9 * rm * rp * r3m * (27 * s * s - 18 * s - 1) * tm * tp) / 256;
6311 d[37][1] = -(9 * rm * rp * r3p * (27 * s * s - 18 * s - 1) * tm * tp) / 256;
6312 d[38][1] = +(9 * rm * r3m * r3p * (9 * s * s - 2 * s - 3) * tm * tp) / 256;
6313 d[39][1] = -(81 * rm * rp * r3m * (9 * s * s - 2 * s - 3) * tm * tp) / 256;
6314 d[40][1] = +(81 * rm * rp * r3p * (9 * s * s - 2 * s - 3) * tm * tp) / 256;
6315 d[41][1] = -(9 * rp * r3m * r3p * (9 * s * s - 2 * s - 3) * tm * tp) / 256;
6316 d[42][1] = -(9 * rm * r3m * r3p * (9 * s * s + 2 * s - 3) * tm * tp) / 256;
6317 d[43][1] = +(81 * rm * rp * r3m * (9 * s * s + 2 * s - 3) * tm * tp) / 256;
6318 d[44][1] = -(81 * rm * rp * r3p * (9 * s * s + 2 * s - 3) * tm * tp) / 256;
6319 d[45][1] = +(9 * rp * r3m * r3p * (9 * s * s + 2 * s - 3) * tm * tp) / 256;
6320 d[46][1] = -(9 * rm * rp * r3m * (27 * s * s + 18 * s - 1) * tm * tp) / 256;
6321 d[47][1] = +(9 * rm * rp * r3p * (27 * s * s + 18 * s - 1) * tm * tp) / 256;
6322 d[0][2] = +(rm * r3m * r3p * sm * s3m * s3p * t2m) / 512;
6323 d[1][2] = -(rp * r3m * r3p * sm * s3m * s3p * t2m) / 512;
6324 d[2][2] = +(rp * r3m * r3p * sp * s3m * s3p * t2m) / 512;
6325 d[3][2] = -(rm * r3m * r3p * sp * s3m * s3p * t2m) / 512;
6326 d[4][2] = +(rm * r3m * r3p * sm * s3m * s3p * t2p) / 512;
6327 d[5][2] = -(rp * r3m * r3p * sm * s3m * s3p * t2p) / 512;
6328 d[6][2] = +(rp * r3m * r3p * sp * s3m * s3p * t2p) / 512;
6329 d[7][2] = -(rm * r3m * r3p * sp * s3m * s3p * t2p) / 512;
6330 d[8][2] = -(rm * r3m * r3p * sm * s3m * s3p * t) / 128;
6331 d[9][2] = +(rp * r3m * r3p * sm * s3m * s3p * t) / 128;
6332 d[10][2] = -(rp * r3m * r3p * sp * s3m * s3p * t) / 128;
6333 d[11][2] = +(rm * r3m * r3p * sp * s3m * s3p * t) / 128;
6334 d[12][2] = -(9 * rm * rp * r3m * sm * s3m * s3p * t2m) / 512;
6335 d[13][2] = +(9 * rm * rp * r3p * sm * s3m * s3p * t2m) / 512;
6336 d[14][2] = -(9 * rm * r3m * r3p * sm * sp * s3m * t2m) / 512;
6337 d[15][2] = +(81 * rm * rp * r3m * sm * sp * s3m * t2m) / 512;
6338 d[16][2] = -(81 * rm * rp * r3p * sm * sp * s3m * t2m) / 512;
6339 d[17][2] = +(9 * rp * r3m * r3p * sm * sp * s3m * t2m) / 512;
6340 d[18][2] = +(9 * rm * r3m * r3p * sm * sp * s3p * t2m) / 512;
6341 d[19][2] = -(81 * rm * rp * r3m * sm * sp * s3p * t2m) / 512;
6342 d[20][2] = +(81 * rm * rp * r3p * sm * sp * s3p * t2m) / 512;
6343 d[21][2] = -(9 * rp * r3m * r3p * sm * sp * s3p * t2m) / 512;
6344 d[22][2] = +(9 * rm * rp * r3m * sp * s3m * s3p * t2m) / 512;
6345 d[23][2] = -(9 * rm * rp * r3p * sp * s3m * s3p * t2m) / 512;
6346 d[24][2] = -(9 * rm * rp * r3m * sm * s3m * s3p * t2p) / 512;
6347 d[25][2] = +(9 * rm * rp * r3p * sm * s3m * s3p * t2p) / 512;
6348 d[26][2] = -(9 * rm * r3m * r3p * sm * sp * s3m * t2p) / 512;
6349 d[27][2] = +(81 * rm * rp * r3m * sm * sp * s3m * t2p) / 512;
6350 d[28][2] = -(81 * rm * rp * r3p * sm * sp * s3m * t2p) / 512;
6351 d[29][2] = +(9 * rp * r3m * r3p * sm * sp * s3m * t2p) / 512;
6352 d[30][2] = +(9 * rm * r3m * r3p * sm * sp * s3p * t2p) / 512;
6353 d[31][2] = -(81 * rm * rp * r3m * sm * sp * s3p * t2p) / 512;
6354 d[32][2] = +(81 * rm * rp * r3p * sm * sp * s3p * t2p) / 512;
6355 d[33][2] = -(9 * rp * r3m * r3p * sm * sp * s3p * t2p) / 512;
6356 d[34][2] = +(9 * rm * rp * r3m * sp * s3m * s3p * t2p) / 512;
6357 d[35][2] = -(9 * rm * rp * r3p * sp * s3m * s3p * t2p) / 512;
6358 d[36][2] = +(9 * rm * rp * r3m * sm * s3m * s3p * t) / 128;
6359 d[37][2] = -(9 * rm * rp * r3p * sm * s3m * s3p * t) / 128;
6360 d[38][2] = +(9 * rm * r3m * r3p * sm * sp * s3m * t) / 128;
6361 d[39][2] = -(81 * rm * rp * r3m * sm * sp * s3m * t) / 128;
6362 d[40][2] = +(81 * rm * rp * r3p * sm * sp * s3m * t) / 128;
6363 d[41][2] = -(9 * rp * r3m * r3p * sm * sp * s3m * t) / 128;
6364 d[42][2] = -(9 * rm * r3m * r3p * sm * sp * s3p * t) / 128;
6365 d[43][2] = +(81 * rm * rp * r3m * sm * sp * s3p * t) / 128;
6366 d[44][2] = -(81 * rm * rp * r3p * sm * sp * s3p * t) / 128;
6367 d[45][2] = +(9 * rp * r3m * r3p * sm * sp * s3p * t) / 128;
6368 d[46][2] = -(9 * rm * rp * r3m * sp * s3m * s3p * t) / 128;
6369 d[47][2] = +(9 * rm * rp * r3p * sp * s3m * s3p * t) / 128;
6372 static const int num_nodes = 48;
6373 static const int num_faces = 6;
6374 static const int num_dimensions = 3;
6375 static const int order = 8;
6376 typedef IS_HE ischeme_type;
6378 static ischeme_type create_ischeme() {
6379 ischeme_type ischeme;
6380 ischeme[0].set_order(3);
6381 ischeme[1].set_order(3);
6382 ischeme[2].set_order(2);
6386 static ischeme_type create_ischeme(SolidMechanics& property) {
6387 ischeme_type ischeme;
6388 ischeme[0].set_order(2 * 3);
6389 ischeme[1].set_order(2 * 3);
6390 ischeme[2].set_order(2 * 2);
6391 ischeme.init(property);
6395 static const double r_node[48];
6396 static const double s_node[48];
6397 static const double t_node[48];
6399 static const bool supports_laminates =
true;
6401 static const char name[8];
6403 typedef L4_Shape_Evaluator edge_shape_type_0;
6404 typedef L3_Shape_Evaluator edge_shape_type_1;
6405 static const int num_edge = 12;
6406 static const int edge_node[12][4];
6407 static const int edge_type_index[12];
6409 typedef Q4X3_Shape_Evaluator face_shape_type_0;
6410 typedef Q16_Shape_Evaluator face_shape_type_1;
6411 static const int num_face = 6;
6412 static const int face_node[6][16];
6413 static const int face_type_index[6];
6414 static const bool is_t_face[6];
6417typedef Solid_Shape_Evaluator<HE4X4X3_Shape_Helper> HE4X4X3_Shape_Evaluator;
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
T norm_3(T a[3])
Definition b2tensor_calculus.H:364
T normalise_3(T a[3])
Definition b2tensor_calculus.H:418
void outer_product_3(const T1 a[3], const T2 b[3], T3 c[3])
Definition b2tensor_calculus.H:389