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

Public Member Functions

 LIBMESH_CPPUNIT_TEST_SUITE (SlitMeshRefinedSystemTest)
 The goal of this test is the same as the previous, but now we create a system and set dof values to make sure they are properly interpolated after refinement. More...
 
 CPPUNIT_TEST (testMesh)
 
 CPPUNIT_TEST (testSystem)
 
 CPPUNIT_TEST (testRestart)
 
 CPPUNIT_TEST_SUITE_END ()
 
void setUp ()
 
void tearDown ()
 
void testMesh ()
 
void testSystem ()
 
void testRestart ()
 
 LIBMESH_CPPUNIT_TEST_SUITE (SlitMeshTest)
 The goal of this test is to ensure that a 2D mesh with nodes overlapping on opposite sides of an internal, "slit" edge is usable. More...
 

Protected Member Functions

void build_mesh ()
 

Protected Attributes

System_sys
 
std::unique_ptr< EquationSystems_es
 
std::unique_ptr< Mesh_mesh
 

Detailed Description

Definition at line 264 of file slit_mesh_test.C.

Member Function Documentation

◆ build_mesh()

void SlitMeshTest::build_mesh ( )
inlineprotectedinherited

Definition at line 86 of file slit_mesh_test.C.

References libMesh::Elem::build_with_id(), libMesh::QUAD4, and libMesh::Elem::set_node().

87  {
88  _mesh = std::make_unique<Mesh>(*TestCommWorld);
89 
90  // (-1,1) (0,1) (1,1) (2,1) (3,1)
91  // o----------o----------o----------o----------o
92  // | | | | |
93  // | | | | |
94  // | | | | |
95  // | | | | |
96  // o----------o==========8==========o----------o
97  // (-1,0) (0,0) (1,0) (2,0) (3,0)
98  // | | | | |
99  // | | | | |
100  // | | | | |
101  // o----------o----------o----------o----------o
102  // (-1,-1) (0,-1) (1,-1) (2,-1) (3,-1)
103 
104  _mesh->set_mesh_dimension(2);
105 
106  _mesh->add_point( Point(0.0, 0.0), 0 );
107  _mesh->add_point( Point(1.0, 0.0), 1 );
108  _mesh->add_point( Point(1.0, 1.0), 2 );
109  _mesh->add_point( Point(0.0, 1.0), 3 );
110  _mesh->add_point( Point(0.0,-1.0), 4 );
111  _mesh->add_point( Point(1.0,-1.0), 5 );
112  _mesh->add_point( Point(1.0, 0.0), 6 ); // Doubled!
113  _mesh->add_point( Point(2.0, 0.0), 7 );
114  _mesh->add_point( Point(2.0, 1.0), 8 );
115  _mesh->add_point( Point(2.0,-1.0), 9 );
116  _mesh->add_point( Point(-1.0,-1.0), 10);
117  _mesh->add_point( Point(-1.0, 0.0), 11);
118  _mesh->add_point( Point(-1.0, 1.0), 12);
119  _mesh->add_point( Point(3.0,-1.0), 13);
120  _mesh->add_point( Point(3.0, 0.0), 14);
121  _mesh->add_point( Point(3.0, 1.0), 15);
122 
123  {
124  Elem * elem_top_left = _mesh->add_elem(Elem::build_with_id(QUAD4, 0));
125  elem_top_left->set_node(0) = _mesh->node_ptr(0);
126  elem_top_left->set_node(1) = _mesh->node_ptr(1);
127  elem_top_left->set_node(2) = _mesh->node_ptr(2);
128  elem_top_left->set_node(3) = _mesh->node_ptr(3);
129 
130  Elem * elem_bottom_left = _mesh->add_elem(Elem::build_with_id(QUAD4, 1));
131  elem_bottom_left->set_node(0) = _mesh->node_ptr(4);
132  elem_bottom_left->set_node(1) = _mesh->node_ptr(5);
133  elem_bottom_left->set_node(2) = _mesh->node_ptr(6);
134  elem_bottom_left->set_node(3) = _mesh->node_ptr(0);
135 
136  Elem * elem_top_right = _mesh->add_elem(Elem::build_with_id(QUAD4, 2));
137  elem_top_right->set_node(0) = _mesh->node_ptr(1);
138  elem_top_right->set_node(1) = _mesh->node_ptr(7);
139  elem_top_right->set_node(2) = _mesh->node_ptr(8);
140  elem_top_right->set_node(3) = _mesh->node_ptr(2);
141 
142  Elem * elem_bottom_right = _mesh->add_elem(Elem::build_with_id(QUAD4, 3));
143  elem_bottom_right->set_node(0) = _mesh->node_ptr(5);
144  elem_bottom_right->set_node(1) = _mesh->node_ptr(9);
145  elem_bottom_right->set_node(2) = _mesh->node_ptr(7);
146  elem_bottom_right->set_node(3) = _mesh->node_ptr(6);
147 
148  Elem * elem_top_leftleft = _mesh->add_elem(Elem::build_with_id(QUAD4, 4));
149  elem_top_leftleft->set_node(0) = _mesh->node_ptr(11);
150  elem_top_leftleft->set_node(1) = _mesh->node_ptr(0);
151  elem_top_leftleft->set_node(2) = _mesh->node_ptr(3);
152  elem_top_leftleft->set_node(3) = _mesh->node_ptr(12);
153 
154  Elem * elem_bottom_leftleft = _mesh->add_elem(Elem::build_with_id(QUAD4, 5));
155  elem_bottom_leftleft->set_node(0) = _mesh->node_ptr(10);
156  elem_bottom_leftleft->set_node(1) = _mesh->node_ptr(4);
157  elem_bottom_leftleft->set_node(2) = _mesh->node_ptr(0);
158  elem_bottom_leftleft->set_node(3) = _mesh->node_ptr(11);
159 
160  Elem * elem_top_rightright = _mesh->add_elem(Elem::build_with_id(QUAD4, 6));
161  elem_top_rightright->set_node(0) = _mesh->node_ptr(7);
162  elem_top_rightright->set_node(1) = _mesh->node_ptr(14);
163  elem_top_rightright->set_node(2) = _mesh->node_ptr(15);
164  elem_top_rightright->set_node(3) = _mesh->node_ptr(8);
165 
166  Elem * elem_bottom_rightright = _mesh->add_elem(Elem::build_with_id(QUAD4, 7));
167  elem_bottom_rightright->set_node(0) = _mesh->node_ptr(9);
168  elem_bottom_rightright->set_node(1) = _mesh->node_ptr(13);
169  elem_bottom_rightright->set_node(2) = _mesh->node_ptr(14);
170  elem_bottom_rightright->set_node(3) = _mesh->node_ptr(7);
171  }
172 
173  // libMesh shouldn't renumber, or our based-on-initial-id
174  // assertions later may fail.
175  _mesh->allow_renumbering(false);
176 
177  _mesh->prepare_for_use();
178  }
virtual Node *& set_node(const unsigned int i)
Definition: elem.h:2381
This is the base class from which all geometric element types are derived.
Definition: elem.h:94
std::unique_ptr< Mesh > _mesh
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39

◆ CPPUNIT_TEST() [1/3]

SlitMeshRefinedSystemTest::CPPUNIT_TEST ( testMesh  )

◆ CPPUNIT_TEST() [2/3]

SlitMeshRefinedSystemTest::CPPUNIT_TEST ( testSystem  )

◆ CPPUNIT_TEST() [3/3]

SlitMeshRefinedSystemTest::CPPUNIT_TEST ( testRestart  )

◆ CPPUNIT_TEST_SUITE_END()

SlitMeshRefinedSystemTest::CPPUNIT_TEST_SUITE_END ( )

◆ LIBMESH_CPPUNIT_TEST_SUITE() [1/2]

SlitMeshTest::LIBMESH_CPPUNIT_TEST_SUITE ( SlitMeshTest  )
inherited

The goal of this test is to ensure that a 2D mesh with nodes overlapping on opposite sides of an internal, "slit" edge is usable.

The mesh has to be connected at more than one node on each side of the slit, however, to ensure that we can find point neighbors of each node.

◆ LIBMESH_CPPUNIT_TEST_SUITE() [2/2]

SlitMeshRefinedSystemTest::LIBMESH_CPPUNIT_TEST_SUITE ( SlitMeshRefinedSystemTest  )

The goal of this test is the same as the previous, but now we create a system and set dof values to make sure they are properly interpolated after refinement.

◆ setUp()

void SlitMeshRefinedSystemTest::setUp ( )
inline

Definition at line 292 of file slit_mesh_test.C.

References libMesh::System::add_variable(), libMesh::FIRST, libMesh::System::project_solution(), and libMesh::MeshRefinement::uniformly_refine().

293  {
294 #if LIBMESH_DIM > 1
295  this->build_mesh();
296 
297  // libMesh *should* renumber now, or a DistributedMesh might not
298  // have contiguous ids, which is a requirement to write xda files.
299  _mesh->allow_renumbering(true);
300 
301  _es = std::make_unique<EquationSystems>(*_mesh);
302  _sys = &_es->add_system<System> ("SimpleSystem");
303  _sys->add_variable("u", FIRST);
304 
305  _es->init();
306  SlitFunc slitfunc;
307  _sys->project_solution(&slitfunc);
308 
309 #ifdef LIBMESH_ENABLE_AMR
310  MeshRefinement(*_mesh).uniformly_refine(1);
311  _es->reinit();
312  MeshRefinement(*_mesh).uniformly_refine(1);
313  _es->reinit();
314 #endif
315 #endif
316  }
std::unique_ptr< EquationSystems > _es
void project_solution(FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr) const
Projects arbitrary functions onto the current solution.
Implements (adaptive) mesh refinement algorithms for a MeshBase.
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
std::unique_ptr< Mesh > _mesh
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
Definition: system.C:1305
void build_mesh()
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times.

◆ tearDown()

void SlitMeshRefinedSystemTest::tearDown ( )
inline

Definition at line 318 of file slit_mesh_test.C.

318 {}

◆ testMesh()

void SlitMeshRefinedSystemTest::testMesh ( )
inline

Definition at line 320 of file slit_mesh_test.C.

321  {
322  LOG_UNIT_TEST;
323 
324 #ifdef LIBMESH_ENABLE_AMR
325  // We should have 168 total and 128 active elements.
326  CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(8+32+128), _mesh->n_elem());
327  CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(128), _mesh->n_active_elem());
328 
329  // We should have 160 nodes
330  CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(160), _mesh->n_nodes());
331 #endif
332  }
std::unique_ptr< Mesh > _mesh

◆ testRestart()

void SlitMeshRefinedSystemTest::testRestart ( )
inline

Definition at line 370 of file slit_mesh_test.C.

References dim, libMesh::FEGenericBase< OutputType >::get_phi(), libMesh::EquationSystems::get_system(), libMesh::FEAbstract::get_xyz(), libMesh::libmesh_real(), libMesh::System::n_vars(), libMesh::Elem::node_ref(), libMesh::UnstructuredMesh::read(), libMesh::EquationSystems::read(), TestCommWorld, libMesh::TOLERANCE, libMesh::DofObject::unique_id(), libMesh::EquationSystems::WRITE_DATA, and libMesh::EquationSystems::WRITE_SERIAL_FILES.

371  {
372  LOG_UNIT_TEST;
373 
374  SlitFunc slitfunc;
375 
376  _mesh->write("slit_mesh.xda");
377  _es->write("slit_solution.xda",
378  EquationSystems::WRITE_DATA |
379  EquationSystems::WRITE_SERIAL_FILES);
380 
381  Mesh mesh2(*TestCommWorld);
382  mesh2.read("slit_mesh.xda");
383  EquationSystems es2(mesh2);
384  es2.read("slit_solution.xda");
385 
386  System & sys2 = es2.get_system<System> ("SimpleSystem");
387 
388  unsigned int dim = 2;
389 
390  CPPUNIT_ASSERT_EQUAL( sys2.n_vars(), 1u );
391 
392  FEMContext context(sys2);
393  FEBase * fe = NULL;
394  context.get_element_fe( 0, fe, dim );
395  const std::vector<Point> & xyz = fe->get_xyz();
396  fe->get_phi();
397 
398  // While we're in the middle of a unique id based test case, let's
399  // make sure our unique ids were all read in correctly too.
400  std::unique_ptr<PointLocatorBase> locator = _mesh->sub_point_locator();
401 
402  if (!_mesh->is_serial())
403  locator->enable_out_of_mesh_mode();
404 
405  for (const auto & elem : mesh2.active_local_element_ptr_range())
406  {
407  const Elem * mesh1_elem = (*locator)(elem->vertex_average());
408  if (mesh1_elem)
409  {
410  CPPUNIT_ASSERT_EQUAL( elem->unique_id(),
411  mesh1_elem->unique_id() );
412 
413  for (unsigned int n=0; n != elem->n_nodes(); ++n)
414  {
415  const Node & node = elem->node_ref(n);
416  const Node & mesh1_node = mesh1_elem->node_ref(n);
417  CPPUNIT_ASSERT_EQUAL( node.unique_id(),
418  mesh1_node.unique_id() );
419  }
420  }
421 
422  context.pre_fe_reinit(sys2, elem);
423  context.elem_fe_reinit();
424 
425  const unsigned int n_qp = xyz.size();
426 
427  for (unsigned int qp=0; qp != n_qp; ++qp)
428  {
429  const Number exact_val = slitfunc(context, xyz[qp]);
430 
431  const Number discrete_val = context.interior_value(0, qp);
432 
433  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(exact_val),
434  libmesh_real(discrete_val),
436  }
437  }
438  }
T libmesh_real(T a)
This is the EquationSystems class.
A Node is like a Point, but with more information.
Definition: node.h:52
std::unique_ptr< EquationSystems > _es
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:159
static constexpr Real TOLERANCE
unsigned int dim
This is the base class from which all geometric element types are derived.
Definition: elem.h:94
unique_id_type unique_id() const
Definition: dof_object.h:839
const Node & node_ref(const unsigned int i) const
Definition: elem.h:2353
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
std::unique_ptr< Mesh > _mesh
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
virtual_for_inffe const std::vector< Point > & get_xyz() const
Definition: fe_abstract.h:272
unsigned int n_vars() const
Definition: system.h:2349
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition: mesh.h:50
This class forms the foundation from which generic finite elements may be derived.
const std::vector< std::vector< OutputShape > > & get_phi() const
Definition: fe_base.h:207

◆ testSystem()

void SlitMeshRefinedSystemTest::testSystem ( )
inline

Definition at line 334 of file slit_mesh_test.C.

References dim, libMesh::FEGenericBase< OutputType >::get_phi(), libMesh::FEAbstract::get_xyz(), libMesh::libmesh_real(), libMesh::System::n_vars(), and libMesh::TOLERANCE.

335  {
336  LOG_UNIT_TEST;
337 
338  SlitFunc slitfunc;
339 
340  unsigned int dim = 2;
341 
342  CPPUNIT_ASSERT_EQUAL( _sys->n_vars(), 1u );
343 
344  FEMContext context(*_sys);
345  FEBase * fe = NULL;
346  context.get_element_fe( 0, fe, dim );
347  const std::vector<Point> & xyz = fe->get_xyz();
348  fe->get_phi();
349 
350  for (const auto & elem : _mesh->active_local_element_ptr_range())
351  {
352  context.pre_fe_reinit(*_sys, elem);
353  context.elem_fe_reinit();
354 
355  const unsigned int n_qp = xyz.size();
356 
357  for (unsigned int qp=0; qp != n_qp; ++qp)
358  {
359  const Number exact_val = slitfunc(context, xyz[qp]);
360 
361  const Number discrete_val = context.interior_value(0, qp);
362 
363  LIBMESH_ASSERT_FP_EQUAL(libmesh_real(exact_val),
364  libmesh_real(discrete_val),
366  }
367  }
368  }
T libmesh_real(T a)
static constexpr Real TOLERANCE
unsigned int dim
std::unique_ptr< Mesh > _mesh
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
virtual_for_inffe const std::vector< Point > & get_xyz() const
Definition: fe_abstract.h:272
unsigned int n_vars() const
Definition: system.h:2349
This class forms the foundation from which generic finite elements may be derived.
const std::vector< std::vector< OutputShape > > & get_phi() const
Definition: fe_base.h:207

Member Data Documentation

◆ _es

std::unique_ptr<EquationSystems> SlitMeshRefinedSystemTest::_es
protected

Definition at line 288 of file slit_mesh_test.C.

◆ _mesh

std::unique_ptr<Mesh> SlitMeshTest::_mesh
protectedinherited

Definition at line 84 of file slit_mesh_test.C.

◆ _sys

System* SlitMeshRefinedSystemTest::_sys
protected

Definition at line 287 of file slit_mesh_test.C.


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