1. Introduction
1.1. Module Summary
The mesh generation modules are designed to be integrated into existing software systems such as finite element pre processors with minimal impact upon established data structures. The modules currently delivered as CEETRON Mesh generation modules may be divided into four categories: 1) mapped mesh generation and extrusion, 2) 2D planar mesh generation, 3) 3D curve and surface mesh generation, and 4) 3D volume mesh generation.
Mapped Mesh Generation and Extrusion
MapMesh - Mapped mesh generation
ExtMesh - Extrude a mesh
2D Planar
TriMesh - Planar unstructured triangulation
3D Curve and Surface
CurvMesh - Curve mesh generation
SurfMesh - Surface unstructured mesh generation
3D Volume
TetMesh - Volume unstructured tetrahedralization
1.2. Controlling Mesh Size
Mesh spacing is controlled in a number of ways depending upon the mesh generation module used. The mapped mesh and extrusion modules, MapMesh and ExtMesh, the mesh spacing is very specific to the mesh generation technique. In the unstructured mesh modules, there are a set of common parameters such as target edge length, growth rate and minimum edge length. Additional parameters such as spanning angle are available for curve and surface mesh generation.
In the unstructured meshing modules such as TriMesh, SurfMesh and TetMesh, the normal input sizing parameters may be overridden by installing a callback function to specify the mesh size as a function of spatial coordinate. Generally, both isotropic and anisotropic sizing callback functions are available. These sizing callback functions have the same general form for all modules. Note that if an anisotropic sizing function is set, it takes precedence over any isotropic sizing function which has been set. The function prototypes for the SurfMesh module appear below as an example.
The isotropic sizing callback function prototype is
void function (msh_SurfMesh *surfmesh,
Vobject *object,
Vdouble x[3],
Vdouble *s)
The first argument is the SurfMesh object, surfmesh, the second is a user defined object, object, the third is the coordinate location x and the fourth is the returned size s.
The anisotropic sizing callback function prototype is
void function (msh_SurfMesh *surfmesh,
Vobject *object,
Vdouble x[3],
Vdouble s[3][3])
The first argument is the SurfMesh object, surfmesh, the second is a user defined object, object, the third is the coordinate location x and the fourth is the returned anisotropic scaled orthogonal direction vectors. The first 3 components are the first size scaled direction, the next 3 components are the second size scaled direction, the next 3 components are the third size scaled direction.
1.3. Monitoring Meshing Progress
Each meshing module allow a callback function to be installed which
is called periodically during the meshing process. The user may
call from within the monitor function,
query functions such as msh_SurfMeshGetInteger()
to
return progress parameters.
In addition the user may abort the meshing
process by setting an abort flag. In the SurfMesh module this
flag is set using msh_SurfMeshAbort()
.
The monitor function prototype for
the SurfMesh module appears below as an example.
The monitor callback function prototype is
void function (msh_SurfMesh *surfmesh,
Vobject *object)
The first argument is the SurfMesh object, surfmesh, the second is a user defined object, object.
1.4. Use of the Connect Module
In all mesh generation modules the generated mesh is output in a Connect object. This object contains the generated node coordinates and element connectivity, topology, material number, etc. All generated nodes and elements are appended to any nodes and elements already existing in the specified Connect object. The Connect module contains access functions to retrieve the generated node and element information. The following code fragment illustrates the basic process:
vis_Connect *connect;
Vint numnp, numel;
Vint shape, maxi,maxj,maxk;
Vint nix, ix[27];
Vdouble x[3];
/* print generated nodes and elements */
vis_ConnectNumber (connect,SYS_NODE,&numnp);
vis_ConnectNumber (connect,SYS_ELEM,&numel);
printf("numnp= %d, numel= %d\n",numnp,numel);
/* print node information */
printf("Node information\n");
for(i = 1; i <= numnp; i++) {
vis_ConnectCoordsdv (connect,1,&i,(Vdouble(*)[3])x);
printf("id= %d x= %f, y= %f, z= %f\n",i,x[0],x[1],x[2]);
}
/* print element information */
printf("Element information\n");
for(i = 1; i <= numel; i++) {
/* topology */
vis_ConnectTopology (connect,i,&shape,&maxi,&maxj,&maxk);
if(shape == VIS_SHAPEPOINT) printf("id= %d POINT ix=",i);
if(shape == VIS_SHAPELINE) printf("id= %d LINE ix=",i);
if(shape == VIS_SHAPETRI) printf("id= %d TRI ix=",i);
if(shape == VIS_SHAPEQUAD) printf("id= %d QUAD ix=",i);
if(shape == VIS_SHAPETET) printf("id= %d TET ix=",i);
if(shape == VIS_SHAPEPYR) printf("id= %d PYR ix=",i);
if(shape == VIS_SHAPEWED) printf("id= %d WED ix=",i);
if(shape == VIS_SHAPEHEX) printf("id= %d HEX ix=",i);
/* connectivity */
vis_ConnectElemNode (connect,i,&nix,ix);
for(j = 0; j < nix; j++) {
printf(" %d",ix[j]);
}
printf("\n");
}