9 #include <stk_util/unit_test_support/stk_utest_macros.hpp> 10 #include <stk_util/parallel/Parallel.hpp> 12 #include <Ioss_ConcreteVariableType.h> 13 #include <Ioss_Initializer.h> 14 #include <Ioss_VariableType.h> 15 #include <Ioss_Utils.h> 17 #include <Ioss_ElementTopology.h> 19 #include <stk_io/IossBridge.hpp> 20 #include <Shards_CellTopology.hpp> 25 template<
typename T,
typename U>
26 int my_assert(T a, T b, U msg) {
28 std::cerr <<
"\tERROR: '" << msg <<
"' assertion failed: " << a <<
" is not equal to " << b <<
"\n";
36 int testElement(
const std::string &name)
39 Ioss::ElementTopology *element = Ioss::ElementTopology::factory(name);
40 if (element == NULL) {
41 std::cerr <<
"\tERROR: Element type '" << name <<
"' could not be constructed.";
45 if (element->name() != name) {
47 std::cerr <<
"Element '" << name <<
"' is an alias for element '" << element->name() <<
"'\n";
51 std::cerr <<
"Testing element '" << name <<
"'\n";
53 if (element->name() ==
"unknown" ||
54 element->name() ==
"tetra7" || element->name() ==
"tetra11" ||
55 element->name() ==
"tetra14" || element->name() ==
"tetra15" ||
56 element->name() ==
"tri7" ||
57 element->name() ==
"trishell4" || element->name() ==
"trishell7" ||
58 element->name() ==
"wedge20" || element->name() ==
"wedge21" ||
59 element->name() ==
"wedge16") {
60 std::cerr <<
"\tERROR (EXPECTED): No support for '" << element->name() <<
"'\n";
66 if (cell_data == NULL) {
67 std::cerr <<
"\tERROR: Could not find a shards CellTopology corresponding to the Ioss::ElementTopology element '" 76 Ioss::ElementTopology *new_element = Ioss::ElementTopology::factory(new_name);
77 if (element->name() != new_element->name()) {
78 std::cerr <<
"\tERROR: New name = '" << new_element->name()
79 <<
"' doesn't match old name '" << element->name()
84 shards::CellTopology cell(cell_data);
92 errors += my_assert(cell.getNodeCount(),
93 static_cast<unsigned>(element->number_nodes()),
95 errors += my_assert(cell.getVertexCount(),
96 static_cast<unsigned>(element->number_corner_nodes()),
100 int add_to = element->spatial_dimension() != element->parametric_dimension() && element->is_element() ? 1 : 0;
101 errors += my_assert(cell.getDimension(),
102 static_cast<unsigned>(element->parametric_dimension()+add_to),
103 "parametric dimension");
104 errors += my_assert(cell.getEdgeCount(),
105 static_cast<unsigned>(element->number_edges()),
109 int add_boundary = 0;
110 if (add_to == 1 && element->spatial_dimension() == 3 && element->parametric_dimension() == 2)
111 add_boundary = cell.getEdgeCount();
113 if (element->name() ==
"edge2" || element->name() ==
"edge3")
116 errors += my_assert(cell.getSideCount() + add_boundary,
117 static_cast<unsigned>(element->number_boundaries()),
122 if (element->is_element()) {
123 if (cell.getDimension() == 3) {
124 int face_count = element->number_faces();
125 for (
int i=0; i < face_count; i++) {
126 Ioss::ElementTopology *face = element->face_type(i+1);
127 const CellTopologyData *cell_face = cell.getCellTopologyData(cell.getDimension()-1,i);
128 errors += my_assert(face->name(),
132 Ioss::IntVector fcon = element->face_connectivity(i+1);
133 size_t node_count = fcon.size();
134 for (
size_t j=0; j < node_count; j++) {
135 std::ostringstream msg;
136 msg <<
"face node connectivity for node " << j <<
" on face " << i;
137 errors += my_assert(fcon[j],
138 static_cast<int>(cell.getNodeMap(cell.getDimension()-1, i, j)),
143 int edge_count = element->number_edges();
144 for (
int i=0; i < edge_count; i++) {
146 Ioss::IntVector fcon = element->edge_connectivity(i+1);
147 size_t node_count = fcon.size();
148 for (
size_t j=0; j < node_count; j++) {
149 std::ostringstream msg;
150 msg <<
"edge node connectivity for node " << j <<
" on edge " << i;
151 errors += my_assert(fcon[j],
152 static_cast<int>(cell.getNodeMap(cell.getDimension()-2, i, j)),
157 else if (cell.getDimension() == 2) {
158 int edge_count = element->number_edges();
159 for (
int i=0; i < edge_count; i++) {
160 Ioss::ElementTopology *edge = element->edge_type(i+1);
161 const CellTopologyData *cell_edge = cell.getCellTopologyData(cell.getDimension()-1,i);
162 errors += my_assert(edge->name(),
166 Ioss::IntVector econ = element->edge_connectivity(i+1);
167 size_t node_count = econ.size();
168 for (
size_t j=0; j < node_count; j++) {
169 std::ostringstream msg;
170 msg <<
"edge node connectivity for node " << j <<
" on edge " << i;
171 errors += my_assert(econ[j],
172 static_cast<int>(cell.getNodeMap(cell.getDimension()-1, i, j)),
183 STKUNIT_UNIT_TEST(UnitTestTopology, testUnit)
185 Ioss::StorageInitializer initialize_storage;
186 Ioss::Initializer initialize_topologies;
188 Ioss::NameList elements;
189 int element_count = Ioss::ElementTopology::describe(&elements);
192 for (
int i=0; i < element_count; i++) {
194 if (elements[i] ==
"tetra7" ||
195 elements[i] ==
"tetra11" ||
196 elements[i] ==
"trishell4" ||
197 elements[i] ==
"trishell7") {
201 int current_error = testElement(elements[i]);
202 if (elements[i] !=
"node" &&
203 elements[i] !=
"rod3d2" &&
204 elements[i] !=
"rod3d3" &&
205 elements[i] !=
"tri4a" ) {
206 errors += current_error;
209 if (current_error > 0)
210 std::cerr <<
"\t\tIGNORING " << elements[i] <<
" ERRORS...\n";
213 STKUNIT_ASSERT(errors == 0);
std::string map_topology_cell_to_ioss(const CellTopologyData *cell_top, int spatial_dimension)
const CellTopologyData * map_topology_ioss_to_cell(const Ioss::ElementTopology *topology)