3. Result extraction and normalization

In a multi-iteration CAE comparison workflow, the single most common source of false conclusions is not solver error — it is inconsistent extraction. Two runs may be numerically valid yet appear to disagree simply because one report pulled displacement in millimeters and the other in meters, because one probe sat on a node and the other on a Gauss point, or because a vector field was compared component-wise after one dataset had been rotated into a local cylindrical frame. This section establishes a disciplined extraction and normalization stage that sits between raw solver output and any ranking or delta computation.

The governing principle is simple: every field entering the comparison must be expressed in one declared reference convention, sampled on one declared support, and typed as either scalar or vector before any arithmetic is performed. Normalization is therefore not cosmetic post-processing; it is a precondition for the comparison to be meaningful at all.

Declaring a comparison contract before extraction

Before touching any result file, fix a small set of conventions and record them alongside the dataset. A practical contract contains: the base unit system (SI is recommended as the canonical internal form), the global coordinate system and its handedness, the sign convention for each tensor or vector quantity, the sampling support (nodes, element centroids, or a fixed grid), and the interpolation rule used to move between supports. Once declared, these conventions must hold identically across all iterations; any deviation is a defect to be corrected, not a variation to be tolerated.

A useful habit is to store the contract as machine-readable metadata attached to each extracted field, for example:

comparison_contract:
  canonical_units: SI            # m, Pa, N, K, s
  global_frame: GCS_RH_Z_up      # right-handed, +Z up
  displacement_sign: +along_axis
  stress_convention: tension_positive
  sampling_support: node_set_N1  # fixed node IDs, identical across runs
  interpolation: shape_function   # element shape functions, not nearest-neighbor
  vector_handling: magnitude_and_components_in_GCS

Unit normalization

Unit conversion must be applied at extraction time, not left to the reporting layer. The failure mode is subtle: a von Mises stress of 2.35e8 in Pa and 235 in MPa are the same physical state, but a naive ranking script that mixes them will order designs by unit scale rather than by physics. Convert every field to the canonical system immediately after reading, and keep the original unit only as provenance metadata.

Watch for derived quantities where conversion is not a single factor. Strain energy density scales with stress times strain, so a dataset converted from mm–N–MPa to m–N–Pa changes energy density by a factor of 1e6 in stress and 1e-3 in length-derived strain, giving a net 1e3. Temperature differences and absolute temperatures also diverge: a delta of 10 K equals a delta of 10 °C, but 300 K is not 300 °C. Normalize absolute and differential quantities through separate, explicitly named paths.

Coordinate system handling

Coordinate normalization has two distinct concerns: the global frame and any local frames attached to the model. First, confirm that all iterations share the same global origin, axis orientation, and handedness. A design variant that was re-exported from CAD with a different origin will produce a rigid-body offset that contaminates every displacement comparison. Detect this early by comparing the bounding box of the reference geometry across runs; a constant translation or rotation is a frame mismatch, not a design change.

Second, handle local frames deliberately. Composite layups, cylindrical pressure vessels, and rotating machinery frequently report results in material or cylindrical coordinates. If the comparison is physical, transform all local-frame results back into the global frame before differencing. If the comparison is intentionally frame-relative — for example, comparing hoop stress on a vessel wall — then declare that the comparison is performed in the cylindrical frame and transform all iterations into it consistently. Mixing frames across iterations is the single most damaging normalization error because it produces plausible-looking but physically meaningless deltas.

A vector transformed between frames changes its components but not its magnitude. If a magnitude comparison shows a difference while the component comparison does not (or vice versa), suspect a frame inconsistency before suspecting the solver.

Interpolation and sampling support

Different iterations rarely share identical meshes. Adaptive remeshing, topology changes, and mesh refinement all shift node locations, so a node-by-node difference is only valid when the node sets are provably identical. When they are not, resample onto a common support. Two rules keep this defensible:

  • Interpolate the coarser or reference field onto the finer support, never the reverse, to avoid smoothing away the feature you are trying to compare.
  • Use shape-function interpolation within the source element rather than nearest-neighbor or inverse-distance weighting; the former preserves the element's own field variation, the latter introduces sampling bias near gradients.

For a reproducible example, suppose iteration A has 48,210 nodes and iteration B has 51,733 nodes after local refinement near a fillet. Extract both displacement fields, then evaluate B's field at A's node coordinates using B's element shape functions. Record the maximum extrapolation distance; if any target point falls outside B's mesh, flag it rather than silently clamping to the nearest element. A typical acceptance threshold is that fewer than 0.5% of sample points require extrapolation, and none lie outside the convex hull of the loaded region.

Scalar versus vector field handling

Scalar fields such as von Mises stress, temperature, or total strain energy are compared directly after unit and support normalization. Vector fields such as displacement, velocity, or heat flux require an explicit decision: compare magnitudes, compare components in a declared frame, or compare both. Magnitude comparison is robust to sign and frame ambiguity but hides directional reversal; component comparison captures direction but is sensitive to frame errors. The defensible default is to report magnitude and the three global-frame components together, so a directional anomaly cannot hide behind a matching magnitude.

Tensor-derived scalars deserve a note. Principal stresses and their directions are frame-invariant in magnitude but the direction vectors are defined only up to sign. When comparing principal directions across iterations, align signs by taking the dot product with a fixed reference direction and flipping where negative; otherwise a physically identical state can appear as a 180° reversal.

Extraction and Normalization Pipeline Iteration A output mm, MPa, local frame 48,210 nodes displacement, stress Iteration B output m, Pa, global frame 51,733 nodes displacement, stress 1. Unit normalization → SI canonical m, Pa, N, K derived quantities converted explicitly ΔT vs T separated 2. Frame normalization → GCS_RH_Z_up local → global origin/axis check handedness verified sign conventions fixed 3. Support normalization → node_set_N1 shape-function interp coarse → fine extrapolation flagged <0.5% threshold 4. Field-type normalization Scalar: von Mises, temperature, strain energy → direct compare Vector: displacement, flux → magnitude + GCS components Principal directions: sign-aligned via reference dot product → Comparison-ready dataset (declared contract, identical support)

Verification before comparison

Normalization is only trustworthy if it is checked. Three cheap checks catch most defects. First, compare the bounding box and total mass or volume of the reference geometry across iterations; a mismatch signals a frame or unit error. Second, compare a field that should be invariant — for example, total applied load recovered by integrating reaction forces — and confirm it matches the declared boundary condition in canonical units. Third, run a self-comparison: extract iteration A twice through the pipeline and confirm the delta is exactly zero. A nonzero self-delta localizes the defect to interpolation or frame handling rather than to the design change.

When these checks pass, the extracted fields are in a state where a difference between iterations can be attributed to the design rather than to the extraction. That is the precondition for the ranking and delta analysis that follows, and it is worth the modest upfront cost of declaring and enforcing the contract.