
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?”
