GRUMMP's approach to isotropic mesh adaptation is to apply a concatenation
of existing functionality to produce a high-quality mesh that meets
the specified length scale requirement. (See Section 2.1
for information on how to specify a length scale.) This is done as
the first step in mesh optimization (executables `meshopt2d`
and `meshopt3d`). The steps taken are:

- Coarsen the mesh where necessary to make sure vertices are not too close together (where ``too close'' means that the distance between them is less than the average of their length scales).
- Swap the mesh to make it Delaunay; this step is a necessary prerequisite to mesh refinement.
- Refine the mesh to ensure that no cells are larger than the local length scale and that no badly-shaped cells remain. This step is identical to what GRUMMP does in generating a mesh after the initial triangulation / tetrahedralization is complete.
- Postprocessing by smoothing and swapping. In 2D, two passes of smoothing are sufficient to ensure excellent meshes in both theory and practice. In 3D, some swapping is typically required to eliminate slivers, which the insertion process alone cannot remove.

Carl Ollivier-Gooch 2017-07-20