docs: group solver evidence by feature

This commit is contained in:
KOKO\Mimi
2026-08-15 02:18:26 +09:00
parent aa5d271a2e
commit 8b42e7883b
38 changed files with 83 additions and 1903 deletions
@@ -0,0 +1,297 @@
# 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`
- review_fix_date: `2026-08-10`
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` is absent-allowed under project-wide policy, while `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. |
| optional metadata | `reference/cantilever beam/metadata.json` | absent-allowed | Approved design, ADR-010, I/O definition, and reference-model contract supply provenance; absence is not a missing artifact. |
| 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 authoritative TASK-24 `ComparisonReport`, test contract, serialized JSON, and
Step 26 acceptance probe all define the verdict as the boolean `passed`. Final
review reproduced that the former `$metrics.status` sample failed against the valid
artifact, corrected the phase probe to `$metrics.passed -eq $true`, and reran the
exact acceptance chain successfully. The generated JSON has `passed=true`.
## 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`
- phase_step26_acceptance_modified_for_review_fix: `true`
- phase_index_step26_summary_modified_for_review_fix: `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; the final review fix changed only acceptance/report/index
documentation, and pre/post hashes, Git diff, and Git status agree
## Open Issues
- 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.
- Resolved final-review finding: the Step 26 acceptance probe now reads the
authoritative boolean `passed`, and its exact command passes on the current artifact.
- No issue blocks Physics Evaluation.