1
"""Unit tests for the CollisionDetection class"""
3
# Copyright (C) 2014 Anders Logg and August Johansson
5
# This file is part of DOLFIN.
7
# DOLFIN is free software: you can redistribute it and/or modify
8
# it under the terms of the GNU Lesser General Public License as published by
9
# the Free Software Foundation, either version 3 of the License, or
10
# (at your option) any later version.
12
# DOLFIN is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU Lesser General Public License for more details.
17
# You should have received a copy of the GNU Lesser General Public License
18
# along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
20
# First added: 2014-02-16
21
# Last changed: 2014-05-30
26
def create_triangular_mesh_3D():
31
editor.init_vertices(4)
32
editor.add_cell(0, 0,1,2)
33
editor.add_cell(1, 1,2,3)
34
editor.add_vertex(0, 0,0,0.5)
35
editor.add_vertex(1, 1,0,0.5)
36
editor.add_vertex(2, 0,1,0.5)
37
editor.add_vertex(3, 1,1,0.5)
41
@unittest.skipIf(MPI.size(mpi_comm_world()) > 1, "Skipping unit test(s) not working in parallel")
42
class IntervalTest(unittest.TestCase):
43
"Test class for collision with interval"
45
def test_collides_point(self):
47
mesh = UnitIntervalMesh(1)
50
self.assertEqual(cell.collides(Point(0.5)), True)
51
self.assertEqual(cell.collides(Point(1.5)), False)
53
@unittest.skipIf(MPI.size(mpi_comm_world()) > 1, "Skipping unit test(s) not working in parallel")
54
class TriangleTest(unittest.TestCase):
55
"Test class for collision with triangle"
57
def test_collides_point(self):
59
mesh = UnitSquareMesh(1, 1)
62
self.assertEqual(cell.collides(Point(0.5)), True)
63
self.assertEqual(cell.collides(Point(1.5)), False)
65
def test_collides_triangle(self):
67
m0 = UnitSquareMesh(8, 8)
70
m1 = UnitSquareMesh(8, 8)
71
m1.translate(Point(0.1, 0.1))
75
self.assertEqual(c0.collides(c0), True)
76
self.assertEqual(c0.collides(c1), True)
77
# self.assertEqual(c0.collides(c2), False) # touching edges
78
self.assertEqual(c1.collides(c0), True)
79
self.assertEqual(c1.collides(c1), True)
80
self.assertEqual(c1.collides(c2), False)
81
# self.assertEqual(c2.collides(c0), False) # touching edges
82
self.assertEqual(c2.collides(c1), False)
83
self.assertEqual(c2.collides(c2), True)
85
@unittest.skipIf(MPI.size(mpi_comm_world()) > 1, "Skipping unit test(s) not working in parallel")
86
class TetrahedronTest(unittest.TestCase):
87
"Test class for collision with tetrahedron"
89
def test_collides_point(self):
91
mesh = UnitCubeMesh(1, 1, 1)
94
self.assertEqual(cell.collides(Point(0.5)), True)
95
self.assertEqual(cell.collides(Point(1.5)), False)
97
def test_collides_triangle(self):
99
tetmesh = UnitCubeMesh(2, 2, 2)
100
trimesh = create_triangular_mesh_3D()
101
dx = Point(0.1, 0.1, -0.1)
102
trimesh_shift = create_triangular_mesh_3D()
103
trimesh_shift.translate(dx)
105
tet0 = Cell(tetmesh, 18)
106
tet1 = Cell(tetmesh, 19)
107
tri0 = Cell(trimesh, 1)
108
tri0shift = Cell(trimesh_shift, 1)
110
# proper intersection
111
self.assertEqual(tet0.collides(tri0shift), True)
112
self.assertEqual(tri0shift.collides(tet0), True)
113
self.assertEqual(tet1.collides(tri0shift), True)
114
self.assertEqual(tri0shift.collides(tet1), True)
117
self.assertEqual(tet0.collides(tri0), True)
118
self.assertEqual(tri0.collides(tet0), True)
120
# face alignment (true or false)
121
self.assertEqual(tet1.collides(tri0), True)
122
self.assertEqual(tri0.collides(tet1), True)
124
def test_collides_tetrahedron(self):
126
m0 = UnitCubeMesh(2, 2, 2)
133
m1 = UnitCubeMesh(1,1,1)
134
m1.translate(Point(0.5, 0.5, 0.5))
139
self.assertEqual(c3.collides(c3), True)
140
self.assertEqual(c45.collides(c45), True)
142
# standard collisions
143
self.assertEqual(c3.collides(c37), True)
144
self.assertEqual(c37.collides(c3), True)
147
self.assertEqual(c5.collides(c45), True)
148
self.assertEqual(c45.collides(c5), True)
151
self.assertEqual(c5.collides(c19), False)
152
self.assertEqual(c19.collides(c5), False)
155
self.assertEqual(c3.collides(c43), True)
156
self.assertEqual(c43.collides(c3), True)
158
if __name__ == "__main__":