Source code for optimism.contact.Search

from optimism.JaxConfig import *
from optimism import Surface
from optimism.contact import EdgeIntersection
from optimism import QuadratureRule


[docs] def get_coords_and_distances(mesh, ray, edge, neighbor): neighborCoords = Surface.get_coords(mesh, neighbor) distance, parCoord = EdgeIntersection.compute_valid_ray_trace_distance(neighborCoords, ray) distance = if_then_else(np.all(neighbor==edge), np.inf, distance) return np.array([distance, parCoord])
[docs] def get_best_neighbor(mesh, edge, listOfEdges, normal, x): ray = np.array([x, normal]) coordsAndDists = vmap(get_coords_and_distances, (None,None,None,0))(mesh, ray, edge, listOfEdges) bestNeighbor = np.argmin(coordsAndDists[:,0]) return np.array([bestNeighbor, coordsAndDists[bestNeighbor,1]])
[docs] def get_best_neighbors(mesh, quadRule, listOfEdges, edge): edgeCoords = Surface.get_coords(mesh, edge) normal = Surface.compute_normal(edgeCoords) edgeLocations = QuadratureRule.eval_at_iso_points(quadRule.xigauss, edgeCoords) return vmap(get_best_neighbor, (None, None, None, None, 0))(mesh, edge, listOfEdges, normal, edgeLocations)
#@jit
[docs] def construct_edge_neighbor_map(mesh, quadRule, edges): return vmap(get_best_neighbors, (None, None, None, 0))(mesh, quadRule, edges, edges)