forked from ufz/ogs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTestNodeAdjacencyTable.cpp
132 lines (111 loc) · 4.6 KB
/
TestNodeAdjacencyTable.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
* \copyright
* Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
*/
#include "gtest/gtest.h"
#include <memory>
#include "MeshLib/Elements/Element.h"
#include "MeshLib/Mesh.h"
#include "MeshLib/MeshGenerators/MeshGenerator.h"
#include "MeshLib/Node.h"
#include "MeshLib/NodeAdjacencyTable.h"
TEST(MeshLib, CreateNodeAdjacencyTable1D)
{
using namespace MeshLib;
std::unique_ptr<Mesh> mesh(
MeshGenerator::generateLineMesh(double(1), std::size_t(10)));
NodeAdjacencyTable table(mesh->getNodes());
// There must be as many entries as there are nodes in the mesh.
ASSERT_EQ(mesh->getNumberOfNodes(), table.size());
// Minimum connectivity for line mesh is 2 for boundary nodes,
// and the maximum is 3 for interior nodes.
std::size_t const nnodes = mesh->getNumberOfNodes();
for (std::size_t i = 0; i < nnodes; ++i)
{
std::size_t const n_connections = table.getNodeDegree(i);
std::size_t const n_elements = mesh->getNode(i)->getNumberOfElements();
switch (n_elements)
{
case 1: // a corner node has 2 adjacent nodes.
ASSERT_EQ(2, n_connections) << " for boundary node " << i;
break;
case 2: // an interior node has 3 adjacent nodes.
ASSERT_EQ(3, n_connections) << " for interior node " << i;
break;
default:
FAIL() << "The regular line mesh node has unexpected number "
<< "of elements. Node " << i << " has " << n_elements
<< " elements.";
}
}
}
TEST(MeshLib, CreateNodeAdjacencyTable2D)
{
using namespace MeshLib;
std::unique_ptr<Mesh> mesh(MeshGenerator::generateRegularQuadMesh(
1, 1, std::size_t(10), std::size_t(10)));
NodeAdjacencyTable table(mesh->getNodes());
// There must be as many entries as there are nodes in the mesh.
ASSERT_EQ(mesh->getNumberOfNodes(), table.size());
std::size_t const nnodes = mesh->getNumberOfNodes();
for (std::size_t i = 0; i < nnodes; ++i)
{
std::size_t const n_connections = table.getNodeDegree(i);
std::size_t const n_elements = mesh->getNode(i)->getNumberOfElements();
switch (n_elements)
{
case 1: // a corner node has 4 adjacent nodes.
ASSERT_EQ(4, n_connections) << " for corner node " << i;
break;
case 2: // a boundary node has 6 adjacent nodes.
ASSERT_EQ(6, n_connections) << " for boundary node " << i;
break;
case 4: // an interior node has 9 connections.
ASSERT_EQ(9, n_connections) << " for interior node " << i;
break;
default:
FAIL() << "The regular quad mesh node has unexpected number "
<< "of elements. Node " << i << " has " << n_elements
<< " elements.";
}
}
}
TEST(MeshLib, CreateNodeAdjacencyTable3D)
{
using namespace MeshLib;
std::unique_ptr<Mesh> mesh(MeshGenerator::generateRegularHexMesh(
1, 1, 1, 10.0, 10.0, 10.0));
//double(1), double(1), double(1), std::size_t(10), std::size_t(10), std::size_t(10)));
NodeAdjacencyTable table(mesh->getNodes());
// There must be as many entries as there are nodes in the mesh.
ASSERT_EQ(mesh->getNumberOfNodes(), table.size());
std::size_t const nnodes = mesh->getNumberOfNodes();
for (std::size_t i = 0; i < nnodes; ++i)
{
std::size_t const n_connections = table.getNodeDegree(i);
std::size_t const n_elements = mesh->getNode(i)->getNumberOfElements();
switch (n_elements)
{
case 1: // a corner node has 8 adjacent nodes.
ASSERT_EQ(8, n_connections) << " for corner node " << i;
break;
case 2: // an edge node has 12 adjacent nodes.
ASSERT_EQ(12, n_connections) << " for edge node " << i;
break;
case 3: // a boundary node has 18 adjacent nodes.
ASSERT_EQ(18, n_connections) << " for boundary node " << i;
break;
case 4: // an interior node has 27 connections.
ASSERT_EQ(27, n_connections) << " for interior node " << i;
break;
default:
FAIL() << "The regular hex mesh node has unexpected number "
<< "of elements. Node " << i << " has " << n_elements
<< " elements.";
}
}
}