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.
275 lines
19 KiB
Markdown
275 lines
19 KiB
Markdown
# 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를 새로 통과시킨 작업이 아니다.
|