# 고유치·HHT lumped mass 채택과 재검증 2026-10-11 사용자가 고유치와 HHT의 질량을 lumped mass로 승인했다. [HEX8-ADR-010](ADR.md)과 [HHT-ADR-012](../hht-implicit-dynamics/ADR.md)의 변경본 evidence다. 기존 consistent 구현의 통과·실패와 private 비교 연구를 현재 검증으로 승계하지 않는다. 현재 checklist는 각 기능 PRD에 유지한다. ## 계산과 결과 계약 - MITC4 고유치의 기존 nodal block lumped mass는 유지한다. - MITC4 HHT는 `rho*N_i*dV0`의 절점 운동에너지에서 질량·관성력·convective 항· 관성 접선·운동에너지·선형/각운동량과 시간 미분을 함께 계산한다. 회전 block을 scalar diagonal로 치환하지 않는다. Geometry·moving drilling null·physical20 SPD/rcond 검사와 HHT 계수·초기화·허용값을 유지한다. - Hex8은 기존 8점 적분의 전체 24×24 reference consistent matrix를 만든 뒤 각 행의 합을 대각에 배치한다. 이후 BC를 축소한다. Warped 요소의 절점 질량은 `rho*V/8`로 치환하지 않는다. 선형/비선형 HHT와 고유치가 같은 질량을 사용한다. - HDF5의 mass metadata는 Shell `nodal-lumped-kinetic`, Hex8 `lumped-reference`다. 기존 consistent metadata는 현재 비교기가 거부한다. Schema layout·dtype와 공개 입력 옵션은 유지한다. 원본 reference와 tolerance를 변경하지 않았다. ## 변경본 검사 Evidence는 `.dryforge/lumped-mass-adoption-20261011/`에 보존한다. Git HEAD만으로는 아직 커밋하지 않은 변경본을 식별할 수 없으므로 실제 binary·입력·결과 hash도 기록한다. | 검사 | 현재 결과 | | --- | --- | | MSVC x64 Debug 빌드 | native0; 새 production kernel·절차·writer와 unit/integration/reference executable 연결 | | 새 질량 관련 focused C++ | 38/38 PASS, native0 (`new-kernels.log`·`new-kernels-native.json`) | | HHT/Hex8 Python 비교기 | 137 PASS (`python-focused.log`) | | 독립 수치 검토 | 수식·조건 검사·BC 전 lumping·독립 oracle 검토 완료; 닫힌 실행 evidence와 남은 범위는 각 numerical report 참조 | | 전체 Debug CTest | 789개 제외 없이 자연 종료, native8: 784 PASS·4 FAIL·1 SKIP (`full-direct-summary.json`) | | 마지막 테스트 수정 후 Debug 재빌드·focused 검사 | build native0, discovery790. 외력 미분/pointwise 2 PASS 및 factory/overflow 2 PASS, 각각 CTest native0 | Focused 검사는 Shell의 analytic mass·eigen 초기 질량 대조·warped nodal moments·Jensen· moving null·scaled 관성 partial/effective tangent sweep와 omission mutation, Hex8의 affine/ warped 독립 절점 질량·BC 전 행합의 dense eigen oracle·관성 반력·독립 SDOF/MDOF 2차 U/V/A 수렴, 공식 HDF5 readback을 포함한다. 이 통과는 C08의 시간 정확도를 대신하지 않는다. 초기 `focused-kernels.log` 실행은 독립 dense oracle가 constrained 열을 먼저 제거한 오류를 검출했다. 전체 24 DOF 질량을 먼저 구성하도록 수정한 뒤 새 38개 검사를 통과했다. 이전 partial 실행 로그와 중단 이유는 `focused-interrupted.json`에 보존했다. `python scripts/execute.py`는 현재 Debug preset으로 호출했다. 기존 전체 CTest의 16839초 기록이 runner의 1800초 deadline을 초과하며, 개별 테스트가 같은 임시 경로를 공유하므로 CTest 병렬 실행은 선택하지 않았다. 부분 실행을 보존하고 직접 `ctest --preset windows-msvc-ninja-debug --output-on-failure`로 제외 없이 직렬 실행한다. 이 실행은 `MKL_NUM_THREADS=1`, `OMP_NUM_THREADS=1`, `CTEST_PARALLEL_LEVEL=1`이며 수식·gate·허용값을 변경하지 않는다. 실행 중단을 수치 실패나 PASS로 보고하지 않는다. 새 C08a는 731.27초 후 FAIL로 종료했다. Finest `h=1/256`의 회전 좌표 가속도 최대 오차는 `5.6747291e-4`로 `1e-4`를 초과하고 마지막 두 오차 비의 raw log2 값은 `1.02838`, `1.02946`으로 요구 `1.8`보다 작다. 회전 속도/가속도의 100배 noise-separation도 충족하지 못했다. Noise-separation 미달로 해당 rate의 N7 시간 정확도는 INCONCLUSIVE이며 raw 차수를 인증된 차수로 해석하지 않는다. 기존 consistent C08a와 실패 predicate는 같지만 새 질량의 수치가 달라졌으므로 metric body 동일성을 주장하지 않는다. 새 C08b는 438.18초 후 `h=1/256`에서 `invalid-dynamic-rotation` 예외로 종료했다. 완료한 `h=1/64,1/128`의 energy/L drift는 감소했지만, 나머지 세 grid와 마지막 두 refinement의 self-difference·finest 기준은 생성되지 않았다. 기존 consistent C08b는 다섯 grid를 완료한 뒤 정확도 기준에서 실패했으므로 이번 예외를 같은 baseline 실패로 취급하지 않는다. 별도 Debug probe는 `h=1/256`, 증분56, Newton 반복3, `t=0.21875`에서 node index4의 유한한 회전 좌표 `(0.64127523,-1.19777570,3.61620987)`가 principal chart를 벗어났음을 확인했다. 자료는 `c08b-diagnostic/run.log`·`run-native.json`에 있다. 이 실행 당시 큰 Newton trial의 근본 원인은 미확정이었다. 후속 [2026-10-12 원인 조사](../hht-implicit-dynamics/newton-rotation-investigation.md)는 off-root moving-null 접선 상쇄와 두 private 해결 후보를 확인했다. 공식 C08b와 완료 blocker는 열린 상태이며 gate 완화나 coordinate clamp로 숨기지 않는다. 독립 검토에서 verification-only `RigidForceRates`의 사용되지 않던 병진 미분에 consistent 계수 `0.2/3`이 남아 있음을 발견했다. 이를 nodal mass `0.2`로 수정하고, 독립 volume force의 5-point 시간차분과 모든 24 rows를 대조하는 검사를 추가했다. 별도 Debug probe의 변경 전 RED는 병진 오류를 검출했고, 변경 후 미분 검사와 기존 pointwise force/power/momentum 검사 각각 PASS였다(`force-rate-oracle/`). 이 변경은 전체 CTest binary에 포함되지 않았으며, 종료 후 재빌드한 공식 Debug binary에서 관련 두 검사를 다시 통과했다(`final-oracle-rebuild/ctest.log`). 전체 로그를 집계하면서 추가 두 FAIL을 발견했다. Factory의 기존 consistent off-diagonal 기대값을 nodal diagonal `0.25`와 off-diagonal zero 검사로 수정했다. Overflow fixture의 `E=3e306`은 새 mass에서 validation scale이 finite이므로, 독립 계산에 따라 local K·λ· spectral enclosure는 finite이면서 `||K||F+|λ|*||M||F`만 overflow하는 `E=4e306`으로 바꿨다. Production guard·tolerance는 유지했고 두 검사 모두 공식 Debug focused CTest에서 통과했다(`final-stale-fixtures.log`·`final-stale-fixtures-native.json`). 원문 전체 실행의 네 FAIL을 두 FAIL로 덮어쓰거나, 마지막 discovery790개를 전체 재실행했다고 주장하지 않는다. 전체 실행은 9131.26초 후 자연 종료했다. 마지막 세 test source의 수정 전후 production 190개 파일과 필수 원본16개 hash는 동일하다. 원본 두 동해석의 Debug 101 endpoints도 각각 PASS였다. 남은 미해결은 C08a 정확도·C08b Newton trial과 기존 C04a SKIP이며 전체 green 또는 HHT 기능 완료를 선언하지 않는다. 최종 test source 세 개·Debug binary·닫힌 로그의 hash와 후속 검사의 구분은 `final-test-identities.json`에 보존한다. 초기 helper identity record의 force-only 설명에 빠진 두 Hex8 test 수정을 별도 annotation으로 정정하고 원문 record는 유지했다. ## 원본 비교 각 원본 INP를 byte-identical 복사한 별도 경로에서 실제 CLI를 실행했다. Hex8 정적· 고유치는 Debug, 긴 원본 동해석은 같은 production 소스의 Release다. 전체 Debug 회귀와 reference 실행 구성을 구분한다. Private kernel override는 사용하지 않는다. | 모델 | CLI / 비교 결과 | | --- | --- | | Hex8 frequency | Debug native0 / 원본 10 Value 모두 PASS. 최대 상대차 `0.0019610496%` | | Hex8 linear static | Debug native0 / U·RF·8점 S PASS | | Hex8 nonlinear static | Debug native0 / U·RF·8점 S PASS | | Hex8 linear dynamic | Release native0 / 전체 101-frame U PASS | | Hex8 nonlinear dynamic | Release native0 / 전체 101-frame U PASS | | MITC4 HHT | Release native0 / 전체 101-frame U PASS, UR 경고 200건 | 원본 고유치의 기존 consistent mass 불일치는 새 production 실행에서 해소됐다. 원본 Value의 단위/quantity·모드 identity·행5%/RMS1% 정책은 그대로다. 독립으로 mean-volume K와 nodal mass를 조립한 공개 10개 모드의 residual은 최대 `1.16e-17`, mass Gram 오차는 `1.33e-15`이며 고정 모드 성분은 exact0이다. [물리 검토](physics-evaluation.md)는 이러한 제한된 확인과 잔여 범위를 구분한다. 다섯 Hex8 원본과 Shell 원본의 닫힌 실행 증거·HDF observable·외부 비교 metric/hash를 독립 감사했다(finding0). 자료는 `independent-closed-evidence.json`이며 실제 energy· force/moment·반력·운동량 ledger는 두 기능의 `lumped-mass-physics-details.json`에 둔다. Release 동해석으로 대체한 중복 Debug 원본 실행은 의도적으로 중단했다. 각 `interrupted.json` 및 raw native record를 보존하며 완료한 원본 비교로 세지 않는다. Release recorder의 folder label이 case에 들어간 경우 원본 record를 보존하고 실제 입력 stem에서 logical identity를 명시적으로 유도한 `comparison-execution.json`을 별도로 사용했다. Shell 원본은 변위 비교를 확인하는 coarse 시간간격의 모델이다. U 일치로 물리 가속도의 시간 정확도·에너지 보존·C08 완료를 추론하지 않는다. 기존 C08 실패와 잔여 지원 범위는 [HHT PRD](../hht-implicit-dynamics/PRD.md)와 [물리 검토](../hht-implicit-dynamics/physics-evaluation.md)에 유지한다. ## 최종 검토와 인계 2026-10-12 `hht_mass_probe_review`의 읽기 전용 최종 diff 검토에서 새 actionable 코드 finding은 없었다. Hex8 frequency/HHT는 full element M을 계산한 뒤 BC를 partition하고, 같은 assembled M을 high+low 관성 작용·endpoint 반력·운동에너지·선형/각운동량·effective tangent에 전달한다. Shell eigen의 기존 lumped 경로와 HHT의 새 nodal kinetic 경로, 두 요소의 writer/self-check/comparator mass metadata 연결도 일치한다. Test-only 세 파일은 승인된 질량 oracle와 기존 nonfinite gate를 검증한다. 이 검토에서는 실행 근거를 재사용했고 build/test를 추가 실행하지 않았다. 아래 P1 판단과 인계는 초기 lumped 변경본의 실패 당시 기록이다. 후속 사용자 승인으로 [HHT-ADR-013 초기 Newton 정책](../hht-implicit-dynamics/newton-start-policy.md)을 적용했고 공식 C08b 5개 grid 모두 T=.25까지 회전 예외 없이 완료해 해당 runtime finding을 닫았다. 기존 시간 정확도·P 감소 실패는 유지하며 변경본 전체802 Debug 회귀는 native8:799 PASS·2 FAIL·1 SKIP으로 자연 종료했다. 원본 Hex8 선형/비선형 HHT의 101-frame smoke도 PASS다. 이 후속 결과를 아래 과거789개의 통과로 소급하지 않는다. **당시 완료 판정의 P1 blocker는 C08b의 새 runtime 실패였다.** [FEM-REQ-HEX8-024](PRD.md#fem-req-hex8-024--회귀완료-판정)는 신규/영향 검사 PASS와 신규 physics 오류0을 요구한다. 과거 C08b는 모든 grid를 완료한 뒤 정확도 기준에서 실패했고 현행 결과는 principal chart 예외이므로 동일 baseline 예외로 분류할 수 없다. Hex8 원본5개·독립 수치/물리 검토·최종 diff 검토 완료와 기능 검증 완료를 구분한다. 후속 owner는 다음 자료와 경계를 인계받는다. - 실제 실패 검사는 `HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`다. 전체 raw는 `.dryforge/lumped-mass-adoption-20261011/full-direct.log`와 `full-direct-summary.json`, 별도 계측은 같은 폴더의 `c08b-diagnostic/run.log`에 있다. Probe의 증분56·반복3·node index4는 source node label5이며 회전 norm은 약 `3.86301>π`다. - 다음 조사에서는 직전 accepted state와 predictor, correction, effective tangent 및 drilling regularity를 함께 확인해 큰 Newton trial의 원인을 분리한다. Positive physical20 mass나 원본 U 일치만으로 이 갱신의 안정성을 추론하지 않는다. - 기존 gate·100회 full Newton·fixed schedule·물리 질량을 유지해 구현 오류를 조사한다. 시간 적분·회전 chart·수용 기준 변경이 필요하면 정식화와 독립 검토, 필요한 사용자 결정이 선행되어야 한다. 좌표 clamp나 tolerance 완화로 결과를 통과시키지 않는다. - 수정 후 관련 검사·필수 비교·전체 Debug 회귀를 수행하고 C08a와 C04a도 별도 판정한다. 현행 전체789개와 후속 focused4개를 합쳐 최종790개 전체 PASS로 보고하지 않는다. 현재 완료 checklist는 [Hex8 PRD](PRD.md#현재-checklist) 한 곳에 둔다.