IOSS 2.0
Loading...
Searching...
No Matches
Ioss_ElementTopology.h
Go to the documentation of this file.
1// Copyright(C) 1999-2025 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 "Ioss_CodeTypes.h"
10#include "Ioss_ElementPermutation.h" // for ElementPermutation
11#include <map> // for map, map<>::value_compare
12#include <set> // for set
13#include <string> // for string, operator<
14#include <vector> // for vector
15
16#include "ioss_export.h"
17
18namespace Ioss {
19 class ElementTopology;
21} // namespace Ioss
22
23namespace Ioss {
38
39 using ElementShapeMap = std::map<ElementShape, std::string>;
40 using ElementTopologyMap = std::map<std::string, ElementTopology *, std::less<>>;
41 using ETM_VP = ElementTopologyMap::value_type;
42
43 class IOSS_EXPORT ETRegistry
44 {
45 public:
46 void insert(const Ioss::ETM_VP &value, bool delete_me);
47 IOSS_NODISCARD ElementTopologyMap::iterator begin() { return m_registry.begin(); }
48 IOSS_NODISCARD ElementTopologyMap::iterator end() { return m_registry.end(); }
49 IOSS_NODISCARD ElementTopologyMap::iterator find(const std::string &type)
50 {
51 return m_registry.find(type);
52 }
53
54 ETRegistry() = default;
55 ETRegistry(const ETRegistry &) = delete;
56 ETRegistry &operator=(const ETRegistry &) = delete;
57 ETRegistry(ETRegistry &&) = delete;
60
61 private:
63 std::vector<Ioss::ElementTopology *> m_deleteThese;
64 };
65
66 // ========================================================================
67
68 /** \brief Represents an element topology.
69 *
70 * Defines node, edge, and face connectivity information of an element.
71 */
72 class IOSS_EXPORT ElementTopology
73 {
74 public:
75 void alias(const std::string &base, const std::string &syn);
76 IOSS_NODISCARD bool is_alias(const std::string &my_alias) const;
77
82
83 virtual ~ElementTopology() = default;
84
85 IOSS_NODISCARD const std::string &name() const { return name_; }
86
87 //: Return the Sierra master element name corresponding to this
88 //: element topology. Somewhat klugy coupling between IO subsystem
89 //: and Sierra, but least klugy I could think of...
91
92 //: Return basic shape...
93 IOSS_NODISCARD virtual ElementShape shape() const = 0;
94
95 //: Return whether the topology describes an "element". If it
96 //: isn't an element, then it is a component of an element. For
97 // example, a quadrilateral Shell is an element, but a QuadFace is
98 // not.
99 //
100 // Default implementation returns true if spatial_dimension() ==
101 // parametric_dimension(), otherwise returns false;
102 // "Structural" elements (shells, rods, trusses, particles) need
103 // to override.
104 IOSS_NODISCARD virtual bool is_element() const;
105 IOSS_NODISCARD virtual bool is_shell() const = 0;
106 IOSS_NODISCARD virtual int spatial_dimension() const = 0;
107 IOSS_NODISCARD virtual int parametric_dimension() const = 0;
108 IOSS_NODISCARD virtual int order() const = 0;
109
110 IOSS_NODISCARD virtual bool edges_similar() const; // true if all edges have same topology
111 IOSS_NODISCARD virtual bool faces_similar() const; // true if all faces have same topology
112
113 IOSS_NODISCARD virtual int number_corner_nodes() const = 0;
114 IOSS_NODISCARD virtual int number_nodes() const = 0;
115 IOSS_NODISCARD virtual int number_edges() const = 0;
116 IOSS_NODISCARD virtual int number_faces() const = 0;
118
119 IOSS_NODISCARD virtual int number_nodes_edge(int edge = 0) const = 0;
120 IOSS_NODISCARD virtual int number_nodes_face(int face = 0) const = 0;
121 IOSS_NODISCARD virtual int number_edges_face(int face = 0) const = 0;
122
123 IOSS_NODISCARD IntVector boundary_connectivity(int edge_number) const;
124 IOSS_NODISCARD virtual IntVector edge_connectivity(int edge_number) const = 0;
125 IOSS_NODISCARD virtual IntVector face_connectivity(int face_number) const = 0;
127
128 // These have default implementations in ElementTopology.
129 // The defaults simply fill in the vector with 0..num.
130 // For 'face_edge_connectivity', this is sufficient for 2d
131 // elements, 3d need to override.
132 // For 'element_edge_connectivity', this works for all elements.
133 IOSS_NODISCARD virtual IntVector face_edge_connectivity(int face_number) const;
135
136 IOSS_NODISCARD ElementTopology *boundary_type(int face_number = 0) const;
137 IOSS_NODISCARD virtual ElementTopology *face_type(int face_number = 0) const = 0;
138 IOSS_NODISCARD virtual ElementTopology *edge_type(int edge_number = 0) const = 0;
139
140 IOSS_NODISCARD static ElementTopology *factory(const std::string &type,
141 bool ok_to_fail = false);
142 IOSS_NODISCARD static ElementTopology *factory(unsigned int unique_id);
143 IOSS_NODISCARD static unsigned int get_unique_id(const std::string &type);
144 static int describe(NameList *names);
146
147 IOSS_NODISCARD bool operator==(const Ioss::ElementTopology &rhs) const;
148 IOSS_NODISCARD bool operator!=(const Ioss::ElementTopology &rhs) const;
149 IOSS_NODISCARD bool equal(const Ioss::ElementTopology &rhs) const;
150
152 IOSS_NODISCARD virtual const std::string &base_topology_permutation_name() const;
153
154 protected:
155 ElementTopology(std::string type, std::string master_elem_name, bool delete_me = false);
156 IOSS_NODISCARD virtual bool validate_permutation_nodes() const { return true; }
157
158 private:
159 IOSS_NODISCARD bool equal_(const Ioss::ElementTopology &rhs, bool quiet) const;
160 const std::string name_;
161 const std::string masterElementName_;
162
163 static const std::string &topology_shape_to_permutation_name(Ioss::ElementShape topoShape);
164
165 static ETRegistry &registry();
166 };
167} // namespace Ioss
#define IOSS_NODISCARD
Definition Ioss_CodeTypes.h:57
Definition Ioss_ElementTopology.h:44
std::vector< Ioss::ElementTopology * > m_deleteThese
Definition Ioss_ElementTopology.h:63
ETRegistry(const ETRegistry &)=delete
IOSS_NODISCARD ElementTopologyMap::iterator find(const std::string &type)
Definition Ioss_ElementTopology.h:49
IOSS_NODISCARD ElementTopologyMap::iterator end()
Definition Ioss_ElementTopology.h:48
IOSS_NODISCARD ElementTopologyMap::iterator begin()
Definition Ioss_ElementTopology.h:47
ETRegistry()=default
ETRegistry & operator=(const ETRegistry &)=delete
void insert(const Ioss::ETM_VP &value, bool delete_me)
Definition Ioss_ElementTopology.C:21
ETRegistry & operator=(ETRegistry &&)=delete
Ioss::ElementTopologyMap m_registry
Definition Ioss_ElementTopology.h:62
ETRegistry(ETRegistry &&)=delete
Definition Ioss_ElementPermutation.h:60
Represents an element topology.
Definition Ioss_ElementTopology.h:73
virtual IOSS_NODISCARD ElementTopology * face_type(int face_number=0) const =0
static const std::string & topology_shape_to_permutation_name(Ioss::ElementShape topoShape)
Definition Ioss_ElementTopology.C:401
virtual IOSS_NODISCARD ElementShape shape() const =0
IOSS_NODISCARD const std::string & name() const
Definition Ioss_ElementTopology.h:85
virtual IOSS_NODISCARD int number_corner_nodes() const =0
virtual IOSS_NODISCARD IntVector element_connectivity() const =0
virtual IOSS_NODISCARD bool edges_similar() const
Definition Ioss_ElementTopology.C:64
IOSS_NODISCARD ElementTopology * boundary_type(int face_number=0) const
Definition Ioss_ElementTopology.C:300
static IOSS_NODISCARD ElementTopology * factory(const std::string &type, bool ok_to_fail=false)
Definition Ioss_ElementTopology.C:67
virtual IOSS_NODISCARD bool validate_permutation_nodes() const
Definition Ioss_ElementTopology.h:156
virtual IOSS_NODISCARD bool is_element() const
Definition Ioss_ElementTopology.C:220
IOSS_NODISCARD IntVector element_edge_connectivity() const
Definition Ioss_ElementTopology.C:199
virtual IOSS_NODISCARD bool faces_similar() const
Definition Ioss_ElementTopology.C:65
ElementTopology(const ElementTopology &)=delete
virtual IOSS_NODISCARD int number_nodes() const =0
virtual IOSS_NODISCARD int number_edges() const =0
virtual IOSS_NODISCARD int number_edges_face(int face=0) const =0
virtual IOSS_NODISCARD int order() const =0
virtual IOSS_NODISCARD int number_nodes_face(int face=0) const =0
const std::string name_
Definition Ioss_ElementTopology.h:160
virtual IOSS_NODISCARD IntVector face_edge_connectivity(int face_number) const
Definition Ioss_ElementTopology.C:184
virtual IOSS_NODISCARD int parametric_dimension() const =0
IOSS_NODISCARD int number_boundaries() const
Definition Ioss_ElementTopology.C:227
static int describe(NameList *names)
Get the names of element topologies known to Ioss.
Definition Ioss_ElementTopology.C:174
IOSS_NODISCARD std::string master_element_name() const
Definition Ioss_ElementTopology.h:90
IOSS_NODISCARD bool equal(const Ioss::ElementTopology &rhs) const
Definition Ioss_ElementTopology.C:375
ElementTopology(ElementTopology &&)=delete
const std::string masterElementName_
Definition Ioss_ElementTopology.h:161
virtual ~ElementTopology()=default
virtual IOSS_NODISCARD const std::string & base_topology_permutation_name() const
Definition Ioss_ElementTopology.C:395
virtual IOSS_NODISCARD int spatial_dimension() const =0
IOSS_NODISCARD bool is_alias(const std::string &my_alias) const
Definition Ioss_ElementTopology.C:210
IOSS_NODISCARD bool operator!=(const Ioss::ElementTopology &rhs) const
Definition Ioss_ElementTopology.C:370
static IOSS_NODISCARD unsigned int get_unique_id(const std::string &type)
Definition Ioss_ElementTopology.C:137
IOSS_NODISCARD IntVector boundary_connectivity(int edge_number) const
Definition Ioss_ElementTopology.C:260
virtual IOSS_NODISCARD bool is_shell() const =0
ElementTopology & operator=(ElementTopology &&)=delete
virtual IOSS_NODISCARD int number_faces() const =0
IOSS_NODISCARD bool operator==(const Ioss::ElementTopology &rhs) const
Definition Ioss_ElementTopology.C:365
virtual IOSS_NODISCARD int number_nodes_edge(int edge=0) const =0
virtual IOSS_NODISCARD ElementTopology * edge_type(int edge_number=0) const =0
static ETRegistry & registry()
Definition Ioss_ElementTopology.C:58
virtual IOSS_NODISCARD IntVector edge_connectivity(int edge_number) const =0
void alias(const std::string &base, const std::string &syn)
Definition Ioss_ElementTopology.C:49
virtual IOSS_NODISCARD IntVector face_connectivity(int face_number) const =0
IOSS_NODISCARD ElementPermutation * permutation() const
Definition Ioss_ElementTopology.C:380
ElementTopology & operator=(const ElementTopology &)=delete
The main namespace for the Ioss library.
Definition Ioad_DatabaseIO.C:40
ElementShape
Definition Ioss_ElementTopology.h:24
@ LINE
Definition Ioss_ElementTopology.h:28
@ TET
Definition Ioss_ElementTopology.h:32
@ SPRING
Definition Ioss_ElementTopology.h:29
@ TRI
Definition Ioss_ElementTopology.h:30
@ WEDGE
Definition Ioss_ElementTopology.h:34
@ HEX
Definition Ioss_ElementTopology.h:35
@ UNKNOWN
Definition Ioss_ElementTopology.h:25
@ SPHERE
Definition Ioss_ElementTopology.h:27
@ POINT
Definition Ioss_ElementTopology.h:26
@ QUAD
Definition Ioss_ElementTopology.h:31
@ PYRAMID
Definition Ioss_ElementTopology.h:33
@ SUPER
Definition Ioss_ElementTopology.h:36
std::map< std::string, ElementTopology *, std::less<> > ElementTopologyMap
Definition Ioss_ElementTopology.h:40
std::vector< int > IntVector
Definition Ioss_CodeTypes.h:21
Ioss::NameList NameList
Definition Ioss_ChangeSetFactory.h:25
std::map< ElementShape, std::string > ElementShapeMap
Definition Ioss_ElementTopology.h:39
ElementTopologyMap::value_type ETM_VP
Definition Ioss_ElementTopology.h:41