feat(linear-static-3d-euler-beam): step 26 - reference-verification
This commit is contained in:
@@ -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.
|
||||||
Reference in New Issue
Block a user