3. Result extraction and normalization
Multi-iteration CAE comparison fails far more often at the data layer than at the solver layer. Two runs may both converge cleanly, yet a ranking built on their outputs can still be wrong because one iteration reported displacement in millimeters and the other in meters, because a scalar metric was sampled at a node set that shifted between meshes, or because a stress tensor was resolved in a local material frame in one model and the global frame in another. This section treats extraction and normalization as a deliberate engineering stage: deciding what to pull out of each iteration, converting it into a comparable form, and recording the conventions so that every downstream comparison is traceable.
Two data classes: fields and scalars
Every result set contains field data (nodal or elemental arrays such as displacement vectors, stress tensors, temperature, contact pressure) and scalar metrics (single numbers derived from those fields, such as maximum von Mises stress, peak displacement magnitude, total strain energy, or mass). Fields preserve spatial distribution and are essential when you need to know where a design changed; scalars compress a field into a decision variable and are what ranking tables are usually built on. A robust workflow extracts both: scalars for ranking, fields for diagnosis of the ranked designs.
The critical rule is that a scalar must be defined by an explicit, reproducible reduction recipe, not by "whatever the post-processor's default legend showed." For example, peak von Mises stress should state the averaging method (unaveraged nodal vs. element-averaged), whether mid-side nodes are included, and whether the value is taken over the whole part or a named region. Two iterations reduced with different recipes are not comparable even if both numbers are in MPa.
Units: normalize at the boundary, not in the spreadsheet
Unit inconsistency is the most common silent error in iteration comparison. Solvers accept consistent unit systems, but exported files frequently carry bare numbers with the unit buried in a report header or lost entirely. Normalize at the extraction boundary — the moment data leaves the solver — into one declared system for the whole study. A practical convention is SI base plus derived: length in m, force in N, stress in Pa, energy in J, mass in kg, temperature in K. Convert once, store the conversion factor alongside the dataset, and never mix converted and raw values in the same table.
# Example extraction manifest entry (illustrative values, not measured results)
iteration: iter_04
source: job_04.rpt / job_04.odb
units_in_file: {length: mm, force: N, stress: MPa, energy: mJ}
units_normalized: {length: m, force: N, stress: Pa, energy: J}
conversion: {length: 1e-3, stress: 1e6, energy: 1e-3}
scalar_recipe:
peak_vm_stress: max over REGION_CRITICAL, unaveraged nodal, midside included
peak_disp_mag: max |u| over all nodes
strain_energy: total elastic strain energy, whole model
coordinate_frame: global_cartesian
Note that energy and stress do not share a single factor: converting mm→m scales stress by 10⁶ but energy by 10⁻³ when force stays in N. Deriving each factor from the base dimensions rather than copying a single "scale" number prevents this class of mistake.
Coordinate systems: declare the frame before you compare vectors
Vector and tensor results are meaningless without a frame. Three situations recur across iterations: the global Cartesian frame is unchanged but the part was re-oriented; a local cylindrical or material frame rotated with the geometry; and a symmetry or submodel frame was used for one iteration only. Before any vector comparison, transform all field data into a single comparison frame — usually the global Cartesian frame of the baseline iteration — and record the rotation applied.
For a direction vector v expressed in a local frame with rotation matrix R relative to global, the global components are vg = R vl. Stress is a second-order tensor and transforms as σg = R σl RT; transforming only the principal values or the von Mises scalar is not equivalent to transforming the tensor, so keep the tensor until after the rotation. Sign conventions must also be fixed once: state whether compressive normal stress is negative, and whether displacement is reported as total or incremental from the previous iteration. If an iteration is a restart, incremental displacement is not comparable to a total displacement from a cold run.
Making fields comparable across meshes
Iterations rarely share a mesh. Comparing nodal fields node-by-node is therefore invalid unless the meshes are identical. Two defensible approaches exist. The first is probe-based extraction: define a fixed set of probe points or paths in the comparison frame, and sample each iteration's field at those locations by interpolation. The second is region-based reduction: define named regions (surfaces, volumes, edge paths) and reduce each field to region statistics — area-weighted average, maximum, 95th percentile — which are insensitive to local mesh density. Probe-based extraction preserves spatial detail; region-based reduction is more robust to remeshing. Use probes for diagnosis and region statistics for ranking.
When interpolating, record the interpolation scheme (linear, nearest, shape-function based) and the extrapolation policy for probes that fall outside a given iteration's domain. A probe that silently returns zero because it landed outside the mesh will corrupt a ranking without any error message.
Normalization for ranking
Once scalars are in consistent units and frames, they still span different magnitudes and directions of goodness. Normalization maps each metric onto a common scale so that a weighted ranking is meaningful. Two standard options:
- Min–max normalization to [0, 1]: x̂ = (x − xmin) / (xmax − xmin) across all iterations. Simple, but sensitive to a single outlier iteration and requires re-normalizing whenever a new iteration is added.
- Reference normalization: x̂ = x / xbaseline, expressing each metric relative to the baseline design. Stable under adding iterations and directly interpretable ("12% above baseline"). Preferred when the baseline is a meaningful reference.
Direction of goodness must be handled explicitly: for metrics where lower is better (peak stress, mass), invert the normalized value or negate the weight. Record the normalization formula, the baseline value, and the direction flag in the same manifest as the units, so the ranking is reproducible from raw outputs alone.
Verification before ranking
Before any ranking table is trusted, run three checks. First, a unit sanity check: compare a known quantity (total mass, or a prescribed load reaction) against the model input; a factor-of-1000 discrepancy signals a missed conversion. Second, a frame check: pick one probe point and confirm the displacement direction is physically plausible for the load case. Third, a recipe consistency check: confirm every iteration's scalar was produced by the same reduction recipe and region definition. If any check fails, fix the extraction, not the ranking weights — normalization cannot repair inconsistent inputs, it only hides them.
The output of this stage is a tidy comparison table: one row per iteration, one column per normalized scalar, with units, frame, and recipe recorded in the manifest. That table — not the raw solver files — is the input to the ranking and trade-off analysis that follows.