libMesh
Loading...
Searching...
No Matches
point_neighbor_coupling_test.C
Go to the documentation of this file.
1#include <libmesh/equation_systems.h>
2#include <libmesh/mesh.h>
3#include <libmesh/mesh_generation.h>
4#include <libmesh/numeric_vector.h>
5#include <libmesh/dof_map.h>
6#include <libmesh/elem.h>
7#include <libmesh/default_coupling.h>
8#include <libmesh/point_neighbor_coupling.h>
9
10#include "test_comm.h"
11#include "libmesh_cppunit.h"
12
13
14using namespace libMesh;
15
16
17
19 const Parameters&,
20 const std::string&,
21 const std::string&)
22{
23 const Real & x = p(0);
24 const Real & y = LIBMESH_DIM > 1 ? p(1) : 0;
25 const Real & z = LIBMESH_DIM > 2 ? p(2) : 0;
26
27 return x*(1-x)*(1-x) + x*x*(1-y) + x*(1-y)*(1-z) + y*(1-y)*z + z*(1-z)*(1-z);
28}
29
30
31
32class PointNeighborCouplingTest : public CppUnit::TestCase {
33public:
35
37#if LIBMESH_DIM > 1
40#endif
41#if LIBMESH_DIM > 2
43#endif
44
46
47private:
48
49public:
50 void setUp()
51 {}
52
53 void tearDown()
54 {}
55
56 void testCoupling(const ElemType elem_type)
57 {
59
61 System &sys = es.add_system<System> ("SimpleSystem");
62 sys.add_variable("u", THIRD, HIERARCHIC);
63
64 // Remove the default DoF ghosting functors
69
70 // Create a replacement functor
71 PointNeighborCoupling point_neighbor_coupling;
72
73 // This just re-sets the default; real users may want a real
74 // coupling matrix instead.
75 point_neighbor_coupling.set_dof_coupling(nullptr);
76
77 point_neighbor_coupling.set_n_levels(3);
78
80 (point_neighbor_coupling);
81
82 const unsigned int n_elem_per_side = 5;
83 const std::unique_ptr<Elem> test_elem = Elem::build(elem_type);
84 const unsigned int ymax = test_elem->dim() > 1;
85 const unsigned int zmax = test_elem->dim() > 2;
86 const unsigned int ny = ymax * n_elem_per_side;
87 const unsigned int nz = zmax * n_elem_per_side;
88
90 n_elem_per_side,
91 ny,
92 nz,
93 0., 1.,
94 0., ymax,
95 0., zmax,
96 elem_type);
97
98 es.init();
100
101 for (const auto & elem : mesh.active_local_element_ptr_range())
102 for (unsigned int s1=0; s1 != elem->n_neighbors(); ++s1)
103 {
104 const Elem * n1 = elem->neighbor_ptr(s1);
105 if (!n1)
106 continue;
107
109
110 // Let's speed up this test by only checking the ghosted
111 // elements which are most likely to break.
112 if (n1->processor_id() == mesh.processor_id())
113 continue;
114
115 for (unsigned int s2=0; s2 != elem->n_neighbors(); ++s2)
116 {
117 const Elem * n2 = elem->neighbor_ptr(s2);
118 if (!n2 ||
119 n2->processor_id() == mesh.processor_id())
120 continue;
121
123
124 for (unsigned int s3=0; s3 != elem->n_neighbors(); ++s3)
125 {
126 const Elem * n3 = elem->neighbor_ptr(s3);
127 if (!n3 ||
128 n3->processor_id() == mesh.processor_id())
129 continue;
130
132
133 Point p = n3->vertex_average();
134
135 LIBMESH_ASSERT_NUMBERS_EQUAL(sys.point_value(0,p,n3),
138 }
139 }
140 }
141 }
142
143
144
145 void testCouplingOnEdge3() { LOG_UNIT_TEST; testCoupling(EDGE3); }
146 void testCouplingOnQuad9() { LOG_UNIT_TEST; testCoupling(QUAD9); }
147 void testCouplingOnTri6() { LOG_UNIT_TEST; testCoupling(TRI6); }
148 void testCouplingOnHex27() { LOG_UNIT_TEST; testCoupling(HEX27); }
149
150};
151
CPPUNIT_TEST(testCouplingOnTri6)
CPPUNIT_TEST(testCouplingOnEdge3)
LIBMESH_CPPUNIT_TEST_SUITE(PointNeighborCouplingTest)
CPPUNIT_TEST(testCouplingOnQuad9)
void testCoupling(const ElemType elem_type)
CPPUNIT_TEST(testCouplingOnHex27)
void remove_coupling_functor(GhostingFunctor &coupling_functor)
Removes a functor which was previously added to the set of coupling functors, from both this DofMap a...
Definition dof_map.C:2032
void remove_algebraic_ghosting_functor(GhostingFunctor &evaluable_functor)
Removes a functor which was previously added to the set of algebraic ghosting functors,...
Definition dof_map.C:2089
DefaultCoupling & default_coupling()
Default coupling functor.
Definition dof_map.h:378
DefaultCoupling & default_algebraic_ghosting()
Default algebraic ghosting functor.
Definition dof_map.h:440
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.
Definition dof_map.C:2062
bool is_evaluable(const DofObjectSubclass &obj, unsigned int var_num=libMesh::invalid_uint) const
Definition dof_map.C:2673
processor_id_type processor_id() const
Definition dof_object.h:881
This is the base class from which all geometric element types are derived.
Definition elem.h:96
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
Definition elem.C:442
const Elem * neighbor_ptr(unsigned int i) const
Definition elem.h:2615
Point vertex_average() const
Definition elem.C:669
This is the EquationSystems class.
Parameters parameters
Data structure holding arbitrary parameters.
virtual void init()
Initialize all the systems.
virtual System & add_system(std::string_view system_type, std::string_view name)
Add the system of type system_type named name to the systems array.
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
Definition mesh.h:51
processor_id_type processor_id() const
This class provides the ability to map between arbitrary, user-defined strings and several data types...
Definition parameters.h:75
This class implements ghosting of point neighbors (elements on the same manifold that share points),...
void set_dof_coupling(const CouplingMatrix *dof_coupling)
void set_n_levels(unsigned int n_levels)
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition point.h:40
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition system.h:100
void project_solution(FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int > > variable_numbers=std::nullopt) const
Projects arbitrary functions onto the current solution.
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
Definition system.C:2219
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:1344
const DofMap & get_dof_map() const
Definition system.h:2417
Communicator * TestCommWorld
MeshBase & mesh
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.
The libMesh namespace provides an interface to certain functionality in the library.
ElemType
Defines an enum for geometric element types.
libmesh_assert(ctx)
static constexpr Real TOLERANCE
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
CPPUNIT_TEST_SUITE_REGISTRATION(PointNeighborCouplingTest)
Number cubic_point_neighbor_coupling_test(const Point &p, const Parameters &, const std::string &, const std::string &)