There is functionality for these features in dolfinx
MWE:
import dolfinx
import dolfinx.geometry
from mpi4py import MPI
import numpy as np
mesh = dolfinx.UnitCubeMesh(MPI.COMM_WORLD, 10, 10, 10)
def closest_point_in_mesh(mesh, point):
points = np.reshape(point, (1,3))
tdim = mesh.topology.dim
bounding_box = dolfinx.geometry.BoundingBoxTree(mesh, tdim)
entity, distance = dolfinx.geometry.compute_closest_entity(bounding_box, points[0], mesh)
mesh_geom = mesh.geometry.x
geom_dofs = dolfinx.cpp.mesh.entities_to_geometry(mesh, tdim, [entity], False)
mesh_nodes = mesh_geom[geom_dofs][0]
displacement = dolfinx.geometry.compute_distance_gjk(points, mesh_nodes)
return points[0] - displacement
point = [1.25, 0.3, 0]
print(closest_point_in_mesh(mesh, point))
point = [1.25, 1.3, 0.1]
print(closest_point_in_mesh(mesh, point))
point = [-1.2, 0.273, -0.3]
print(closest_point_in_mesh(mesh, point))
point = [0.31, 0.57, -0.2]
print(closest_point_in_mesh(mesh, point))
returning
[1. 0.3 0. ]
[1. 1. 0.1]
[0. 0.273 0. ]
[3.10000000e-01 5.70000000e-01 2.77555756e-17]