smbinterp/interp/grid/simplex.py

65 lines
1.4 KiB
Python

from interp.baker import get_phis, get_phis_3D
from interp.tools import log
TOL = 1e-8
def contains(X, R):
"""
tests if X (point) is in R (a simplex,
represented by a list of n-degree coordinates)
it now correctly checks for 2/3-D verts
"""
if len(R) == 3:
phis = get_phis(X, R)
elif len(R) == 4:
phis = get_phis_3D(X, R)
r = True
if [i for i in phis if i < 0.0 - TOL]:
r = False
return r
class face(object):
def __init__(self, name):
self.name = name
self.verts = []
self.neighbors = []
def add_vert(self, v):
"""
v should be an index into grid.verts
"""
self.verts.append(v)
def add_neighbor(self, n):
"""
reference to another face object
"""
self.neighbors.append(n)
def contains(self, X, G):
"""
X = point of interest
G = corrensponding grid object (G.verts)
because of the way i'm storing things,
a face simply stores indicies, and so one
must pass in a reference to the grid object
containing real verts.
this simply calls grid.simplex.contains
"""
return contains(X, [G.verts[i] for i in self.verts])
def __str__(self):
neighbors = [str(i.name) for i in self.neighbors]
return '<face %s: verts: %s neighbors: [%s]>' %\
(
self.name,
self.verts,
", ".join(neighbors)
)
__repr__ = __str__