Shearography Inspection (manufacturing-quality/ndt/shearography-inspection)
Use when you must plan and interpret a laser shearography NDT inspection on an aerospace composite or bonded part: turning the laser wavelength and the lateral shear distance into the phase sensitivity of the interferometer, selecting the shear distance for the minimum defect size of interest, sizing the vacuum, thermal, or vibration load step that excites the defect, building the scan plan that covers the part with the required overlap, converting a measured phase anomaly into an out-of-plane displacement gradient (strain) estimate, and dispositioning that anomaly against the maximum allowable disbond or delamination size. Shearography is the full-field optical alternative for disbond detection that goes beyond the classic five NDT methods; this leaf owns the optics, loading, and strain-anomaly math only. It pairs with manufacturing-quality/ndt/ndt-method-selection, where shearography is an alternative method outside the RT, UT, ET, PT, and MT screening list, and with manufacturing-quality/ndt/thermography and manufacturing-quality/ndt/ultrasonic-inspection, the sibling methods that also hunt disbonds and delaminations in composite panels. This leaf implements the planning and interpretation model in pure Python, stdlib only.
Domain quick reference
- Shearography phase: delta_phi = (4 * pi / lambda) * shear * strain_gradient, where delta_phi is the phase difference between the two sheared images under load (radians), lambda is the laser wavelength, shear is the lateral shear distance, and strain_gradient ~ d(w)/dx is the out-of-plane displacement gradient. All lengths must share one unit; this module converts nm and mm inputs to meters consistently.
- Strain from a phase anomaly: strain = phase * lambda / (4 * pi * shear). strain_from_phase(0.5, 5.0, 532.0) returns about 4.23e-6 relative strain, that is about 4.23 micron/m (1 micron/m = 1e-6 strain).
- Phase from a strain estimate (inverse): phase_for_strain(strain, shear, wavelength) recovers the phase; the round trip holds within 1e-12.
- Minimum detectable strain: min_detectable_strain(noise_floor_rad, shear, wavelength) = MIN_SNR * noise_floor * lambda / (4 * pi * shear). With the module noise floor of 0.1 rad at 5 mm shear, the minimum is exactly MIN_SNR (3.0) times the single-frame noise-equivalent strain.
- Shear distance rule: shear_for_defect(defect_size_mm) = defect_size_mm / SHEAR_DIVISOR, about half the minimum defect size (10 mm defect to 5 mm shear, 6 mm defect to 3 mm shear).
- Load steps (documented typical values for aerospace laminates; the approved procedure governs the real load): vacuum delta pressure in mbar keyed by laminate thickness in mm with linear interpolation between the 2.0 mm (20 mbar), 6.0 mm (40 mbar), and 12.0 mm (60 mbar) breakpoints, thermal temperature rise 5 deg C, and vibration frequency band index 30 of a typical 100 to 1000 Hz sweep.
- Scan plan: passes = ceil(part_area_m2 / (fov_area_m2 * (1 - overlap))), with overlap_area = passes * fov_area_m2 * overlap. The planned passes image at least COVERAGE_MIN (0.85) of the part area with valid phase data, so the coverage check in summarize passes when the plan covers the part.
- Disposition: reject when the anomaly size reaches or exceeds the allowable plus the REVIEW_BAND (0.2) margin; review when the anomaly exceeds the allowable but stays inside the band, or when the signal to noise ratio falls below MIN_SNR (3.0); accept when the anomaly is within the allowable and the SNR meets MIN_SNR.
- Units: wavelength nm, shear mm, thickness mm, pressure mbar, temperature rise deg C, areas m2, phase radians, strain relative (m/m, reported against the 1e-6 micron/m scale).
- AS9100 frames the special process control and procedure approval context; the relations above are standard engineering methodology, summary-only.
Workflow
- State the inspection task: minimum defect size of interest, part area, field of view, laminate thickness, and the load type available (vacuum, thermal, or vibration).
- Select the shear distance with shear_for_defect(min_defect_mm): about half the minimum defect size, so the defect strains the full shear step.
- Check the minimum detectable strain against the expected defect strain: min_detectable_strain(noise_floor_rad, shear_mm, wavelength_nm) gives the floor the defect signal must clear at MIN_SNR.
- Size the load step with select_load(part_thickness_mm, load_type): vacuum pressure interpolated over the thickness breakpoints, or the thermal and vibration typical values. The procedure authority approves the real load.
- Build the scan plan with scan_plan(part_area_m2, fov_area_m2, overlap): the pass count and the redundant overlap area that gate the mechanical scan.
- Interpret the measured fringe anomaly: strain_from_phase(phase_rad, shear_mm, wavelength_nm) converts the phase map value into a strain gradient estimate; phase_for_strain recovers the phase for a cross-check.
- Disposition the anomaly with anomaly_disposition(anomaly_size_mm, allow_size_mm, snr) against the maximum allowable disbond or delamination size: accept, review, or reject with reasons.
- Call summarize(...) once for the complete planning record: shear distance, minimum detectable strain, load value, scan plan, coverage check, anomaly strain estimate, and verdict.
- Confirm the deterministic checks with the contract test scripts/test_shearography_inspection.py.
Worked example
Composite panel inspection for disbonds: minimum defect 10 mm, part area 1.0 m2, field of view 0.25 m2, 20 percent overlap, 6 mm laminate under vacuum load, 0.5 rad phase anomaly measured at the shear distance, 12 mm anomaly against a 10 mm allowable, SNR 5.0, 532 nm laser, 0.1 rad noise floor.
- Shear distance: shear_for_defect(10.0) = 5.0 mm (6 mm defect to 3 mm).
- Phase sensitivity: 0.5 rad at 5 mm shear and 532 nm is a strain gradient of 4.23e-6 relative strain (4.23 micron/m): strain_from_phase(0.5, 5.0, 532.0); the inverse phase_for_strain recovers 0.5 rad within 1e-12.
- Minimum detectable strain: with the 0.1 rad noise floor at 5 mm shear, min_detectable_strain(0.1, 5.0, 532.0) is exactly 3.0 times the noise-equivalent single-frame strain (the MIN_SNR contract), about 2.54e-6 relative strain, well below the 4.23e-6 measured anomaly.
- Load step: select_load(6.0, "vacuum") = 40.0 mbar; for a 4 mm laminate the interpolation gives 30.0 mbar between the 20 mbar (2 mm) and 40 mbar (6 mm) breakpoints. Thermal would be 5.0 deg C, vibration 30.0.
- Scan plan: scan_plan(1.0, 0.25, 0.2) gives 5 passes with 0.25 m2 of overlap area; the same part at 95 percent overlap needs 80 passes.
- Disposition: anomaly_disposition(12.0, 10.0, 5.0) rejects (12 mm is at the allowable plus the 20 percent band), (9.0, 10.0, 5.0) accepts, (11.0, 10.0, 5.0) reviews because it exceeds the allowable inside the band, and (8.0, 10.0, 2.0) reviews on low SNR (2.0 below MIN_SNR 3.0).
- Summarize: summarize(part_thickness_mm=6.0, part_area_m2=1.0, fov_area_m2=0.25, overlap=0.2, min_defect_mm=10.0, load_type="vacuum", phase_rad=0.5, anomaly_size_mm=12.0, allow_size_mm=10.0, snr=5.0) returns shear 5.0 mm, load 40.0 mbar, 5 passes, coverage OK, anomaly strain 4.23e-6, verdict reject.
Verification
- Confirm strain_from_phase(0.5, 5.0, 532.0) returns 4.23e-6 and that phase_for_strain of that strain recovers 0.5 rad within 1e-12.
- Confirm min_detectable_strain(0.1, 5.0, 532.0) is exactly MIN_SNR (3.0) times strain_from_phase(0.1, 5.0, 532.0).
- Confirm shear_for_defect(10.0) returns 5.0 mm and shear_for_defect(6.0) returns 3.0 mm.
- Confirm select_load(6.0, "vacuum") returns 40.0 mbar, select_load(4.0, "vacuum") returns 30.0 mbar by interpolation, and select_load(3.0, "thermal") returns 5.0 deg C.
- Confirm scan_plan(1.0, 0.25, 0.2) returns 5 passes and scan_plan(1.0, 0.25, 0.95) returns 80 passes.
- Confirm the disposition branches: 12 mm over 10 mm rejects, 9 mm over 10 mm accepts, 11 mm over 10 mm reviews, 8 mm at SNR 2 reviews.
- Confirm every non-positive shear, thickness, area, defect, anomaly and allowable size, every unknown load_type, every overlap outside [0, 0.95], and every non-finite input raises ValueError.
- Run the contract test offline: python3 scripts/test_shearography_inspection.py (29 tests, deterministic).
Related leaves
- manufacturing-quality/ndt/ndt-method-selection: the classic five NDT method screening (RT, UT, ET, PT, MT); shearography is the alternative method this leaf sizes and interprets.
- manufacturing-quality/ndt/thermography: the thermal contrast method for the same disbond and delamination defect classes.
- manufacturing-quality/ndt/ultrasonic-inspection: the time of flight echo sizing method for disbond and delamination detection.
- manufacturing-quality/as9100/calibration-control: the calibration system, test accuracy ratio, and due date controls that cover the shearography instrument under the AS9100 process.
Pitfalls
- Mixing wavelength and shear units: the phase and strain relations require all lengths in one unit, and the module converts nm and mm inputs to meters consistently - a 532 nm wavelength fed against mm shear without conversion corrupts the strain estimate by orders of magnitude.
- Selecting shear larger than the defect: the rule sizes shear at about half the minimum defect (10 mm defect to 5 mm shear), so a shear distance near or above the defect size under-strains the anomaly and drops the signal toward the noise floor.
- Reading an anomaly without the SNR gate: an accept requires the anomaly within the allowable AND the signal to noise at MIN_SNR (3.0) - (8.0, 10.0, 2.0) reviews on low SNR even though the size is inside the allowable.
- Treating the module load values as release authority: the vacuum breakpoints (20/40/60 mbar), 5 deg C thermal rise and vibration sweep band are documented typical values for aerospace laminates - the approved procedure governs the real load.
- Dispositioning without the review band: an anomaly between the allowable and the allowable plus the 0.2 band (11 mm over a 10 mm allowable) reviews, and only an anomaly at or beyond the band edge rejects.
- Letting overlap blow up the scan: coverage needs at least 0.85 of the part with valid phase data, but overlap is capped at 0.95 - the same 1.0 m2 part needs 5 passes at 20 percent overlap and 80 passes at 95 percent, so an unnecessary overlap costs real scan time.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_shearography_inspection.py
The test covers the worked example contract (4.23e-6 strain at 0.5 rad, 5 mm shear and 532 nm, round trip within 1e-12, minimum detectable strain ratio exactly 3.0, shear_for_defect 10 mm to 5 mm, vacuum load interpolation 6 mm to 40 mbar and 4 mm to 30 mbar, scan plan 5 passes at 20 percent overlap and 80 passes at 95 percent, accept / review / reject dispositions), phase and strain scaling, the noise floor sensitivity, the shear selection rule, the load table constants, scan plan boundary cases, the summarize record, and ValueError rejection of non-physical inputs, unknown load types, and out-of-range overlap.
Compliance
- Standards referenced, not reproduced: AS9100 frames the NDT special process control and procedure approval context; the shearography relations above (phase sensitivity, shear selection rule, load step guidance, scan plan, disposition band) are standard engineering methodology and documented typical values, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.