This algorithm can be used to reduce sliver shaped tetrahedrals from a mesh.
crush_thin_tets/ cmo_name / [ TOLCRUSH ] / [pset,get,psetname]
cmo_name
is the mesh object name.
TOLCRUSH
is the optional value providing a measurement selection to crush, the default value is .1
pset,get, psetname
is the optional node selection for part of the mesh.
crush_thin_tets
loops thru tets of a volume mesh
and looks for elements that, relative to the characteristic
length established by the normalized root mean square length
of the edges, are thinner than TOLCRUSH.
In the case that thinness is defined as the minimum tet altitude, then this relative length is actually an aspect ratio, because it goes to zero if the tet is degenerate and has a maximal value of 1 for a regular tet.
Given the relative length scale, we can measure thinness not just of the altitudes, but of any distance measurement in the tet. In particular there are four type of thin situations possible for a bad tet and we take appropriate actions for each case:
1) If an element has relative edge length shorter than TOLCRUSH, it is merged.
2) If a normal point-to-edge projection has relative length < TOLCRUSH, a node is added to the edge, so that a type (1) merge can take place.
3) If a normal point-to-face projection has relative length < TOLCRUSH, a node is added to the face, so that a type (1) merge can take place.
4) If a normal mutual diagonal-to-diagonal projection has relative length < TOLCRUSH, a node is added to one diagonal, so that a type (2) situation is created (which leads to another refinement and a type (1) merge).
Since there are situations when a type (1) action would be barely rejected on tolerance, but the more complicated type (2) action would be barely accepted on tolerance, we loosen the tolerance slightly for type (1) actions relative to type (2) actions to avoid this. Similarly, there are situations when a type (2) action would be barely rejected on tolerance, but the more complicated type (3) or type (4) actions would be barely accepted on tolerance. To avoid this we loosen the tolerance of type (2) actions relative to type (3) and type(4) actions.
Currently we are using these effective tolerances (on relative length):
The LaGriT input is an AVS format file with a thin tet number 1 with aspect ratio of .149 making it a sliver.
6 5 0 0 0
1 0. -1. .05
2 1. 0. -.05
3 0. 1. .05
4 -1. 0. -.05
5 0. 0. -2.
6 0. 0. 2.
1 1 tet 1 4 2 3
2 2 tet 1 2 4 5
3 3 tet 1 4 3 6
4 4 tet 2 3 4 5
4 5 tet 2 1 3 6
This example calls crush_thin_tets twice, once with TOLCRUSH= .1 and again with TOLCRUSH .15, a value larger than the known aspect ratio of .149. As a result, nothing will happen on the first call. The second call will find and crush the sliver by splitting elements and merging edges to create a new mesh without the sliver.
crush_thin_tets / cmotet / .1
rmpoint/compress
resetpts itp
crush_thin_tets / cmotet / .15
rmpoint/compress
resetpts itp
The first call has no change to the input. The second call splits tets such that thin tet is eliminated. Images show the input tet cell numbers and node numbers (left), the input tet elements exploded for viewing (middle), the output from crush_thin_tets with exploded view (right).
input tet id numbers | input tets exploded | output tets exploded |