The caller may set the **REDUCE_DIMENSIONS** parameter to TRUE
in any of the three geometric methods if they want Zoltan to check
for a degenerate condition and do lower dimensional partitioning
if such a condition if found. They may set the **DEGENERATE_RATIO**
to specify how flat or thin a geometry must be to be considered
degenerate.

If **KEEP_CUTS** is TRUE, the transformation is saved so that in
**Zoltan_LB_Box_Assign** or **Zoltan_LB_Point_Assign**
the coordinates can be transformed before the assignment is calculated.
If **RCB_REUSE** is TRUE in the RCB method,
the transformation is also saved. On re-partitioning, we can do some
simple tests to see if the degeneracy condition has changed before
completely re-calculating the coordinate transformation.

To determine if the geometry is degenerate, we calculate the same inertial matrix that is calculated for RIB, except that we ignore vertex weights. The 3 orthogonal eigenvectors of the inertial matrix describe the three primary directions of the geometry. The bounding box oriented in these directions is tested for degeneracy. In particular (for a 3 dimensional geometry) if the length of the longest side divided by the length of the shortest side exceeds the DEGENERATE_RATIO, we consider the geometry to be flat. If in addition, the length longest side divided by the length of the middle side exceeds the DEGENERATE_RATIO, we consider the geometry to be essentially a line.

If a 3 dimensional geometry is determined to be flat, we transform coordinates to a coordinate system where the XY plane corresponds to the oriented bounding box, and project all coordinates to that plane. These X,Y coordinates are returned to the partitioning algorithm, which performs two dimensional partitioning. Similarly if the geometry is very thin, we transform coordinates to a coordinate system with the X axis going through the bounding box in it's principal direction, and project all points to that axis. Then one dimensional partitioning is performed.

There is a small problem in calculating
**Zoltan_LB_Box_Assign**
when the partitioning was performed
on transformed geometry. The caller provides the box vertices in
problem coordinates, but the partition was calculated in
transformed coordinates. When the vertices are transformed, they
are in general no longer the vertices of an axis-aligned box in
the new coordinate system. The
**Box_Assign** calculation requires an axis-aligned box, and
so we use the bounding box of the transformed vertices. The resulting
list of processes or parts intersecting the box may therefore
contain some processes or parts which actually do not intersect
the box in problem coordinates, however it will not omit any.

To use the degenerate geometry detection capability from a new
geometric method, you would add a **Zoltan_Transform_Struct**
structure to the algorithm specific data structure, add code to
**Zoltan_Get_Coordinates** to look for it, and check the
**Target_Dim** field on return to see if the problem dimension
was reduced. You would also need to include the
coordinate transformation in your Box_Assign and Point_Assign
functionality.

[Table of Contents | Previous: Hibert Space Filling Curve (HSFC) | Privacy and Security]