9#include "iotm_export.h"
18#include <unordered_map>
23#include <fmt/ostream.h>
39 static constexpr Ordinal InvalidOrdinal = 65535;
45 : id(
Ioss::ElementTopology::get_unique_id(std::string(
Ioss::Unknown::name))),
46 topology(
Ioss::ElementTopology::factory(std::string(
Ioss::Unknown::name))),
49 set_valid_spatial_dimensions({
false,
false,
false,
false});
53 : id(
Ioss::ElementTopology::get_unique_id(name)),
54 topology(
Ioss::ElementTopology::factory(name)), initialized(false)
56 set_valid_spatial_dimensions({
false,
false,
false,
false});
69 return validSpatialDimensions[spatialDim];
72 const std::string
name()
const {
return topology->name(); }
74 int num_nodes()
const {
return topology->number_nodes(); }
78 return id == rhs.
id && topology == rhs.
topology &&
86 if (topology->is_shell()) {
88 if (topology->parametric_dimension() == 2) {
89 return topology->number_faces();
93 return topology->number_boundaries();
99 unsigned numSides = num_sides();
100 if (side > 0 && side <= numSides)
107 if (!valid_side(side))
111 return sideTopology->
name();
116 if (!valid_side(side))
117 return *(invalid_topology_factory());
118 return *sideTopologies[side - 1];
123 if (!valid_side(side))
132 if (!valid_side(side))
133 return std::vector<Ordinal>();
136 std::vector<Ordinal> elementNodeOrdinalVector(sideTopology->
number_nodes());
140 for (
int i = 0; i < sideTopology->
number_nodes(); i++) {
141 elementNodeOrdinalVector[i] = connectivity[i];
144 return elementNodeOrdinalVector;
147 bool is_shell()
const {
return topology->is_shell(); }
153 return topology->permutation()->num_positive_permutations();
158 return topology->permutation()->is_positive_polarity(permutation);
163 return topology->permutation()->valid_permutation(permutation);
167 std::vector<Ordinal> &nodeOrdinalVector)
const
169 return topology->permutation()->fill_permutation_indices(permutation, nodeOrdinalVector);
174 return topology->permutation()->permutation_indices(permutation);
540 {line_2_factory(), line_2_factory(), line_2_factory(), line_2_factory()});
554 {line_3_factory(), line_3_factory(), line_3_factory(), line_3_factory()});
568 {line_3_factory(), line_3_factory(), line_3_factory(), line_3_factory()});
676 {tri_3_factory(), tri_3_factory(), tri_3_factory(), tri_3_factory()});
690 {tri_4_factory(), tri_4_factory(), tri_4_factory(), tri_4_factory()});
704 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory()});
718 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory()});
737 {tri_3_factory(), tri_3_factory(), tri_3_factory(), tri_3_factory(), quad_4_factory()});
751 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory(), quad_8_factory()});
765 {tri_6_factory(), tri_6_factory(), tri_6_factory(), tri_6_factory(), quad_9_factory()});
784 tri_3_factory(), tri_3_factory()});
798 tri_6_factory(), tri_6_factory()});
812 tri_6_factory(), tri_6_factory()});
826 tri_6_factory(), tri_6_factory()});
845 quad_4_factory(), quad_4_factory(), quad_4_factory()});
859 quad_8_factory(), quad_8_factory(), quad_8_factory()});
873 quad_9_factory(), quad_9_factory(), quad_9_factory()});
883 return validSpatialDimensions[0] == validSpatialDimensions_[0] &&
884 validSpatialDimensions[1] == validSpatialDimensions_[1] &&
885 validSpatialDimensions[2] == validSpatialDimensions_[2] &&
886 validSpatialDimensions[3] == validSpatialDimensions_[3];
891 validSpatialDimensions[0] = validSpatialDimensions_[0];
892 validSpatialDimensions[1] = validSpatialDimensions_[1];
893 validSpatialDimensions[2] = validSpatialDimensions_[2];
894 validSpatialDimensions[3] = validSpatialDimensions_[3];
902 int numSides = sideTopologies_.size();
904 for (
int side = 1; side <= numSides; side++) {
905 if (topology->boundary_type(side) != sideTopologies_[side - 1]->topology) {
906 std::ostringstream 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());
916 sideTopologies = sideTopologies_;
921 return topology->permutation()->num_permutation_nodes();
927 std::vector<TopologyMapEntry *> sideTopologies{};
932 bool initialized{
false};
937 return out << t.
name();
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()}
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