Skip to content

Commit 22b78e8

Browse files
authored
Merge pull request #844 from mtao/mtao/autogen_tests
Testing tuple_from_id
2 parents 574cfec + b1dc298 commit 22b78e8

File tree

9 files changed

+248
-40
lines changed

9 files changed

+248
-40
lines changed

src/wmtk/TetMesh.cpp

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <wmtk/utils/tetmesh_topology_initialization.h>
55
#include <numeric>
6+
#include <wmtk/autogen/tet_mesh/get_tuple_from_simplex_local_id.hpp>
67
#include <wmtk/autogen/tet_mesh/is_ccw.hpp>
78
#include <wmtk/autogen/tet_mesh/local_switch_tuple.hpp>
89
#include <wmtk/simplex/SimplexCollection.hpp>
@@ -162,13 +163,7 @@ Tuple TetMesh::vertex_tuple_from_id(int64_t id) const
162163
}
163164
}
164165

165-
const auto [nlvid, leid, lfid] = autogen::tet_mesh::auto_3d_table_complete_vertex[lvid];
166-
assert(lvid == nlvid);
167-
168-
if (lvid < 0 || leid < 0 || lfid < 0) throw std::runtime_error("vertex_tuple_from_id failed");
169-
170-
Tuple v_tuple = Tuple(lvid, leid, lfid, t);
171-
assert(is_ccw(v_tuple));
166+
Tuple v_tuple = autogen::tet_mesh::get_tuple_from_simplex_local_vertex_id(lvid, t);
172167
assert(is_valid(v_tuple));
173168
return v_tuple;
174169
}
@@ -186,14 +181,7 @@ Tuple TetMesh::edge_tuple_from_id(int64_t id) const
186181
break;
187182
}
188183
}
189-
const auto [lvid, nleid, lfid] = autogen::tet_mesh::auto_3d_table_complete_edge[leid];
190-
assert(leid == nleid);
191-
192-
193-
if (lvid < 0 || leid < 0 || lfid < 0) throw std::runtime_error("edge_tuple_from_id failed");
194-
195-
Tuple e_tuple = Tuple(lvid, leid, lfid, t);
196-
assert(is_ccw(e_tuple));
184+
Tuple e_tuple = autogen::tet_mesh::get_tuple_from_simplex_local_edge_id(leid, t);
197185
assert(is_valid(e_tuple));
198186
return e_tuple;
199187
}
@@ -212,13 +200,9 @@ Tuple TetMesh::face_tuple_from_id(int64_t id) const
212200
}
213201
}
214202

215-
const auto [lvid, leid, nlfid] = autogen::tet_mesh::auto_3d_table_complete_face[lfid];
216-
assert(lfid == nlfid);
217-
218-
if (lvid < 0 || leid < 0 || lfid < 0) throw std::runtime_error("face_tuple_from_id failed");
219203

220-
Tuple f_tuple = Tuple(lvid, leid, lfid, t);
221-
assert(is_ccw(f_tuple));
204+
assert(lfid >= 0);
205+
Tuple f_tuple = autogen::tet_mesh::get_tuple_from_simplex_local_face_id(lfid, t);
222206
assert(is_valid(f_tuple));
223207
return f_tuple;
224208
}

src/wmtk/TriMesh.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <wmtk/autogen/tri_mesh/is_ccw.hpp>
66
#include <wmtk/autogen/tri_mesh/local_switch_tuple.hpp>
77
#include <wmtk/utils/Logger.hpp>
8+
#include "wmtk/autogen/tri_mesh/get_tuple_from_simplex_local_id.hpp"
89

910
namespace wmtk {
1011

@@ -291,12 +292,7 @@ Tuple TriMesh::vertex_tuple_from_id(int64_t id) const
291292
auto fv = m_fv_accessor->index_access().const_vector_attribute<3>(f);
292293
for (int64_t i = 0; i < 3; ++i) {
293294
if (fv(i) == id) {
294-
assert(autogen::tri_mesh::auto_2d_table_complete_vertex[i][0] == i);
295-
const int64_t leid = autogen::tri_mesh::auto_2d_table_complete_vertex[i][1];
296-
Tuple v_tuple = Tuple(i, leid, -1, f);
297-
// accessor as parameter
298-
assert(is_ccw(v_tuple)); // is_ccw also checks for validity
299-
return v_tuple;
295+
return autogen::tri_mesh::get_tuple_from_simplex_local_vertex_id(i, f);
300296
}
301297
}
302298
assert(false); // "vertex_tuple_from_id failed"
@@ -310,14 +306,7 @@ Tuple TriMesh::edge_tuple_from_id(int64_t id) const
310306
auto fe = m_fe_accessor->index_access().const_vector_attribute<3>(f);
311307
for (int64_t i = 0; i < 3; ++i) {
312308
if (fe(i) == id) {
313-
assert(autogen::tri_mesh::auto_2d_table_complete_edge[i][1] == i);
314-
const int64_t lvid = autogen::tri_mesh::auto_2d_table_complete_edge[i][0];
315-
316-
317-
Tuple e_tuple = Tuple(lvid, i, -1, f);
318-
assert(is_ccw(e_tuple));
319-
assert(is_valid(e_tuple));
320-
return e_tuple;
309+
return autogen::tri_mesh::get_tuple_from_simplex_local_edge_id(i, f);
321310
}
322311
}
323312
assert(false); // "edge_tuple_from_id failed"

src/wmtk/autogen/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ foreach(MESH_TYPE edge_mesh tri_mesh tet_mesh)
5555

5656
subdart_maximal_action_to_face.hpp
5757
subdart_maximal_action_to_face.cpp
58+
59+
get_tuple_from_simplex_local_id.hpp
5860
)
5961
set(SRC_FILES ${SRC_FILES} ${MESH_TYPE}/${FILE_NAME})
6062
endforeach()
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#pragma once
2+
#include <cassert>
3+
#include <wmtk/Tuple.hpp>
4+
#include "autogenerated_tables.hpp"
5+
#if !defined(_NDEBUG)
6+
#include "is_ccw.hpp"
7+
#endif
8+
9+
namespace wmtk::autogen::edge_mesh {
10+
11+
inline Tuple get_tuple_from_simplex_local_vertex_id(int8_t local_id, int64_t global_id)
12+
{
13+
assert(local_id >= 0);
14+
assert(local_id < 2);
15+
return Tuple(local_id, -1, -1, global_id);
16+
}
17+
inline Tuple
18+
get_tuple_from_simplex_local_id(PrimitiveType pt, int8_t local_id, int64_t global_fid)
19+
{
20+
switch (pt) {
21+
case PrimitiveType::Vertex: return get_tuple_from_simplex_local_vertex_id(local_id, global_fid);
22+
case PrimitiveType::Edge:
23+
case PrimitiveType::Triangle:
24+
default:
25+
case PrimitiveType::Tetrahedron: assert(false); return {};
26+
}
27+
}
28+
} // namespace wmtk::autogen::edge_mesh
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#pragma once
2+
#include <cassert>
3+
#include <wmtk/Tuple.hpp>
4+
#include "autogenerated_tables.hpp"
5+
#if !defined(_NDEBUG)
6+
#include "is_ccw.hpp"
7+
#endif
8+
9+
namespace wmtk::autogen::tet_mesh {
10+
11+
inline Tuple get_tuple_from_simplex_local_vertex_id(int8_t local_id, int64_t global_id)
12+
{
13+
assert(local_id >= 0);
14+
assert(local_id < 4);
15+
const auto& arr = autogen::tet_mesh::auto_3d_table_complete_vertex[local_id];
16+
const auto& [lvid, leid, lfid] = arr;
17+
Tuple tuple = Tuple(lvid, leid, lfid, global_id);
18+
return tuple;
19+
}
20+
inline Tuple get_tuple_from_simplex_local_edge_id(int8_t local_id, int64_t global_id)
21+
{
22+
assert(local_id >= 0);
23+
assert(local_id < 6);
24+
const auto& arr = autogen::tet_mesh::auto_3d_table_complete_edge[local_id];
25+
const auto& [lvid, leid, lfid] = arr;
26+
Tuple tuple = Tuple(lvid, leid, lfid, global_id);
27+
return tuple;
28+
}
29+
inline Tuple get_tuple_from_simplex_local_face_id(int8_t local_id, int64_t global_id)
30+
{
31+
assert(local_id >= 0);
32+
assert(local_id < 4);
33+
const auto& arr = autogen::tet_mesh::auto_3d_table_complete_face[local_id];
34+
const auto& [lvid, leid, lfid] = arr;
35+
Tuple tuple = Tuple(lvid, leid, lfid, global_id);
36+
return tuple;
37+
}
38+
inline Tuple get_tuple_from_simplex_local_id(PrimitiveType pt, int8_t local_id, int64_t global_fid)
39+
{
40+
switch (pt) {
41+
case PrimitiveType::Vertex: return get_tuple_from_simplex_local_vertex_id(local_id, global_fid);
42+
case PrimitiveType::Edge: return get_tuple_from_simplex_local_edge_id(local_id, global_fid);
43+
case PrimitiveType::Triangle: return get_tuple_from_simplex_local_face_id(local_id, global_fid);
44+
default:
45+
case PrimitiveType::Tetrahedron: assert(false); return {};
46+
}
47+
}
48+
} // namespace wmtk::autogen::tet_mesh
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#pragma once
2+
#include <cassert>
3+
#include <wmtk/Tuple.hpp>
4+
#include "autogenerated_tables.hpp"
5+
#if !defined(_NDEBUG)
6+
#include "is_ccw.hpp"
7+
#endif
8+
9+
namespace wmtk::autogen::tri_mesh {
10+
inline Tuple get_tuple_from_simplex_local_vertex_id(int8_t local_id, int64_t global_id)
11+
{
12+
assert(local_id >= 0);
13+
assert(local_id < 3);
14+
15+
const auto& arr = autogen::tri_mesh::auto_2d_table_complete_vertex[local_id];
16+
const auto& [lvid, leid] = arr;
17+
Tuple tuple = Tuple(lvid, leid, -1, global_id);
18+
return tuple;
19+
}
20+
inline Tuple get_tuple_from_simplex_local_edge_id(int8_t local_id, int64_t global_id)
21+
{
22+
assert(local_id >= 0);
23+
assert(local_id < 3);
24+
const auto& arr = autogen::tri_mesh::auto_2d_table_complete_edge[local_id];
25+
const auto& [lvid, leid] = arr;
26+
Tuple tuple = Tuple(lvid, leid, -1, global_id);
27+
return tuple;
28+
}
29+
inline Tuple get_tuple_from_simplex_local_id(PrimitiveType pt, int8_t local_id, int64_t global_fid)
30+
{
31+
switch (pt) {
32+
case PrimitiveType::Vertex: return get_tuple_from_simplex_local_vertex_id(local_id, global_fid);
33+
case PrimitiveType::Edge: return get_tuple_from_simplex_local_edge_id(local_id, global_fid);
34+
default:
35+
case PrimitiveType::Triangle:
36+
case PrimitiveType::Tetrahedron: assert(false); return {};
37+
}
38+
}
39+
} // namespace wmtk::autogen::tri_mesh

tests/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ target_link_libraries(wmtk_test_tools PUBLIC
5959
set(TEST_SOURCES
6060
test_topology.cpp
6161
test_mesh.cpp
62-
test_autogen.cpp
6362
test_tuple.cpp
6463
test_tuple_1d.cpp
6564
test_tuple_2d.cpp

tests/autogen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
set(TEST_SOURCES
33
dart.cpp
44
actions.cpp
5+
tables.cpp
56
)
67
target_sources(wmtk_tests PRIVATE ${TEST_SOURCES})
Lines changed: 122 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,36 @@
55
#include <iostream>
66
#include <tuple>
77
#include <wmtk/Tuple.hpp>
8+
#include <wmtk/autogen/edge_mesh/get_tuple_from_simplex_local_id.hpp>
89
#include <wmtk/autogen/edge_mesh/is_ccw.hpp>
910
#include <wmtk/autogen/edge_mesh/local_switch_tuple.hpp>
1011
#include <wmtk/autogen/is_ccw.hpp>
1112
#include <wmtk/autogen/local_switch_tuple.hpp>
1213
#include <wmtk/autogen/tet_mesh/autogenerated_tables.hpp>
14+
#include <wmtk/autogen/tet_mesh/get_tuple_from_simplex_local_id.hpp>
1315
#include <wmtk/autogen/tet_mesh/is_ccw.hpp>
1416
#include <wmtk/autogen/tet_mesh/local_id_table_offset.hpp>
1517
#include <wmtk/autogen/tet_mesh/local_switch_tuple.hpp>
1618
#include <wmtk/autogen/tri_mesh/autogenerated_tables.hpp>
19+
#include <wmtk/autogen/tri_mesh/get_tuple_from_simplex_local_id.hpp>
1720
#include <wmtk/autogen/tri_mesh/is_ccw.hpp>
1821
#include <wmtk/autogen/tri_mesh/local_id_table_offset.hpp>
1922
#include <wmtk/autogen/tri_mesh/local_switch_tuple.hpp>
20-
#include "tools/all_valid_local_tuples.hpp"
23+
#include "../tools/DEBUG_Tuple.hpp"
24+
#include "../tools/all_valid_local_tuples.hpp"
2125

2226
using namespace wmtk;
2327
using namespace wmtk::autogen;
2428
using namespace wmtk::tests;
2529

30+
namespace {
31+
32+
template <typename T>
33+
auto get_array_range(const T& array) -> std::array<decltype(&array[0]), 2>
34+
{
35+
return std::array<decltype(&array[0]), 2>{{array, array + std::size(array)}};
36+
}
37+
} // namespace
2638

2739
TEST_CASE("tuple_autogen_sizes", "[tuple]")
2840
{
@@ -32,9 +44,6 @@ TEST_CASE("tuple_autogen_sizes", "[tuple]")
3244
REQUIRE(all_valid_local_tuples(PrimitiveType::Triangle).size() == valid_face);
3345
REQUIRE(all_valid_local_tuples(PrimitiveType::Tetrahedron).size() == valid_tet);
3446

35-
auto get_array_range = [](const auto& array) -> std::array<decltype(&array[0]), 2> {
36-
return std::array<decltype(&array[0]), 2>{{array, array + std::size(array)}};
37-
};
3847
{ // ccw check
3948
{ // tri
4049
auto ccw_range = get_array_range(tri_mesh::auto_2d_table_ccw);
@@ -222,3 +231,112 @@ TEST_CASE("tuple_autogen_switch_still_valid", "[tuple]")
222231
}
223232
}
224233
}
234+
TEST_CASE("tuple_autogen_is_ccw", "[tuple]")
235+
{
236+
for (const auto& ve : tri_mesh::auto_2d_table_complete_vertex) {
237+
wmtk::Tuple t(ve[0], ve[1], -1, 0);
238+
CHECK(tri_mesh::tuple_is_valid_for_ccw(t));
239+
CHECK(tri_mesh::is_ccw(t));
240+
CHECK(tuple_is_valid_for_ccw(PrimitiveType::Triangle, t));
241+
CHECK(is_ccw(PrimitiveType::Triangle, t));
242+
}
243+
for (const auto& ve : tri_mesh::auto_2d_table_complete_edge) {
244+
wmtk::Tuple t(ve[0], ve[1], -1, 0);
245+
CHECK(tri_mesh::tuple_is_valid_for_ccw(t));
246+
CHECK(tri_mesh::is_ccw(t));
247+
CHECK(tuple_is_valid_for_ccw(PrimitiveType::Triangle, t));
248+
CHECK(is_ccw(PrimitiveType::Triangle, t));
249+
}
250+
for (const auto& ve : tet_mesh::auto_3d_table_complete_vertex) {
251+
wmtk::Tuple t(ve[0], ve[1], ve[2], 0);
252+
CHECK(tet_mesh::tuple_is_valid_for_ccw(t));
253+
CHECK(tet_mesh::is_ccw(t));
254+
CHECK(tuple_is_valid_for_ccw(PrimitiveType::Tetrahedron, t));
255+
CHECK(is_ccw(PrimitiveType::Tetrahedron, t));
256+
}
257+
for (const auto& ve : tet_mesh::auto_3d_table_complete_edge) {
258+
wmtk::Tuple t(ve[0], ve[1], ve[2], 0);
259+
CHECK(tet_mesh::tuple_is_valid_for_ccw(t));
260+
CHECK(tet_mesh::is_ccw(t));
261+
CHECK(tuple_is_valid_for_ccw(PrimitiveType::Tetrahedron, t));
262+
CHECK(is_ccw(PrimitiveType::Tetrahedron, t));
263+
}
264+
for (const auto& ve : tet_mesh::auto_3d_table_complete_face) {
265+
wmtk::Tuple t(ve[0], ve[1], ve[2], 0);
266+
CHECK(tet_mesh::tuple_is_valid_for_ccw(t));
267+
CHECK(tet_mesh::is_ccw(t));
268+
CHECK(tuple_is_valid_for_ccw(PrimitiveType::Tetrahedron, t));
269+
CHECK(is_ccw(PrimitiveType::Tetrahedron, t));
270+
}
271+
}
272+
TEST_CASE("tuple_autogen_from_id_is_ccw", "[tuple]")
273+
{
274+
auto run_checks = [](int ic, const Tuple& t, const Tuple& t2, int i, PrimitiveType pt) {
275+
wmtk::tests::DEBUG_Tuple dt(t);
276+
switch (ic) {
277+
case 4: REQUIRE(dt.local_fid() >= 0); REQUIRE(dt.local_fid() < 4);
278+
case 3: REQUIRE(dt.local_eid() >= 0); REQUIRE(dt.local_eid() < 6);
279+
case 2: REQUIRE(dt.local_vid() >= 0); REQUIRE(dt.local_vid() < 4);
280+
default: break;
281+
}
282+
switch (pt) {
283+
case PrimitiveType::Tetrahedron: CHECK(dt.local_fid() == i); break;
284+
case PrimitiveType::Edge: CHECK(dt.local_eid() == i); break;
285+
case PrimitiveType::Vertex: CHECK(dt.local_vid() == i); break;
286+
default: break;
287+
}
288+
289+
CHECK(t == t2);
290+
};
291+
PrimitiveType pt = PrimitiveType::Vertex;
292+
for (int i = 0; i < 2; ++i) {
293+
Tuple t = wmtk::autogen::edge_mesh::get_tuple_from_simplex_local_vertex_id(i, 0);
294+
Tuple t2 = wmtk::autogen::edge_mesh::get_tuple_from_simplex_local_id(pt, i, 0);
295+
run_checks(2, t, t2, i, pt);
296+
// not every simplex has a ccw tuple in an edge_mesh
297+
CHECK(edge_mesh::tuple_is_valid_for_ccw(t));
298+
CHECK(edge_mesh::is_ccw(t) == (i == 0));
299+
}
300+
pt = PrimitiveType::Vertex;
301+
for (int i = 0; i < 3; ++i) {
302+
Tuple t = wmtk::autogen::tri_mesh::get_tuple_from_simplex_local_vertex_id(i, 0);
303+
Tuple t2 = wmtk::autogen::tri_mesh::get_tuple_from_simplex_local_id(pt, i, 0);
304+
run_checks(3, t, t2, i, pt);
305+
CHECK(tri_mesh::tuple_is_valid_for_ccw(t));
306+
CHECK(tri_mesh::is_ccw(t));
307+
}
308+
pt = PrimitiveType::Edge;
309+
for (int i = 0; i < 3; ++i) {
310+
Tuple t = wmtk::autogen::tri_mesh::get_tuple_from_simplex_local_edge_id(i, 0);
311+
Tuple t2 = wmtk::autogen::tri_mesh::get_tuple_from_simplex_local_id(pt, i, 0);
312+
run_checks(3, t, t2, i, pt);
313+
CHECK(tri_mesh::tuple_is_valid_for_ccw(t));
314+
CHECK(tri_mesh::is_ccw(t));
315+
}
316+
317+
pt = PrimitiveType::Vertex;
318+
for (int i = 0; i < 4; ++i) {
319+
Tuple t = wmtk::autogen::tet_mesh::get_tuple_from_simplex_local_vertex_id(i, 0);
320+
Tuple t2 = wmtk::autogen::tet_mesh::get_tuple_from_simplex_local_id(pt, i, 0);
321+
run_checks(4, t, t2, i, pt);
322+
CHECK(tet_mesh::tuple_is_valid_for_ccw(t));
323+
CHECK(tet_mesh::is_ccw(t));
324+
}
325+
pt = PrimitiveType::Edge;
326+
for (int i = 0; i < 6; ++i) {
327+
Tuple t = wmtk::autogen::tet_mesh::get_tuple_from_simplex_local_edge_id(i, 0);
328+
Tuple t2 = wmtk::autogen::tet_mesh::get_tuple_from_simplex_local_id(pt, i, 0);
329+
CHECK(tet_mesh::tuple_is_valid_for_ccw(t));
330+
run_checks(4, t, t2, i, pt);
331+
CHECK(tet_mesh::is_ccw(t));
332+
}
333+
334+
pt = PrimitiveType::Triangle;
335+
for (int i = 0; i < 4; ++i) {
336+
Tuple t = wmtk::autogen::tet_mesh::get_tuple_from_simplex_local_face_id(i, 0);
337+
Tuple t2 = wmtk::autogen::tet_mesh::get_tuple_from_simplex_local_id(pt, i, 0);
338+
CHECK(tet_mesh::tuple_is_valid_for_ccw(t));
339+
run_checks(4, t, t2, i, pt);
340+
CHECK(tet_mesh::is_ccw(t));
341+
}
342+
}

0 commit comments

Comments
 (0)