test: capture HHT shell convergence failures and recovery probes
This commit is contained in:
@@ -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와 구별한다.
|
||||
|
||||
@@ -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 승인 문서가 아니다.
|
||||
|
||||
Reference in New Issue
Block a user