# Shell HHT Newton 시작점 선택 2026-10-12 사용자 요청에 따라 [HHT-ADR-013](ADR.md)의 시작 정책을 구현했다. 현행 acceptance와 checklist는 [PRD](PRD.md), 기준은 [numerical-controls](numerical-controls.md)다. [이전 조사](newton-rotation-investigation.md)의 private 후보와 이번 production 검증을 구분한다. ## 목적과 원인 C08b의 q_n 단독 시작은 h=1/256, 증분56에서 off-root 관성 잔차와 moving-null 미분이 drilling 접선을 거의 상쇄하고 큰 null correction을 만들어 principal chart를 벗어났다. 첫 실패의 수용 회전 크기는 약0.27 rad였지만 Newton trial은 약3.86 rad였다. 확인한 state의 history·관성 항등식·접선·선형 solve는 독립 대조와 일치했다. 이 수치는 이전 실패 조사 evidence이며 변경본의 현재 metric으로 사용하지 않는다. Predictor q_p는 이런 시작 잔차를 줄일 수 있지만, 큰 DIRECT 증분의 외삽이 유효한 geometry/chart 안에서도 endpoint에서 너무 멀 수 있다. q_p 단독 정책으로 기존 LargeDirectStepStartsFromAcceptedGeometry를 실행했을 때 초기 병진 잔차가 약4.60e19이고 Newton 반복4 뒤 geometry 오류가 발생했다. Geometry validity만으로 시작점을 고르면 기존 지원 모델을 보존할 수 없었다. ## 구현 방법 각 increment에서 predictor q_p/v_p와 old physical a_n을 한 번 만들고 고정한다. 어떤 시작 좌표 q를 선택해도 기존 관계를 사용한다: ```text A(q) = (q - q_p) / (beta h^2) a(q) = (A(q) + alpha a_n) / (1 + alpha) v(q) = v_p + gamma h A(q) E(q) = M(q) a(q) + c(q,v(q)) + f_int(q) - F r_free(q) = (D^T E(q))_free, D = diag_i(ell I3, I3) ``` ell은 활성 요소의 초기 최대 edge 길이다. 병진 force×ell과 회전 torque는 모두 energy 단위다. 반력/constrained row는 선택 norm에서 제외한다. 후보마다 달라지는 상대 잔차 분모를 사용하지 않는다. 선택은 전역 좌표 벡터 두 개 사이에서 이루어지며 절점마다 서로 다른 후보를 섞지 않는다. 1. q_p의 rates·full residual·정확한 effective tangent를 평가한다. 2. genuine predictor geometry/director/principal-chart 실패이면 동일 frozen predictor에서 q_n을 평가한다. 그 외 오류는 전달한다. q_n 평가의 오류도 전달한다. 3. q_p가 유효하고 q_p=q_n이면 중복 평가를 생략한다. 4. 두 좌표가 다르면 q_n도 평가한다. 둘 다 유효하면 `||r_free||inf`가 작은 쪽을 선택하며 exact tie는 q_p다. 비교 norm의 overflow도 실패다. 5. 선택한 assembly와 같은 q/v/a/A를 iteration0에서 그대로 사용한다. 이후에는 기존 full Newton correction을 그대로 적용하고 원래 모든 gate로 수용한다. 이는 초기값 선택이다. q_n을 선택해도 predictor를 q_n으로 덮어쓰지 않으며, 수용한 old state나 history를 변경하지 않는다. 100 correction 제한·고정 DIRECT h· principal margin·질량 영공간·정확한 관성 미분·잔차/증가량/선형 solve 기준을 보존한다. Newton correction 뒤 chart/geometry 실패는 즉시 종료한다. Line search·clamp·cutback· rechart·임의 drilling mass 또는 ψ로 원 잔차를 대체하는 구현은 추가하지 않았다. ## 실패 분류와 시행착오 유효한 geometry의 nonfinite strain/stress가 geometry diagnostic에 포함돼 있던 private point evaluator를 `valid / invalid geometry / nonfinite recovery`로 나눴다. 기존 `invalid-nonlinear-shell-recovery`로 산술 실패를 전달하며 strain/stress 수식은 유지한다. `invalid-dynamic-rotation`은 chart 밖의 좌표와 valid-chart rate overflow를 함께 나타낸다. Independent review에서 전체 절점을 scan하면 뒤 절점의 chart 위반이 앞 절점의 rate 오류를 숨길 수 있음을 발견했다. 기존 실제 평가와 같은 순서·같은 후보 rates로 첫 실패 절점을 식별하고 그 절점의 principal predicate만 확인하도록 수정했다. 혼합 절점 검사는 수정 전 wrong diagnostic으로 FAIL, 수정 후 PASS였다. ## 현재 실행 evidence Scratch 실행 기록은 `.dryforge/hht-predictor-newton-20261012/`에 있으며 원본 입력을 변경하지 않는다. Task 시작의 dirty source/test를 before snapshot으로 보존해 이전 lumped-mass 변경과 이번 diff를 구분했다. | 범위 | 결과 | | --- | --- | | 실제 Debug build | native0 | | 초기값 선택 11개·기존 large DIRECT·대수·비선형 복구·HDF5 관련 focused 검사 | 37/37 PASS, CTest native0 | | 혼합 절점 오류 | RED native8 → GREEN; 기존 오류 code 전달 확인 | | 독립 수치 source/행동 검토 | bounded PASS, 발견한 mixed-node 분류 결함 CLOSED | | h=1/256 기존 실패 자유 plate runtime 회귀 | 65 frames·T=.25 완료, actual configured PASS (310.27초); 전체802 실행 안의 결과 | | 실제 C08b 전체5 grid | 모두T=.25 완료·회전 예외 없음; test2466.24초 FAIL은 시간 정확도/차수·P 감소 기준 | | 실제 C08a | 654.68초 FAIL: angular-a 정확도·finest noise 분리 미달 유지 | | 제외 없는 전체802 Debug CTest | 자연 종료11384.61초·native8:799 PASS·2 FAIL·1 SKIP; 두 C08 정확도 실패와 기존 C04a SKIP, 추가 예외0 | | Current-source Release 원본101-frame U/UR 비교 | CLI/comparator native0, U101 families PASS·UR 경고200; 전체441774 scalars finite/identity precheck PASS | | 독립 current-reference 물리 대조 | T relative4.34e-15, inertial power6.88e-16, force/moment balance1.13e-15/2.20e-16; BC exact0·energy 정의 대조 일치 | 첫 전체 실행은 독립 검토 finding의 source 수정 전에 중단했다. Native−1의 partial 실행을 전체 회귀 또는 PASS로 사용하지 않는다. 수정본 전체 실행은 별도 기록이다. ## 현재 C08b 결과와 남은 정확도 문제 Production helper를 사용하는 실제 C08b에서 5개 grid가 모두 T=.25까지 계산됐다. 출력된 최대 회전은 약 `.27384..27395 rad`이고 principal-chart 예외는 없다. 새 h=1/256 runtime 전용 회귀도65 frames를 완료했다. 이는 조사한 runtime 결함의 폐쇄 근거이며 C08b 테스트 전체의 PASS가 아니다. | h | Energy 상대 결함 | P 상대 결함 | L 상대 결함 | | --- | ---: | ---: | ---: | | 1/64 | 2.50654e-4 | 1.78188e-15 | 1.07274e-4 | | 1/128 | 6.41550e-5 | 5.54677e-15 | 2.73848e-5 | | 1/256 | 1.61261e-5 | 1.76759e-14 | 6.87806e-6 | | 1/512 | 4.02172e-6 | 2.84555e-14 | 1.71966e-6 | | 1/1024 | 1.00065e-6 | 8.03575e-14 | 4.30176e-7 | E/L의 마지막 비율은 약 `.24881/.25015`로 기존 감소/finest 기준 이내다. P의 절대 크기는 roundoff 수준이지만 마지막 감소 조건은 FAIL이며 면제하지 않는다. Hidden v/a 결함의 finest 값은 약 `1.17632e-6/1.36947e-3`이다. 이는 기존 진단량이며 N2 수용 tolerance에 임의 대입하지 않는다. Finest 공통시점 self-difference의 q_u/q_phi/v_u/v_phi/a_u/a_phi는 `(4.29914e-6,1.10373e-4,8.79298e-5,.00721911,.00437504,.47489732)`다. q_phi/v_phi/a_u/a_phi는 finest1e-4 기준을 넘고, q_phi/v_u/v_phi/a_u/a_phi의 일부 마지막 차수도1.8 미만이다. **현재 C08b의 기존 noise separation 검사는 통과했으나 정확도와 self-convergence 요구는 FAIL**이다. C08a의 noise INCONCLUSIVE와 구별한다. Null-only 회복 진단의 physical angular-a 차이는 약 `.474897322`, null은 `.00184377`로 physical complement가 여전히 지배한다. 회복한 a를 history/output에 채택하지 않았다. Raw current 블록은 scratch `c08b-closed.log`, 재집계는 `c08b-current-metrics.json`이다. C08a 변경본의 finest 전체 최대 angular-a 오차는 약5.67473e-4로1e-4를 넘는다. 출력된 raw 마지막 차수는 약1.02838/1.02946이지만 finest v_phi/a_phi의 N7 noise 분리가 미달이므로 1차 수렴을 인증하지 않는다. 정확도 FAIL과 order INCONCLUSIVE를 구별한다. Scratch `c08a-closed.log`와 `c08a-current-metrics.json`은 현재 실행이며 이전 consistent/lumped 조사 결과를 승계한 수치가 아니다. ## 실행 구성과 원본 비교의 경계 실제 configured 명령은 `cmake --build --preset windows-msvc-ninja-debug`와 `ctest --preset windows-msvc-ninja-debug --output-on-failure`다. Thread 설정은 MKL/OMP=1, CTest serial이다. `python scripts/execute.py`도 실행했으나 설정된 1800초 deadline에 native1 timeout으로 종료했다. 이후 같은 preset의 전체802개를 제외 없이 직접 실행해11384.61초 뒤 native8로 자연 종료했다. 802개 이름은 discovery와 정확히 일치하며799 PASS·2 FAIL·1 SKIP이다. Timeout이나 부분 실행을 전체 통과로 계산하지 않는다. 실제 CTest native는 `final-full-direct.native.json`의8이며 외부 PowerShell 후속 스크립트의 exit1과 구분한다. 실행기·preset·수치 기준은 변경하지 않았다. 전체 예외는 C08a/C08b의 시간 정확도·P 감소 판정과 C04a finest-resolution SKIP뿐이다. 과거 consistent 구현의 실패 metric과 동일하다고 주장하지 않는다. 새 runtime 회귀· 전체 C08b grid·기존 large DIRECT·원본 Hex8 선형/비선형101-frame smoke 및 관련 결과 lifecycle 검사는 PASS다. 독립 수치·물리 검토는 이 범위와 남은 정확도 실패를 구분한다. `closed-full-summary.json`과 `closed-identities.json`에는 실제 완료 목록, native·원문 SHA256 및 검증 시작 대비 production190·원본16·task6·binary4의 hash 동일성을 기록했다. 기존 사용자 변경과 원본 reference는 보존했다. 최종 독립 수치·물리 감사가 실제802개 목록·집계·native·identity를 재대조해 일치함을 확인했으며 새 actionable source blocker는 발견하지 못했다. 문서 정적 검토는 로컬 참조523개 누락0·`git diff --check` native0다. 이 판정은 C08 정확도 또는 원본 energy 시간 응답의 적정성을 승인하지 않는다. 원본은 scratch byte copy에서 같은 production source의 MSVC x64 Release CLI로 재생성했다. 원 INP SHA256은 `b8922243ca8ddfe20b1dd39f3123207f789a1a75f6b10dbb6b0bc0b5a40dfff5`, CSV는 `422ecf17609e14fd119d60a3d5af7a0d1bc4a95e0f556608a7d791e2718c56c5`로 보존됐다. CLI SHA256은 `49ce7cb58929fed92f564b99e85eed1ece835dd369d8f46eb483ce8eb96255a7`, 결과 HDF5는 `e57cd58eb45af04f16b36c32a38d63a469fb0ead281238a72af721859d1fad21`다. U 최대 frame relative RMS는 `.0022824245023`로 원 기준 `.01` 이내다. UR 최대 RMS는 `.0253460487859`이며 row/RMS 경고200건을 보존한다. 새 결과의 전체101×729 states에서 독립 nodal kinetic measure로 T·관성 power· Pdot/Ldot와 support force/spatial moment·현재 arm을 대조했다. Full E 정의는 exact0, 104개 고정 절점의 q/v/a/A와 free reaction은 exact0이며 shell 복구량은 finite다. 이는 원본이 제공하지 않는 양에 대한 제한된 물리 대조이고 temporal accuracy는 아니다. 원본은 최대 회전 약1.25636e-5 rad여서 큰 회전 검증을 대신하지 않는다. Energy defect 범위는 `[-1.39861876,+62.73624080]` [force·length]이고 양의 peak는 t=1이다. 독립 energy 정의 차이는 약9.24e-14이므로 저장 오류로 설명되지 않으며, coarse DIRECT의 에너지 시간 응답 적정성은 미검증이다. 이 값으로 새 conservation gate를 만들거나 physical damping으로 해석하지 않는다. Raw current 결과·비교·독립 물리 기록은 scratch `reference/`와 `physics-reference.{py,json}`, `physics-review.md`에 있다. ## 사용과 후속 개발 한계 CLI/입력 옵션·결과 schema는 그대로다. Supported shell HHT DIRECT에서 자동으로 초기값을 선택하므로 별도 설정은 필요하지 않다. 작은 초기 잔차는 null regularity 또는 Newton 수렴을 보장하지 않는다. Component infinity norm의 순위는 전역 좌표축 회전에 불변이 아니며 C11 전체 covariance/결정론 coverage를 대체하지 않는다. 이전 두-grid 후보에서는 runtime이 완료돼도 physical angular acceleration 차이가 컸다. 이번 시작 정책은 physical a의 복구나 DAE 시간 정확도를 변경하지 않는다. C08/N7의 기존 정확도 요구와 noise 판정을 유지하며 runtime 개선과 시간 정확도 해결을 구별한다. 가속도 복구 후보 [HHT-ADR-011](ADR.md)은 이번 변경으로 채택되지 않았다.