eaa5cbeb21
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.
177 lines
12 KiB
Markdown
177 lines
12 KiB
Markdown
# 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)은 이번 변경으로 채택되지 않았다.
|