From c8f6619b638f2c56d50a858a837cd17ccc72dba8 Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Sun, 27 Sep 2026 00:14:42 +0900 Subject: [PATCH] test: capture HHT shell convergence failures and recovery probes --- HANDOFF.md | 38 +- docs/hht-implicit-dynamics/ADR.md | 9 + docs/hht-implicit-dynamics/FEATURED_AGENTS.md | 3 + docs/hht-implicit-dynamics/PRD.md | 11 +- .../formulation-acceleration-recovery.md | 142 ++ .../implementation-numerical-review.md | 172 ++ .../implementation-plan.md | 2 +- .../physics-evaluation.md | 85 +- tests/CMakeLists.txt | 1 + .../unit/analysis/hht_shell_physics_test.cpp | 1464 +++++++++++++++++ 10 files changed, 1891 insertions(+), 36 deletions(-) create mode 100644 docs/hht-implicit-dynamics/formulation-acceleration-recovery.md create mode 100644 tests/unit/analysis/hht_shell_physics_test.cpp diff --git a/HANDOFF.md b/HANDOFF.md index 5d3e9ae..1c29064 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -2,6 +2,17 @@ 최초 작성: 2026-09-22. 이 문서는 중단·재개를 위한 작업 상태 기록이다. **기능 완료 보고서가 아니며, 미실행·진행 중·INCONCLUSIVE를 PASS로 해석하면 안 된다.** 후속 작업은 아래 실행 일지에 덧붙인다. Feature의 공식 acceptance/checklist 원본은 [PRD](docs/hht-implicit-dynamics/PRD.md)다. +## 재개 시 우선 확인 — 2026-09-26 + +아래 §1–9는 최초 snapshot이며 최신 결과는 §10과 이 요약이 우선한다. 구현은 `f0dc42a`, 후속 인계 기록은 `97ffe46`까지 커밋되어 있다. + +- Original reference 100 increments 완료: U 101 families PASS, UR 경고 200건. 최초 HDF5는 새로 발견한 굽힘 단면력 복구 오류를 포함하므로 해당 필드는 수정 전 evidence다. +- C08 optimized 재현: `c08-diagnostic-20260926.log`, exit1, 3 tests/1 PASS/2 FAIL. Finest C08a angular-a error `5.67565924e-4`, 최대 시점 `t=.0390625`; 그 node의 null 성분 `5.58582318e-4`, physical 성분 `1.00582661e-4`. Null 보정만으로 통과한다고 단정할 수 없다. +- Decimal80 독립 cubic DAE 반례에서 v 2차/a 1차. 초기 A0만 변경해도 해결되지 않는다. 재현 코드와 선택지는 [독립 수치 검토](docs/hht-implicit-dynamics/implementation-numerical-review.md)에 있다. +- 사용자 결정: 정확도 요구를 유지하고 제약조건 기반 가속도 복구를 별도 정식화·검증한 뒤 채택 여부를 결정한다(HHT-ADR-011). Production history/output 의미를 아직 바꾸지 않는다. +- C08b grid 초기값·시간 대응·갱신 코드의 구체적 오류는 발견하지 못했다. 회전 q/v/a self convergence는 FAIL이며 원인 미확정. Roundoff 수준 P에 감소를 요구하는 판정 문제는 별개다. +- 굽힘 recovery `M=∫zS dz`의 두께 인자 하나 누락을 확인해 수정했다. 두께 .2/.5/2의 stress-face first moment 회귀는 수정 전 FAIL, 수정 후 optimized 관련 13 tests PASS. 내부 force/tangent에는 영향이 없다. Debug/원본 재생성은 진행 중이며 최종 결과는 §10에 이어 쓴다. + ## 1. 사용자 요청과 권한 사용자는 HHT implicit 동적 해석의 requirement/research, formulation, numerical review 이후 **consistent mass**를 선택했고, 이어서 **I/O definition, implementation, physics evaluation gate를 모두 수행**하도록 요청했다. 이후 **Git에 커밋하면서 진행**, 이번에는 **HANDOFF.md 작성 후에도 계속 진행하며 추가 결과를 기록**하도록 요청했다. @@ -207,11 +218,11 @@ PowerShell helper의 `-B`는 named parameter로 잘못 bind될 수 있어 위 ar 7. Feature PRD·implementation report·numerical/physics reports를 실제 결과로 갱신한다. 이전의 전체 NOT RUN 기록은 이력과 현재 상태를 구별한다. C04a qualification은 유지한다. 8. 최종 diff/format/links/reference hashes를 확인하고 작업 파일만 commit한다. 생성 HDF5/log/build/개인 helper는 commit하지 않으며 push하지 않는다. -## 10. 追加作業記録 +## 10. 추가 작업 기록 -この節に時刻、変更、実行コマンド/結果、commit、残件を追記する。途中状態を最終PASSで上書きしない。 +이 절에 시각, 변경, 실행 명령/결과, commit, 잔여 작업을 추가한다. 중간 상태를 최종 PASS로 덮어쓰지 않는다. -- 2026-09-22 初回記録: 本文のsnapshot作成。Reference16/100受理、最新Debug focused実行中。Comparator41testsのmain再実行PASSを確認。今後も作業を継続する。 +- 2026-09-22 최초 기록: 본문 snapshot 작성. Reference 16/100 accepted, 최신 Debug focused 실행 중. Comparator 41 tests의 main 재실행 PASS를 확인했고 작업을 계속한다. - 2026-09-22 후속 확인: 독립 physics reviewer가 `physics-evaluation.md` 초안을 작성했다. 최신 Debug focused는 68 tests 중67 PASS/1 C04a INCONCLUSIVE SKIP으로 종료했다. Main은 다음 명령에서 종료코드와 summary를 직접 확인한다. C08 및 최종 reference 검증은 계속 PENDING이다. @@ -220,3 +231,24 @@ PowerShell helper의 `-B`는 named parameter로 잘못 bind될 수 있어 위 ar - 2026-09-22 구현 커밋: `f0dc42a`에 HHT core/state/writer/log/comparator와 검증된 테스트를 커밋했다. 이후 `hht_shell_physics_test.cpp`를 tests/CMakeLists.txt에 등록했다. C08 build/run 결과는 다음 기록에 추가한다. - 2026-09-22T21:41:48: C08 첫 Debug snapshot build PASS. 이후 owner가 C08a temporal fixture를 추가했고 optimized compile에서 GridEvidence.algorithmic_acceleration_gap 누락으로 실패했다. 테스트 파일 owner가 필드 위치 및 q_n 시작값을 수정 중이다. Production reference는75/100 accepted까지 확인했으며 최종 파일은 아직 기다린다. + +- 2026-09-22T21:47:38: **원본 reference 완료**. Optimized MSVC/MKL1/OMP1 실행 session70291 exit0. 101frames HDF5 생성 완료. `reference-comparison.json` precheck441774scalars PASS, U101families PASS, blocking_failure0, UR100frames의 row/RMS 경고200건. 비교 exit0은 UR 일치나 전체 물리 gate PASS를 뜻하지 않는다. HDF5 공식 경로는 §8 input의 lexical sibling `shellNL-dyn-meshfine_results.h5`. +- 후속 검증: C08a pointwise independent volume force/power/momentum 및 explicit-time hidden checks PASS(max phi=.547572rad). **C08a temporal FAIL**: finest angular/chart-a 전체 최대오차5.67565924e-4>1e-4, 마지막 두 차수1.02867/1.02897<1.8. 일부 finest rate는 N7 error/noise100배 분리도 미달(INCONCLUSIVE). C08b도 FAIL로 종료했다. 전체 C08 optimized는3tests/1PASS/2FAIL,136.265s. 세부 실패는 c08-optimized.log에 있으며 원인 분석 중이다. +- 독립 수치 검토의 원인 후보: massless prescribed coordinate z(t)의 A0=a0 startup은 `a1-z''(h)=h*(1/(6*beta*(1+alpha))-1)*z'''(0)+O(h²)`를 만들어 일반 nonzero jerk에서 최대시간 acceleration 오차가1차다. C08 phi'''(0)는0이 아니고 관측 first/late 오차 경향이 일치한다. 이 주장은 독립 scalar 재현·null/physical error 분해로 추가 확인 중이다. **허용값을 완화하거나 startup 물리 계약을 몰래 바꾸지 말 것.** 실제 알고리즘/acceptance 변경이 필요하면 프로젝트 사용자 결정 경계를 따른다. + +- 2026-09-26~27 재개: `fem-implementation-tdd`, 독립 numerical/physics review와 formulation을 재개했다. C08 driver의 initial state/grid/time mapping/history/update를 읽기 전용 대조했고 구체적인 시간 대응 오류는 찾지 못했다. `CheckUpdates` production 호출이 test driver에 없는 coverage 제한은 남는다. +- 수정/커밋: `7b700ab fix: restore thickness factor in shell bending resultants`; flat face stress moment oracle에서 thickness .2/.5/2 모두 수정 전 FAIL을 확인했다(`bending-moment-red.log`). 수정 후 optimized 관련13 tests PASS(`recovery-green-optimized.log`). `d465245 test: cover unloaded HHT free degree channels`는 전체 free/병진만 free/회전만 free의 exact-rest 3 variants를 추가했고 optimized PASS다. +- 사용자 선택을 HHT-ADR-011로 기록: 정확도 요구를 유지하고 별도 acceleration recovery 후보를 정식화·검증한 다음 채택 여부를 결정한다. `formulation-acceleration-recovery.md`와 독립 검토 NR-012/013을 작성했다. 시간적분 history/공식 HDF5/schema는 변경하지 않았다. +- 진단 fixture는 `a_rec=a_h+N*eta`를 원 frame과 분리해 저장한다. `c08-recovery-probe-20260926.log` 전체3 tests/1 PASS/2 FAIL, exit1. C08a split loop가 빈 analytic metadata를 순회해 false-zero를 출력한 문제는 vector size 기반으로 수정했으며 `c08-recovery-split-spectrum-20260927.log`에서 다시 실행했다(2 tests/1 PASS/1 FAIL). 첫 로그의 C08a null/physical split=0은 유효 evidence가 아니다; full error와 C08b는 별도 검토했다. +- 복구 후보 결과: C08a finest angular-a `1.005829141075e-4`, 마지막 두 차수 `1.77942349/1.99162617`; 승인 기준 미달. 재실행 split의 null `4.64641213e-7`, physical `1.00582661e-4`. C08b finest recovered angular-a self difference `.8689386613`, physical `.8689381530`; q/v 실패는 그대로다. Hidden2와 Mdeltaa의 작은 값은 대수 보정 근거이며 실제 정확도 통과가 아니다. C08a N3 exact denominator 및 recovery-specific N7 noise 평가가 남아 있으므로 채택하지 않는다. +- 초기 spectrum 진단: 54 DOF 원 M/K를 별도 test로 출력하고 알려진 UR3 9개를 static condensation했다. Physical mass Cholesky PASS, condensed K symmetry defect0. 최고 각진동수319.8401253, h=1/1024에서 omega*h=.31234387. `.harness/build/hht-numerical/c08b-initial-spectrum-20260927.json`에 raw eigenvalues와 grid별 값을 보존했다. 이는 initial linearized spectrum이며 nonlinear C08b 실패 원인 확정 또는 grid/tolerance 변경 승인이 아니다. +- 수정 후 원본 reference 재실행 exit0(session5757). `reference-after-recovery-fix.json` comparator exit0: 441774 scalars precheck, U101 PASS, UR200 warnings 유지. 원 INP/CSV SHA256은 §8과 동일하다. +- HDF5 대조: 수정 전 archive `reference-before-recovery-fix.h5`의 SHA256 `23bac93d1f7998b2f74a0f68767ae98a9899ee92c53f5170d08a814d3ee936d4`; 수정 후 공식 HDF5 `f07beddaa232abe314e20210534a243d6deaf1f677c598c64f9334428bbecb56`. 전체2033 datasets 중100개 noninitial section_resultant만 변경됐고 bending3 components는 정확히 기존의1/2, 나머지 모든 datasets는 bitwise identical이다. `reference-recovery-audit-20260927.json`에 기록했다. 직접 face stress 차분에는 tiny strain/high stiffness cancellation이 있어 별도 relative error3.868e-10을 기록했으며 1e-12 PASS로 주장하지 않는다. +- 전체 Debug Harness는 source 수정 전 snapshot으로 시작했다(session16398, `full-debug-20260926.log`). C08a FAIL 재현 후 장시간의 stale C08b만 main이 중단했다. CTest는 이를 non-pass로 기록하고 다른 검사를 계속하므로 전체 PASS로 해석하면 안 된다. 최신 core/recovery/C09/spectrum Debug build는 exit0이며 targeted run(session3213, `recovery-green-debug-20260927.log`)의 종료 결과를 아래에 추가한다. + +- 2026-09-27 최신 Debug targeted exit0: `recovery-green-debug-20260927.log`,14 tests PASS/28.5s. Whole Debug snapshot은 exit1,475tests 중3failed/1skipped였다. C08a actualFAIL, C08b main중단, 기존 InpDomainMapping의 Dynamic-unsupported 기대가 실패 원인이다. 원 CTest 상세는 `full-debug-stale-snapshot-ctest.log`로 보존했다. +- Legacy mapper regression은 “other-procedure” fixture를 이제 지원하는 Dynamic 대신 미지원 Buckle로 바꿨다. 승인된 dynamic rejection/acceptance는 기존 HHT 전용 tests가 검증한다. 최신 전체 Debug build exit0 후 C08 temporal2개만 명시 제외한476test CTest를 실행 중이다(session11819, `regression-debug-excluding-c08-temporal-20260927.log`). 이것은 전체 solver gate PASS의 대체가 아니다. +- Physics reviewer가 새 HDF5를 독립 확인했다. 모든101frames M과 `t³Cκ/12`의 최대 symmetric relative error `1.94601e-16`, absolute `1.45519e-11`로 굽힘 오류 해소를 확인했다. Source/CSV/reference를 보정한 결과가 아니라 solver 재실행 결과다. `physics-evaluation.md` HHT-PHY-005는 해소하되 C08와 feature gate는 미통과로 유지했다. +- Spectrum 독립 재현은 original K/M eigenpair residual `2.63e-15`, mass orthogonality `8.79e-15`, analytic6 rigid-field K-action `2.28e-17`을 확인했다. Negative roundoff eigenvalues를 clamp하지 않았다. v=0 rest elastic spectrum이므로 실제 C08b finite initial velocity의 convective Jacobian/모드 가진/비선형 trajectory를 검증한 것은 아니다. + +다음 담당자가 할 일: (1) 최신 CTest 종료코드와 FAIL/SKIP를 확인해 이 로그에 추가, (2) 회복 후보를 production에 넣지 말고 C08b physical q/v/a 차이의 시점·공간·모드별 원인을 분리, 필요하면 추가 fine-grid를 diagnostic으로 조사하되 기존 지정 grid FAIL은 보존, (3) C08a recovery-specific N7 및 정확한 N3 scale 검증을 보충, (4) C09–C11 잔여 항목을 PRD 원본과 대조, (5) 정식화/정확도/출력 계약 채택은 구체적인 통과·실패 evidence를 제시한 뒤 결정한다. 현재 candidate는 검증 기준을 충족하지 않아 미채택이다. diff --git a/docs/hht-implicit-dynamics/ADR.md b/docs/hht-implicit-dynamics/ADR.md index 7c56df2..ef2bd6a 100644 --- a/docs/hht-implicit-dynamics/ADR.md +++ b/docs/hht-implicit-dynamics/ADR.md @@ -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 오차는 별도로 해결해야 하며 채택은 검증 결과를 제시한 뒤 결정한다. diff --git a/docs/hht-implicit-dynamics/FEATURED_AGENTS.md b/docs/hht-implicit-dynamics/FEATURED_AGENTS.md index a6efd0e..1a6cbfd 100644 --- a/docs/hht-implicit-dynamics/FEATURED_AGENTS.md +++ b/docs/hht-implicit-dynamics/FEATURED_AGENTS.md @@ -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와 구별한다. diff --git a/docs/hht-implicit-dynamics/PRD.md b/docs/hht-implicit-dynamics/PRD.md index 8223c0c..b22a220 100644 --- a/docs/hht-implicit-dynamics/PRD.md +++ b/docs/hht-implicit-dynamics/PRD.md @@ -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로 갱신한다. diff --git a/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md b/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md new file mode 100644 index 0000000..9a5e013 --- /dev/null +++ b/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md @@ -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가 아니다. diff --git a/docs/hht-implicit-dynamics/implementation-numerical-review.md b/docs/hht-implicit-dynamics/implementation-numerical-review.md index c9a91ec..098c1e2 100644 --- a/docs/hht-implicit-dynamics/implementation-numerical-review.md +++ b/docs/hht-implicit-dynamics/implementation-numerical-review.md @@ -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