ANSYS ICEM CFD™ Blocking File (Hexa) File Format

General Remarks

#:

The blocking file describes a multi-block decomposition of a CAD part. Although the blocking is multiblock the format of the blocking file is essentially an unstructured hexa mesh with several hex elements grouped together to form larger blocks. The main topological entities stored are vertices and hexahedra. No edges or faces are required for a valid definition although they may be present to indicate the association of edges and faces to CAD geometry.
    To understand some of the naming you have to imagine the mesh being logically  embedded in an n-dimensional integer latice. The coordinates of the vertices in the lattice would be an a series of n integers. The coordinates are written in shorthand as { i j k d1:i1 d2:i2 ... } where i j and k are given and other indices are given only if their value is non-zero. If the value is non-zero the index is written  dimension:index. A hexa spans three dimensions. Each of its edges goes spans a  pair of vertices that differ in one dimension by an index value of 1. The three dimensions and indices are stored with the hexa. These are its equivalence classes. If the vertices of a hexa are numbered from 0 to 7, two vertices share and edge if their numbers in the hexa (0 to 7) differ by 1 bit. If the bit is 2 ^ i the corresponding equivalence class is the i th equivalence class of the hexa.

MATERIALS
{
}
SURFACE_PARAMS number_of_surfaces
{
surface_name max_size height ratio
}

For each surface in the tetin file (CAD part) this is a record of the name of the surface and the parameters driving the mesh size.

FAMILIES
{
family_name projection_flag
}

For each family just its name . The projection flag is 1 if the mesh associated to this family should be projected to the surfaces in the family. 0 if they should remain unprojected. The ordering of the families defines a family ident running from 0. This ident is used in many places in the blocking file.

SHARED_WALLS
{
volume_family1 volume_family2 surface_family
}

An entry here indicates that the faces between volume_family1 and volume_family2 should be projected to surface_family. If surface_family is "ORFN" the faces should not be projected.

PREPOINTS number_of_points
{
ident x y z name
}

ident should match the ident given in the NODES section.

COMPOSITE_CURVES number_of_curves
{
ident number_of_members max_size height ratio  name {
first_member_name
second_member_name
}
}

ident should match the ident given in the NODES section and the EDGE_CURVES section.

BOUNDARY_FAMILY 0 0 0 0 0 0

Pretty much not used.

DIMENSION geometry geometry_dimension mesh mesh_dimension third third_dimension

For a volume mesh geometry_dimension is 3 and mesh_dimension is 3 third_dimension is 2. For a 2-D mesh geometry_dimension is 2 and mesh_dimension is 2 and third_dimension is 2. For a surface mesh in 3-D: geometry_dimension is 3 and mesh_dimension is 2 and third_dimension is explaned here. Each element
is a hexahedron (in 2-D it is simply degenerated in one direction). Each of the three directions in the hex is identified with a global equivalence class. If two elements have a common edge then the equivalence classes for the directions must be the same. This equivalence class is made up of a dimension and an index. In a cartesian mesh the dimension would be 0 1 or 2 (for i j or k) and the index would be the value of i j or k. If O-grids are created new dimensions are created starting with 3 and working upwards. In a 2-D and a surface mesh all elements are degenerated. The degenerate direction is identified with a global equivalence class, third_dimension. In a 2-D mesh this third dimension is assigned when the blocking is initialized and is 2 since 0 and 1 have been used for the i and j directions. A 3-D surface mesh is created by extracting the projected faces from a volume mesh. This volume mesh will have used i j and k and perhaps some other dimensions. "Third dimension" is taken to be the next unused dimension. When the new surface elements are created "third_dimension" is assigned. The only thing you need to know about "third_dimension" is it is the dimension of the equivalence class of the degenerated direction of all the elements in a surface or 2-D mesh.
 
 

GRID coordinate direction number_of_stations
{
value_1 number of nodes
value_2 number of nodes
.
value_n 0
}

NODES
{
x y z dimension ident number x  boundary_mask { i j k } { twin_number }
}

The node numbers should be >= 0 and unique.  They do not need to be consecutive or in any order. x is a placeholder for a no longer used value. Boundary mask is no longer used and may be left as 0. Dimension 0 indicates association to a prescribed point (ident is the same as ident in the PREPOINTS section). Dimension 1 indicates association to a curve (ident is the same as ident in the COMPOSITE_CURVES section). Dimension 2 indicates association to a surface family (ident is same as the ident in the FAMILIES  section).

EDGE_CURVES no_interpolate node_nums
{
node1 node2 n_intermediate_points [ link1 link2 factor [ s ] ]
{
segment_dimension  segment_ident
x y z segment_dimension segment_ident
}
}

An edge curve is a piecewise linear  ( or smooth spline is the s option is present) curve along an edge of the blocking. The number of lines between { and } per curve is n_intermediate_points + 1. The first line does not have x y z coordinates since there is 1 more interval than intermediate point. In the blocking internally the edge  corresponds to 1 or more edges of hexahedra. The number of intermediate points is unrelated to the number of nodes in the blocking corresponding to the edge. The first two nodes define a unique edge. (The edge is also defined by the two nodes on the other side, which are the same nodes if the edge only has 2 nodes). Edges start out as a straight line between their endpoints and don't show up in the EDGE_CURVES section. So the EDGE_CURVE section can easily be empty. If the user splits and edge or projects it to a curve then an entry is made. If the edge is projected to a curve then the number of intermediate points is zero and one line shows up describing the projection of the one interval. The segment dimension would be 1 and the segment_ident would be the ident of a curve from the curve section. If the curve has been split, the number of intermediate points is > 0 and the number of lines is > 1 and the coordinates of the intermediate points are given. If the edge curve has been linked to another edge this is given by link1 and link2. Factor is the factor which multiplies the shape of the source edge.
    If the "s" is present then the end points together with the intermediate points are interpreted as a bspline curve. If there is 1 intermediate point it is simply a degree 2 Bezier curve. With 2 intermediate points it is a degree 3 Bezier curve. With > 2 intermediate points it is a uniform B-spline curve.

GRID_ELEMENTS
{
marked output_block_number material_id n1 n2 ... n8 block_number
    equivalence_class1  equivalence_class2  equivalence_class3  \
 [ face1_projection flag  face2_projection flag  ...  face6_projection_flag  ] \
[ dimension_1_refinement  dimension_2_refinement dimension_3_refinement  ]
}

marked -  a bit indicating if the hexa has been marked for some kind of operation, like making an o-grid. Starting with version 4.3 bit 0 of marked is whether or not the element is marked.
Bit 1 of marked is whether the elements is blanked.

output_block_number - an integer identifying the output block to which the hexa belongs. If each hexa had its own output block number each subface would be a complete face. More interesting blockings can be made by merging two blocks together. This is done simply by assigning them the same output_block_number.

material_id - the number of the family for the hexa. All hexas in a block or output block should have the same material.

n1 ... n8 the number of the nodes of the hexa. The nodes are given in array order. ni and nj are connected by an edge if i and j differ by 1 bit.

block_number - the same idea as output_block_number but the user can switch between the two and see two different groupings of the same mesh.

equivalence_class(1 2 3)  - the three equivalence classes for the hexa. class one is for edges 0-1 2-3 4-5 6-7
class two is for edges 0-2 1-3 4-6 5-7 class three is for edges 0-4 1-5 2-6 3-7 . The class is given as dimension:index:reverse. If two hexas share an edge then the corresponding equivalence class had better be the same.

face1_projection face2_projection ... - Optional fields, Either there are six of them or none. 0 indicates that the projection should be determined be the materials of the neighboring hexas. If they are different the face goes to the closes surface. If they are the same the face is unprojected. -1 indices project to any surface (even if the materials are the same on both sides) and display/output shell elements. -2 means do not project (even if the materials differ) and do not display/output shell elements. -3 means do not project but do display/output shell elements. If the dimension in the hexa runs from 0 to 2 the the number of a face is 2*dim + hi , where hi = 0 for the low face and 1 for the hi face.

dimension_i_refinement - If there is refinement in this block this is it. Either there are 3 fields or none. For refinement > 1 an integer is given. If the refinement is < 1 the value is printed as 1/n .
 

DEFAULT_BUNCHING_LAW law_name

Law name is one of:
                                        0. default
                                        1. uniform
                                        2. hyperbolic
                                        3. biexponential
                                        4. geo1
                                        5. geo2
                                        6. exp1
                                        7. exp2
                                        8. linked
                                        9. poisson
                                        10. curvature
                                        11. spline
                                        12. linear

EDGE_RATIOS
{
 node1_number node2_number initial_len  initial_ratio end_len end_ratio locked_flag law_type max_len  user_set_flag
}