# Shell HHT 회전 실패의 원인 조사와 해결 후보 이 문서는 production 정책 변경 전의 원인 조사·private 후보 실험 기록이다. 후속 사용자 요청으로 채택한 실제 시작 정책은 [HHT-ADR-013](ADR.md)과 [Newton 시작점 구현·검증](newton-start-policy.md)을 따른다. 아래의 당시 미채택/미실행 상태와 후보 결과를 현재 production 검증으로 승계하지 않는다. 2026-10-12 사용자 요청에 따른 C08b 신규 runtime 실패 조사다. 공유 production 코드·tests· 빌드 산출물·reference·허용값은 변경하지 않았다. 원래 알고리즘의 실패와 별도 후보의 private 실행을 구분한다. 완료 checklist는 [PRD](PRD.md), 현재 채택 정책은 [HHT-ADR-010·012](ADR.md)을 따른다. ## 조사 결론 실패의 직접 기전은 **직전 수용 좌표를 Newton 시작값으로 쓸 때 생기는 큰 관성 잔차와 moving drilling null의 결합이, 정상적인 drilling 조건의 미분을 거의 상쇄하는 것**이다. 처음부터 약한 null 접선에서 큰 회전 보정이 발생하고, 뒤의 Newton trial이 principal 회전 범위를 벗어난다. 확인한 상태·방향에서는 질량/관성 항등식·접선 미분·선형 solve와 time-history indexing에 명확한 구현 오류를 발견하지 못했다. 이 결론을 모든 상태의 kernel correctness 또는 다른 모델의 안정성 보장으로 확대하지 않는다. 기존 방식의 실패 증분을 동일한 직전 수용 state에서 재현했다. 유효한 predictor 시작과 명시적 drilling 잔차의 정확 Newton 후보는 모두3회 correction 후 기존 raw endpoint· constraint·equilibrium 기준을 통과했다. 후보의 접선도 같은 state의 N5 차분 검사를 통과했다. 전체 시간구간 후보 실행과 물리 평가의 닫힌 결과는 아래 별도 절에 기록한다. ## 모델·실패·저장 상태 대상은 `HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`의 all-free plate다. 2×2 shell 요소·9절점·54자유도, 두께0.2, E=1000, ν=0.3, ρ=1, time period0.25이며 단위는 입력의 일관 단위다. 초기 강체 속도에 작은 변형 운동을 더하고 외력은0이다. 전체5개 grid의 self-convergence와 물리 불변량을 검사하는 내부 시험이며 CLI의 zero-initial-condition 지원 범위를 확대하지 않는다. 현재 shared CTest는 h=1/64·1/128만 완료했고 h=1/256의 증분56·t=0.21875·Newton 반복 index3에서 source node5의 trial 회전 크기3.8630136369 rad로 실패했다. 현재 gate는 `π−sqrt(epsilon_double)`보다 작은 total rotation-vector norm을 요구한다. 이 좌표는 accepted physical frame이 아니다. 기존 consistent C08b는5개 grid를 모두 끝낸 뒤 정확도 assertion에서 실패했으므로 같은 baseline 실패로 분류하지 않는다. 이번 private capture는 증분50–56의 valid Newton trial39개에 q/v/a/A, 직전 accepted state·predictor, M·Kint·Keff·drilling metric, analytic null, 잔차·보정량을 저장했다. 처음 큰 보정이 발생한 위치는 증분56의 **반복0**이며 반복2만의 문제가 아니다. | 증분56의 trial | 최대 회전 norm | 다음 보정의 최대 성분 | | --- | ---: | ---: | | 반복0: 직전 accepted 좌표로 시작 | 0.235649251 | 2.009074231 | | 반복1 | 1.946567141 | 2.843068141 | | 반복2 | 1.064939407 | 2.695998257 | | 반복3: 평가 실패 | 3.863013637 | 생성되지 않음 | 단위는 rad다. 반복0 보정의 scaled 2-norm 분해는 null2.124294782, physical0.016846220이며 null 비중은99.9969%다. Physical/null 분해는 analytic nodal null을 정규화해 수행했고, 작은 singular value를 잘라 null을 선정하지 않았다. ## 접선이 약해지는 수식과 실제 수치 기존 [관성 정식화](formulation-inertia.md)의 endpoint 방정식을 `E=I+g`, `g=f_int−F`, `I=M(q)a+c(q,v)`라 한다. Analytic admissible null N은 `NᵀI≡0`이며 drilling 대수 조건은 `ψ=Nᵀg=0`이다. Frozen old state·predictor로 v(q), a(q)를 포함해 미분하면 다음 항등식이 성립한다. \[ N^T K_{eff}=D\psi-(DN)^T E. \] `Dψ`가 정상이어도 미수렴 상태의 `−(DN)ᵀE`가 이를 상쇄할 수 있다. Root에서 E=0인 regularity 검사와 Newton 중간 trial의 접선 regularity는 다른 검사다. q_trial=q_n이면 `q_n−q_p=O(h)`이므로 HHT가 계산하는 시험 가속도는 일반적으로 O(1/h)까지 커질 수 있다. 이는 accepted acceleration의 발산을 뜻하지 않는다. | 증분56·반복0의 중심 절점 null 방향 | 값 | | --- | ---: | | 대수 조건의 방향 미분 `Dψ N` | 0.02259938760 | | 잔차 connection `(DNᵀE)N` | 0.02319413434 | | 위 connection의 관성 기여 | 0.02319333592 | | Raw null 접선 `NᵀKeff N` | −0.00059474674 | | 물리 방향을 소거한 중심 null Schur 성분 | −0.00000714209 | Scaled 전체 접선의 2-norm condition number는7.3416e9, physical complement는 약1101이다. 가장 약한 right singular vector의 null 투영 norm은0.9999983이다. 이 condition number는 진단값이며 승인된 local reciprocal infinity-condition gate의 대체 기준이 아니다. 대수 조건 자체의 정규화 condition number는 약1이므로, drilling stiffness 자체가 사라진 상황으로 설명하지 않는다. 증분50부터56까지 중심 Schur 성분은0.00252514→0.00209997→0.00167950→0.00126253→ 0.000843952→0.000420078→−0.00000714209로 연속 감소·부호 교차한다. 단발적인 선형 solve 오류보다 off-root moving-null 접선의 약화에 부합하는 관측이다. ## 다른 원인 가설의 독립 대조 - 저장된 모든 predictor와 v/a/A를 독립 재계산한 차이는 exact0이다. Old state, increment/time과 trial-rate 연결의 오류를 확인한 범위에서는 발견하지 못했다. - `MN`과 `NᵀI` 항등식, 별도 Exp32/Jl32 complex-step null 미분과 위 null-row 항등식을 직접 대조했다. 전체 null-row identity의 최대 차이는5.33e−14 이하이다. - 첫 큰 보정의 선형 backward error는1.64e−16이며 독립 dense solve의 보정 상대차는 6.17e−11이다. 큰 보정은 별도 선형 해법에서도 재현된다. 작은 backward error만으로 해의 forward accuracy를 인증한 것은 아니다. - 실패 직전 반복2와 첫 보정의 반복0에서 잔차·접선을 독립 차분했다. 추가 N5 검사는 raw E와 후보 ψ residual 각각에 correction·center-null·mixed 방향을 사용했고, scaled 2-norm=1 및 s=2^−j, j=8,10,…,20을 적용했다. 두 residual의 모든3방향에서 j10…18 중 연속 두 점의 승인 nonzero ratio≤1e−6을 만족했다. Center-null의 j10 오차는약1.09e−5로 FAIL이며 j12 이후 연속 PASS인 truncation 경향을 보존했다. - Exact-zero action, u-only 방향, 다른 trial/mesh·부분 BC·D3의 새 전체 검증은 포함하지 않는다. 이 scoped 미분 결과로 모든 kernel 오류 가능성을 제거했다고 주장하지 않는다. ## 해결 후보의 비교 모든 후보는 같은 lumped kinetic physics·HHT 계수·fixed h·Newton100·principal chart·최종 raw E/correction·constraint/equilibrium 기준을 사용한다. 차이는 승인 전의 Newton 시작값 또는 residual 정책이며 production 수정이 아니다. | 동일 old state에서 증분56 실행 | 첫 접선 cond2 | 첫 최대 correction | 결과 | | --- | ---: | ---: | --- | | 기존 q_n 시작/raw E Newton | 7.3416e9 | 2.00907423 | principal chart 이탈, native1 | | Predictor 시작/raw E Newton | 9.0077e6 | 1.97023e−5 | correction3회 후 endpoint 통과, native0 | | q_n 시작/명시적 ψ 정확 Newton | 8.9319e6 | 0.00552035 | correction3회 후 endpoint 통과, native0 | 성공한 두 후보의 endpoint 최대 차이는 q4.17e−17, v2.13e−14, a1.04e−11, A9.90e−12다. 새 임의 tolerance로 같은 해를 선언하지 않으며 관측된 차이를 그대로 보고한다. ### 후보1: 유효한 predictor를 Newton 시작값으로 사용 시간적분 식과 raw Newton 방정식을 유지하고 시작 좌표만 q_p로 둔다. 실패 trial의 큰 관성 잔차를 피하는 최소 변경 후보다. 다만 기존 원본 DIRECT h=.1에서는 predictor가 허용 geometry/chart 밖으로 나갔던 것이 [ADR-010](ADR.md)의 채택 이유다. 모든 입력에 predictor를 강제하는 변경은 권고하지 않는다. Predictor 유효성을 확인하고 부적합한 경우 시작값을 어떻게 선택할지 명시적으로 정해야 한다. 현재 지원 모델의 geometry·부분 BC·실패 보존·원본과 회귀 검증이 필요하다. ### 후보2: 물리 좌표 방정식과 drilling 대수 조건을 정확 Newton으로 풀기 All-free 평판 연구에서는 P로 ux/uy/uz/φx/φy equation을 선택하고 남은9개 equation을 ψ=Nᵀg로 바꾼다. \[ \mathcal F=\begin{bmatrix}PE\\\psi\end{bmatrix},\qquad \mathcal J=\begin{bmatrix}PK_{eff}\\(DN)^Tg+N^TK_{int}\end{bmatrix}. \] 현재 |n_z|가0에서 충분히 떨어져 있어 `[P;Nᵀ]`가 가역이면 `F=0⇔E=0`이다. Prototype의 지원 경계는 모든 절점 |n_z|≥0.5인 all-free 평판이며, 이0.5는 현재 솔버에 채택된 regularity/tolerance 기준이 아니다. 이 경계 밖에서는 후보 실행을 거부한다. 단순 row scaling이 아니라 residual의 정확 미분이므로 off-root Newton 경로가 바뀐다. Drilling inertia·가상 torque·물리 damping을 추가하지 않으며 최종 수용은 원래 raw E로 검사한다. 독립 dense 재구성으로 candidate matrix의 sparsity 누락0과 null 미분을 확인했다. 항상 φz를 drilling 좌표로 정하는 방식은 일반 유한회전 mesh에 적용할 수 없다. 실제 free 공간과 mass-null의 교집합·가역적인 equation 선택·constant rank·moving-null 미분·sparse pattern union을 정의해야 한다. 현재 prototype은 이 일반화를 검증하지 않는다. ## 전체 시간구간의 후보 실험 각 후보를 같은 초기 state에서 t=0…0.25 전체 구간에 실행했다. h=1/256은65개, h=1/512는129개 frame을 출력했고 두 후보 모두 chart 이탈 없이 끝났다. 모든 accepted frame에서 기존 raw E/correction·constraint/equilibrium 검사를 유지했다. Standalone main의 EXPECT assertion은 자동으로 native failure를 만들지 않으므로 완료 마커, frame 이력·stdout assertion 실패·stderr를 별도로 확인한다. | h | 후보 | 최대 accepted 회전 | 에너지 결함 | 병진 운동량 결함 | 각운동량 결함 | | --- | --- | ---: | ---: | ---: | ---: | | 1/256 | predictor | 0.273895229 | 1.61260792e−5 | 1.77e−14 | 6.87805734e−6 | | 1/256 | 명시적 ψ | 0.273895229 | 1.61260792e−5 | 2.32e−14 | 6.87805734e−6 | | 1/512 | predictor | 0.273914419 | 4.02172472e−6 | 2.85e−14 | 1.71965922e−6 | | 1/512 | 명시적 ψ | 0.273914419 | 4.02172472e−6 | 3.33e−14 | 1.71965922e−6 | 회전 단위는 rad이며 나머지는 기존 RunPlate가 산출한 normalized defect다. 에너지와 각운동량 결함은 약1/4로 감소했다. 두 grid만으로 기존 다섯 grid self-convergence나 noise-separation·최종 finest 기준을 통과했다고 판정하지 않는다. Raw V/A의 hidden defect는 nonzero이며 같은 endpoint를 찾는 Newton 변경으로 시간 scheme이 개선되었다고 해석하지 않는다. 독립 수치 검토는 네 이력의 연속 increment/time·finite/chart·raw N2 잔차와 HHT update를 확인했다. 모든 noninitial frame은3회 correction 후 수용됐고 stdout에 assertion 실패가 없었다. 같은 h에서 두 후보의 전체 이력 최대 차이는256에서 q3.14e−15/v2.59e−12/a1.01e−8/A9.09e−9,512에서 q8.41e−15/v5.23e−12/a4.47e−8/A4.03e−8이다. 이를 새 tolerance로 판정하지 않는다. 독립 물리 검토는 nodal mass/inertia와 별도 exponential 미분으로 T/P/L과 rates를 재계산했다. 총 질량0.8, 초기 T0=0.29818583333333337이며 저장 T의 최대 차이는 1.67e−16 이하이다. 전체 네 이력의 N6 force/spatial-moment balance는 각각 7.25e−12/2.64e−11 이하로 기존1e−8 기준 이내다. Independent momentum ledger도 일치했다. Uphys/Udrill은 저장값을 사용했으므로 독립 stress/strain recovery와 전체 power ledger까지 검증했다고 주장하지 않는다. P drift는 roundoff 수준이라 단조 감소를 인증하지 않는다. 독립 공통시점 대조에서도 h=1/256과1/512의 회전 가속도 차이는 남는다. 기간 T=0.25로 T²를 곱한 최대 norm에서 fine analytic null 투영은0.00371322, physical complement는 0.84104115다. 별도 exponential 미분으로 계산한 director acceleration 차이도0.83973943이다. 이는 두 grid의 진단값이며 새 accuracy tolerance나 차수 판정이 아니다. 다만 큰 rate 차이가 drilling null에만 있다는 설명과 null 성분만 복구하면 충분하다는 제안은 이 관측으로 지지되지 않는다. Physical rotational dynamics의 시간 해상도·history 오차까지 분리해서 조사해야 한다. 추가 elastic-scale 진단은 analytic null을 정적으로 소거한 `Kc=Kpp−Kpn Knn⁻¹Knp`, `Mc=PᵀMP`의 일반화 고유값을 계산했다. 두 grid 각각의 trial56에서 최대 양의 √λ는약311.3/time이며 ωh는1.216/0.608, 가장 빠른 순간 탄성 주기당 증분은약5.17/10.33개다. 두 grid의 trial56은 각각 t=0.21875/0.109375로 서로 다른 시점이다. 관성 convective/moving-null/HHT 항을 제외한 미평형 Kint의 진단이므로 평형 고유진동수나 stability/accuracy 인증이 아니다. 음의 λ도 최대 크기 약0.64와 roundoff 규모 값들을 그대로 보존했다. 이 관측은 physical rate의 시간 해상도를 확인할 필요성을 뒷받침하지만 accuracy 실패의 단독 원인을 확정하지 않는다. 원 wrapper의 네 실행 native.json은 ExitCode를 null로 저장한 기록 결함이 있다. 256의 native code는 미확보로 남긴다. 512는 종료 전에 process handle을 확보한 별도 observer로 두 실제 native0을 기록했다(`grids/*-512/observer-native.json`). 결과·완료 로그·독립 frame 검사와 native 기록의 범위를 구별한다. ## 기존 시간정확도 실패와 구분 현재 lumped C08a는 모든 grid를 끝냈지만 finest h=1/256의 회전 좌표 가속도 최대 오차5.6747291e−4가 기준1e−4를 초과했다. 마지막 raw log2 오차비1.02838·1.02946은 요구1.8보다 작다. 동시에 회전 rate의100배 noise-separation도 충족하지 못해 N7 시간 정확도 판정은 INCONCLUSIVE다. 이 raw 숫자를 인증된1차 수렴이라고 해석하지 않는다. [실제 전체 회귀 기록](../hex8-structural-analysis/lumped-mass-adoption.md)에 실패 predicate와 실행 범위를 유지한다. 새 chart 실패를 해결해도 C08a 가속도 정확도나 이전 C08b self-convergence가 자동으로 해결되지 않는다. 두 후보는 같은 endpoint root와 기존 HHT history를 유지하므로, 같은 branch의 충분히 수렴한 해에서는 시간적분 오차를 고치는 방법이 아니다. 기존 NR-009의 regular mass-null cubic 반례를 Decimal80으로 새로 재현했다. `M=diag(1,0)`, `U=(z−x³)²/2`, exact x=t,z=t³에서 endpoint 좌표는 exact인데 전체 시점 최대 가속도 오차는1차다. A0만 바꾸는 두 후보도1차를 유지한다. 이는 roundoff/Newton과 별개의 acceleration-history 문제를 보이는 제한된 반례이며 현재 shell C08a의 raw 차수를 인증하거나 남은 physical-complement 오차를 설명하는 증거로 확대하지 않는다. 가속도 복구 후보는 [ADR-011](ADR.md)과 [별도 정식화](formulation-acceleration-recovery.md)의 검증·채택 경계를 유지한다. ## 권고하는 해결 순서 단기 수정의 우선 후보는 **유효성이 확인된 predictor 시작**이다. Raw E·Keff와 시간적분·최종 gate를 유지할 수 있고 이번 실패 state에서 큰 관성 잔차를 피했다. 그러나 기존 원본의 predictor-invalid 이력을 함께 해결해야 한다. Predictor를 시험하고 geometry/chart가 부적합할 때 q_n을 쓰는 정책은 제안이며 아직 채택하지 않았다. 이 선택으로 모든 q_n 시작 실패까지 예방된다고 주장하지 않는다. 실제 원본·부분 BC· invalid predictor에서 accepted state 보존 검사를 먼저 확보해야 한다. 보다 일반적인 Newton 개선은 **admissible drilling 대수 잔차의 정확 미분**이다. 이 방법은 이번 접선 상쇄 항을 직접 피하며 q_n 시작에서도 수렴했다. 일반화할 때는 mass-null과 free 공간의 교집합, 가역 row 선택과 sparse union을 정의해야 한다. 현재 φz-row prototype을 production에 그대로 옮기는 것은 권고하지 않는다. 두 후보 모두 ADR-010 변경을 명시하고 기존 gate로 검증한 뒤 채택할 수 있다. C08a/이전 C08b의 시간 정확도는 이 Newton 정책과 별도로 해결한다. Raw a/A history와 독립 hidden-constraint/physical-complement 오차·noise를 분리하고, ADR-011의 복구 후보를 전체 시점·초기층·회전 null·에너지/운동량·공식 결과 의미까지 검증한다. A0 변경만으로 해결한다거나 Newton 후보 성공을 N7 통과로 대체하지 않는다. ## 실행 근거와 채택 경계 새 evidence root는 `.dryforge/hht-c08b-investigation-20261012/`다. `trial-*.json`은 valid trial capture, `independent-review/review.json`은 complex-step/null/Schur 대조, `replay/*/native.json`과 `independent-review/replay-review.json`은 동일 state 실험, `n5/*/native.json`과 `independent-review/n5-review.json`은 승인된 scoped 미분 검사다. 전체 후보 실행은 `grids/*/frames.jsonl`·`result.json`·로그, 독립 수치 검토는 `independent-review/final-grid-review.json`·`.md`, 독립 물리 검토는 `physics-review.json`·`.md`에 기록했다. 수치/물리 검토자는 별도로 수행했으며 생산 코드와 계약은 읽기 전용이었다. 순간 elastic-scale 진단은 `independent-review/instantaneous-spectrum.json`에 보존했다. 처음 capture wrapper는 native stderr를 PowerShell terminating error로 처리해 마지막 native record를 생성하지 못했다. 저장된39개 trial과 wrapper exit1은 보존하며 별도 replay raw 실행의 closed native1·stderr가 같은 실패를 재현했다. 이후 wrapper는 process ExitCode·stdout/stderr를 별도로 기록한다. 처음 wrapper를 완전한 native 기록으로 소급 표시하지 않는다. 고정된 공유 Debug solver library SHA256은 `b7fa77f02578d2c51c166447af7866784a3bf53a623e0b2fc246055720706a7c`다. 현재 CTest의 C08b finding과 FEM-REQ-HEX8-024 완료 blocker는 열린 상태다. 후보 채택은 Newton 정책과의 충돌을 명시해 결정해야 하며, 선택 후 관련 행동 검사· 부분 BC·결정론·rollback·필수 원본·구성된 전체 MSVC Debug 회귀를 수행한다. 이 조사는 공유 production build/CTest를 새로 통과시킨 작업이 아니다.