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.
This commit is contained in:
KOKO\Mimi
2026-10-13 16:57:19 +09:00
parent ede137c6b4
commit eaa5cbeb21
110 changed files with 15274 additions and 971 deletions
@@ -1,5 +1,7 @@
# Hex8 독립 수치 검토
2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
검토 대상은 [PRD](PRD.md), [formulation](formulation.md), [numeric controls](numeric-controls.md),
[I/O](io.md), [reference mapping](reference-model.md)이다. 2026-10-08 작성자와 독립된
`hex8_t1_numerical` reviewer가 문서·관련 코드·원본을 대조했다. 수식에 추가 blocker는 없으나
@@ -242,3 +244,244 @@ binary hash라고 표현하지 않는다. 감사 native0·finding0, bounded evid
판정은 종료 evidence의 일관성·새 회귀 없음에 한정하며 전체 green·release 또는
미제공 modal Value의 통과 판정이 아니다. 실제 원본의 독립 물리 수지 범위는
[physics review](physics-review.md)를 따른다.
## 2026-10-11 제공 modal 원본의 독립 검토
제공된 `hexa_freq.txt`의 직접 읽기와 root 비교기 diff를 작성자와 독립적으로 검토했다.
새 TXT parser·실제 frequency 분기·원본 raw hash/보고서 보호·mode1–10 일대일 대응·반복
고유치 보존·유일한 source Step-1 binding·HDF5 quantity/unit/dtype/finite가 bounded PASS다.
영향 Python native0·JUnit136 PASS(95 Hex8/41 HHT)도 closed artifact로 확인했다.
원본14개를 포함한23개 소비 artifact의 SHA를 검토 전후 대조했고 모두 동일하다.
독립 audit native0·finding0은 비교 코드와 증거의 일관성 판정이다.
실제 λ 오차와 공통 row5%/singleton RMS1%를 독립 재계산한 결과 mode3/4/5/6/7/9/10의
7개 family FAIL을 재현했다. 최대 mode5는 원본52797 대 FESA63489.09126468376,
relative RMS0.20251323493160142다. `Value`와 `Freq`의 각 decimal 표시 해상도 구간에서
`f=sqrt(lambda)/(2*pi)` 관계는 일관되지만 이 보조 검토의 구간을 비교값 보정이나 tolerance로
사용하지 않았다. 동일 mode ID의 출력 값 그대로 판정했고 frequency로 바꾸지 않았다.
공식 readback의24 returned pairs와 선택10개, 저장된 original-pencil verification도 확인했다.
이는 FESA 자체 pencil의 검증량 확인이며 새 matrix 조립·eigensolve나 Gram 독립 재계산을
수행했다고 주장하지 않는다. 원본 λ만으로 K/M 중 원인을 특정할 수 없고, 원본 mode shape·
modal mass·실제 element/mass law 또는 operator evidence 없이 수식·질량·기준 변경을
정당화하지 않는다. 최종 기능 완료는 필수 modal 불일치 해결까지 대기다.
자료는 `.harness/hex8-evidence/mean-volume/modal-final/independent-result.json`,
`independent-native.json`, `independent-inventory.json`, `independent-audit.py`다.
결과 JSON SHA는 `48c359cf670f9e39792cf58bbe5d7498effabcfd5789c3025904ac8562af5e99`다.
전체 C++ 회귀는 직전 `18b36c1` 실행 기록을 참조했고 이번 새 실행으로 표현하지 않았다.
## 2026-10-11 원본 질량 분리 진단의 독립 검토
후속 [질량·요소 조사](reference-mass-investigation.md)의4way 계산을 독립 검토했다.
Fresh engineering shear B/Cdev·체적 평균 coupling·consistent 적분과 full 행 합 lumping 뒤
free restriction의 의미가 맞다. 저장된 두 K·두 M·고유벡터에서 같은 source mode별 오차,
총질량과 자체 residual·Gram을 독립 재계산했다. Audit native0·finding0, 소비자료 SHA 불변이다.
Mean K+consistent M은 실제 FESA λ를 상대차이4.57e-12로 재현하고, mean K+lumped M은
원본10개 λ 모두 상대차이0.00196105% 이내다. 이는 질량 선택 차이를 설명하는 강한 근거다.
원본 actual operator 직접 대조나 재조립/eigensolve를 수행했다고 주장하지 않는다.
진단 script의 `max_eta_r`는 infinity-norm backward residual이다. 공식 T5의
Euclidean/Frobenius eta_r와 이름만으로 동일시하지 않으며 두 규격을 별도 재계산했다.
후자의4조합 최댓값은3.79e-15 이하, Gram Frobenius 오차는3.36e-15 이하다.
Private eigsh의sigma0/k10 결과는 실제 FEAST lowest-N count/completeness 인증이 아니다.
현재 FESA mass 정책이나 실제 modal FAIL은 변경하지 않았다.
자료는 `.harness/hex8-evidence/mean-volume/modal-mass-investigation/independent-result.json`과
같은 폴더의 native/audit에 보존한다. 상세 원본·문서·metric·채택 경계는 위 조사 문서를 따른다.
## 2026-10-11 row-sum lumped production 채택의 독립 검토
[HEX8-ADR-010](ADR.md)에 따라 변경된 `ComputeMass`와 eigen/HHT oracle·metadata를
읽기 전용으로 검토했다. Full reference consistent24×24를 기존8점으로 계산한 뒤
각 전체 행 합을 대각에 저장한다. BC는 이후 procedure에서 적용되므로 구속 열의
질량을 잃지 않는다. Positivity/finite 실패를 값 보정으로 숨기지 않으며 stiffness,
high+low 상태·계수 lifting·HHT gate를 변경하지 않는다.
**HEX8-LM-NR-001 — CLOSED: dense eigen oracle의 BC 순서.** 최초 oracle는
full_mass를 free×free loop 안에서만 채워 constrained 열을 누락했다. 독립 검토에서
이를 지적했고, 전체24 DOF의 독립 closed-form consistent 행렬 생성→full row sum→
free restriction으로 수정된 코드를 확인했다. 새 실행 검증은 전체 회귀 결과와 구분한다.
수정 전 binary의 부분 실패/중단은
`.dryforge/lumped-mass-adoption-20261011/focused-interrupted.json`에 보존한다.
Warped fixture의 독립 map은
`X=(xi+.12*eta*zeta, 2*eta+.09*xi*zeta, 3*zeta+.15*xi*eta)`다. 직접 전개한
detJ는 `6-.0135*xi²-.036*eta²-.0324*zeta²+.00324*xi*eta*zeta`로 신규 oracle와
일치한다. rho2의 절점 질량은 `11.9454±.00024`이며 부호는 `sx*sy*sz`다.
Ni*detJ의 축별 차수는3 이하라 기존2점 rule과 독립3점 적분이 수학적으로 일치한다.
비균일 속도 `v_ax=a+1`에서 uniform rhoV/8 shortcut의 T와 차이는 −.00192이므로
새 검사는 총질량만 같은 잘못된 uniform lumping도 구별한다.
Mass lower bound `rho*min(w)/27`는 계속 보수적으로 사용할 수 있다. 양의 shape와
weights에서 `M_L-M_C`의 quadratic form은 절점 속도 차이 제곱의 양의 합이다.
따라서 기존 consistent SPD lower bound는 lumped에도 유효하다. 추가 full-row 양의
합산은 고정 순서이며 기존512eps element/assembly budget과 비교했다. 새로운 기준
완화나 eigen upper-bound를 diagonal ratio로 대체하지 않았다. 비트 수준의 PSD나
수학적 lower bound만으로 실제 solver 검증을 대신한다는 의미는 아니다.
Fresh production **MSVC x64 Debug** `hexa_freq` CLI native0와10개 Value 비교를
독립 확인했다. 원본 TXT와 HDF5 mode1–10으로 singleton 행/RMS를 직접 재계산했으며
공통 row5%/RMS1%로 모두 PASS다. 최대 상대 RMS는 `1.961049613524256e-5`
(0.001961049613524256%)이다. 원본·byte 동일 입력 복사본·binary·HDF5 해시와
`lumped-reference` metadata를 대조했고 소비 artifact SHA는 검토 전후 동일했다.
저장된25 returned pairs의 max eta_r/eta_norm/eta_energy는 각각
`1.0554551422827935e-17 / 4.440892098500626e-16 / 7.476286423773325e-19`,
eta_gram/max_eta_orth는 `4.379426909390015e-15 / 1.0729264698916552e-15`다.
이는 저장된 original-pencil checks의 판독이며 reviewer가 production K/M을 새로
조립하거나 eigensolve/count certification을 독립 수행한 것은 아니다.
Bounded audit native0·finding0 자료는
`.dryforge/lumped-mass-adoption-20261011/references/hexa_freq/independent-adoption-audit.json`이다.
결과 HDF5 SHA는 `94a576bbfe1d5826235a6323e6d470163ed2e970c4fe6f65a86b2d65a3db7f8a`다.
전체 Debug/CTest와 정적2·동적2 원본의 새 종료 evidence는 아직 검토하지 않았다.
현재 상태는 [PRD](PRD.md)의 checklist를 따른다. 이 bounded modal PASS를 동적
시간수렴·전체 green·기능 완료로 확대하지 않으며 이전 consistent modal FAIL은
해당 질량 선택의 이력으로 보존한다. Reviewer는 코드·테스트·상위 계약을 수정하지 않았다.
### 2026-10-12 종료된 검증 근거의 보완
수정된 dense oracle를 포함한 새8 suites/38 C++ tests의 전체 PASS/native0를 확인했다.
Warped nodal mass·비균일 energy, full-row lumped pencil, one-free-DOF/구속 경계의
관성 반력, 독립 scalar/3DOF brick oscillator 시간수렴 및 HDF5 readback이 포함된다.
이 실행은 수정 전 focused binary의 부분 실패/중단을 새 결과와 분리한다.
별도 `python-focused.log`의 pytest137 PASS도 확인했다.
종료된 원본 comparison의 모든 보고 scalar에서 reference-only scale, near-zero,
row5%/RMS1%, exact-zero 분기와 최종 판정을 직접 재계산했다. U는 HDF5 source
node/frame 값에도 대조했으며 input/native record/binary/HDF5/원본 hash와
`lumped-reference` metadata를 확인했다. RF/S는 보고된 scalar 수치·identity/hash
감사이며 별도 stress/reaction recovery oracle를 새로 실행했다는 뜻은 아니다.
| 종료된 원본 | 실행 구성 | 확인한 families/scalars | 최대 상대 RMS |
| --- | --- | ---: | --- |
| hexa_linearstatic | MSVC x64 Debug | 3 / 15777; U/RF/S 모두 PASS | U `9.31789815437491e-9`, RF `7.309816326722838e-9`, S `3.42593423675143e-9` |
| hexa_nonlinearstatic | MSVC x64 Debug | 3 / 15777; U/RF/S 모두 PASS | U `2.169911561350721e-7`, RF `6.728092996221333e-6`, S `9.338899878251489e-6` |
| hexa_freq | MSVC x64 Debug | 10 / 10; Value 모두 PASS | `1.961049613524256e-5` |
| hexa_dynlinear | MSVC x64 Release, current production | 101 / 133926; U 모두 PASS | `3.618821318800423e-7` |
| hexa_dynnonlinear | MSVC x64 Release, current production | 101 / 133926; U 모두 PASS | `2.1555860391237846e-6` |
각 CLI native0를 확인했다. Dynamic release의 raw recorder에 보존된 folder label은
각각 `hexa_dynlinear-release`와 `hexa_dynnonlinear-release`다. Byte 동일 INP stem으로 논리 case를 연결한
`comparison-execution.json`의 raw-record hash와 실제 command를 대조했으며 원시
기록을 수정하거나 다른 입력으로 치환하지 않았다. Debug와 Release 검증을 혼합해
전체 Debug 통과로 표시하지 않는다.
Bounded 감사 native0·finding0 자료는
`.dryforge/lumped-mass-adoption-20261011/independent-closed-evidence.json`이다.
필수 원본5개의 외부 비교는 위 구성에서 모두 PASS이며 새 전체 Debug/CTest는
실행 중으로 최종 검토 대기다. 이 두 Release 동적 비교를 Debug 원본 통과로 표시하지 않는다.
기존 `execute.py` 중단 native−1과 serial 직접 전체789 CTest의 진행 상태를 구분한다.
현재 전체 green·시간/물리 검증 완료·기능 완료 판정은 하지 않는다.
후속 serial 전체 실행에서 기존 Shell C08a 시간수렴 test의 current lumped FAIL을
확인했다. Assertion 구성5개는 baseline과 같으나 실제 metric은 변했다. Finest
회전 가속도 error `5.6747291267426469e-4`와 두 raw order 약1.02838/1.02946은
기존 기준 미달이며 N7 noise 분리도 미충족이다. 상세 대조는
[HHT 독립 검토](../hht-implicit-dynamics/implementation-numerical-review.md)의
2026-10-12 current C08a 절을 따른다. 이는 Hex8 원본5개의 bounded 외부 비교 PASS와
구분하며 전체 회귀 green으로 승격하지 않는다. C08b 및 전체 종료는 아직 대기다.
Current shell C08b도 종료됐으며 **FAIL**이다. h=1/64·1/128 완료 뒤 세 번째
h=1/256 grid에서 principal rotation 입력 gate의 runtime 예외로 중단했다.
5 grids를 완료한 뒤 accuracy assertion이 실패했던 baseline과 다른 결과다.
실패 Newton trial의 근본 원인은 추가 진단이 필요하며, 이것을 외부 U PASS나
Hex8 physical mass/invariant 검사로 닫지 않는다. 종료 body/source 경로와 별도의
unused manufactured force-rate 병진 oracle 오류는
[HHT 독립 검토](../hht-implicit-dynamics/implementation-numerical-review.md)의
2026-10-12 current C08b 절을 따른다. 전체789 CTest의 종료 판정은 여전히 대기다.
후속 HHT-LM-NR-002 병진 force-rate oracle 오류는 두 계수 수정과 private Debug
RED(native1)/GREEN(native0)·pointwise(native0) 근거로 닫혔다. 상세와 shared 전체
binary 재빌드 범위는 같은 HHT 독립 검토의 force-rate oracle 수정 절을 따른다.
C08b runtime finding과 C08a 시간정확도 실패를 해소한 결과는 아니다.
후속 private C08b trace는 h=1/256, increment56, Newton iteration3,
t=0.21875에서 internal node4의 finite total rotation norm
`3.8630136368942867 rad>pi`를 직접 확인했다. 따라서 immediate principal-chart
이탈은 확정됐으나 큰 Newton trial의 근본 원인은 미확정이다. 상세 identity와
evidence 경계는 HHT 독립 검토의 C08b private trace 절을 따른다. 해당 finding은
OPEN이며 source/tolerance 변경이나 추가 실행으로 전체 PASS를 주장하지 않았다.
### 2026-10-12 전체 실행에서 추가 발견한 두 stale fixture
Active serial 전체 로그에서 앞의 shell C08a/C08b 외에 test93
`RejectsOverflowingOriginalPencilValidationScale`와 test238
`SolidBindingPreservesThreeComponentsAndReferenceMass`의 FAIL을 확인했다.
따라서 현재 확인한 실패는4개이며 앞의 두 shell 실패만으로 전체 결과를 요약할 수
없다. 전체 실행은 아직 종료하지 않았고 최종 native/집계는 대기다. 기존38-case
focused filter에는 이 두 cases가 없었으므로 당시 PASS는 해당 coverage가 아니다.
**HEX-LM-NR-001 — source corrected, focused execution pending: overflow fixture.**
E=3e306, rho=2, axis half-lengths=(1,2,3), nu=.25에서 새 `M_L=12*I24`다.
독립 tensor-polynomial K 적분과 normalized dense eigensolution으로
`||K||F/E=9.235553192303684`, `||K||inf/E=9.755555555555556`,
`max|Kij|/E=1.4037037037037037`, `lambda_max/E=0.6304620575193911`을 얻었다.
`||M||F=58.78775382679627`이므로 최대 mode의 validation matrix scale은
`46.29900142688912*E`다. 기존3e306은 이 scale도 finite여서 성공 반환이
production guard 오류라는 근거가 없다. Consistent 당시 all-odd Walsh mode의
overflow 가정은 채택된 lumped fixture에서 유지되지 않는다.
| 독립 산술량 | E=3e306 | 제안·수정한 E=4e306 |
| --- | ---: | ---: |
| 최대 local K entry | `4.211111111111111e306` | `5.6148148148148146e306` |
| lambda_max | `1.8913861725581735e306` | `2.5218482300775645e306` |
| `||K||F` | `2.770665957691105e307` | `3.6942212769214736e307` |
| `lambda_max*||M||F` | `1.111903447037563e308` | `1.4825379293834174e308` |
| 위 두 scale의 FP64 합 | `1.3889700428066735e308`, finite | nonfinite |
| `||K||inf/(4/9)` | `6.585000000000001e307` | `8.780000000000002e307`, finite |
Matrix-scale overflow의 경계는 E 약`3.882790296678553e306`이며 raw enclosure
division의 경계 약`8.189945944703032e306`와 분리된다. 기존 mass roundoff guard의
작은 차감은 후보4e306의 enclosure 여유를 뒤집지 않는다. 따라서 E만4e306으로
바꾸면 local K·lambda·enclosure를 finite로 유지하면서 기존 original-pencil
nonfinite-scale gate를 실제 자극한다. 이는 현재 연산 순서의 intermediate
matrix-scale overflow 검사이며 물리 eigenvalue 자체가 무한이라는 주장이 아니다.
Owner가 E 한 값과 highest-mode 주석을 수정했다. 실제 candidate FEAST/guard 실행은
아직 확인하지 않았고 diagnostic code·기존`1e-10`·finite gate를 바꾸지 않는다.
**HEX-LM-NR-002 — source corrected, focused execution pending: factory oracle.**
단위 cube·rho2의 full-row lumping은24 diagonals 각각0.25, offdiagonals exact0,
한 병진방향 total mass2다. 실행 body의 `M(0,3)=0`은 이 계약과 일치한다.
기존 test의 consistent `2/54` 기대가 잔존했다. Owner는 diagonal 기존 absolute
`1e-15`, total 기존`1e-13`을 유지하고 모든 offdiagonal을 exact0로 검사하도록
수정했다. 비교 기준을 완화한 수정이 아니다. Factory 생성·source identity/DOF
검사와 zero linear response도 보존된다.
닫힌 두 실패 body와 독립 산술/source hash 자료는
`.dryforge/lumped-mass-adoption-20261011/independent-hex8-stale-fixture-review.json`이다.
현재 공유 전체 binary에는 후속 test-only 수정이 반영되지 않았다. 종료 뒤 rebuild와
focused 실행 전까지 이 두 findings의 실행 폐쇄를 주장하지 않는다. Required Hex8
원본5개의 bounded 외부 PASS와 새 전체 회귀 FAIL/진행 상태를 구분한다.
### 2026-10-12 최종 종료 로그와 fixture 폐쇄
전체 serial MSVC x64 Debug CTest가 자연 종료했다. 원시789개 결과를 직접 재집계하고
summary/native/hash에 대조하여 **784 PASS / 4 FAIL / 1 SKIP, native8**을 확인했다.
Elapsed는9131.26초다. FAIL은 shell C08a, shell C08b, 위 overflow fixture,
factory fixture이며 SKIP은 `C04aFinestReductionComparisonIsNumericallyResolved`다.
이로써 전체 실행 대기는 종료된 **FAIL**로 갱신된다. 원래4개의 실패 body와
skip을 삭제하거나 후속 성공으로 소급 변경하지 않는다.
**HEX-LM-NR-001 및 HEX-LM-NR-002 — CLOSED.** 공유 binary의 최종 rebuild native0
이후 configured CTest에서 E=4e306 original-pencil nonfinite guard와 updated
factory full24 diagonal/offdiagonal 검사2개가 모두 PASS/native0다.
`final-stale-fixtures.log` 및 native 기록으로 실제 configured 실행을 확인했다.
새 HHT force-rate derivative와 기존 pointwise oracle2개도 별도 configured
CTest에서 PASS/native0다. 이 후속4개는 이전 shared binary의 전체789 실행과
구분한다. 최종 discovery790을 확인했지만 **전체790은 재실행하지 않았다.**
전체 전후 production190 files와 original reference16 files의 동일 inventory/hash를
대조하고 현재 파일도 전부 재해시했다. 최종 unit binary SHA는
`4e39c8992a527366e66ea295bf4598a068ca44456fc32c1ab973d2376759c11a`이며 actual
파일과 manifest가 일치한다. `final-oracle-identities.json`의 force-only note는
실제3개 test TU 변경을 모두 기술하지 못한다. 원시 note를 변경하지 않고 별도
`final-test-identities.json`이 누락을 명시 정정했으며3개 source·record hash도
독립 확인했다. Production·원본·tolerance/gate 변경을 후속 test 수정에 섞지 않았다.
닫힌 전체/focused/identity 감사는
`.dryforge/lumped-mass-adoption-20261011/independent-final-regression-review.json`이다.
Hex8의 두 stale fixture findings는 폐쇄됐지만 HHT C08a 정확도/noise 문제와
C08b principal-chart Newton failure는 **OPEN**이다. Final focused4 PASS를
전체 green이나 shell 시간정확도 해결로 확대하지 않는다. Reviewer는 추가
build/test·source 수정 없이 읽기 전용 감사와 보고서 정적 검토만 수행했다.