FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
standard_hexa.cpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#include <kernel/geometry/test_aux/standard_hexa.hpp>
7#include <kernel/geometry/test_aux/copy_comp_set.hpp>
8
9namespace FEAT
10{
11 namespace Geometry
12 {
13 namespace TestAux
14 {
15 HexaMesh* create_hexa_mesh_3d(int orientation)
16 {
17 Index num_entities[] =
18 {
19 8, // vertices
20 12, // edges
21 6, // quads
22 1 // cubes
23 };
24
25 // create mesh
26 HexaMesh* mesh = new HexaMesh(num_entities);
27
29
30 // v_6__________e_3___>_____v_7
31 // /| /|
32 // e_6^ | q_1 e_7^ |
33 // /__|________>__________/ |
34 // v_4| | e_2 v_5| |
35 // | | | |
36 // | |e_10 q_3 |q |e_11
37 // | q ^ x |5 ^
38 // e_8| 4 | q_2 e_9| |
39 // ^ | ^ |
40 // | |v_2_______e_1__>___|__|v_3
41 // | / | /
42 // | ^e_4 q_0 | ^e_5
43 // |/___________>__________|/
44 // v_0 e_0 v_1
45 //
46 // orientation: v_0-v_1-v_2-v_3-v_4-v_5-v_6-v_7
47 // quad orientation:
48 // q_0 : v_0-v_1-v_2-v_3
49 // q_1 : v_4-v_5-v_6-v_7
50 // q_2 : v_0-v_1-v_4-v_5
51 // q_3 : v_2-v_3-v_6-v_7
52 // q_4 : v_0-v_2-v_4-v_6
53 // q_5 : v_1-v_3-v_5-v_7
54
55 // set up vertex coordinates array
56 static const Real vtx0[3*8] =
57 {
58 0.0, 0.0, 0.0,
59 1.0, 0.0, 0.0,
60 0.0, 1.0, 0.0,
61 1.0, 1.0, 0.0,
62 0.0, 0.0, 1.0,
63 1.0, 0.0, 1.0,
64 0.0, 1.0, 1.0,
65 1.0, 1.0, 1.0
66 };
67
68 // set up vertices-at-edge array
69 static const Index v_e0[12*2] =
70 {
71 0, 1,
72 2, 3,
73 4, 5,
74 6, 7,
75 0, 2,
76 1, 3,
77 4, 6,
78 5, 7,
79 0, 4,
80 1, 5,
81 2, 6,
82 3, 7
83 };
84
85 // set up vertices-at-quad array
86 static const Index v_q0[6*4] =
87 {
88 0, 1, 2, 3,
89 4, 5, 6, 7,
90 0, 1, 4, 5,
91 2, 3, 6, 7,
92 0, 2, 4, 6,
93 1, 3, 5, 7
94 };
95
96 // set up vertices-at-cube array
97 static const Index v_c0[1*8] =
98 {
99 0, 1, 2, 3, 4, 5, 6, 7
100 };
101
102 // set up edges-at-quad array
103 static const Index e_q0[6*4] =
104 {
105 0, 1, 4, 5,
106 2, 3, 6, 7,
107 0, 2, 8, 9,
108 1, 3, 10, 11,
109 4, 6, 8, 10,
110 5, 7, 9, 11
111 };
112
113 // set up edges-at-cube array
114 static const Index e_c0[1*12] =
115 {
116 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
117 };
118
119 // set up quad-at-cube array
120 static const Index q_c0[1*6] =
121 {
122 0, 1, 2, 3, 4, 5
123 };
124
126
127 // v_5__________e_7__>______v_2
128 // /| /|
129 // e_6^ | q_2 e_4v |
130 // /__|________<__________/ |
131 // v_4| | e_5 v_1| |
132 // | | | |
133 // | |e_10 q_5 |q |e_9
134 // | q v x |1 |
135 // e_8| 3 | q_4 e_11| |
136 // v | v |
137 // | |v_3_______e_2__<___|__|v_7
138 // | / | /
139 // | ve_3 q_0 | ^e_1
140 // |/___________>__________|/
141 // v_0 e_0 v_6
142 //
143 // cube orientation: v_1-v_2-v_6-v_7-v_4-v_5-v_0-v_3
144 // quad orientation:
145 // q_0 : v_7-v_3-v_6-v_0
146 // q_1 : v_7-v_6-v_2-v_1
147 // q_2 : v_2-v_5-v_1-v_4
148 // q_3 : v_0-v_3-v_4-v_5
149 // q_4 : v_6-v_1-v_0-v_4
150 // q_5 : v_5-v_3-v_2-v_7
151
152 // set up vertex coordinates array
153 static const Real vtx1[3*8] =
154 {
155 0.0, 0.0, 0.0,
156 1.0, 0.0, 1.0,
157 1.0, 1.0, 1.0,
158 0.0, 1.0, 0.0,
159 0.0, 0.0, 1.0,
160 0.0, 1.0, 1.0,
161 1.0, 0.0, 0.0,
162 1.0, 1.0, 0.0,
163 };
164
165 // set up vertices-at-edge array
166 static const Index v_e1[12*2] =
167 {
168 0, 6,
169 6, 7,
170 7, 3,
171 3, 0,
172
173 2, 1,
174 1, 4,
175 4, 5,
176 5, 2,
177
178 4, 0,
179 2, 7,
180 5, 3,
181 1, 6
182 };
183
184 // set up vertices-at-quad array
185 static const Index v_q1[6*4] =
186 {
187 7, 3, 6, 0,
188 7, 6, 2, 1,
189 2, 5, 1, 4,
190 0, 3, 4, 5,
191 6, 1, 0, 4,
192 5, 3, 2, 7
193 };
194
195 // set up vertices-at-cube array
196 static const Index v_c1[1*8] =
197 {
198 1, 2, 6, 7, 4, 5, 0, 3
199 };
200
201 // set up edges-at-quad array
202 static const Index e_q1[6*4] =
203 {
204 2, 0, 1, 3,
205 1, 4, 9, 11,
206 7, 5, 4, 6,
207 3, 6, 8, 10,
208 11, 8, 0, 5,
209 10, 9, 7, 2
210 };
211
212 // set up edges-at-cube array
213 static const Index e_c1[1*12] =
214 {
215 4, 1, 6, 3, 11, 9, 8, 10, 5, 7, 0, 2
216 };
217
218 // set up quad-at-cube array
219 static const Index q_c1[1*6] =
220 {
221 1, 3, 2, 0, 4, 5
222 };
223
225
226 // v_6__________e_5__>______v_5
227 // /| /|
228 // e_8^ | q_5 e_10v |
229 // /__|________<__________/ |
230 // v_2| | e_3 v_3| |
231 // | | | |
232 // | |e_7 q_1 |q |e_6
233 // | q v x v2 |
234 // e_1| 3 | q_0 e_2| |
235 // v | v |
236 // | |v_4_______e_4__<___|__|v_1
237 // | / | /
238 // | ve_11 q_4 | ^e_9
239 // |/___________>__________|/
240 // v_0 e_0 v_7
241 //
242 // cube orientation: v_0-v_7-v_4-v_1-v_2-v_3-v_6-v_5
243 // quad orientation:
244 // q_0 : v_2-v_0-v_3-v_7
245 // q_1 : v_5-v_1-v_6-v_4
246 // q_2 : v_7-v_3-v_1-v_5
247 // q_3 : v_6-v_4-v_2-v_0
248 // q_4 : v_7-v_0-v_1-v_4
249 // q_5 : v_6-v_5-v_2-v_3
250
251 // set up vertex coordinates array
252 static const Real vtx2[3*8] =
253 {
254 0.0, 0.0, 0.0,
255 1.0, 1.0, 0.0,
256 0.0, 0.0, 1.0,
257 1.0, 0.0, 1.0,
258 0.0, 1.0, 0.0,
259 1.0, 1.0, 1.0,
260 0.0, 1.0, 1.0,
261 1.0, 0.0, 0.0,
262 };
263
264 // set up vertices-at-edge array
265 static const Index v_e2[12*2] =
266 {
267 0, 7,
268 2, 0,
269 3, 7,
270 3, 2,
271
272 4, 1,
273 5, 6,
274 1, 5,
275 4, 6,
276
277 6, 2,
278 1, 7,
279 3, 5,
280 0, 4
281 };
282
283 // set up vertices-at-quad array
284 static const Index v_q2[6*4] =
285 {
286 2, 0, 3, 7,
287 5, 1, 6, 4,
288 7, 3, 1, 5,
289 6, 4, 2, 0,
290 7, 0, 1, 4,
291 6, 5, 2, 3
292 };
293
294 // set up vertices-at-cube array
295 static const Index v_c2[1*8] =
296 {
297 0, 7, 4, 1, 2, 3, 6, 5
298 };
299
300 // set up edges-at-quad array
301 static const Index e_q2[6*4] =
302 {
303 1, 2, 3, 0,
304 6, 7, 5, 4,
305 2, 6, 9, 10,
306 7, 1, 8, 11,
307 0, 4, 9, 11,
308 5, 3, 8, 10
309 };
310
311 // set up edges-at-cube array
312 static const Index e_c2[1*12] =
313 {
314 0, 4, 3, 5, 11, 9, 8, 10, 1, 2, 7, 6
315 };
316
317 // set up quad-at-cube array
318 static const Index q_c2[1*6] =
319 {
320 4, 5, 0, 1, 3, 2
321 };
322
323 switch(orientation)
324 {
325 case 0:
326 copy_vtx(mesh->get_vertex_set(), vtx0);
327 copy_idx(mesh->get_index_set<1,0>(), v_e0);
328 copy_idx(mesh->get_index_set<2,0>(), v_q0);
329 copy_idx(mesh->get_index_set<3,0>(), v_c0);
330 copy_idx(mesh->get_index_set<2,1>(), e_q0);
331 copy_idx(mesh->get_index_set<3,1>(), e_c0);
332 copy_idx(mesh->get_index_set<3,2>(), q_c0);
333 break;
334 case 1:
335 copy_vtx(mesh->get_vertex_set(), vtx1);
336 copy_idx(mesh->get_index_set<1,0>(), v_e1);
337 copy_idx(mesh->get_index_set<2,0>(), v_q1);
338 copy_idx(mesh->get_index_set<3,0>(), v_c1);
339 copy_idx(mesh->get_index_set<2,1>(), e_q1);
340 copy_idx(mesh->get_index_set<3,1>(), e_c1);
341 copy_idx(mesh->get_index_set<3,2>(), q_c1);
342 break;
343 case 2:
344 copy_vtx(mesh->get_vertex_set(), vtx2);
345 copy_idx(mesh->get_index_set<1,0>(), v_e2);
346 copy_idx(mesh->get_index_set<2,0>(), v_q2);
347 copy_idx(mesh->get_index_set<3,0>(), v_c2);
348 copy_idx(mesh->get_index_set<2,1>(), e_q2);
349 copy_idx(mesh->get_index_set<3,1>(), e_c2);
350 copy_idx(mesh->get_index_set<3,2>(), q_c2);
351 break;
352 default:
353 XABORTM("Unhandled orientation " + stringify(orientation));
354 }
355 // okay
356 return mesh;
357 } // create_hexa_mesh_3d
358
359 void validate_refined_hexa_mesh_3d(const HexaMesh& mesh, int orientation)
360 {
361 // validate sizes
362 if(mesh.get_num_entities(0) != 27)
363 throw String("Vertex count mismatch");
364 if(mesh.get_num_entities(1) != 54)
365 throw String("Edge count mismatch");
366 if(mesh.get_num_entities(2) != 36)
367 throw String("Quad count mismatch");
368 if(mesh.get_num_entities(3) != 8)
369 throw String("Cube count mismatch");
370
372
373 // v_6__________e_3___>_____v_7
374 // /| /|
375 // e_6^ | q_1 e_7^ |
376 // /__|________>__________/ |
377 // v_4| | e_2 v_5| |
378 // | | | |
379 // | |e_10 q_3 |q |e_11
380 // | q ^ x |5 ^
381 // e_8| 4 | q_2 e_9| |
382 // ^ | ^ |
383 // | |v_2_______e_1__>___|__|v_3
384 // | / | /
385 // | ^e_4 q_0 | ^e_5
386 // |/___________>__________|/
387 // v_0 e_0 v_1
388 //
389 // orientation: v_0-v_1-v_2-v_3-v_4-v_5-v_6-v_7
390 // quad orientation:
391 // q_0 : v_0-v_1-v_2-v_3
392 // q_1 : v_5-v_6-v_7-v_8
393 // q_2 : v_1-v_2-v_5-v_6
394 // q_3 : v_3-v_4-v_7-v_8
395 // q_4 : v_1-v_3-v_5-v_7
396 // q_5 : v_2-v_4-v_6-v_8
397
398
399 // vertex coordinates array
400 static const Real vtx0[] =
401 {
402 0.0, 0.0, 0.0,
403 1.0, 0.0, 0.0,
404 0.0, 1.0, 0.0,
405 1.0, 1.0, 0.0,
406 0.0, 0.0, 1.0,
407 1.0, 0.0, 1.0,
408 0.0, 1.0, 1.0,
409 1.0, 1.0, 1.0,
410
411 0.5, 0.0, 0.0,
412 0.5, 1.0, 0.0,
413 0.5, 0.0, 1.0,
414 0.5, 1.0, 1.0,
415 0.0, 0.5, 0.0,
416 1.0, 0.5, 0.0,
417 0.0, 0.5, 1.0,
418 1.0, 0.5, 1.0,
419 0.0, 0.0, 0.5,
420 1.0, 0.0, 0.5,
421 0.0, 1.0, 0.5,
422 1.0, 1.0, 0.5,
423
424 0.5, 0.5, 0.0,
425 0.5, 0.5, 1.0,
426 0.5, 0.0, 0.5,
427 0.5, 1.0, 0.5,
428 0.0, 0.5, 0.5,
429 1.0, 0.5, 0.5,
430
431 0.5, 0.5, 0.5
432 };
433
434 // vertices-at-edge array
435 static const Index v_e0[] =
436 {
437 0, 8,
438 8, 1,
439 2, 9,
440 9, 3,
441 4, 10,
442 10, 5,
443 6, 11,
444 11, 7,
445 0, 12,
446 12, 2,
447 1, 13,
448 13, 3,
449 4, 14,
450 14, 6,
451 5, 15,
452 15, 7,
453 0, 16,
454 16, 4,
455 1, 17,
456 17, 5,
457 2, 18,
458 18, 6,
459 3, 19,
460 19, 7,
461
462 8, 20,
463 20, 9,
464 12, 20,
465 20, 13,
466 10, 21,
467 21, 11,
468 14, 21,
469 21, 15,
470 8, 22,
471 22, 10,
472 16, 22,
473 22, 17,
474 9, 23,
475 23, 11,
476 18, 23,
477 23, 19,
478 12, 24,
479 24, 14,
480 16, 24,
481 24, 18,
482 13, 25,
483 25, 15,
484 17, 25,
485 25, 19,
486
487 20, 26,
488 26, 21,
489 22, 26,
490 26, 23,
491 24, 26,
492 26, 25
493 };
494
495 // vertices-at-quad
496 static const Index v_q0[] =
497 {
498 0, 8, 12, 20,
499 8, 1, 20, 13,
500 12, 20, 2, 9,
501 20, 13, 9, 3,
502 4, 10, 14, 21,
503 10, 5, 21, 15,
504 14, 21, 6, 11,
505 21, 15, 11, 7,
506 0, 8, 16, 22,
507 8, 1, 22, 17,
508 16, 22, 4, 10,
509 22, 17, 10, 5,
510 2, 9, 18, 23,
511 9, 3, 23, 19,
512 18, 23, 6, 11,
513 23, 19, 11, 7,
514 0, 12, 16, 24,
515 12, 2, 24, 18,
516 16, 24, 4, 14,
517 24, 18, 14, 6,
518 1, 13, 17, 25,
519 13, 3, 25, 19,
520 17, 25, 5, 15,
521 25, 19, 15, 7,
522
523
524 8, 20, 22, 26,
525 20, 9, 26, 23,
526 22, 26, 10, 21,
527 26, 23, 21, 11,
528 12, 20, 24, 26,
529 20, 13, 26, 25,
530 24, 26, 14, 21,
531 26, 25, 21, 15,
532 16, 22, 24, 26,
533 22, 17, 26, 25,
534 24, 26, 18, 23,
535 26, 25, 23, 19
536 };
537
538 // vertices-at-cube
539 static const Index v_c0[] =
540 {
541 0, 8, 12, 20, 16, 22, 24, 26,
542 8, 1, 20, 13, 22, 17, 26, 25,
543 12, 20, 2, 9, 24, 26, 18, 23,
544 20, 13, 9, 3, 26, 25, 23, 19,
545 16, 22, 24, 26, 4, 10, 14, 21,
546 22, 17, 26, 25, 10, 5, 21, 15,
547 24, 26, 18, 23, 14, 21, 6, 11,
548 26, 25, 23, 19, 21, 15, 11, 7
549 };
550
551 // edges-at-quad
552 static const Index e_q0[] =
553 {
554 0, 26, 8, 24,
555 1, 27, 24, 10,
556 26, 2, 9, 25,
557 27, 3, 25, 11,
558
559 4, 30, 12, 28,
560 5, 31, 28, 14,
561 30, 6, 13, 29,
562 31, 7, 29, 15,
563
564 0, 34, 16, 32,
565 1, 35, 32, 18,
566 34, 4, 17, 33,
567 35, 5, 33, 19,
568
569 2, 38, 20, 36,
570 3, 39, 36, 22,
571 38, 6, 21, 37,
572 39, 7, 37, 23,
573
574 8, 42, 16, 40,
575 9, 43, 40, 20,
576 42, 12, 17, 41,
577 43, 13, 41, 21,
578
579 10, 46, 18, 44,
580 11, 47, 44, 22,
581 46, 14, 19, 45,
582 47, 15, 45, 23,
583
584 24, 50, 32, 48,
585 25, 51, 48, 36,
586 50, 28, 33, 49,
587 51, 29, 49, 37,
588
589 26, 52, 40, 48,
590 27, 53, 48, 44,
591 52, 30, 41, 49,
592 53, 31, 49, 45,
593
594 34, 52, 42, 50,
595 35, 53, 50, 46,
596 52, 38, 43, 51,
597 53, 39, 51, 47
598 };
599
600 // edges-at-cube
601 static const Index e_c0[] =
602 {
603 0, 26, 34, 52, 8, 24, 42, 50, 16, 32, 40, 48,
604 1, 27, 35, 53, 24, 10, 50, 46, 32, 18, 48, 44,
605 26, 2, 52, 38, 9, 25, 43, 51, 40, 48, 20, 36,
606 27, 3, 53, 39, 25, 11, 51, 47, 48, 44, 36, 22,
607 34, 52, 4, 30, 42, 50, 12, 28, 17, 33, 41, 49,
608 35, 53, 5, 31, 50, 46, 28, 14, 33, 19, 49, 45,
609 52, 38, 30, 6, 43, 51, 13, 29, 41, 49, 21, 37,
610 53, 39, 31, 7, 51, 47, 29, 15, 49, 45, 37, 23
611 };
612
613 // quad-at-cube
614 static const Index q_c0[] =
615 {
616 0, 32, 8, 28, 16, 24,
617 1, 33, 9, 29, 24, 20,
618 2, 34, 28, 12, 17, 25,
619 3, 35, 29, 13, 25, 21,
620 32, 4, 10, 30, 18, 26,
621 33, 5, 11, 31, 26, 22,
622 34, 6, 30, 14, 19, 27,
623 35, 7, 31, 15, 27, 23
624 };
625
627
628 // v_5__________e_7__>______v_2
629 // /| /|
630 // e_6^ | q_2 e_4v |
631 // /__|________<__________/ |
632 // v_4| | e_5 v_1| |
633 // | | | |
634 // | |e_10 q_5 |q |e_9
635 // | q v x |1 |
636 // e_8| 3 | q_4 e_11| |
637 // v | v |
638 // | |v_3_______e_2__<___|__|v_7
639 // | / | /
640 // | ve_3 q_0 | ^e_1
641 // |/___________>__________|/
642 // v_0 e_0 v_6
643 //
644 // cube orientation: v_1-v_2-v_6-v_7-v_4-v_5-v_0-v_3
645 // quad orientation:
646 // q_0 : v_7-v_3-v_6-v_0
647 // q_1 : v_7-v_6-v_2-v_1
648 // q_2 : v_2-v_5-v_1-v_4
649 // q_3 : v_0-v_3-v_4-v_5
650 // q_4 : v_6-v_1-v_0-v_4
651 // q_5 : v_5-v_3-v_2-v_7
652
653 // vertex coordinates array
654 static const Real vtx1[] =
655 {
656 0.0, 0.0, 0.0,
657 1.0, 0.0, 1.0,
658 1.0, 1.0, 1.0,
659 0.0, 1.0, 0.0,
660 0.0, 0.0, 1.0,
661 0.0, 1.0, 1.0,
662 1.0, 0.0, 0.0,
663 1.0, 1.0, 0.0,
664
665 0.5, 0.0, 0.0,
666 1.0, 0.5, 0.0,
667 0.5, 1.0, 0.0,
668 0.0, 0.5, 0.0,
669 1.0, 0.5, 1.0,
670 0.5, 0.0, 1.0,
671 0.0, 0.5, 1.0,
672 0.5, 1.0, 1.0,
673 0.0, 0.0, 0.5,
674 1.0, 1.0, 0.5,
675 0.0, 1.0, 0.5,
676 1.0, 0.0, 0.5,
677
678 0.5, 0.5, 0.0,
679 1.0, 0.5, 0.5,
680 0.5, 0.5, 1.0,
681 0.0, 0.5, 0.5,
682 0.5, 0.0, 0.5,
683 0.5, 1.0, 0.5,
684
685 0.5, 0.5, 0.5
686 };
687
688 // vertices-at-edge array
689 static const Index v_e1[] =
690 {
691 0, 8,
692 8, 6,
693 6, 9,
694 9, 7,
695 7, 10,
696 10, 3,
697 3, 11,
698 11, 0,
699 2, 12,
700 12, 1,
701 1, 13,
702 13, 4,
703 4, 14,
704 14, 5,
705 5, 15,
706 15, 2,
707 4, 16,
708 16, 0,
709 2, 17,
710 17, 7,
711 5, 18,
712 18, 3,
713 1, 19,
714 19, 6,
715
716 10, 20,
717 20, 8,
718 9, 20,
719 20, 11,
720 9, 21,
721 21, 12,
722 17, 21,
723 21, 19,
724 15, 22,
725 22, 13,
726 12, 22,
727 22, 14,
728 11, 23,
729 23, 14,
730 16, 23,
731 23, 18,
732 19, 24,
733 24, 16,
734 8, 24,
735 24, 13,
736 18, 25,
737 25, 17,
738 15, 25,
739 25, 10,
740
741 21, 26,
742 26, 23,
743 22, 26,
744 26, 20,
745 24, 26,
746 26, 25
747 };
748
749 // vertices-at-quad
750 static const Index v_q1[] =
751 {
752 7, 10, 9, 20,
753 10, 3, 20, 11,
754 9, 20, 6, 8,
755 20, 11, 8, 0,
756
757 7, 9, 17, 21,
758 9, 6, 21, 19,
759 17, 21, 2, 12,
760 21, 19, 12, 1,
761
762 2, 15, 12, 22,
763 15, 5, 22, 14,
764 12, 22, 1, 13,
765 22, 14, 13, 4,
766
767 0, 11, 16, 23,
768 11, 3, 23, 18,
769 16, 23, 4, 14,
770 23, 18, 14, 5,
771
772 6, 19, 8, 24,
773 19, 1, 24, 13,
774 8, 24, 0, 16,
775 24, 13, 16, 4,
776
777 5, 18, 15, 25,
778 18, 3, 25, 10,
779 15, 25, 2, 17,
780 25, 10, 17, 7,
781
782 12, 21, 22, 26,
783 21, 9, 26, 20,
784 22, 26, 14, 23,
785 26, 20, 23, 11,
786
787 19, 21, 24, 26,
788 21, 17, 26, 25,
789 24, 26, 16, 23,
790 26, 25, 23, 18,
791
792 13, 22, 24, 26,
793 22, 15, 26, 25,
794 24, 26, 8, 20,
795 26, 25, 20, 10
796 };
797
798 // vertices-at-cube
799 static const Index v_c1[] =
800 {
801 1, 12, 19, 21, 13, 22, 24, 26,
802 12, 2, 21, 17, 22, 15, 26, 25,
803 19, 21, 6, 9, 24, 26, 8, 20,
804 21, 17, 9, 7, 26, 25, 20, 10,
805 13, 22, 24, 26, 4, 14, 16, 23,
806 22, 15, 26, 25, 14, 5, 23, 18,
807 24, 26, 8, 20, 16, 23, 0, 11,
808 26, 25, 20, 10, 23, 18, 11, 3
809 };
810
811 // edges-at-quad
812 static const Index e_q1[] =
813 {
814 4, 26, 3, 24,
815 5, 27, 24, 6,
816 26, 1, 2, 25,
817 27, 0, 25, 7,
818
819 3, 30, 19, 28,
820 2, 31, 28, 23,
821 30, 8, 18, 29,
822 31, 9, 29, 22,
823
824 15, 34, 8, 32,
825 14, 35, 32, 13,
826 34, 10, 9, 33,
827 35, 11, 33, 12,
828
829 7, 38, 17, 36,
830 6, 39, 36, 21,
831 38, 12, 16, 37,
832 39, 13, 37, 20,
833
834 23, 42, 1, 40,
835 22, 43, 40, 10,
836 42, 17, 0, 41,
837 43, 16, 41, 11,
838
839 20, 46, 14, 44,
840 21, 47, 44, 5,
841 46, 18, 15, 45,
842 47, 19, 45, 4,
843
844 29, 50, 34, 48,
845 28, 51, 48, 26,
846 50, 37, 35, 49,
847 51, 36, 49, 27,
848
849 31, 52, 40, 48,
850 30, 53, 48, 45,
851 52, 38, 41, 49,
852 53, 39, 49, 44,
853
854 33, 52, 43, 50,
855 32, 53, 50, 46,
856 52, 25, 42, 51,
857 53, 24, 51, 47
858 };
859
860 // edges-at-cube
861 static const Index e_c1[] =
862 {
863 9, 31, 33, 52, 22, 29, 43, 50, 10, 34, 40, 48,
864 8, 30, 32, 53, 29, 18, 50, 46, 34, 15, 48, 45,
865 31, 2, 52, 25, 23, 28, 42, 51, 40, 48, 1, 26,
866 30, 3, 53, 24, 28, 19, 51, 47, 48, 45, 26, 4,
867
868 33, 52, 12, 38, 43, 50, 16, 37, 11, 35, 41, 49,
869 32, 53, 13, 39, 50, 46, 37, 20, 35, 14, 49, 44,
870 52, 25, 38, 7, 42, 51, 17, 36, 41, 49, 0, 27,
871 53, 24, 39, 6, 51, 47, 36, 21, 49, 44, 27, 5
872 };
873
874 // quad-at-cube
875 static const Index q_c1[] =
876 {
877 7, 32, 10, 28, 17, 24,
878 6, 33, 8, 29, 24, 22,
879 5, 34, 28, 2, 16, 25,
880 4, 35, 29, 0, 25, 23,
881 32, 14, 11, 30, 19, 26,
882 33, 15, 9, 31, 26, 20,
883 34, 12, 30, 3, 18, 27,
884 35, 13, 31, 1, 27, 21
885 };
886
888
889 // v_6__________e_5__>______v_5
890 // /| /|
891 // e_8^ | q_5 e_10v |
892 // /__|________<__________/ |
893 // v_2| | e_3 v_3| |
894 // | | | |
895 // | |e_7 q_1 |q |e_6
896 // | q v x v2 |
897 // e_1| 3 | q_0 e_2| |
898 // v | v |
899 // | |v_4_______e_4__<___|__|v_1
900 // | / | /
901 // | ve_11 q_4 | ^e_9
902 // |/___________>__________|/
903 // v_0 e_0 v_7
904 //
905 // cube orientation: v_0-v_7-v_4-v_1-v_2-v_3-v_6-v_5
906 // quad orientation:
907 // q_0 : v_2-v_0-v_3-v_7
908 // q_1 : v_5-v_1-v_6-v_4
909 // q_2 : v_7-v_3-v_1-v_5
910 // q_3 : v_6-v_4-v_2-v_0
911 // q_4 : v_7-v_0-v_1-v_4
912 // q_5 : v_6-v_5-v_2-v_3
913
914 // vertex coordinates array
915 static const Real vtx2[] =
916 {
917 0.0, 0.0, 0.0,
918 1.0, 1.0, 0.0,
919 0.0, 0.0, 1.0,
920 1.0, 0.0, 1.0,
921 0.0, 1.0, 0.0,
922 1.0, 1.0, 1.0,
923 0.0, 1.0, 1.0,
924 1.0, 0.0, 0.0,
925
926 0.5, 0.0, 0.0,
927 0.0, 0.0, 0.5,
928 1.0, 0.0, 0.5,
929 0.5, 0.0, 1.0,
930 0.5, 1.0, 0.0,
931 0.5, 1.0, 1.0,
932 1.0, 1.0, 0.5,
933 0.0, 1.0, 0.5,
934 0.0, 0.5, 1.0,
935 1.0, 0.5, 0.0,
936 1.0, 0.5, 1.0,
937 0.0, 0.5, 0.0,
938
939 0.5, 0.0, 0.5,
940 0.5, 1.0, 0.5,
941 1.0, 0.5, 0.5,
942 0.0, 0.5, 0.5,
943 0.5, 0.5, 0.0,
944 0.5, 0.5, 1.0,
945
946 0.5, 0.5, 0.5
947 };
948
949 // vertices-at-edge array
950 static const Index v_e2[] =
951 {
952 0, 8,
953 8, 7,
954 2, 9,
955 9, 0,
956 3, 10,
957 10, 7,
958 3, 11,
959 11, 2,
960 4, 12,
961 12, 1,
962 5, 13,
963 13, 6,
964 1, 14,
965 14, 5,
966 4, 15,
967 15, 6,
968 6, 16,
969 16, 2,
970 1, 17,
971 17, 7,
972 3, 18,
973 18, 5,
974 0, 19,
975 19, 4,
976
977 9, 20,
978 20, 10,
979 11, 20,
980 20, 8,
981 14, 21,
982 21, 15,
983 13, 21,
984 21, 12,
985 10, 22,
986 22, 14,
987 17, 22,
988 22, 18,
989 15, 23,
990 23, 9,
991 16, 23,
992 23, 19,
993 8, 24,
994 24, 12,
995 17, 24,
996 24, 19,
997 13, 25,
998 25, 11,
999 16, 25,
1000 25, 18,
1001
1002 24, 26,
1003 26, 25,
1004 20, 26,
1005 26, 21,
1006 23, 26,
1007 26, 22
1008 };
1009
1010 // vertices-at-quad
1011 static const Index v_q2[] =
1012 {
1013 2, 9, 11, 20,
1014 9, 0, 20, 8,
1015 11, 20, 3, 10,
1016 20, 8, 10, 7,
1017
1018 5, 14, 13, 21,
1019 14, 1, 21, 12,
1020 13, 21, 6, 15,
1021 21, 12, 15, 4,
1022
1023 7, 10, 17, 22,
1024 10, 3, 22, 18,
1025 17, 22, 1, 14,
1026 22, 18, 14, 5,
1027
1028 6, 15, 16, 23,
1029 15, 4, 23, 19,
1030 16, 23, 2, 9,
1031 23, 19, 9, 0,
1032
1033 7, 8, 17, 24,
1034 8, 0, 24, 19,
1035 17, 24, 1, 12,
1036 24, 19, 12, 4,
1037
1038 6, 13, 16, 25,
1039 13, 5, 25, 18,
1040 16, 25, 2, 11,
1041 25, 18, 11, 3,
1042
1043 8, 24, 20, 26,
1044 24, 12, 26, 21,
1045 20, 26, 11, 25,
1046 26, 21, 25, 13,
1047
1048 19, 24, 23, 26,
1049 24, 17, 26, 22,
1050 23, 26, 16, 25,
1051 26, 22, 25, 18,
1052
1053 9, 20, 23, 26,
1054 20, 10, 26, 22,
1055 23, 26, 15, 21,
1056 26, 22, 21, 14
1057 };
1058
1059 // vertices-at-cube
1060 static const Index v_c2[] =
1061 {
1062 0, 8, 19, 24, 9, 20, 23, 26,
1063 8, 7, 24, 17, 20, 10, 26, 22,
1064 19, 24, 4, 12, 23, 26, 15, 21,
1065 24, 17, 12, 1, 26, 22, 21, 14,
1066 9, 20, 23, 26, 2, 11, 16, 25,
1067 20, 10, 26, 22, 11, 3, 25, 18,
1068 23, 26, 15, 21, 16, 25, 6, 13,
1069 26, 22, 21, 14, 25, 18, 13, 5
1070 };
1071
1072 // edges-at-quad
1073 static const Index e_q2[] =
1074 {
1075 2, 26, 7, 24,
1076 3, 27, 24, 0,
1077 26, 4, 6, 25,
1078 27, 5, 25, 1,
1079
1080 13, 30, 10, 28,
1081 12, 31, 28, 9,
1082 30, 15, 11, 29,
1083 31, 14, 29, 8,
1084
1085 5, 34, 19, 32,
1086 4, 35, 32, 20,
1087 34, 12, 18, 33,
1088 35, 13, 33, 21,
1089
1090 15, 38, 16, 36,
1091 14, 39, 36, 23,
1092 38, 2, 17, 37,
1093 39, 3, 37, 22,
1094
1095 1, 42, 19, 40,
1096 0, 43, 40, 22,
1097 42, 9, 18, 41,
1098 43, 8, 41, 23,
1099
1100 11, 46, 16, 44,
1101 10, 47, 44, 21,
1102 46, 7, 17, 45,
1103 47, 6, 45, 20,
1104
1105 40, 50, 27, 48,
1106 41, 51, 48, 31,
1107 50, 45, 26, 49,
1108 51, 44, 49, 30,
1109
1110 43, 52, 39, 48,
1111 42, 53, 48, 34,
1112 52, 46, 38, 49,
1113 53, 47, 49, 35,
1114
1115 24, 52, 37, 50,
1116 25, 53, 50, 32,
1117 52, 29, 36, 51,
1118 53, 28, 51, 33
1119 };
1120
1121 // edges-at-cube
1122 static const Index e_c2[] =
1123 {
1124 0, 43, 24, 52, 22, 40, 37, 50, 3, 27, 39, 48,
1125 1, 42, 25, 53, 40, 19, 50, 32, 27, 5, 48, 34,
1126 43, 8, 52, 29, 23, 41, 36, 51, 39, 48, 14, 31,
1127 42, 9, 53, 28, 41, 18, 51, 33, 48, 34, 31, 12,
1128
1129 24, 52, 7, 46, 37, 50, 17, 45, 2, 26, 38, 49,
1130 25, 53, 6, 47, 50, 32, 45, 20, 26, 4, 49, 35,
1131 52, 29, 46, 11, 36, 51, 16, 44, 38, 49, 15, 30,
1132 53, 28, 47, 10, 51, 33, 44, 21, 49, 35, 30, 13
1133 };
1134
1135 // quad-at-cube
1136 static const Index q_c2[] =
1137 {
1138 17, 32, 1, 28, 15, 24,
1139 16, 33, 3, 29, 24, 8,
1140 19, 34, 28, 7, 13, 25,
1141 18, 35, 29, 5, 25, 10,
1142 32, 22, 0, 30, 14, 26,
1143 33, 23, 2, 31, 26, 9,
1144 34, 20, 30, 6, 12, 27,
1145 35, 21, 31, 4, 27, 11
1146 };
1147
1148 switch(orientation)
1149 {
1150 case 0:
1151 // check vertex coordinates array
1152 if(!comp_vtx(mesh.get_vertex_set(), vtx0))
1153 throw String("Vertex coordinate refinement failure");
1154
1155 // check vertices-at-edge array
1156 if(!comp_idx(mesh.get_index_set<1,0>(), v_e0))
1157 throw String("Vertex-At-Edge index set refinement failure");
1158
1159 // check vertices-at-quad
1160 if(!comp_idx(mesh.get_index_set<2,0>(), v_q0))
1161 throw String("Vertex-At-Quad index set refinement failure");
1162
1163 // check vertices-at-cube
1164 if(!comp_idx(mesh.get_index_set<3,0>(), v_c0))
1165 throw String("Vertex-At-Cube index set refinement failure");
1166
1167 // check edges-at-quad
1168 if(!comp_idx(mesh.get_index_set<2,1>(), e_q0))
1169 throw String("Edge-At-Quad index set refinement failure");
1170
1171 // check edges-at-cube
1172 if(!comp_idx(mesh.get_index_set<3,1>(), e_c0))
1173 throw String("Edge-At-Cube index set refinement failure");
1174
1175 // check quad-at-cube
1176 if(!comp_idx(mesh.get_index_set<3,2>(), q_c0))
1177 throw String("Quad-At-Cube index set refinement failure");
1178 break;
1179
1180 case 1:
1181 // check vertex coordinates array
1182 if(!comp_vtx(mesh.get_vertex_set(), vtx1))
1183 throw String("Vertex coordinate refinement failure");
1184
1185 // check vertices-at-edge array
1186 if(!comp_idx(mesh.get_index_set<1,0>(), v_e1))
1187 throw String("Vertex-At-Edge index set refinement failure");
1188
1189 // check vertices-at-quad
1190 if(!comp_idx(mesh.get_index_set<2,0>(), v_q1))
1191 throw String("Vertex-At-Quad index set refinement failure");
1192
1193 // check vertices-at-cube
1194 if(!comp_idx(mesh.get_index_set<3,0>(), v_c1))
1195 throw String("Vertex-At-Cube index set refinement failure");
1196
1197 // check edges-at-quad
1198 if(!comp_idx(mesh.get_index_set<2,1>(), e_q1))
1199 throw String("Edge-At-Quad index set refinement failure");
1200
1201 // check edges-at-cube
1202 if(!comp_idx(mesh.get_index_set<3,1>(), e_c1))
1203 throw String("Edge-At-Cube index set refinement failure");
1204
1205 // check quad-at-cube
1206 if(!comp_idx(mesh.get_index_set<3,2>(), q_c1))
1207 throw String("Quad-At-Cube index set refinement failure");
1208 break;
1209
1210 case 2:
1211 // check vertex coordinates array
1212 if(!comp_vtx(mesh.get_vertex_set(), vtx2))
1213 throw String("Vertex coordinate refinement failure");
1214
1215 // check vertices-at-edge array
1216 if(!comp_idx(mesh.get_index_set<1,0>(), v_e2))
1217 throw String("Vertex-At-Edge index set refinement failure");
1218
1219 // check vertices-at-quad
1220 if(!comp_idx(mesh.get_index_set<2,0>(), v_q2))
1221 throw String("Vertex-At-Quad index set refinement failure");
1222
1223 // check vertices-at-cube
1224 if(!comp_idx(mesh.get_index_set<3,0>(), v_c2))
1225 throw String("Vertex-At-Cube index set refinement failure");
1226
1227 // check edges-at-quad
1228 if(!comp_idx(mesh.get_index_set<2,1>(), e_q2))
1229 throw String("Edge-At-Quad index set refinement failure");
1230
1231 // check edges-at-cube
1232 if(!comp_idx(mesh.get_index_set<3,1>(), e_c2))
1233 throw String("Edge-At-Cube index set refinement failure");
1234
1235 // check quad-at-cube
1236 if(!comp_idx(mesh.get_index_set<3,2>(), q_c2))
1237 throw String("Quad-At-Cube index set refinement failure");
1238 break;
1239
1240 default:
1241 XABORTM("Unhandled orientation "+stringify(orientation));
1242
1243 } //switch
1244 } // validate_refined_hexa_mesh_3d
1245
1246 } // namespace TestAux
1247 } // namespace Geometry
1248} // namespace FEAT
#define XABORTM(msg)
Abortion macro definition with custom message.
Definition: assertion.hpp:192
FEAT namespace.
Definition: adjactor.hpp:12
double Real
Real data type.
String stringify(const T_ &item)
Converts an item into a String.
Definition: string.hpp:944
std::uint64_t Index
Index data type.