def test_compute_first_collision_3d():

    # FIXME: This test should not use facet indices as there are no guarantees
    # on how DOLFIN numbers facets

    reference = {
        1: [1364],
        2: [1967, 1968, 1970, 1972, 1974, 1976],
        3: [876, 877, 878, 879, 880, 881]
    }

    p = Point(0.3, 0.3, 0.3)
    mesh = UnitCubeMesh(MPI.comm_world, 8, 8, 8)
    for dim in range(1, 4):
        tree = BoundingBoxTree(mesh.geometry.dim)
        tree.build_mesh(mesh, dim)
        first = tree.compute_first_collision(p)

        # FIXME: Face and test is excluded because it mistakingly
        # relies in the facet indices
        tdim = mesh.topology.dim
        if dim != tdim - 1 and dim != tdim - 2:
            assert first in reference[dim]

    # FIXME: remove after Mesh is wrapped in Python
    tree_cpp = mesh.bounding_box_tree()
    tree = BoundingBoxTree()
    tree._cpp_object = tree_cpp

    first = tree.compute_first_collision(p)
    assert first in reference[mesh.topology.dim]
def test_compute_first_collision_2d():

    # FIXME: This test should not use facet indices as there are no guarantees
    # on how DOLFIN numbers facets
    reference = {1: [226], 2: [136, 137]}

    p = Point(0.3, 0.3)
    mesh = UnitSquareMesh(MPI.comm_world, 16, 16)
    for dim in range(1, 3):
        tree = BoundingBoxTree(mesh.geometry.dim)
        tree.build_mesh(mesh, dim)
        first = tree.compute_first_collision(p)

        # FIXME: Facet test is excluded because it mistakingly relies in the
        # facet indices
        if dim != mesh.topology.dim - 1:
            assert first in reference[dim]

    # FIXME: remove after Mesh is wrapped in Python
    tree_cpp = mesh.bounding_box_tree()
    tree = BoundingBoxTree()
    tree._cpp_object = tree_cpp

    first = tree.compute_first_collision(p)
    assert first in reference[mesh.topology.dim]
def test_compute_first_entity_collision_3d():

    reference = [876, 877, 878, 879, 880, 881]

    p = Point(0.3, 0.3, 0.3)
    mesh = UnitCubeMesh(MPI.comm_world, 8, 8, 8)
    tree = BoundingBoxTree(mesh.geometry.dim)
    tree.build_mesh(mesh, mesh.topology.dim)
    first = tree.compute_first_entity_collision(p, mesh)
    assert first in reference

    # FIXME: remove after Mesh is wrapped in Python
    tree_cpp = mesh.bounding_box_tree()
    tree = BoundingBoxTree()
    tree._cpp_object = tree_cpp

    first = tree.compute_first_entity_collision(p, mesh)
    assert first in reference
def test_compute_first_collision_1d():

    reference = {1: [4]}

    p = Point(0.3)
    mesh = UnitIntervalMesh(MPI.comm_world, 16)
    for dim in range(1, 2):
        tree = BoundingBoxTree(mesh.geometry.dim)
        tree.build_mesh(mesh, dim)
        first = tree.compute_first_collision(p)
        assert first in reference[dim]

    # FIXME: remove after Mesh is wrapped in Python
    tree_cpp = mesh.bounding_box_tree()
    tree = BoundingBoxTree()
    tree._cpp_object = tree_cpp

    first = tree.compute_first_collision(p)
    assert first in reference[mesh.topology.dim]
def test_compute_entity_collisions_2d():

    reference = set([136, 137])

    p = Point(0.3, 0.3)
    mesh = UnitSquareMesh(MPI.comm_world, 16, 16)

    tree = BoundingBoxTree(mesh.geometry.dim)
    tree.build_mesh(mesh, mesh.topology.dim)
    entities = tree.compute_entity_collisions_mesh(p, mesh)
    assert set(entities) == reference

    # FIXME: remove after Mesh is wrapped in Python
    tree_cpp = mesh.bounding_box_tree()
    tree = BoundingBoxTree()
    tree._cpp_object = tree_cpp

    entities = tree.compute_entity_collisions_mesh(p, mesh)
    assert set(entities) == reference
def test_manifold_point_search():
    # Simple two-triangle surface in 3d
    vertices = [(0.0, 0.0, 1.0), (1.0, 1.0, 1.0), (1.0, 0.0, 0.0),
                (0.0, 1.0, 0.0)]
    cells = [(0, 1, 2), (0, 1, 3)]
    mesh = Mesh(MPI.comm_world, CellType.Type.triangle,
                numpy.array(vertices, dtype=numpy.float64),
                numpy.array(cells, dtype=numpy.int32), [],
                cpp.mesh.GhostMode.none)

    bb = BoundingBoxTree()
    bb_cpp = mesh.bounding_box_tree()
    bb._cpp_object = bb_cpp

    p = Point(0.5, 0.25, 0.75)
    assert bb.compute_first_entity_collision(p, mesh) == 0

    p = Point(0.25, 0.5, 0.75)
    assert bb.compute_first_entity_collision(p, mesh) == 1
def test_compute_closest_entity_3d():

    reference = (0, 0.1)

    p = Point(0.1, 0.05, -0.1)
    mesh = UnitCubeMesh(MPI.comm_world, 8, 8, 8)
    tree = BoundingBoxTree(mesh.geometry.dim)
    tree.build_mesh(mesh, mesh.topology.dim)
    entity, distance = tree.compute_closest_entity(p, mesh)

    assert entity == reference[0]
    assert round(distance - reference[1], 7) == 0

    # FIXME: remove after Mesh is wrapped in Python
    tree_cpp = mesh.bounding_box_tree()
    tree = BoundingBoxTree()
    tree._cpp_object = tree_cpp

    entity, distance = tree.compute_closest_entity(p, mesh)
    assert entity == reference[0]
    assert round(distance - reference[1], 7) == 0