1
// Copyright (C) 2007 Anders Logg.
2
// Licensed under the GNU LGPL Version 2.1.
4
// First added: 2007-05-14
5
// Last changed: 2007-05-24
7
// Unit tests for the mesh library
10
#include <dolfin/unittest.h>
12
using namespace dolfin;
14
class SimpleShapes : public CppUnit::TestFixture
16
CPPUNIT_TEST_SUITE(SimpleShapes);
17
CPPUNIT_TEST(testUnitSquare);
18
CPPUNIT_TEST(testUnitCube);
19
CPPUNIT_TEST_SUITE_END();
25
// Create mesh of unit square
26
UnitSquare mesh(5, 7);
27
CPPUNIT_ASSERT(mesh.numVertices() == 48);
28
CPPUNIT_ASSERT(mesh.numCells() == 70);
33
// Create mesh of unit cube
34
UnitCube mesh(5, 7, 9);
35
CPPUNIT_ASSERT(mesh.numVertices() == 480);
36
CPPUNIT_ASSERT(mesh.numCells() == 1890);
41
class MeshRefinement : public CppUnit::TestFixture
43
CPPUNIT_TEST_SUITE(MeshRefinement);
44
CPPUNIT_TEST(testRefineUnitSquare);
45
CPPUNIT_TEST(testRefineUnitCube);
46
CPPUNIT_TEST_SUITE_END();
50
void testRefineUnitSquare()
52
// Refine mesh of unit square
53
UnitSquare mesh(5, 7);
55
CPPUNIT_ASSERT(mesh.numVertices() == 165);
56
CPPUNIT_ASSERT(mesh.numCells() == 280);
59
void testRefineUnitCube()
61
// Refine mesh of unit cube
62
UnitCube mesh(5, 7, 9);
64
CPPUNIT_ASSERT(mesh.numVertices() == 3135);
65
CPPUNIT_ASSERT(mesh.numCells() == 15120);
70
class MeshIterators : public CppUnit::TestFixture
72
CPPUNIT_TEST_SUITE(MeshIterators);
73
CPPUNIT_TEST(testVertexIterators);
74
CPPUNIT_TEST(testEdgeIterators);
75
CPPUNIT_TEST(testFaceIterators);
76
CPPUNIT_TEST(testFacetIterators);
77
CPPUNIT_TEST(testCellIterators);
78
CPPUNIT_TEST(testMixedIterators);
79
CPPUNIT_TEST_SUITE_END();
83
void testVertexIterators()
85
// Iterate over vertices
86
UnitCube mesh(5, 5, 5);
88
for (VertexIterator v(mesh); !v.end(); ++v)
90
CPPUNIT_ASSERT(n == mesh.numVertices());
93
void testEdgeIterators()
96
UnitCube mesh(5, 5, 5);
98
for (EdgeIterator e(mesh); !e.end(); ++e)
100
CPPUNIT_ASSERT(n == mesh.numEdges());
103
void testFaceIterators()
105
// Iterate over faces
106
UnitCube mesh(5, 5, 5);
108
for (FaceIterator f(mesh); !f.end(); ++f)
110
CPPUNIT_ASSERT(n == mesh.numFaces());
113
void testFacetIterators()
115
// Iterate over facets
116
UnitCube mesh(5, 5, 5);
118
for (FacetIterator f(mesh); !f.end(); ++f)
120
CPPUNIT_ASSERT(n == mesh.numFacets());
123
void testCellIterators()
125
// Iterate over cells
126
UnitCube mesh(5, 5, 5);
128
for (CellIterator c(mesh); !c.end(); ++c)
130
CPPUNIT_ASSERT(n == mesh.numCells());
133
void testMixedIterators()
135
// Iterate over vertices of cells
136
UnitCube mesh(5, 5, 5);
138
for (CellIterator c(mesh); !c.end(); ++c)
139
for (VertexIterator v(*c); !v.end(); ++v)
141
CPPUNIT_ASSERT(n == 4*mesh.numCells());
146
class BoundaryExtraction : public CppUnit::TestFixture
148
CPPUNIT_TEST_SUITE(BoundaryExtraction);
149
CPPUNIT_TEST(testBoundaryComputation);
150
CPPUNIT_TEST(testBoundaryBoundary);
151
CPPUNIT_TEST_SUITE_END();
155
void testBoundaryComputation()
157
// Compute boundary of mesh
158
UnitCube mesh(2, 2, 2);
159
BoundaryMesh boundary(mesh);
160
CPPUNIT_ASSERT(boundary.numVertices() == 26);
161
CPPUNIT_ASSERT(boundary.numCells() == 48);
164
void testBoundaryBoundary()
166
// Compute boundary of boundary
168
// Note that we can't do
170
// BoundaryMesh b0(mesh);
171
// BoundaryMesh b1(b0);
173
// since b1 would then be a copy of b0 (copy
174
// constructor in Mesh will be used).
176
UnitCube mesh(2, 2, 2);
177
BoundaryMesh b0(mesh);
180
CPPUNIT_ASSERT(b1.numVertices() == 0);
181
CPPUNIT_ASSERT(b1.numCells() == 0);
186
class MeshFunctions : public CppUnit::TestFixture
188
CPPUNIT_TEST_SUITE(MeshFunctions);
189
CPPUNIT_TEST(testAssign);
190
CPPUNIT_TEST_SUITE_END();
196
/// Assign value of mesh function
197
UnitSquare mesh(3, 3);
198
MeshFunction<int> f(mesh, 0);
201
CPPUNIT_ASSERT(f(v) == 10);
206
class InputOutput : public CppUnit::TestFixture
208
CPPUNIT_TEST_SUITE(InputOutput);
209
CPPUNIT_TEST(testMeshXML2D);
210
CPPUNIT_TEST(testMeshXML3D);
211
CPPUNIT_TEST(testMeshMatlab2D);
212
CPPUNIT_TEST(testMeshFunction);
213
CPPUNIT_TEST_SUITE_END();
219
// Write and read 2D mesh to/from file
220
UnitSquare mesh_out(3, 3);
222
File file("unitsquare.xml");
225
CPPUNIT_ASSERT(mesh_in.numVertices() == 16);
230
// Write and read 3D mesh to/from file
231
UnitCube mesh_out(3, 3, 3);
233
File file("unitcube.xml");
236
CPPUNIT_ASSERT(mesh_in.numVertices() == 64);
239
void testMeshMatlab2D()
241
// Write matlab format (no real test)
242
UnitSquare mesh(5, 5);
243
File file("unitsquare.m");
245
CPPUNIT_ASSERT(0 == 0);
248
void testMeshFunction()
250
// Write and read mesh function to/from file
251
UnitSquare mesh(1, 1);
252
MeshFunction<int> f(mesh, 0);
257
File file("meshfunction.xml");
259
MeshFunction<int> g(mesh, 0);
261
for (VertexIterator v(mesh); !v.end(); ++v)
262
CPPUNIT_ASSERT(f(*v) == g(*v));
267
class PyCCInterface : public CppUnit::TestFixture
269
CPPUNIT_TEST_SUITE(PyCCInterface);
270
CPPUNIT_TEST(testGetGeometricalDimension);
271
CPPUNIT_TEST(testGetCoordinates);
272
CPPUNIT_TEST(testGetCells);
273
CPPUNIT_TEST_SUITE_END();
277
void testGetGeometricalDimension()
279
// Get geometrical dimension of mesh
280
UnitSquare mesh(5, 5);
281
CPPUNIT_ASSERT(mesh.geometry().dim() == 2);
284
void testGetCoordinates()
286
// Get coordinates of vertices
287
UnitSquare mesh(5, 5);
288
CPPUNIT_ASSERT(mesh.geometry().size() == 36);
294
UnitSquare mesh(5, 5);
295
CPPUNIT_ASSERT(mesh.topology().size(2) == 50);
300
CPPUNIT_TEST_SUITE_REGISTRATION(SimpleShapes);
301
CPPUNIT_TEST_SUITE_REGISTRATION(MeshRefinement);
302
CPPUNIT_TEST_SUITE_REGISTRATION(MeshIterators);
303
CPPUNIT_TEST_SUITE_REGISTRATION(BoundaryExtraction);
304
CPPUNIT_TEST_SUITE_REGISTRATION(MeshFunctions);
305
CPPUNIT_TEST_SUITE_REGISTRATION(InputOutput);
306
CPPUNIT_TEST_SUITE_REGISTRATION(PyCCInterface);