test: capture HHT shell convergence failures and recovery probes

This commit is contained in:
KOKO\Mimi
2026-09-27 00:14:42 +09:00
parent 219473e410
commit c8f6619b63
10 changed files with 1891 additions and 36 deletions
+9
View File
@@ -88,3 +88,12 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen
- 결정: 모든 increment의 Newton 초기 좌표를 `q_n`으로 둔다. Constant-A 외삽은 지정 DIRECT h=.1에서 최초 trial geometry를 무효화했으므로 N2의 시작값을 명시적으로 갱신한다. HHT predictor/rate/접선, alpha/beta/gamma, 고정 dt, Newton100 및 모든 tolerance는 유지한다. 유효한 시작점에서 나온 correction도 chart/geometry 밖이면 즉시 실패하며 retry·clamp·cutback은 없다.
- 추가 수정: 초기 형상에서 차감한 큰 covariant metric 대신 `delta g`로 Green strain과 `F=I+delta g⊗Gdual`을 계산한다. 수학적으로 같은 식이며 영변형에서 생긴 artificial drilling force를 제거한다. 강성·정적 결과 영향은 기존 regression으로 확인한다.
- 검증: decimal 좌표 영변형 exact-zero 회귀, finite/warped scalar drilling constraint·gradient·Hessian, 작은각 D3 threshold 검사가 통과했다. 상세 실행/물리 acceptance는 최종 implementation evidence에서 구분한다.
## HHT-ADR-011 — 정확도 요구를 유지한 가속도 복구 후보 검토
- 상태: `accepted-for-formulation-and-verification`; 후보 채택과 production/schema 변경은 미승인.
- Owner: 메인 assistant; formulation-agent 정식화, numerical-review-agent 독립 검토.
- 승인 근거: 2026-09-26 사용자가 “정확도 요구 유지: 제약조건에 맞는 가속도 복구를 별도로 정식화·검증한 뒤 채택 여부 결정”을 선택했다.
- 결정: 기존 C08/N7 정확도 요구와 실패 기록을 유지한다. 적분 history의 `a_h`와 별도 제약 가속도 `a_rec=a_h+N*eta`를 구분하는 후보를 정식화하고 독립 검증한다. `a_rec`를 다음 증분 history에 조용히 대입하지 않는다.
- 근거: [독립 구현 검토 NR-009–010](implementation-numerical-review.md)의 Decimal80 반례와 실제 C08 실패. 초기 `A0`만 수정하는 방법은 일반적인 전체 시간 가속도 2차 정확도를 회복하지 못한다.
- 영향: 현 공개 출력 의미·영속 schema·지원 범위·허용값은 유지한다. 후보의 hidden2 만족만으로 실제 shell의 2차 정확도를 주장하지 않는다. C08b 회전 좌표/속도 차이와 physical acceleration 오차는 별도로 해결해야 하며 채택은 검증 결과를 제시한 뒤 결정한다.
@@ -36,5 +36,8 @@
| [numerical-review.md](numerical-review.md), [numerical-review-probes.md](numerical-review-probes.md) | numerical-review-agent | 정식화와 수치 계약의 독립 검토·반례·재현 가능한 수식 검산 |
| [numerical-controls.md](numerical-controls.md), [verification-cases.md](verification-cases.md) | numerical-review-agent | 내부 수치 기준과 반증 가능한 검증 사례 |
| [reference-model.md](reference-model.md) | 메인 assistant; numerical-review-agent 검토 | 원본 inventory·시간·identity·수치 비교 계약; I/O binding은 후속 |
| [implementation-numerical-review.md](implementation-numerical-review.md) | numerical-review-agent | 구현 독립 검토·C08 실패 반례·복구 후보 검토 |
| [physics-evaluation.md](physics-evaluation.md) | physics-evaluation-agent | 실제 HDF5·독립 적분·reference와 물리 coverage 평가 |
| [formulation-acceleration-recovery.md](formulation-acceleration-recovery.md) | formulation-agent | HHT-ADR-011의 별도 가속도 복구 후보; 채택 전 정식화·불변식·한계 |
담당자는 할당 문서만 수정하고 peer를 재위임하지 않는다. 현재 I/O·구현·solver 물리 검증을 수행하며 빈 보고서는 생성하지 않는다. 수식 검산은 solver build/test나 지정 reference의 동적 해석 통과 evidence와 구별한다.
+8 -3
View File
@@ -2,7 +2,7 @@
- Feature ID: `hht-implicit-dynamics`
- 기준: `dev` commit `23b37ca644563b51472654af3b22811f077f15f6`
- 문서 상태: `io-contract-defined; implementation-in-progress; physics-pending`, 2026-09-22
- 문서 상태: `implementation-present; C08-failed; recovery-candidate-under-review`, 2026-09-26
- 기준 문서: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [공통 ADR](../ADR.md#adr-028).
## 사용자 요청과 범위
@@ -70,7 +70,7 @@ Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference
[내부 수치 기준 N1–N7](numerical-controls.md)은 변위·회전의 scale를 분리하고, 관성·내력·외력의 상쇄 전 크기로 endpoint 잔차를 판정한다. Newton 잔차와 correction/rate 판정은 각각 `1e-10`, 선형 solve backward error는 `1e-12`다. 해석적으로 정의한 질량 영공간과 양의 물리 질량을 구별하며, 국소 positive block·대수 regularity에는 scale된 `rcond_inf>=2^-32`를 요구한다. 이 값은 외부 reference tolerance의 변경이 아니다.
[검증 사례 C01–C12](verification-cases.md)는 oscillator·STEP 초기화·variable mass·moving null, 운동에너지 적분·관성 접선, 반력·에너지·실제 shell 유한회전, 실패 보존·결정론·전체 reference 이력을 포함한다. D3 회전 미분에는 독립 block-exponential oracle를 지정했다. 모든 신규 solver 사례는 **NOT RUN**이다.
[검증 사례 C01–C12](verification-cases.md)는 oscillator·STEP 초기화·variable mass·moving null, 운동에너지 적분·관성 접선, 반력·에너지·실제 shell 유한회전, 실패 보존·결정론·전체 reference 이력을 포함한다. D3 회전 미분에는 독립 block-exponential oracle를 지정했다. 문서 gate 당시 신규 solver 사례는 모두 NOT RUN이었다. 현재 실행 결과는 아래 checklist와 [독립 수치 검토](implementation-numerical-review.md), [물리 평가](physics-evaluation.md)에 구분한다.
추가 full Cartesian moving-null 수식 probe는 전체 시점 최대 오차에서 q/v/물리적 a의 최종 refinement 차수 `1.99985/1.99992/1.99834`를 보였고 독립 reviewer가 재현했다. 이는 기하학적 normalization이나 각도 축약 없이 계산한 제한된 수식 evidence다. 전체 N1–N7 구현 검사와 실제 shell·reference 통과를 의미하지 않는다. 자세한 실행 범위는 [수식 검산](numerical-review-probes.md)에 기록한다.
@@ -88,7 +88,12 @@ Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference
- [x] 추가 수치 근거 조사와 full Cartesian moving-null 독립 검산·재현.
- [x] Numerical Review의 내부 기준·검증 사례·reference 수치 비교 계약 검토 완료.
- [x] I/O 계약과 실제 field/schema binding 정의·정식화 대조.
- [ ] HDF5 구현과 readback 검증.
- [x] HDF5 구현과 readback 검증: state/writer focused Debug suite와 원본 101-frame 비교 실행 완료. 후속 발견된 굽힘 단면력 복구 오류의 수정 후 HDF5 재검증은 별도 항목이다.
- [x] 지정 reference U 101 families PASS, UR row/RMS 경고 200건 기록. Reference 성공은 C08/physics 통과가 아니다.
- [ ] C08a/C08b 시간수렴 실패 해결: [독립 검토](implementation-numerical-review.md), [물리 검토](physics-evaluation.md). 현 알고리즘과 tolerance를 유지한 실패 재현 완료.
- [ ] HHT-ADR-011에 따른 가속도 복구 후보 정식화·독립 검증 후 채택 여부 결정.
- [x] 굽힘 단면력의 두께 계수 수정: 최신 Debug 관련 14 tests PASS, 원본 HDF5 재생성·비교 및 `M=t³Cκ/12` 독립 대조 완료. 전체 회귀 상태는 아래 항목과 구분한다.
- [ ] C09–C11 잔여 coverage: rigid translation 전체 이력, Newton100/101·실패 보존, 3회 결정론·partition·전체 모델 covariance.
- [ ] Solver 구현·구성된 build/test·독립 물리 및 reference 검증.
문서 gate의 완료와 solver 기능의 완료를 구별한다. 현재 구현 단계에서는 내부 수치 검증, solver build/test 및 지정 reference 해석·비교를 실행한다. 통과 여부와 physics 평가는 실제 evidence로 갱신한다.
@@ -0,0 +1,142 @@
# 제약 일관 가속도 복구 후보
- 상태: `candidate-for-independent-review; not-adopted`, 2026-09-26.
- Owner: `formulation-agent`. 할당 범위는 이 문서이며 source·시험·상위 계약은 변경하지 않는다.
- 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [공통 ADR](../ADR.md#adr-028), [Feature PRD](PRD.md), [시간적분](formulation.md), [관성 상세](formulation-inertia.md).
- 발견 근거: [구현 수치 검토 NR-009 이후](implementation-numerical-review.md), [C08](verification-cases.md), [N1–N7](numerical-controls.md).
## 1. 제안과 변경 경계
사용자는 기존 정확도 요구를 유지하고 **채택 전에 별도의 constraint-consistent acceleration recovery를 정식화·검증**하는 경로를 선택했다. 후보는 수렴한 endpoint의 `q,v`와 시간적분 이력 `a_h,A`를 그대로 두고 현재 질량 영공간에서만 가속도를 보정한다. 여기서 `a_h`는 기존 정식화에서 `a`라 부른 endpoint 평형/이력 변수다. 이름 구분은 후보를 설명하기 위한 것이며 현행 API·HDF5 의미 변경은 아니다.
\[
a_{rec}=a_h+N\eta,\qquad (\psi_qN)\eta=-r_2(q,v,a_h,t).
\]
이 식은 endpoint 평형을 보존하며 acceleration hidden constraint를 만족시키지만, q/v 정확도나 물리 질량 방향 가속도 오차를 고치지 않는다. C08a/b와 기존 NR-009 FAIL은 유지한다. 본 문서는 구현·공식 출력 채택·기능 통과의 승인이 아니다.
## 2. 적용 가정과 좌표
[관성 상세 §§1–4](formulation-inertia.md)의 유한회전 shell, consistent kinetic mass, 선형 탄성 및 기존 objective numerical drilling potential을 그대로 사용한다. DOF는 절점별 fixed-global `[u_x,u_y,u_z,phi_X,phi_Y,phi_Z]`, `v=dot q`, 좌표 가속도 단위는 병진 `length/time²`, 회전 `rad/time²`다. 외력 부호는 `E=Ma+c+f_int-F`. 새 재료 상태·감쇠·질량·공간 적분은 없다. 기존 scalar mass moments `3×3×3`, 내력/물리 에너지 `2×2×2` 및 drill 합을 보존한다.
이하 q/v/a와 미분은 고정 zero BC를 제거한 free 좌표에서 쓰며, 전체 좌표로 올릴 때 constrained 성분은 0이다. `N(q)`는 실제 admissible free 공간의 analytic mass-null basis로, `M_ff N=0` 및 **`N^T I_f=0`**를 만족한다. 후자는 shell의 `I=∫rho H^T(Ha+B_x[v,v])dV0`, `HN=0`에서 성립한다. 일반 singular mass만으로 `N^Tc=0`가 보장되는 것은 아니므로 velocity-dependent algebraic constraint를 가진 다른 DAE에 이 후보를 그대로 적용하지 않는다.
각 admissible nodal null은 `[0;J_l(phi)^(-1)d]`다. 현재 total rotation-vector chart, geometry 및 swing/twist 유효성과 일정 null rank, 양의 physical mass 및 bounded algebraic inverse가 전 구간에서 필요하다. Partial BC는 null과 free 공간의 **교집합**을 구한다. N의 constrained 성분을 단순 삭제하거나 작은 positive mass를 null로 재분류하지 않는다. Empty null에서는 `a_rec=a_h`; all-fixed 모델도 empty recovery로 처리한다.
이 문서의 N은 [N3/N4](numerical-controls.md)의 고정 scale `D=diag(ell I3,I3)`, `x=D^-1 q`, 연속 정규화 analytic basis Z와 **`N=D_f Z(x)`**로 대응한다. 따라서 `psi=N^T g_f=Z^T(D^Tg)_f`, `g=f_int-F`. 미분 시 basis도 현재 q의 함수로 미분한다. N은 시간 grid와 무관한 같은 정의·source 순서를 사용하며 eigen/SVD 부호 변경으로 선택하지 않는다.
## 3. 복구 방정식과 필요한 미분
정확한 연속 궤적의 대수조건과 첫 두 시간미분은
\[
\begin{aligned}
\psi(q,t)&=N(q)^Tg_f(q,t)=0,\\
r_1(q,v,t)&=\psi_qv+\psi_t=0,\\
r_2(q,v,a,t)&=\psi_q a+\psi_{qq}[v,v]+2\psi_{qt}v+\psi_{tt}=0.
\end{aligned}
\]
`C=psi_q`, `k=psi_qq[v,v]+2psi_qt v+psi_tt`, `G=C N`라 두면 후보 solve와 유일해는
\[
G\eta=-(C a_h+k),\qquad
a_{rec}=a_h-NG^{-1}(C a_h+k).
\]
`G^-1`는 수식 표기이며 행렬 역을 만들라는 지시가 아니다. G는 null 개수 차원의 선형 operator이고 대칭·양정성을 전제하지 않는다. 정해진 q/v/t에서 복구 residual은 `R_rec(eta)=G eta+r2_h`, tangent는 정확히 G다. 기존 endpoint Newton residual·Keff는 수정하지 않는다.
공개 constant force/고정 BC subset은 `t>0`와 `0+` 우측에서 **autonomous**하므로 `psi_t=psi_qt=psi_tt=0`. 반면 C08a와 explicit-time 제조해는 내부 시험 전용이다. q와 무관한 smooth `F(t)`에 대해
\[
\psi_t=-N^T\dot F_f,\quad
\psi_{qt}[p]=-DN[p]^T\dot F_f,\quad
\psi_{tt}=-N^T\ddot F_f.
\]
이는 공개 amplitude·시간변화 BC 지원을 추가하지 않는다. STEP jump 자체의 미분이나 impulse는 이 복구의 대상이 아니며 초기 우측 smooth branch를 사용한다.
미분 구현에 필요한 contraction은 다음과 같다. K는 현재 `D_q f_int`, F는 q-independent다.
\[
\begin{aligned}
\psi_q[p]&=DN[p]^Tg_f+N^T(Kp)_f,\\
\psi_{qq}[p,s]&=D^2N[p,s]^Tg_f
+DN[p]^T(Ks)_f+DN[s]^T(Kp)_f
+N^T(DK[s]p)_f.
\end{aligned}
\]
`N^Tg=0`이어도 `g=0`가 아니므로 DN/D²N 항을 삭제하지 않는다. Endpoint 접선만 보유한 것으로 `DK`까지 제공된다고 가정하지 않는다. 필요량은 전체 3차 tensor가 아니라 지정 방향 contraction이지만, 해석/정확 미분의 제공 가능성과 독립 derivative oracle는 후속 구현·검토의 미해결 항목이다. 공개 autonomous subset에서 physical energy와 병진 force의 null work가 항등적으로 0임을 사용하는 drill-only 표현은 별도 항등식 검증 후에만 동등식으로 사용할 수 있다. C08a에는 time-dependent generalized force가 있어 같은 단순화를 자동 적용할 수 없다.
## 4. 보존량과 달라지는 가속도
고정 q/v에서 `delta a=N eta`이므로 정확 산술에서
\[
\Delta I=M N\eta=0,\quad \Delta E=0,\quad
\Delta\ddot x=H N\eta=0.
\]
이는 **full residual과 support reaction**에도 적용한다. 선택한 질량은 positive Gram integral이므로 free null을 zero constrained 성분으로 올린 `bar N`에 대해 `bar N^T M bar N=0`이면 `H bar N=0`와 `M bar N=0`이다. `M_ff N=0`만 수치적으로 관찰하고 full constrained-row 불변성을 생략해서는 안 된다.
q/v가 같으므로 `T,U_phys,U_drill,W,P,L`도 같고, material point 가속도가 같으므로 `Pdot,Ldot`와 global force/moment balance도 같다. 따라서 energy drift나 C08b q/v/P/L 오차를 이 복구가 개선할 수 없다. 수치 계산에서는 큰 eta와 null-action 오차가 곱해져 잔차 차이를 만들 수 있으므로 전후 차이를 직접 검증한다.
절점별 `delta a_phi=J_l^-1 d lambda`라 쓰면
\[
\Delta\ddot d=B\Delta a_\phi=0,\qquad
\Delta\dot\omega=J_l\Delta a_\phi=d\lambda.
\]
즉 director acceleration과 물질점 acceleration은 보존되지만, **공간 angular acceleration의 axial spin 성분**과 chart acceleration은 변한다. `omega=J_l v_phi`는 그대로다. `omega_dot_rec=J_l a_rec,phi+DJ_l[v_phi]v_phi`를 계산할 수 있으나, hidden1이 남아 있는 이산 q/v와 완전히 일관된 연속 triad 궤적을 얻었다는 뜻은 아니다. Director-only 검증으로 full chart a 또는 spatial spin 정확도를 대체하지 않는다.
## 5. 이력·regularity·오차 전파의 경계
기존 적분은 반드시
\[
A_{n+1}=(1+\alpha)a_{h,n+1}-\alpha a_{h,n},\qquad A_0=a_{h,0},
\]
및 기존 q/v predictor를 유지한다. `a_rec`를 다음 old-a history나 A에 대입하면 다른 적분법이다. 이 후보는 초기 q/v/a_h/A를 다시 설정하지 않으며 초기 hidden2가 일관하면 exact arithmetic에서 초기 correction은 0이다. q/v/A/a_h의 전후 동일성은 전체 history로 확인해야 한다.
향후 채택한다면 integration acceleration과 recovered estimate의 의미를 구별하고, 같은 source/frame/q/v identity의 candidate로 평가·검증해야 한다. 현재 물리 a라는 명칭, 공개 quantity와 저장된 history의 의미에 영향이 있으므로 formulation/main/I/O owner의 후속 결정이 필요하다. 이 문서는 field·API·schema·저장 방식이나 recovery 실패의 새 공개 진단을 정하지 않는다. 실패한 recovery를 성공 frame으로 표시하거나 기존 state에 부분 반영하는 것은 허용하지 않는다.
Scaled form은 `b_rec=b_h+Z eta`, `G=psi_x Z`, `r2=psi_x b_h+psi_xx[w,w]+2psi_xt w+psi_tt`. N1의 finite-first/단위 scale, N4의 현재 algebraic stiffness scale W와 `W^-1 G W^-1` regularity를 그대로 대조한다. 새 tolerance, diagonal shift, epsilon mass, pseudoinverse 또는 clamp를 정하지 않는다. Solve residual과 보정된 hidden2의 uncancelled contraction scale, eta 및 `N eta` 크기, full equilibrium 전후 차이를 함께 기록한다. Hidden2의 post-recovery 수치 판정과 신규 error estimate의 최종 승인자는 numerical reviewer다.
`Q=I-NG^-1 C`이면 `QN=0`, `C Q=0`이고 `a_rec=Q a_h-NG^-1 k`다. 이는 C에 따른 oblique projection이며 최소 Euclidean correction이나 질량 norm 최소화라고 부르지 않는다. 동일 q/v의 null 오차는 제거하지만 물리 complement `P_N a_h`, `P_N=I-N(N^TN)^-1N^T`는 보존한다(혼합 단위 전체 비교는 scaled Z의 projector 사용).
q/v와 현재 null을 제외한 a_h가 정확해에 대해 O(h²), 초기값도 같은 정확도이고, G inverse 및 필요한 미분이 구간 전체에서 균일하게 bounded이면 위 smooth recovery map은 O(h²) 가속도 추정을 줄 수 있다. 이는 **조건부 오차 전달 설명**이며 현재 HHT DAE가 그 전제를 만족한다는 증명이 아니다. r1과 psi를 고치지 않으며 r2=0 하나는 정확도 증거가 아니다. N7의 기존 a_h cancellation/noise estimate가 a_rec의 완전한 오차 추정으로 자동 승계되지도 않는다. 후속 검토는 `delta eta=-G^-1(delta r2+delta G eta)`, `delta a_rec=delta a_h+delta N eta+N delta eta`에 기초해 derivative·basis·solve 오차까지 구별해야 한다.
Basis 표현에도 주의한다. `tilde psi=S(q,t)psi`에서 연속 2차 미분은 `S r2+2 dot S r1+ddot S psi`다. 따라서 정확 manifold와 hidden1에서 표현 독립성이 성립하지만 이산 r1이 비영이면 q-dependent basis 교체가 recovery를 바꿀 수 있다. N3/N4의 smooth normalized basis를 고정하고 그 미분을 포함한다. Constant invertible 재표현은 같은 correction을 주어야 하지만, arbitrary q-dependent normalization에 대한 exact invariance를 요구하지 않는다.
## 6. 독립 검토용 반증 사례
아래는 추가 검증 제안이며 [기존 C08/N7](verification-cases.md)의 grid·전체 시점·원 정확도 요구를 바꾸지 않는다. 기존 a_h와 후보 a_rec를 함께 보존하고 실패 결과를 대체하지 않는다.
| ID | 모델/조작 | 반드시 확인할 결과 |
| --- | --- | --- |
| AR-01 cubic DAE | NR-009의 무차원 `M=diag(1,0)`, `U=(z-x³)²/2`, `F=0`, `x=t,z=t³`, `v0=(1,0)`, `a0=A0=0`; 기존 5 grids와 계수 유지 | `N=(0,1)`, `C=(-3x²,1)`, `k=-6x vx²`, `G=1`; `a_rec,z=3x² a_h,x+6x vx²=6t` exact. q/v/a_h/A는 기존 recurrence와 동일, a_h 전체 최대의 1차 FAIL은 남고 a_rec는 exact branch. 고정밀 독립 계산으로 startup first/peak/late/final 모두 측정 |
| AR-02 explicit time | 시험 전용 `psi=z-sin(t)`, `M=diag(1,0)`, `U=z²/2`, `F_z=sin(t)`, `x=0` | `psi_tt=sin(t)`로 `a_rec,z=-sin(t)`. 명시 시간항을 누락하면 잘못된 0이 되어야 함. Mixed-time 항은 아래의 별도 추상 DAE로 검사 |
| AR-03 physical error | AR-01의 같은 q/v에 `a_h,x=epsilon≠0`를 의도적으로 삽입 | `a_rec,x=epsilon` 그대로, `a_rec,z=3x²epsilon+6xvx²`; r2=0이어도 physical error와 endpoint residual은 유지. 복구로 equilibrium 실패를 숨길 수 없음 |
| AR-04 q/v error | `psi=z-x²`, 현재 `x=1,z=1`, `vx=1+delta`, `a_h,x=0` | `a_rec,z=2(1+delta)²`이므로 vx 오차가 그대로 전파. 별도로 `psi=z`, `z=epsilon`, `vz=delta`이면 a_rec,z=0이어도 psi/r1 오류 유지 |
| AR-05 null/BC/basis | C05의 finite/warped/partial-BC fixture와 constant basis permutation·sign·scale, empty null, rank loss | admissible current N만 사용; constant basis 재표현 후 correction 동일. Fixed-global UR3 또는 truncated null mutation은 MN/BN/전후 평형 검사 실패. G singular/conditioning 실패를 보정으로 통과시키지 않음 |
| AR-06 derivative/보존 | 현 q±s p에서 basis·g를 모두 다시 평가하여 C/psi_qq contraction을 독립 고정밀/차분으로 대조 | DN/D²N/explicit-time mixed 항 누락 검출. Full I/E/reaction, xddot/ddot d/Pdot/Ldot, q/v 에너지 전후 보존 및 axial angular-a 변화의 해석식 확인. 기존 N5 sweep·N6 기준에 대조 |
| AR-07 C08a | 원 manufactured orbit, force oracle, 초기값, 모든 5 grids 유지; 정확한 Fdot/Fddot와 mixed terms 포함 | 기존 q/v/a_h와 후보 a_rec의 **full chart** 오차 및 null/physical 분해. 추가로 spatial omega_dot·director acceleration oracle. 각 quantity의 전체/first/peak node·time/late/final, N7 noise와 원 정확도 기준을 모두 보고 |
| AR-08 C08b | 원 free plate·초기화·T·모든 5 grids 유지 | nested 공통 시점의 q/v/a_h/a_rec full self difference와 null/physical 분해, grid-independent 초기값, 대표 frame residual/Keff. q/v/P/L/energy 결과 전후 동일. q/v FAIL 또는 physical-a FAIL이 남으면 recovery만으로 기존 acceptance 충족 불가 |
AR-02의 mixed-time 검사는 **derivative-mutation용 추상 DAE**다. `M=diag(1,0)`, 명시 시간의존 potential `U(q,t)=(z-t x)²/2`, `F=0`의 endpoint 식은 `x''-t(z-t x)=0`, `z-t x=0`이다. 초기 `q0=(0,0)`, `v0=(1,0)`, `a0=(0,2)`에서 정확해는 `x=t,z=t²`. 따라서 `psi=z-t x`, `psi_q=(-t,1)`, `psi_qt=(-1,0)`, `psi_qq=0`, `psi_tt=0`이고 `a_rec,z=t a_h,x+2vx=2`다. 이 모델은 §3의 **시간불변 내력과 q-independent F(t)**에 대한 외력 미분 특수식으로 계산하지 않고, 일반 r2 식에서 psi를 직접 미분한다. 공개 shell 또는 C08a force convention의 사례가 아니며 시간의존 potential 지원도 추가하지 않는다.
C08의 분해는 차이를 먼저 같은 fixed chart에서 구한 다음 **하나의 공통 projector**로 나눈다. C08a는 정확 q의 `Z_*`, C08b는 각 비교쌍의 fine state `Z_fine`을 기준으로 scaled difference `e`에 `e_N=ZZ^T e`, `e_P=(I-ZZ^T)e`를 적용한다. 이 선택과 node/time을 기록하고 각 해를 서로 다른 basis에 먼저 projection한 차이를 같은 양으로 취급하지 않는다. a_rec-a_h의 실제 correction이 current null인지 확인할 때는 해당 해 자체의 current Z를 쓴다. q 차이의 분해는 현 tangent 방향에 대한 진단이며 유한 회전 두 형상의 물리적 동일성 판정이 아니다.
현재 NR-009 로그에서 C08a finest angular-a 최대의 current-null 오차는 `5.58582318e-4`, complement는 `1.00582661e-4`다. 따라서 null 제거만으로 finest `1e-4` 통과를 예상할 수 없다. C08b finest rotational q/v/a self difference는 `1.38700902e-4 / 1.15434080e-2 / .868938812`이며 q/v는 후보로 바뀌지 않는다. 기존 로그 분해와 위 공통-projector 진단은 정의를 대조한 후 비교해야 한다.
## 7. 인계와 미해결 항목
- `startup_review`의 독립 검토: 식·basis 미분·full reaction 불변식·조건부 차수 논리·반례 및 recovery noise의 검증 가능성. 작성자의 식 유도를 수치 승인으로 취급하지 않는다.
- 구현 전 근거 공백: shell의 C/psi_qq contraction, C08a Fdot/Fddot 독립 oracle, finite/warped/partial-BC regularity와 derivative 오차 전파. 미확인 상태에서 finite difference 값을 production 계약으로 선택하지 않는다.
- 원 정확도 요구의 충족 여부: AR-01 성공은 C08a/b 성공을 뜻하지 않는다. C08b q/v 및 physical-a 원인과 기존 FAIL 해소는 별도 남은 과제다.
- 채택 여부와 state/output 의미는 검증 후 main·formulation·I/O owner가 결정안을 작성한다. 본 문서는 현행 계약·공개 subset·영속 schema를 변경하지 않는다.
실행 범위는 기존 문서·evidence 대조와 자체 수식 유도, 문서 링크/diff 정적 확인이다. 새 수식 probe, source 변경, build/test와 reference 실행은 하지 않았다. 위 AR 사례는 제안 상태이며 통과 evidence가 아니다.
@@ -47,3 +47,175 @@ Newmark의 q/v는 A를 사용하고 물리 a는 `(A+alpha*a_old)/(1+alpha)`로
C04a는 판정을 분리한다. 위 로그에서 finest binary64 full/reduced acceleration 차이 약 `3.079e-10`이 `1e-10`을 넘었지만 N7 해상도 약 `6.296e-10` 이하다. q/v/physical-a의 시간차수·오차/noise 검사와 coarse reduction은 별개다. N7에 따라 finest reduction은 **INCONCLUSIVE**로 남길 수 있으며 threshold를 바꾸지 않는다. [decimal80 독립 검산](../../.harness/build/hht-numerical/c04a-decimal-reduction.json)의 full 2×2/scalar recurrence 차이 `<=1.70e-73`은 수학적 reduction을 지지하지만 FESA binary64의 `1e-10` 통과를 대신하지 않는다. 새 test는 시간수렴/coarse gate와 finest `GTEST_SKIP`을 분리했으며 이 보고서에서는 새 바이너리 재실행을 아직 확인하지 않았다. C04a 전체를 무조건 PASS로 합치지 않는다.
Build/CTest는 메인/구현 owner가 담당하며 reviewer가 별도 C++ 실행을 했다고 주장하지 않는다. 문서 `git diff --check`는 exit 0이다. NR-008 문서 정합성, 새 algebra/rotation oracle 실행, 실제 shell의 시간수렴·energy·moving-null·reference 검증이 남는다. 본 보고서는 전체 기능/물리 gate 통과 판정이 아니다.
## 2026-09-26 재검토: startup와 C08
**HHT-IMP-NR-009 — blocking formulation/acceptance conflict.** 승인된 `A0=a0`와 전체 좌표 Newmark/HHT recurrence는 일반 regular mass-null DAE의 전체 시점 physical acceleration 2차 정확도를 보장하지 않는다. 아래 Decimal80 반례는 Newton·roundoff 없이 이를 재현한다. 기존 C04의 제한된 성공 evidence를 일반 shell 보장으로 확장할 수 없다. 적용 기준은 [formulation](formulation.md), [N7](numerical-controls.md), [C08](verification-cases.md)이며 [공통 tolerance](../TOLERANCE.md)는 변경하지 않았다.
### 독립 재현 및 startup 수정의 한계
무차원 `q=(x,z)`, `M=diag(1,0)`, `U=(z-x³)²/2`, `F=0`이면 endpoint 식은 `x''-3x²(z-x³)=0`, `z-x³=0`이다. 초기 `x=z=0`, `vx=1,vz=0`, `a0=A0=0`의 정확해는 `x=t,z=t³`다. Null regularity `∂ψ/∂z=1`이고 초기 ψ/ψdot/ψddot도 0이다. 이산 x와 endpoint z가 정확하므로 승인 predictor/rate 식만으로 독립 재현할 수 있다.
Python 표준 `decimal`, precision80, `python -B -`로 실제 계산했다. `alpha=-.05,beta=.275625,gamma=.55,T=1`; 아래는 전체 endpoint maximum absolute error다. Position error는 정확히 0이다.
| h | velocity error | acceleration error |
| --- | ---: | ---: |
| 1/16 | 3.923965419501134e-3 | 5.154933875921670e-1 |
| 1/32 | 9.809913548752835e-4 | 2.577466937960835e-1 |
| 1/64 | 2.452478387188209e-4 | 1.288733468980418e-1 |
| 1/128 | 6.131195967970522e-5 | 6.443667344902088e-2 |
| 1/256 | 1.532798991992631e-5 | 3.221833672451044e-2 |
모든 refinement 차수는 velocity **2**, acceleration **1**이다. Finest acceleration 최대는 `n=10,t=10/256`이므로 첫 frame 하나의 문제도 아니다. Smooth prescribed null coordinate의 Taylor 전개는
`a1-z''(h)=h*[1/(6*beta*(1+alpha))-1]*z'''(0)+O(h²)`
를 주며 대괄호 계수는 `-.36348808529259657`이다. Cubic recurrence의 particular solution은 `a_n=6t_n`, `A_n=6t_n+6alpha*h`, `v_n=3t_n²+(1-3alpha-6beta)h²`; 마지막 계수는 `-.50375`다. Exact physical v0와 discrete particular velocity의 O(h²) 차이가 null acceleration의 O(h) transient를 만든다. 동차 `(delta v/h,delta A)` 행렬은 `[[1-gamma/beta,1-gamma/(2beta)],[-1/beta,1-1/(2beta)]]`이며 중근은 `-19/21`, physical-a filter root는 `-1/19`다. 고정 양의 시간에서 transient가 줄어도 all-time maximum은 1차다.
**A0만의 변경은 충분하지 않다.** `A0=h*z'''(0)*(1/6-beta*(1+alpha))/(1/2-beta)`로 a1을 exact하게 만든 경우에도 max acceleration은 `h=1/16,1/256`에서 `.5183366687687775 / .03239604179804859`로 1차다. `A0=alpha*h*z'''(0)`도 `.5154649974736597 / .03221656234210373`으로 1차다. Exact v0를 유지한 채 A0 하나만 조정하여 해결됐다고 주장할 수 없다. Velocity의 discrete branch와 auxiliary history를 함께 다루는 별도 startup 또는 rate recovery가 필요하다.
다음 코드는 세 경우와 각 refinement order를 JSON stdout으로 재현한다. Main이 필요 시 `.harness/build/hht-numerical/startup-counterexample-20260926.py`로 추출하고 `python -B <script> > <result.json>`으로 보존할 수 있다. Reviewer 수정 경계상 scratch 파일은 생성하지 않았다. 이 수식 probe는 FESA binary build/test evidence가 아니다.
```python
from decimal import Decimal as D, getcontext
import json
getcontext().prec = 80
alpha = D('-.05')
beta = (1-alpha)**2/4
gamma = D('.5')-alpha
result = {}
for mode in ('approved', 'first_a_exact', 'filtered_A0'):
rows = []
for n in (16, 32, 64, 128, 256):
h = 1/D(n)
q = v = a = D(0)
A = (D(0) if mode == 'approved' else
(D(1)/6-beta*(1+alpha))/(D('.5')-beta)*6*h
if mode == 'first_a_exact' else alpha*6*h)
ev = ea = first = D(0)
peak = 0
for i in range(1, n+1):
t = i*h
qp = q+h*v+h*h*(D('.5')-beta)*A
An = (t**3-qp)/(beta*h*h)
vn = v+h*((1-gamma)*A+gamma*An)
an = (An+alpha*a)/(1+alpha)
ev = max(ev, abs(vn-3*t*t))
if abs(an-6*t) > ea:
ea, peak = abs(an-6*t), i
if i == 1:
first = abs(an-6*t)
q, v, a, A = t**3, vn, an, An
row = dict(n=n, v=str(ev), a=str(ea), first_a=str(first), peak=peak)
if rows:
for key in ('v', 'a'):
row['order_'+key] = str((D(rows[-1][key])/D(row[key])).ln()/D(2).ln())
rows.append(row)
result[mode] = rows
print(json.dumps(result, indent=2))
```
### C08 driver 대조 및 현재 evidence
[C08 source](../../tests/unit/analysis/hht_shell_physics_test.cpp)의 `RunPlate`, `InitializeNullVelocity`, `Differences`, `RecordNoise`를 대조했다. q0=0에서 null=e_phi3, f=0이므로 stiffness phi3 행으로 초기 ψ_q를 구성하는 식은 맞다. Initial physical director/null velocity, physical/hidden2 a0, A0=a0, old physical-a history, correction length scaling, `fine.history[2*frame]` 시간 대응과 T/T² normalization도 일치한다. `RecordNoise`의 free-vector nodal indexing은 이 all-free fixture에서는 유효하며 partial BC로 일반화하면 안 된다. **큰 rotational-rate 비수렴을 설명하는 구체적인 driver 인덱스·산술 오류는 찾지 못했다.**
[최신 optimized 진단](../../.harness/build/hht-numerical/c08-diagnostic-20260926.log)의 C08a finest angular-a 최대는 `n=10,t=.0390625`로 scalar transient peak와 일치한다. Total error `5.67565924e-4` 중 current-null 성분은 `5.58582318e-4`, physical complement는 `1.00582661e-4`다. Startup 가설을 지지하지만 physical 성분도 해당 node/time에서 이미 `1e-4`를 넘는다. 전체 node/time physical maximum 및 recovery 결과가 없으므로 null-only 회복으로 C08a가 통과한다고 예측할 수 없다.
같은 로그의 C08b finest rotational q/v/a self difference는 `1.38700902e-4 / 1.15434080e-2 / .868938812`다. 마지막 acceleration noise 합은 약 `5.426e-6`이므로 큰 차이를 N7 산술/solve 해상도로 설명할 수 없다. Cubic 반례는 q가 exact하므로 C08b q plateau까지 증명한 원인은 아니다. 다음 진단은 처음/최대/후반/최종 오차의 node·시간과 analytic null/physical complement별 q/v/a 차이, 초기값 grid independence, 대표 frame의 residual/effective tangent 대조다. Alpha·grid·fixture를 바꿔 기존 FAIL을 지워서는 안 된다.
**HHT-IMP-NR-010 — 별도 test 판정 보정 필요.** C08b energy/P/L 공통 loop는 roundoff 수준의 P에도 strict decrease와 마지막 ratio<=.6을 무조건 요구한다. Free centered shell의 총 linear P는 일정 translational mass와 총 내력 0으로 이산 recurrence에서도 보존된다. 마지막 세 P error `3.85047e-14 / 4.82500e-14 / 2.00403e-13`은 temporal order를 판정할 근거가 아니다. C08의 “변화가 존재하는 각 quantity”와 N7 unresolved/noise 구분을 적용해 P convergence를 별도 표시하고 raw drift와 기존 finest bound는 유지해야 한다. 이 판정 보정으로 rotational q/v/a FAIL이 해소되는 것은 아니다. C++ `long double` type 이름만으로 MSVC oracle를 Decimal80과 같은 고정밀 근거로 간주해서도 안 된다.
### 권고와 사용자 결정 경계
기존 FAIL과 recurrence를 보존하고 아래 **null recovery 후보를 별도 검증한 뒤** formulation/I/O owner가 계약 변경안을 제시하는 경로를 우선 권고한다. 현재 검토는 후보 채택·구현 승인이 아니다.
| 선택 | 수학적 효과·필수 검토 |
| --- | --- |
| q/v integration 유지, physical null a 별도 recovery | 현재 q/v에서 `r2=psi_q*a_h+psi_qq[v,v]+2psi_qt*v+psi_tt`, `(psi_q*N)*eta=-r2`, `a_rec=a_h+N*eta`. `M*N=0`이므로 endpoint physical equilibrium은 바뀌지 않는다. Cubic a_rec는 exact다. 일반 shell은 q/v/physical a의 2차성과 bounded regularity가 추가로 필요하며 현재 C08b evidence는 이를 충족하지 못한다. Internal history `a_h`와 recovered output `a_rec`를 구별하는 state/I/O 계약 변경이 필요하다. a_rec를 next history에 넣으면 원 적분법을 유지한 것이 아니다. |
| Constraint-consistent startup/적분법 변경 | Exact frame0 q/v/a, auxiliary history, velocity의 discrete bias와 null derivative constraints를 함께 설계해야 한다. 단순 A0/a1 수정은 부족하다. Filter, tangent, state update와 C01–C08/reference를 재검증한다. |
| 현재 알고리즘의 정확도 범위 제한 | 사용자가 기존 all-time full-a C08/N7 acceptance를 명시적으로 변경하는 선택이다. 기존 FAIL은 유지하고 검증 범위만 주장한다. 외부 UR warning-only 분류나 reference tolerance로 내부 a 실패를 면제할 수 없다. |
Null acceleration correction은 `B*N=0`이므로 현재 q/v의 director acceleration을 바꾸지 않지만 chart a와 spatial axial spin acceleration 값은 바꾼다. Recovered v까지 바꾸면 convective inertia도 다시 평가해야 하므로 a-only 회복과 구별한다. Hidden2 satisfaction은 일반 2차 적분 증명을 대신하지 않는다. 공개 입력의 zero initial velocity만으로 nonzero-jerk 내부 C08 acceptance가 충족됐다고 주장할 수 없다.
실행 범위: reviewer는 독립 Decimal80 probe와 source/log 정적 대조를 수행했다. C++ build/test는 실행하지 않았다. Tolerance·계약·source·tests·reference는 수정하지 않았다. C08b 원인 확정, 선택된 수정의 독립 검토 및 전체 solver 검증은 미완료다.
### 별도 recovery 오류: 두께 moment 계수
**HHT-IMP-NR-011 — source corrected; optimized focused regression passed.** Main이 식별한 [RecoverState](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의 bending resultant 계수를 독립 검산했다. `z=t*zeta/2`, `dz=t/2*d(zeta)`이므로 `M=∫z*S*dz=(t²/4)*Σw*zeta*S`다. 기존 `t/4`는 두께 1개가 누락되어 moment per length의 단위 `[force]` 대신 membrane resultant와 같은 `[force/length]`가 된다. 현재 소스의 `0.25*thickness_*thickness_*thickness_sign*gauss*stress` 수정은 부호·단위·두께 적분과 맞는다.
[새 test](../../tests/unit/elements/nonlinear_mitc4_shell_test.cpp)의 flat reference, quadratic-through-thickness stress에서 `t²/12*(S_top-S_bottom)`은 odd first moment의 정확한 별도 샘플 oracle다. `t=.2,.5,2` 선택은 t=1이 누락 계수를 숨기는 문제를 피한다. [수정 전 로그](../../.harness/build/hht-numerical/bending-moment-red.log)의 t=2에서 계산값 `4.36084804185815`, oracle `8.72169608371628`의 factor2 실패도 식과 일치한다. 수정 후 실행 및 기존 static recovery 영향은 owner 검증 대기다. 이 변경은 recovery의 section resultant에 한정되며 internal force/tangent 식이나 HHT recurrence를 변경하지 않는다. C08 시간수렴 FAIL의 해결로 분류하면 안 된다.
후속 [optimized recovery 실행](../../.harness/build/hht-numerical/recovery-green-optimized.log)을 독립 열람하여 **13 tests PASS**를 확인했다. 새 thickness moment test와 기존 small-rotation/objectivity/recovery/patch가 포함된다. 위 “검증 대기”는 최초 검토 시점 기록이며, 현재 확인한 범위는 이 focused optimized 실행이다. 전체 Debug 및 다른 reference 검증의 대체 evidence는 아니다.
## 가속도 복구 후보 독립 검토 — HHT-ADR-011
**HHT-IMP-NR-012 — candidate mathematics consistent; verification/adoption pending.** [별도 정식화](formulation-acceleration-recovery.md)를 검토했다. 사용자 선택은 기존 정확도 유지와 별도 검증이며 production/state/schema 채택 승인이 아니다. 핵심 `G*eta=-r2_h`, `a_rec=a_h+N*eta`는 지정된 shell·고정 chart·일정 null rank에서 타당하다. 다음 일관성을 확인했다.
| 경계 | 독립 대조 결과 |
| --- | --- |
| 좌표·단위 | `q=D_f*x`, `N=D_f*Z`, `C_x=C_q*D_f`이므로 `C_q*N=C_x*Z`, `a_h=D_f*b_h`, `r2_q=r2_x`. Shell null의 병진 성분은 0이어도 일반 scaled mapping을 생략하면 안 된다. W-scaled solve는 `B=W^-1*G*W^-1`, `B*y=-W^-1*r2`, `eta=W^-1*y`다. |
| Partial BC | Admissible free null의 zero-constrained lift만 사용한다. Positive Gram mass와 analytic `H*N=0`는 full mass action도 0으로 만들어 constrained-row reaction까지 보존한다. 잘린 nodal null이나 `M_ff*N≈0`만으로 full 보존을 인증할 수 없다. Empty null/all-fixed는 identity recovery다. |
| Explicit time | q-independent F(t)에서 `psi_t=-N^T*Fdot`, `psi_qt[p]=-DN[p]^T*Fdot`, `psi_tt=-N^T*Fddot`; mixed 항의 계수 2와 부호가 맞다. AR-02의 추가 `psi=z-t*x`는 현재 문서가 별도 `U(q,t)=(z-t*x)²/2`로 명시하여 synthetic time-dependent-potential oracle임을 구분했다. 이 경우 일반 ψ 미분을 쓰며 F-only 단축식을 적용하지 않는다. |
| 보존과 출력 | 고정 q/v에서 `delta I=M*N*eta=0`, full E/reaction/material-point acceleration/Pdot/Ldot 불변. q/v 기반 energy/P/L도 불변. `delta omega_dot=d*lambda`이므로 chart a 및 axial spin acceleration은 변한다. 기존 `a_h,A`와 모든 integration history는 별개로 그대로 보존해야 한다. |
| 차수 | Smooth bounded recovery map은 q/v와 non-null a의 O(h²) 오차를 전달할 수 있지만 그 전제는 아직 C08에서 검증되지 않았다. 동일 endpoint에서 physical complement 오류는 그대로다. `r2_rec≈0`만으로 정확도·평형·hidden1 충족을 주장할 수 없다. |
Python 표준 `fractions.Fraction`의 exact arithmetic으로 `D=diag(7,1)`, cubic constraint의 `x=2,vx=3,a_h=(1/5,-4)`에서 scaled/unscaled r2·G 동일성, physical a 보존, recovered r2=0을 실행 확인했다. Constant basis scale `s=-2,3`에서 `N'=sN,psi'=spsi,G'=s²G`의 correction도 exact 동일했다. 별도 `psi=z-t*x`, `t=2/5,ax=3/7,vx=5/6`에서 `az=t*ax+2vx`가 mixed-time r2를 exact 0으로 만들었다. 이 제한 scalar 대조는 shell probe 실행 evidence가 아니다.
**Off-hidden1 basis 의존성은 실제다.** `psi=z-x²`, `q=(1,1)`, `v=(1,2+delta)`, `a_h=0`, `N=e_z`이면 `r1=delta`, 원 회복 `a_rec,z=2`다. 같은 null을 `N'=xN`, `psi'=xpsi`로 표현하면 q=1에서 basis 값은 동일하지만 그 미분 때문에 `a_rec,z=2-2delta`다. `delta=1/100`의 exact 계산은 `2` 대 `1.98`을 주었다. 따라서 current normalized basis와 그 미분을 고정해야 한다. Constant basis 재표현·고정 global frame의 covariance와 arbitrary state-dependent renormalization의 exact invariance를 혼동하면 안 된다. Nonlinear chart 변경도 가속도의 비선형 변환항과 basis 선택을 함께 다뤄야 하며 현 fixed-chart 검토 밖이다.
### Probe 보정과 검증 준비도
**HHT-IMP-NR-013 — in-progress test-probe corrections required.** 검토 당시 [RecoverAcceleration](../../tests/unit/analysis/hht_shell_physics_test.cpp)는 올바른 explicit-time `frame.hidden_acceleration_defect`를 RHS로 쓰지만 post-check는 `assembly.hidden_second+C*a_rec`만 다시 계산했다. C08a에서는 `-D²N[v,v]^T*F-2DN[v]^T*Fdot-N^T*Fddot`가 빠진다. 같은 q/v/time/F의 별도 frame에 recovered a를 넣고 `ManufacturedHidden`을 재평가하거나 정확히 같은 항을 포함해야 한다. 이 오류는 post-check의 문제이며 현재 RHS solve 자체가 잘못됐다는 판정은 아니다. Main에 즉시 전달했으며 수정 후 대조·실행은 대기다.
또한 post-scale의 `sum abs(DN_component*g_component*a)+sum abs(N_component*K_entry*a)`는 N3의 `abs(psi_q)*abs(a)`와 일반적으로 다르다. 먼저 source/global coordinate별 `C_j`를 합친 다음 `sum_j abs(C_j)*abs(a_j)`로 계산해야 한다. Hessian 및 explicit-time 항도 정해진 derivative-entry contraction scale와 대조해야 한다. `ManufacturedHidden`의 기존 확장항 scale에도 같은 점검이 필요하다. 더 큰 분모로 hidden2 통과를 만들지 않는다. Raw r2/G/eta 진단은 유지할 수 있지만 scale 검증 전 N3-certified 판정으로 보고하면 안 된다.
검증 적용은 기존 N1 finite/zero-scale branch, N2-L linear backward error `1e-12`, N4 current-null/regularity, N5 derivative sweep, N6 보존 기준을 유지한다. 후보 post-hidden2는 corrected a로 **기존 N3의 정확한 uncancelled derivative scale를 재평가하여 `1e-10`**과 대조한다. 이 판정은 consistency일 뿐 C08/N7의 full-a 정확도 판정과 별개다. Exact-zero scale에서 nonzero residual을 absolute ratio로 바꾸지 않는다.
회복 가속도의 noise에는 `delta eta=-G^-1*(delta r2+delta G*eta)`, `delta a_rec=delta a_h+delta N*eta+N*delta eta`가 필요하다. 기존 a_h의 cancellation estimate만 복사하면 충분하지 않으며 basis/derivative/linear solve 오차를 구별해야 한다. 전후 history의 exact 동일성, common-projector error decomposition, full I/E/reaction과 director/axial-spin 불변식, partial BC/empty null, AR-01–08의 실행 evidence가 남는다. 이 검토는 추가 numerical tolerance나 production adoption을 승인하지 않는다.
### 2026-09-27 probe 수정 재대조
NR-013의 **explicit-time post-check 수정은 source에서 확인**했다. Manufactured branch는 q/v/time/F를 그대로 복사한 frame에 a_rec만 넣고 `ManufacturedHidden`을 재평가한다. Autonomous C08b branch도 `C_j`를 먼저 global coordinate별로 합친 뒤 `sum abs(C_j*a_rec,j)`를 구하므로 지적한 gradient-scale 문제를 수정했다. 다만 C08a `ManufacturedHidden`의 component별 확장항 scale 및 explicit-time Hessian 합산은 아직 정확한 N3 derivative-entry scale로 인증되지 않았다. 해당 ratio는 diagnostic이며 raw residual도 함께 남겨야 한다. Zero scale이면 raw residual의 exact-zero 판정이 별도로 필요하다.
별도 `RecoveredAcceleration` 저장, const assembly 입력과 copied frame 사용을 대조했으며 q/v/a_h/A에 recovered 값을 대입하는 경로는 없다. 기존 acceptance assertions는 원 a_h 결과를 계속 검사한다. `CheckLinearSolve`는 recovery solve의 N2-L backward check를 수행하지만 이것만으로 N7 forward noise/시간차수를 인증할 수 없다. `Mdeltaa=||M*delta a||/(||M||*||delta a||)`는 null-action 진단이며 large correction을 고려한 실제 full E/reaction의 전후 오차 평가를 대신하지 않는다.
[최초 recovery-probe 로그](../../.harness/build/hht-numerical/c08-recovery-probe-20260926.log)의 C08a 전체 recovered angular-a maximum은 h=1/16..1/256에서 `.01351694529 / .004558583885 / .001373166739 / .0004000031671 / .0001005829141`이다. 이 값으로 계산한 마지막 두 raw order는 **1.77942349 / 1.99162617**, finest는 **1.005829141e-4**다. 따라서 기존 `>=1.8`, `<=1e-4`를 충족하지 않으며 후보 PASS가 아니다. 이 숫자는 아직 N7로 인증된 차수 evidence도 아니다.
같은 로그의 C08a `angular_a_null=0,angular_a_physical=0`는 **무효 diagnostic**이다. Analytic frame의 비어 있는 `nodal_internal_order`로 loop가 0회 실행됐기 때문이다. Full recovered error를 계산하는 `FrameError`는 vector size를 사용하므로 위 maximum 숫자에는 이 문제가 없다. 수정 source는 `generalized_coordinates.Size()/6`와 vector-size guard를 사용한다. 수정 후 C08a split 실행 evidence는 별도 확인해야 하며 이전 0을 exact branch로 해석하면 안 된다. C08b의 실제 accepted frame metadata는 채워져 있어 이 특정 zero-loop 문제와 구별한다.
현재 N7 미충족 사항은 recovery의 별도 linear-defect solve와 그 null correction 전파, C/k/N 계산 오차와 q/v/a_h perturbation의 recovery-map 전파, 각 grid의 전체시점 maximum noise 산정이다. Finest C08a recovered error는 기존 a_h noise `8.15568169e-6`의 약 **12.33배**다. 이 a_h 지표를 후보에 그대로 적용해도 100배 분리에 못 미치지만, null projection 때문에 a_rec에 동일 지표를 복사하는 것 자체가 올바른 증명은 아니다. 반대로 회복이 noise를 제거했다고 가정해 지표를 버릴 수도 없다. 확정된 recovery noise와 비교하기 전 상태는 **INCONCLUSIVE for recovered-a order**, 실제 finest/ratio 미달 기록은 그대로 유지한다. 정해진 grid·threshold 또는 첫 시점을 바꾸지 않는다.
완료된 같은 probe 로그는 **3 tests / 1 PASS / 2 FAIL**이다. C08b의 recovered angular-a 공통시간 차이는 h=1/64..1/512의 네 비교쌍에서 `.846306569 / .881654308 / .982191000 / .868938661`로 수렴하지 않는다. Finest는 원 a_h 차이 `.868938812`와 사실상 같은 크기이며, fine-state common projector의 physical maximum `.868938153`, null maximum `.00286332558`을 확인했다. 각 maximum은 서로 다른 node/time일 수 있으므로 두 maximum의 제곱합을 full maximum으로 해석하지 않는다. **주요 C08b 잔여 오차는 physical complement에 있고 null-only recovery로 제거되지 않는다.** q/v difference 역시 그대로다.
C08b post-hidden2 ratio는 네 pair에서 `6.06e-17..1.45e-16`, normalized Mdeltaa는 약 `5e-20`이다. 수정된 autonomous scale와 null correction의 제한 consistency evidence를 지지하지만 full N7 검증이나 a 정확도 PASS가 아니다. 회복 후보 자체의 후속 검증과 별도로 C08b의 physical dynamics/rate 비수렴 원인을 조사해야 한다. 이 결론은 production recovery 채택 또는 새 integrator 선택을 승인하지 않는다.
후속 [C08a split 수정 실행](../../.harness/build/hht-numerical/c08-recovery-split-spectrum-20260927.log)은 **2 tests / 1 PASS / 1 FAIL**로 완료됐고 C08a temporal FAIL을 유지했다. Recovered full maximum은 이전 실행과 같으며, finest exact-state common projector의 angular-a null/physical maximum은 각각 **`4.64641213e-7 / 1.00582661e-4`**다. False-zero split 문제는 이 실행으로 수정 확인했다. 남은 C08a recovered maximum도 physical complement가 지배하며 finest `1e-4` 초과는 그대로다. 별도 matrix dump test의 PASS는 spectral/시간해상도 결론을 뜻하지 않으며 이 검토에서 spectrum 계산을 수행하지 않았다.
### C08b 초기 spectrum 독립 재현
후속 할당에 따라 위 로그의 `C08bInitialPhysicalSpectrumProbe`가 출력한 **M/K 각각 54×54 raw matrix**를 독립 계산했다. 이전 문단의 미실행 범위와 구별한다. Row 0..53의 완전성·중복·54 components·finite를 먼저 확인했다. q0=0의 알려진 nodal UR3 index `5,11,..,53`만 z로 지정하고 나머지 45개를 p로 지정했다. 수치 고유치 cutoff로 null을 선택하거나 작은 양의 질량을 삭제하지 않았다.
`C=-solve(Kzz,Kzp)`, `T[p,:]=I`, `T[z,:]=C`, `Kc=Kpp+Kpz*C`, `Mp=Mpp=L*L^T`로 응축했다. Python/NumPy를 `uv run --with numpy python -B -`로 실행하여 `A=L^-1*Kc*L^-T`의 raw skew를 확인한 후 `(A+A^T)/2`의 `eigh`로 eigenvectors까지 구했다. `Phi=T*L^-T*Y`를 원 54차원으로 복원하여 **원 K/M에 대한** residual도 검증했다. Eigenvalue를 clamp하거나 reference JSON을 수정하지 않았다.
| 항목 | 독립 계산 |
| --- | ---: |
| M의 지정 null columns norm | exact 0 |
| Raw M/K/Kc relative Frobenius skew | 각각 exact 0 |
| `cond_inf(Kzz)` / `cond_inf(Mp)` | 4 / 7500 |
| Mp Cholesky / minimum diagonal L | 성공 / `7.37711114e-3` |
| Whitened A raw relative skew | `1.15170851e-16` |
| `lambda_max` / `omega_max` | `102297.7057360391 time^-2` / `319.84012527517416 rad/time` |
| Full generalized residual maximum | `2.62506622e-15` |
| `||Phi^T*M*Phi-I||F` | `8.78577073e-15` |
Full residual metric은 각 mode의 `||K*phi-lambda*M*phi||2 / [(||K||2+abs(lambda)*||M||2)*||phi||2]`다. 독립 `eigh`의 최저 여섯 raw eigenvalue는 `[-1.63581e-11,-7.39169e-12,-7.29645e-12,2.01889e-12,3.26844e-12,8.09326e-12]`, 그 다음은 `44.22815124448042`였다. [Main eigvalsh JSON](../../.harness/build/hht-numerical/c08b-initial-spectrum-20260927.json)의 raw 값과 전체 최대 차이는 `7.276e-11`이며 최대 ω는 표시 precision에서 동일하다. 음수 값을 0으로 바꾸거나 그 제곱근을 계산하지 않았다. 별도로 3 translations와 `u=Omega×X,phi=Omega`의 3 analytic rigid fields는 `||K*R||F/(||K||F*||R||F)=2.27995067e-17`이었다. 이는 여섯 near-zero 값의 rigid-mode 해석을 지지하며 nonlinear stability 인증은 아니다.
| h | omega_max*h |
| --- | ---: |
| 1/64 | 4.9975019574 |
| 1/128 | 2.4987509787 |
| 1/256 | 1.2493754894 |
| 1/512 | .6246877447 |
| 1/1024 | .3123438723 |
**한정 결론:** coarse grids가 초기 고주파 탄성 모드를 잘 분해하지 못할 가능성은 추가 조사할 만하다. 그러나 최대 eigenfrequency만으로 C08b의 실패 원인을 확정하거나 finest의 asymptotic accuracy를 보증할 수 없다. Dump의 `EmptyFrame`은 v=0이므로 실제 C08b의 nonzero initial velocity에서 생기는 convective tangent/velocity coupling을 포함한 dynamic Jacobian spectrum이 아니다. 해당 모드의 초기 가진 크기, 비선형 진행 중의 frequency/phase 변화, 오차 history와의 대응 및 실제 rate convergence가 남는다. 기존 grid·C08/N7 threshold·실패 판정은 유지하며, 이 진단은 grid 변경이나 production recovery 채택의 근거가 아니다.
@@ -10,7 +10,7 @@
## 실행 범위와 소유권
사용자가 I/O definition, implementation, physics evaluation을 모두 요청했으므로 기존 정식화의 추천 a/A 분리와 0+ 초기화를 구현 대상으로 채택한다. 메인은 통합·procedure·검증을 맡고 독립적인 kernel/input/writer 묶음만 구현 담당자에게 할당한다. 현재 checklist는 [PRD](PRD.md)에만 유지한다. Commit·push는 이번 요청에 포함되지 않는다.
사용자가 I/O definition, implementation, physics evaluation을 모두 요청했으므로 기존 정식화의 추천 a/A 분리와 0+ 초기화를 구현 대상으로 채택한다. 메인은 통합·procedure·검증을 맡고 독립적인 kernel/input/writer 묶음만 구현 담당자에게 할당한다. 현재 checklist는 [PRD](PRD.md)에만 유지한다. 후속 사용자 요청에 따라 검증 묶음별 로컬 commit을 수행하며 push는 포함하지 않는다.
| 묶음 | 파일·책임 | 검증 |
| --- | --- | --- |
@@ -1,47 +1,74 @@
# HHT 동해석 물리 평가
- Owner: `physics-evaluation-agent`; 검토일: `2026-09-22`.
- 판정: **PENDING — 실제 shell C08 및 완료된 원본 reference/HDF5 evidence 대기**. 제한된 oscillator·관성 kernel 결과는 물리적으로 일관되지만 전체 physics gate 통과를 뜻하지 않는다.
- 적용 계약: [정식화](formulation.md), [관성 상세](formulation-inertia.md), [N1–N7](numerical-controls.md), [C01–C12](verification-cases.md), [reference mapping](reference-model.md), [I/O](io-contract.md). [독립 구현 수치 검토](implementation-numerical-review.md)와 구분한다.
- Owner: `physics-evaluation-agent`; 검토일: `2026-09-27`.
- 판정: **미통과 — C08 시간수렴 실패 유지**. HHT-PHY-005 굽힘 resultant 불일치는 재생성된 원본 HDF5에서 해소를 확인했다. 완료 원본의 전판 관성 평형과 U reference 통과를 전체 physics gate 통과로 확대하지 않는다.
- 적용 계약: [정식화](formulation.md), [관성 상세](formulation-inertia.md), [N1–N7](numerical-controls.md), [C01–C12](verification-cases.md), [reference](reference-model.md), [I/O](io-contract.md), [상속 recovery §13](../nonlinear-static-newton-raphson/formulation.md#132-integration-point-physical-strain-and-stress).
## 우선순위별 findings
## Findings
| ID | 상태 | 근거·영향·후속 owner |
| --- | --- | --- |
| HHT-PHY-001 | **필수 evidence 미완료** | C08a의 독립 volume forcing/전체 shell 좌표 시간수렴과 C08b의 자유 변형 shell 에너지·운동량·hidden defect 결과가 아직 없다. C01–C07과 작은 reference 변위로 유한회전 shell DAE의 물리적 적절성을 대신 입증할 수 없다. 구현 owner의 C08 결과를 검토해야 한다. |
| HHT-PHY-002 | **필수 reference 대기** | 원본 계산의 부분 Newton 로그만 존재한다. 완료된 101-frame 공식 HDF5와 C12 202-family 비교 결과를 아직 검토하지 못했다. 부분 accepted increment는 원본 전체 해석·평형·비교 통과가 아니다. |
| HHT-PHY-003 | **Debug 후속 실행 확인** | 기존 `focused-optimized.log`는 42 PASS/1 SKIP/1 FAIL이었다. 후속 `focused-debug-complete.log`는 68개 중 67 PASS/1 SKIP이며 `LargeDirectStepStartsFromAcceptedGeometry`도 PASS다. 이전 로그를 소급해 통과로 바꾸지 않는다. 구성된 전체 CTest 결과와는 구별한다. |
| HHT-PHY-004 | **C04a finest reduction INCONCLUSIVE** | Binary64 full/reduced physical acceleration 차이 `3.0790209097630861e-10`은 기존 `1e-10`보다 크고 N7 산술/solve 해상도 `6.2961354117696263e-10`보다 작다. 시간수렴 통과와 구별한다. Decimal80 최대 차이 `1.6934145088608964e-73`은 수학적 reduction 근거이며 FESA binary64 통과 증거가 아니다. |
| HHT-PHY-001 | **C08 필수 시간수렴 FAIL** | 원 physical chart acceleration의 C08a finest 오차 `5.67565924005e-4 > 1e-4`, 마지막 두 차수 `1.028668669/1.028969238 < 1.8`. 별도 회복 후보도 C08a finest `1.005829141e-4`, C08b finest angular-a self-difference `.868938661`로 미달이다. Hidden2 개선만으로 시간 정확도를 입증하지 않는다. 구현·수치 owner의 후속 판단이 필요하다. |
| HHT-PHY-002 | **기존 reference 대기 해소; coverage 제한 유지** | 공식 101-frame HDF5와 comparator precheck, U 101 families PASS 확인. UR은 frame 1–100에서 row/RMS warning 200건. V/A/반력/에너지는 CSV 비교 대상이 아니다. |
| HHT-PHY-003 | **제한 Debug evidence 유지** | 기존 focused Debug 68 tests 중 67 PASS/1 C04a SKIP. 이번 C08은 optimized 실행으로 전체 configured Debug/CTest 완료가 아니다. |
| HHT-PHY-004 | **C04a finest reduction INCONCLUSIVE 유지** | Binary64 acceleration 차이 `3.07902091e-10`은 기존 `1e-10`보다 크고 N7 해상도 `6.29613541e-10`보다 작다. Decimal80 차이 `1.69341451e-73`은 수학적 identity 근거이며 binary64 통과가 아니다. |
| HHT-PHY-005 | **해소 — 수정 후 원본 HDF5 재검산** | 새 원본 HDF5의 `M11/M22/M12`가 `(t³/12)Cκ`와 최대 symmetric relative 차이 `1.94601128e-16`으로 일치한다. 이전 2배 불일치는 보관본에만 남는다. 100개 noninitial section-resultant dataset의 굽힘 성분만 정확히 `.5`배로 바뀌었고 나머지 데이터는 유지된다. 이 결론은 해당 recovery 수정의 검증이며 C08 통과가 아니다. |
| HHT-PHY-006 | **원본 시간 정확도 제한** | T 최대 `191.61420902651`, energy defect 최대 `+190.225571555207`, 최종 `−1.39842750647836`. 독립 적분도 같은 T를 준다. 거친 `h/T1≈7.4567`에서 작은 U와 reference 일치가 rate/energy 정확도를 입증하지 않는다. 이 reference에 없는 energy bound를 새 gate로 만들지 않는다. |
## 확인한 물리 근거
## 원본 HDF5 독립 계산
실행 주체는 구현 owner다. Reviewer는 아래 로그와 원본 CSV를 읽고 표시된 수치로 독립 계산했으며 C++ solver를 별도 재실행하지 않았다. 단위는 일관된 입력 단위계다.
현재 [공식 HDF5](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_results.h5)의 SHA256은 `f07beddaa232abe314e20210534a243d6deaf1f677c598c64f9334428bbecb56`이다. 9월 26일 volume·평형 계산의 원본은 [수정 전 보관본](../../.harness/build/hht-numerical/reference-before-recovery-fix.h5), SHA256 `23bac93d1f7998b2f74a0f68767ae98a9899ee92c53f5170d08a814d3ee936d4`다. 9월 27일 `uv run --with h5py python -B -`로 두 파일의 2033 datasets를 독립 대조했다. 값이 다른 dataset은 100개 noninitial section resultants뿐이다. 해당 dataset 안의 M 성분은 새 값이 옛 값의 정확히 `.5`배이며 N/Q 성분은 같다. 2025 floating datasets의 byte 비교에서도 그 100개 외 변경은 없다. 따라서 아래 평형·kinetic energy·운동학·stress 계산은 동일 데이터에 관한 근거로 유효하며, 굽힘 결과는 아래 새 재검산으로 대체한다.
| 검사 | 관찰·계산 | 해석과 한계 |
Reviewer는 solver/build 및 artifact 재생성을 실행하지 않았다. 검토는 stdin Python/NumPy 계산과 실행 결과 열람이다. 모든 floating result 값의 finite 확인은 수정 전 audit와 수정 후 finite M 재검산·나머지 데이터 동일성으로 유지된다. 단위는 `consistent-input-units`; 이하 L/F/T는 입력 length/force/time이며 SI로 단정하지 않는다.
729 nodes/676 S4, 외곽 104 nodes의 6 DOF 고정, 중심 source node `2`에 constant force `(-100000,-100000,-100000)` F다. `rho=2700`, 면적 `100`, 두께 `.5`, 총질량 `135000`; 독립 27점 적분값은 `135000.00000000003`이다.
재계산은 저장 연결·초기 좌표의 bilinear N과 초기 Jacobian에 3×3×3 Gauss–Legendre quadrature를 적용했다. `z∈[-t/2,t/2]`, `x=ΣN_i(X_i+u_i+z d_i)`, `ḋ=ω×d`, `d̈=ω̇×d+ω×(ω×d)`로 volume v/a를 재구성하고 `T=½∫rho v·v dV0`, `Pdot=∫rho a dV0`, `Ldot=∫rho x×a dV0`를 계산했다. Current nodal arm은 X+u, 원점은 (0,0,0)이다. 이 모델의 applied moment는 0이고 support chart는 0이므로 spatial moment 변환은 항등이다. 일반 nonzero constrained rotation의 변환 검증으로 확대하지 않는다.
| 검사 | 실제 계산·최대값 | 판정과 한계 |
| --- | --- | --- |
| C01/C03/C04a/C04b 시간수렴 | `focused-stable-kernel.log`의 `h=1/128→1/256` 전체 시점 최대오차로 `log2(e_h/e_h2)`를 재계산: q/v/a 각각 C01 `1.99978/1.99931/1.99978`, C03 `1.99994/1.99768/1.99944`, C04a `1.99993/1.99746/1.99992`, C04b `1.99968/1.99982/2.00237`. C03 naive q order `0.899645` | Smooth variable mass와 moving-null 제한 모델에서 승인 확장의 약 2차 수렴 및 잘못된 질량 확대의 구별을 지지한다. Shell의 증명은 아니다. |
| C04b hidden defects | Finest `max|q·v|=6.72614e-10`, `max|q·a+v²|=3.16003e-6`; 이전 두 grid에서 각각 감소 | C04b `1e-6/1e-4` 이내. Position-level 평형만으로 rate consistency를 주장하지 않는 계약과 맞는다. |
| C07 alpha=0 | `max|E−E0|/E0=1.14353e-13`, 한계 `1e-10` | 선형 무감쇠 평균가속도 한계의 에너지 보존 지지. |
| C07 기본 alpha | 최대 energy defect `2.72922e-5`, 종단 signed defect `−2.45134e-5`, displacement error `0.0016895`, phase error `−0.00185687` | 관측된 소산·위상 변화는 algorithmic 효과다. 물리 damping이나 비선형 매-step 단조 감소로 해석하지 않는다. |
| C07 spectrum | `omega*h=10/100/1000`의 spectral radius `0.913168/0.904853/0.904763`; 해석적 limit `.95/1.05=0.9047619048` | 기본 음수 alpha의 고주파 소산 방향과 한계에 일치. 마지막 finite frequency와 limit의 exact equality를 요구하지 않는다. |
| C07 관성 반력 | `SupportReactionUsesPhysicalAccelerationAndCoupling` PASS. 계약 모델에서 constrained acceleration=0이어도 `R2=M21*a1=.5*a1` | Support-on-structure 부호와 physical endpoint 반력의 근거다. `A` 또는 weighted constrained residual을 반력으로 대체할 수 없다. |
| C05/C06 관성·회전 | Optimized 로그에서 관성 8 tests, 회전 4 tests PASS: rectangle 질량/null, warped 독립 volume energy/power, 단위·global-frame 변환, finite-rotation inverse/null, 독립 D3 anchors, 누락 mutation 검출 | Current consistent mass, 양의 물리 질량과 무질량 drill, 관성 power의 국소 근거다. Test 이름의 PASS를 전역 shell 운동량·시간수렴 통과로 확대하지 않는다. |
| 대수 초기화·rigid limits | Algebra 8 tests와 all-fixed procedure PASS. Internal zero-trial 및 rigid translation nullspace/symmetry PASS | 초기 mass-null 가속도 결합, admissible null rank, 영변형 spurious force 방지의 제한 근거다. Free translating shell 전체 이력과 C11 반복 실행 coverage는 별도 확인 대상이다. |
| 고정 경계·반력 | 고정 q/v/a/A 모두 exact 0; `Rg−selector(E)=0`, free reaction exact 0; `R−Rg=0` | N2/I/O와 일치. |
| Full residual | `E−(I+f_int−F)=0`; free force/moment 최대 `4.52473614e-10` F / `3.06939613e-11` F·L | 상쇄된 항으로 N2 분모를 재정의하지 않는다. |
| N2 accepted 로그 | 101 rows의 최대 `rho_u=1.22427119e-15`, `rho_phi=8.19697100e-16`; frame0 phi numerator=scale=0 | 각각 `<=1e-10`. 양의 u scale 범위 `[200036.43398,446896.14404]` F, phi `[7874.45824,56398.12645]` F·L. Element별 uncancelled terms는 HDF5에 없어 로그 scale 자체를 독립 재조립하지 않았다. |
| N2 correction | u/phi 순서: q `2.44698e-11/7.62279e-12`, v `4.88286e-11/1.52110e-11`, a `9.34518e-11/2.91120e-11`, A `8.87792e-11/2.76564e-11` | 로그의 무차원 metric 모두 `<=1e-10`. 원 선형계 N2-L은 이번 audit 대상 밖이다. |
| N6 force | `Σ(F+R)−Pdot` 최대 `7.27596e-10` F; normalized 최대 `9.16951367e-16` | `<=1e-8`. 상쇄 전 applied/support 절점 force norm 및 volume inertia norm 합의 범위 `[401544.1353,1277362.8173]` F. |
| N6 moment | `Σ(x×F+M)−Ldot` 최대 `1.37915e-10` F·L; normalized 최대 `2.63510938e-16` | `<=1e-8`. 상쇄 전 applied/support moment 및 volume moment norm 합의 범위 `[274879.6378,1244342.4463]` F·L. 두 N6 분자는 infinity norm이다. |
| 저장 balance | 독립 계산과 `global/equilibrium` 성분별 차이 최대 `7.13044e-10` | 서로 다른 단위의 물리 norm이 아닌 성분별 차이 요약이다. HDF5에 없는 raw momentum/분모를 위 독립 적분으로 보충했다. |
| Kinetic energy | 저장 T와 직접 volume T 절대차 `3.12639e-13` F·L, 상대차 `2.98657131e-15` | N4 직접 kinetic 기준 `1e-12` 이내. A를 사용하지 않았다. |
| Energy 정의 | `W−ΣF·(q−q0)=0`, `defect−(T+Uphys+Udrill−E0−W)=0`; frame0 다섯 값 모두 0 | I/O 정의와 일치. 비선형 음수 alpha에 매-frame 감소/정확 보존을 요구하지 않는다. |
| 방향·대칭 | 중심 `max|Ux−Uy|=2.11758e-21` L; 최종 U=`(-1.17073455e-6,-1.17073455e-6,-2.56368154e-5)` L | 중심 하중 방향·x/y 교환 대칭과 일관. 전 자유도의 부호를 강제하지 않는다. |
| 회전·변형 규모 | 전판 `max|Uz|/t=9.77616975e-5`, 최대 UR 성분 `1.25625048e-5` rad; `max|d·d−1|=3.33067e-16` | 작은 응답·director 일관성. 큰 회전/rigid-motion 전체 이력 coverage는 아니다. |
## 원본 모델과 coverage
초기 support force 합은 각 방향 `−.0146805358` F, Pdot는 각 방향 `−100000.014680536` F다. 작은 초기 반력 부호는 consistent mass coupling의 동적 평형과 일치한다. 최종 support 합 `(100032.408356,100032.408356,100011.576861)` F에 applied force를 더하면 독립 `Pdot=(32.4083563,32.4083563,11.5768612)` F와 일치한다. Support 합이 하중 반대값과 정확히 같아야 한다는 정적 판정을 적용하지 않았다.
원본 INP는 729 nodes/676 elements의 평판, 외곽 104 nodes의 6 DOF 고정, 중심 node `2`의 global force `(-100000,-100000,-100000)`이다. 입력 수치로 총 질량은 `rho*area*t=2700*100*.5=135000` mass units다. `E=2.1e11`, `nu=.3`, `rho=2700`, 두께 `.5`를 SI로 단정하지 않는다.
T/Uphys/Udrill은 모두 비음수, 최대값은 `(191.6142090,5.087207660,1.893293439e-5)` F·L, 최대 `Udrill/Uphys=4.38863644e-6`이다. 최대 T와 양의 defect는 frame10(t=1)에 발생한다. 최종 `(T,Uphys,Udrill,W,defect)=(.000284443261,1.399111305,5.197018635e-6,2.797828452,-1.398427506)` F·L. 이는 수치 에너지 결함이며 physical damping energy가 아니다.
원본 CSV 909행을 직접 집계했다. `max|U1|=max|U2|=2.31251943e-6`, `max|U3|=4.91895989e-5` length units, 따라서 `max|U3|/t=9.83791978e-5`다. 모든 표본 U는 0 이하이고 중심의 U1=U2로, 적용 하중 방향 및 x/y 교환 대칭과 일관된다. 최대 회전 성분은 `6.88441514e-6 rad`다. 이는 외부 reference 자체의 관찰이며 FESA 응답 검증이 아니다. 동역학에서 개별 자유도의 가속도·반력·변위 부호를 하중 부호만으로 일률 강제하지 않는다.
## Recovery 수정 전·후 검산
Reference는 중심 주변 9 nodes만 제공한다. [계약](reference-model.md)에 기록된 `dt/T1≈7.4567`과 위 작은 회전 때문에 transient phase 정확도·전판 모드·큰 회전 관성·stress/V/A/반력/에너지에는 coverage가 없다. 외부 일치는 Abaqus 내부 요소·질량·시간적분 동등성의 근거가 아니다.
Plane-stress `C=E/(1−nu²)[[1,nu,0],[nu,1,0],[0,0,(1−nu)/2]]`로 모든 101 frames/element/GP를 검사했다. `N=t C epsilon0`의 `max|차이|/(max|좌변|+max|우변|)`는 `2.04358e-16`이다. 수정 전 `M=(t³/12)C kappa` 대조의 같은 metric은 `0.333333333333334`로 저장값/예상값이 2였다. 수정 후에는 최대 절대차 `1.45519152e-11` F, 같은 symmetric relative metric `1.94601128e-16`으로 일치한다.
완료 HDF5에서는 기존 N2/N6에 따라 `I+f_int−F`, constrained selector 반력, `Σ(F+R)−Pdot`, current-arm spatial moment 평형을 확인해야 한다. `T/Uphys/Udrill`의 비음성·규모, `W=F·(q−q0)`, energy defect 정의, constrained exact zero, 물리 strain/stress 회복과 대칭도 확인 대상이다. `Udrill`을 물리 stress에 합치거나 `A`를 물리 관성/운동에너지에 쓰면 안 된다. 현재 이 전판 결과는 미검토 상태다.
Frame1, internal element `12`(0-based; source `Part-1-1`, element label `13`), GP2에서 `kappa11=kappa22=−1.72598199555e-5` L^-1이다. `t=.5,E=2.1e11,nu=.3`이면 `M11=M22=−53936.9373610` F다. 수정 전 저장값은 `−107873.8747221` F였고 수정 후 `−53936.93736103468` F로 일치한다. 같은 점의 `S11(bottom,middle,top)=(795234.504841,−499254.790420,−1793738.488372)` F/L²에서 독립 두께 moment `t²(S_top−S_bottom)/12`도 약 `−53936.93736` F다. Source identity는 HDF5 `/model/elements`의 해당 행으로 정한다.
## 열람 evidence와 잔여 위험
전 frame의 face stress 차분 적분과 수정 M의 최대 절대차는 `4.07217431e-6` F, 위 symmetric relative metric은 `1.93401205e-10`이다. 한쪽 `max|M|`만 분모로 쓰는 [main audit](../../.harness/build/hht-numerical/reference-recovery-audit-20260927.json)의 metric은 `3.86802409e-10`으로 동일 차이를 표현한다. 고 E·작은 strain에서 별도 평가된 face stress의 차감은 curvature 대조보다 민감하다. **Face identity가 전역 `1e-12`로 일치한다고 주장하지 않는다.** 수정 전 2배 오류 해소와 유한정밀도 차감 차이를 구별한다.
- [stable kernel 로그](../../.harness/build/hht-numerical/focused-stable-kernel.log), [exact-constraint 로그](../../.harness/build/hht-numerical/focused-exact-constraint.log), [optimized 로그](../../.harness/build/hht-numerical/focused-optimized.log), [Debug 후속 로그](../../.harness/build/hht-numerical/focused-debug-complete.log).
- [C04a Decimal80](../../.harness/build/hht-numerical/c04a-decimal-reduction.json).
- [원본 INP](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp), [원본 CSV](<../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv>), [진행 중 reference 로그](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_log.txt): 초기 검토 snapshot은 increment 8 accepted까지이며 이후 실행 완료를 뜻하지 않는다.
Generalized strain은 midsurface 값이 아니라 두께 평균/moment다. 따라서 `C epsilon0`와 middle stress의 작은 차이, top/bottom 평균과 middle stress의 작은 차이를 오류로 판정하지 않았다. 최대 membrane strain `5.07413e-6`, curvature `1.72598e-5` L^-1, transverse shear strain `4.28336e-6`, stress `1.79377197e6` F/L²는 작은 탄성 변형률 규모와 일관된다. Numerical drill이 physical stress에 포함됐다고 단정할 근거는 없다.
잔여 위험은 실제 shell의 유한회전 DAE 정확도, nonlinear energy/momentum 수렴, 전판 물리 평형·recovery 및 필수 reference 미완료다. C09–C11의 전체 실패 보존/결정론/rigid-motion coverage와 구성된 build/CTest도 해당 실행 보고서에서 확인해야 한다. 기존 기준을 완화하거나 새 acceptance gate를 만들지 않았다. 본 문서는 release 승인 문서가 아니다.
## C08 및 제한 evidence
[9월 26일 C08 diagnostic 로그](../../.harness/build/hht-numerical/c08-diagnostic-20260926.log)는 195745 ms에 1 PASS/2 FAIL로 종료해 [이전 로그](../../.harness/build/hht-numerical/c08-optimized.log)의 실패를 재현했다. C08a pointwise 독립 volume force/power/momentum은 최대 회전 `.54757231145` rad에서 PASS다. 시간 이력의 acceleration 차수/오차 실패와 finest N7 noise 분리 미달은 별도로 남는다.
C08b finest q_u/q_phi/v_u/v_phi/a_u/a_phi self-difference는 `(5.54743e-6,1.38701e-4,1.77613e-4,.0115434,.0119796,.868939)`다. q_u 외 채널은 finest `1e-4`를 넘는다. 최대 회전 약 `.27266` rad로 finite-rotation 범위는 도달했다. Energy/L error finest `9.55904e-7/4.29749e-7`, 마지막 refinement 비율 `.248198/.250140`은 C08b bounds와 일치한다. P error는 `3.85047e-14→4.82500e-14→2.00403e-13`으로 작지만 감소 조건에 실패했다. Roundoff 수준이라는 관찰로 승인 감소 조건을 면제하지 않는다. Finest hidden v/a defect `1.46403e-6/.00158291`은 진단량이며 N2 tolerance에 임의 대입하지 않는다.
후속 [회복 후보 probe](../../.harness/build/hht-numerical/c08-recovery-probe-20260926.log)는 3 tests/1 PASS/2 FAIL이며, [C08a split 수정 실행](../../.harness/build/hht-numerical/c08-recovery-split-spectrum-20260927.log)은 2 tests/1 PASS/1 FAIL이다. C08a recovered angular-a finest 최대오차 `1.005829141075e-4`, 마지막 두 raw 차수 `1.77942349/1.99162617`은 기존 bounds를 모두 충족하지 않는다. 수정된 split의 finest null/physical maximum은 `4.64641213e-7/1.00582661e-4`로 physical complement가 지배한다. 최초 probe의 C08a split=0은 loop 누락 diagnostic이므로 근거로 사용하지 않는다.
C08b recovered angular-a self-difference는 `.846306569/.881654308/.982191000/.868938661`로 수렴하지 않는다. Finest physical/null maximum은 `.868938153/.00286332558`이다. q/v를 유지하는 null-only recovery로 이 physical complement 오류가 해소되지 않는다는 근거다. Maximum들은 서로 다른 node/time일 수 있어 제곱합으로 합치지 않는다. Post-hidden2 ratio는 C08a finest `2.81779e-16`, C08b pair별 약 `6.06e-17..1.45e-16`으로 작아졌지만, [독립 수치 검토](implementation-numerical-review.md)의 explicit-time scale·recovery N7 noise qualification이 남는다. **Hidden2 개선은 시간 정확도·후보 채택 승인과 다르며 recovered-a order는 INCONCLUSIVE다.** 원 a_h의 FAIL은 그대로다.
기존 제한 근거: C01/C03/C04a/C04b scalar 시간수렴 약 2차, C07 alpha0 energy defect `1.14353e-13 <=1e-10`, 기본 alpha의 `omega*h=1000` spectral radius `.904763`은 analytic limit `.9047619048`에 접근한다. C05/C06 kernel/rotation PASS와 C07 physical inertial support reaction은 각각의 검사 범위만 지지한다.
## Evidence와 잔여 위험
- [원본 INP](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine.inp), [CSV](<../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine displacements.csv>), [완료 Newton 로그](../../reference/shellNL-dyn-meshfine/shellNL-dyn-meshfine_log.txt), [수정 후 비교 JSON](../../.harness/build/hht-numerical/reference-after-recovery-fix.json): U 101 families PASS/UR warnings 200. [수정 전 비교 JSON](../../.harness/build/hht-numerical/reference-comparison.json)의 precheck 441774 scalars, U RMS 최대 `.00227058974`, UR RMS 최대 `.02533113821` 근거도 U/UR 데이터 동일성 범위에서 유지된다. 원본 9 nodes의 U/UR projection만 비교한다.
- [Debug focused](../../.harness/build/hht-numerical/focused-debug-complete.log), [stable kernel](../../.harness/build/hht-numerical/focused-stable-kernel.log), [exact constraints](../../.harness/build/hht-numerical/focused-exact-constraint.log), [C04a Decimal80](../../.harness/build/hht-numerical/c04a-decimal-reduction.json), [독립 수치 검토](implementation-numerical-review.md).
- [Recovery 수정 후 optimized focused](../../.harness/build/hht-numerical/recovery-green-optimized.log): 13 tests PASS. 수정 전 HDF5를 소급하여 수정하지 않으며 공식 재생성 결과의 별도 검산은 위 SHA256과 수치로 구분한다.
실제 shell의 physical acceleration/무질량 좌표 시간 정확도와 C08b self-convergence는 미해결이다. 원본 굽힘 recovery 수정의 물리 대조는 완료했지만 HDF5에 없는 raw hidden vectors·regularity 조건수·N2-L 원 선형계는 이번 audit로 독립 확인하지 않았다. C09–C11 실패 보존·결정론·전체 rigid-motion coverage와 전체 Debug/CTest는 해당 실행 보고서에서 확인해야 한다. 완료 reference는 이 공백을 해소하지 않는다. 계약·수치 한계·artifact를 변경하지 않았으며 본 문서는 release 승인 문서가 아니다.