MFEM  v4.6.0
Finite element discretization library
ncmesh_tables.hpp
Go to the documentation of this file.
1 // Copyright (c) 2010-2023, Lawrence Livermore National Security, LLC. Produced
2 // at the Lawrence Livermore National Laboratory. All Rights reserved. See files
3 // LICENSE and NOTICE for details. LLNL-CODE-806117.
4 //
5 // This file is part of the MFEM library. For more information and source code
6 // availability visit https://mfem.org.
7 //
8 // MFEM is free software; you can redistribute it and/or modify it under the
9 // terms of the BSD-3 license. We welcome feedback and contributions, see file
10 // CONTRIBUTING.md for details.
11 
12 namespace mfem
13 {
14 
15 namespace // make everything static
16 {
17 
18 const int ref_type_num_children[8] = { 0, 2, 2, 4, 2, 4, 4, 8 };
19 
20 
21 // derefinement tables
22 // The first n numbers in each line are the refined elements that contain
23 // the vertices of the parent element. The next m numbers in each line
24 // are the refined elements that contain the faces attributes of the parent
25 // element.
26 
27 const int quad_deref_table[3][4 + 4] =
28 {
29  { 0, 1, 1, 0, /**/ 1, 1, 0, 0 }, // 1 - X
30  { 0, 0, 1, 1, /**/ 0, 0, 1, 1 }, // 2 - Y
31  { 0, 1, 2, 3, /**/ 1, 1, 3, 3 } // 3 - iso
32 };
33 
34 const int hex_deref_table[7][8 + 6] =
35 {
36  { 0, 1, 1, 0, 0, 1, 1, 0, /**/ 1, 1, 1, 0, 0, 0 }, // 1 - X
37  { 0, 0, 1, 1, 0, 0, 1, 1, /**/ 0, 0, 0, 1, 1, 1 }, // 2 - Y
38  { 0, 1, 2, 3, 0, 1, 2, 3, /**/ 1, 1, 1, 3, 3, 3 }, // 3 - XY
39  { 0, 0, 0, 0, 1, 1, 1, 1, /**/ 0, 0, 0, 1, 1, 1 }, // 4 - Z
40  { 0, 1, 1, 0, 3, 2, 2, 3, /**/ 1, 1, 1, 3, 3, 3 }, // 5 - XZ
41  { 0, 0, 1, 1, 2, 2, 3, 3, /**/ 0, 0, 0, 3, 3, 3 }, // 6 - YZ
42  { 0, 1, 2, 3, 4, 5, 6, 7, /**/ 1, 1, 1, 7, 7, 7 } // 7 - iso
43 };
44 
45 const int prism_deref_table[7][6 + 5] =
46 {
47  {-1,-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 1
48  {-1,-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 2
49  { 0, 1, 2, 0, 1, 2, /**/ 0, 0, 0, 1, 0 }, // 3 - XY
50  { 0, 0, 0, 1, 1, 1, /**/ 0, 1, 0, 0, 0 }, // 4 - Z
51  {-1,-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 5
52  {-1,-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 6
53  { 0, 1, 2, 4, 5, 6, /**/ 0, 5, 0, 5, 0 } // 7 - iso
54 };
55 
56 const int pyramid_deref_table[7][5 + 5] =
57 {
58  {-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 1
59  {-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 2
60  {-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 3
61  {-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 4
62  {-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 5
63  {-1,-1,-1,-1,-1, /**/ -1,-1,-1,-1,-1 }, // 6
64  { 0, 1, 2, 3, 5, /**/ 0, 5, 5, 5, 5 } // 7 - iso
65 };
66 
67 // child ordering tables
68 
69 const char quad_hilbert_child_order[8][4] =
70 {
71  {0,1,2,3}, {0,3,2,1}, {1,2,3,0}, {1,0,3,2},
72  {2,3,0,1}, {2,1,0,3}, {3,0,1,2}, {3,2,1,0}
73 };
74 
75 const char quad_hilbert_child_state[8][4] =
76 {
77  {1,0,0,5}, {0,1,1,4}, {3,2,2,7}, {2,3,3,6},
78  {5,4,4,1}, {4,5,5,0}, {7,6,6,3}, {6,7,7,2}
79 };
80 
81 const char hex_hilbert_child_order[24][8] =
82 {
83  {0,1,2,3,7,6,5,4}, {0,3,7,4,5,6,2,1}, {0,4,5,1,2,6,7,3},
84  {1,0,3,2,6,7,4,5}, {1,2,6,5,4,7,3,0}, {1,5,4,0,3,7,6,2},
85  {2,1,5,6,7,4,0,3}, {2,3,0,1,5,4,7,6}, {2,6,7,3,0,4,5,1},
86  {3,0,4,7,6,5,1,2}, {3,2,1,0,4,5,6,7}, {3,7,6,2,1,5,4,0},
87  {4,0,1,5,6,2,3,7}, {4,5,6,7,3,2,1,0}, {4,7,3,0,1,2,6,5},
88  {5,1,0,4,7,3,2,6}, {5,4,7,6,2,3,0,1}, {5,6,2,1,0,3,7,4},
89  {6,2,3,7,4,0,1,5}, {6,5,1,2,3,0,4,7}, {6,7,4,5,1,0,3,2},
90  {7,3,2,6,5,1,0,4}, {7,4,0,3,2,1,5,6}, {7,6,5,4,0,1,2,3}
91 };
92 
93 const char hex_hilbert_child_state[24][8] =
94 {
95  {1,2,2,7,7,21,21,17}, {2,0,0,22,22,16,16,8}, {0,1,1,15,15,6,6,23},
96  {4,5,5,10,10,18,18,14}, {5,3,3,19,19,13,13,11}, {3,4,4,12,12,9,9,20},
97  {8,7,7,17,17,23,23,2}, {6,8,8,0,0,15,15,22}, {7,6,6,21,21,1,1,16},
98  {11,10,10,14,14,20,20,5}, {9,11,11,3,3,12,12,19}, {10,9,9,18,18,4,4,13},
99  {13,14,14,5,5,19,19,10}, {14,12,12,20,20,11,11,4}, {12,13,13,9,9,3,3,18},
100  {16,17,17,2,2,22,22,7}, {17,15,15,23,23,8,8,1}, {15,16,16,6,6,0,0,21},
101  {20,19,19,11,11,14,14,3}, {18,20,20,4,4,10,10,12}, {19,18,18,13,13,5,5,9},
102  {23,22,22,8,8,17,17,0}, {21,23,23,1,1,7,7,15}, {22,21,21,16,16,2,2,6}
103 };
104 
105 
106 // child/parent reference domain transforms
107 
108 typedef NCMesh::RefCoord RefCoord;
109 
110 // reference domain coordinates as fixed point numbers
111 const RefCoord T_HALF = (1ll << 59);
112 const RefCoord T_ONE = (1ll << 60);
113 const RefCoord T_TWO = (1ll << 61);
114 
115 // (scaling factors have a different fixed point multiplier)
116 const RefCoord S_HALF = 1;
117 const RefCoord S_ONE = 2;
118 const RefCoord S_TWO = 4;
119 
120 const RefCoord tri_corners[3][3] =
121 {
122  { 0, 0, 0},
123  {T_ONE, 0, 0},
124  { 0, T_ONE, 0}
125 };
126 
127 const RefCoord quad_corners[4][3] =
128 {
129  { 0, 0, 0},
130  {T_ONE, 0, 0},
131  {T_ONE, T_ONE, 0},
132  { 0, T_ONE, 0}
133 };
134 
135 const RefCoord hex_corners[8][3] =
136 {
137  { 0, 0, 0},
138  {T_ONE, 0, 0},
139  {T_ONE, T_ONE, 0},
140  { 0, T_ONE, 0},
141  { 0, 0, T_ONE},
142  {T_ONE, 0, T_ONE},
143  {T_ONE, T_ONE, T_ONE},
144  { 0, T_ONE, T_ONE}
145 };
146 
147 const RefCoord prism_corners[6][3] =
148 {
149  { 0, 0, 0},
150  {T_ONE, 0, 0},
151  { 0, T_ONE, 0},
152  { 0, 0, T_ONE},
153  {T_ONE, 0, T_ONE},
154  { 0, T_ONE, T_ONE}
155 };
156 
157 const RefCoord pyramid_corners[5][3] =
158 {
159  { 0, 0, 0},
160  {T_ONE, 0, 0},
161  {T_ONE, T_ONE, 0},
162  { 0, T_ONE, 0},
163  { 0, 0, T_ONE}
164 };
165 
166 typedef RefCoord RefPoint[3];
167 const RefPoint* geom_corners[8] =
168 {
169  NULL, // point
170  NULL, // segment
171  tri_corners,
172  quad_corners,
173  NULL, // tetrahedron
174  hex_corners,
175  prism_corners,
176  pyramid_corners
177 };
178 
179 // reference domain transform: 3 scales, 3 translations
180 struct RefTrf
181 {
182  RefCoord s[3], t[3];
183 
184  void Apply(const RefCoord src[3], RefCoord dst[3]) const
185  {
186  for (int i = 0; i < 3; i++)
187  {
188  dst[i] = (src[i]*s[i] >> 1) + t[i];
189  }
190  }
191 };
192 
193 const RefTrf quad_parent_rt1[2] =
194 {
195  { {S_HALF, S_ONE, 0}, { 0, 0, 0} },
196  { {S_HALF, S_ONE, 0}, {T_HALF, 0, 0} }
197 };
198 
199 const RefTrf quad_child_rt1[2] =
200 {
201  { {S_TWO, S_ONE, 0}, { 0, 0, 0} },
202  { {S_TWO, S_ONE, 0}, {-T_ONE, 0, 0} }
203 };
204 
205 const RefTrf quad_parent_rt2[2] =
206 {
207  { {S_ONE, S_HALF, 0}, {0, 0, 0} },
208  { {S_ONE, S_HALF, 0}, {0, T_HALF, 0} }
209 };
210 
211 const RefTrf quad_child_rt2[2] =
212 {
213  { {S_ONE, S_TWO, 0}, {0, 0, 0} },
214  { {S_ONE, S_TWO, 0}, {0, -T_ONE, 0} }
215 };
216 
217 const RefTrf quad_parent_rt3[4] =
218 {
219  { {S_HALF, S_HALF, 0}, { 0, 0, 0} },
220  { {S_HALF, S_HALF, 0}, {T_HALF, 0, 0} },
221  { {S_HALF, S_HALF, 0}, {T_HALF, T_HALF, 0} },
222  { {S_HALF, S_HALF, 0}, { 0, T_HALF, 0} }
223 };
224 
225 const RefTrf quad_child_rt3[4] =
226 {
227  { {S_TWO, S_TWO, 0}, { 0, 0, 0} },
228  { {S_TWO, S_TWO, 0}, {-T_ONE, 0, 0} },
229  { {S_TWO, S_TWO, 0}, {-T_ONE, -T_ONE, 0} },
230  { {S_TWO, S_TWO, 0}, { 0, -T_ONE, 0} }
231 };
232 
233 const RefTrf* quad_parent[4] =
234 {
235  NULL,
236  quad_parent_rt1,
237  quad_parent_rt2,
238  quad_parent_rt3
239 };
240 
241 const RefTrf* quad_child[4] =
242 {
243  NULL,
244  quad_child_rt1,
245  quad_child_rt2,
246  quad_child_rt3
247 };
248 
249 const RefTrf hex_parent_rt1[2] =
250 {
251  { {S_HALF, S_ONE, S_ONE}, { 0, 0, 0} },
252  { {S_HALF, S_ONE, S_ONE}, {T_HALF, 0, 0} }
253 };
254 
255 const RefTrf hex_child_rt1[2] =
256 {
257  { {S_TWO, S_ONE, S_ONE}, { 0, 0, 0} },
258  { {S_TWO, S_ONE, S_ONE}, {-T_ONE, 0, 0} }
259 };
260 
261 const RefTrf hex_parent_rt2[2] =
262 {
263  { {S_ONE, S_HALF, S_ONE}, {0, 0, 0} },
264  { {S_ONE, S_HALF, S_ONE}, {0, T_HALF, 0} }
265 };
266 
267 const RefTrf hex_child_rt2[2] =
268 {
269  { {S_ONE, S_TWO, S_ONE}, {0, 0, 0} },
270  { {S_ONE, S_TWO, S_ONE}, {0, -T_ONE, 0} }
271 };
272 
273 const RefTrf hex_parent_rt3[4] =
274 {
275  { {S_HALF, S_HALF, S_ONE}, { 0, 0, 0} },
276  { {S_HALF, S_HALF, S_ONE}, {T_HALF, 0, 0} },
277  { {S_HALF, S_HALF, S_ONE}, {T_HALF, T_HALF, 0} },
278  { {S_HALF, S_HALF, S_ONE}, { 0, T_HALF, 0} }
279 };
280 
281 const RefTrf hex_child_rt3[4] =
282 {
283  { {S_TWO, S_TWO, S_ONE}, { 0, 0, 0} },
284  { {S_TWO, S_TWO, S_ONE}, {-T_ONE, 0, 0} },
285  { {S_TWO, S_TWO, S_ONE}, {-T_ONE, -T_ONE, 0} },
286  { {S_TWO, S_TWO, S_ONE}, { 0, -T_ONE, 0} }
287 };
288 
289 const RefTrf hex_parent_rt4[2] =
290 {
291  { {S_ONE, S_ONE, S_HALF}, {0, 0, 0} },
292  { {S_ONE, S_ONE, S_HALF}, {0, 0, T_HALF} }
293 };
294 
295 const RefTrf hex_child_rt4[2] =
296 {
297  { {S_ONE, S_ONE, S_TWO}, {0, 0, 0} },
298  { {S_ONE, S_ONE, S_TWO}, {0, 0, -T_ONE} }
299 };
300 
301 const RefTrf hex_parent_rt5[4] =
302 {
303  { {S_HALF, S_ONE, S_HALF}, { 0, 0, 0} },
304  { {S_HALF, S_ONE, S_HALF}, {T_HALF, 0, 0} },
305  { {S_HALF, S_ONE, S_HALF}, {T_HALF, 0, T_HALF} },
306  { {S_HALF, S_ONE, S_HALF}, { 0, 0, T_HALF} }
307 };
308 
309 const RefTrf hex_child_rt5[4] =
310 {
311  { {S_TWO, S_ONE, S_TWO}, { 0, 0, 0} },
312  { {S_TWO, S_ONE, S_TWO}, {-T_ONE, 0, 0} },
313  { {S_TWO, S_ONE, S_TWO}, {-T_ONE, 0, -T_ONE} },
314  { {S_TWO, S_ONE, S_TWO}, { 0, 0, -T_ONE} }
315 };
316 
317 const RefTrf hex_parent_rt6[4] =
318 {
319  { {S_ONE, S_HALF, S_HALF}, {0, 0, 0} },
320  { {S_ONE, S_HALF, S_HALF}, {0, T_HALF, 0} },
321  { {S_ONE, S_HALF, S_HALF}, {0, 0, T_HALF} },
322  { {S_ONE, S_HALF, S_HALF}, {0, T_HALF, T_HALF} }
323 };
324 
325 const RefTrf hex_child_rt6[4] =
326 {
327  { {S_ONE, S_TWO, S_TWO}, {0, 0, 0} },
328  { {S_ONE, S_TWO, S_TWO}, {0, -T_ONE, 0} },
329  { {S_ONE, S_TWO, S_TWO}, {0, 0, -T_ONE} },
330  { {S_ONE, S_TWO, S_TWO}, {0, -T_ONE, -T_ONE} }
331 };
332 
333 const RefTrf hex_parent_rt7[8] =
334 {
335  { {S_HALF, S_HALF, S_HALF}, { 0, 0, 0} },
336  { {S_HALF, S_HALF, S_HALF}, {T_HALF, 0, 0} },
337  { {S_HALF, S_HALF, S_HALF}, {T_HALF, T_HALF, 0} },
338  { {S_HALF, S_HALF, S_HALF}, { 0, T_HALF, 0} },
339  { {S_HALF, S_HALF, S_HALF}, { 0, 0, T_HALF} },
340  { {S_HALF, S_HALF, S_HALF}, {T_HALF, 0, T_HALF} },
341  { {S_HALF, S_HALF, S_HALF}, {T_HALF, T_HALF, T_HALF} },
342  { {S_HALF, S_HALF, S_HALF}, { 0, T_HALF, T_HALF} }
343 };
344 
345 const RefTrf hex_child_rt7[8] =
346 {
347  { {S_TWO, S_TWO, S_TWO}, { 0, 0, 0} },
348  { {S_TWO, S_TWO, S_TWO}, {-T_ONE, 0, 0} },
349  { {S_TWO, S_TWO, S_TWO}, {-T_ONE, -T_ONE, 0} },
350  { {S_TWO, S_TWO, S_TWO}, { 0, -T_ONE, 0} },
351  { {S_TWO, S_TWO, S_TWO}, { 0, 0, -T_ONE} },
352  { {S_TWO, S_TWO, S_TWO}, {-T_ONE, 0, -T_ONE} },
353  { {S_TWO, S_TWO, S_TWO}, {-T_ONE, -T_ONE, -T_ONE} },
354  { {S_TWO, S_TWO, S_TWO}, { 0, -T_ONE, -T_ONE} }
355 };
356 
357 const RefTrf* hex_parent[8] =
358 {
359  NULL,
360  hex_parent_rt1,
361  hex_parent_rt2,
362  hex_parent_rt3,
363  hex_parent_rt4,
364  hex_parent_rt5,
365  hex_parent_rt6,
366  hex_parent_rt7
367 };
368 
369 const RefTrf* hex_child[8] =
370 {
371  NULL,
372  hex_child_rt1,
373  hex_child_rt2,
374  hex_child_rt3,
375  hex_child_rt4,
376  hex_child_rt5,
377  hex_child_rt6,
378  hex_child_rt7
379 };
380 
381 const RefTrf tri_parent_rt3[4] =
382 {
383  { { S_HALF, S_HALF, 0}, { 0, 0, 0} },
384  { { S_HALF, S_HALF, 0}, {T_HALF, 0, 0} },
385  { { S_HALF, S_HALF, 0}, { 0, T_HALF, 0} },
386  { {-S_HALF, -S_HALF, 0}, {T_HALF, T_HALF, 0} }
387 };
388 
389 const RefTrf tri_child_rt3[4] =
390 {
391  { { S_TWO, S_TWO, 0}, { 0, 0, 0} },
392  { { S_TWO, S_TWO, 0}, {-T_ONE, 0, 0} },
393  { { S_TWO, S_TWO, 0}, { 0, -T_ONE, 0} },
394  { {-S_TWO, -S_TWO, 0}, { T_ONE, T_ONE, 0} }
395 };
396 
397 const RefTrf* tri_parent[4] =
398 {
399  NULL, NULL, NULL,
400  tri_parent_rt3
401 };
402 
403 const RefTrf* tri_child[4] =
404 {
405  NULL, NULL, NULL,
406  tri_child_rt3
407 };
408 
409 const RefTrf prism_parent_rt3[4] =
410 {
411  { { S_HALF, S_HALF, S_ONE}, { 0, 0, 0} },
412  { { S_HALF, S_HALF, S_ONE}, {T_HALF, 0, 0} },
413  { { S_HALF, S_HALF, S_ONE}, { 0, T_HALF, 0} },
414  { {-S_HALF, -S_HALF, S_ONE}, {T_HALF, T_HALF, 0} }
415 };
416 
417 const RefTrf prism_child_rt3[4] =
418 {
419  { { S_TWO, S_TWO, S_ONE}, { 0, 0, 0} },
420  { { S_TWO, S_TWO, S_ONE}, {-T_ONE, 0, 0} },
421  { { S_TWO, S_TWO, S_ONE}, { 0, -T_ONE, 0} },
422  { {-S_TWO, -S_TWO, S_ONE}, { T_ONE, T_ONE, 0} }
423 };
424 
425 const RefTrf prism_parent_rt4[2] =
426 {
427  { {S_ONE, S_ONE, S_HALF}, {0, 0, 0} },
428  { {S_ONE, S_ONE, S_HALF}, {0, 0, T_HALF} }
429 };
430 
431 const RefTrf prism_child_rt4[2] =
432 {
433  { {S_ONE, S_ONE, S_TWO}, {0, 0, 0} },
434  { {S_ONE, S_ONE, S_TWO}, {0, 0, -T_ONE} }
435 };
436 
437 const RefTrf prism_parent_rt7[8] =
438 {
439  { { S_HALF, S_HALF, S_HALF}, { 0, 0, 0} },
440  { { S_HALF, S_HALF, S_HALF}, {T_HALF, 0, 0} },
441  { { S_HALF, S_HALF, S_HALF}, { 0, T_HALF, 0} },
442  { {-S_HALF, -S_HALF, S_HALF}, {T_HALF, T_HALF, 0} },
443  { { S_HALF, S_HALF, S_HALF}, { 0, 0, T_HALF} },
444  { { S_HALF, S_HALF, S_HALF}, {T_HALF, 0, T_HALF} },
445  { { S_HALF, S_HALF, S_HALF}, { 0, T_HALF, T_HALF} },
446  { {-S_HALF, -S_HALF, S_HALF}, {T_HALF, T_HALF, T_HALF} }
447 };
448 
449 const RefTrf prism_child_rt7[8] =
450 {
451  { { S_TWO, S_TWO, S_TWO}, { 0, 0, 0} },
452  { { S_TWO, S_TWO, S_TWO}, {-T_ONE, 0, 0} },
453  { { S_TWO, S_TWO, S_TWO}, { 0, -T_ONE, 0} },
454  { {-S_TWO, -S_TWO, S_TWO}, { T_ONE, T_ONE, 0} },
455  { { S_TWO, S_TWO, S_TWO}, { 0, 0, -T_ONE} },
456  { { S_TWO, S_TWO, S_TWO}, {-T_ONE, 0, -T_ONE} },
457  { { S_TWO, S_TWO, S_TWO}, { 0, -T_ONE, -T_ONE} },
458  { {-S_TWO, -S_TWO, S_TWO}, { T_ONE, T_ONE, -T_ONE} }
459 };
460 
461 const RefTrf* prism_parent[8] =
462 {
463  NULL, NULL, NULL,
464  prism_parent_rt3,
465  prism_parent_rt4,
466  NULL, NULL,
467  prism_parent_rt7
468 };
469 
470 const RefTrf* prism_child[8] =
471 {
472  NULL, NULL, NULL,
473  prism_child_rt3,
474  prism_child_rt4,
475  NULL, NULL,
476  prism_child_rt7
477 };
478 
479 const RefTrf** geom_parent[7] =
480 {
481  NULL,
482  NULL,
483  tri_parent,
484  quad_parent,
485  NULL,
486  hex_parent,
487  prism_parent
488 };
489 
490 const RefTrf** geom_child[7] =
491 {
492  NULL,
493  NULL,
494  tri_child,
495  quad_child,
496  NULL,
497  hex_child,
498  prism_child
499 };
500 
501 
502 } // namespace
503 
504 } // namespace mfem
std::int64_t RefCoord
Definition: ncmesh.hpp:397
RefCoord t[3]
RefCoord s[3]