How to determine whether a point belongs to a mesh cell

Hi,

This might be a very simple question but can’t find an easy solution to it. Suppose I have a point which lies strictly inside of a mesh cell.
1- What is the fastest way to extract the ID and vertices of that cell?
2- What if that point is exactly a mesh point? Which cell ID will I get as the answer?

Here is a minimal code with a mesh and the x,y,z coordinates of a point which I am sure lies strictly inside of a cell. How can I answer the above questions for this code?

from dolfin import *

meshlevel =10
degree = 1
dim = 2
mesh = UnitDiscMesh.create(MPI.comm_world,meshlevel, degree, dim)

Px = -0.519
Py = 0.33
Pz = 0.0

The following code illustrates all your questions:

from dolfin import *

meshlevel =10
degree = 1
dim = 2
mesh = UnitDiscMesh.create(MPI.comm_world,meshlevel, degree, dim)

Px = -0.519
Py = 0.33
Pz = 0.0

p = Point(Px, Py, Pz)
tree = BoundingBoxTree()
tree.build(mesh)
first = tree.compute_first_entity_collision(p)
print(first)
c_to_v = mesh.topology()(mesh.topology().dim(), 0)
print(c_to_v(first), mesh.coordinates()[c_to_v(first)])


p0 = Point(mesh.coordinates()[0])


all_cells = tree.compute_entity_collisions(p0)
print(mesh.coordinates()[0])
for cell in all_cells:
    print(cell, c_to_v(cell), mesh.coordinates()[c_to_v(cell)])

You can choose to either get the first entity collision (as traversed through the boundingboxtree) or get all of them and then choose one of them.

1 Like

Wow. This is exactly what I was looking for. So the key is BoundingBoxTree. Thank you so much.