feat(verification): compare Hex8 original result identities and quantities
This commit is contained in:
@@ -32,8 +32,9 @@ Frequency는 original unstressed 상태의10 modes 요청이며 결과 Value는
|
||||
|
||||
## Quantity와 identity
|
||||
|
||||
Static U1/U2/U3 global, RF1/RF2/RF3의 constrained projection, integration-point Cauchy
|
||||
S11/S22/S33/S12/S13/S23 각각 blocking family다. U/RF는442-row 전체 inventory를 먼저 확인하고,
|
||||
Static은 U1/U2/U3의 U-global, RF1/RF2/RF3 constrained projection의 RF-global,
|
||||
integration-point Cauchy S11/S22/S33/S12/S13/S23의 S-global을 각각 독립 blocking family로 비교한다.
|
||||
U/RF는442-row 전체 inventory를 먼저 확인하고,
|
||||
RF만 실제 constrained components로 투영한다. Free Abaqus RF와 FESA free residual을 비교하지 않는다.
|
||||
Stress는300×8×6 전부 포함하며 elemental-nodal stress·절점 외삽·평균으로 변환하지 않는다.
|
||||
Dynamic U는101 frame 각각442×3인 독립 blocking family다. Frequency Value는 mode별 singleton이며
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
# Hex8 original comparison evidence
|
||||
|
||||
This page records T8's comparison-only Python implementation and its observed
|
||||
results. It does not replace the feature PRD, numerical controls or completion
|
||||
checklist. The comparator reads official rounded Float64 quantities; it does not
|
||||
recompute the internal high+low solver acceptance gates from those observables.
|
||||
|
||||
## Entry point and identities
|
||||
|
||||
`uv run --with h5py --with pytest python scripts/verification/compare_hex8.py`
|
||||
requires `--case`, the actual scratch `--input`, official `--results`, and
|
||||
`--report`. `--references` defaults to `reference/hexa`. The optional
|
||||
`--execution-record` consumes a closed native CLI record; it never executes its
|
||||
command. A supplied record must have native exit0, unchanged original/copy byte
|
||||
identities, and the exact input and result hashes. Without that record the report
|
||||
explicitly certifies file comparison only, not successful solver execution.
|
||||
|
||||
For example, after a real original run has naturally completed:
|
||||
|
||||
```powershell
|
||||
uv run --with h5py --with pytest python scripts/verification/compare_hex8.py `
|
||||
--case hexa_linearstatic --input <scratch>/hexa_linearstatic.inp `
|
||||
--results <scratch>/hexa_linearstatic_results.h5 `
|
||||
--execution-record <scratch>/native.json --report <evidence>/comparison.json
|
||||
```
|
||||
|
||||
The report path may not overwrite an input, reference, execution record or result.
|
||||
Authoritative repository originals remain protected even with alternate copied
|
||||
references; existing symlink/junction and hardlink aliases are also checked.
|
||||
Exit0 means the declared comparison passes; exit1 means a numerical family fails;
|
||||
exit2 means an identity/schema/finite/precondition error or missing modal reference.
|
||||
The tool is not a solver launcher, result generator, reference repair or release
|
||||
readiness check.
|
||||
|
||||
The fixed source inventory is the [reference-model](reference-model.md) inventory:
|
||||
442 nodes, 300 C3D8 elements and 13 frozen original files. Input and CSV raw SHA256
|
||||
must match the documented Windows working-tree bytes. The HDF5 metadata must
|
||||
identify the actual lexically normalized absolute scratch path and that file's FNV1a64 content
|
||||
identity; a different path with identical bytes is not silently accepted.
|
||||
|
||||
Complete CSV identities are checked before any physical values are converted.
|
||||
Complete required Solid model/frame/physical schemas, UTF-8 attributes and explicit
|
||||
LE F64/U64/U8 widths are then checked. Result arrays join the source node or
|
||||
source element/point labels through their internal ID maps; CSV row order is not
|
||||
an identity. Physical values, including nonprojected RF rows and unused exported
|
||||
CSV derived quantities, must be finite before tolerance evaluation.
|
||||
|
||||
Static reference increment10 maps to the completed load-factor1 frame, independent
|
||||
of its HDF5 storage frame index. RF validates all442 source rows before projecting
|
||||
the actual51 constrained scalar components. It never compares free RF with free
|
||||
residual. Stress compares all300×8×6 unaveraged global Cauchy components. Fixed
|
||||
IntPt1–8 conventions are checked without nearest-coordinate remapping. Point
|
||||
coordinates are auxiliary: CSV coordinate errors use the approved
|
||||
`16*float32-eps*sum(abs(Na*Xa_axis))` source-resolution budget; the scalar stress
|
||||
policy is unchanged.
|
||||
|
||||
Dynamic comparisons require exactly101 accepted frames. Integer increment0–100
|
||||
is matched first, source decimal time must equal n/10, and each stored time must
|
||||
be binary64 `n*0.1`. Each frame's1326 U scalars form a separate blocking family.
|
||||
There is no interpolation, nearest-time matching, scale sharing between frames,
|
||||
rotation family or acceleration/energy reference claim.
|
||||
|
||||
## Common numerical policy
|
||||
|
||||
Every static case has independent U-global, constrained RF-global and S-global
|
||||
blocking families. Every dynamic frame has its own U-global blocking family.
|
||||
For each family, only reference values define S=max(abs(reference)) and B=.01S.
|
||||
Rows with abs(reference)<=B require absolute error<=B; other rows require relative
|
||||
error<=.05. All-row RMS/S must also be<=.01. Boundaries are inclusive, and S=0
|
||||
requires every actual value to be exactly0. No absolute floor, denominator clamp,
|
||||
row deletion or cancellation of signed errors is applied. Reports preserve each
|
||||
scalar identity/value/error/branch/pass and family scale/band/max-absolute-error,
|
||||
absolute/relative RMS, source SHA and policy.
|
||||
|
||||
The independent typed modal comparison behavior requires explicit source step,
|
||||
mode1–10, eigenvalue or frequency quantity, and matching `1/time^2` or `1/time`
|
||||
units. Each mode is a singleton using the same RMS1% policy. This is not an
|
||||
assumption about the absent original Value file's eventual CSV layout. Actual
|
||||
modal original comparison remains **NOT RUN** until a genuine reference is
|
||||
provided and its semantics and hashes are confirmed.
|
||||
|
||||
## Current observations
|
||||
|
||||
The initial seven behavior assertions failed before implementation (pytest native
|
||||
exit1). The first expanded suite passed63/63 with native exit0. Those tests include
|
||||
original-sized independently declared HDF5 schema fixtures and reference values;
|
||||
they are comparator behavior fixtures, not actual FESA source validation evidence.
|
||||
The affected Hex8 plus legacy HHT comparator suite passed119/119 (native exit0,
|
||||
62.51s) before independent review fixes. Those bounded fixes were reproduced by
|
||||
safe behavior RED tests and the five targeted regressions then passed5/5. Final affected checks after all three independent findings were corrected passed
|
||||
124/124 with native exit0 (81.41s), with raw stdout and JUnit retained under
|
||||
`.harness/hex8-evidence/t8/final-affected/`. The preliminary whole `uv ... pytest -q` attempt and the separate exact
|
||||
configured `uv run --with h5py --with pytest python -B -m pytest -v -rs`
|
||||
(`docs/operations.md:87`, adding h5py) both stopped during collection with native
|
||||
exit2 and five legacy operational import errors (`msvc_harness` and removed `scripts.hooks`). It is not a whole-suite PASS;
|
||||
no tests were excluded and no retired orchestration was restored.
|
||||
|
||||
Actual official linear-static and nonlinear-static results passed source,
|
||||
model, schema, point, finite and frame prechecks and failed all three numerical
|
||||
families. Their closed CLI evidence records both have native exit0 and matching
|
||||
original/copy/result hashes; their comparator commands have native exit1.
|
||||
These are genuine comparison failures under the unchanged policy, not reader
|
||||
precheck failures or solver native execution failures. Frequency official readback
|
||||
passes its prechecks; its comparator exits2 with `not-run`, not PASS.
|
||||
|
||||
| Case / blocking quantity | Scalars | Failing rows | S | Maximum absolute error | RMS/S |
|
||||
| --- | ---: | ---: | ---: | ---: | ---: |
|
||||
| linear static U | 1326 | 79 | .00186131289 | .00007588175038730229 | .016739519723527385 |
|
||||
| linear static RF | 51 | 34 | 513497.094 | 78630.61640144575 | .06818892528188494 |
|
||||
| linear static S | 14400 | 7783 | 3430145 | 982855.3871926877 | .04270903417463437 |
|
||||
| nonlinear static U | 1326 | 79 | .00186110672 | .00007586510202476195 | .016737790679783753 |
|
||||
| nonlinear static RF | 51 | 34 | 513445.594 | 78623.61011241788 | .0681899286018377 |
|
||||
| nonlinear static S | 14400 | 7782 | 3429817.75 | 982753.151651503 | .04270850513087158 |
|
||||
|
||||
Official result SHA256 values are
|
||||
`3ef92c35ea83ddb4d11437ff87ef15eca7dac179d378eda19570abae579b09d0` (linear),
|
||||
`0095ebf2d360a8bd8a71212af0dd500ed611a56540a173a39d9c8d88d8e05bbf` (nonlinear),
|
||||
and `0ec4d2b09250bab17a8532228cd34a312518c04023076f971e929b387031c6b3` (frequency).
|
||||
Scratch input paths are
|
||||
`C:/git/FESADev/.harness/hex8-evidence/t8-original-cli/<case>/<case>.inp`.
|
||||
Each exact command, closed native exit and full row report is retained under
|
||||
`C:/git/FESADev/.dryforge/worktrees/hex8-t8-reference/.harness/hex8-evidence/t8/official-comparisons/<case>/`.
|
||||
The command records identify the actual scratch input, original reference directory,
|
||||
HDF5 and closed native CLI record consumed. Comparator implementation review and
|
||||
remaining naturally completed dynamic originals are tracked separately.
|
||||
|
||||
| Actual original | Current comparison state |
|
||||
| --- | --- |
|
||||
| `hexa_linearstatic` | Full precheck PASS; U/RF/S numerical FAIL (comparator native1) |
|
||||
| `hexa_nonlinearstatic` | Full precheck PASS; U/RF/S numerical FAIL (comparator native1) |
|
||||
| `hexa_dynlinear` | NOT RUN by comparator; root-owned actual CLI run pending |
|
||||
| `hexa_dynnonlinear` | NOT RUN by comparator; root-owned actual CLI run pending |
|
||||
| `hexa_freq` | Official HDF5 precheck PASS; modal Value absent, actual comparison NOT RUN (native2) |
|
||||
|
||||
Full MSVC build/CTest, original CLI orchestration, independent numerical/physics
|
||||
investigation of the reference conflict and whole-feature completion are root-owned
|
||||
and are not inferred from this Python implementation or its fixture tests.
|
||||
Reference in New Issue
Block a user