35using GetElementShapeMapType = std::map<ElementType, std::function<void(
const int,
const int,
const int,
38GetElementShapeMapType get_element_shape_data = {
40 {ElementType::HEX8, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
43 double lx = 1.0 - xi(0,g);
44 double ly = 1.0 - xi(1,g);
45 double lz = 1.0 - xi(2,g);
46 double ux = 1.0 + xi(0,g);
47 double uy = 1.0 + xi(1,g);
48 double uz = 1.0 + xi(2,g);
50 N(0,g) = lx*ly*lz/8.0;
51 N(1,g) = ux*ly*lz/8.0;
52 N(2,g) = ux*uy*lz/8.0;
53 N(3,g) = lx*uy*lz/8.0;
54 N(4,g) = lx*ly*uz/8.0;
55 N(5,g) = ux*ly*uz/8.0;
56 N(6,g) = ux*uy*uz/8.0;
57 N(7,g) = lx*uy*uz/8.0;
59 Nx(0,0,g) = -ly*lz/8.0;
60 Nx(1,0,g) = -lx*lz/8.0;
61 Nx(2,0,g) = -lx*ly/8.0;
63 Nx(0,1,g) = ly*lz/8.0;
64 Nx(1,1,g) = -ux*lz/8.0;
65 Nx(2,1,g) = -ux*ly/8.0;
67 Nx(0,2,g) = uy*lz/8.0;
68 Nx(1,2,g) = ux*lz/8.0;
69 Nx(2,2,g) = -ux*uy/8.0;
71 Nx(0,3,g) = -uy*lz/8.0;
72 Nx(1,3,g) = lx*lz/8.0;
73 Nx(2,3,g) = -lx*uy/8.0;
75 Nx(0,4,g) = -ly*uz/8.0;
76 Nx(1,4,g) = -lx*uz/8.0;
77 Nx(2,4,g) = lx*ly/8.0;
79 Nx(0,5,g) = ly*uz/8.0;
80 Nx(1,5,g) = -ux*uz/8.0;
81 Nx(2,5,g) = ux*ly/8.0;
83 Nx(0,6,g) = uy*uz/8.0;
84 Nx(1,6,g) = ux*uz/8.0;
85 Nx(2,6,g) = ux*uy/8.0;
87 Nx(0,7,g) = -uy*uz/8.0;
88 Nx(1,7,g) = lx*uz/8.0;
89 Nx(2,7,g) = lx*uy/8.0;
93 {ElementType::HEX20, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
96 double lx = 1.0 - xi(0,g);
97 double ly = 1.0 - xi(1,g);
98 double lz = 1.0 - xi(2,g);
99 double ux = 1.0 + xi(0,g);
100 double uy = 1.0 + xi(1,g);
101 double uz = 1.0 + xi(2,g);
107 N(0, g) = lx*ly*lz*(lx+ly+lz-5.0)/8.0;
108 N(1, g) = ux*ly*lz*(ux+ly+lz-5.0)/8.0;
109 N(2, g) = ux*uy*lz*(ux+uy+lz-5.0)/8.0;
110 N(3, g) = lx*uy*lz*(lx+uy+lz-5.0)/8.0;
111 N(4, g) = lx*ly*uz*(lx+ly+uz-5.0)/8.0;
112 N(5, g) = ux*ly*uz*(ux+ly+uz-5.0)/8.0;
113 N(6, g) = ux*uy*uz*(ux+uy+uz-5.0)/8.0;
114 N(7, g) = lx*uy*uz*(lx+uy+uz-5.0)/8.0;
115 N(8, g) = mx*ly*lz/4.0;
116 N(9, g) = ux*my*lz/4.0;
117 N(10, g) = mx*uy*lz/4.0;
118 N(11, g) = lx*my*lz/4.0;
119 N(12, g) = mx*ly*uz/4.0;
120 N(13, g) = ux*my*uz/4.0;
121 N(14, g) = mx*uy*uz/4.0;
122 N(15, g) = lx*my*uz/4.0;
123 N(16, g) = lx*ly*mz/4.0;
124 N(17, g) = ux*ly*mz/4.0;
125 N(18, g) = ux*uy*mz/4.0;
126 N(19, g) = lx*uy*mz/4.0;
130 Nx(0,n,g) = -ly*lz*(lx+ly+lz-5.0+lx)/8.0;
131 Nx(1,n,g) = -lx*lz*(lx+ly+lz-5.0+ly)/8.0;
132 Nx(2,n,g) = -lx*ly*(lx+ly+lz-5.0+lz)/8.0;
136 Nx(0,n,g) = ly*lz*(ux+ly+lz-5.0+ux)/8.0;
137 Nx(1,n,g) = -ux*lz*(ux+ly+lz-5.0+ly)/8.0;
138 Nx(2,n,g) = -ux*ly*(ux+ly+lz-5.0+lz)/8.0;
142 Nx(0,n,g) = uy*lz*(ux+uy+lz-5.0+ux)/8.0;
143 Nx(1,n,g) = ux*lz*(ux+uy+lz-5.0+uy)/8.0;
144 Nx(2,n,g) = -ux*uy*(ux+uy+lz-5.0+lz)/8.0;
148 Nx(0,n,g) = -uy*lz*(lx+uy+lz-5.0+lx)/8.0;
149 Nx(1,n,g) = lx*lz*(lx+uy+lz-5.0+uy)/8.0;
150 Nx(2,n,g) = -lx*uy*(lx+uy+lz-5.0+lz)/8.0;
154 Nx(0,n,g) = -ly*uz*(lx+ly+uz-5.0+lx)/8.0;
155 Nx(1,n,g) = -lx*uz*(lx+ly+uz-5.0+ly)/8.0;
156 Nx(2,n,g) = lx*ly*(lx+ly+uz-5.0+uz)/8.0;
160 Nx(0,n,g) = ly*uz*(ux+ly+uz-5.0+ux)/8.0;
161 Nx(1,n,g) = -ux*uz*(ux+ly+uz-5.0+ly)/8.0;
162 Nx(2,n,g) = ux*ly*(ux+ly+uz-5.0+uz)/8.0;
166 Nx(0,n,g) = uy*uz*(ux+uy+uz-5.0+ux)/8.0;
167 Nx(1,n,g) = ux*uz*(ux+uy+uz-5.0+uy)/8.0;
168 Nx(2,n,g) = ux*uy*(ux+uy+uz-5.0+uz)/8.0;
172 Nx(0,n,g) = -uy*uz*(lx+uy+uz-5.0+lx)/8.0;
173 Nx(1,n,g) = lx*uz*(lx+uy+uz-5.0+uy)/8.0;
174 Nx(2,n,g) = lx*uy*(lx+uy+uz-5.0+uz)/8.0;
178 Nx(0,n,g) = (lx - ux)*ly*lz/4.0;
179 Nx(1,n,g) = -mx*lz/4.0;
180 Nx(2,n,g) = -mx*ly/4.0;
184 Nx(0,n,g) = my*lz/4.0;
185 Nx(1,n,g) = (ly - uy)*ux*lz/4.0;
186 Nx(2,n,g) = -ux*my/4.0;
190 Nx(0,n,g) = (lx - ux)*uy*lz/4.0;
191 Nx(1,n,g) = mx*lz/4.0;
192 Nx(2,n,g) = -mx*uy/4.0;
196 Nx(0,n,g) = -my*lz/4.0;
197 Nx(1,n,g) = (ly - uy)*lx*lz/4.0;
198 Nx(2,n,g) = -lx*my/4.0;
202 Nx(0,n,g) = (lx - ux)*ly*uz/4.0;
203 Nx(1,n,g) = -mx*uz/4.0;
204 Nx(2,n,g) = mx*ly/4.0;
208 Nx(0,n,g) = my*uz/4.0;
209 Nx(1,n,g) = (ly - uy)*ux*uz/4.0;
210 Nx(2,n,g) = ux*my/4.0;
214 Nx(0,n,g) = (lx - ux)*uy*uz/4.0;
215 Nx(1,n,g) = mx*uz/4.0;
216 Nx(2,n,g) = mx*uy/4.0;
220 Nx(0,n,g) = -my*uz/4.0;
221 Nx(1,n,g) = (ly - uy)*lx*uz/4.0;
222 Nx(2,n,g) = lx*my/4.0;
226 Nx(0,n,g) = -ly*mz/4.0;
227 Nx(1,n,g) = -lx*mz/4.0;
228 Nx(2,n,g) = (lz - uz)*lx*ly/4.0;
232 Nx(0,n,g) = ly*mz/4.0;
233 Nx(1,n,g) = -ux*mz/4.0;
234 Nx(2,n,g) = (lz - uz)*ux*ly/4.0;
238 Nx(0,n,g) = uy*mz/4.0;
239 Nx(1,n,g) = ux*mz/4.0;
240 Nx(2,n,g) = (lz - uz)*ux*uy/4.0;
244 Nx(0,n,g) = -uy*mz/4.0;
245 Nx(1,n,g) = lx*mz/4.0;
246 Nx(2,n,g) = (lz - uz)*lx*uy/4.0;
250 {ElementType::HEX27, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
253 double lx = 1.0 - xi(0,g);
254 double ly = 1.0 - xi(1,g);
255 double lz = 1.0 - xi(2,g);
256 double ux = 1.0 + xi(0,g);
257 double uy = 1.0 + xi(1,g);
258 double uz = 1.0 + xi(2,g);
264 N(0,g) = -mx*lx*my*ly*mz*lz/8.0;
265 N(1,g) = mx*ux*my*ly*mz*lz/8.0;
266 N(2,g) = -mx*ux*my*uy*mz*lz/8.0;
267 N(3,g) = mx*lx*my*uy*mz*lz/8.0;
268 N(4,g) = mx*lx*my*ly*mz*uz/8.0;
269 N(5,g) = -mx*ux*my*ly*mz*uz/8.0;
270 N(6,g) = mx*ux*my*uy*mz*uz/8.0;
271 N(7,g) = -mx*lx*my*uy*mz*uz/8.0;
272 N(8,g) = lx*ux*my*ly*mz*lz/4.0;
273 N(9,g) = -mx*ux*ly*uy*mz*lz/4.0;
274 N(10,g) = -lx*ux*my*uy*mz*lz/4.0;
275 N(11,g) = mx*lx*ly*uy*mz*lz/4.0;
276 N(12,g) = -lx*ux*my*ly*mz*uz/4.0;
277 N(13,g) = mx*ux*ly*uy*mz*uz/4.0;
278 N(14,g) = lx*ux*my*uy*mz*uz/4.0;
279 N(15,g) = -mx*lx*ly*uy*mz*uz/4.0;
280 N(16,g) = mx*lx*my*ly*lz*uz/4.0;
281 N(17,g) = -mx*ux*my*ly*lz*uz/4.0;
282 N(18,g) = mx*ux*my*uy*lz*uz/4.0;
283 N(19,g) = -mx*lx*my*uy*lz*uz/4.0;
285 N(20,g) = -mx*lx*ly*uy*lz*uz/2.0;
286 N(21,g) = mx*ux*ly*uy*lz*uz/2.0;
287 N(22,g) = -lx*ux*my*ly*lz*uz/2.0;
288 N(23,g) = lx*ux*my*uy*lz*uz/2.0;
289 N(24,g) = -lx*ux*ly*uy*mz*lz/2.0;
290 N(25,g) = lx*ux*ly*uy*mz*uz/2.0;
292 N(26,g) = lx*ux*ly*uy*lz*uz;
296 Nx(0,n,g) = -(lx - mx)*my*ly*mz*lz/8.0;
297 Nx(1,n,g) = -(ly - my)*mx*lx*mz*lz/8.0;
298 Nx(2,n,g) = -(lz - mz)*mx*lx*my*ly/8.0;
302 Nx(0,n,g) = (mx + ux)*my*ly*mz*lz/8.0;
303 Nx(1,n,g) = (ly - my)*mx*ux*mz*lz/8.0;
304 Nx(2,n,g) = (lz - mz)*mx*ux*my*ly/8.0;
308 Nx(0,n,g) = -(mx + ux)*my*uy*mz*lz/8.0;
309 Nx(1,n,g) = -(my + uy)*mx*ux*mz*lz/8.0;
310 Nx(2,n,g) = -(lz - mz)*mx*ux*my*uy/8.0;
314 Nx(0,n,g) = (lx - mx)*my*uy*mz*lz/8.0;
315 Nx(1,n,g) = (my + uy)*mx*lx*mz*lz/8.0;
316 Nx(2,n,g) = (lz - mz)*mx*lx*my*uy/8.0;
320 Nx(0,n,g) = (lx - mx)*my*ly*mz*uz/8.0;
321 Nx(1,n,g) = (ly - my)*mx*lx*mz*uz/8.0;
322 Nx(2,n,g) = (mz + uz)*mx*lx*my*ly/8.0;
326 Nx(0,n,g) = -(mx + ux)*my*ly*mz*uz/8.0;
327 Nx(1,n,g) = -(ly - my)*mx*ux*mz*uz/8.0;
328 Nx(2,n,g) = -(mz + uz)*mx*ux*my*ly/8.0;
332 Nx(0,n,g) = (mx + ux)*my*uy*mz*uz/8.0;
333 Nx(1,n,g) = (my + uy)*mx*ux*mz*uz/8.0;
334 Nx(2,n,g) = (mz + uz)*mx*ux*my*uy/8.0;
338 Nx(0,n,g) = -(lx - mx)*my*uy*mz*uz/8.0;
339 Nx(1,n,g) = -(my + uy)*mx*lx*mz*uz/8.0;
340 Nx(2,n,g) = -(mz + uz)*mx*lx*my*uy/8.0;
344 Nx(0,n,g) = (lx - ux)*my*ly*mz*lz/4.0;
345 Nx(1,n,g) = (ly - my)*lx*ux*mz*lz/4.0;
346 Nx(2,n,g) = (lz - mz)*lx*ux*my*ly/4.0;
350 Nx(0,n,g) = -(mx + ux)*ly*uy*mz*lz/4.0;
351 Nx(1,n,g) = -(ly - uy)*mx*ux*mz*lz/4.0;
352 Nx(2,n,g) = -(lz - mz)*mx*ux*ly*uy/4.0;
356 Nx(0,n,g) = -(lx - ux)*my*uy*mz*lz/4.0;
357 Nx(1,n,g) = -(my + uy)*lx*ux*mz*lz/4.0;
358 Nx(2,n,g) = -(lz - mz)*lx*ux*my*uy/4.0;
362 Nx(0,n,g) = (lx - mx)*ly*uy*mz*lz/4.0;
363 Nx(1,n,g) = (ly - uy)*mx*lx*mz*lz/4.0;
364 Nx(2,n,g) = (lz - mz)*mx*lx*ly*uy/4.0;
368 Nx(0,n,g) = -(lx - ux)*my*ly*mz*uz/4.0;
369 Nx(1,n,g) = -(ly - my)*lx*ux*mz*uz/4.0;
370 Nx(2,n,g) = -(mz + uz)*lx*ux*my*ly/4.0;
374 Nx(0,n,g) = (mx + ux)*ly*uy*mz*uz/4.0;
375 Nx(1,n,g) = (ly - uy)*mx*ux*mz*uz/4.0;
376 Nx(2,n,g) = (mz + uz)*mx*ux*ly*uy/4.0;
380 Nx(0,n,g) = (lx - ux)*my*uy*mz*uz/4.0;
381 Nx(1,n,g) = (my + uy)*lx*ux*mz*uz/4.0;
382 Nx(2,n,g) = (mz + uz)*lx*ux*my*uy/4.0;
386 Nx(0,n,g) = -(lx - mx)*ly*uy*mz*uz/4.0;
387 Nx(1,n,g) = -(ly - uy)*mx*lx*mz*uz/4.0;
388 Nx(2,n,g) = -(mz + uz)*mx*lx*ly*uy/4.0;
392 Nx(0,n,g) = (lx - mx)*my*ly*lz*uz/4.0;
393 Nx(1,n,g) = (ly - my)*mx*lx*lz*uz/4.0;
394 Nx(2,n,g) = (lz - uz)*mx*lx*my*ly/4.0;
398 Nx(0,n,g) = -(mx + ux)*my*ly*lz*uz/4.0;
399 Nx(1,n,g) = -(ly - my)*mx*ux*lz*uz/4.0;
400 Nx(2,n,g) = -(lz - uz)*mx*ux*my*ly/4.0;
404 Nx(0,n,g) = (mx + ux)*my*uy*lz*uz/4.0;
405 Nx(1,n,g) = (my + uy)*mx*ux*lz*uz/4.0;
406 Nx(2,n,g) = (lz - uz)*mx*ux*my*uy/4.0;
410 Nx(0,n,g) = -(lx - mx)*my*uy*lz*uz/4.0;
411 Nx(1,n,g) = -(my + uy)*mx*lx*lz*uz/4.0;
412 Nx(2,n,g) = -(lz - uz)*mx*lx*my*uy/4.0;
416 Nx(0,n,g) = -(lx - mx)*ly*uy*lz*uz/2.0;
417 Nx(1,n,g) = -(ly - uy)*mx*lx*lz*uz/2.0;
418 Nx(2,n,g) = -(lz - uz)*mx*lx*ly*uy/2.0;
422 Nx(0,n,g) = (mx + ux)*ly*uy*lz*uz/2.0;
423 Nx(1,n,g) = (ly - uy)*mx*ux*lz*uz/2.0;
424 Nx(2,n,g) = (lz - uz)*mx*ux*ly*uy/2.0;
428 Nx(0,n,g) = -(lx - ux)*my*ly*lz*uz/2.0;
429 Nx(1,n,g) = -(ly - my)*lx*ux*lz*uz/2.0;
430 Nx(2,n,g) = -(lz - uz)*lx*ux*my*ly/2.0;
434 Nx(0,n,g) = (lx - ux)*my*uy*lz*uz/2.0;
435 Nx(1,n,g) = (my + uy)*lx*ux*lz*uz/2.0;
436 Nx(2,n,g) = (lz - uz)*lx*ux*my*uy/2.0;
440 Nx(0,n,g) = -(lx - ux)*ly*uy*mz*lz/2.0;
441 Nx(1,n,g) = -(ly - uy)*lx*ux*mz*lz/2.0;
442 Nx(2,n,g) = -(lz - mz)*lx*ux*ly*uy/2.0;
446 Nx(0,n,g) = (lx - ux)*ly*uy*mz*uz/2.0;
447 Nx(1,n,g) = (ly - uy)*lx*ux*mz*uz/2.0;
448 Nx(2,n,g) = (mz + uz)*lx*ux*ly*uy/2.0;
452 Nx(0,n,g) = (lx - ux)*ly*uy*lz*uz;
453 Nx(1,n,g) = (ly - uy)*lx*ux*lz*uz;
454 Nx(2,n,g) = (lz - uz)*lx*ux*ly*uy;
458 {ElementType::LIN1, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
461 N(0,g) = (1.0 - xi(0,g))*0.5;
462 N(1,g) = (1.0 + xi(0,g))*0.5;
469 {ElementType::LIN2, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
472 N(0,g) = -xi(0,g)*(1.0 - xi(0,g))*0.50;
473 N(1,g) = xi(0,g)*(1.0 + xi(0,g))*0.50;
474 N(2,g) = (1.0 - xi(0,g))*(1.0 + xi(0,g));
476 Nx(0,0,g) = -0.50 + xi(0,g);
477 Nx(0,1,g) = 0.50 + xi(0,g);
478 Nx(0,2,g) = -2.0*xi(0,g);
482 {ElementType::QUD4, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
485 double lx = 1.0 - xi(0,g);
486 double ly = 1.0 - xi(1,g);
487 double ux = 1.0 + xi(0,g);
488 double uy = 1.0 + xi(1,g);
490 N(0,g) = lx*ly / 4.0;
491 N(1,g) = ux*ly / 4.0;
492 N(2,g) = ux*uy / 4.0;
493 N(3,g) = lx*uy / 4.0;
495 Nx(0,0,g) = -ly / 4.0;
496 Nx(1,0,g) = -lx / 4.0;
497 Nx(0,1,g) = ly / 4.0;
498 Nx(1,1,g) = -ux / 4.0;
499 Nx(0,2,g) = uy / 4.0;
500 Nx(1,2,g) = ux / 4.0;
501 Nx(0,3,g) = -uy / 4.0;
502 Nx(1,3,g) = lx / 4.0;
506 {ElementType::QUD9, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
509 double lx = 1.0 - xi(0,g);
510 double ly = 1.0 - xi(1,g);
511 double ux = 1.0 + xi(0,g);
512 double uy = 1.0 + xi(1,g);
516 N(0,g) = mx*lx*my*ly/4.0;
517 N(1,g) = -mx*ux*my*ly/4.0;
518 N(2,g) = mx*ux*my*uy/4.0;
519 N(3,g) = -mx*lx*my*uy/4.0;
520 N(4,g) = -lx*ux*my*ly*0.50;
521 N(5,g) = mx*ux*ly*uy*0.50;
522 N(6,g) = lx*ux*my*uy*0.50;
523 N(7,g) = -mx*lx*ly*uy*0.50;
524 N(8,g) = lx*ux*ly*uy;
526 Nx(0,0,g) = (lx - mx)*my*ly/4.0;
527 Nx(1,0,g) = (ly - my)*mx*lx/4.0;
528 Nx(0,1,g) = -(ux + mx)*my*ly/4.0;
529 Nx(1,1,g) = -(ly - my)*mx*ux/4.0;
530 Nx(0,2,g) = (ux + mx)*my*uy/4.0;
531 Nx(1,2,g) = (uy + my)*mx*ux/4.0;
532 Nx(0,3,g) = -(lx - mx)*my*uy/4.0;
533 Nx(1,3,g) = -(uy + my)*mx*lx/4.0;
534 Nx(0,4,g) = -(lx - ux)*my*ly*0.50;
535 Nx(1,4,g) = -(ly - my)*lx*ux*0.50;
536 Nx(0,5,g) = (ux + mx)*ly*uy*0.50;
537 Nx(1,5,g) = (ly - uy)*mx*ux*0.50;
538 Nx(0,6,g) = (lx - ux)*my*uy*0.50;
539 Nx(1,6,g) = (uy + my)*lx*ux*0.50;
540 Nx(0,7,g) = -(lx - mx)*ly*uy*0.50;
541 Nx(1,7,g) = -(ly - uy)*mx*lx*0.50;
542 Nx(0,8,g) = (lx - ux)*ly*uy;
543 Nx(1,8,g) = (ly - uy)*lx*ux;
547 {ElementType::TET4, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
555 N(3,g) = 1.0 - xi(0,g) - xi(1,g) - xi(2,g);
572 {ElementType::TET10, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
575 double s = 1.0 - xi(0,g) - xi(1,g) - xi(2,g);
576 N(0,g) = xi(0,g)*(2.0*xi(0,g) - 1.0);
577 N(1,g) = xi(1,g)*(2.0*xi(1,g) - 1.0);
578 N(2,g) = xi(2,g)*(2.0*xi(2,g) - 1.0);
579 N(3,g) = s * (2.0*s - 1.0);
580 N(4,g) = 4.0*xi(0,g)*xi(1,g);
581 N(5,g) = 4.0*xi(1,g)*xi(2,g);
582 N(6,g) = 4.0*xi(0,g)*xi(2,g);
583 N(7,g) = 4.0*xi(0,g)*s;
584 N(8,g) = 4.0*xi(1,g)*s;
585 N(9,g) = 4.0*xi(2,g)*s;
587 Nx(0,0,g) = 4.0*xi(0,g) - 1.0;
592 Nx(1,1,g) = 4.0*xi(1,g) - 1.0;
597 Nx(2,2,g) = 4.0*xi(2,g) - 1.0;
599 Nx(0,3,g) = 1.0 - 4.0*s;
600 Nx(1,3,g) = 1.0 - 4.0*s;
601 Nx(2,3,g) = 1.0 - 4.0*s;
603 Nx(0,4,g) = 4.0*xi(1,g);
604 Nx(1,4,g) = 4.0*xi(0,g);
608 Nx(1,5,g) = 4.0*xi(2,g);
609 Nx(2,5,g) = 4.0*xi(1,g);
611 Nx(0,6,g) = 4.0*xi(2,g);
613 Nx(2,6,g) = 4.0*xi(0,g);
615 Nx(0,7,g) = 4.0*( s - xi(0,g));
616 Nx(1,7,g) = -4.0*xi(0,g);
617 Nx(2,7,g) = -4.0*xi(0,g);
619 Nx(0,8,g) = -4.0*xi(1,g);
620 Nx(1,8,g) = 4.0*( s - xi(1,g));
621 Nx(2,8,g) = -4.0*xi(1,g);
623 Nx(0,9,g) = -4.0*xi(2,g);
624 Nx(1,9,g) = -4.0*xi(2,g);
625 Nx(2,9,g) = 4.0*( s - xi(2,g));
629 {ElementType::TRI3, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
635 N(2,g) = 1.0 - xi(0,g) - xi(1,g);
646 {ElementType::TRI6, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
649 double s = 1.0 - xi(0,g) - xi(1,g);
650 N(0,g) = xi(0,g) * (2.0*xi(0,g) - 1.0);
651 N(1,g) = xi(1,g) * (2.0*xi(1,g) - 1.0);
652 N(2,g) = s * (2.0*s - 1.0);
653 N(3,g) = 4.0*xi(0,g)*xi(1,g);
654 N(4,g) = 4.0*xi(1,g)*s;
655 N(5,g) = 4.0*xi(0,g)*s;
657 Nx(0,0,g) = 4.0*xi(0,g) - 1.0;
661 Nx(1,1,g) = 4.0*xi(1,g) - 1.0;
663 Nx(0,2,g) = 1.0 - 4.0*s;
664 Nx(1,2,g) = 1.0 - 4.0*s;
666 Nx(0,3,g) = 4.0*xi(1,g);
667 Nx(1,3,g) = 4.0*xi(0,g);
669 Nx(0,4,g) = -4.0*xi(1,g);
670 Nx(1,4,g) = 4.0*( s - xi(1,g) );
672 Nx(0,5,g) = 4.0*( s - xi(0,g) );
673 Nx(1,5,g) = -4.0*xi(0,g);
677 {ElementType::WDG, [](
const int insd,
const int eNoN,
const int g, Array<double>& xi, Array<double>& N,
682 double uz = 1.0 - ux - uy;
683 double s = (1.0 + xi(2,g))*0.5;
684 double t = (1.0 - xi(2,g))*0.5;
694 Nx(2,0,g) = -ux*0.50;
698 Nx(2,1,g) = -uy*0.50;
702 Nx(2,2,g) = -uz*0.50;
728using SetElementShapeMapType = std::map<ElementType, std::function<void(
int,
mshType&)>>;
730SetElementShapeMapType set_element_shape_data = {
732 {ElementType::HEX8, [](
int g,
mshType& mesh) ->
void {
734 double lx = 1.0 - xi(0,g);
735 double ly = 1.0 - xi(1,g);
736 double lz = 1.0 - xi(2,g);
737 double ux = 1.0 + xi(0,g);
738 double uy = 1.0 + xi(1,g);
739 double uz = 1.0 + xi(2,g);
742 N(0,g) = lx*ly*lz/8.0;
743 N(1,g) = ux*ly*lz/8.0;
744 N(2,g) = ux*uy*lz/8.0;
745 N(3,g) = lx*uy*lz/8.0;
746 N(4,g) = lx*ly*uz/8.0;
747 N(5,g) = ux*ly*uz/8.0;
748 N(6,g) = ux*uy*uz/8.0;
749 N(7,g) = lx*uy*uz/8.0;
752 Nx(0,0,g) = -ly*lz/8.0;
753 Nx(1,0,g) = -lx*lz/8.0;
754 Nx(2,0,g) = -lx*ly/8.0;
756 Nx(0,1,g) = ly*lz/8.0;
757 Nx(1,1,g) = -ux*lz/8.0;
758 Nx(2,1,g) = -ux*ly/8.0;
760 Nx(0,2,g) = uy*lz/8.0;
761 Nx(1,2,g) = ux*lz/8.0;
762 Nx(2,2,g) = -ux*uy/8.0;
764 Nx(0,3,g) = -uy*lz/8.0;
765 Nx(1,3,g) = lx*lz/8.0;
766 Nx(2,3,g) = -lx*uy/8.0;
768 Nx(0,4,g) = -ly*uz/8.0;
769 Nx(1,4,g) = -lx*uz/8.0;
770 Nx(2,4,g) = lx*ly/8.0;
772 Nx(0,5,g) = ly*uz/8.0;
773 Nx(1,5,g) = -ux*uz/8.0;
774 Nx(2,5,g) = ux*ly/8.0;
776 Nx(0,6,g) = uy*uz/8.0;
777 Nx(1,6,g) = ux*uz/8.0;
778 Nx(2,6,g) = ux*uy/8.0;
780 Nx(0,7,g) = -uy*uz/8.0;
781 Nx(1,7,g) = lx*uz/8.0;
782 Nx(2,7,g) = lx*uy/8.0;
786 {ElementType::HEX20, [](
int g,
mshType& mesh) ->
void {
789 double lx = 1.0 - xi(0,g);
790 double ly = 1.0 - xi(1,g);
791 double lz = 1.0 - xi(2,g);
792 double ux = 1.0 + xi(0,g);
793 double uy = 1.0 + xi(1,g);
794 double uz = 1.0 + xi(2,g);
801 N(0, g) = lx*ly*lz*(lx+ly+lz-5.0)/8.0;
802 N(1, g) = ux*ly*lz*(ux+ly+lz-5.0)/8.0;
803 N(2, g) = ux*uy*lz*(ux+uy+lz-5.0)/8.0;
804 N(3, g) = lx*uy*lz*(lx+uy+lz-5.0)/8.0;
805 N(4, g) = lx*ly*uz*(lx+ly+uz-5.0)/8.0;
806 N(5, g) = ux*ly*uz*(ux+ly+uz-5.0)/8.0;
807 N(6, g) = ux*uy*uz*(ux+uy+uz-5.0)/8.0;
808 N(7, g) = lx*uy*uz*(lx+uy+uz-5.0)/8.0;
809 N(8, g) = mx*ly*lz/4.0;
810 N(9, g) = ux*my*lz/4.0;
811 N(10, g) = mx*uy*lz/4.0;
812 N(11, g) = lx*my*lz/4.0;
813 N(12, g) = mx*ly*uz/4.0;
814 N(13, g) = ux*my*uz/4.0;
815 N(14, g) = mx*uy*uz/4.0;
816 N(15, g) = lx*my*uz/4.0;
817 N(16, g) = lx*ly*mz/4.0;
818 N(17, g) = ux*ly*mz/4.0;
819 N(18, g) = ux*uy*mz/4.0;
820 N(19, g) = lx*uy*mz/4.0;
825 Nx(0,n,g) = -ly*lz*(lx+ly+lz-5.0+lx)/8.0;
826 Nx(1,n,g) = -lx*lz*(lx+ly+lz-5.0+ly)/8.0;
827 Nx(2,n,g) = -lx*ly*(lx+ly+lz-5.0+lz)/8.0;
831 Nx(0,n,g) = ly*lz*(ux+ly+lz-5.0+ux)/8.0;
832 Nx(1,n,g) = -ux*lz*(ux+ly+lz-5.0+ly)/8.0;
833 Nx(2,n,g) = -ux*ly*(ux+ly+lz-5.0+lz)/8.0;
837 Nx(0,n,g) = uy*lz*(ux+uy+lz-5.0+ux)/8.0;
838 Nx(1,n,g) = ux*lz*(ux+uy+lz-5.0+uy)/8.0;
839 Nx(2,n,g) = -ux*uy*(ux+uy+lz-5.0+lz)/8.0;
843 Nx(0,n,g) = -uy*lz*(lx+uy+lz-5.0+lx)/8.0;
844 Nx(1,n,g) = lx*lz*(lx+uy+lz-5.0+uy)/8.0;
845 Nx(2,n,g) = -lx*uy*(lx+uy+lz-5.0+lz)/8.0;
849 Nx(0,n,g) = -ly*uz*(lx+ly+uz-5.0+lx)/8.0;
850 Nx(1,n,g) = -lx*uz*(lx+ly+uz-5.0+ly)/8.0;
851 Nx(2,n,g) = lx*ly*(lx+ly+uz-5.0+uz)/8.0;
855 Nx(0,n,g) = ly*uz*(ux+ly+uz-5.0+ux)/8.0;
856 Nx(1,n,g) = -ux*uz*(ux+ly+uz-5.0+ly)/8.0;
857 Nx(2,n,g) = ux*ly*(ux+ly+uz-5.0+uz)/8.0;
861 Nx(0,n,g) = uy*uz*(ux+uy+uz-5.0+ux)/8.0;
862 Nx(1,n,g) = ux*uz*(ux+uy+uz-5.0+uy)/8.0;
863 Nx(2,n,g) = ux*uy*(ux+uy+uz-5.0+uz)/8.0;
867 Nx(0,n,g) = -uy*uz*(lx+uy+uz-5.0+lx)/8.0;
868 Nx(1,n,g) = lx*uz*(lx+uy+uz-5.0+uy)/8.0;
869 Nx(2,n,g) = lx*uy*(lx+uy+uz-5.0+uz)/8.0;
873 Nx(0,n,g) = (lx - ux)*ly*lz/4.0;
874 Nx(1,n,g) = -mx*lz/4.0;
875 Nx(2,n,g) = -mx*ly/4.0;
879 Nx(0,n,g) = my*lz/4.0;
880 Nx(1,n,g) = (ly - uy)*ux*lz/4.0;
881 Nx(2,n,g) = -ux*my/4.0;
885 Nx(0,n,g) = (lx - ux)*uy*lz/4.0;
886 Nx(1,n,g) = mx*lz/4.0;
887 Nx(2,n,g) = -mx*uy/4.0;
891 Nx(0,n,g) = -my*lz/4.0;
892 Nx(1,n,g) = (ly - uy)*lx*lz/4.0;
893 Nx(2,n,g) = -lx*my/4.0;
897 Nx(0,n,g) = (lx - ux)*ly*uz/4.0;
898 Nx(1,n,g) = -mx*uz/4.0;
899 Nx(2,n,g) = mx*ly/4.0;
903 Nx(0,n,g) = my*uz/4.0;
904 Nx(1,n,g) = (ly - uy)*ux*uz/4.0;
905 Nx(2,n,g) = ux*my/4.0;
909 Nx(0,n,g) = (lx - ux)*uy*uz/4.0;
910 Nx(1,n,g) = mx*uz/4.0;
911 Nx(2,n,g) = mx*uy/4.0;
915 Nx(0,n,g) = -my*uz/4.0;
916 Nx(1,n,g) = (ly - uy)*lx*uz/4.0;
917 Nx(2,n,g) = lx*my/4.0;
921 Nx(0,n,g) = -ly*mz/4.0;
922 Nx(1,n,g) = -lx*mz/4.0;
923 Nx(2,n,g) = (lz - uz)*lx*ly/4.0;
927 Nx(0,n,g) = ly*mz/4.0;
928 Nx(1,n,g) = -ux*mz/4.0;
929 Nx(2,n,g) = (lz - uz)*ux*ly/4.0;
933 Nx(0,n,g) = uy*mz/4.0;
934 Nx(1,n,g) = ux*mz/4.0;
935 Nx(2,n,g) = (lz - uz)*ux*uy/4.0;
939 Nx(0,n,g) = -uy*mz/4.0;
940 Nx(1,n,g) = lx*mz/4.0;
941 Nx(2,n,g) = (lz - uz)*lx*uy/4.0;
945 {ElementType::HEX27, [](
int g,
mshType& mesh) ->
void {
948 double lx = 1.0 - xi(0,g);
949 double ly = 1.0 - xi(1,g);
950 double lz = 1.0 - xi(2,g);
951 double ux = 1.0 + xi(0,g);
952 double uy = 1.0 + xi(1,g);
953 double uz = 1.0 + xi(2,g);
960 N(0,g) = -mx*lx*my*ly*mz*lz/8.0;
961 N(1,g) = mx*ux*my*ly*mz*lz/8.0;
962 N(2,g) = -mx*ux*my*uy*mz*lz/8.0;
963 N(3,g) = mx*lx*my*uy*mz*lz/8.0;
964 N(4,g) = mx*lx*my*ly*mz*uz/8.0;
965 N(5,g) = -mx*ux*my*ly*mz*uz/8.0;
966 N(6,g) = mx*ux*my*uy*mz*uz/8.0;
967 N(7,g) = -mx*lx*my*uy*mz*uz/8.0;
968 N(8,g) = lx*ux*my*ly*mz*lz/4.0;
969 N(9,g) = -mx*ux*ly*uy*mz*lz/4.0;
970 N(10,g) = -lx*ux*my*uy*mz*lz/4.0;
971 N(11,g) = mx*lx*ly*uy*mz*lz/4.0;
972 N(12,g) = -lx*ux*my*ly*mz*uz/4.0;
973 N(13,g) = mx*ux*ly*uy*mz*uz/4.0;
974 N(14,g) = lx*ux*my*uy*mz*uz/4.0;
975 N(15,g) = -mx*lx*ly*uy*mz*uz/4.0;
976 N(16,g) = mx*lx*my*ly*lz*uz/4.0;
977 N(17,g) = -mx*ux*my*ly*lz*uz/4.0;
978 N(18,g) = mx*ux*my*uy*lz*uz/4.0;
979 N(19,g) = -mx*lx*my*uy*lz*uz/4.0;
981 N(20,g) = -mx*lx*ly*uy*lz*uz/2.0;
982 N(21,g) = mx*ux*ly*uy*lz*uz/2.0;
983 N(22,g) = -lx*ux*my*ly*lz*uz/2.0;
984 N(23,g) = lx*ux*my*uy*lz*uz/2.0;
985 N(24,g) = -lx*ux*ly*uy*mz*lz/2.0;
986 N(25,g) = lx*ux*ly*uy*mz*uz/2.0;
988 N(26,g) = lx*ux*ly*uy*lz*uz;
992 Nxi(0,n,g) = -(lx - mx)*my*ly*mz*lz/8.0;
993 Nxi(1,n,g) = -(ly - my)*mx*lx*mz*lz/8.0;
994 Nxi(2,n,g) = -(lz - mz)*mx*lx*my*ly/8.0;
997 Nxi(0,n,g) = (mx + ux)*my*ly*mz*lz/8.0;
998 Nxi(1,n,g) = (ly - my)*mx*ux*mz*lz/8.0;
999 Nxi(2,n,g) = (lz - mz)*mx*ux*my*ly/8.0;
1002 Nxi(0,n,g) = -(mx + ux)*my*uy*mz*lz/8.0;
1003 Nxi(1,n,g) = -(my + uy)*mx*ux*mz*lz/8.0;
1004 Nxi(2,n,g) = -(lz - mz)*mx*ux*my*uy/8.0;
1007 Nxi(0,n,g) = (lx - mx)*my*uy*mz*lz/8.0;
1008 Nxi(1,n,g) = (my + uy)*mx*lx*mz*lz/8.0;
1009 Nxi(2,n,g) = (lz - mz)*mx*lx*my*uy/8.0;
1012 Nxi(0,n,g) = (lx - mx)*my*ly*mz*uz/8.0;
1013 Nxi(1,n,g) = (ly - my)*mx*lx*mz*uz/8.0;
1014 Nxi(2,n,g) = (mz + uz)*mx*lx*my*ly/8.0;
1017 Nxi(0,n,g) = -(mx + ux)*my*ly*mz*uz/8.0;
1018 Nxi(1,n,g) = -(ly - my)*mx*ux*mz*uz/8.0;
1019 Nxi(2,n,g) = -(mz + uz)*mx*ux*my*ly/8.0;
1022 Nxi(0,n,g) = (mx + ux)*my*uy*mz*uz/8.0;
1023 Nxi(1,n,g) = (my + uy)*mx*ux*mz*uz/8.0;
1024 Nxi(2,n,g) = (mz + uz)*mx*ux*my*uy/8.0;
1027 Nxi(0,n,g) = -(lx - mx)*my*uy*mz*uz/8.0;
1028 Nxi(1,n,g) = -(my + uy)*mx*lx*mz*uz/8.0;
1029 Nxi(2,n,g) = -(mz + uz)*mx*lx*my*uy/8.0;
1032 Nxi(0,n,g) = (lx - ux)*my*ly*mz*lz/4.0;
1033 Nxi(1,n,g) = (ly - my)*lx*ux*mz*lz/4.0;
1034 Nxi(2,n,g) = (lz - mz)*lx*ux*my*ly/4.0;
1037 Nxi(0,n,g) = -(mx + ux)*ly*uy*mz*lz/4.0;
1038 Nxi(1,n,g) = -(ly - uy)*mx*ux*mz*lz/4.0;
1039 Nxi(2,n,g) = -(lz - mz)*mx*ux*ly*uy/4.0;
1042 Nxi(0,n,g) = -(lx - ux)*my*uy*mz*lz/4.0;
1043 Nxi(1,n,g) = -(my + uy)*lx*ux*mz*lz/4.0;
1044 Nxi(2,n,g) = -(lz - mz)*lx*ux*my*uy/4.0;
1047 Nxi(0,n,g) = (lx - mx)*ly*uy*mz*lz/4.0;
1048 Nxi(1,n,g) = (ly - uy)*mx*lx*mz*lz/4.0;
1049 Nxi(2,n,g) = (lz - mz)*mx*lx*ly*uy/4.0;
1052 Nxi(0,n,g) = -(lx - ux)*my*ly*mz*uz/4.0;
1053 Nxi(1,n,g) = -(ly - my)*lx*ux*mz*uz/4.0;
1054 Nxi(2,n,g) = -(mz + uz)*lx*ux*my*ly/4.0;
1057 Nxi(0,n,g) = (mx + ux)*ly*uy*mz*uz/4.0;
1058 Nxi(1,n,g) = (ly - uy)*mx*ux*mz*uz/4.0;
1059 Nxi(2,n,g) = (mz + uz)*mx*ux*ly*uy/4.0;
1062 Nxi(0,n,g) = (lx - ux)*my*uy*mz*uz/4.0;
1063 Nxi(1,n,g) = (my + uy)*lx*ux*mz*uz/4.0;
1064 Nxi(2,n,g) = (mz + uz)*lx*ux*my*uy/4.0;
1067 Nxi(0,n,g) = -(lx - mx)*ly*uy*mz*uz/4.0;
1068 Nxi(1,n,g) = -(ly - uy)*mx*lx*mz*uz/4.0;
1069 Nxi(2,n,g) = -(mz + uz)*mx*lx*ly*uy/4.0;
1072 Nxi(0,n,g) = (lx - mx)*my*ly*lz*uz/4.0;
1073 Nxi(1,n,g) = (ly - my)*mx*lx*lz*uz/4.0;
1074 Nxi(2,n,g) = (lz - uz)*mx*lx*my*ly/4.0;
1077 Nxi(0,n,g) = -(mx + ux)*my*ly*lz*uz/4.0;
1078 Nxi(1,n,g) = -(ly - my)*mx*ux*lz*uz/4.0;
1079 Nxi(2,n,g) = -(lz - uz)*mx*ux*my*ly/4.0;
1082 Nxi(0,n,g) = (mx + ux)*my*uy*lz*uz/4.0;
1083 Nxi(1,n,g) = (my + uy)*mx*ux*lz*uz/4.0;
1084 Nxi(2,n,g) = (lz - uz)*mx*ux*my*uy/4.0;
1087 Nxi(0,n,g) = -(lx - mx)*my*uy*lz*uz/4.0;
1088 Nxi(1,n,g) = -(my + uy)*mx*lx*lz*uz/4.0;
1089 Nxi(2,n,g) = -(lz - uz)*mx*lx*my*uy/4.0;
1092 Nxi(0,n,g) = -(lx - mx)*ly*uy*lz*uz/2.0;
1093 Nxi(1,n,g) = -(ly - uy)*mx*lx*lz*uz/2.0;
1094 Nxi(2,n,g) = -(lz - uz)*mx*lx*ly*uy/2.0;
1097 Nxi(0,n,g) = (mx + ux)*ly*uy*lz*uz/2.0;
1098 Nxi(1,n,g) = (ly - uy)*mx*ux*lz*uz/2.0;
1099 Nxi(2,n,g) = (lz - uz)*mx*ux*ly*uy/2.0;
1102 Nxi(0,n,g) = -(lx - ux)*my*ly*lz*uz/2.0;
1103 Nxi(1,n,g) = -(ly - my)*lx*ux*lz*uz/2.0;
1104 Nxi(2,n,g) = -(lz - uz)*lx*ux*my*ly/2.0;
1107 Nxi(0,n,g) = (lx - ux)*my*uy*lz*uz/2.0;
1108 Nxi(1,n,g) = (my + uy)*lx*ux*lz*uz/2.0;
1109 Nxi(2,n,g) = (lz - uz)*lx*ux*my*uy/2.0;
1112 Nxi(0,n,g) = -(lx - ux)*ly*uy*mz*lz/2.0;
1113 Nxi(1,n,g) = -(ly - uy)*lx*ux*mz*lz/2.0;
1114 Nxi(2,n,g) = -(lz - mz)*lx*ux*ly*uy/2.0;
1117 Nxi(0,n,g) = (lx - ux)*ly*uy*mz*uz/2.0;
1118 Nxi(1,n,g) = (ly - uy)*lx*ux*mz*uz/2.0;
1119 Nxi(2,n,g) = (mz + uz)*lx*ux*ly*uy/2.0;
1122 Nxi(0,n,g) = (lx - ux)*ly*uy*lz*uz;
1123 Nxi(1,n,g) = (ly - uy)*lx*ux*lz*uz;
1124 Nxi(2,n,g) = (lz - uz)*lx*ux*ly*uy;
1128 {ElementType::LIN1, [](
int g,
mshType& mesh) ->
void {
1134 N(0,g) = (1.0 - xi(0,g))*0.5;
1135 N(1,g) = (1.0 + xi(0,g))*0.5;
1143 {ElementType::LIN2, [](
int g,
mshType& mesh) ->
void {
1146 N(0,g) = -xi(0,g)*(1.0 - xi(0,g))*0.50;
1147 N(1,g) = xi(0,g)*(1.0 + xi(0,g))*0.50;
1148 N(2,g) = (1.0 - xi(0,g))*(1.0 + xi(0,g));
1151 Nx(0,0,g) = -0.50 + xi(0,g);
1152 Nx(0,1,g) = 0.50 + xi(0,g);
1153 Nx(0,2,g) = -2.0*xi(0,g);
1157 {ElementType::QUD4, [](
int g,
mshType& mesh) ->
void {
1159 double lx = 1.0 - xi(0,g);
1160 double ly = 1.0 - xi(1,g);
1161 double ux = 1.0 + xi(0,g);
1162 double uy = 1.0 + xi(1,g);
1165 N(0,g) = lx*ly / 4.0;
1166 N(1,g) = ux*ly / 4.0;
1167 N(2,g) = ux*uy / 4.0;
1168 N(3,g) = lx*uy / 4.0;
1171 Nx(0,0,g) = -ly / 4.0;
1172 Nx(1,0,g) = -lx / 4.0;
1173 Nx(0,1,g) = ly / 4.0;
1174 Nx(1,1,g) = -ux / 4.0;
1175 Nx(0,2,g) = uy / 4.0;
1176 Nx(1,2,g) = ux / 4.0;
1177 Nx(0,3,g) = -uy / 4.0;
1178 Nx(1,3,g) = lx / 4.0;
1182 {ElementType::QUD9, [](
int g,
mshType& mesh) ->
void {
1184 double lx = 1.0 - xi(0,g);
1185 double ly = 1.0 - xi(1,g);
1186 double ux = 1.0 + xi(0,g);
1187 double uy = 1.0 + xi(1,g);
1188 double mx = xi(0,g);
1189 double my = xi(1,g);
1192 N(0,g) = mx*lx*my*ly/4.0;
1193 N(1,g) = -mx*ux*my*ly/4.0;
1194 N(2,g) = mx*ux*my*uy/4.0;
1195 N(3,g) = -mx*lx*my*uy/4.0;
1196 N(4,g) = -lx*ux*my*ly*0.50;
1197 N(5,g) = mx*ux*ly*uy*0.50;
1198 N(6,g) = lx*ux*my*uy*0.50;
1199 N(7,g) = -mx*lx*ly*uy*0.50;
1200 N(8,g) = lx*ux*ly*uy;
1203 Nx(0,0,g) = (lx - mx)*my*ly/4.0;
1204 Nx(1,0,g) = (ly - my)*mx*lx/4.0;
1206 Nx(0,1,g) = -(ux + mx)*my*ly/4.0;
1207 Nx(1,1,g) = -(ly - my)*mx*ux/4.0;
1209 Nx(0,2,g) = (ux + mx)*my*uy/4.0;
1210 Nx(1,2,g) = (uy + my)*mx*ux/4.0;
1212 Nx(0,3,g) = -(lx - mx)*my*uy/4.0;
1213 Nx(1,3,g) = -(uy + my)*mx*lx/4.0;
1215 Nx(0,4,g) = -(lx - ux)*my*ly*0.50;
1216 Nx(1,4,g) = -(ly - my)*lx*ux*0.50;
1218 Nx(0,5,g) = (ux + mx)*ly*uy*0.50;
1219 Nx(1,5,g) = (ly - uy)*mx*ux*0.50;
1221 Nx(0,6,g) = (lx - ux)*my*uy*0.50;
1222 Nx(1,6,g) = (uy + my)*lx*ux*0.50;
1224 Nx(0,7,g) = -(lx - mx)*ly*uy*0.50;
1225 Nx(1,7,g) = -(ly - uy)*mx*lx*0.50;
1227 Nx(0,8,g) = (lx - ux)*ly*uy;
1228 Nx(1,8,g) = (ly - uy)*lx*ux;
1232 {ElementType::TET4, [](
int g,
mshType& mesh) ->
void {
1238 N(3,g) = 1.0 - xi(0,g) - xi(1,g) - xi(2,g);
1256 {ElementType::TET10, [](
int g,
mshType& mesh) ->
void {
1259 double s = 1.0 - xi(0,g) - xi(1,g) - xi(2,g);
1260 N(0,g) = xi(0,g)*(2.0*xi(0,g) - 1.0);
1261 N(1,g) = xi(1,g)*(2.0*xi(1,g) - 1.0);
1262 N(2,g) = xi(2,g)*(2.0*xi(2,g) - 1.0);
1263 N(3,g) = s *(2.0*s - 1.0);
1264 N(4,g) = 4.0*xi(0,g)*xi(1,g);
1265 N(5,g) = 4.0*xi(1,g)*xi(2,g);
1266 N(6,g) = 4.0*xi(0,g)*xi(2,g);
1267 N(7,g) = 4.0*xi(0,g)*s;
1268 N(8,g) = 4.0*xi(1,g)*s;
1269 N(9,g) = 4.0*xi(2,g)*s;
1272 Nx(0,0,g) = 4.0*xi(0,g) - 1.0;
1277 Nx(1,1,g) = 4.0*xi(1,g) - 1.0;
1282 Nx(2,2,g) = 4.0*xi(2,g) - 1.0;
1284 Nx(0,3,g) = 1.0 - 4.0*s;
1285 Nx(1,3,g) = 1.0 - 4.0*s;
1286 Nx(2,3,g) = 1.0 - 4.0*s;
1288 Nx(0,4,g) = 4.0*xi(1,g);
1289 Nx(1,4,g) = 4.0*xi(0,g);
1293 Nx(1,5,g) = 4.0*xi(2,g);
1294 Nx(2,5,g) = 4.0*xi(1,g);
1296 Nx(0,6,g) = 4.0*xi(2,g);
1298 Nx(2,6,g) = 4.0*xi(0,g);
1300 Nx(0,7,g) = 4.0*( s - xi(0,g));
1301 Nx(1,7,g) = -4.0*xi(0,g);
1302 Nx(2,7,g) = -4.0*xi(0,g);
1304 Nx(0,8,g) = -4.0*xi(1,g);
1305 Nx(1,8,g) = 4.0*( s - xi(1,g));
1306 Nx(2,8,g) = -4.0*xi(1,g);
1308 Nx(0,9,g) = -4.0*xi(2,g);
1309 Nx(1,9,g) = -4.0*xi(2,g);
1310 Nx(2,9,g) = 4.0*( s - xi(2,g));
1314 {ElementType::TRI3, [](
int g,
mshType& mesh) ->
void {
1319 N(2,g) = 1.0 - xi(0,g) - xi(1,g);
1321 auto& Nxi = mesh.Nx;
1331 {ElementType::TRI6, [](
int g,
mshType& mesh) ->
void {
1335 double s = 1.0 - xi(0,g) - xi(1,g);
1336 N(0,g) = xi(0,g)*( 2.0*xi(0,g) - 1.0 );
1337 N(1,g) = xi(1,g)*( 2.0*xi(1,g) - 1.0 );
1338 N(2,g) = s *( 2.0*s - 1.0 );
1339 N(3,g) = 4.0*xi(0,g)*xi(1,g);
1340 N(4,g) = 4.0*xi(1,g)*s;
1341 N(5,g) = 4.0*xi(0,g)*s;
1343 auto& Nxi = mesh.Nx;
1344 Nxi(0,0,g) = 4.0*xi(0,g) - 1.0;
1347 Nxi(1,1,g) = 4.0*xi(1,g) - 1.0;
1348 Nxi(0,2,g) = 1.0 - 4.0*s;
1349 Nxi(1,2,g) = 1.0 - 4.0*s;
1350 Nxi(0,3,g) = 4.0*xi(1,g);
1351 Nxi(1,3,g) = 4.0*xi(0,g);
1352 Nxi(0,4,g) = -4.0*xi(1,g);
1353 Nxi(1,4,g) = 4.0*( s - xi(1,g) );
1354 Nxi(0,5,g) = 4.0*( s - xi(0,g) );
1355 Nxi(1,5,g) = -4.0*xi(0,g);
1359 {ElementType::WDG, [](
int g,
mshType& mesh) ->
void
1363 double ux = xi(0,g);
1364 double uy = xi(1,g);
1365 double uz = 1.0 - ux - uy;
1366 double s = (1.0 + xi(2,g))*0.5;
1367 double t = (1.0 - xi(2,g))*0.5;
1375 auto& Nxi = mesh.Nx;
1378 Nxi(2,0,g) = -ux*0.50;
1382 Nxi(2,1,g) = -uy*0.50;
1386 Nxi(2,2,g) = -uz*0.50;
1390 Nxi(2,3,g) = ux*0.50;
1394 Nxi(2,4,g) = uy*0.50;
1398 Nxi(2,5,g) = uz*0.50;
1411using SetFaceShapeMapType = std::map<ElementType, std::function<void(
int,
faceType&)>>;
1413SetFaceShapeMapType set_face_shape_data = {
1415 {ElementType::PNT, [](
int g,
faceType& face) ->
void
1421 {ElementType::QUD8, [](
int g,
faceType& face) ->
void
1424 double lx = 1.0 - xi(0,g);
1425 double ly = 1.0 - xi(1,g);
1426 double ux = 1.0 + xi(0,g);
1427 double uy = 1.0 + xi(1,g);
1432 N(0,g) = lx*ly*(lx+ly-3.0)/4.0;
1433 N(1,g) = ux*ly*(ux+ly-3.0)/4.0;
1434 N(2,g) = ux*uy*(ux+uy-3.0)/4.0;
1435 N(3,g) = lx*uy*(lx+uy-3.0)/4.0;
1436 N(4,g) = mx*ly*0.50;
1437 N(5,g) = ux*my*0.50;
1438 N(6,g) = mx*uy*0.50;
1439 N(7,g) = lx*my*0.50;
1441 auto& Nxi = face.Nx;
1442 Nxi(0,0,g) = -ly*(lx+ly-3.0+lx)/4.0;
1443 Nxi(1,0,g) = -lx*(lx+ly-3.0+ly)/4.0;
1445 Nxi(0,1,g) = ly*(ux+ly-3.0+ux)/4.0;
1446 Nxi(1,1,g) = -ux*(ux+ly-3.0+ly)/4.0;
1448 Nxi(0,2,g) = uy*(ux+uy-3.0+ux)/4.0;
1449 Nxi(1,2,g) = ux*(ux+uy-3.0+uy)/4.0;
1451 Nxi(0,3,g) = -uy*(lx+uy-3.0+lx)/4.0;
1452 Nxi(1,3,g) = lx*(lx+uy-3.0+uy)/4.0;
1454 Nxi(0,4,g) = (lx - ux)*ly*0.50;
1455 Nxi(1,4,g) = -mx*0.50;
1457 Nxi(0,5,g) = my*0.50;
1458 Nxi(1,5,g) = (ly - uy)*ux*0.50;
1460 Nxi(0,6,g) = (lx - ux)*uy*0.50;
1461 Nxi(1,6,g) = mx*0.50;
1463 Nxi(0,7,g) = -my*0.50;
1464 Nxi(1,7,g) = (ly - uy)*lx*0.50;
1468 {ElementType::QUD9, [](
int g,
faceType& face) ->
void
1471 double lx = 1.0 - xi(0,g);
1472 double ly = 1.0 - xi(1,g);
1473 double ux = 1.0 + xi(0,g);
1474 double uy = 1.0 + xi(1,g);
1475 double mx = xi(0,g);
1476 double my = xi(1,g);
1479 N(0,g) = mx*lx*my*ly/4.0;
1480 N(1,g) = -mx*ux*my*ly/4.0;
1481 N(2,g) = mx*ux*my*uy/4.0;
1482 N(3,g) = -mx*lx*my*uy/4.0;
1483 N(4,g) = -lx*ux*my*ly*0.50;
1484 N(5,g) = mx*ux*ly*uy*0.50;
1485 N(6,g) = lx*ux*my*uy*0.50;
1486 N(7,g) = -mx*lx*ly*uy*0.50;
1487 N(8,g) = lx*ux*ly*uy;
1490 Nx(0,0,g) = (lx - mx)*my*ly/4.0;
1491 Nx(1,0,g) = (ly - my)*mx*lx/4.0;
1492 Nx(0,1,g) = -(ux + mx)*my*ly/4.0;
1493 Nx(1,1,g) = -(ly - my)*mx*ux/4.0;
1494 Nx(0,2,g) = (ux + mx)*my*uy/4.0;
1495 Nx(1,2,g) = (uy + my)*mx*ux/4.0;
1496 Nx(0,3,g) = -(lx - mx)*my*uy/4.0;
1497 Nx(1,3,g) = -(uy + my)*mx*lx/4.0;
1498 Nx(0,4,g) = -(lx - ux)*my*ly*0.50;
1499 Nx(1,4,g) = -(ly - my)*lx*ux*0.50;
1500 Nx(0,5,g) = (ux + mx)*ly*uy*0.50;
1501 Nx(1,5,g) = (ly - uy)*mx*ux*0.50;
1502 Nx(0,6,g) = (lx - ux)*my*uy*0.50;
1503 Nx(1,6,g) = (uy + my)*lx*ux*0.50;
1504 Nx(0,7,g) = -(lx - mx)*ly*uy*0.50;
1505 Nx(1,7,g) = -(ly - uy)*mx*lx*0.50;
1506 Nx(0,8,g) = (lx - ux)*ly*uy;
1507 Nx(1,8,g) = (ly - uy)*lx*ux;
1511 {ElementType::LIN1, [](
int g,
faceType& face) ->
void
1513 face.N(0,g) = 0.5 * (1.0 - face.xi(0,g));
1514 face.N(1,g) = 0.5 * (1.0 + face.xi(0,g));
1516 face.Nx(0,0,g) = -0.5;
1517 face.Nx(0,1,g) = 0.5;
1521 {ElementType::LIN2, [](
int g,
faceType& face) ->
void
1525 N(0,g) = -xi(0,g)*(1.0 - xi(0,g))*0.50;
1526 N(1,g) = xi(0,g)*(1.0 + xi(0,g))*0.50;
1527 N(2,g) = (1.0 - xi(0,g))*(1.0 + xi(0,g));
1530 Nx(0,0,g) = -0.50 + xi(0,g);
1531 Nx(0,1,g) = 0.50 + xi(0,g);
1532 Nx(0,2,g) = -2.0*xi(0,g);
1536 {ElementType::QUD4, [](
int g,
faceType& face) ->
void {
1538 double lx = 1.0 - xi(0,g);
1539 double ly = 1.0 - xi(1,g);
1540 double ux = 1.0 + xi(0,g);
1541 double uy = 1.0 + xi(1,g);
1544 N(0,g) = lx*ly / 4.0;
1545 N(1,g) = ux*ly / 4.0;
1546 N(2,g) = ux*uy / 4.0;
1547 N(3,g) = lx*uy / 4.0;
1550 Nx(0,0,g) = -ly / 4.0;
1551 Nx(1,0,g) = -lx / 4.0;
1552 Nx(0,1,g) = ly / 4.0;
1553 Nx(1,1,g) = -ux / 4.0;
1554 Nx(0,2,g) = uy / 4.0;
1555 Nx(1,2,g) = ux / 4.0;
1556 Nx(0,3,g) = -uy / 4.0;
1557 Nx(1,3,g) = lx / 4.0;
1561 {ElementType::TRI3, [](
int g,
faceType& face) ->
void
1563 face.N(0,g) = face.xi(0,g);
1564 face.N(1,g) = face.xi(1,g);
1565 face.N(2,g) = 1.0 - face.xi(0,g) - face.xi(1,g);
1567 face.Nx(0,0,g) = 1.0;
1568 face.Nx(1,0,g) = 0.0;
1570 face.Nx(0,1,g) = 0.0;
1571 face.Nx(1,1,g) = 1.0;
1573 face.Nx(0,2,g) = -1.0;
1574 face.Nx(1,2,g) = -1.0;
1578 {ElementType::TRI6, [](
int g,
faceType& face) ->
void
1583 double s = 1.0 - xi(0,g) - xi(1,g);
1584 N(0,g) = xi(0,g)*( 2.0*xi(0,g) - 1.0 );
1585 N(1,g) = xi(1,g)*( 2.0*xi(1,g) - 1.0 );
1586 N(2,g) = s *( 2.0*s - 1.0 );
1587 N(3,g) = 4.0*xi(0,g)*xi(1,g);
1588 N(4,g) = 4.0*xi(1,g)*s;
1589 N(5,g) = 4.0*xi(0,g)*s;
1591 auto& Nxi = face.Nx;
1592 Nxi(0,0,g) = 4.0*xi(0,g) - 1.0;
1596 Nxi(1,1,g) = 4.0*xi(1,g) - 1.0;
1598 Nxi(0,2,g) = 1.0 - 4.0*s;
1599 Nxi(1,2,g) = 1.0 - 4.0*s;
1601 Nxi(0,3,g) = 4.0*xi(1,g);
1602 Nxi(1,3,g) = 4.0*xi(0,g);
1604 Nxi(0,4,g) = -4.0*xi(1,g);
1605 Nxi(1,4,g) = 4.0*( s - xi(1,g) );
1607 Nxi(0,5,g) = 4.0*( s - xi(0,g) );
1608 Nxi(1,5,g) = -4.0*xi(0,g);
The Array3 template class implements a simple interface to 3D arrays.
Definition Array3.h:52
The face type containing mesh at boundary.
Definition ComMod.h:521
This is the container for a mesh or NURBS patch, those specific to NURBS are noted.
Definition ComMod.h:832