1 #include <libmesh/equation_systems.h> 2 #include <libmesh/mesh.h> 3 #include <libmesh/mesh_generation.h> 4 #include <libmesh/edge_edge2.h> 5 #include <libmesh/face_quad4.h> 6 #include <libmesh/cell_hex8.h> 7 #include <libmesh/dof_map.h> 8 #include <libmesh/linear_implicit_system.h> 9 #include <libmesh/mesh_refinement.h> 11 #include <libmesh/discontinuity_measure.h> 12 #include <libmesh/error_vector.h> 13 #include <libmesh/overlap_coupling.h> 31 virtual std::unique_ptr<FEMFunctionBase<Number>>
34 return std::make_unique<SlitFunc>();
39 const Real = 0.)
override 43 const Real & x = p(0);
44 const Real & y = p(1);
46 const Real sign = centroid(1)/std::abs(centroid(1));
50 return (abs(x) + abs(2-x) - 2*abs(1-x)) * (1-abs(y)) * sign;
58 for (
unsigned int i=0; i != output.
size(); ++i)
59 output(i) = (*this)(c, p, time);
81 CPPUNIT_TEST( testMesh );
84 CPPUNIT_TEST_SUITE_END();
92 _mesh = std::make_unique<Mesh>(*TestCommWorld);
108 _mesh->set_mesh_dimension(2);
110 _mesh->add_point(
Point(0.0, 0.0), 0 );
111 _mesh->add_point(
Point(1.0, 0.0), 1 );
112 _mesh->add_point(
Point(1.0, 1.0), 2 );
113 _mesh->add_point(
Point(0.0, 1.0), 3 );
114 _mesh->add_point(
Point(0.0,-1.0), 4 );
115 _mesh->add_point(
Point(1.0,-1.0), 5 );
116 _mesh->add_point(
Point(1.0, 0.0), 6 );
117 _mesh->add_point(
Point(2.0, 0.0), 7 );
118 _mesh->add_point(
Point(2.0, 1.0), 8 );
119 _mesh->add_point(
Point(2.0,-1.0), 9 );
120 _mesh->add_point(
Point(-1.0,-1.0), 10);
121 _mesh->add_point(
Point(-1.0, 0.0), 11);
122 _mesh->add_point(
Point(-1.0, 1.0), 12);
123 _mesh->add_point(
Point(3.0,-1.0), 13);
124 _mesh->add_point(
Point(3.0, 0.0), 14);
125 _mesh->add_point(
Point(3.0, 1.0), 15);
129 elem_top_left->
set_node(0, _mesh->node_ptr(0));
130 elem_top_left->
set_node(1, _mesh->node_ptr(1));
131 elem_top_left->
set_node(2, _mesh->node_ptr(2));
132 elem_top_left->
set_node(3, _mesh->node_ptr(3));
135 elem_bottom_left->
set_node(0, _mesh->node_ptr(4));
136 elem_bottom_left->
set_node(1, _mesh->node_ptr(5));
137 elem_bottom_left->
set_node(2, _mesh->node_ptr(6));
138 elem_bottom_left->
set_node(3, _mesh->node_ptr(0));
141 elem_top_right->
set_node(0, _mesh->node_ptr(1));
142 elem_top_right->
set_node(1, _mesh->node_ptr(7));
143 elem_top_right->
set_node(2, _mesh->node_ptr(8));
144 elem_top_right->
set_node(3, _mesh->node_ptr(2));
147 elem_bottom_right->
set_node(0, _mesh->node_ptr(5));
148 elem_bottom_right->
set_node(1, _mesh->node_ptr(9));
149 elem_bottom_right->
set_node(2, _mesh->node_ptr(7));
150 elem_bottom_right->
set_node(3, _mesh->node_ptr(6));
153 elem_top_leftleft->
set_node(0, _mesh->node_ptr(11));
154 elem_top_leftleft->
set_node(1, _mesh->node_ptr(0));
155 elem_top_leftleft->
set_node(2, _mesh->node_ptr(3));
156 elem_top_leftleft->
set_node(3, _mesh->node_ptr(12));
159 elem_bottom_leftleft->
set_node(0, _mesh->node_ptr(10));
160 elem_bottom_leftleft->
set_node(1, _mesh->node_ptr(4));
161 elem_bottom_leftleft->
set_node(2, _mesh->node_ptr(0));
162 elem_bottom_leftleft->
set_node(3, _mesh->node_ptr(11));
165 elem_top_rightright->
set_node(0, _mesh->node_ptr(7));
166 elem_top_rightright->
set_node(1, _mesh->node_ptr(14));
167 elem_top_rightright->
set_node(2, _mesh->node_ptr(15));
168 elem_top_rightright->
set_node(3, _mesh->node_ptr(8));
171 elem_bottom_rightright->
set_node(0, _mesh->node_ptr(9));
172 elem_bottom_rightright->
set_node(1, _mesh->node_ptr(13));
173 elem_bottom_rightright->
set_node(2, _mesh->node_ptr(14));
174 elem_bottom_rightright->
set_node(3, _mesh->node_ptr(7));
179 _mesh->allow_renumbering(
false);
181 _mesh->prepare_for_use();
199 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(8), _mesh->n_elem());
202 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(16), _mesh->n_nodes());
206 if (_mesh->query_elem_ptr(0) && _mesh->query_elem_ptr(1))
207 CPPUNIT_ASSERT( _mesh->elem_ref(0).node_id(1) != _mesh->elem_ref(1).node_id(2) );
208 if (_mesh->query_elem_ptr(2) && _mesh->query_elem_ptr(3))
209 CPPUNIT_ASSERT( _mesh->elem_ref(2).node_id(0) != _mesh->elem_ref(3).node_id(3) );
213 if (_mesh->query_elem_ptr(0) && _mesh->query_elem_ptr(2))
214 CPPUNIT_ASSERT_EQUAL( _mesh->elem_ref(0).node_id(1),
215 _mesh->elem_ref(2).node_id(0) );
216 if (_mesh->query_elem_ptr(1) && _mesh->query_elem_ptr(3))
217 CPPUNIT_ASSERT_EQUAL( _mesh->elem_ref(1).node_id(2),
218 _mesh->elem_ref(3).node_id(3) );
234 CPPUNIT_TEST( testMesh );
237 CPPUNIT_TEST_SUITE_END();
247 #ifdef LIBMESH_ENABLE_AMR 257 #ifdef LIBMESH_ENABLE_AMR 259 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(40), _mesh->n_elem());
260 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(32), _mesh->n_active_elem());
263 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(48), _mesh->n_nodes());
278 CPPUNIT_TEST( testMesh );
280 CPPUNIT_TEST( testSystem );
282 #ifdef LIBMESH_ENABLE_UNIQUE_ID 283 CPPUNIT_TEST( testRestart );
287 CPPUNIT_TEST_SUITE_END();
292 std::unique_ptr<EquationSystems>
_es;
303 _mesh->allow_renumbering(
true);
305 _es = std::make_unique<EquationSystems>(*_mesh);
306 _sys = &_es->add_system<
System> (
"SimpleSystem");
313 (std::make_shared<OverlapCoupling>());
314 _mesh->delete_remote_elements();
320 #ifdef LIBMESH_ENABLE_AMR 335 #ifdef LIBMESH_ENABLE_AMR 337 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(8+32+128), _mesh->n_elem());
338 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(128), _mesh->n_active_elem());
341 CPPUNIT_ASSERT_EQUAL(static_cast<dof_id_type>(160), _mesh->n_nodes());
351 unsigned int dim = 2;
353 CPPUNIT_ASSERT_EQUAL( _sys->
n_vars(), 1u );
357 context.get_element_fe( 0, fe,
dim );
358 const std::vector<Point> & xyz = fe->
get_xyz();
361 for (
const auto & elem : _mesh->active_local_element_ptr_range())
363 context.pre_fe_reinit(*_sys, elem);
364 context.elem_fe_reinit();
366 const unsigned int n_qp = xyz.size();
368 for (
unsigned int qp=0; qp != n_qp; ++qp)
370 const Number exact_val = slitfunc(context, xyz[qp]);
372 const Number discrete_val = context.interior_value(0, qp);
374 LIBMESH_ASSERT_NUMBERS_EQUAL
384 const Real mean_connected_disc = connected_err.
mean();
385 CPPUNIT_ASSERT_LESS(
Real(1e-14), mean_connected_disc);
392 const Real mean_slit_disc = slit_disc.
mean();
393 CPPUNIT_ASSERT_GREATER(
Real(1e-3), mean_slit_disc);
402 _mesh->write(
"slit_mesh.xda");
403 _es->write(
"slit_solution.xda",
408 mesh2.
read(
"slit_mesh.xda");
410 es2.
read(
"slit_solution.xda");
414 unsigned int dim = 2;
416 CPPUNIT_ASSERT_EQUAL( sys2.
n_vars(), 1u );
420 context.get_element_fe( 0, fe,
dim );
421 const std::vector<Point> & xyz = fe->
get_xyz();
426 std::unique_ptr<PointLocatorBase> locator = _mesh->sub_point_locator();
428 if (!_mesh->is_serial())
429 locator->enable_out_of_mesh_mode();
431 for (
const auto & elem : mesh2.active_local_element_ptr_range())
433 const Elem * mesh1_elem = (*locator)(elem->vertex_average());
436 CPPUNIT_ASSERT_EQUAL( elem->unique_id(),
439 for (
unsigned int n=0; n != elem->n_nodes(); ++n)
441 const Node & node = elem->node_ref(n);
448 context.pre_fe_reinit(sys2, elem);
449 context.elem_fe_reinit();
451 const unsigned int n_qp = xyz.size();
453 for (
unsigned int qp=0; qp != n_qp; ++qp)
455 const Number exact_val = slitfunc(context, xyz[qp]);
457 const Number discrete_val = context.interior_value(0, qp);
459 LIBMESH_ASSERT_NUMBERS_EQUAL
This is the EquationSystems class.
virtual Node *& set_node(const unsigned int i)
A Node is like a Point, but with more information.
std::unique_ptr< EquationSystems > _es
libMesh::Parallel::Communicator * TestCommWorld
static constexpr Real TOLERANCE
const Elem & get_elem() const
Accessor for current Elem object.
The ErrorVector is a specialization of the StatisticsVector for error data computed on a finite eleme...
CPPUNIT_TEST_SUITE_REGISTRATION(SlitMeshTest)
This is the base class from which all geometric element types are derived.
virtual std::unique_ptr< FEMFunctionBase< Number > > clone() const override
unique_id_type unique_id() const
bool integrate_slits
A boolean flag, by default false, to be set to true if integrations should be performed on "slits" wh...
The libMesh namespace provides an interface to certain functionality in the library.
const T_sys & get_system(std::string_view name) const
This class measures discontinuities between elements for debugging purposes.
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.
const Node & node_ref(const unsigned int i) const
Manages consistently variables, degrees of freedom, and coefficient vectors.
std::unique_ptr< Mesh > _mesh
This class provides all data required for a physics package (e.g.
void read(std::string_view name, const XdrMODE, const unsigned int read_flags=(READ_HEADER|READ_DATA), bool partition_agnostic=true)
Read & initialize the systems from disk using the XDR data format.
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.
virtual_for_inffe const std::vector< Point > & get_xyz() const
virtual void init_context(const FEMContext &) override
Prepares a context object for use.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static std::unique_ptr< Elem > build_with_id(const ElemType type, dof_id_type id)
Calls the build() method above with a nullptr parent, and additionally sets the newly-created Elem's ...
virtual unsigned int size() const override final
virtual void estimate_error(const System &system, ErrorVector &error_per_cell, const NumericVector< Number > *solution_vector=nullptr, bool estimate_parent_error=false) override
This function uses the derived class's jump error estimate formula to estimate the error on each cell...
unsigned int n_vars() const
virtual void read(const std::string &name, void *mesh_data=nullptr, bool skip_renumber_nodes_and_elements=false, bool skip_find_neighbors=false) override
Reads the file specified by name.
void add_algebraic_ghosting_functor(GhostingFunctor &evaluable_functor, bool to_mesh=true)
Adds a functor which can specify algebraic ghosting requirements for use with distributed vectors...
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
FEMFunctionBase is a base class from which users can derive in order to define "function-like" object...
const DofMap & get_dof_map() const
A Point defines a location in LIBMESH_DIM dimensional Real space.
This class forms the foundation from which generic finite elements may be derived.
Point vertex_average() const
virtual Real mean() const override
const std::vector< std::vector< OutputShape > > & get_phi() const
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times.