From e778e7aa95387049b10f39b622054db4848aebcf Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Sun, 9 Aug 2026 23:45:29 +0900 Subject: [PATCH] feat(linear-static-3d-euler-beam): step 26 - reference-verification --- ...ic-3d-euler-beam-reference-verification.md | 294 ++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 docs/reference-verifications/linear-static-3d-euler-beam-reference-verification.md diff --git a/docs/reference-verifications/linear-static-3d-euler-beam-reference-verification.md b/docs/reference-verifications/linear-static-3d-euler-beam-reference-verification.md new file mode 100644 index 0000000..7d2d574 --- /dev/null +++ b/docs/reference-verifications/linear-static-3d-euler-beam-reference-verification.md @@ -0,0 +1,294 @@ +# Linear Static 3D Euler Beam Reference Verification Report + +## Metadata + +- feature_id: `linear-static-3d-euler-beam` +- model_id: `cantilever-beam-b33` +- source_head: `451d9077ea70e3087454db3760e677da0095d27f` +- source_build_test_report: `docs/build-test-reports/linear-static-3d-euler-beam.md` +- source_reference_models: `docs/reference-models/linear-static-3d-euler-beam-reference-models.md` +- source_io_definition: `docs/io-definitions/linear-static-3d-euler-beam-io.md` +- source_implementation_plan: `docs/implementation-plans/linear-static-3d-euler-beam.md` +- source_implementation_report: `docs/implementation-plans/linear-static-3d-euler-beam-implementation-report.md` +- status: `pass-for-physics-evaluation` +- owner_agent: `reference-verification-agent` +- date: `2026-08-09` + +The prerequisite build/test report has status +`pass-for-reference-verification`. This report applies only the approved Abaqus +B33 reference tolerance. It does not approve physics sanity or release readiness. + +## Artifact Inventory + +The approved B33 exception overrides the generic new-bundle inventory. The exact +four legacy files with spaces are the complete read-only reference bundle; +`metadata.json`, `README.md`, and a stress CSV are contractually N/A and are not +missing artifacts. + +| item | exact path | status | direct audit evidence | +| --- | --- | --- | --- | +| reference directory | `reference/cantilever beam/` | present, exact inventory | Four regular files only; no extra entry. | +| reference input | `reference/cantilever beam/cantilever beam.inp` | present, valid | 2,330 bytes; exactly one `*ELEMENT, TYPE=B33` declaration at line 21. | +| displacement CSV | `reference/cantilever beam/cantilever beam displacements.csv` | present, valid | Exact 9-column CAE header; 11 unique rows; 66 finite values. | +| reaction CSV | `reference/cantilever beam/cantilever beam reactions.csv` | present, valid | Exact 9-column CAE header; 11 unique rows; 66 finite values. | +| elemental-force CSV | `reference/cantilever beam/cantilever beam elemental forces.csv` | present, valid | Exact 7-column CAE header; 11 unique rows; 44 finite values. | +| legacy metadata | `reference/cantilever beam/metadata.json` | N/A | Approved design, ADR-010, I/O definition, and reference-model contract supply provenance. | +| legacy README | `reference/cantilever beam/README.md` | N/A | Approved B33 legacy exception. | +| reference stress CSV | N/A | N/A | Abaqus beam-stress comparison is outside the approved V0 scope. | +| authoritative solver output | `.harness/build/reference/cantilever-beam-b33/results.h5` | present, valid | 25,336 bytes; generated by the fresh exact CTest; HDF5 schema inspected read-only with HDF5 2.1.1 utilities. | +| comparison ledger | `.harness/build/reference/cantilever-beam-b33/comparison.json` | present, valid | 128,118 bytes; 176 row decisions, 16 component metrics, and `passed=true`. | +| solver debug CSV view | N/A | N/A | No derived FESA CSV was generated or used. | + +### Reference hashes + +Fresh pre-comparison and post-comparison SHA-256 values were identical: + +| exact approved legacy path | SHA-256 | +| --- | --- | +| `reference/cantilever beam/cantilever beam.inp` | `E406EA9560321B791DBDB829E03BD24593B9875E0195D35B86BD931EDA122EF3` | +| `reference/cantilever beam/cantilever beam displacements.csv` | `7B3312FBC8848E81D9A0FD4FF2B56BC1954636A2C14B5C1CBB269CB9477D3C31` | +| `reference/cantilever beam/cantilever beam reactions.csv` | `BF30CDB0CD50106885DE14D63492737736C587426EBD787DE4F7EE6AA86DAA23` | +| `reference/cantilever beam/cantilever beam elemental forces.csv` | `E5E77FEC0FA9482AE018DBF296E74D396335C7C711BD2E9AA2315247A34290BA` | + +`git diff --exit-code -- reference/` exited 0 and +`git status --short -- reference/` was empty after both comparison runs. + +### Authoritative HDF5 audit + +`h5ls` and `h5dump` opened `results.h5` read-only and established: + +- schema version `0`, solver version `0.1.0`, feature + `linear-static-3d-euler-beam`, formulation `B33-3D-Euler-Bernoulli`, + `Step-1`, and frame `0`; +- metadata unit label `user-consistent-unspecified`, as required for ordinary + `.inp` interpretation; the approved reference-model contract supplies the + external SI provenance used by this comparison; +- coordinate convention + `global-cartesian; beam-local=(t,n1,t-cross-n1)`; +- source identity + `path=C:/Users/baram/orca/workspaces/FESADev/LinearStatic/reference/cantilever beam/cantilever beam.inp;content_identity=fnv1a64:04543464cc970405`; + a fresh FNV-1a calculation of the input bytes reproduced + `04543464cc970405`; +- 11 nodes with stable internal IDs 0 through 10, source labels 1 through 11, + instance `PART-1_1-1`, global coordinates `(0..10,0,0)`; +- 10 elements with stable IDs 0 through 9, source labels 1 through 10, + consecutive connectivity and identity local axes; +- displacement and reaction shapes `[11,6]`, section-resultant shape + `[10,2,4]`, exact component/unit/coordinate/location attributes, and finite + float64 values; +- mandatory `stress_s11` compound schema with 20 finite rows (10 elements x 2 + Gauss points), `S11`, `force/length^2`, beam-local section-point attributes, + and the required `fesa-default` centroid identity. + +Only `results.h5` and `comparison.json` exist in the build-local evidence +directory. + +## Comparison Contract + +- reference_csv_schema_version: `abaqus-cae-report-csv-v0` +- hdf5_schema_version: `0` +- model / frame normalization: CSV + `Increment 1: Step Time = 1.000` -> `(cantilever-beam-b33, Step-1, frame 0)` +- id_matching: exact preserved `instance_name` plus source node label; + section-resultant endpoints project to an eligible source-node station +- row-set policy: expected canonical keys are all 11 nodes crossed with 6 + displacement, 6 reaction, and 4 section-resultant components +- displacement normalization: + `U-U1/U-U2/U-U3/UR-UR1/UR-UR2/UR-UR3` -> + `UX/UY/UZ/URX/URY/URZ` +- reaction normalization: + `RF-RF1/RF-RF2/RF-RF3/RM-RM1/RM-RM2/RM-RM3` -> + `RF1/RF2/RF3/RM1/RM2/RM3` +- section normalization: `SF-SF1 -> N`, `SM-SM1 -> My`, + `SM-SM2 -> Mz`, `SM-SM3 -> T` +- coordinates: global Cartesian for nodal quantities; beam local for section + resultants +- output locations: nodal displacement/reaction and positive-local-x endpoint + section cut projected to node station +- interior-node policy: both incident endpoints must first pass the approved + component tolerance; the smaller stable element ID is selected without + averaging +- tolerance source: requirements 036-039, ADR-014, approved I/O definition, + and reference-model contract +- tolerance policy: `absolute_floor + 1e-6 * reference_scale` +- reference scale: maximum absolute value from read-only Abaqus rows in the + same model, step/frame, quantity, and component only +- SI floors: `1e-9` for displacement/rotation and `1e-3` for force/moment; + zero scale uses the floor alone +- fail-before-tolerance conditions: missing, extra, duplicate, nonfinite, + schema-mismatched, or identity-mismatched row +- zero-reference policy: no zero clamp, deletion, substitution, or omission + +The complete expected set of 176 canonical keys was reconstructed independently +from the contract and matched the 176 unique ledger rows exactly. The 16 expected +quantity/component keys matched the 16 unique metrics. Every serialized absolute +error, tolerance, pass decision, Abaqus-only reference scale, maximum error, +maximum tolerance-normalized error, RMS error, norm error, and worst-row index was +recalculated from the row ledger and matched exactly. Missing rows, extra rows, +duplicate rows, nonfinite rows, and failed rows were all zero. + +The Step 26 sample acceptance probe reads `$metrics.status -eq 'pass'`, but the +authoritative TASK-24 `ComparisonReport`, test contract, and serialized JSON define +the verdict as the boolean `passed`. The generated JSON has no `status` field and +has `passed=true`. This report uses `passed=true`; the stale sample-field mismatch +does not change source, tests, or upstream contracts. + +## Execution Evidence + +The exact command was run twice after the artifact precheck: + +```powershell +ctest --test-dir .harness/build -C Debug -R B33ReferenceComparison -V --output-on-failure +``` + +Both executions passed the single exact test +`B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence` 1/1. +Each run reset only `.harness/build/reference/cantilever-beam-b33/` and regenerated +the same two build-local files. The comparison ledger was byte deterministic on +both runs: + +- size: `128118` bytes +- SHA-256: `258347AEA791D981AEA9B2BCAD85DE5344D4859ECA3692DC5E7AA01A848F8E0D` +- verdict: `passed=true` + +`results.h5` remains the authoritative solver output. The JSON is deterministic +review evidence derived directly from HDF5 and the read-only Abaqus CSV rows. + +## Quantity Results + +`maximum_relative_error` below is calculated only where the Abaqus reference is +nonzero. It is reported for audit completeness, but it is not the acceptance +rule: near-zero Abaqus residues make row-relative error ill-conditioned. The +approved component-scale normalized error is `absolute_error / row_tolerance`. + +| quantity | FESA HDF5 dataset | reference CSV | compared | missing | extra | nonfinite | max abs error | max relative error | max tolerance-normalized error | RMS error | norm error | worst ID/component by abs error | result | +| --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | +| displacement | `/steps/Step-1/frames/0/nodal/displacement` | `reference/cantilever beam/cantilever beam displacements.csv` | 66 | 0 | 0 | 0 | `5.333229170789711e-10` | `1.0` | `0.026602795021994977` | `1.1637590907608428e-10` | `9.454423547085314e-10` | node 11 / `UZ` | pass | +| reaction | `/steps/Step-1/frames/0/nodal/reaction` | `reference/cantilever beam/cantilever beam reactions.csv` | 66 | 0 | 0 | 0 | `5.0514936447143555e-6` | `8.195638656616211e-13` | `8.187451205410801e-7` | `6.403678373262425e-7` | `5.202372903532068e-6` | node 1 / `RM2` | pass | +| section resultant | `/steps/Step-1/frames/0/element/section_resultant` | `reference/cantilever beam/cantilever beam elemental forces.csv` | 44 | 0 | 0 | 0 | `1.5600242861189492e-2` | `1.0000155680249674` | `0.0015598682992890203` | `0.0023518254339534184` | `0.015600245073676508` | node station 11 / `My` | pass | +| stress | `/steps/Step-1/frames/0/element/stress_s11` | N/A | N/A | N/A | N/A | 0 in 20 mandatory HDF5 rows | N/A | N/A | N/A | N/A | N/A | N/A | N/A for Abaqus comparison; HDF5 requirement passed | + +The displacement row-relative maximum occurs at node 1 `UZ`, where the stored +reference residue is `-1e-30`; the section row-relative maximum occurs at free-end +`My`, where the stored reference residue is `-1.56e-2`. Neither row was clamped or +omitted. Their approved mixed-tolerance decisions pass. + +### Component metrics + +Each group contains 11 matched rows. `worst_row` is the zero-based index in the +deterministic JSON row ledger. + +| quantity | component | reference scale | row tolerance | max abs error | max normalized error | RMS error | norm error | worst row | worst identity | result | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | +| displacement | `UX` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 0 | node 1 / `UX` | pass | +| displacement | `UY` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 1 | node 1 / `UY` | pass | +| displacement | `UZ` | `0.0190476272` | `2.00476272e-8` | `5.333229170789711e-10` | `0.026602795021994977` | `2.790953046857666e-10` | `9.256544063926071e-10` | 62 | node 11 / `UZ` | pass | +| displacement | `URX` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 3 | node 1 / `URX` | pass | +| displacement | `URY` | `0.00285714399` | `3.85714399e-9` | `1.000013943180944e-10` | `0.025926279801157852` | `5.801658540511775e-11` | `1.924192454063848e-10` | 52 | node 9 / `URY` | pass | +| displacement | `URZ` | `0` | `1e-9` | `0` | `0` | `0` | `0` | 5 | node 1 / `URZ` | pass | +| reaction | `RF1` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 66 | node 1 / `RF1` | pass | +| reaction | `RF2` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 67 | node 1 / `RF2` | pass | +| reaction | `RF3` | `1e6` | `1.001` | `8.195638656616211e-7` | `8.187451205410801e-7` | `3.6239383393839433e-7` | `1.2019243735120167e-6` | 68 | node 1 / `RF3` | pass | +| reaction | `RM1` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 69 | node 1 / `RM1` | pass | +| reaction | `RM2` | `1e7` | `10.001` | `5.0514936447143555e-6` | `5.05098854585977e-7` | `1.5261377760919117e-6` | `5.061626381684292e-6` | 70 | node 1 / `RM2` | pass | +| reaction | `RM3` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 71 | node 1 / `RM3` | pass | +| section resultant | `N` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 132 | node 1 / `N` | pass | +| section resultant | `T` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 133 | node 1 / `T` | pass | +| section resultant | `My` | `1e7` | `10.001` | `0.015600242861189492` | `0.0015598682992890203` | `0.004703650867906837` | `0.015600245073676508` | 174 | node 11 / `My` | pass | +| section resultant | `Mz` | `0` | `1e-3` | `0` | `0` | `0` | `0` | 135 | node 1 / `Mz` | pass | + +The largest normalized comparison error across all 176 rows is +`0.026602795021994977` at node 11 `UZ`, below the pass boundary of `1.0`. + +### Row decision ledger + +Every row decision is recorded in the deterministic build-local +`comparison.json` identified above. Its stable row order is displacement nodes +1-11 x six components, reaction nodes 1-11 x six components, then section node +stations 1-11 x `[N,T,My,Mz]`. Independent parsing confirmed: + +- rows: 176 +- unique canonical row keys: 176 +- row decisions with `passed=true`: 176 +- row decisions with `passed=false`: 0 +- finite FESA/reference/error/tolerance records: 176 +- missing / extra / duplicate / identity-mismatched rows: 0 / 0 / 0 / 0 +- metrics: 16 unique expected component groups + +## Stress Reference Status + +- Abaqus stress reference comparison: N/A +- reason: the approved V0 reference contract excludes beam-stress CSV + comparison and substitutes analytical/unit plus HDF5 schema evidence +- mandatory solver stress output: pass +- direct evidence: `stress_s11` exists with the exact compound schema, exact + unit/coordinate/location attributes, two Gauss rows for each of ten elements, + finite `S11`, and deterministic element/Gauss ordering + +No stress reference row was synthesized, and mandatory HDF5 stress was not +treated as optional. + +## Physics Evidence Handoff + +The comparator serialized the following evidence for independent Step 27 review: + +| evidence | value | +| --- | --- | +| free residual norm | `9.356339321107032e-7` | +| applied force | `[0, 0, -1000000]` | +| reaction force | `[0, 0, 999999.9999998808]` | +| applied moment about origin | `[0, 10000000, 0]` | +| reaction moment about origin | `[0, -9999999.999997258, 0]` | +| endpoint consistency | `passed=true` | + +These values are handed off as evidence only. This Step does not interpret them +as a physics-sanity verdict. + +## Failure Classification + +- classification: `N/A` +- primary_failure: `N/A` +- evidence: artifact precheck passed; exact comparison CTest passed twice; + 176/176 rows and 16/16 metric groups passed; no schema, identity, unit, + coordinate, nonfinite, missing/extra, or tolerance failure was found +- correction_handoff: `N/A` + +## Handoff Recommendation + +| target_agent | reason | required input | +| --- | --- | --- | +| Physics Evaluation Agent | All required reference comparisons passed the exact approved tolerance. | This report, authoritative build-local `results.h5`, deterministic `comparison.json`, and its `physics_evidence`. | + +The handoff status is `pass-for-physics-evaluation` only. Physics sanity remains +responsible for global force/moment equilibrium, reaction sign, displacement +direction, symmetry, section-force consistency, residual interpretation, and +model-coverage adequacy. + +## No-Change Assertion + +- source_files_modified: `false` +- test_files_modified: `false` +- cmake_files_modified: `false` +- requirements_modified: `false` +- formulations_modified: `false` +- io_contract_modified: `false` +- reference_model_contract_modified: `false` +- reference_artifacts_modified: `false` +- tolerance_policies_modified: `false` +- Abaqus_or_other_reference_solver_executed: `false` +- owned_report_created: `true` +- phase_index_step26_modified: `true` +- generated_build_local_evidence: `true`, ignored under `.harness/build/` +- notes: comparison and HDF5 inspection were read-only with respect to the + approved reference bundle; pre/post hashes, Git diff, and Git status agree + +## Open Issues + +- Non-blocking acceptance-text mismatch: Step 26's sample PowerShell reads a + nonexistent string `status`; authoritative TASK-24 code/tests/JSON use boolean + `passed=true`. No upstream file was changed in this independent gate. +- Non-blocking evidence typo: the Step 25 build/test report prints the input + SHA-256 without the second `DB` after `...1DB`; the fresh 64-character pre/post + value in this report matches the unchanged working-tree file. Reference Git + diff/status and the end-to-end reference snapshot check are clean. +- No issue blocks Physics Evaluation.