libMesh
Public Member Functions | List of all members
MeshTetTest Class Reference
Inheritance diagram for MeshTetTest:
[legend]

Public Member Functions

 LIBMESH_CPPUNIT_TEST_SUITE (MeshTetTest)
 The goal of this test is to verify proper operation of the interfaces to tetrahedralization libraries. More...
 
 CPPUNIT_TEST (testNetGen)
 
 CPPUNIT_TEST (testNetGenError)
 
 CPPUNIT_TEST (testNetGenTets)
 
 CPPUNIT_TEST (testNetGenFlippedTris)
 
 CPPUNIT_TEST (testNetGenNonOriented)
 
 CPPUNIT_TEST (testNetGenHole)
 
 CPPUNIT_TEST (testNetGenSphereShell)
 
 CPPUNIT_TEST_SUITE_END ()
 
void setUp ()
 
void tearDown ()
 
void testExceptionBase (const char *re, MeshBase &mesh, MeshTetInterface &tetinterface, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
 
void testTetInterfaceBase (MeshBase &mesh, MeshTetInterface &triangulator, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
 
void testBcids (UnstructuredMesh &mesh)
 
void testHole (UnstructuredMesh &mesh, MeshTetInterface &triangulator)
 
void testSphereShell (UnstructuredMesh &mesh, MeshTetInterface &triangulator)
 
void testTrisToTets (UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false, bool flip_some_tris=false)
 
void testTrisToTetsError (UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false)
 
void testTetsToTets (MeshBase &mesh, MeshTetInterface &triangulator)
 
void testTetGen ()
 
void testTetGenError ()
 
void testNetGen ()
 
void testNetGenError ()
 
void testNetGenTets ()
 
void testNetGenFlippedTris ()
 
void testNetGenNonOriented ()
 
void testNetGenHole ()
 
void testNetGenSphereShell ()
 

Detailed Description

Definition at line 38 of file mesh_tet_test.C.

Member Function Documentation

◆ CPPUNIT_TEST() [1/7]

MeshTetTest::CPPUNIT_TEST ( testNetGen  )

◆ CPPUNIT_TEST() [2/7]

MeshTetTest::CPPUNIT_TEST ( testNetGenError  )

◆ CPPUNIT_TEST() [3/7]

MeshTetTest::CPPUNIT_TEST ( testNetGenTets  )

◆ CPPUNIT_TEST() [4/7]

MeshTetTest::CPPUNIT_TEST ( testNetGenFlippedTris  )

◆ CPPUNIT_TEST() [5/7]

MeshTetTest::CPPUNIT_TEST ( testNetGenNonOriented  )

◆ CPPUNIT_TEST() [6/7]

MeshTetTest::CPPUNIT_TEST ( testNetGenHole  )

◆ CPPUNIT_TEST() [7/7]

MeshTetTest::CPPUNIT_TEST ( testNetGenSphereShell  )

◆ CPPUNIT_TEST_SUITE_END()

MeshTetTest::CPPUNIT_TEST_SUITE_END ( )

◆ LIBMESH_CPPUNIT_TEST_SUITE()

MeshTetTest::LIBMESH_CPPUNIT_TEST_SUITE ( MeshTetTest  )

The goal of this test is to verify proper operation of the interfaces to tetrahedralization libraries.

◆ setUp()

void MeshTetTest::setUp ( )
inline

Definition at line 84 of file mesh_tet_test.C.

84 {}

◆ tearDown()

void MeshTetTest::tearDown ( )
inline

Definition at line 86 of file mesh_tet_test.C.

86 {}

◆ testBcids()

void MeshTetTest::testBcids ( UnstructuredMesh mesh)
inline

Definition at line 149 of file mesh_tet_test.C.

References libMesh::MeshBase::get_boundary_info(), libMesh::BoundaryInfo::has_boundary_id(), mesh, and libMesh::BoundaryInfo::n_boundary_ids().

150  {
152  for (const auto & elem : mesh.element_ptr_range())
153  {
154  for (auto s : elem->side_index_range())
155  {
156  auto neigh = elem->neighbor_ptr(s);
157 
158  if (neigh)
159  {
160  CPPUNIT_ASSERT_EQUAL(bi.n_boundary_ids(elem, s), 0u);
161  continue;
162  }
163 
164  CPPUNIT_ASSERT_EQUAL(bi.n_boundary_ids(elem, s), 1u);
165 
166  auto side = elem->side_ptr(s);
167  auto normal = (side->point(1) - side->point(0)).cross
168  (side->point(2) - side->point(0));
169  // Outer faces, in these tests
170  if (normal * side->vertex_average() > 0)
171  CPPUNIT_ASSERT(bi.has_boundary_id(elem, s, 0));
172  // Inner faces, with one-hole tests
173  else
174  CPPUNIT_ASSERT(bi.has_boundary_id(elem, s, 1));
175  }
176  }
177  }
bool has_boundary_id(const Node *const node, const boundary_id_type id) const
MeshBase & mesh
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
Definition: mesh_base.h:170
std::size_t n_boundary_ids() const
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
Definition: boundary_info.h:57

◆ testExceptionBase()

void MeshTetTest::testExceptionBase ( const char *  re,
MeshBase mesh,
MeshTetInterface tetinterface,
dof_id_type  expected_n_elem = DofObject::invalid_id,
dof_id_type  expected_n_nodes = DofObject::invalid_id,
Real  expected_volume = 0 
)
inline

Definition at line 88 of file mesh_tet_test.C.

References mesh.

94  {
95 #ifdef LIBMESH_ENABLE_EXCEPTIONS
96  // We can't just CPPUNIT_ASSERT_THROW, because we want to make
97  // sure we were thrown from the right place with the right error
98  // message!
99  bool threw_desired_exception = false;
100  try {
101  this->testTetInterfaceBase(mesh, tetinterface, expected_n_elem,
102  expected_n_nodes, expected_volume);
103  }
104  catch (libMesh::LogicError & e) {
105  std::regex msg_regex(re);
106  CPPUNIT_ASSERT(std::regex_search(e.what(), msg_regex));
107  threw_desired_exception = true;
108  }
109  catch (CppUnit::Exception & e) {
110  throw e;
111  }
112  catch (...) {
113  CPPUNIT_ASSERT_MESSAGE("Unexpected exception type thrown", false);
114  }
115  CPPUNIT_ASSERT(threw_desired_exception);
116 #endif
117  }
void testTetInterfaceBase(MeshBase &mesh, MeshTetInterface &triangulator, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
A class to represent the internal "this should never happen" errors, to be thrown by "libmesh_error()...

◆ testHole()

void MeshTetTest::testHole ( UnstructuredMesh mesh,
MeshTetInterface triangulator 
)
inline

Definition at line 180 of file mesh_tet_test.C.

References libMesh::MeshTetInterface::attach_hole_list(), libMesh::MeshTools::Generation::build_cube(), mesh, libMesh::Real, and libMesh::MeshTools::volume().

182  {
183  std::unique_ptr<UnstructuredMesh> holemesh =
184  std::make_unique<Mesh>(*TestCommWorld);
185 
187  -2, 2, -2, 2, -2, 2);
188 
189  const Real hole_volume =
190  build_octahedron(*holemesh, false, -1, 1, -1, 1, -1, 1);
191 
192  auto holes =
193  std::make_unique<std::vector<std::unique_ptr<UnstructuredMesh>>>();
194 
195  holes->push_back(std::move(holemesh));
196 
197  triangulator.attach_hole_list(std::move(holes));
198 
199  const Real expected_volume =
200  MeshTools::volume(mesh) - hole_volume;
201  this->testTetInterfaceBase(mesh, triangulator, 32, 14,
202  expected_volume);
203  }
MeshBase & mesh
void testTetInterfaceBase(MeshBase &mesh, MeshTetInterface &triangulator, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
Find the total volume of a mesh (interpreting that as area for dim = 2, or total arc length for dim =...
Definition: mesh_tools.C:1020
void attach_hole_list(std::unique_ptr< std::vector< std::unique_ptr< UnstructuredMesh >>> holes)
Attaches a vector of Mesh pointers defining holes which will be meshed around.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void build_cube(UnstructuredMesh &mesh, const unsigned int nx=0, const unsigned int ny=0, const unsigned int nz=0, const Real xmin=0., const Real xmax=1., const Real ymin=0., const Real ymax=1., const Real zmin=0., const Real zmax=1., const ElemType type=INVALID_ELEM, const bool gauss_lobatto_grid=false)
Builds a (elements) cube.

◆ testNetGen()

void MeshTetTest::testNetGen ( )
inline

Definition at line 372 of file mesh_tet_test.C.

References mesh, libMesh::MeshTetInterface::set_verbosity(), and TestCommWorld.

373  {
374  LOG_UNIT_TEST;
375 
377  NetGenMeshInterface net_tet(mesh);
378 
379  // This should give no output for our correctly-set-up inputs
380  net_tet.set_verbosity(50);
381 
382  testTrisToTets(mesh, net_tet);
383  testBcids(mesh);
384  }
void testBcids(UnstructuredMesh &mesh)
Class NetGenMeshInterface provides an interface for tetrahedralization of meshes using the NetGen lib...
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50
void testTrisToTets(UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false, bool flip_some_tris=false)

◆ testNetGenError()

void MeshTetTest::testNetGenError ( )
inline

Definition at line 387 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

388  {
389  LOG_UNIT_TEST;
390 
392  NetGenMeshInterface net_tet(mesh);
393  testTrisToTetsError(mesh, net_tet);
394  }
Class NetGenMeshInterface provides an interface for tetrahedralization of meshes using the NetGen lib...
void testTrisToTetsError(UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false)
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50

◆ testNetGenFlippedTris()

void MeshTetTest::testNetGenFlippedTris ( )
inline

Definition at line 408 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

409  {
410  LOG_UNIT_TEST;
411 
413  NetGenMeshInterface net_tet(mesh);
414  testTrisToTets(mesh, net_tet, true);
415  testBcids(mesh);
416  }
void testBcids(UnstructuredMesh &mesh)
Class NetGenMeshInterface provides an interface for tetrahedralization of meshes using the NetGen lib...
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50
void testTrisToTets(UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false, bool flip_some_tris=false)

◆ testNetGenHole()

void MeshTetTest::testNetGenHole ( )
inline

Definition at line 430 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

431  {
432  LOG_UNIT_TEST;
433 
435  NetGenMeshInterface net_tet(mesh);
436  testHole(mesh, net_tet);
437  testBcids(mesh);
438  }
void testBcids(UnstructuredMesh &mesh)
Class NetGenMeshInterface provides an interface for tetrahedralization of meshes using the NetGen lib...
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
void testHole(UnstructuredMesh &mesh, MeshTetInterface &triangulator)
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50

◆ testNetGenNonOriented()

void MeshTetTest::testNetGenNonOriented ( )
inline

Definition at line 419 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

420  {
421  LOG_UNIT_TEST;
422 
424  NetGenMeshInterface net_tet(mesh);
425  testTrisToTets(mesh, net_tet, true, true);
426  testBcids(mesh);
427  }
void testBcids(UnstructuredMesh &mesh)
Class NetGenMeshInterface provides an interface for tetrahedralization of meshes using the NetGen lib...
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50
void testTrisToTets(UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false, bool flip_some_tris=false)

◆ testNetGenSphereShell()

void MeshTetTest::testNetGenSphereShell ( )
inline

Definition at line 442 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

443  {
444  LOG_UNIT_TEST;
445 
447  NetGenMeshInterface net_tet(mesh);
448  testSphereShell(mesh, net_tet);
449  testBcids(mesh);
450  }
void testBcids(UnstructuredMesh &mesh)
Class NetGenMeshInterface provides an interface for tetrahedralization of meshes using the NetGen lib...
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
void testSphereShell(UnstructuredMesh &mesh, MeshTetInterface &triangulator)
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50

◆ testNetGenTets()

void MeshTetTest::testNetGenTets ( )
inline

Definition at line 397 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

398  {
399  LOG_UNIT_TEST;
400 
402  NetGenMeshInterface net_tet(mesh);
403  testTetsToTets(mesh, net_tet);
404  testBcids(mesh);
405  }
void testBcids(UnstructuredMesh &mesh)
Class NetGenMeshInterface provides an interface for tetrahedralization of meshes using the NetGen lib...
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
void testTetsToTets(MeshBase &mesh, MeshTetInterface &triangulator)
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50

◆ testSphereShell()

void MeshTetTest::testSphereShell ( UnstructuredMesh mesh,
MeshTetInterface triangulator 
)
inline

Definition at line 207 of file mesh_tet_test.C.

References libMesh::MeshTetInterface::attach_hole_list(), libMesh::MeshTools::Generation::build_sphere(), libMesh::MeshTetInterface::desired_volume(), mesh, and libMesh::TET4.

209  {
210  std::unique_ptr<UnstructuredMesh> holemesh =
211  std::make_unique<Mesh>(*TestCommWorld);
212 
213  MeshTools::Generation::build_sphere (*holemesh, 1, 2, TET4);
214 
216 
217  auto holes =
218  std::make_unique<std::vector<std::unique_ptr<UnstructuredMesh>>>();
219 
220  holes->push_back(std::move(holemesh));
221 
222  triangulator.attach_hole_list(std::move(holes));
223 
224  // Netgen can't seem to triangulate this without inserting points,
225  // so let MeshNetgenInterface know that we're allowed to insert
226  // points
227  triangulator.desired_volume() = 1000;
228 
229  this->testTetInterfaceBase(mesh, triangulator);
230  }
Real & desired_volume()
Sets and/or gets the desired tetrahedron volume.
MeshBase & mesh
void testTetInterfaceBase(MeshBase &mesh, MeshTetInterface &triangulator, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
void attach_hole_list(std::unique_ptr< std::vector< std::unique_ptr< UnstructuredMesh >>> holes)
Attaches a vector of Mesh pointers defining holes which will be meshed around.
void build_sphere(UnstructuredMesh &mesh, const Real radius=1, const unsigned int n_refinements=2, const ElemType type=INVALID_ELEM, const unsigned int n_smooth=2, const bool flat=true)
Meshes a spherical or mapped-spherical domain.

◆ testTetGen()

void MeshTetTest::testTetGen ( )
inline

Definition at line 326 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

327  {
328  LOG_UNIT_TEST;
329 
331  TetGenMeshInterface tet_tet(mesh);
332  testTrisToTets(mesh, tet_tet);
333  }
Class TetGenMeshInterface provides an interface for tetrahedralization of meshes using the TetGen lib...
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50
void testTrisToTets(UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false, bool flip_some_tris=false)

◆ testTetGenError()

void MeshTetTest::testTetGenError ( )
inline

Definition at line 336 of file mesh_tet_test.C.

References mesh, and TestCommWorld.

337  {
338  LOG_UNIT_TEST;
339 
341  TetGenMeshInterface tet_tet(mesh);
342  testTrisToTetsError(mesh, tet_tet);
343  }
Class TetGenMeshInterface provides an interface for tetrahedralization of meshes using the TetGen lib...
void testTrisToTetsError(UnstructuredMesh &mesh, MeshTetInterface &triangulator, bool flip_tris=false)
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:218
MeshBase & mesh
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50

◆ testTetInterfaceBase()

void MeshTetTest::testTetInterfaceBase ( MeshBase mesh,
MeshTetInterface triangulator,
dof_id_type  expected_n_elem = DofObject::invalid_id,
dof_id_type  expected_n_nodes = DofObject::invalid_id,
Real  expected_volume = 0 
)
inline

Definition at line 120 of file mesh_tet_test.C.

References libMesh::DofObject::invalid_id, mesh, libMesh::MeshBase::n_elem(), libMesh::MeshBase::n_nodes(), libMesh::TET4, libMesh::TOLERANCE, libMesh::MeshTetInterface::triangulate(), and libMesh::MeshTools::volume().

125  {
126  triangulator.triangulate();
127 
128  if (expected_n_elem != DofObject::invalid_id)
129  CPPUNIT_ASSERT_EQUAL(mesh.n_elem(), expected_n_elem);
130 
131  if (expected_n_nodes != DofObject::invalid_id)
132  CPPUNIT_ASSERT_EQUAL(mesh.n_nodes(), expected_n_nodes);
133 
134  if (expected_volume != 0)
135  LIBMESH_ASSERT_FP_EQUAL(MeshTools::volume(mesh),
136  expected_volume,
138 
139  for (const auto & elem : mesh.element_ptr_range())
140  {
141  CPPUNIT_ASSERT_EQUAL(elem->type(), TET4);
142 
143  // Make sure we're not getting any inverted elements
144  CPPUNIT_ASSERT(!elem->is_flipped());
145  }
146  }
static constexpr Real TOLERANCE
MeshBase & mesh
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
Find the total volume of a mesh (interpreting that as area for dim = 2, or total arc length for dim =...
Definition: mesh_tools.C:1020
virtual void triangulate()=0
This is the main public interface for this function.
virtual dof_id_type n_elem() const =0
virtual dof_id_type n_nodes() const =0

◆ testTetsToTets()

void MeshTetTest::testTetsToTets ( MeshBase mesh,
MeshTetInterface triangulator 
)
inline

Definition at line 289 of file mesh_tet_test.C.

References libMesh::MeshBase::add_elem(), libMesh::MeshBase::add_point(), libMesh::Elem::build(), mesh, libMesh::MeshBase::node_ptr(), libMesh::MeshBase::prepare_for_use(), libMesh::Real, libMesh::Elem::set_node(), libMesh::TET4, and libMesh::MeshTools::volume().

291  {
292  // An asymmetric octahedron, so we hopefully have an unambiguous
293  // choice of shortest diagonal for a Delaunay algorithm to pick.
294  mesh.add_point(Point(0,0,-0.1), 0);
295  mesh.add_point(Point(1,0,0), 1);
296  mesh.add_point(Point(0,1,0), 2);
297  mesh.add_point(Point(-1,0,0), 3);
298  mesh.add_point(Point(0,-1,0), 4);
299  mesh.add_point(Point(0,0,0.1), 5);
300 
301  auto add_tet = [&mesh](std::array<dof_id_type,4> nodes)
302  {
303  auto elem = mesh.add_elem(Elem::build(TET4));
304  elem->set_node(0, mesh.node_ptr(nodes[0]));
305  elem->set_node(1, mesh.node_ptr(nodes[1]));
306  elem->set_node(2, mesh.node_ptr(nodes[2]));
307  elem->set_node(3, mesh.node_ptr(nodes[3]));
308  };
309 
310  // Split along a different diagonal to start
311  add_tet({1,3,4,5});
312  add_tet({1,3,5,2});
313  add_tet({1,3,2,0});
314  add_tet({1,3,0,4});
315 
317 
318  const Real expected_volume = MeshTools::volume(mesh);
319 
320  this->testTetInterfaceBase(mesh, triangulator, /* n_elem = */ 4,
321  /* n_nodes = */ 6, expected_volume);
322  }
virtual Node *& set_node(const unsigned int i)
Definition: elem.h:2564
void prepare_for_use(const bool skip_renumber_nodes_and_elements, const bool skip_find_neighbors)
Prepare a newly created (or read) mesh for use.
Definition: mesh_base.C:824
MeshBase & mesh
virtual Node * add_point(const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id)=0
Add a new Node at Point p to the end of the vertex array, with processor_id procid.
void testTetInterfaceBase(MeshBase &mesh, MeshTetInterface &triangulator, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
virtual Elem * add_elem(Elem *e)=0
Add elem e to the end of the element array.
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
Find the total volume of a mesh (interpreting that as area for dim = 2, or total arc length for dim =...
Definition: mesh_tools.C:1020
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual const Node * node_ptr(const dof_id_type i) const =0
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39

◆ testTrisToTets()

void MeshTetTest::testTrisToTets ( UnstructuredMesh mesh,
MeshTetInterface triangulator,
bool  flip_tris = false,
bool  flip_some_tris = false 
)
inline

Definition at line 234 of file mesh_tet_test.C.

References libMesh::MeshBase::get_boundary_info(), mesh, libMesh::Real, and libMesh::MeshBase::unset_is_prepared().

238  {
239  // An asymmetric octahedron, so we hopefully have an unambiguous
240  // choice of shortest diagonal for a Delaunay algorithm to pick.
241  const Real expected_volume =
242  build_octahedron(mesh, flip_tris, -1, 1, -1, 1, -0.1, 0.1);
243 
244  // Flip a couple tri, breaking the mesh in a way we can fix
245  if (flip_some_tris)
246  for (auto elem : mesh.element_ptr_range())
247  {
248  Point center = elem->vertex_average();
249  if ((center(0) > 0 &&
250  center(1) > 0 &&
251  center(2) > 0) ||
252  (center(0) < 0 &&
253  center(1) < 0 &&
254  center(2) < 0))
255  elem->flip(&mesh.get_boundary_info());
256 
258  }
259 
260  this->testTetInterfaceBase(mesh, triangulator, /* n_elem = */ 4,
261  /* n_nodes = */ 6, expected_volume);
262  }
MeshBase & mesh
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
Definition: mesh_base.h:170
void testTetInterfaceBase(MeshBase &mesh, MeshTetInterface &triangulator, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39
void unset_is_prepared()
Tells this we have done some operation where we should no longer consider ourself prepared...
Definition: mesh_base.C:1063

◆ testTrisToTetsError()

void MeshTetTest::testTrisToTetsError ( UnstructuredMesh mesh,
MeshTetInterface triangulator,
bool  flip_tris = false 
)
inline

Definition at line 265 of file mesh_tet_test.C.

References libMesh::MeshBase::delete_elem(), mesh, libMesh::MeshBase::prepare_for_use(), and libMesh::Real.

268  {
269  const Real expected_volume =
270  build_octahedron(mesh, flip_tris, -1, 1, -1, 1, -0.1, 0.1);
271 
272  // Remove one tri, breaking the mesh
273  for (auto elem : mesh.element_ptr_range())
274  {
275  Point center = elem->vertex_average();
276  if (center(0) > 0 &&
277  center(1) > 0 &&
278  center(2) > 0)
279  mesh.delete_elem(elem);
280  }
282 
283  this->testExceptionBase("element with a null neighbor", mesh, triangulator,
284  /* n_elem = */ 4, /* n_nodes = */ 6,
285  expected_volume);
286  }
void prepare_for_use(const bool skip_renumber_nodes_and_elements, const bool skip_find_neighbors)
Prepare a newly created (or read) mesh for use.
Definition: mesh_base.C:824
MeshBase & mesh
virtual void delete_elem(Elem *e)=0
Removes element e from the mesh.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39
void testExceptionBase(const char *re, MeshBase &mesh, MeshTetInterface &tetinterface, dof_id_type expected_n_elem=DofObject::invalid_id, dof_id_type expected_n_nodes=DofObject::invalid_id, Real expected_volume=0)
Definition: mesh_tet_test.C:88

The documentation for this class was generated from the following file: