VDT User's Guide

Copyright (C) 1999, Petr Krysl

VDT stands for (V)ariational (D)elaunay (T)riangulation. This algorithm, which had been proposed by M. Ortiz and myself (see the References), generates tetrahedral decomposition of a general solid body, whose surface is given as a collection of triangular facets. The principle idea is to modify the constraints in such a way as to make them appear in an unconstrained triangulation of the vertex set a priori. The vertex set positions are randomized to guarantee existence of a unique triangulation which satisfies the Delaunay empty-sphere property. (Algorithms for robust, parallelized construction of such triangulations are available.) In order to make the boundary of the solid appear as a collection of tetrahedral faces, we iterate two operations, edge flip and edge split with the insertion of additional vertex, until all of the boundary facets are present in the tetrahedral mesh. The outcome of the vertex insertion is another triangulation of the input surfaces, but one which is represented as a subset of the tetrahedral faces. To determine if a constraining facet is present in the unconstrained Delaunay triangulation of the current vertex set, we use the results of Rajan which re-formulate Delaunay triangulation as a linear programming problem.

Contents

Input specification

The input file consists of control directives and the surface mesh data: point and boundary facet specification.

Control directives

Surface mesh data

First, one can insert some control commands. Then specify the points: For each point use one line of the form
PT id x y z {mesh_size_at_point}
    
where PT is the keyword. id is the point identifier (positive integer), x,y,z are the coordinates, mesh_size_at_point is the (optional) desired mesh size at that point.

Then follow boundary facets: For each unique triangular facet specify

BSF pt0 pt1 pt2 surf_id {reg_id0} {reg_id1}
    
where BSF is the keyword, pt0,pt1,pt2 are three point identifiers in counter-clockwise order when looking against the outer normal of the facet (for a one-sided surface, outer normal points out of the body), surf_id is the surface identifier (positive integer would do), and and reg_idN are optional region identifiers. Reg_id1 is on the side to which the normal points, reg_id0 is on the other side (inside for one-sided surfaces). If the facet is incident on one region only, the region specified is reg_id0 (reg_id1 may be then specified as zero). If the facet represents an embedded sheet in a 3D region, reg_id0 == reg_id1.

The idea behind the surface id is that triangles which may be considered part of a single surface may be modified by the Delaunayzation algorithm. In particular, many sorts of re-triangulations are allowed for triangles on a single surface, but disallowed if the triangles are on distinct surfaces. If the triangle-surface associations are not available to you, just specify surf_id=1.

Notes:

Running vdt and scripts

When at a loss, try running either the VDT program or the scripts with the option -help. It should give you a hint how to proceed.

Command line options

General

Output

Generation of points

Mesh quality control

Surface Delaunayzation

Debugging

Linking with libvdt.a

The mesher is encapsulated in a library, libvdt.a (or libvdt.so if a dynamic version is available/desired). The public interface to the mesher functionality is described in the header vdtpub.h.

Dependencies (in this order):

References


Peter Krysl
Last modified: Fri Dec 17 12:53:05 PST 1999