Skip to content

Commit 2fbc438

Browse files
authored
Merge pull request #3338 from jwpeterson/fix_tetgen_3337
Update the mapping from Tetgen's Tet10 numbering -> libMesh's Tet10 numbering
2 parents abc01fe + dc7a4d7 commit 2fbc438

6 files changed

Lines changed: 63 additions & 12 deletions

File tree

src/mesh/tetgen_io.C

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,11 +206,9 @@ void TetGenIO::element_in (std::istream & ele_stream)
206206
libmesh_error_msg_if(region_attribute > 1,
207207
"Invalid region_attribute " << region_attribute << " specified in .ele file.");
208208

209-
// Vector that assigns element nodes to their correct position.
210-
// TetGen is normally 0-based
211-
// (right now this is strictly not necessary since it is the identity map,
212-
// but in the future TetGen could change their numbering scheme.)
213-
static const unsigned int assign_elm_nodes[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
209+
// Vector that maps Tetgen node numbering to libMesh node numbering. Tet4s are
210+
// numbered identically, but Tet10s are not.
211+
static const unsigned int assign_elm_nodes[] = {0, 1, 2, 3, 9, 7, 4, 5, 8, 6};
214212

215213
for (dof_id_type i=0; i<_num_elements; i++)
216214
{

tests/Makefile.am

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,9 @@ data = meshes/1_quad.bxt.gz \
142142
meshes/bad_64bit_elem_integers.e \
143143
meshes/good_32bit_elem_integers.e \
144144
meshes/mesh_assign_test_mesh.xda \
145-
meshes/shark_tooth_tri6.xda.gz
145+
meshes/shark_tooth_tri6.xda.gz \
146+
meshes/tetgen_one_tet10.ele \
147+
meshes/tetgen_one_tet10.node
146148

147149
unit_tests_sources += \
148150
$(data)

tests/Makefile.in

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,8 @@ am__unit_tests_dbg_SOURCES_DIST = driver.C libmesh_cppunit.h \
262262
meshes/bad_64bit_elem_integers.e \
263263
meshes/good_32bit_elem_integers.e \
264264
meshes/mesh_assign_test_mesh.xda \
265-
meshes/shark_tooth_tri6.xda.gz fparser/autodiff.C
265+
meshes/shark_tooth_tri6.xda.gz meshes/tetgen_one_tet10.ele \
266+
meshes/tetgen_one_tet10.node fparser/autodiff.C
266267
am__dirstamp = $(am__leading_dot)dirstamp
267268
am__objects_1 =
268269
@LIBMESH_ENABLE_FPARSER_TRUE@am__objects_2 = fparser/unit_tests_dbg-autodiff.$(OBJEXT)
@@ -446,7 +447,8 @@ am__unit_tests_devel_SOURCES_DIST = driver.C libmesh_cppunit.h \
446447
meshes/bad_64bit_elem_integers.e \
447448
meshes/good_32bit_elem_integers.e \
448449
meshes/mesh_assign_test_mesh.xda \
449-
meshes/shark_tooth_tri6.xda.gz fparser/autodiff.C
450+
meshes/shark_tooth_tri6.xda.gz meshes/tetgen_one_tet10.ele \
451+
meshes/tetgen_one_tet10.node fparser/autodiff.C
450452
@LIBMESH_ENABLE_FPARSER_TRUE@am__objects_4 = fparser/unit_tests_devel-autodiff.$(OBJEXT)
451453
am__objects_5 = unit_tests_devel-driver.$(OBJEXT) \
452454
base/unit_tests_devel-dof_map_test.$(OBJEXT) \
@@ -624,7 +626,8 @@ am__unit_tests_oprof_SOURCES_DIST = driver.C libmesh_cppunit.h \
624626
meshes/bad_64bit_elem_integers.e \
625627
meshes/good_32bit_elem_integers.e \
626628
meshes/mesh_assign_test_mesh.xda \
627-
meshes/shark_tooth_tri6.xda.gz fparser/autodiff.C
629+
meshes/shark_tooth_tri6.xda.gz meshes/tetgen_one_tet10.ele \
630+
meshes/tetgen_one_tet10.node fparser/autodiff.C
628631
@LIBMESH_ENABLE_FPARSER_TRUE@am__objects_6 = fparser/unit_tests_oprof-autodiff.$(OBJEXT)
629632
am__objects_7 = unit_tests_oprof-driver.$(OBJEXT) \
630633
base/unit_tests_oprof-dof_map_test.$(OBJEXT) \
@@ -802,7 +805,8 @@ am__unit_tests_opt_SOURCES_DIST = driver.C libmesh_cppunit.h \
802805
meshes/bad_64bit_elem_integers.e \
803806
meshes/good_32bit_elem_integers.e \
804807
meshes/mesh_assign_test_mesh.xda \
805-
meshes/shark_tooth_tri6.xda.gz fparser/autodiff.C
808+
meshes/shark_tooth_tri6.xda.gz meshes/tetgen_one_tet10.ele \
809+
meshes/tetgen_one_tet10.node fparser/autodiff.C
806810
@LIBMESH_ENABLE_FPARSER_TRUE@am__objects_8 = fparser/unit_tests_opt-autodiff.$(OBJEXT)
807811
am__objects_9 = unit_tests_opt-driver.$(OBJEXT) \
808812
base/unit_tests_opt-dof_map_test.$(OBJEXT) \
@@ -980,7 +984,8 @@ am__unit_tests_prof_SOURCES_DIST = driver.C libmesh_cppunit.h \
980984
meshes/bad_64bit_elem_integers.e \
981985
meshes/good_32bit_elem_integers.e \
982986
meshes/mesh_assign_test_mesh.xda \
983-
meshes/shark_tooth_tri6.xda.gz fparser/autodiff.C
987+
meshes/shark_tooth_tri6.xda.gz meshes/tetgen_one_tet10.ele \
988+
meshes/tetgen_one_tet10.node fparser/autodiff.C
984989
@LIBMESH_ENABLE_FPARSER_TRUE@am__objects_10 = fparser/unit_tests_prof-autodiff.$(OBJEXT)
985990
am__objects_11 = unit_tests_prof-driver.$(OBJEXT) \
986991
base/unit_tests_prof-dof_map_test.$(OBJEXT) \
@@ -2132,7 +2137,9 @@ data = meshes/1_quad.bxt.gz \
21322137
meshes/bad_64bit_elem_integers.e \
21332138
meshes/good_32bit_elem_integers.e \
21342139
meshes/mesh_assign_test_mesh.xda \
2135-
meshes/shark_tooth_tri6.xda.gz
2140+
meshes/shark_tooth_tri6.xda.gz \
2141+
meshes/tetgen_one_tet10.ele \
2142+
meshes/tetgen_one_tet10.node
21362143

21372144
@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@unit_tests_dbg_SOURCES = $(unit_tests_sources)
21382145
@LIBMESH_DBG_MODE_TRUE@@LIBMESH_ENABLE_CPPUNIT_TRUE@unit_tests_dbg_CPPFLAGS = $(CPPFLAGS_DBG) $(AM_CPPFLAGS)

tests/mesh/mesh_input.C

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <libmesh/exodusII_io.h>
1414
#include <libmesh/nemesis_io.h>
1515
#include <libmesh/vtk_io.h>
16+
#include <libmesh/tetgen_io.h>
1617

1718
#include "test_comm.h"
1819
#include "libmesh_cppunit.h"
@@ -101,6 +102,10 @@ public:
101102
#endif // LIBMESH_HAVE_GZSTREAM
102103
#endif // LIBMESH_DIM > 1
103104

105+
#ifdef LIBMESH_HAVE_TETGEN
106+
CPPUNIT_TEST( testTetgenIO );
107+
#endif
108+
104109
CPPUNIT_TEST_SUITE_END();
105110

106111
private:
@@ -823,6 +828,30 @@ public:
823828
helperTestingDynaQuad(mesh);
824829
}
825830

831+
void testTetgenIO ()
832+
{
833+
#ifdef LIBMESH_HAVE_TETGEN
834+
LOG_UNIT_TEST;
835+
836+
Mesh mesh(*TestCommWorld);
837+
838+
TetGenIO tetgen_io(mesh);
839+
840+
if (mesh.processor_id() == 0)
841+
tetgen_io.read("meshes/tetgen_one_tet10.ele");
842+
MeshCommunication().broadcast(mesh);
843+
844+
mesh.prepare_for_use();
845+
846+
// Mesh should contain 1 TET10 finite element
847+
CPPUNIT_ASSERT_EQUAL(mesh.n_elem(), dof_id_type(1));
848+
CPPUNIT_ASSERT_EQUAL(mesh.n_nodes(), dof_id_type(10));
849+
850+
// Element should have TET10 reference element volume
851+
Real vol = mesh.elem_ptr(0)->volume();
852+
CPPUNIT_ASSERT_DOUBLES_EQUAL(vol, 1./6, TOLERANCE*TOLERANCE);
853+
#endif
854+
}
826855

827856
void testDynaNoSplines ()
828857
{

tests/meshes/tetgen_one_tet10.ele

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
1 10 0
2+
1 1 2 3 4 5 6 7 8 9 10
3+
# Generated by tetgen -p ModelGeneration/pyramid.poly -o2

tests/meshes/tetgen_one_tet10.node

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
10 3 0 0
2+
1 1 1 1
3+
2 0 1 0
4+
3 0 0 1
5+
4 0 1 1
6+
5 0 0.5 1
7+
6 0.5 1 1
8+
7 0.5 1 0.5
9+
8 0 0.5 0.5
10+
9 0 1 0.5
11+
10 0.5 0.5 1
12+
# Generated by tetgen -p ModelGeneration/pyramid.poly -o2

0 commit comments

Comments
 (0)