IOSS 2.0
Loading...
Searching...
No Matches
Iotm_TextMeshTopologyMapping.h
Go to the documentation of this file.
1// Copyright(C) 1999-2020, 2022 National Technology & Engineering Solutions
2// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
3// NTESS, the U.S. Government retains certain rights in this software.
4//
5// See packages/seacas/LICENSE for details
6
7#pragma once
8
9#include "iotm_export.h"
10
11#include "Ioss_CodeTypes.h"
12#include "Ioss_EntityType.h" // for EntityType
13
14#include <cstddef> // for size_t
15#include <cstdint> // for int64_t
16#include <map> // for map, etc
17#include <string> // for string
18#include <unordered_map>
19#include <utility> // for pair
20#include <vector> // for vector
21
22#include <assert.h>
23#include <fmt/ostream.h>
24
28#include "Ioss_Utils.h"
29
31
32namespace Iotm {
33 class IOTM_EXPORT TopologyMapEntry
34 {
35 public:
36 using Ordinal = uint16_t;
37 using Permutation = uint8_t;
38
39 static constexpr Ordinal InvalidOrdinal = 65535;
40 static constexpr Permutation InvalidPermutation = 128;
41
42 using DimensionArray = bool[4];
43
45 : id(Ioss::ElementTopology::get_unique_id(std::string(Ioss::Unknown::name))),
46 topology(Ioss::ElementTopology::factory(std::string(Ioss::Unknown::name))),
47 initialized(false)
48 {
49 set_valid_spatial_dimensions({false, false, false, false});
50 }
51
52 explicit TopologyMapEntry(const std::string &name)
53 : id(Ioss::ElementTopology::get_unique_id(name)),
54 topology(Ioss::ElementTopology::factory(name)), initialized(false)
55 {
56 set_valid_spatial_dimensions({false, false, false, false});
57 }
58
59 TopologyMapEntry(const TopologyMapEntry &topo) = default;
61
62 bool operator==(const Ioss::ElementTopology *topo) const { return topo == topology; }
63
64 bool defined_on_spatial_dimension(const unsigned spatialDim) const
65 {
66 if (spatialDim > 3) {
67 return false;
68 }
69 return validSpatialDimensions[spatialDim];
70 }
71
72 const std::string name() const { return topology->name(); }
73
74 int num_nodes() const { return topology->number_nodes(); }
75
76 bool operator==(const TopologyMapEntry &rhs) const
77 {
78 return id == rhs.id && topology == rhs.topology &&
79 equivalent_valid_spatial_dimensions(rhs.validSpatialDimensions);
80 }
81
82 bool operator!=(const TopologyMapEntry &rhs) const { return !(*this == rhs); }
83
84 int num_sides() const
85 {
86 if (topology->is_shell()) {
87 // Only interested in face boundaries, not edges
88 if (topology->parametric_dimension() == 2) {
89 return topology->number_faces();
90 }
91 }
92
93 return topology->number_boundaries();
94 }
95
96 // Side references are one-based
97 bool valid_side(unsigned side) const
98 {
99 unsigned numSides = num_sides();
100 if (side > 0 && side <= numSides)
101 return true;
102 return false;
103 }
104
105 std::string side_topology_name(unsigned side) const
106 {
107 if (!valid_side(side))
108 return "";
109
110 Ioss::ElementTopology *sideTopology = topology->boundary_type(side);
111 return sideTopology->name();
112 }
113
114 const TopologyMapEntry &side_topology(unsigned side) const
115 {
116 if (!valid_side(side))
117 return *(invalid_topology_factory());
118 return *sideTopologies[side - 1];
119 }
120
121 unsigned side_topology_num_nodes(unsigned side) const
122 {
123 if (!valid_side(side))
124 return 0;
125
126 Ioss::ElementTopology *sideTopology = topology->boundary_type(side);
127 return sideTopology->number_nodes();
128 }
129
130 std::vector<Ordinal> side_topology_node_indices(unsigned side) const
131 {
132 if (!valid_side(side))
133 return std::vector<Ordinal>();
134
135 Ioss::ElementTopology *sideTopology = topology->boundary_type(side);
136 std::vector<Ordinal> elementNodeOrdinalVector(sideTopology->number_nodes());
137
138 Ioss::IntVector connectivity = topology->boundary_connectivity(side);
139
140 for (int i = 0; i < sideTopology->number_nodes(); i++) {
141 elementNodeOrdinalVector[i] = connectivity[i];
142 }
143
144 return elementNodeOrdinalVector;
145 }
146
147 bool is_shell() const { return topology->is_shell(); }
148
149 unsigned num_permutations() const { return topology->permutation()->num_permutations(); }
150
152 {
153 return topology->permutation()->num_positive_permutations();
154 }
155
156 bool is_positive_polarity(Permutation permutation) const
157 {
158 return topology->permutation()->is_positive_polarity(permutation);
159 }
160
161 bool valid_permutation(Permutation permutation) const
162 {
163 return topology->permutation()->valid_permutation(permutation);
164 }
165
167 std::vector<Ordinal> &nodeOrdinalVector) const
168 {
169 return topology->permutation()->fill_permutation_indices(permutation, nodeOrdinalVector);
170 }
171
172 std::vector<Ordinal> permutation_indices(Permutation permutation) const
173 {
174 return topology->permutation()->permutation_indices(permutation);
175 }
176
178 {
179 static TopologyMapEntry entry;
180
181 entry.initialized = true;
182
183 return &entry;
184 }
185
186 // Node with no permutation and no sides
188 {
190
191 if (!entry.initialized) {
192 entry.set_valid_spatial_dimensions({false, true, true, true});
193 entry.set_side_topologies({});
194 entry.initialized = true;
195 }
196
197 return &entry;
198 }
199
200 //***************************************************************************
201 // topology::LINE -- topology::EDGE_RANK
202 // 2 nodes with no sides defined in 2D/3D
203 //***************************************************************************
205 {
207
208 if (!entry.initialized) {
209 entry.set_valid_spatial_dimensions({false, false, true, true});
210 entry.set_side_topologies({});
211 entry.initialized = true;
212 }
213
214 return &entry;
215 }
216
217 //***************************************************************************
218 // topology::LINE 1D -- topology::ELEMENT_RANK
219 // 2 nodes with no sides only defined on 1d problems
220 //***************************************************************************
222 {
224
225 if (!entry.initialized) {
226 entry.set_valid_spatial_dimensions({false, true, false, false});
227 entry.set_side_topologies({});
228 entry.initialized = true;
229 }
230
231 return &entry;
232 }
233
234 //***************************************************************************
235 // topology::LINE -- topology::EDGE_RANK
236 // 3 nodes with no sides defined in 2D/3D
237 //***************************************************************************
239 {
241
242 if (!entry.initialized) {
243 entry.set_valid_spatial_dimensions({false, false, true, true});
244 entry.set_side_topologies({});
245 entry.initialized = true;
246 }
247
248 return &entry;
249 }
250
251 //***************************************************************************
252 // topology::LINE 1D -- topology::ELEMENT_RANK
253 // 3 nodes with no sides only defined on 1d problems
254 //***************************************************************************
256 {
258
259 if (!entry.initialized) {
260 entry.set_valid_spatial_dimensions({false, true, false, false});
261 entry.set_side_topologies({});
262 entry.initialized = true;
263 }
264
265 return &entry;
266 }
267
268 //***************************************************************************
269 // topology::TRIANGLE -- topology::FACE_RANK
270 // defined on spatial dimension 3d
271 // 3, 4, or 6 nodes with 3 edges and no sides
272 //***************************************************************************
274 {
276
277 if (!entry.initialized) {
278 entry.set_valid_spatial_dimensions({false, false, false, true});
279 entry.set_side_topologies({});
280 entry.initialized = true;
281 }
282
283 return &entry;
284 }
285
287 {
289
290 if (!entry.initialized) {
291 entry.set_valid_spatial_dimensions({false, false, false, true});
292 entry.set_side_topologies({});
293 entry.initialized = true;
294 }
295
296 return &entry;
297 }
298
300 {
302
303 if (!entry.initialized) {
304 entry.set_valid_spatial_dimensions({false, false, false, true});
305 entry.set_side_topologies({});
306 entry.initialized = true;
307 }
308
309 return &entry;
310 }
311
312 //***************************************************************************
313 // topology::QUADRILATERAL -- topology::FACE_RANK
314 // defined on spatial dimension 3d
315 // 4, 8, or 9 nodes with 4 edges and no sides
316 //***************************************************************************
318 {
320
321 if (!entry.initialized) {
322 entry.set_valid_spatial_dimensions({false, false, false, true});
323 entry.set_side_topologies({});
324 entry.initialized = true;
325 }
326
327 return &entry;
328 }
329
331 {
333
334 if (!entry.initialized) {
335 entry.set_valid_spatial_dimensions({false, false, false, true});
336 entry.set_side_topologies({});
337 entry.initialized = true;
338 }
339
340 return &entry;
341 }
342
344 {
346
347 if (!entry.initialized) {
348 entry.set_valid_spatial_dimensions({false, false, false, true});
349 entry.set_side_topologies({});
350 entry.initialized = true;
351 }
352
353 return &entry;
354 }
355
357 {
359
360 if (!entry.initialized) {
361 entry.set_valid_spatial_dimensions({false, false, false, true});
362 entry.set_side_topologies({});
363 entry.initialized = true;
364 }
365
366 return &entry;
367 }
368
369 //***************************************************************************
370 // PARTICLE -- topology::ELEMENT_RANK
371 // one node with no sides
372 //***************************************************************************
374 {
376
377 if (!entry.initialized) {
378 entry.set_valid_spatial_dimensions({false, true, true, true});
379 entry.set_side_topologies({});
380 entry.initialized = true;
381 }
382
383 return &entry;
384 }
385
386 //***************************************************************************
387 // topology::BEAM_2 -- topology::ELEMENT_RANK
388 // 2 nodes with 2 sides defined in 2D/3D
389 //***************************************************************************
391 {
393
394 if (!entry.initialized) {
395 entry.set_valid_spatial_dimensions({false, false, true, true});
396 entry.set_side_topologies({line_2_factory(), line_2_factory()});
397 entry.initialized = true;
398 }
399
400 return &entry;
401 }
402
403 //***************************************************************************
404 // topology::BEAM_3 -- topology::ELEMENT_RANK
405 // 3 nodes with 2 sides defined in 2D/3D
406 //***************************************************************************
408 {
410
411 if (!entry.initialized) {
412 entry.set_valid_spatial_dimensions({false, false, true, true});
413 entry.set_side_topologies({line_3_factory(), line_3_factory()});
414 entry.initialized = true;
415 }
416
417 return &entry;
418 }
419
420 //***************************************************************************
421 // topology::SHELL_LINE -- topology::ELEMENT_RANK
422 // only defined on 2d problems
423 // 2 or 3 nodes with two edges and 2 sides
424 //***************************************************************************
425
427 {
429
430 if (!entry.initialized) {
431 entry.set_valid_spatial_dimensions({false, false, true, false});
432 entry.set_side_topologies({line_2_factory(), line_2_factory()});
433 entry.initialized = true;
434 }
435
436 return &entry;
437 }
438
440 {
442
443 if (!entry.initialized) {
444 entry.set_valid_spatial_dimensions({false, false, true, false});
445 entry.set_side_topologies({line_3_factory(), line_3_factory()});
446 entry.initialized = true;
447 }
448
449 return &entry;
450 }
451
452 //***************************************************************************
453 // topology::SPRING -- topology::ELEM_RANK
454 // 2 or 3 nodes with no sides
455 //***************************************************************************
456
458 {
460
461 if (!entry.initialized) {
462 entry.set_valid_spatial_dimensions({false, true, true, true});
463 entry.set_side_topologies({});
464 entry.initialized = true;
465 }
466
467 return &entry;
468 }
469
471 {
473
474 if (!entry.initialized) {
475 entry.set_valid_spatial_dimensions({false, true, true, true});
476 entry.set_side_topologies({});
477 entry.initialized = true;
478 }
479
480 return &entry;
481 }
482
483 //***************************************************************************
484 // topology::TRIANGLE 2D -- topology::ELEMENT_RANK
485 // defined on spatial dimension 2d
486 // 3, 4, or 6 nodes with 3 edges and 3 sides
487 //***************************************************************************
489 {
491
492 if (!entry.initialized) {
493 entry.set_valid_spatial_dimensions({false, false, true, false});
494 entry.set_side_topologies({line_2_factory(), line_2_factory(), line_2_factory()});
495 entry.initialized = true;
496 }
497
498 return &entry;
499 }
500
502 {
504
505 if (!entry.initialized) {
506 entry.set_valid_spatial_dimensions({false, false, true, false});
507 entry.set_side_topologies({line_2_factory(), line_2_factory(), line_2_factory()});
508 entry.initialized = true;
509 }
510
511 return &entry;
512 }
513
515 {
517
518 if (!entry.initialized) {
519 entry.set_valid_spatial_dimensions({false, false, true, false});
520 entry.set_side_topologies({line_3_factory(), line_3_factory(), line_3_factory()});
521 entry.initialized = true;
522 }
523
524 return &entry;
525 }
526
527 //***************************************************************************
528 // topology::QUADRILATERAL 2D -- topology::ELEMENT_RANK
529 // defined on spatial dimension 2d
530 // 4, 8, or 9 nodes with 4 edges and 4 sides
531 //***************************************************************************
532
534 {
536
537 if (!entry.initialized) {
538 entry.set_valid_spatial_dimensions({false, false, true, false});
540 {line_2_factory(), line_2_factory(), line_2_factory(), line_2_factory()});
541 entry.initialized = true;
542 }
543
544 return &entry;
545 }
546
548 {
550
551 if (!entry.initialized) {
552 entry.set_valid_spatial_dimensions({false, false, true, false});
554 {line_3_factory(), line_3_factory(), line_3_factory(), line_3_factory()});
555 entry.initialized = true;
556 }
557
558 return &entry;
559 }
560
562 {
564
565 if (!entry.initialized) {
566 entry.set_valid_spatial_dimensions({false, false, false, true});
568 {line_3_factory(), line_3_factory(), line_3_factory(), line_3_factory()});
569 entry.initialized = true;
570 }
571
572 return &entry;
573 }
574
575 //***************************************************************************
576 // topology::SHELL topology::TRIANGLE -- topology::ELEMENT_RANK
577 // defined on spatial dimension 3d
578 // 3, 4, or 6 nodes with 3 edges and 2 sides
579 //***************************************************************************
580
582 {
584
585 if (!entry.initialized) {
586 entry.set_valid_spatial_dimensions({false, false, false, true});
587 entry.set_side_topologies({tri_3_factory(), tri_3_factory()});
588 entry.initialized = true;
589 }
590
591 return &entry;
592 }
593
595 {
597
598 if (!entry.initialized) {
599 entry.set_valid_spatial_dimensions({false, false, false, true});
600 entry.set_side_topologies({tri_4_factory(), tri_4_factory()});
601 entry.initialized = true;
602 }
603
604 return &entry;
605 }
606
608 {
610
611 if (!entry.initialized) {
612 entry.set_valid_spatial_dimensions({false, false, false, true});
613 entry.set_side_topologies({tri_6_factory(), tri_6_factory()});
614 entry.initialized = true;
615 }
616
617 return &entry;
618 }
619
620 //***************************************************************************
621 // topology::SHELL topology::QUADRILATERAL -- topology::ELEMENT_RANK
622 // defined on spatial dimension 3d
623 // 4, 8, or 9 nodes with 4 edges and 2 sides
624 //***************************************************************************
626 {
628
629 if (!entry.initialized) {
630 entry.set_valid_spatial_dimensions({false, false, false, true});
631 entry.set_side_topologies({quad_4_factory(), quad_4_factory()});
632 entry.initialized = true;
633 }
634
635 return &entry;
636 }
637
639 {
641
642 if (!entry.initialized) {
643 entry.set_valid_spatial_dimensions({false, false, false, true});
644 entry.set_side_topologies({quad_8_factory(), quad_8_factory()});
645 entry.initialized = true;
646 }
647
648 return &entry;
649 }
650
652 {
654
655 if (!entry.initialized) {
656 entry.set_valid_spatial_dimensions({false, false, false, true});
657 entry.set_side_topologies({quad_9_factory(), quad_9_factory()});
658 entry.initialized = true;
659 }
660
661 return &entry;
662 }
663
664 //***************************************************************************
665 // topology::TETRAHEDRON -- topology::ELEMENT_RANK
666 // defined on spatial dimension 3d
667 // 4, 8, 10 or 11 nodes with 4 sides
668 //***************************************************************************
670 {
672
673 if (!entry.initialized) {
674 entry.set_valid_spatial_dimensions({false, false, false, true});
676 {tri_3_factory(), tri_3_factory(), tri_3_factory(), tri_3_factory()});
677 entry.initialized = true;
678 }
679
680 return &entry;
681 }
682
684 {
686
687 if (!entry.initialized) {
688 entry.set_valid_spatial_dimensions({false, false, false, true});
690 {tri_4_factory(), tri_4_factory(), tri_4_factory(), tri_4_factory()});
691 entry.initialized = true;
692 }
693
694 return &entry;
695 }
696
698 {
700
701 if (!entry.initialized) {
702 entry.set_valid_spatial_dimensions({false, false, false, true});
704 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory()});
705 entry.initialized = true;
706 }
707
708 return &entry;
709 }
710
712 {
714
715 if (!entry.initialized) {
716 entry.set_valid_spatial_dimensions({false, false, false, true});
718 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory()});
719 entry.initialized = true;
720 }
721
722 return &entry;
723 }
724
725 //***************************************************************************
726 // topology::PYRAMID -- topology::ELEMENT_RANK
727 // defined on spatial dimension 3d
728 // 5, 13 or 14 nodes with 5 sides
729 //***************************************************************************
731 {
733
734 if (!entry.initialized) {
735 entry.set_valid_spatial_dimensions({false, false, false, true});
737 {tri_3_factory(), tri_3_factory(), tri_3_factory(), tri_3_factory(), quad_4_factory()});
738 entry.initialized = true;
739 }
740
741 return &entry;
742 }
743
745 {
747
748 if (!entry.initialized) {
749 entry.set_valid_spatial_dimensions({false, false, false, true});
751 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory(), quad_8_factory()});
752 entry.initialized = true;
753 }
754
755 return &entry;
756 }
757
759 {
761
762 if (!entry.initialized) {
763 entry.set_valid_spatial_dimensions({false, false, false, true});
765 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory(), quad_9_factory()});
766 entry.initialized = true;
767 }
768
769 return &entry;
770 }
771
772 //***************************************************************************
773 // topology::WEDGE -- topology::ELEMENT_RANK
774 // defined on spatial dimension 3d
775 // 6, 12, 15 or 18 nodes with 5 sides
776 //***************************************************************************
778 {
780
781 if (!entry.initialized) {
782 entry.set_valid_spatial_dimensions({false, false, false, true});
783 entry.set_side_topologies({quad_4_factory(), quad_4_factory(), quad_4_factory(),
784 tri_3_factory(), tri_3_factory()});
785 entry.initialized = true;
786 }
787
788 return &entry;
789 }
790
792 {
794
795 if (!entry.initialized) {
796 entry.set_valid_spatial_dimensions({false, false, false, true});
797 entry.set_side_topologies({quad_6_factory(), quad_6_factory(), quad_6_factory(),
798 tri_6_factory(), tri_6_factory()});
799 entry.initialized = true;
800 }
801
802 return &entry;
803 }
804
806 {
808
809 if (!entry.initialized) {
810 entry.set_valid_spatial_dimensions({false, false, false, true});
811 entry.set_side_topologies({quad_8_factory(), quad_8_factory(), quad_8_factory(),
812 tri_6_factory(), tri_6_factory()});
813 entry.initialized = true;
814 }
815
816 return &entry;
817 }
818
820 {
822
823 if (!entry.initialized) {
824 entry.set_valid_spatial_dimensions({false, false, false, true});
825 entry.set_side_topologies({quad_9_factory(), quad_9_factory(), quad_9_factory(),
826 tri_6_factory(), tri_6_factory()});
827 entry.initialized = true;
828 }
829
830 return &entry;
831 }
832
833 //***************************************************************************
834 // topology::HEXAHEDRON -- topology::ELEMENT_RANK
835 // defined on spatial dimension 3d
836 // 8, 20 or 27 nodes nodes with 6 sides
837 //***************************************************************************
839 {
841
842 if (!entry.initialized) {
843 entry.set_valid_spatial_dimensions({false, false, false, true});
844 entry.set_side_topologies({quad_4_factory(), quad_4_factory(), quad_4_factory(),
845 quad_4_factory(), quad_4_factory(), quad_4_factory()});
846 entry.initialized = true;
847 }
848
849 return &entry;
850 }
851
853 {
855
856 if (!entry.initialized) {
857 entry.set_valid_spatial_dimensions({false, false, false, true});
858 entry.set_side_topologies({quad_8_factory(), quad_8_factory(), quad_8_factory(),
859 quad_8_factory(), quad_8_factory(), quad_8_factory()});
860 entry.initialized = true;
861 }
862
863 return &entry;
864 }
865
867 {
869
870 if (!entry.initialized) {
871 entry.set_valid_spatial_dimensions({false, false, false, true});
872 entry.set_side_topologies({quad_9_factory(), quad_9_factory(), quad_9_factory(),
873 quad_9_factory(), quad_9_factory(), quad_9_factory()});
874 entry.initialized = true;
875 }
876
877 return &entry;
878 }
879
880 private:
881 bool equivalent_valid_spatial_dimensions(const DimensionArray &validSpatialDimensions_) const
882 {
883 return validSpatialDimensions[0] == validSpatialDimensions_[0] &&
884 validSpatialDimensions[1] == validSpatialDimensions_[1] &&
885 validSpatialDimensions[2] == validSpatialDimensions_[2] &&
886 validSpatialDimensions[3] == validSpatialDimensions_[3];
887 }
888
889 void set_valid_spatial_dimensions(const DimensionArray &validSpatialDimensions_)
890 {
891 validSpatialDimensions[0] = validSpatialDimensions_[0];
892 validSpatialDimensions[1] = validSpatialDimensions_[1];
893 validSpatialDimensions[2] = validSpatialDimensions_[2];
894 validSpatialDimensions[3] = validSpatialDimensions_[3];
895 }
896
897 // Create and set TopologyMapEntry based side topologies since some of the implementation
898 // details of the class cannot be automatically constructed from the Ioss_ElementTopology
899 // object .. this will not be necessary if/when they are migrated to Ioss_ElementTopology
900 void set_side_topologies(const std::vector<TopologyMapEntry *> &sideTopologies_)
901 {
902 int numSides = sideTopologies_.size();
903
904 for (int side = 1; side <= numSides; side++) {
905 if (topology->boundary_type(side) != sideTopologies_[side - 1]->topology) {
906 std::ostringstream errmsg;
907 fmt::print(errmsg,
908 "ERROR: For element topology: {} on side: {}, expected topology: {} does not "
909 "match topology: {}",
910 topology->name(), side, topology->boundary_type(side)->name(),
911 sideTopologies_[side - 1]->topology->name());
912 IOSS_ERROR(errmsg);
913 }
914 }
915
916 sideTopologies = sideTopologies_;
917 }
918
919 unsigned num_permutation_nodes() const
920 {
921 return topology->permutation()->num_permutation_nodes();
922 }
923
924 unsigned int id{0};
925 Ioss::ElementTopology *topology = nullptr;
926
927 std::vector<TopologyMapEntry *> sideTopologies{};
928
929 // Defines what spatial dimension the topology is valid on
931
932 bool initialized{false};
933 };
934
935 inline std::ostream &operator<<(std::ostream &out, const TopologyMapEntry &t)
936 {
937 return out << t.name();
938 }
939
940 class IOTM_EXPORT IossTopologyMapping : public text_mesh::TopologyMapping<TopologyMapEntry>
941 {
942 public:
944
945 // clang-format off
947 {
948 m_nameToTopology = {
949 {"NODE", *TopologyMapEntry::node_factory()},
950 {"LINE_2", *TopologyMapEntry::line_2_factory()},
951 {"LINE_3", *TopologyMapEntry::line_3_factory()},
952 {"TRI_3", *TopologyMapEntry::tri_3_factory()},
953 {"TRI_4", *TopologyMapEntry::tri_4_factory()},
954 {"TRI_6", *TopologyMapEntry::tri_6_factory()},
955 {"QUAD_4", *TopologyMapEntry::quad_4_factory()},
956 {"QUAD_6", *TopologyMapEntry::quad_6_factory()},
957 {"QUAD_8", *TopologyMapEntry::quad_8_factory()},
958 {"QUAD_9", *TopologyMapEntry::quad_9_factory()},
959 {"PARTICLE", *TopologyMapEntry::particle_factory()},
960 {"LINE_2_1D", *TopologyMapEntry::line_2_1d_factory()},
961 {"LINE_3_1D", *TopologyMapEntry::line_3_1d_factory()},
962 {"BEAM_2", *TopologyMapEntry::beam_2_factory()},
963 {"BEAM_3", *TopologyMapEntry::beam_3_factory()},
964 {"SHELL_LINE_2", *TopologyMapEntry::shell_line_2_factory()},
965 {"SHELL_LINE_3", *TopologyMapEntry::shell_line_3_factory()},
966 {"SPRING_2", *TopologyMapEntry::spring_2_factory()},
967 {"SPRING_3", *TopologyMapEntry::spring_3_factory()},
968 {"TRI_3_2D", *TopologyMapEntry::tri_3_2d_factory()},
969 {"TRI_4_2D", *TopologyMapEntry::tri_4_2d_factory()},
970 {"TRI_6_2D", *TopologyMapEntry::tri_6_2d_factory()},
971 {"QUAD_4_2D", *TopologyMapEntry::quad_4_2d_factory()},
972 {"QUAD_8_2D", *TopologyMapEntry::quad_8_2d_factory()},
973 {"QUAD_9_2D", *TopologyMapEntry::quad_9_2d_factory()},
974 {"SHELL_TRI_3", *TopologyMapEntry::shell_tri_3_factory()},
975 {"SHELL_TRI_4", *TopologyMapEntry::shell_tri_4_factory()},
976 {"SHELL_TRI_6", *TopologyMapEntry::shell_tri_6_factory()},
977 {"SHELL_QUAD_4", *TopologyMapEntry::shell_quad_4_factory()},
978 {"SHELL_QUAD_8", *TopologyMapEntry::shell_quad_8_factory()},
979 {"SHELL_QUAD_9", *TopologyMapEntry::shell_quad_9_factory()},
980 {"TET_4", *TopologyMapEntry::tet_4_factory()},
981 {"TET_8", *TopologyMapEntry::tet_8_factory()},
982 {"TET_10", *TopologyMapEntry::tet_10_factory()},
983 {"TET_11", *TopologyMapEntry::tet_11_factory()},
984 {"PYRAMID_5", *TopologyMapEntry::pyramid_5_factory()},
985 {"PYRAMID_13", *TopologyMapEntry::pyramid_13_factory()},
986 {"PYRAMID_14", *TopologyMapEntry::pyramid_14_factory()},
987 {"WEDGE_6", *TopologyMapEntry::wedge_6_factory()},
988 {"WEDGE_12", *TopologyMapEntry::wedge_12_factory()},
989 {"WEDGE_15", *TopologyMapEntry::wedge_15_factory()},
990 {"WEDGE_18", *TopologyMapEntry::wedge_18_factory()},
991 {"HEX_8", *TopologyMapEntry::hex_8_factory()},
992 {"HEX_20", *TopologyMapEntry::hex_20_factory()},
993 {"HEX_27", *TopologyMapEntry::hex_27_factory()}
994 };
995 }
996 // clang-format on
997 };
998} // namespace Iotm
void IOSS_ERROR(const std::ostringstream &errmsg)
Definition Ioss_Utils.h:38
static const char * name
Definition Ioss_Beam2.h:21
static const char * name
Definition Ioss_Beam3.h:21
static const char * name
Definition Ioss_Edge2.h:21
static const char * name
Definition Ioss_Edge3.h:21
Represents an element topology.
Definition Ioss_ElementTopology.h:69
IOSS_NODISCARD const std::string & name() const
Definition Ioss_ElementTopology.h:79
IOSS_NODISCARD ElementTopology * boundary_type(int face_number=0) const
Definition Ioss_ElementTopology.C:302
virtual IOSS_NODISCARD int number_nodes() const =0
static const char * name
Definition Ioss_Hex20.h:21
static const char * name
Definition Ioss_Hex27.h:21
static const char * name
Definition Ioss_Hex8.h:21
static const char * name
Definition Ioss_Node.h:21
static const char * name
Definition Ioss_Pyramid13.h:21
static const char * name
Definition Ioss_Pyramid14.h:21
static const char * name
Definition Ioss_Pyramid5.h:22
static const char * name
Definition Ioss_Quad4.h:21
static const char * name
Definition Ioss_Quad6.h:21
static const char * name
Definition Ioss_Quad8.h:21
static const char * name
Definition Ioss_Quad9.h:21
static const char * name
Definition Ioss_Shell4.h:21
static const char * name
Definition Ioss_Shell8.h:21
static const char * name
Definition Ioss_Shell9.h:21
static const char * name
Definition Ioss_ShellLine2D2.h:21
static const char * name
Definition Ioss_ShellLine2D3.h:21
static const char * name
Definition Ioss_Sphere.h:22
static const char * name
Definition Ioss_Spring2.h:21
static const char * name
Definition Ioss_Spring3.h:21
static const char * name
Definition Ioss_Tet10.h:21
static const char * name
Definition Ioss_Tet11.h:21
static const char * name
Definition Ioss_Tet4.h:22
static const char * name
Definition Ioss_Tet8.h:21
static const char * name
Definition Ioss_Tri3.h:21
static const char * name
Definition Ioss_Tri4.h:22
static const char * name
Definition Ioss_Tri6.h:22
static const char * name
Definition Ioss_TriShell3.h:22
static const char * name
Definition Ioss_TriShell4.h:22
static const char * name
Definition Ioss_TriShell6.h:22
static const char * name
Definition Ioss_Wedge12.h:22
static const char * name
Definition Ioss_Wedge15.h:22
static const char * name
Definition Ioss_Wedge18.h:22
static const char * name
Definition Ioss_Wedge6.h:22
Definition Iotm_TextMeshTopologyMapping.h:941
TopologyMapEntry invalid_topology() const override
Definition Iotm_TextMeshTopologyMapping.h:943
void initialize_topology_map() override
Definition Iotm_TextMeshTopologyMapping.h:946
Definition Iotm_TextMeshTopologyMapping.h:34
static TopologyMapEntry * shell_quad_8_factory()
Definition Iotm_TextMeshTopologyMapping.h:638
static TopologyMapEntry * shell_tri_6_factory()
Definition Iotm_TextMeshTopologyMapping.h:607
static TopologyMapEntry * wedge_18_factory()
Definition Iotm_TextMeshTopologyMapping.h:819
static TopologyMapEntry * spring_2_factory()
Definition Iotm_TextMeshTopologyMapping.h:457
bool operator==(const TopologyMapEntry &rhs) const
Definition Iotm_TextMeshTopologyMapping.h:76
static TopologyMapEntry * tri_4_factory()
Definition Iotm_TextMeshTopologyMapping.h:286
static TopologyMapEntry * pyramid_14_factory()
Definition Iotm_TextMeshTopologyMapping.h:758
static TopologyMapEntry * line_3_1d_factory()
Definition Iotm_TextMeshTopologyMapping.h:255
static TopologyMapEntry * line_3_factory()
Definition Iotm_TextMeshTopologyMapping.h:238
static TopologyMapEntry * quad_8_factory()
Definition Iotm_TextMeshTopologyMapping.h:343
static TopologyMapEntry * tri_3_2d_factory()
Definition Iotm_TextMeshTopologyMapping.h:488
std::vector< Ordinal > side_topology_node_indices(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:130
static TopologyMapEntry * shell_line_3_factory()
Definition Iotm_TextMeshTopologyMapping.h:439
static TopologyMapEntry * pyramid_5_factory()
Definition Iotm_TextMeshTopologyMapping.h:730
uint8_t Permutation
Definition Iotm_TextMeshTopologyMapping.h:37
static TopologyMapEntry * wedge_6_factory()
Definition Iotm_TextMeshTopologyMapping.h:777
static TopologyMapEntry * shell_tri_4_factory()
Definition Iotm_TextMeshTopologyMapping.h:594
bool equivalent_valid_spatial_dimensions(const DimensionArray &validSpatialDimensions_) const
Definition Iotm_TextMeshTopologyMapping.h:881
static TopologyMapEntry * tet_4_factory()
Definition Iotm_TextMeshTopologyMapping.h:669
unsigned num_positive_permutations() const
Definition Iotm_TextMeshTopologyMapping.h:151
static TopologyMapEntry * beam_2_factory()
Definition Iotm_TextMeshTopologyMapping.h:390
bool defined_on_spatial_dimension(const unsigned spatialDim) const
Definition Iotm_TextMeshTopologyMapping.h:64
bool valid_permutation(Permutation permutation) const
Definition Iotm_TextMeshTopologyMapping.h:161
static TopologyMapEntry * tri_6_factory()
Definition Iotm_TextMeshTopologyMapping.h:299
void set_valid_spatial_dimensions(const DimensionArray &validSpatialDimensions_)
Definition Iotm_TextMeshTopologyMapping.h:889
static TopologyMapEntry * quad_9_factory()
Definition Iotm_TextMeshTopologyMapping.h:356
TopologyMapEntry & operator=(const TopologyMapEntry &topo)=default
static TopologyMapEntry * tet_11_factory()
Definition Iotm_TextMeshTopologyMapping.h:711
bool operator==(const Ioss::ElementTopology *topo) const
Definition Iotm_TextMeshTopologyMapping.h:62
static TopologyMapEntry * hex_27_factory()
Definition Iotm_TextMeshTopologyMapping.h:866
static TopologyMapEntry * quad_4_2d_factory()
Definition Iotm_TextMeshTopologyMapping.h:533
bool is_shell() const
Definition Iotm_TextMeshTopologyMapping.h:147
void set_side_topologies(const std::vector< TopologyMapEntry * > &sideTopologies_)
Definition Iotm_TextMeshTopologyMapping.h:900
unsigned num_permutation_nodes() const
Definition Iotm_TextMeshTopologyMapping.h:919
TopologyMapEntry()
Definition Iotm_TextMeshTopologyMapping.h:44
bool fill_permutation_indices(Permutation permutation, std::vector< Ordinal > &nodeOrdinalVector) const
Definition Iotm_TextMeshTopologyMapping.h:166
static TopologyMapEntry * shell_line_2_factory()
Definition Iotm_TextMeshTopologyMapping.h:426
TopologyMapEntry(const TopologyMapEntry &topo)=default
static TopologyMapEntry * shell_quad_4_factory()
Definition Iotm_TextMeshTopologyMapping.h:625
unsigned side_topology_num_nodes(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:121
static TopologyMapEntry * line_2_factory()
Definition Iotm_TextMeshTopologyMapping.h:204
int num_sides() const
Definition Iotm_TextMeshTopologyMapping.h:84
TopologyMapEntry(const std::string &name)
Definition Iotm_TextMeshTopologyMapping.h:52
bool valid_side(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:97
static TopologyMapEntry * wedge_15_factory()
Definition Iotm_TextMeshTopologyMapping.h:805
const std::string name() const
Definition Iotm_TextMeshTopologyMapping.h:72
static TopologyMapEntry * shell_quad_9_factory()
Definition Iotm_TextMeshTopologyMapping.h:651
static TopologyMapEntry * tri_6_2d_factory()
Definition Iotm_TextMeshTopologyMapping.h:514
static TopologyMapEntry * pyramid_13_factory()
Definition Iotm_TextMeshTopologyMapping.h:744
static TopologyMapEntry * tet_10_factory()
Definition Iotm_TextMeshTopologyMapping.h:697
static TopologyMapEntry * quad_4_factory()
Definition Iotm_TextMeshTopologyMapping.h:317
int num_nodes() const
Definition Iotm_TextMeshTopologyMapping.h:74
uint16_t Ordinal
Definition Iotm_TextMeshTopologyMapping.h:36
Ioss::ElementTopology * topology
Definition Iotm_TextMeshTopologyMapping.h:925
static TopologyMapEntry * shell_tri_3_factory()
Definition Iotm_TextMeshTopologyMapping.h:581
static TopologyMapEntry * particle_factory()
Definition Iotm_TextMeshTopologyMapping.h:373
static TopologyMapEntry * tri_4_2d_factory()
Definition Iotm_TextMeshTopologyMapping.h:501
unsigned int id
Definition Iotm_TextMeshTopologyMapping.h:924
bool is_positive_polarity(Permutation permutation) const
Definition Iotm_TextMeshTopologyMapping.h:156
unsigned num_permutations() const
Definition Iotm_TextMeshTopologyMapping.h:149
static TopologyMapEntry * quad_9_2d_factory()
Definition Iotm_TextMeshTopologyMapping.h:561
bool initialized
Definition Iotm_TextMeshTopologyMapping.h:932
static TopologyMapEntry * tet_8_factory()
Definition Iotm_TextMeshTopologyMapping.h:683
static TopologyMapEntry * quad_8_2d_factory()
Definition Iotm_TextMeshTopologyMapping.h:547
bool[4] DimensionArray
Definition Iotm_TextMeshTopologyMapping.h:42
std::string side_topology_name(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:105
std::vector< Ordinal > permutation_indices(Permutation permutation) const
Definition Iotm_TextMeshTopologyMapping.h:172
static TopologyMapEntry * invalid_topology_factory()
Definition Iotm_TextMeshTopologyMapping.h:177
static TopologyMapEntry * quad_6_factory()
Definition Iotm_TextMeshTopologyMapping.h:330
const TopologyMapEntry & side_topology(unsigned side) const
Definition Iotm_TextMeshTopologyMapping.h:114
static TopologyMapEntry * tri_3_factory()
Definition Iotm_TextMeshTopologyMapping.h:273
static TopologyMapEntry * node_factory()
Definition Iotm_TextMeshTopologyMapping.h:187
static TopologyMapEntry * hex_20_factory()
Definition Iotm_TextMeshTopologyMapping.h:852
static TopologyMapEntry * beam_3_factory()
Definition Iotm_TextMeshTopologyMapping.h:407
bool operator!=(const TopologyMapEntry &rhs) const
Definition Iotm_TextMeshTopologyMapping.h:82
DimensionArray validSpatialDimensions
Definition Iotm_TextMeshTopologyMapping.h:930
static TopologyMapEntry * hex_8_factory()
Definition Iotm_TextMeshTopologyMapping.h:838
static TopologyMapEntry * spring_3_factory()
Definition Iotm_TextMeshTopologyMapping.h:470
static TopologyMapEntry * line_2_1d_factory()
Definition Iotm_TextMeshTopologyMapping.h:221
static TopologyMapEntry * wedge_12_factory()
Definition Iotm_TextMeshTopologyMapping.h:791
Definition Iotm_TextMeshDataTypes.h:39
The main namespace for the Ioss library.
Definition Ioad_DatabaseIO.C:40
std::vector< int > IntVector
Definition Ioss_CodeTypes.h:21
A namespace for the generated database format.
Definition Iotm_DatabaseIO.C:95
std::ostream & operator<<(std::ostream &out, const TopologyMapEntry &t)
Definition Iotm_TextMeshTopologyMapping.h:935