TetGen.jl
TetGen is a mesh generator written in C++. It generates Delaunay tetrahedralizations, constrained Delaunay tetrahedralizations, and quality tetrahedral meshes. TetGen.jl provides a Julia interface to TetGen.
Mesh based API
This API uses instances of types from GeometryBasics.jl to describe input and output of TetGen.
TetGen.tetrahedralize
— Functiontetrahedralize(mesh; ...)
tetrahedralize(mesh, command; marker, holes)
Tetrahedralize a mesh of polygons with optional facet markers. Returns a mesh of tetrahdra.
TetGen.tetrahedralize
— Functiontetrahedralize(mesh)
tetrahedralize(mesh, command)
Tetrahedralize a domain described by a mesh of triangles. Returns a mesh of tetrahdra.
TetGen.voronoi
— Methodvoronoi(points)
Create voronoi diagram of point set.
Returns a mesh of triangles.
Raw API
This API is closer to TetGen's C++ API in the sense that input and output are described using arrays of integers and floats, without conversion to any other higher level data structure.
TetGen.RawFacet
— Typestruct RawFacet{T}
A complex facet as part to the input to TetGen.
polygonlist::Vector{Vector{Int32}}
: Polygons given as arrays of indices which point into the pointlist array describing the input points.
holelist::Matrix
: Array of points given by their coordinates marking polygons describing holes in the facet.
TetGen.RawTetGenIO
— Typemutable struct RawTetGenIO{T}
A structure for transferring data into and out of TetGen's internal representation.
The input of TetGen is either a 3D point set, or a 3D piecewise linear complex (PLC), or a tetrahedral mesh. Depending on the input object and the specified options, the output of TetGen is either a Delaunay (or weighted Delaunay) tetrahedralization, or a constrained (Delaunay) tetrahedralization, or a quality tetrahedral mesh.
A piecewise linear complex (PLC) represents a 3D polyhedral domain with possibly internal boundaries(subdomains). It is introduced in [Miller et al, 1996]. Basically it is a set of "cells", i.e., vertices, edges, polygons, and polyhedra, and the intersection of any two of its cells is the union of other cells of it.
The 'RawTetGenIO' structure is a collection of arrays of data, i.e., points, facets, tetrahedra, and so forth. All data are compatible to the representation in C++ and can be used without copying.
pointlist::Matrix
: 'pointlist': Array of point coordinates withsize(pointlist,1)==3
.
pointattributelist::Matrix
: 'pointattributelist': Array of point attributes. The number of attributes per point is determined bysize(pointattributelist,1)
pointmtrlist::Matrix
: 'pointmtrlist': An array of metric tensors at points.
pointmarkerlist::Vector{Int32}
: 'pointmarkerlist': An array of point markers; one integer per point.
tetrahedronlist::Matrix{Int32}
: 'tetrahedronlist': An array of tetrahedron corners represented by indices of points inpointlist
. Unless option-o2
is given, one hassize(tetrahedronlist,1)==4
, i.e. each column describes the four corners of a tetrahedron. Otherwise,size(tetrahedronlist,1)==10
and the 4 corners are followed by 6 edge midpoints.
tetrahedronattributelist::Matrix
: 'tetrahedronattributelist': An array of tetrahedron attributes.
tetrahedronvolumelist::Vector
: 'tetrahedronvolumelist': An array of constraints, i.e. tetrahedron's volume; Input only. This can be used for triggering local refinement.
neighborlist::Matrix{Int32}
: 'neighborlist': An array of tetrahedron neighbors; 4 ints per element. Output only.
facetlist::Array{RawFacet{T}, 1} where T
: 'facetlist': An array of facets. Each entry is a structure of facet.
facetmarkerlist::Vector{Int32}
: 'facetmarkerlist': An array of facet markers; one int per facet.
holelist::Matrix
: 'holelist': An array of holes (in volume). Each hole is given by a point which lies strictly inside it.
regionlist::Matrix
: 'regionlist': An array of regions (subdomains). Each region is given by a seed (point) which lies strictly inside it. For each column, the point coordinates are at indices [1], [2] and [3], followed by the regional attribute at index [4], followed by the maximum volume at index [5].ote that each regional attribute is used only if you select the 'A' switch, and each volume constraint is used only if you select the 'a' switch (with no number following).
facetconstraintlist::Matrix
: 'facetconstraintlist': An array of facet constraints. Each constraint specifies a maximum area bound on the subfaces of that facet. Each column contains a facet marker at index [1] and its maximum area bound at index [2]. Note: the facet marker is actually an integer.
segmentconstraintlist::Matrix
: 'segmentconstraintlist': An array of segment constraints. Each constraint specifies a maximum length bound on the subsegments of that segment. Each columb consists of the two endpoints of the segment at index [1] and [2], and the maximum length bound at index [3]. Note the segment endpoints are actually integers.
trifacelist::Matrix{Int32}
: 'trifacelist': An array of face (triangle) corners.
trifacemarkerlist::Vector{Int32}
: 'trifacemarkerlist': An array of face markers; one int per face.
edgelist::Matrix{Int32}
: 'edgelist': An array of edge endpoints.
edgemarkerlist::Array{Int32}
: 'edgemarkerlist': An array of edge markers.
TetGen.RawTetGenIO
— MethodCreate RawTetGenIO structure with empty data.
TetGen.facetlist!
— Methodfacetlist!(
tio::RawTetGenIO{T},
facets::AbstractMatrix
) -> RawTetGenIO
Set list of input facets from AbstractMatrix desribing polygons of the same
size (e.g. triangles)
TetGen.facetlist!
— Methodfacetlist!(
tio::RawTetGenIO{T},
facets::Vector
) -> RawTetGenIO
Set list of input facets from a vector of polygons of different size
TetGen.numberofedges
— Methodnumberofedges(tio::RawTetGenIO{T}) -> Int64
Number of edges in tetrahedralization
TetGen.numberofpoints
— Methodnumberofpoints(tio::RawTetGenIO{T}) -> Int64
Number of points in tetrahedralization
TetGen.numberoftetrahedra
— Methodnumberoftetrahedra(tio::RawTetGenIO{T}) -> Int64
Number of tetrahedra in tetrahedralization
TetGen.numberoftrifaces
— Methodnumberoftrifaces(tio::RawTetGenIO{T}) -> Int64
Number of triangle faces in tetrahedralization
TetGen.surfacemesh
— Methodsurfacemesh(tgio::RawTetGenIO) -> GeometryBasics.Mesh
Create GeometryBasics.Mesh from the triface list (for quick visualization purposes using Makie's wireframe).
TetGen.tetrahedralize
— Methodtetrahedralize(
input::RawTetGenIO{Float64},
flags::String
) -> RawTetGenIO{Float64}
Tetrahedralize input.
flags: -pYrq_Aa_miO_S_T_XMwcdzfenvgkJBNEFICQVh
-p Tetrahedralizes a piecewise linear complex (PLC).
-Y Preserves the input surface mesh (does not modify it).
-r Reconstructs a previously generated mesh.
-q Refines mesh (to improve mesh quality).
-R Mesh coarsening (to reduce the mesh elements).
-A Assigns attributes to tetrahedra in different regions.
-a Applies a maximum tetrahedron volume constraint.
-m Applies a mesh sizing function.
-i Inserts a list of additional points.
-O Specifies the level of mesh optimization.
-S Specifies maximum number of added points.
-T Sets a tolerance for coplanar test (default 1e-8).
-X Suppresses use of exact arithmetic.
-M No merge of coplanar facets or very close vertices.
-w Generates weighted Delaunay (regular) triangulation.
-c Retains the convex hull of the PLC.
-d Detects self-intersections of facets of the PLC.
-z Numbers all output items starting from zero.
-f Outputs all faces to .face file.
-e Outputs all edges to .edge file.
-n Outputs tetrahedra neighbors to .neigh file.
-v Outputs Voronoi diagram to files.
-g Outputs mesh to .mesh file for viewing by Medit.
-k Outputs mesh to .vtk file for viewing by Paraview.
-J No jettison of unused vertices from output .node file.
-B Suppresses output of boundary information.
-N Suppresses output of .node file.
-E Suppresses output of .ele file.
-F Suppresses output of .face and .edge file.
-I Suppresses mesh iteration numbers.
-C Checks the consistency of the final mesh.
-Q Quiet: No terminal output except errors.
-V Verbose: Detailed information, more terminal output.
-h Help: A brief instruction for using TetGen.
TetGen.tetrahedralize
— Methodtetrahedralize(stlfile, flags)
Tetrahedralize stl file.
TetGen.volumemesh
— Methodvolumemesh(
tgio::RawTetGenIO
) -> GeometryBasics.Mesh{_A, T, GeometryBasics.Ngon{_A, T, N, Point}, V} where {_A, T<:Real, N, Point<:GeometryBasics.AbstractPoint{_A, T}, V<:(GeometryBasics.FaceView{GeometryBasics.Ngon{_A, T, N, Point}, _A1, GeometryBasics.TriangleFace{Int32}, Vector{_A1}, Vector{GeometryBasics.TriangleFace{Int32}}} where _A1<:GeometryBasics.AbstractPoint)}
Create GeometryBasics.Mesh of all tetrahedron faces (for quick visualization purposes using Makie's wireframe).
TetGen.tetunsuitable!
— Functiontetunsuitable!(unsuitable; check_signature)
Set tetunsuitable function called from C wrapper. Setting this function is valid only for one subsequent call to tetrahedralize. The function to be passed has the signature
unsuitable(p1::Vector{Float64},p2::Vector{Float64},p3::Vector{Float64},p4::Vector{Float64})::Bool
where p1...p4
are 3-Vectors describing the corners of a tetrahedron, and the return value is true
if its volume is seen as too large.
TetGen C++ code
H.Si, "TetGen, a Delaunay-Based Quality Tetrahedral Mesh Generator" ACM Trans. Math. Software, 41 (2015) pp. 11:1–11:36. Please consider citing this paper when publishing results obtained with the use of TetGen. Link to preprint here.