Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def q_min_sin_dihedral_angles(self):
"""Get the smallest of the sines of the 6 angles between the faces of each
tetrahedron, times a scaling factor that makes sure the value is 1 for the
equilateral tetrahedron.
"""
# https://math.stackexchange.com/a/49340/36678
fa = compute_tri_areas(self.ei_dot_ej)
el2 = self.ei_dot_ei
a = el2[0][0]
b = el2[1][0]
c = el2[2][0]
d = el2[0][2]
e = el2[1][1]
f = el2[0][1]
cos_alpha = []
H2 = (4 * a * d - ((b + e) - (c + f)) ** 2) / 16
J2 = (4 * b * e - ((a + d) - (c + f)) ** 2) / 16
K2 = (4 * c * f - ((a + d) - (b + e)) ** 2) / 16
# Angle between face 0 and face 1.
1,
)
# update self.ei_dot_ej
self.ei_dot_ej[:, cell_ids] = numpy.einsum(
"ijk, ijk->ij",
self.half_edge_coords[[1, 2, 0]][:, cell_ids],
self.half_edge_coords[[2, 0, 1]][:, cell_ids],
)
# update self.ei_dot_ei
e = self.half_edge_coords[:, cell_ids]
self.ei_dot_ei[:, cell_ids] = numpy.einsum("ijk, ijk->ij", e, e)
# update cell_volumes, ce_ratios_per_half_edge
cv = compute_tri_areas(self.ei_dot_ej[:, cell_ids])
ce = compute_ce_ratios(self.ei_dot_ej[:, cell_ids], cv)
self.cell_volumes[cell_ids] = cv
self._ce_ratios[:, cell_ids] = ce
if self._interior_ce_ratios is not None:
self._interior_ce_ratios[interior_edge_ids] = 0.0
edge_gids = self._edge_to_edge_gid[2][interior_edge_ids]
adj_cells = self._edges_cells[2][interior_edge_ids]
is0 = self.cells["edges"][adj_cells[:, 0]][:, 0] == edge_gids
is1 = self.cells["edges"][adj_cells[:, 0]][:, 1] == edge_gids
is2 = self.cells["edges"][adj_cells[:, 0]][:, 2] == edge_gids
assert numpy.all(
numpy.sum(numpy.column_stack([is0, is1, is2]), axis=1) == 1
)
#
def cell_incenters(self):
"""Get the midpoints of the inspheres.
"""
# https://math.stackexchange.com/a/2864770/36678
face_areas = compute_tri_areas(self.ei_dot_ej)
# abc = numpy.sqrt(self.ei_dot_ei)
face_areas /= numpy.sum(face_areas, axis=0)
return numpy.einsum(
"ij,jik->jk", face_areas, self.node_coords[self.cells["nodes"]]
)
- self.node_coords[self.idx_hierarchy[0]]
)
if self.ei_dot_ej is not None:
self.ei_dot_ej = numpy.einsum(
"ijk, ijk->ij",
self.half_edge_coords[[1, 2, 0]],
self.half_edge_coords[[2, 0, 1]],
)
if self.ei_dot_ei is not None:
e = self.half_edge_coords
self.ei_dot_ei = numpy.einsum("ijk, ijk->ij", e, e)
if self.cell_volumes is not None or self.ce_ratios is not None:
self.cell_volumes = compute_tri_areas(self.ei_dot_ej)
self._ce_ratios = compute_ce_ratios(self.ei_dot_ej, self.cell_volumes)
self._interior_edge_lengths = None
self._cell_circumcenters = None
self._interior_ce_ratios = None
self._control_volumes = None
self._cell_partitions = None
self._cv_centroids = None
self._cvc_cell_mask = None
self._surface_areas = None
self._signed_cell_areas = None
self._cell_centroids = None
return
self.node_coords[self.idx_hierarchy[1]]
- self.node_coords[self.idx_hierarchy[0]]
)
# einsum is faster if the tail survives, e.g., ijk,ijk->jk.
# TODO reorganize the data
self.ei_dot_ej = numpy.einsum(
"ijk, ijk->ij",
self.half_edge_coords[[1, 2, 0]],
self.half_edge_coords[[2, 0, 1]],
)
e = self.half_edge_coords
self.ei_dot_ei = numpy.einsum("ijk, ijk->ij", e, e)
self.cell_volumes = compute_tri_areas(self.ei_dot_ej)
def cell_inradius(self):
"""
"""
# https://en.wikipedia.org/wiki/Tetrahedron#Inradius
face_areas = compute_tri_areas(self.ei_dot_ej)
return 3 * self.cell_volumes / numpy.sum(face_areas, axis=0)