The Problem

I was running fatigue crack growth tests on A36 structural steel in an aqueous corrosion environment. The tests were nominally identical — same material, same loading conditions, same electrolyte. But the Paris-law parameters coming out of each run were not.

The slope m and intercept C of the crack growth curve were shifting between specimens in ways I could not explain with standard checks. Load control looked clean. The environment was monitored. The scatter was real and it was not going away.

The question I needed to answer was specific: where is the scatter actually coming from, and what measurement would isolate it?

Why This Problem Is Hard

Paris-law parameters are not forgiving of hidden variables. C and m are strongly correlated across the literature — steeper slopes tend to pair with lower intercepts — which means a wrong parameter pair can still look physically reasonable. A simulation calibrated on bad inputs produces crack growth curves that are internally consistent and visually plausible, but predicts inspection intervals that are too long.

In structural applications — bridge girders, pressure vessels, offshore welds — a wrong inspection interval is not an academic problem. It is a direct causal path to a fracture event.

The stakes made the diagnostic question worth solving carefully.

The Workflow I Built

Before reaching for a new experiment, I built a structured 7-step extraction and diagnostic workflow using compliance data I already had.

Step 1 — Quality-Check the Raw Compliance Data

Clean the load–displacement records. Verify that the elastic regime is linear, remove cycles with load-control artifacts, and normalize displacement by specimen geometry before doing anything else.

Step 2 — Extract Closure Load Cycle by Cycle

Fit a straight line to the upper 25% of each unloading curve to establish the open-crack compliance. Apply a 2% offset criterion to identify the closure load P_cl at each cycle. This is the ASTM E647 standard method — consistent, repeatable, and auditable.

Step 3 — Compute ΔK_eff and the Closure Fraction U

From P_cl, compute the stress intensity at closure K_cl.

Then: ΔK_eff = K_max − K_cl U = ΔK_eff / ΔK_applied

U ranges from 0 (fully closed) to 1 (no closure). Values above 1 flag a measurement or calibration problem — they do not get passed downstream.

Step 4 — Build the U(N) and U(t) Time Series

Plot U against both cycle count N and elapsed test time t. These two axes decouple differently: plasticity-driven closure tracks cycles, oxide-driven closure tracks time. That separation is the first diagnostic signal.

Step 5 — Run the Frequency-Variation Diagnostic

Compare U between specimens tested at different frequencies but identical ΔK and R. If U drops more steeply as a function of elapsed time at lower frequency, oxide-induced closure is the primary driver. If U tracks cycle count regardless of frequency, plasticity dominates.

Step 6 — Apply the ΔK_eff Correction

Correct the raw da/dN data using the measured U values:

ΔK_eff(i) = U(i) · ΔK_applied(i)

Re-plot log(da/dN) against log(ΔK_eff). If the scatter collapses, closure variability was the primary source. If it does not, the scatter is coming from somewhere else — return to the inputs.

Step 7 — Handle the Threshold Regime Separately

Near ΔK_th, closure corrections are most important and most uncertain. Check whether the crack-tip opening displacement is comparable to the oxide layer thickness. When CTOD ≈ oxide thickness, wedging closure becomes dominant and U can drop to 0.3–0.5 even at moderate load ratios.

The Gap I Couldn’t See

The prompt I sent:

“I’ve drafted a closure-analysis workflow to diagnose my Paris-law deviations in corrosion-fatigue. The workflow extracts K_cl cycle-by-cycle via offset-compliance, builds a U(N) and U(t) time series, and uses frequency-variation and overload-spike tests to distinguish oxide-induced from plasticity-induced closure. Review this and identify the single most critical measurement I’m missing — the one that would most directly distinguish between oxide-induced and plasticity-induced closure in my existing data. How would you operationalize that measurement?”