Files
FESADev/docs/hex8-structural-analysis/verification.md
T
KOKO\Mimi eaa5cbeb21 feat: adopt lumped mass and reduced-coordinate shell HHT
Integrate Hex8 mass verification and fixed-null-basis shell dynamics with numerical and physics handoff evidence. Preserve interrupted reference and full-validation status; full integration validation is deferred until after performance optimization.
2026-10-13 16:57:19 +09:00

23 KiB
Raw Blame History

Hex8 verification and original comparison evidence

2026-10-11 질량 정책 변경: HEX8-ADR-010에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 formulation, 재검증 상태는 PRD의 현재 checklist를 따른다.

현행 필수 원본5개 비교는 모두 PASS이며 최저10 modal Value의 최대 상대차는 0.0019610496%다. 변경본 검증에 전체789개 자연 종료와 test-only 수정 후 재검사를 구분했다. 기존 consistent modal FAIL은 아래 이력이며 현재 불일치가 아니다. 당시 Shell C08b runtime 실패는 후속 승인된 초기 Newton 정책에서 해소됐다. 최신 검증과 사용자 중단, 전체 검증 유예의 범위는 최종 인계를 따르며 과거 PASS/FAIL을 최신 전체 통과로 승계하지 않는다.

This page records the build/test evidence, comparison-only Python tool and actual original results. Historical pointwise results and the approved mean-volume change are recorded separately. 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:

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 inventory: 442 nodes, 300 C3D8 elements and 14 frozen original files, including the supplied modal TXT. Input and CSV/TXT 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 supplied modal TXT uses Mode n: Value = lambda Freq = f (cycles/time). Value is compared directly with the HDF5 eigenvalue (1/time^2); Freq is finite auxiliary data, without conversion or assumed SI time units. The TXT has no step field: its fixed hexa_freq case binds to the sole Step-1 in the hash-checked input. Modes1–10 are matched by ID, retaining repeated eigenvalues. Each mode is a singleton using the same RMS1% policy. An absent TXT remains NOT RUN; malformed or hash-mismatched data fail prechecks. The previous consistent-mass result failed seven families, as recorded below; the current lumped-mass result passes all ten.

2026-10-11 제공된 고유치 원본의 최종 비교

사용자 제공 reference/hexa/hexa_freq.txt의 raw SHA256은 3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370이다. 기존 18b36c1 frozen CLI가 native0으로 자연 종료한 실제 공식 HDF5를 사용했다. HDF5 SHA는 f6203936883df7f27e86a20311726b7e59fefa117e5f9fa67f71bdf63ec2e4cb이며 이번에 새 C++ solver 실행으로 표현하지 않는다. 실제 scratch 입력·결과 hash 및 closed CLI record,442절점·300요소·51구속·10 modes, quantity/unit/finite precheck는 PASS다.

uv run --with h5py python -B scripts/verification/compare_hex8.py `
  --case hexa_freq `
  --input .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/hexa_freq.inp `
  --results .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/hexa_freq_results.h5 `
  --execution-record .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/native.json `
  --report .harness/hex8-evidence/mean-volume/modal-final/comparison.json

실제 comparator native exit1, numerical FAIL이다. Mode별 singleton의 RMS/S는 abs(lambda_fesa-lambda_reference)/abs(lambda_reference)이며 공통1% 기준을 적용했다. 다음 표는 가독성을 위해 출력 자리만 줄였고 실제 판정에는 반올림 전 값을 사용한다.

Mode 원본 Value λ FESA λ RMS/S (%) 판정
1 496.28 497.153597379 0.176029 PASS
2 496.28 497.156908818 0.176696 PASS
3 18302 18519.547026780 1.188652 FAIL
4 18302 18519.716390186 1.189577 FAIL
5 52797 63489.091264684 20.251323 FAIL
6 131213 134772.818711666 2.713008 FAIL
7 131214 134773.663065696 2.712868 FAIL
8 165943 166062.030100247 0.071730 PASS
9 449258 470919.350201648 4.821584 FAIL
10 449260 470921.678067527 4.821635 FAIL

10 families 중7개 RMS 실패, scalar row5% 실패는 mode5의1개다. MITC4의 scoped5% RMS 예외를 적용하거나 frequency로 변환하지 않았다. Source 반복 고유치를 합치거나 값이 가까운 모드에 재매칭하지 않았다. TXT 원본은 수정하지 않았다.

비교기 새 동작11개의 RED 실패를 관측한 뒤 원본 TXT reader와 실제 frequency 분기를 연결했다. 추가된 성공 경로까지12개 새 검사와 기존 영향 검사 모두 PASS다. 실제 명령은 uv run --with h5py --with pytest python -B -m pytest tests/test_compare_hex8.py tests/test_compare_hht_dynamic.py -q --junitxml=.harness/hex8-evidence/mean-volume/modal-final/affected.xml, native0·136 PASS(95 Hex8/41 HHT)·24.52초다. Raw log·JUnit·argv/native/timestamps는 modal-final/affected.log, affected.xml, affected.json에 보존했다. Schema fixture의 PASS/의도된 FAIL은 비교기 동작 근거이며 실제 modal 일치의 PASS가 아니다.

독립 read-only 감사는 native0·finding0으로 동일한7개 실패를 재현했다. 원본14개를 포함한 소비23개 artifact의 SHA를 전후 확인했다. 이번 추가 검증의 종료 요약은 modal-final/closure.json이며 과거 원본 부재 시의 mean-volume/closure.json과 comparisons/hexa_freq/comparison.json은 당시 NOT RUN 기록으로 보존했다.

이번 변경은 비교기·Python 검사·문서에 한정되고 C++ 수식/질량/절차/출력은 변경하지 않았다. 직전에 완료한 전체787 회귀는 아래 기록대로 native8·784 PASS·기존 FAIL2·SKIP1이며 이번 Python 검사로 전체 회귀를 새로 실행한 것으로 보고하지 않는다. 전체 Python의 기존 collection5 오류도 해결한 것으로 보고하지 않는다. 최종 modal 수치 불일치가 남아 기능 완료는 대기다. 원인 분리와 승인 경계는 미해결 문제에 기록한다. 독립 검토의 범위와 원시 자료는 수치 검토를 따른다.

비교기 개발과 변경 전 pointwise 구현의 관측 이력

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 inputs are retained under .harness/hex8-evidence/t8-original-cli/<case>/<case>.inp. Root preserved each exact command, closed native exit and full row report under .harness/hex8-evidence/t8-comparator-frozen/official-comparisons/<case>/. The command records identify the actual scratch input, original reference directory, HDF5 and closed native CLI record consumed. The frozen author revision 0b93c0c59cf64db44003ebe5217a4efb8307a8ba passed independent bounded review and was integrated as 317fe5c. Root and reviewer separately verified four owned source blobs/snapshots, 65 closed raw artifacts and all13 unchanged source hashes. The raw affected stdout/JUnit certifies124 tests (Hex8 83, legacy HHT 41), zero failures/errors/skips and native0. This review certifies the comparator behavior and evidence, not numerical agreement with the originals. Naturally completed dynamic originals and whole-feature validation are tracked separately.

After integration, the root affected suite also passed124/124 with native0 (70.92s). Root comparison-only commands consumed the same naturally closed official results and again returned static native1 with the same failed family metrics and frequency native2 (not-run). These commands and raw stdout/JUnit/row reports are retained under .harness/hex8-evidence/t8-integrated/. No original solver case was rerun to perform these comparisons.

Actual original Closed pointwise baseline comparison state (before approved B)
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 CLI native0,101-frame precheck PASS;88/101 U families FAIL (comparator native1), maximum RMS/S .08163737360707901
hexa_dynnonlinear CLI native0,101-frame precheck PASS;88/101 U families FAIL (comparator native1), maximum RMS/S .08160653291688992
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.

The two actual dynamic CLI runs closed naturally with all101 frames before the 2026-10-10 energy change. Each comparison consumed all101 original increments, 1326 scalars per increment and44642 original node rows. Failed scalar-row totals were74098 (linear) and73974 (nonlinear); maximum absolute errors were .0003979358365926728 and.00039786754005028237. Full commands, native records, source/result hashes and row reports are preserved under .harness/hex8-evidence/t8-dynamic-closure/<case>/. The separately frozen API c49cae4 also naturally completed both101-endpoint strict-gate checks with native0; it did not itself write official HDF5 or establish original agreement.

The closed pointwise source 1eb9cdd full MSVC Debug build exited0. Its unfiltered 780-test CTest exited8:777 PASS,2 FAIL,1 SKIP, with all163 added tests PASS. The baseline exception names, statuses and raw metric bodies matched exactly: HhtShellPhysics.C08aRigidManufacturedOrbitFullCoordinateTimeConvergence, HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants, and HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved. Raw records and the independent closure summary are retained under .harness/hex8-evidence/t9-full-current/. This is not a whole-suite PASS.

Approved B replaces the pointwise bulk energy and requires new validation of all five procedures. None of the historical native, internal or reference outcomes above is a validation result for the mean-volume implementation. Originals, tolerances, strict gates and comparator contracts remain unchanged.

2026-10-10 체적 평균 energy 구현과 현재 재검증

Frozen 작성자 b2abd739를 root 18b36c1에 연결했다. 두 pass로 reference-volume 가중 trace 평균을 계산하고 같은 energy에서 내력·전체 Hessian·복구 응력을 구한다. Cross-GP bulk 항과 S*:delta²E 기하항을 함께 유지한다. LINE의 K0는 같은 식의 영변위 Hessian이다. 질량·HHT·strict gate·원본·I/O·허용오차는 변경하지 않았다.

수정한 weighted warped oracle를 이전 구현에 대입한7개 검사는 모두 실패했다. 변경본 작성자 관련150/150, 시간수렴3 GTests의4물리 사례, 최종 실제 재컴파일3/3은 각각 native build/CTest0/0이다. u/v/physical a의 최소 관측 차수1.98022는 기존1.8 기준을 충족한다. Root 실제 재컴파일 후 관련65/65도 native0이다. 정규 brick의 rank, 두 축 지정 굽힘장 에너지 수렴과 고정 두께 cantilever tip 추세는 서로 다른 증거다. 상세 범위는 수치 검토와 물리 검토에 있다.

새 공식 CLI는 frozen executable과 byte-identical scratch INP를 사용한다. 아래 두 정적 해석은 자연 종료 native0이며, 변경 없는 공식 비교기도 각각 native0이다. Source/model/schema/point/frame/finite 사전검사와 각 family의 모든 row가 통과했다.

원본 / blocking quantity Scalars Failing rows Maximum absolute error RMS/S
linear static U 1326 0 6.096370478748947e-11 9.317898154374918e-9
linear static RF 51 0 .014746726665180176 7.3098163267228364e-9
linear static S 14400 0 .12245691940188408 3.425934236751431e-9
nonlinear static U 1326 0 9.832466303596647e-10 2.169911561350724e-7
nonlinear static RF 51 0 12.826179522729944 6.728092996221331e-6
nonlinear static S 14400 0 93.34994950843975 9.338899878251489e-6

새 HDF5 SHA256은 linear 023769e50d05226ef8defe87e29bc9046fbdd5071783007ebb39a49fd9d7d617, nonlinear 2acb3471c7799597d554d4d9ee224e8c611522866808f38b2b2c202e0f98a4bd다. Frequency CLI도 native0으로 종료했고 공식 readback 사전검사는 PASS다. 새 결과 SHA는 f6203936883df7f27e86a20311726b7e59fefa117e5f9fa67f71bdf63ec2e4cb다. 원본 modal Value 부재로 비교는 native2·NOT RUN이며 수치 통과가 아니다.

새 선형 동적 CLI가 native0으로 자연 종료했고101-frame 사전검사와101개 U family가 모두 PASS다(비교 native0). 총133926개 scalar의 실패 행은0개다. 초기 exact-zero family를 포함하며100개 nonzero-scale family의 최대 RMS/S는.0031316511389477947, 전체 최대 absolute error는1.3395048822648645e-5다. 마지막 RMS/S는.001392775677333779다. Actual HDF SHA는 5476c557bc8e1c0a1e8b57a1cc8d763eb822a47e27aa2b2723fcbdc2246f9b40다. 이 외부 변위 비교는 rounded HDF만으로 내부 high+low strict gate를 재계산한 검사가 아니다.

새 비선형 동적 CLI도 native0으로 자연 종료했고101-frame 사전검사 및101개 U family가 모두 PASS다(비교 native0). 총133926개 scalar의 실패 행은0개다. 초기 exact-zero와 100개 nonzero-scale family를 구분했으며 최대 RMS/S는.003133373067174733, 전체 최대 absolute error는1.3397499223151595e-5, 마지막 RMS/S는.0013958914416137816이다. Actual HDF SHA는 023b4558a28f8d9365f6b11346a6cb4a5d2faafa68607c5c56bbf226fe816210다. 다섯 새 공식 CLI queue는 wrapper0으로 자연 종료했고 원본13개 SHA를 보존했다. 독립 검토의 범위는 해당 수치·물리 검토 문서를 따른다.

제외 없는 전체787 CTest는2026-10-11 자연 종료했다. MSVC x64 Debug configure/build는 native0/0이며 CTest는 native8:784 PASS·2 FAIL·1 SKIP이다. 기존617개가 모두 유지됐고 추가170개는 모두 PASS이며 새 예외는0이다. 두 기존 Shell 실패의 수치 로그20/30줄은 baseline과 정확히 같다. SKIP은 이름·상태가 동일하지만 output-on-failure raw에 상세 본문이 없어 그 metric 검증은 NOT VERIFIED다. 전체 green으로 보고하지 않는다. 정확한 CLI/비교 명령·native record· 원본/copy/result SHA·전 row report는 로컬 .harness/hex8-evidence/mean-volume/의 original-cli/, comparisons/, integrated-focused/, full/에 보존한다.

동일 revision에서 전체 Python 명령 uv run --with h5py --with pytest python -B -m pytest -v -rs도 다시 실행했다. 기존 msvc_harness·제거된 scripts.hooks import의 collection5 오류로 native2, 실행0개다. .harness/hex8-evidence/mean-volume/python-full/의 native 기록을 따른다. 기존 실패를 제외하거나 폐기된 절차를 복원하지 않았으며 전체 Python PASS가 아니다.

2026-10-11 전체 재검증 종료 기록

전체 C++ 검증은 설치된 MSVC x64와 dependency 환경에서 아래 preset backend 명령을 제외 없이 실행했다. .harness/config.json이 없고 generic runner는30분 deadline을 사용하므로 수시간의 전체 실행은 직접 backend로 완료했다. scripts/execute.py의 별도 실행 성공을 주장하지 않는다. 실제 argv·시각·native 종료 코드는 full/에 보존했다.

cmake --preset windows-msvc-ninja-debug
cmake --build --preset windows-msvc-ninja-debug
ctest --preset windows-msvc-ninja-debug --show-only=json-v1
ctest --preset windows-msvc-ninja-debug --output-on-failure

전체 실제 시간은16839.26초다. 기존 실패는 HhtShellPhysics.C08aRigidManufacturedOrbitFullCoordinateTimeConvergence 및 HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants, SKIP은 HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved다. 기존617개와 새170개의 discovery·실행 ordinal·status 및 종료 artifact SHA 대조는 full/independent-closure-summary.json에 있다. 다섯 CLI·네 실제 원본 비교·modal NOT RUN· Python collection 오류와 원본13개/frozen binaries 보존을 함께 기록한 최종 자료는 .harness/hex8-evidence/mean-volume/closure.json이다. 독립 감사와 실제 원본 물리 복구의 bounded 판정·한계는 수치 검토, 물리 검토를 따른다.

종료 후 독립 전체 evidence 감사도 native0·finding0이다. 별도22개 artifact SHA와 세 실제 테스트 실행 파일의 중간 관측/종료 SHA, 모든 discovery/실행 행과 기존 상대 순서·status를 대조했다. 자료는 final-evidence-audit-full/에 있다. 두 실패 출력은 elapsed-ms 표기만 제외해 정확히 동일하다. 이 감사 PASS는 CTest native8이나 modal NOT RUN을 통과로 재분류하지 않는다.