/test/unit/geometry/python/BoundingBoxTree.py

https://bitbucket.org/pefarrell/dolfin · Python · 385 lines · 253 code · 101 blank · 31 comment · 37 complexity · 42ac66e321b7bee01acdf8499f38a13f MD5 · raw file

  1. """Unit tests for BoundingBoxTree"""
  2. # Copyright (C) 2013 Anders Logg
  3. #
  4. # This file is part of DOLFIN.
  5. #
  6. # DOLFIN is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU Lesser General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # DOLFIN is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU Lesser General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU Lesser General Public License
  17. # along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. # First added: 2013-04-15
  20. # Last changed: 2013-11-14
  21. import unittest
  22. import numpy
  23. from dolfin import BoundingBoxTree
  24. from dolfin import UnitIntervalMesh, UnitSquareMesh, UnitCubeMesh
  25. from dolfin import Point
  26. from dolfin import MPI
  27. class BoundingBoxTreeTest(unittest.TestCase):
  28. #--- compute_collisions with point ---
  29. def test_compute_collisions_point_1d(self):
  30. reference = {1: [4]}
  31. p = Point(0.3)
  32. mesh = UnitIntervalMesh(16)
  33. for dim in range(1, 2):
  34. tree = BoundingBoxTree()
  35. tree.build(mesh, dim)
  36. entities = tree.compute_collisions(p)
  37. if MPI.size(mesh.mpi_comm()) == 1:
  38. self.assertEqual(sorted(entities), reference[dim])
  39. def test_compute_collisions_point_2d(self):
  40. reference = {1: [226],
  41. 2: [136, 137]}
  42. p = Point(0.3, 0.3)
  43. mesh = UnitSquareMesh(16, 16)
  44. for dim in range(1, 3):
  45. tree = BoundingBoxTree()
  46. tree.build(mesh, dim)
  47. entities = tree.compute_collisions(p)
  48. if MPI.size(mesh.mpi_comm()) == 1:
  49. self.assertEqual(sorted(entities), reference[dim])
  50. def test_compute_collisions_point_3d(self):
  51. reference = {1: [1364],
  52. 2: [1967, 1968, 1970, 1972, 1974, 1976],
  53. 3: [876, 877, 878, 879, 880, 881]}
  54. p = Point(0.3, 0.3, 0.3)
  55. mesh = UnitCubeMesh(8, 8, 8)
  56. for dim in range(1, 4):
  57. tree = BoundingBoxTree()
  58. tree.build(mesh, dim)
  59. entities = tree.compute_collisions(p)
  60. if MPI.size(mesh.mpi_comm()) == 1:
  61. self.assertEqual(sorted(entities), reference[dim])
  62. #--- compute_collisions with tree ---
  63. def test_compute_collisions_tree_1d(self):
  64. # Not yet implemented in library
  65. print "FIXME"
  66. def test_compute_collisions_tree_2d(self):
  67. references = [[[20, 21, 22, 23, 28, 29, 30, 31],
  68. [0, 1, 2, 3, 8, 9, 10, 11]],
  69. [[6, 7],
  70. [24, 25]]]
  71. points = [Point(0.52, 0.51), Point(0.9, -0.9)]
  72. for i, point in enumerate(points):
  73. mesh_A = UnitSquareMesh(4, 4)
  74. mesh_B = UnitSquareMesh(4, 4)
  75. mesh_B.translate(point)
  76. tree_A = BoundingBoxTree()
  77. tree_A.build(mesh_A)
  78. tree_B = BoundingBoxTree()
  79. tree_B.build(mesh_B)
  80. entities_A, entities_B = tree_A.compute_collisions(tree_B)
  81. if MPI.size(mesh_A.mpi_comm()) == 1:
  82. self.assertEqual(sorted(entities_A), references[i][0])
  83. self.assertEqual(sorted(entities_B), references[i][1])
  84. def test_compute_collisions_tree_3d(self):
  85. # Not yet implemented in library
  86. print "FIXME"
  87. #--- compute_entity_collisions ---
  88. def test_compute_entity_collisions_1d(self):
  89. reference = [4]
  90. p = Point(0.3)
  91. mesh = UnitIntervalMesh(16)
  92. tree = BoundingBoxTree()
  93. tree.build(mesh)
  94. entities = tree.compute_entity_collisions(p)
  95. if MPI.size(mesh.mpi_comm()) == 1:
  96. self.assertEqual(sorted(entities), reference)
  97. tree = mesh.bounding_box_tree()
  98. entities = tree.compute_entity_collisions(p)
  99. if MPI.size(mesh.mpi_comm()) == 1:
  100. self.assertEqual(sorted(entities), reference)
  101. def test_compute_entity_collisions_2d(self):
  102. reference = [136, 137]
  103. p = Point(0.3, 0.3)
  104. mesh = UnitSquareMesh(16, 16)
  105. tree = BoundingBoxTree()
  106. tree.build(mesh)
  107. entities = tree.compute_entity_collisions(p)
  108. if MPI.size(mesh.mpi_comm()) == 1:
  109. self.assertEqual(sorted(entities), reference)
  110. tree = mesh.bounding_box_tree()
  111. entities = tree.compute_entity_collisions(p)
  112. if MPI.size(mesh.mpi_comm()) == 1:
  113. self.assertEqual(sorted(entities), reference)
  114. def test_compute_entity_collisions_3d(self):
  115. reference = [876, 877, 878, 879, 880, 881]
  116. p = Point(0.3, 0.3, 0.3)
  117. mesh = UnitCubeMesh(8, 8, 8)
  118. tree = BoundingBoxTree()
  119. tree.build(mesh)
  120. entities = tree.compute_entity_collisions(p)
  121. if MPI.size(mesh.mpi_comm()) == 1:
  122. self.assertEqual(sorted(entities), reference)
  123. #--- compute_entity_collisions with tree ---
  124. def test_compute_entity_collisions_tree_1d(self):
  125. # Not yet implemented in library
  126. print "FIXME"
  127. def test_compute_entity_collisions_tree_2d(self):
  128. references = [[[20, 21, 22, 23, 28, 29, 30, 31],
  129. [0, 1, 2, 3, 8, 9, 10, 11]],
  130. [[6],
  131. [25]]]
  132. points = [Point(0.52, 0.51), Point(0.9, -0.9)]
  133. for i, point in enumerate(points):
  134. mesh_A = UnitSquareMesh(4, 4)
  135. mesh_B = UnitSquareMesh(4, 4)
  136. mesh_B.translate(point)
  137. tree_A = BoundingBoxTree()
  138. tree_A.build(mesh_A)
  139. tree_B = BoundingBoxTree()
  140. tree_B.build(mesh_B)
  141. entities_A, entities_B = tree_A.compute_entity_collisions(tree_B)
  142. if MPI.size(mesh_A.mpi_comm()) == 1:
  143. self.assertEqual(sorted(entities_A), references[i][0])
  144. self.assertEqual(sorted(entities_B), references[i][1])
  145. def test_compute_entity_collisions_tree_3d(self):
  146. # Not yet implemented in library
  147. print "FIXME"
  148. #--- compute_first_collision ---
  149. def test_compute_first_collision_1d(self):
  150. reference = {1: [4]}
  151. p = Point(0.3)
  152. mesh = UnitIntervalMesh(16)
  153. for dim in range(1, 2):
  154. tree = BoundingBoxTree()
  155. tree.build(mesh, dim)
  156. first = tree.compute_first_collision(p)
  157. if MPI.size(mesh.mpi_comm()) == 1:
  158. self.assertIn(first, reference[dim])
  159. tree = mesh.bounding_box_tree()
  160. first = tree.compute_first_collision(p)
  161. if MPI.size(mesh.mpi_comm()) == 1:
  162. self.assertIn(first, reference[mesh.topology().dim()])
  163. def test_compute_first_collision_2d(self):
  164. reference = {1: [226],
  165. 2: [136, 137]}
  166. p = Point(0.3, 0.3)
  167. mesh = UnitSquareMesh(16, 16)
  168. for dim in range(1, 3):
  169. tree = BoundingBoxTree()
  170. tree.build(mesh, dim)
  171. first = tree.compute_first_collision(p)
  172. if MPI.size(mesh.mpi_comm()) == 1:
  173. self.assertIn(first, reference[dim])
  174. tree = mesh.bounding_box_tree()
  175. first = tree.compute_first_collision(p)
  176. if MPI.size(mesh.mpi_comm()) == 1:
  177. self.assertIn(first, reference[mesh.topology().dim()])
  178. def test_compute_first_collision_3d(self):
  179. reference = {1: [1364],
  180. 2: [1967, 1968, 1970, 1972, 1974, 1976],
  181. 3: [876, 877, 878, 879, 880, 881]}
  182. p = Point(0.3, 0.3, 0.3)
  183. mesh = UnitCubeMesh(8, 8, 8)
  184. for dim in range(1, 4):
  185. tree = BoundingBoxTree()
  186. tree.build(mesh, dim)
  187. first = tree.compute_first_collision(p)
  188. if MPI.size(mesh.mpi_comm()) == 1:
  189. self.assertIn(first, reference[dim])
  190. tree = mesh.bounding_box_tree()
  191. first = tree.compute_first_collision(p)
  192. if MPI.size(mesh.mpi_comm()) == 1:
  193. self.assertIn(first, reference[mesh.topology().dim()])
  194. #--- compute_first_entity_collision ---
  195. def test_compute_first_entity_collision_1d(self):
  196. reference = [4]
  197. p = Point(0.3)
  198. mesh = UnitIntervalMesh(16)
  199. tree = BoundingBoxTree()
  200. tree.build(mesh)
  201. first = tree.compute_first_entity_collision(p)
  202. if MPI.size(mesh.mpi_comm()) == 1:
  203. self.assertIn(first, reference)
  204. tree = mesh.bounding_box_tree()
  205. first = tree.compute_first_entity_collision(p)
  206. if MPI.size(mesh.mpi_comm()) == 1:
  207. self.assertIn(first, reference)
  208. def test_compute_first_entity_collision_2d(self):
  209. reference = [136, 137]
  210. p = Point(0.3, 0.3)
  211. mesh = UnitSquareMesh(16, 16)
  212. tree = BoundingBoxTree()
  213. tree.build(mesh)
  214. first = tree.compute_first_entity_collision(p)
  215. if MPI.size(mesh.mpi_comm()) == 1:
  216. self.assertIn(first, reference)
  217. tree = mesh.bounding_box_tree()
  218. first = tree.compute_first_entity_collision(p)
  219. if MPI.size(mesh.mpi_comm()) == 1:
  220. self.assertIn(first, reference)
  221. def test_compute_first_entity_collision_3d(self):
  222. reference = [876, 877, 878, 879, 880, 881]
  223. p = Point(0.3, 0.3, 0.3)
  224. mesh = UnitCubeMesh(8, 8, 8)
  225. tree = BoundingBoxTree()
  226. tree.build(mesh)
  227. first = tree.compute_first_entity_collision(p)
  228. if MPI.size(mesh.mpi_comm()) == 1:
  229. self.assertIn(first, reference)
  230. tree = mesh.bounding_box_tree()
  231. first = tree.compute_first_entity_collision(p)
  232. if MPI.size(mesh.mpi_comm()) == 1:
  233. self.assertIn(first, reference)
  234. #--- compute_closest_entity ---
  235. def test_compute_closest_entity_1d(self):
  236. reference = (0, 1.0)
  237. p = Point(-1.0)
  238. mesh = UnitIntervalMesh(16)
  239. tree = BoundingBoxTree()
  240. tree.build(mesh)
  241. entity, distance = tree.compute_closest_entity(p)
  242. if MPI.size(mesh.mpi_comm()) == 1:
  243. self.assertEqual(entity, reference[0])
  244. self.assertAlmostEqual(distance, reference[1])
  245. tree = mesh.bounding_box_tree()
  246. entity, distance = tree.compute_closest_entity(p)
  247. if MPI.size(mesh.mpi_comm()) == 1:
  248. self.assertEqual(entity, reference[0])
  249. self.assertAlmostEqual(distance, reference[1])
  250. def test_compute_closest_entity_2d(self):
  251. reference = (1, 1.0)
  252. p = Point(-1.0, 0.01)
  253. mesh = UnitSquareMesh(16, 16)
  254. tree = BoundingBoxTree()
  255. tree.build(mesh)
  256. entity, distance = tree.compute_closest_entity(p)
  257. if MPI.size(mesh.mpi_comm()) == 1:
  258. self.assertEqual(entity, reference[0])
  259. self.assertAlmostEqual(distance, reference[1])
  260. tree = mesh.bounding_box_tree()
  261. entity, distance = tree.compute_closest_entity(p)
  262. if MPI.size(mesh.mpi_comm()) == 1:
  263. self.assertEqual(entity, reference[0])
  264. self.assertAlmostEqual(distance, reference[1])
  265. def test_compute_closest_entity_3d(self):
  266. reference = (0, 0.1)
  267. p = Point(0.1, 0.05, -0.1)
  268. mesh = UnitCubeMesh(8, 8, 8)
  269. tree = BoundingBoxTree()
  270. tree.build(mesh)
  271. entity, distance = tree.compute_closest_entity(p)
  272. if MPI.size(mesh.mpi_comm()) == 1:
  273. self.assertEqual(entity, reference[0])
  274. self.assertAlmostEqual(distance, reference[1])
  275. tree = mesh.bounding_box_tree()
  276. entity, distance = tree.compute_closest_entity(p)
  277. if MPI.size(mesh.mpi_comm()) == 1:
  278. self.assertEqual(entity, reference[0])
  279. self.assertAlmostEqual(distance, reference[1])
  280. if __name__ == "__main__":
  281. print ""
  282. print "Testing BoundingBoxTree"
  283. print "------------------------------------------------"
  284. unittest.main()