diff --git a/.codex/agents/implementation-agent.toml b/.codex/agents/implementation-agent.toml index 1bfeb71..bb89e93 100644 --- a/.codex/agents/implementation-agent.toml +++ b/.codex/agents/implementation-agent.toml @@ -1,7 +1,6 @@ name = "implementation-agent" description = "Implements assigned structural FEM solver changes with behavior-focused verification." sandbox_mode = "workspace-write" -model = "gpt-5.6-terra" model_reasoning_effort = "medium" developer_instructions = """ diff --git a/docs/business-rules.md b/docs/business-rules.md index 3189b29..0f22612 100644 --- a/docs/business-rules.md +++ b/docs/business-rules.md @@ -60,8 +60,9 @@ free 성분은 평형 잔차다. 모든 자유도가 지정된 유효한 모델 `EIGENSOLVER=LANCZOS`는 실제 FEAST 계산과 구별한다. 질량 영공간에 임의 질량을 더해 유한 모드로 바꾸지 않는다. -HHT 동해석은 consistent kinetic mass를 사용한다. 고유치 해석의 lumped 선택을 그대로 -가져오지 않는다. 물리적 endpoint 가속도, 회전벡터의 시간 미분, 공간 각가속도, +고유치와 HHT는 lumped mass를 사용한다. MITC4 HHT는 nodal kinetic measure의 +일관 관성력·접선·운동에너지를, Hex8은 BC 축소 전 reference matrix 행합을 사용한다. +물리적 endpoint 가속도, 회전벡터의 시간 미분, 공간 각가속도, 알고리즘 보조 가속도를 구별한다. 어느 하나의 reference 일치로 다른 양의 시간수렴을 통과했다고 판정하지 않는다. 현재 shell 시간수렴에는 미해결 문제가 있다. diff --git a/docs/contracts.md b/docs/contracts.md index 2af4fde..03118f9 100644 --- a/docs/contracts.md +++ b/docs/contracts.md @@ -99,7 +99,7 @@ modal response로 계산하지 않는다. Density는 `rho` 또는 `rho,`의 상 HHT는 `h,T` 또는 `h,T,` 한 row를 받는다. 양의 정수 N에 대해 `double(N)*h == T`, `N<=INC`를 만족해야 하며 마지막 증분을 줄이거나 시간 tolerance로 맞추지 않는다. STEP의 INC 기본값은 100이다. 계수는 `alpha=-0.05,beta=0.275625,gamma=0.55`, -질량은 consistent-kinetic이다. BC는 전체 시간에 exact 0, CLOAD는 DOF 1~3의 일정한 +Shell 질량 metadata는 `nodal-lumped-kinetic`이다. BC는 전체 시간에 exact 0, CLOAD는 DOF 1~3의 일정한 global force만 지원한다. 초기 q/v는 0이고 전체 STEP 하중이 `0+`부터 적용된다. 비영 초기조건, damping, amplitude, follower/distributed load와 공개 계수 변경은 현재 미지원이다. diff --git a/docs/engineering-notes.md b/docs/engineering-notes.md index 2eee34e..1472f0b 100644 --- a/docs/engineering-notes.md +++ b/docs/engineering-notes.md @@ -27,8 +27,9 @@ Instance·element·endpoint node·component를 함께 비교해야 한다. ## 질량·영공간과 source 옵션 -고유치의 derived lumped mass와 HHT의 consistent kinetic mass는 승인 목적이 다르다. -두 절차가 같은 shell을 쓴다는 이유로 질량 구현을 한 가지로 치환하지 않는다. 질량 +2026-10-11 승인에 따라 고유치와 HHT에 lumped mass를 사용한다. Shell HHT의 nodal +kinetic measure는 관성력·접선·운동에너지·운동량에도 적용하며 유한회전 block을 단순 +대각화하지 않는다. Hex8은 요소 전체 행합을 계산한 뒤 BC를 축소한다. 질량 영공간이 있으면 analytic null과 free 공간의 교집합을 확인하고 임의 drilling inertia를 더하지 않는다. 부분 회전 구속을 full clamp로 바꾸는 것도 같은 모델이 아니다. diff --git a/docs/hex8-structural-analysis/ADR.md b/docs/hex8-structural-analysis/ADR.md index 8100d1d..da21bcd 100644 --- a/docs/hex8-structural-analysis/ADR.md +++ b/docs/hex8-structural-analysis/ADR.md @@ -15,6 +15,7 @@ Total Lagrangian–St. Venant–Kirchhoff의 energy/internal force/material+geom ## HEX8-ADR-002 — Constant reference consistent mass +**대체 이력:** 2026-10-11 HEX8-ADR-010이 질량 선택을 대체했다. 아래는 당시 승인 기록이다. **선택:** M은 기준 밀도와 형상의 rho NiNj I 적분이며 eigen과 linear/nonlinear HHT에 동일하게 사용한다. **영향:** 전역 sparse generalized K/M가 필요하다. Shell nodal whitening·null-space 처리나 row-sum lumping을 호환 경로로 쓰지 않는다. Solid에는 회전/convective 관성이나 drilling이 없다. @@ -72,6 +73,7 @@ endpoint·HDF5/외부 비교·전체 회귀를 진행한다. 승인과 수렴 ## HEX8-ADR-009 — Reference-volume 평균 Green trace energy +**대체 이력:** 2026-10-11 HEX8-ADR-010이 consistent M 보존 부분만 대체한다. 평균 energy 결정은 유지한다. **승인:** 2026-10-10 사용자는 [체적 차이와 변경안](reference-discrepancy-proposal.md)의 B: 체적 평균 energy 도입 후 전체 재검증을 선택했다. **선택:** 선형·비선형 정적, unloaded frequency, 선형·비선형 HHT 모두 같은 요소 energy를 @@ -86,3 +88,17 @@ coupling을 포함한다. 평균 determinant/Fbar/로그변형률 재료식은 **검증:** 한 선형 private 후보의 원본 일치와 독립 변분 검토는 근거이며 production PASS가 아니다. 새 kernel/절차·시간/공간수렴·공식 출력·필수 원본·전체 MSVC Debug 회귀를 다시 검증한다. 기존 pointwise 구현의 통과·실패 기록은 과거 evidence로 보존하고 변경본에 승계하지 않는다. + +## HEX8-ADR-010 — 고유치·HHT reference row-sum lumped mass + +**승인:** 2026-10-11 사용자 “앞으로 고유치 해석과 HHT 동해석에서 질량 행렬은 lumped mass로 계산”. +**선택:** Full reference consistent24×24 M_C를 기존8점 적분으로 계산한 후 각 row sum을 +대각에 둔 M_L을 eigen과 선형/비선형 HHT에 공통 사용한다. BC restriction 이전 요소 전체 +행 합을 계산한다. Free block만 lump하거나 warped 요소의 절점 질량을 rho*V/8로 치환하지 않는다. +**영향:** HEX8-ADR-002 및 ADR-009의 consistent M 보존 부분만 대체한다. 평균 체적 energy, +high+low state/force/rates/gate·HHT 계수·schedule·100회·strict gate·외부 tolerance·출력 layout은 +유지하며 metadata는 `lumped-reference`다. 관성력·T·P·L와 rates에도 같은 M_L을 사용한다. +**검증:** 질량·대각/SPD·warped 독립 적분·Jensen·BC 전후의 차이·원래 pencil residual/Gram/count와 +HHT/반력·시간수렴·공식 readback·필수 원본5개·전체 Debug 회귀를 새로 확인한다. 기존 consistent +PASS/FAIL 및 private 후보의 일치는 변경본 production 통과로 승계하지 않는다. +현재 진행 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. diff --git a/docs/hex8-structural-analysis/FEATURED_AGENTS.md b/docs/hex8-structural-analysis/FEATURED_AGENTS.md index b26a741..b48e46e 100644 --- a/docs/hex8-structural-analysis/FEATURED_AGENTS.md +++ b/docs/hex8-structural-analysis/FEATURED_AGENTS.md @@ -1,7 +1,7 @@ # Hex8 구조해석 작업 지침 Feature ID: `hex8-structural-analysis`. 사용자 승인: 2026-10-08 ready 문서 승인 및 go 실행 요청. -개인 연구용 FESA에 reference8점 deviatoric·체적 평균 energy Hex8의 선형/기하비선형 강성·일관 질량과 +개인 연구용 FESA에 reference8점 deviatoric·체적 평균 energy Hex8의 선형/기하비선형 강성·reference row-sum lumped 질량과 static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완료를 구분한다. 상위 기준은 [프로젝트 지침](../../AGENTS.md), [공통 PRD](../PRD.md), @@ -15,6 +15,7 @@ static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완 | [io](io.md) | 입력 의미·typed 경계·공식 결과 metadata/units·진단 | | [numeric controls](numeric-controls.md) | 수치 scale·zero branch·tuning·독립 검사 기준 | | [reference model](reference-model.md) | read-only 원본 inventory·quantity/key/point/time mapping | +| [reference mass investigation](reference-mass-investigation.md) | 원본 C3D8 질량 설정·공식 문서·K/M 분리 진단 및 채택 경계 | | [verification](verification.md) | 비교 도구 사용·공식 원본 비교·Python 검사 결과와 한계 | | [reference discrepancy proposal](reference-discrepancy-proposal.md) | 승인된 B 체적 변경안·과거 원본 불일치와 별도 선형 후보 관측 | | [numerical review](numerical-review.md) | 작성자와 독립된 정식화/controls 검토의 결과 | @@ -22,6 +23,9 @@ static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완 | [precision proposal](precision-proposal.md) | 승인된 내부 정밀도 변경안·결과 의미·구현 전 검증 범위 | | [precision formulation](precision-formulation.md) | HHT 전체 high+low 상태·동일 gradient 미분·산술 범위·반올림 출력 계약 | | [physics review](physics-review.md) | 소규모 시간수렴·반력·운동량·에너지의 독립 평가와 coverage 한계 | +| [lumped 채택 evidence](lumped-mass-adoption.md) | 현행 질량의 원본5개·전체 회귀·test-only 후속 수정 결과 | +| [현행 물리 평가](physics-evaluation.md) | lumped 변경본 원본 모드·수지 검토와 최종 미해결 범위 | +| [최종 인계](final-handoff.md) | 최신 bounded 검사·기존 원본 재대조·source 동일성·성능 최적화 후 전체 검증으로 넘길 범위 | 메인이 문서·공유 연결·완료 판단을 소유한다. Kernel owner는 Hex8 local 계산/복구 payload와 직접 consumer를, semantic owner는 Domain/parser/3성분 DOF/load/assembly를 소유한다. @@ -42,3 +46,8 @@ positive Jacobian을 보수적으로 인증하고 uncertain geometry/trial을 평가를 거친다. 일반 승인 작업마다 승인 gate를 추가하지 않는다. Physics·영속 schema·acceptance 변경 또는 해결되지 않은 필수 reference 충돌만 메인이 사용자에게 근거와 영향을 전달한다. Dev 통합·push/release는 별도 명시된 사용자 결정이다. + +2026-10-13 현재 인계는 [최종 인계](final-handoff.md)를 따른다. 사용자는 장시간 +전체 검증을 수행하지 않도록 요청했다. 이번 관련91개·Python96개 및 저장된 +원본5개 결과 재대조를 전체 통과로 확대하지 않는다. Hex8 구현·검토·인계와 +최적화 이후의 최신 전체 통합 완료 판정은 구분한다. diff --git a/docs/hex8-structural-analysis/PRD.md b/docs/hex8-structural-analysis/PRD.md index 536629b..c68663b 100644 --- a/docs/hex8-structural-analysis/PRD.md +++ b/docs/hex8-structural-analysis/PRD.md @@ -1,19 +1,19 @@ # Hex8 구조해석 제품 요구사항 -Feature ID: `hex8-structural-analysis`. 작성일: 2026-10-08. 상태: 사용자 승인된 구현 계약; 검증 완료 대기. +Feature ID: `hex8-structural-analysis`. 작성일: 2026-10-08. 상태: 구현·필수 원본5개 비교·검토·인계 완료; 사용자 요청으로 장시간 전체 검증을 유예하여 최종 통합 완료 판정 보류. 기준 저장소: `dev`, `2382d3af7ef335bef216d963540f2e9bd2befd68`. ## 목적과 선택 이유 -개인 연구용 FESA에 8절점 육면체의 선형 강성, 기하비선형 내력·접선 강성, 일관 질량을 +개인 연구용 FESA에 8절점 육면체의 선형 강성, 기하비선형 내력·접선 강성, reference row-sum lumped 질량을 구현하고 입력부터 정적·고유치·동해석과 HDF5 결과까지 연결한다. 요소 행렬 계산만으로 완료하지 않는다. 기존 프로젝트를 유지하며 새 프로젝트 기준을 재작성하지 않는다. 첫 구현은 큰 회전·작은 탄성 변형률을 대상으로 한다. 전체 8점 적분과 Total Lagrangian St. Venant–Kirchhoff의 deviatoric 항과 요소 평균 Green trace 체적 energy를 선택해 에너지·내력·접선의 일관성을 독립 검증한다. 2026-10-10 사용자 B 승인으로 최초 pointwise -체적 항을 대체했으며 [ADR-009](ADR.md)를 따른다. 일관 질량은 -고유치와 동해석 모두에 사용한다. 집중 질량이나 안정화로 계산 결과를 맞추지 않는다. +체적 항을 대체했으며 [ADR-009](ADR.md)를 따른다. 2026-10-11 승인 [ADR-010](ADR.md)에 따라 full reference element M의 행 합 대각 질량을 +고유치와 동해석 모두에 사용한다. 허용값이나 안정화로 계산 결과를 맞추지 않는다. 일반 등매개 육면체를 지원하며 체적 projection의 안정성·conditioning 및 남은 굽힘 잠김 한계를 검증·공개한다. 초기 합의의 일정 동하중에 더해, 제공된 reference의 ramp를 처리하도록 구간별 선형 @@ -119,11 +119,13 @@ F64와 paired 경로 모두 실제 relative kinematics의 같은 derivative인 G 계산하며 유한차분 접선을 production 계산으로 사용하지 않는다. 강체 유한회전의 zero strain/energy, 에너지 gradient·내력 tangent, 좌표 공변성, 선형극한을 검사한다. -### FEM-REQ-HEX8-007 — 일관 질량 +### FEM-REQ-HEX8-007 — Reference row-sum lumped 질량 -\((M_e)_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_b\det J_{0g}\)를 사용한다. +\((M_C)_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_b\det J_{0g}\)를 먼저 full24×24로 계산하고, +\((M_L)_{ai,bj}=\delta_{ab}\delta_{ij}\sum_c(M_C)_{ai,ci}\)를 사용한다. 기준 형상과 밀도로 정해져 변형·시간에 따라 바뀌지 않으며 회전 자유도·drilling 관성은 없다. -고유치와 동해석은 같은 전역 일관 M을 사용한다. Row-sum lumping·nodal block 치환은 금지한다. +고유치와 동해석은 같은 전역 lumped M을 사용한다. 행 합은 BC restriction 전에 계산하며 +M_C의 free block만 행 합하거나 warped 요소를 rho*V/8로 대체하지 않는다. 대칭 양정성·각 병진 방향 총질량·좌표 회전·독립 적분을 검증한다. 전역 행렬은 sparse로 조립한다. ### FEM-REQ-HEX8-008 — 경계와 집중력 @@ -256,7 +258,7 @@ mode vector를 물리 응답 변위/응력으로 복구하지 않는다. `analysis_procedure`로 식별한다. 값 집합은 `linear-static`, `nonlinear-static-full-newton`, `linear-frequency`, `hht-linear-dynamics`, `hht-nonlinear-dynamics`다. `element_formulation=FESA-Hex8`, `integration_rule=gauss-2x2x2`, -`mass_formulation=consistent-reference`, source step 이름·입력 byte identity·단위 의미를 보존한다. +`mass_formulation=lumped-reference`, source step 이름·입력 byte identity·단위 의미를 보존한다. Model row의 source instance/label은 기존 model identity 의미를 유지하되 Solid topology/section 분기를 추가한다. Node row는 Domain 선언 순서다. `/model/nodal_constraint_mask`는 U8[N,3], @@ -330,7 +332,8 @@ Consistent M으로 \(T=v^TMv/2\), \(U=\sum W_g\det J_{0g}\)를 계산한다. `energy_balance_error=T+U-T0-U0-Wext`다. 현재 BC는 동적 exact0여서 support work=0이다. HHT의 알고리즘 소산과 quadrature에 따른 work 오차를 설명하며 각 frame exact conservation을 강제하지 않는다. Alpha0 내부 검사에서는 선형 무하중 보존을 독립 확인한다. -Moment와 angular momentum은 현재 위치와 consistent interpolation의 kinetic 식으로 평가한다. +Moment와 angular momentum은 현재 절점 위치와 reference lumped M의 kinetic measure로 평가한다. +T=0.5*v^T*M_L*v, P=sum(m_a*v_a), L=sum(x_a×m_a*v_a) 및 rates를 같은 measure로 계산한다. ### FEM-REQ-HEX8-019 — 실패와 진단 @@ -380,7 +383,7 @@ numeric controls로 정하고 독립 검토한다. 외부 5%/1%를 내부 정확 | 비선형 정적 | `hexa_nonlinearstatic.inp` | 동일 suffix: 완료 load-factor frame의 U·RF·적분점 Cauchy S | | 선형 동적 | `hexa_dynlinear.inp` | `hexa_dynlinear_U.csv`: initial 포함 101 frame U1–3 전체 | | 비선형 동적 | `hexa_dynnonlinear.inp` | `hexa_dynnonlinear_U.csv`: initial 포함 101 frame U1–3 전체 | -| Frequency | `hexa_freq.inp` | 원본 modal Value 결과 아직 없음. 사용자 준비 자료로 최저10 modes를 비교해야 함 | +| Frequency | `hexa_freq.inp` | 사용자 제공 `hexa_freq.txt`의 최저10 modal Value(고유치 λ)를 비교 | 현재 inventory는 442 nodes, 300 elements다. 정적 U/RF 각442행, 수정된 정적 S 각2400행의 `IntPt=1..8`, 동적 U 각각44642행이다. 기존 elemental-nodal 응력 CSV의 위치 계약을 @@ -438,6 +441,21 @@ Generalized sparse FEAST의 공개 진입점은 ## 현재 checklist +- [x] 2026-10-11 HEX8-ADR-010의 full reference row-sum M: BC 이전 행 합·warped oracle·질량/에너지·고유치/HHT/출력 검증. +- [x] Lumped 변경본 독립 numerical/physics 검토와 필수 원본5 case 재검증. [채택 evidence](lumped-mass-adoption.md): 정적2·고유치 Debug, 동적2 production Release. +- [x] Lumped 변경본 전체 MSVC Debug CTest의 자연 종료·판정: 789개 native8(784 PASS·4 FAIL·1 SKIP). Stale factory/overflow test 수정 후 공식 focused 2 PASS; C08a 정확도·C08b 새 회전 예외 및 C04a SKIP은 미해결로 구분. [채택 evidence](lumped-mass-adoption.md). +- [x] 필수 최저10 modal Value 불일치 해결: 변경본 Debug 실행·원본 비교 모두 native0, 최대 상대차 `0.0019610496%`. 기존 consistent의7/10 FAIL은 아래 과거 이력으로 보존한다. +- [x] 최종 변경 diff의 독립 검토와 후속 개발 인계: 공용 mass consumer·BC partition·관성/반력·출력 metadata 연결에 새 코드 finding0. [최종 검토와 인계](lumped-mass-adoption.md#최종-검토와-인계)에 완료 경계와 C08b 후속 조사 조건을 기록했다. +- [x] 2026-10-13 장시간 전체 검증을 제외한 후속 확인·인계: 현재 Debug 관련91 PASS·Python96 PASS·보존된 원본5개 재비교 PASS. [최종 인계](final-handoff.md)에 source 동일성·독립 검토·최적화 이후 검증 범위를 구분했다. +- [ ] FEM-REQ-HEX8-024 최종 완료 판정: 과거 C08b runtime FAIL은 후속 승인된 초기 Newton 정책에서 해소됐고 ADR-018의 C09·공식 Release C08a7도 통과했다. 최신 C08b·Shell 원본·전체 Debug는 사용자 중단이며 전체 검증은 성능 최적화 후 수행한다. 기존 전체802의799 PASS·C08 정확도 FAIL2·C04a SKIP1 이력은 보존하고 최신 source의 전체 통과로 승계하지 않는다. [최종 인계](final-handoff.md)를 따른다. + +## 이전 구현의 검증 이력 + +이하 체크박스는 해당 시점의 수행·미완료 기록이며 현재 checklist가 아니다. +기존 modal FAIL을 새 질량의10개 PASS로 소급 변경하지 않는다. + +아래 체적 평균 구현의 기존 체크와 수치는 consistent M 당시 이력이며 lumped 변경본 통과로 승계하지 않는다. + 2026-10-10 사용자 B 승인은 HEX8-ADR-009의 체적 평균 energy를 다섯 절차에 적용하고 전체 재검증하는 변경이다. 아래 관련 항목은 변경본에서 다시 확인한다. 이어지는 이전 pointwise 구현의 실행 기록은 과거 evidence이며 변경본 PASS로 승계하지 않는다. @@ -455,9 +473,9 @@ HHT 식·기준 consistent M·입력·고정 schedule·100회·Si/exact-zero· - [x] 체적 평균 선형·비선형 HHT u/v/physical a·시간수렴·수지 내부 검증 - [x] 체적 평균 공식 HDF5/CLI/self-check/실패 final 보존 내부 검증 - [x] 정적2·동적2 원본 필수 family 비교 PASS -- [ ] 사용자 원본 최저10 modal Value 제공 및 필수 비교 PASS +- [ ] 사용자 원본 최저10 modal Value 필수 비교 PASS — 원본 제공 완료, 7/10 family FAIL - [x] 최신 전체 MSVC Debug build/CTest·기존 baseline 대조 완료 -- [x] Independent numerical/physics blocker0·범위/한계/evidence 기록 완료 +- [ ] 최종 필수 고유치 불일치 해결 및 independent numerical/physics blocker0·범위/한계/evidence 완료 체적 평균 구현은 frozen `b2abd739`를 root `18b36c1`로 연결했다. 작성자 관련150/150, 시간수렴3 GTests/4물리 사례 및 최종 실제 재컴파일3/3은 native build/CTest0/0이다. @@ -469,10 +487,12 @@ HHT 식·기준 consistent M·입력·고정 schedule·100회·Si/exact-zero· 새 예외는0이며 전체 green은 아니다. 두 기존 실패의 metric body는 baseline과 동일하고, SKIP은 보존된 상세 출력이 없어 이름·상태의 동일성만 확인했다. 새 선형·비선형 정적 원본의 U1326/RF51/S14400은 각각 필수 비교 native0으로 PASS했다. -새 고유치 공식 readback은 precheck PASS이나 modal Value 부재로 비교 native2·NOT RUN이다. +새 고유치 공식 readback은 precheck PASS다. 2026-10-11 제공된 TXT의 최저10 Value를 +실제 비교한 결과 native1·7/10 family FAIL이다. 원본 부재로 native2·NOT RUN이었던 +이전 기록은 과거 evidence로 보존한다. [최종 비교](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)를 따른다. 새 두 동적 원본도 각각101개 U family 비교 native0·실패 행0개다. 두 동적 원본의 수치·물리 독립 검토도 실제101 endpoint에 한정한 bounded PASS다. 전체 Python은 기존 import의 -collection5 오류/native2·실행0개다. Modal 비교 부재와 기존 회귀 예외는 이 통과로 없어지지 않는다. +collection5 오류/native2·실행0개다. Modal 수치 불일치와 기존 회귀 예외는 이 통과로 없어지지 않는다. 공간수렴 증거는 실제 두 축을 세분화한 지정 굽힘장 에너지다. 평형 cantilever는 길이 방향만 세분화하고 두께/폭은2요소로 고정한 tip 추세이며 평형해의 공간차수 증거가 아니다. @@ -498,7 +518,7 @@ native CTest exit0이며 독립 수치 검토를 통과했다. 두 정적 원본 실제 CLI·HDF5·full-pair RN64·실패 final 보존 관련17/17도 native build/CTest0/0이다. 이 범위의 완료와 외부 비교·최신 전체 회귀는 구분한다. 실행 방법은 [README](README.md), 세부 근거와 한계는 [수치 검토](numerical-review.md)에 있다. -원본 frequency 결과 부재는 구현 진행을 막지 않지만 기능 검증 완료를 막는다. +다음은 원본 frequency 결과가 제공되기 전 pointwise 구현의 비교 이력이다. 비교기 `317fe5c`는 원본 identity·schema·finite·허용오차·원본 덮어쓰기 보호의 독립 검토와 관련124/124 Python 검사(native0)를 통과했다. Root 연결 후 같은 관련124/124도 native0이며 정적 수치 실패와 modal NOT RUN을 재현했다. 두 정적 원본은 실제 CLI native0이지만 diff --git a/docs/hex8-structural-analysis/README.md b/docs/hex8-structural-analysis/README.md index 51efabc..cd3912c 100644 --- a/docs/hex8-structural-analysis/README.md +++ b/docs/hex8-structural-analysis/README.md @@ -1,16 +1,39 @@ # Hex8 구조해석 개인 연구용 FESA에 8절점 육면체의 선형 강성, Total Lagrangian–StVK 기하비선형 -내력·접선 강성과 기준 형상의 consistent 질량을 추가한다. 요소당 병진 자유도는24개이며 +내력·접선 강성과 기준 형상의 row-sum lumped 질량을 추가한다. 요소당 병진 자유도는24개다. + +2026-10-11 [HEX8-ADR-010](ADR.md)이 질량 정책을 변경했다. 아래 기존 구현의 실행 결과는 +consistent M의 당시 evidence이며 lumped 변경본 재검증은 [PRD](PRD.md)의 현재 checklist를 따른다. + +2026-10-13 현재 구현·필수 원본5개 비교·검토·인계를 마쳤다. 이번 확인은 +Debug 관련 C++91 PASS·Hex8 비교기 Python96 PASS 및 보존된 원본5개 결과의 +현재 비교기 재대조 PASS다. 새 장시간 원본 실행이나 전체 CTest는 수행하지 않았다. +정적2·고유치의 원본 결과는 Debug, 동적2는 Release에서 생성한 기존 근거다. +Hex8 경로의 source 동일성과 독립 검토, 성능 최적화로 넘길 범위는 +[최종 인계](final-handoff.md)에 기록했다. + +초기 lumped 변경본의 관련38개·Python137개·전체789개의 결과와 당시 Shell +실패는 [채택·재검증 보고서](lumped-mass-adoption.md)의 과거 이력이다. +당시 C08b runtime 실패는 후속 승인된 초기 Newton 정책으로 해소됐고, +ADR-018의 C09와 공식 Release C08a7도 통과했다. 최신 C08b·Shell 원본·전체 +Debug는 사용자 중단이며, 전체 검증은 성능 최적화 후 진행한다. +FEM-REQ-HEX8-024의 최종 통합 완료 판정은 보류한다. +선형/비선형 정적, reference lumped-mass frequency, +선형/비선형 HHT 동해석을 typed state에서 공식 HDF5와 CLI까지 연결한다. + +다음 단락은 변경 전 consistent mass 구현의 이력이다. + 강성·질량·복구에2×2×2 reference 적분점을 사용한다. 2026-10-10 승인으로 deviatoric 항과 요소 평균 infinitesimal/Green trace 체적 energy를 사용한다. 변경본 구현·내부 검증은 완료했고 두 정적 원본의 U/RF/S 및 두 동적 원본의101-frame U 필수 비교도 PASS다. 실제 정적·동적 원본의 독립 수치·물리 검토도 bounded PASS다. 전체787 CTest는 784 PASS·기존 Shell FAIL2·SKIP1(native8)으로 종료했고 추가170개는 모두 PASS다. -전체 green은 아니며 modal Value 원본은 대기 중이다. 전체 Python도 기존 collection5 +전체 green은 아니다. 2026-10-11 제공된 modal Value 원본과 실제 비교했으나 +최저10개 중7개가1% RMS 기준을 초과했다. 최대 차이는5번 고유치의20.2513%이며 +[최종 비교](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)에 근거를 기록한다. +필수 modal 불일치가 해결되기 전 기능 검증 완료는 대기다. 전체 Python도 기존 collection5 오류로 native2·실행0개다. -선형/비선형 정적, consistent-mass frequency, -선형/비선형 HHT 동해석을 typed state에서 공식 HDF5와 CLI까지 연결한다. 구현과 기능 검증 완료는 다르다. 원본 정적2·동적2의 필수 수치 비교, 사용자 modal Value와 최신 전체 회귀·최종 검토가 완료 조건이다. 현재 상태는 [PRD checklist](PRD.md#현재-checklist), @@ -65,6 +88,10 @@ Restart는 지원하지 않는다. [정밀도 정식화](precision-formulation.m [원본 mapping](reference-model.md)은 case/frame/source identity·point 순서·RF projection을 소유한다. 독립 평가의 범위는 [수치 검토](numerical-review.md)와 [물리 검토](physics-review.md), 실패와 수정 근거는 [lessons](lessons.md)에 보존한다. +원본 고유치 불일치의 [질량·요소 설정 조사](reference-mass-investigation.md)는 공식 +Abaqus row-sum mass 설명과 별도 K/M 분리 계산을 기록한다. Mean K+lumped M의 +수치 재현은 채택 전 연구 이력이다. 현재 [HEX8-ADR-010](ADR.md)의 production 변경본은 +[별도 새 실행](lumped-mass-adoption.md#원본-비교)으로 원본5개 비교 PASS를 확인했다. ## 적용 한계 diff --git a/docs/hex8-structural-analysis/final-handoff.md b/docs/hex8-structural-analysis/final-handoff.md new file mode 100644 index 0000000..994fb4d --- /dev/null +++ b/docs/hex8-structural-analysis/final-handoff.md @@ -0,0 +1,68 @@ +# Hex8 구현·검토 인계 + +2026-10-13. 사용자 요청에 따라 장시간 전체 검증을 수행하지 않고 남은 +검토·기존 결과 재대조·인계를 정리했다. Hex8 구현과 이 범위의 검증은 +확보했으며, FEM-REQ-HEX8-024의 최신 전체 통합 완료 판정은 보류다. +현재 체크리스트는 [PRD](PRD.md#현재-checklist)에만 둔다. + +## 이번에 확인한 근거 + +| 확인 | 결과 | 적용 범위 | +| --- | --- | --- | +| 구성된 MSVC x64 Debug 관련 CTest | 91/91 PASS, native0,254.64초 | Hex8 kernel·Solid static/frequency·HHT state/kinematics/dynamics/Float64 history. 전체 CTest·장시간 원본 동해석·전체 시간수렴 아님 | +| Hex8 비교기 Python 검사 | 96 PASS, native0,38.29초 | `tests/test_compare_hex8.py`; Python 전체 suite 아님 | +| 현재 비교기로 보존된 원본5개 결과 재대조 | 정적2·고유치·동적2 모두 native0 | 기존 성공 native/HDF5와 현재 read-only 원본을 사용한 새 비교. 새 솔버 원본 실행 아님 | +| 기존 검증본과 source identity 대조 | production190 중180 동일,10 변경; 원본16개 모두 동일 | Hex8 및 Solid 실행·질량·복구·출력 경로는 동일. 변경10개는 Shell HHT/state/element/writer 관련이며 전체 공용 binary의 동일성은 주장하지 않음 | +| 독립 수치·물리 인계 검토 | 해당 범위에서 새로 조치할 문제 없음 | Hex8 직접 소비 소스27개 및 기존 evidence39개의 hash 대조. 별도 질량 적분의 한 축 총질량444063.050932, 양의 nodal mass와 기존 수지 검토 확인. 최신 전체 물리 PASS 아님 | + +이번 작업에서는 production·C++ 검사·physics·질량·입력·schema·tolerance를 +변경하지 않았다. 전체 build/CTest와 C08b 미세 grid, 장시간 원본 CLI를 +시작하지 않았다. 기존 실패·중단 기록을 PASS로 바꾸지 않았다. + +실행 근거는 `.dryforge/hht-remediation-20261012/`의 +`hex8-handoff-bounded-debug.{native.json,raw.log}`, `hex8-handoff-python.{native.json,log}`, +`hex8-handoff-comparisons/execution.json` 및 case별 보고서다. +독립 검토는 같은 폴더의 `hex8-handoff-numerical-review.json`과 +`hex8-handoff-physics-review.json` 기록을 따른다. 과거 manifest에 없는 +private header는 현재 hash만 별도로 기록하며 과거 동일성 입증 범위에 넣지 않는다. + +## 보존할 구현·물리 경계 + +Local kernel은 reference8점 deviatoric 항과 요소 평균 trace energy를 사용한다. +선형 K와 비선형 f/Kmat/Kgeo/Kt는 같은 energy에서 유도하며, 응력·변형률은 +Gauss point identity로 반환한다. 질량은 full element consistent M의 +reference row sum을 **BC 제한 전에** 구한 대각 M이다. Eigen/HHT·관성력· +반력·운동에너지·운동량은 같은 질량을 사용한다. + +Solid HHT의 normalized high+low 상태와 최종 RN64 결과 의미를 유지한다. +실패 candidate가 accepted history나 기존 최종 HDF5를 변경하지 않아야 한다. +원본5개 비교와 기존 독립 수지·modal 검산은 검증한 모델에 한정한 근거다. +임의 distorted mesh·큰 변형·다른 시간간격의 정확도나 전체 green을 보증하지 않는다. +상세 물리 근거는 [물리 평가](physics-evaluation.md), +수치 기준은 [numeric controls](numeric-controls.md)를 따른다. + +## Shell 영향과 미검증 범위 + +초기 lumped 변경본의 C08b 회전 runtime 실패는 후속 승인된 초기 Newton +정책에서 해소된 이력이다. 이후 ADR-018 변경본의 C09와 공식 Release +C08a7-grid도 통과했다. 이 결과들을 과거 전체789/802 검사에 소급 합산하지 않는다. + +최신 전체 Debug는44/856 PASS 후 사용자 중단, Release C08b도 중단됐다. +최신 Shell 원본은99증분·t=9.9까지 accepted 로그만 있으며 현재 HDF5가 없어 +새 Abaqus 변위 비교를 수행할 수 없다. [중단 시점 비교](../hht-implicit-dynamics/interrupted-validation-comparison.md)를 +따르며 C08b·현재 Shell 원본 비교·전체 통합·독립 전체 물리 판정은 남아 있다. +이는 Hex8 필수 원본5개 비교가 다시 실패했다는 뜻이 아니다. + +## 성능 최적화 후 재검증으로 넘길 내용 + +사용자가 요청한 다음 순서는 성능 최적화 후 전체 검증이다. 이번 작업은 +최적화 구현을 시작하지 않았으며 느린 연산의 원인을 계측 없이 단정하지 않는다. +먼저 같은 source/input·빌드 구성·thread 설정에서 local 계산·조립·solve· +복구·출력 시간을 분리해 기준을 확보한다. 중복 계산 제거와 데이터 재사용은 +실제 state/operator 수명을 지켜야 한다. + +연산 순서나 reduction을 바꾸면 수치 변경으로 다룬다. 시간간격·grid·질량· +반복 제한·수용 기준을 줄여 성능 개선으로 보고하지 않는다. 최적화 전후 +관련 analytical/invariant·failure preservation·serial/TBB 결정론을 대조하고, +최종 source에서 구성된 전체 MSVC Debug build/CTest와 필수 원본 비교 및 +독립 물리 검토를 다시 수행한다. 현재 bounded 결과는 그 실행을 대체하지 않는다. diff --git a/docs/hex8-structural-analysis/formulation.md b/docs/hex8-structural-analysis/formulation.md index 12d1ab0..68ff509 100644 --- a/docs/hex8-structural-analysis/formulation.md +++ b/docs/hex8-structural-analysis/formulation.md @@ -184,22 +184,33 @@ S의 isotropic 항이 요소 내 공통이어도 finite Cauchy pressure가 반 저장 strain을 \(\operatorname{dev}E+\bar\theta I/3\)로 치환하지 않는다. Point stress는 같은 point의 strain만으로 결정되는 이전 pointwise law가 아니라 element mean에 의존한다. -## Consistent mass와 generalized eigen +## Reference row-sum lumped mass와 generalized eigen \[ -M_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_bw_g, -\quad T={1\over2}v^TMv. +(M_C)_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_bw_g, +\quad m_a=\sum_b(M_C)_{ai,bi}=\sum_g\rho_0N_aw_g, +\quad (M_L)_{ai,bj}=\delta_{ab}\delta_{ij}m_a, +\quad T={1\over2}v^TM_Lv. \] M은 reference-state 상수다. Positive weights와8점 interpolation matrix의 full rank에서 SPD가 따른다. Axis-aligned brick의 scalar block은 \(\rho V/216\)에 각 축 sign이 같으면2/다르면1인 -세 factor의 곱이다. Direction별 총합은 rho V, row sum은 rho V/8다. Production에서는 lump하지 않는다. +세 factor의 곱이다. Direction별 총합은 rho V, row sum은 rho V/8다. 2026-10-11 +[HEX8-ADR-010](ADR.md) 승인에 따라 production은 full24×24 M_C의 행 합 M_L을 사용한다. +행 합은 BC restriction 전에 계산한다. Warped 요소에서는 일반적으로 m_a가 같지 않다. +Positive rho/N/weights에서 m_a>0이며 M_L은 diagonal SPD다. + +같은 nodal v에서 `T_L−T_C=0.25*sum_g rho*w_g*sum_ab N_a*N_b*|v_a−v_b|²>=0`이다. +따라서 M_L−M_C는 positive semidefinite이며 다음 consistent lower bound는 M_L에도 +보수적으로 유효하다. Uniform translation energy와 총질량을 보존하지만 일반 속도장의 +에너지·orbital inertia·고유치는 달라진다. Shell의 finite-rotation nodal block 방식과 구별한다. 8점 shape evaluation의 minimum singular value 제곱은1/27이다. Exact local quadrature에서 \(m_{e,lower}=\rho\min_gw_g/27\)는 local M의 positive lower bound다. Global scatter·principal free restriction에도 active-node incidence를 고려한 lower bound가 보존된다. 예를 들어 모든 active node에 적어도 하나의 element가 있는 경우 min_e bound는 conservative global lower bound다. -실제 FP matrix의 roundoff와 SPD evidence를 포함해야 하며 이 수학적 식만으로 설치 backend의 +실제 FP matrix의 기존 roundoff guard에는 full row-sum 누적/조립 graph를 포함해 검토하고 +SPD evidence를 확인해야 한다. 이 수학적 식만으로 설치 backend의 실행을 검증했다고 주장하지 않는다. 무응력 원형상에서 위 새 energy의 K0를 사용해 \(K_{ff}\phi=\lambda M_{ff}\phi\)를 풀며 constrained component0으로 복구하고 @@ -236,7 +247,7 @@ R=MA_{n+1}+(1+\alpha)(f_{n+1}-F_{n+1})-\alpha(f_n-F_n), \] f/U/Kt는 위 평균 trace energy에서 함께 평가한다. Linear HHT는 그 zero-state K0, -비선형 HHT는 trial의 cross-GP 전체 Hessian이다. 상수 reference consistent M·계수·고정 h· +비선형 HHT는 trial의 cross-GP 전체 Hessian이다. M은 상수 reference lumped M_L이며 계수·고정 h· 100회·strict physical/correction/update 판정은 변경하지 않는다. 이전 free endpoint가 \(Ma_n+f_n-F_n=0\)이면 R=(1+alpha)(Ma_next+f_next−F_next)다. @@ -245,10 +256,10 @@ Endpoint 표현을 쓰면 tangent도1/(1+alpha)로 함께 환산해야 한다. I Ma+f−F의 constrained projection이다. Initial u/v0에서 Mff a0=Ff(0+)−ff(0), A0=a0다. 곡선은 endpoints에서 실제 평가하며 prescribed dynamic q/v/a/A는 exact0다. -Physical momenta는 interpolated current x/v를 사용해 \(p=\int\rho v\,dV_0\), -\(L=\int x\times\rho v\,dV_0\)다.8점 consistent quadrature와 nodal mass 표현이 일치해야 한다. -Angular-momentum rate는 \(\int x\times\rho a\,dV_0\)이며 v×v 항은0이다. -Consistent symmetric M에서 nodal 표현의 \(\sum v_a\times(Mv)_a=0\)도 성립한다. +Physical momenta는 current nodal x/v와 같은 reference lumped measure를 사용해 +\(p=\sum_a m_av_a\), \(L=\sum_a x_a\times m_av_a\)다. +Rates는 \(\dot p=\sum_a m_aa_a\), \(\dot L=\sum_a x_a\times m_aa_a\)이며 +각 node에서 v×v 항은0이다. 독립 oracle도 같은 `rho*N_a*dV0` 적분을 사용한다. External/support moment는 같은 current 위치로 구한다. HHT 및 force trapezoid work는 frame별 exact energy conservation을 의미하지 않는다. Wext는 endpoint force·du trapezoid 누적, error=T+U−T0−U0−Wext다. Alpha0 linear unforced benchmark에서는 독립 보존을 확인한다. diff --git a/docs/hex8-structural-analysis/io.md b/docs/hex8-structural-analysis/io.md index 943357d..02496a3 100644 --- a/docs/hex8-structural-analysis/io.md +++ b/docs/hex8-structural-analysis/io.md @@ -54,7 +54,11 @@ repository-conforming 이름 조정은 허용하며 physics/schema 수정은 아 f[24], Kmat/Kgeo/Kt[24,24], strain energy와8 typed integration-point rows를 반환한다. Linear은 새 체적 평균 energy의 zero Hessian material=K0/geo=0, nonlinear은 같은 trial의 체적 평균 Green energy 미분이다. `ComputeMass()`는 - local consistent24×24 Matrix contribution이며 absent density이면 실패한다. + full reference consistent24×24 matrix의 각 row sum을 대각에 둔 local lumped24×24 + Matrix contribution이며 absent density이면 실패한다. Row sum은 BC reduction 전에 + 전체24 성분으로 계산하고 이후 실제 constraint mask로 restriction한다. Warped 요소에서 + 동일한 `rho*V/8`을 모든 절점에 대신 배정하지 않는다. Eigen/HHT는 같은 reference mass를 + 사용하며 시간·변형에 따라 재계산하는 current mass가 아니다. - Typed Solid point row는 internal element index, point ID1–8, natural/reference coordinate3, Cauchy stress6·infinitesimal/Green tensor strain6를 가진다. Identity/상수 coordinates를 trial마다 다른 source row로 만들지 않는다. 저장 strain은 실제 kinematics의 strain이며 평균된 @@ -92,6 +96,16 @@ Metadata의 추가 공개 의미는 다음과 같다. | `unit_system_label` | `user-consistent-unspecified` | | `coordinate_convention` | `global-cartesian; reference-strain; current-cauchy-stress` | | `component_order` | `node-major; UX,UY,UZ` | +| `mass_formulation` | `lumped-reference`; full reference element matrix의 row-sum diagonal mass | + +2026-10-11 사용자 승인으로 질량의 공개 의미와 `mass_formulation` 값을 +`consistent-reference`에서 `lumped-reference`로 변경한다. 입력에 질량 선택 parameter를 +추가하지 않으며 기존 CLI, schema_version=1, dataset field/shape/dtype, high+low 내부 상태의 +round-to-Float64 규칙은 유지한다. 과거 consistent 결과는 당시 evidence로 보존하며 현재 +reader/self-check/comparator는 mass identity mismatch를 tolerance 적용 전에 거부한다. +Metadata를 바꾸어 과거 수치 결과를 새 정책의 결과로 표시하지 않는다. 이 변경만으로 +새 정책의 verification PASS를 선언하지 않으며 production readback와 원본 비교는 새 +실행 evidence가 필요하다. Physical dataset은 `component_names`와 `unit_dimensions`를 UTF-8 string으로 기록한다. 각 frame dataset에는 `frame_index:U64`, `increment_index:U64` 및 해당 `time:F64` 또는 @@ -116,7 +130,9 @@ K0는 승인된 mean-trace energy의 zero Hessian이고 nonlinear Wg는 `mu*dev(Eg):dev(Eg)+0.5*kappa*theta_bar^2`다. 같은 theta_bar를8점의 reference 가중치로 계산하므로 그 합은 요소 체적 항 `0.5*kappa*V*theta_bar^2`와 같다. 기존 attribute 문자열과 field/schema/dtype은 유지하며 새 energy 의미는 HEX8-ADR-009 및 정식화를 따른다. -Kinetic은 `0.5*v^T*M*v`, work는 `sum(0.5*(F_old+F_new)*delta_u)`이며 initial0이다. +Kinetic은 동일한 reference lumped M으로 계산한 `0.5*v^T*M*v`이고, eigen의 +mass normalization과 HHT의 관성력·반력·physical momentum에도 같은 M을 사용한다. +Work는 `sum(0.5*(F_old+F_new)*delta_u)`이며 initial0이다. Balance error는 `T+U-T0-U0-Wext`이고 HHT numerical dissipation을0으로 보정하지 않는다. Constrained mask/prescribed 의미·point ordering은 model inventory에서 확인한다. @@ -134,5 +150,8 @@ Quantity/key/family와 원본 준비 상태는 [reference-model](reference-model Static은 final factor-one source increment를 FESA final accepted frame에 대응한다. Dynamic은 integer increment0..N과 decimal source time을 n*h에 대응한다. RF는 constrained projection, S는 element/IntPt와6 global Cauchy component다. 좌표는 보조검사이고 ID 추정에 쓰지 않는다. -Modal Value는 원본이 제공되면 quantity/units/mode/step을 확인하며 최저10 eigenvalues를 -singleton families로 비교한다. Missing 원본·nonfinite/identity/completeness 오류는 미실행/실패다. +Modal Value는 제공된 `hexa_freq.txt`의 고유치 λ(`1/time^2`)를 최저10개 mode별 +singleton families로 직접 비교한다. `Freq (cycles/time)`는 보조 열이며 변환하지 않는다. +TXT에 없는 step field는 고정 case와 승인 입력의 sole `Step-1`에 한정해 대응한다. +형식·hash·mode/finite 검사는 [원본 mapping](reference-model.md)을 따른다. +Missing 원본은 미실행, nonfinite/identity/completeness 오류는 실패다. diff --git a/docs/hex8-structural-analysis/lumped-mass-adoption.md b/docs/hex8-structural-analysis/lumped-mass-adoption.md new file mode 100644 index 0000000..0447c7c --- /dev/null +++ b/docs/hex8-structural-analysis/lumped-mass-adoption.md @@ -0,0 +1,168 @@ +# 고유치·HHT lumped mass 채택과 재검증 + +2026-10-11 사용자가 고유치와 HHT의 질량을 lumped mass로 승인했다. +[HEX8-ADR-010](ADR.md)과 [HHT-ADR-012](../hht-implicit-dynamics/ADR.md)의 변경본 evidence다. +기존 consistent 구현의 통과·실패와 private 비교 연구를 현재 검증으로 승계하지 않는다. +현재 checklist는 각 기능 PRD에 유지한다. + +## 계산과 결과 계약 + +- MITC4 고유치의 기존 nodal block lumped mass는 유지한다. +- MITC4 HHT는 `rho*N_i*dV0`의 절점 운동에너지에서 질량·관성력·convective 항· + 관성 접선·운동에너지·선형/각운동량과 시간 미분을 함께 계산한다. 회전 block을 + scalar diagonal로 치환하지 않는다. Geometry·moving drilling null·physical20 + SPD/rcond 검사와 HHT 계수·초기화·허용값을 유지한다. +- Hex8은 기존 8점 적분의 전체 24×24 reference consistent matrix를 만든 뒤 각 행의 + 합을 대각에 배치한다. 이후 BC를 축소한다. Warped 요소의 절점 질량은 `rho*V/8`로 + 치환하지 않는다. 선형/비선형 HHT와 고유치가 같은 질량을 사용한다. +- HDF5의 mass metadata는 Shell `nodal-lumped-kinetic`, Hex8 `lumped-reference`다. + 기존 consistent metadata는 현재 비교기가 거부한다. Schema layout·dtype와 공개 입력 + 옵션은 유지한다. 원본 reference와 tolerance를 변경하지 않았다. + +## 변경본 검사 + +Evidence는 `.dryforge/lumped-mass-adoption-20261011/`에 보존한다. Git HEAD만으로는 +아직 커밋하지 않은 변경본을 식별할 수 없으므로 실제 binary·입력·결과 hash도 기록한다. + +| 검사 | 현재 결과 | +| --- | --- | +| MSVC x64 Debug 빌드 | native0; 새 production kernel·절차·writer와 unit/integration/reference executable 연결 | +| 새 질량 관련 focused C++ | 38/38 PASS, native0 (`new-kernels.log`·`new-kernels-native.json`) | +| HHT/Hex8 Python 비교기 | 137 PASS (`python-focused.log`) | +| 독립 수치 검토 | 수식·조건 검사·BC 전 lumping·독립 oracle 검토 완료; 닫힌 실행 evidence와 남은 범위는 각 numerical report 참조 | +| 전체 Debug CTest | 789개 제외 없이 자연 종료, native8: 784 PASS·4 FAIL·1 SKIP (`full-direct-summary.json`) | +| 마지막 테스트 수정 후 Debug 재빌드·focused 검사 | build native0, discovery790. 외력 미분/pointwise 2 PASS 및 factory/overflow 2 PASS, 각각 CTest native0 | + +Focused 검사는 Shell의 analytic mass·eigen 초기 질량 대조·warped nodal moments·Jensen· +moving null·scaled 관성 partial/effective tangent sweep와 omission mutation, Hex8의 affine/ +warped 독립 절점 질량·BC 전 행합의 dense eigen oracle·관성 반력·독립 SDOF/MDOF 2차 +U/V/A 수렴, 공식 HDF5 readback을 포함한다. 이 통과는 C08의 시간 정확도를 대신하지 않는다. + +초기 `focused-kernels.log` 실행은 독립 dense oracle가 constrained 열을 먼저 제거한 오류를 검출했다. +전체 24 DOF 질량을 먼저 구성하도록 수정한 뒤 새 38개 검사를 통과했다. 이전 partial +실행 로그와 중단 이유는 `focused-interrupted.json`에 보존했다. + +`python scripts/execute.py`는 현재 Debug preset으로 호출했다. 기존 전체 CTest의 +16839초 기록이 runner의 1800초 deadline을 초과하며, 개별 테스트가 같은 임시 경로를 +공유하므로 CTest 병렬 실행은 선택하지 않았다. 부분 실행을 보존하고 직접 +`ctest --preset windows-msvc-ninja-debug --output-on-failure`로 제외 없이 직렬 실행한다. +이 실행은 `MKL_NUM_THREADS=1`, `OMP_NUM_THREADS=1`, `CTEST_PARALLEL_LEVEL=1`이며 +수식·gate·허용값을 변경하지 않는다. 실행 중단을 수치 실패나 PASS로 보고하지 않는다. + +새 C08a는 731.27초 후 FAIL로 종료했다. Finest `h=1/256`의 회전 좌표 가속도 최대 +오차는 `5.6747291e-4`로 `1e-4`를 초과하고 마지막 두 오차 비의 raw log2 값은 `1.02838`, `1.02946`으로 +요구 `1.8`보다 작다. 회전 속도/가속도의 100배 noise-separation도 충족하지 못했다. +Noise-separation 미달로 해당 rate의 N7 시간 정확도는 INCONCLUSIVE이며 raw 차수를 +인증된 차수로 해석하지 않는다. 기존 consistent C08a와 실패 predicate는 같지만 새 질량의 수치가 달라졌으므로 +metric body 동일성을 주장하지 않는다. + +새 C08b는 438.18초 후 `h=1/256`에서 `invalid-dynamic-rotation` 예외로 종료했다. +완료한 `h=1/64,1/128`의 energy/L drift는 감소했지만, 나머지 세 grid와 마지막 두 +refinement의 self-difference·finest 기준은 생성되지 않았다. 기존 consistent C08b는 +다섯 grid를 완료한 뒤 정확도 기준에서 실패했으므로 이번 예외를 같은 baseline 실패로 +취급하지 않는다. 별도 Debug probe는 `h=1/256`, 증분56, Newton 반복3, +`t=0.21875`에서 node index4의 유한한 회전 좌표 +`(0.64127523,-1.19777570,3.61620987)`가 principal chart를 벗어났음을 확인했다. +자료는 `c08b-diagnostic/run.log`·`run-native.json`에 있다. 이 실행 당시 큰 Newton trial의 +근본 원인은 미확정이었다. 후속 [2026-10-12 원인 조사](../hht-implicit-dynamics/newton-rotation-investigation.md)는 +off-root moving-null 접선 상쇄와 두 private 해결 후보를 확인했다. 공식 C08b와 완료 +blocker는 열린 상태이며 gate 완화나 coordinate clamp로 숨기지 않는다. + +독립 검토에서 verification-only `RigidForceRates`의 사용되지 않던 병진 미분에 +consistent 계수 `0.2/3`이 남아 있음을 발견했다. 이를 nodal mass `0.2`로 수정하고, +독립 volume force의 5-point 시간차분과 모든 24 rows를 대조하는 검사를 추가했다. +별도 Debug probe의 변경 전 RED는 병진 오류를 검출했고, 변경 후 미분 검사와 기존 +pointwise force/power/momentum 검사 각각 PASS였다(`force-rate-oracle/`). 이 변경은 +전체 CTest binary에 포함되지 않았으며, 종료 후 재빌드한 공식 Debug binary에서 관련 두 +검사를 다시 통과했다(`final-oracle-rebuild/ctest.log`). + +전체 로그를 집계하면서 추가 두 FAIL을 발견했다. Factory의 기존 consistent off-diagonal +기대값을 nodal diagonal `0.25`와 off-diagonal zero 검사로 수정했다. Overflow fixture의 +`E=3e306`은 새 mass에서 validation scale이 finite이므로, 독립 계산에 따라 local K·λ· +spectral enclosure는 finite이면서 `||K||F+|λ|*||M||F`만 overflow하는 `E=4e306`으로 +바꿨다. Production guard·tolerance는 유지했고 두 검사 모두 공식 Debug focused CTest에서 +통과했다(`final-stale-fixtures.log`·`final-stale-fixtures-native.json`). 원문 전체 실행의 +네 FAIL을 두 FAIL로 덮어쓰거나, 마지막 discovery790개를 전체 재실행했다고 주장하지 않는다. + +전체 실행은 9131.26초 후 자연 종료했다. 마지막 세 test source의 수정 전후 production +190개 파일과 필수 원본16개 hash는 동일하다. 원본 두 동해석의 Debug 101 endpoints도 +각각 PASS였다. 남은 미해결은 C08a 정확도·C08b Newton trial과 기존 C04a SKIP이며 +전체 green 또는 HHT 기능 완료를 선언하지 않는다. + +최종 test source 세 개·Debug binary·닫힌 로그의 hash와 후속 검사의 구분은 +`final-test-identities.json`에 보존한다. 초기 helper identity record의 force-only 설명에 +빠진 두 Hex8 test 수정을 별도 annotation으로 정정하고 원문 record는 유지했다. + +## 원본 비교 + +각 원본 INP를 byte-identical 복사한 별도 경로에서 실제 CLI를 실행했다. Hex8 정적· +고유치는 Debug, 긴 원본 동해석은 같은 production 소스의 Release다. 전체 Debug 회귀와 +reference 실행 구성을 구분한다. Private kernel override는 사용하지 않는다. + +| 모델 | CLI / 비교 결과 | +| --- | --- | +| Hex8 frequency | Debug native0 / 원본 10 Value 모두 PASS. 최대 상대차 `0.0019610496%` | +| Hex8 linear static | Debug native0 / U·RF·8점 S PASS | +| Hex8 nonlinear static | Debug native0 / U·RF·8점 S PASS | +| Hex8 linear dynamic | Release native0 / 전체 101-frame U PASS | +| Hex8 nonlinear dynamic | Release native0 / 전체 101-frame U PASS | +| MITC4 HHT | Release native0 / 전체 101-frame U PASS, UR 경고 200건 | + +원본 고유치의 기존 consistent mass 불일치는 새 production 실행에서 해소됐다. +원본 Value의 단위/quantity·모드 identity·행5%/RMS1% 정책은 그대로다. 독립으로 +mean-volume K와 nodal mass를 조립한 공개 10개 모드의 residual은 최대 `1.16e-17`, +mass Gram 오차는 `1.33e-15`이며 고정 모드 성분은 exact0이다. +[물리 검토](physics-evaluation.md)는 이러한 제한된 확인과 잔여 범위를 구분한다. + +다섯 Hex8 원본과 Shell 원본의 닫힌 실행 증거·HDF observable·외부 비교 metric/hash를 +독립 감사했다(finding0). 자료는 `independent-closed-evidence.json`이며 실제 energy· +force/moment·반력·운동량 ledger는 두 기능의 `lumped-mass-physics-details.json`에 둔다. + +Release 동해석으로 대체한 중복 Debug 원본 실행은 의도적으로 중단했다. 각 `interrupted.json` +및 raw native record를 보존하며 완료한 원본 비교로 세지 않는다. Release recorder의 folder +label이 case에 들어간 경우 원본 record를 보존하고 실제 입력 stem에서 logical identity를 +명시적으로 유도한 `comparison-execution.json`을 별도로 사용했다. + +Shell 원본은 변위 비교를 확인하는 coarse 시간간격의 모델이다. U 일치로 물리 가속도의 +시간 정확도·에너지 보존·C08 완료를 추론하지 않는다. 기존 C08 실패와 잔여 지원 범위는 +[HHT PRD](../hht-implicit-dynamics/PRD.md)와 [물리 검토](../hht-implicit-dynamics/physics-evaluation.md)에 유지한다. + +## 최종 검토와 인계 + +2026-10-12 `hht_mass_probe_review`의 읽기 전용 최종 diff 검토에서 새 actionable 코드 +finding은 없었다. Hex8 frequency/HHT는 full element M을 계산한 뒤 BC를 partition하고, +같은 assembled M을 high+low 관성 작용·endpoint 반력·운동에너지·선형/각운동량·effective +tangent에 전달한다. Shell eigen의 기존 lumped 경로와 HHT의 새 nodal kinetic 경로, +두 요소의 writer/self-check/comparator mass metadata 연결도 일치한다. Test-only 세 파일은 +승인된 질량 oracle와 기존 nonfinite gate를 검증한다. 이 검토에서는 실행 근거를 재사용했고 +build/test를 추가 실행하지 않았다. + +아래 P1 판단과 인계는 초기 lumped 변경본의 실패 당시 기록이다. 후속 사용자 승인으로 +[HHT-ADR-013 초기 Newton 정책](../hht-implicit-dynamics/newton-start-policy.md)을 적용했고 +공식 C08b 5개 grid 모두 T=.25까지 회전 예외 없이 완료해 해당 runtime finding을 +닫았다. 기존 시간 정확도·P 감소 실패는 유지하며 변경본 전체802 Debug 회귀는 +native8:799 PASS·2 FAIL·1 SKIP으로 자연 종료했다. 원본 Hex8 선형/비선형 HHT의 +101-frame smoke도 PASS다. 이 후속 결과를 아래 과거789개의 통과로 소급하지 않는다. + +**당시 완료 판정의 P1 blocker는 C08b의 새 runtime 실패였다.** +[FEM-REQ-HEX8-024](PRD.md#fem-req-hex8-024--회귀완료-판정)는 신규/영향 검사 PASS와 +신규 physics 오류0을 요구한다. 과거 C08b는 모든 grid를 완료한 뒤 정확도 기준에서 +실패했고 현행 결과는 principal chart 예외이므로 동일 baseline 예외로 분류할 수 없다. +Hex8 원본5개·독립 수치/물리 검토·최종 diff 검토 완료와 기능 검증 완료를 구분한다. + +후속 owner는 다음 자료와 경계를 인계받는다. + +- 실제 실패 검사는 `HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`다. + 전체 raw는 `.dryforge/lumped-mass-adoption-20261011/full-direct.log`와 + `full-direct-summary.json`, 별도 계측은 같은 폴더의 `c08b-diagnostic/run.log`에 있다. + Probe의 증분56·반복3·node index4는 source node label5이며 회전 norm은 약 `3.86301>π`다. +- 다음 조사에서는 직전 accepted state와 predictor, correction, effective tangent 및 + drilling regularity를 함께 확인해 큰 Newton trial의 원인을 분리한다. Positive physical20 + mass나 원본 U 일치만으로 이 갱신의 안정성을 추론하지 않는다. +- 기존 gate·100회 full Newton·fixed schedule·물리 질량을 유지해 구현 오류를 조사한다. + 시간 적분·회전 chart·수용 기준 변경이 필요하면 정식화와 독립 검토, 필요한 사용자 + 결정이 선행되어야 한다. 좌표 clamp나 tolerance 완화로 결과를 통과시키지 않는다. +- 수정 후 관련 검사·필수 비교·전체 Debug 회귀를 수행하고 C08a와 C04a도 별도 판정한다. + 현행 전체789개와 후속 focused4개를 합쳐 최종790개 전체 PASS로 보고하지 않는다. + +현재 완료 checklist는 [Hex8 PRD](PRD.md#현재-checklist) 한 곳에 둔다. diff --git a/docs/hex8-structural-analysis/lumped-mass-physics-details.json b/docs/hex8-structural-analysis/lumped-mass-physics-details.json new file mode 100644 index 0000000..8c88a14 --- /dev/null +++ b/docs/hex8-structural-analysis/lumped-mass-physics-details.json @@ -0,0 +1,262 @@ +{ + "review_date": "2026-10-12", + "scope": "\ub2eb\ud78c lumped \uc0dd\uc0b0 HDF\uc758 \uae30\uc900 8\uc810 \ub3c5\ub9bd \ubcf5\uad6c; \uc194\ubc84 \uc7ac\uc2e4\ud589 \uc5c6\uc74c; \ub0b4\ubd80 high+low gate \ud1b5\uacfc \uc8fc\uc7a5 \uc5c6\uc74c", + "cases": { + "hexa_linearstatic": { + "folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_linearstatic", + "configuration": "MSVC x64 Debug", + "sha256": "025fe733ac4fa1017babe8c698471a17ad275a43820356de9de535cdf3ba6a20", + "native_exit": 0, + "metadata_mass": "lumped-reference", + "frames": 1, + "mass_total": 444063.05093199987, + "maximums": { + "fixed_U": 0, + "free_RF": 0, + "RF_gap": 1.7462298274040222e-10, + "free_RN64_reconstruction": 2.696491492315545e-07, + "strain_gap": 9.677351422380381e-20, + "stress_gap": 1.2338205124251544e-08, + "U_gap": 1.1368683772161603e-13, + "force_ledger_gap": 1.978719410544727e-10, + "force_balance_ratio": 1.4290793322311065e-13, + "element_force_sum": 1.1641532182693481e-10, + "element_moment_sum": 1.4551915228366852e-10, + "element_force_ratio": 1.3028207107302464e-16, + "element_moment_ratio": 1.42464370853327e-16, + "center_xy_symmetry": 3.396772114885177e-10 + }, + "minimums": { + "detF": 0.9999869380847567, + "U": 186.35946178395668, + "T": 0.0 + }, + "final": { + "frame": 0, + "time": 0.0, + "node2_U": [ + 0.001861312878526077, + 0.0018613125388488654, + 4.563818307322808e-06 + ], + "T": 0.0, + "U": 186.35946178395668, + "W": null, + "defect": null, + "support_F_sum": [ + -99999.99999931706, + -100000.00000010608, + -100000.00000000751 + ] + }, + "max_T": 0.0, + "max_abs_defect": null, + "comparison_passed": true + }, + "hexa_nonlinearstatic": { + "folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_nonlinearstatic", + "configuration": "MSVC x64 Debug", + "sha256": "33ee601b4c094474f28648f3671e254e3610d9ef46f021fc0c54ae8b87579e81", + "native_exit": 0, + "metadata_mass": "lumped-reference", + "frames": 10, + "mass_total": 444063.05093199987, + "maximums": { + "fixed_U": 0, + "free_RF": 0, + "RF_gap": 2.3283064365386963e-10, + "free_RN64_reconstruction": 35.36235751599321, + "strain_gap": 1.079172914361182e-19, + "stress_gap": 1.3707904145121574e-08, + "U_gap": 1.4210854715202004e-13, + "force_ledger_gap": 7.102585186657961e-10, + "force_balance_ratio": 2.489950723468516e-06, + "element_force_sum": 1.4551915228366852e-10, + "element_moment_sum": 2.9103830456733704e-10, + "element_force_ratio": 1.856999104988803e-16, + "element_moment_ratio": 1.7619557460248046e-16, + "center_xy_symmetry": 3.3990287624449667e-10 + }, + "minimums": { + "detF": 0.9999869391442063, + "U": 1.8636157385260317, + "T": 0.0 + }, + "final": { + "frame": 9, + "time": 0.0, + "node2_U": [ + 0.0018611071696827675, + 0.0018611068297798912, + 4.358230949307811e-06 + ], + "T": 0.0, + "U": 186.31853170879367, + "W": null, + "defect": null, + "support_F_sum": [ + -100000.00455958676, + -100000.00455951673, + -100001.18947294424 + ] + }, + "max_T": 0.0, + "max_abs_defect": null, + "comparison_passed": true + }, + "hexa_dynlinear": { + "folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_dynlinear-release", + "configuration": "MSVC x64 Release, current production source", + "sha256": "051f92942d056672140aea4156134452aaaf006d7e6e6adeff381163e879f325", + "native_exit": 0, + "metadata_mass": "lumped-reference", + "frames": 101, + "mass_total": 444063.05093199987, + "maximums": { + "fixed_U": 0, + "free_RF": 0, + "RF_gap": 3.4924596548080444e-10, + "free_RN64_reconstruction": 1.1003464805980911e-07, + "strain_gap": 9.953828270320105e-19, + "stress_gap": 2.3102620616555214e-07, + "U_gap": 1.1368683772161603e-13, + "force_ledger_gap": 7.226450549069341e-10, + "force_balance_ratio": 1.4190042506689565e-16, + "element_force_sum": 3.2014213502407074e-10, + "element_moment_sum": 2.9103830456733704e-10, + "element_force_ratio": 2.1273649523223604e-16, + "element_moment_ratio": 2.199818933208794e-16, + "center_xy_symmetry": 3.4514411684574697e-10, + "fixed_V": 0, + "fixed_a": 0, + "fixed_A": 0, + "T_gap": 7.105427357601002e-15, + "P_gap": 3.637978807091713e-12, + "L_gap": 6.548361852765083e-11, + "W_gap": 1.1368683772161603e-13, + "defect_gap": 1.2789769243681803e-13, + "current_moment_ledger_gap": 1.5448254373149724e-09, + "current_internal_moment": 287.045277721086, + "actual_current_moment_balance": 287.04527772194706, + "current_moment_balance_ratio": 2.9064182947722226e-05 + }, + "minimums": { + "detF": 0.9999790423308456, + "U": 0.0, + "T": 0.0 + }, + "final": { + "frame": 100, + "time": 10.0, + "node2_U": [ + 0.0018176922724947634, + 0.001817691931726987, + 4.563816808086208e-06 + ], + "T": 0.24997898188787254, + "U": 177.74076426102997, + "W": 256.22123629162513, + "defect": -78.2304930487073, + "support_F_sum": [ + -96232.31268672507, + -96232.31259548312, + -99999.75662111596 + ] + }, + "max_T": 51.614568684415126, + "max_abs_defect": 78.2304930487073, + "comparison_passed": true + }, + "hexa_dynnonlinear": { + "folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_dynnonlinear-release", + "configuration": "MSVC x64 Release, current production source", + "sha256": "8730e5562c91b3c7c9e654c811d2791ab7d24fdcc62286b0b28efa7cdc5957d6", + "native_exit": 0, + "metadata_mass": "lumped-reference", + "frames": 101, + "mass_total": 444063.05093199987, + "maximums": { + "fixed_U": 0, + "free_RF": 0, + "RF_gap": 3.4924596548080444e-10, + "free_RN64_reconstruction": 1.0344348311264184e-07, + "strain_gap": 9.18501352178882e-19, + "stress_gap": 2.1944288164377213e-07, + "U_gap": 8.526512829121202e-14, + "force_ledger_gap": 9.998437633385038e-10, + "force_balance_ratio": 1.3976814460427568e-16, + "element_force_sum": 2.473825588822365e-10, + "element_moment_sum": 3.4924596548080444e-10, + "element_force_ratio": 2.297419857405169e-16, + "element_moment_ratio": 2.456492632639856e-16, + "center_xy_symmetry": 3.4549370656056233e-10, + "fixed_V": 0, + "fixed_a": 0, + "fixed_A": 0, + "T_gap": 7.105427357601002e-15, + "P_gap": 5.4569682106375694e-12, + "L_gap": 8.003553375601768e-11, + "W_gap": 1.7053025658242404e-13, + "defect_gap": 1.7053025658242404e-13, + "current_moment_ledger_gap": 1.798303914284888e-09, + "current_internal_moment": 2.3456436792912427e-09, + "actual_current_moment_balance": 1.6298145055770874e-09, + "current_moment_balance_ratio": 2.7423916459990335e-16 + }, + "minimums": { + "detF": 0.9999790435523218, + "U": 0.0, + "T": 0.0 + }, + "final": { + "frame": 100, + "time": 10.0, + "node2_U": [ + 0.0018178450958853847, + 0.0018178447552973686, + 4.365606357013274e-06 + ], + "T": 0.25133992029753627, + "U": 177.77055436719652, + "W": 256.2426406634893, + "defect": -78.22074637599522, + "support_F_sum": [ + -96263.0385934654, + -96263.03853592947, + -100002.93934163265 + ] + }, + "max_T": 51.61334640118332, + "max_abs_defect": 78.22074637599522, + "comparison_passed": true + } + }, + "final_verification_scope": { + "full_789": { + "native_exit": 8, + "counts": { + "pass": 784, + "fail": 4, + "skip": 1 + }, + "log_sha256": "47b814880ebeaf923002a52d0919703fc4e0671b298e4ba2c026c5c2ba331da6", + "note": "\ucd5c\uc885 test-only \uc218\uc815 \uc804 raw \ud310\uc815\uc744 \ubcf4\uc874" + }, + "final_debug_build_exit": 0, + "final_discovery_count": 790, + "final_790_full_executed": false, + "final_hht_oracle_focused": { + "native_exit": 0, + "passed": 2 + }, + "final_hex8_stale_fixture_focused": { + "native_exit": 0, + "passed": 2 + }, + "final_test_manifest_sha256": "83dfab0cad81d11351c0a039161da565529f0cc7f455263088d362cfd5426446", + "production_file_count": 190, + "reference_file_count": 16, + "independent_identity_mismatches": 0, + "remaining_status": "HHT C08a/C08b OPEN; C04a SKIP; \uc804\uccb4 \ud1b5\uacfc \uc8fc\uc7a5 \uc5c6\uc74c" + } +} diff --git a/docs/hex8-structural-analysis/numeric-controls.md b/docs/hex8-structural-analysis/numeric-controls.md index 12e5624..21a124a 100644 --- a/docs/hex8-structural-analysis/numeric-controls.md +++ b/docs/hex8-structural-analysis/numeric-controls.md @@ -6,13 +6,22 @@ ## 계산·형상 인증 +2026-10-11 [HEX8-ADR-010](ADR.md)에 따라 M은 full reference row-sum diagonal이다. +아래 consistent M의 완료·실패 수치는 당시 이력이다. Lumped 변경본의 필수 원본5개 +비교와 수치·물리 검토는 완료했으며 현재 범위는 [최종 인계](final-handoff.md)를 따른다. +사용자가 유예한 최신 전체 통합 검증은 완료로 표시하지 않는다. +Mass positivity 및 eigen search bound는 M_L−M_C>=0의 보수적 lower bound를 사용할 수 +있으나 full row-sum 누적/조립의 실제 roundoff graph와 SPD evidence도 검토해야 한다. +BC 제한 이후 행 합으로 바꾸거나 기존 guard·수치 기준을 비교 결과에 맞춰 완화하지 않는다. + 모든 input/파생 값/결과를 finite 검증하고 positive Jacobian·밀도·material capability를 확인한다. 정적·고유치와 기존 계산은 Float64다. 사용자 승인 [정밀도 변경안](precision-proposal.md)에 따라 Solid HHT의 내부 물리 상태와 힘·rates·수지·gate 계산은 normalized high+low를 사용한다. Float64 sparse backend와 반올림 출력은 유지하며, 전체 상태 gate를 rounded 출력만으로 재계산한 gate PASS로 표현하지 않는다. 변경본 내부 검증과 정적2·동적2 원본 비교는 완료했다. 전체787 회귀 실행·baseline 대조도 완료했으나 기존 FAIL2·SKIP1을 유지한다. -Modal 비교는 원본 대기다. 실제 완료 범위는 +Consistent M 당시 Modal 원본 비교는7/10 family FAIL이었다. 현재 lumped M의 +최저10 Value는 모두 PASS이며 이 과거 실패를 소급 변경하지 않는다. 실제 완료 범위는 [PRD checklist](PRD.md#현재-checklist)를 따른다. Whole-cell 인증은 outward interval coefficient bounds와 subdivision이며 estimate-only positive 검사와 abs(det J)를 허용하지 않는다. diff --git a/docs/hex8-structural-analysis/numerical-review.md b/docs/hex8-structural-analysis/numerical-review.md index 5ce4ad2..ffc6aab 100644 --- a/docs/hex8-structural-analysis/numerical-review.md +++ b/docs/hex8-structural-analysis/numerical-review.md @@ -1,5 +1,7 @@ # Hex8 독립 수치 검토 +2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. + 검토 대상은 [PRD](PRD.md), [formulation](formulation.md), [numeric controls](numeric-controls.md), [I/O](io.md), [reference mapping](reference-model.md)이다. 2026-10-08 작성자와 독립된 `hex8_t1_numerical` reviewer가 문서·관련 코드·원본을 대조했다. 수식에 추가 blocker는 없으나 @@ -242,3 +244,244 @@ binary hash라고 표현하지 않는다. 감사 native0·finding0, bounded evid 판정은 종료 evidence의 일관성·새 회귀 없음에 한정하며 전체 green·release 또는 미제공 modal Value의 통과 판정이 아니다. 실제 원본의 독립 물리 수지 범위는 [physics review](physics-review.md)를 따른다. + +## 2026-10-11 제공 modal 원본의 독립 검토 + +제공된 `hexa_freq.txt`의 직접 읽기와 root 비교기 diff를 작성자와 독립적으로 검토했다. +새 TXT parser·실제 frequency 분기·원본 raw hash/보고서 보호·mode1–10 일대일 대응·반복 +고유치 보존·유일한 source Step-1 binding·HDF5 quantity/unit/dtype/finite가 bounded PASS다. +영향 Python native0·JUnit136 PASS(95 Hex8/41 HHT)도 closed artifact로 확인했다. +원본14개를 포함한23개 소비 artifact의 SHA를 검토 전후 대조했고 모두 동일하다. +독립 audit native0·finding0은 비교 코드와 증거의 일관성 판정이다. + +실제 λ 오차와 공통 row5%/singleton RMS1%를 독립 재계산한 결과 mode3/4/5/6/7/9/10의 +7개 family FAIL을 재현했다. 최대 mode5는 원본52797 대 FESA63489.09126468376, +relative RMS0.20251323493160142다. `Value`와 `Freq`의 각 decimal 표시 해상도 구간에서 +`f=sqrt(lambda)/(2*pi)` 관계는 일관되지만 이 보조 검토의 구간을 비교값 보정이나 tolerance로 +사용하지 않았다. 동일 mode ID의 출력 값 그대로 판정했고 frequency로 바꾸지 않았다. + +공식 readback의24 returned pairs와 선택10개, 저장된 original-pencil verification도 확인했다. +이는 FESA 자체 pencil의 검증량 확인이며 새 matrix 조립·eigensolve나 Gram 독립 재계산을 +수행했다고 주장하지 않는다. 원본 λ만으로 K/M 중 원인을 특정할 수 없고, 원본 mode shape· +modal mass·실제 element/mass law 또는 operator evidence 없이 수식·질량·기준 변경을 +정당화하지 않는다. 최종 기능 완료는 필수 modal 불일치 해결까지 대기다. + +자료는 `.harness/hex8-evidence/mean-volume/modal-final/independent-result.json`, +`independent-native.json`, `independent-inventory.json`, `independent-audit.py`다. +결과 JSON SHA는 `48c359cf670f9e39792cf58bbe5d7498effabcfd5789c3025904ac8562af5e99`다. +전체 C++ 회귀는 직전 `18b36c1` 실행 기록을 참조했고 이번 새 실행으로 표현하지 않았다. + +## 2026-10-11 원본 질량 분리 진단의 독립 검토 + +후속 [질량·요소 조사](reference-mass-investigation.md)의4way 계산을 독립 검토했다. +Fresh engineering shear B/Cdev·체적 평균 coupling·consistent 적분과 full 행 합 lumping 뒤 +free restriction의 의미가 맞다. 저장된 두 K·두 M·고유벡터에서 같은 source mode별 오차, +총질량과 자체 residual·Gram을 독립 재계산했다. Audit native0·finding0, 소비자료 SHA 불변이다. +Mean K+consistent M은 실제 FESA λ를 상대차이4.57e-12로 재현하고, mean K+lumped M은 +원본10개 λ 모두 상대차이0.00196105% 이내다. 이는 질량 선택 차이를 설명하는 강한 근거다. +원본 actual operator 직접 대조나 재조립/eigensolve를 수행했다고 주장하지 않는다. + +진단 script의 `max_eta_r`는 infinity-norm backward residual이다. 공식 T5의 +Euclidean/Frobenius eta_r와 이름만으로 동일시하지 않으며 두 규격을 별도 재계산했다. +후자의4조합 최댓값은3.79e-15 이하, Gram Frobenius 오차는3.36e-15 이하다. +Private eigsh의sigma0/k10 결과는 실제 FEAST lowest-N count/completeness 인증이 아니다. +현재 FESA mass 정책이나 실제 modal FAIL은 변경하지 않았다. +자료는 `.harness/hex8-evidence/mean-volume/modal-mass-investigation/independent-result.json`과 +같은 폴더의 native/audit에 보존한다. 상세 원본·문서·metric·채택 경계는 위 조사 문서를 따른다. + +## 2026-10-11 row-sum lumped production 채택의 독립 검토 + +[HEX8-ADR-010](ADR.md)에 따라 변경된 `ComputeMass`와 eigen/HHT oracle·metadata를 +읽기 전용으로 검토했다. Full reference consistent24×24를 기존8점으로 계산한 뒤 +각 전체 행 합을 대각에 저장한다. BC는 이후 procedure에서 적용되므로 구속 열의 +질량을 잃지 않는다. Positivity/finite 실패를 값 보정으로 숨기지 않으며 stiffness, +high+low 상태·계수 lifting·HHT gate를 변경하지 않는다. + +**HEX8-LM-NR-001 — CLOSED: dense eigen oracle의 BC 순서.** 최초 oracle는 +full_mass를 free×free loop 안에서만 채워 constrained 열을 누락했다. 독립 검토에서 +이를 지적했고, 전체24 DOF의 독립 closed-form consistent 행렬 생성→full row sum→ +free restriction으로 수정된 코드를 확인했다. 새 실행 검증은 전체 회귀 결과와 구분한다. +수정 전 binary의 부분 실패/중단은 +`.dryforge/lumped-mass-adoption-20261011/focused-interrupted.json`에 보존한다. + +Warped fixture의 독립 map은 +`X=(xi+.12*eta*zeta, 2*eta+.09*xi*zeta, 3*zeta+.15*xi*eta)`다. 직접 전개한 +detJ는 `6-.0135*xi²-.036*eta²-.0324*zeta²+.00324*xi*eta*zeta`로 신규 oracle와 +일치한다. rho2의 절점 질량은 `11.9454±.00024`이며 부호는 `sx*sy*sz`다. +Ni*detJ의 축별 차수는3 이하라 기존2점 rule과 독립3점 적분이 수학적으로 일치한다. +비균일 속도 `v_ax=a+1`에서 uniform rhoV/8 shortcut의 T와 차이는 −.00192이므로 +새 검사는 총질량만 같은 잘못된 uniform lumping도 구별한다. + +Mass lower bound `rho*min(w)/27`는 계속 보수적으로 사용할 수 있다. 양의 shape와 +weights에서 `M_L-M_C`의 quadratic form은 절점 속도 차이 제곱의 양의 합이다. +따라서 기존 consistent SPD lower bound는 lumped에도 유효하다. 추가 full-row 양의 +합산은 고정 순서이며 기존512eps element/assembly budget과 비교했다. 새로운 기준 +완화나 eigen upper-bound를 diagonal ratio로 대체하지 않았다. 비트 수준의 PSD나 +수학적 lower bound만으로 실제 solver 검증을 대신한다는 의미는 아니다. + +Fresh production **MSVC x64 Debug** `hexa_freq` CLI native0와10개 Value 비교를 +독립 확인했다. 원본 TXT와 HDF5 mode1–10으로 singleton 행/RMS를 직접 재계산했으며 +공통 row5%/RMS1%로 모두 PASS다. 최대 상대 RMS는 `1.961049613524256e-5` +(0.001961049613524256%)이다. 원본·byte 동일 입력 복사본·binary·HDF5 해시와 +`lumped-reference` metadata를 대조했고 소비 artifact SHA는 검토 전후 동일했다. + +저장된25 returned pairs의 max eta_r/eta_norm/eta_energy는 각각 +`1.0554551422827935e-17 / 4.440892098500626e-16 / 7.476286423773325e-19`, +eta_gram/max_eta_orth는 `4.379426909390015e-15 / 1.0729264698916552e-15`다. +이는 저장된 original-pencil checks의 판독이며 reviewer가 production K/M을 새로 +조립하거나 eigensolve/count certification을 독립 수행한 것은 아니다. +Bounded audit native0·finding0 자료는 +`.dryforge/lumped-mass-adoption-20261011/references/hexa_freq/independent-adoption-audit.json`이다. +결과 HDF5 SHA는 `94a576bbfe1d5826235a6323e6d470163ed2e970c4fe6f65a86b2d65a3db7f8a`다. + +전체 Debug/CTest와 정적2·동적2 원본의 새 종료 evidence는 아직 검토하지 않았다. +현재 상태는 [PRD](PRD.md)의 checklist를 따른다. 이 bounded modal PASS를 동적 +시간수렴·전체 green·기능 완료로 확대하지 않으며 이전 consistent modal FAIL은 +해당 질량 선택의 이력으로 보존한다. Reviewer는 코드·테스트·상위 계약을 수정하지 않았다. + +### 2026-10-12 종료된 검증 근거의 보완 + +수정된 dense oracle를 포함한 새8 suites/38 C++ tests의 전체 PASS/native0를 확인했다. +Warped nodal mass·비균일 energy, full-row lumped pencil, one-free-DOF/구속 경계의 +관성 반력, 독립 scalar/3DOF brick oscillator 시간수렴 및 HDF5 readback이 포함된다. +이 실행은 수정 전 focused binary의 부분 실패/중단을 새 결과와 분리한다. +별도 `python-focused.log`의 pytest137 PASS도 확인했다. + +종료된 원본 comparison의 모든 보고 scalar에서 reference-only scale, near-zero, +row5%/RMS1%, exact-zero 분기와 최종 판정을 직접 재계산했다. U는 HDF5 source +node/frame 값에도 대조했으며 input/native record/binary/HDF5/원본 hash와 +`lumped-reference` metadata를 확인했다. RF/S는 보고된 scalar 수치·identity/hash +감사이며 별도 stress/reaction recovery oracle를 새로 실행했다는 뜻은 아니다. + +| 종료된 원본 | 실행 구성 | 확인한 families/scalars | 최대 상대 RMS | +| --- | --- | ---: | --- | +| hexa_linearstatic | MSVC x64 Debug | 3 / 15777; U/RF/S 모두 PASS | U `9.31789815437491e-9`, RF `7.309816326722838e-9`, S `3.42593423675143e-9` | +| hexa_nonlinearstatic | MSVC x64 Debug | 3 / 15777; U/RF/S 모두 PASS | U `2.169911561350721e-7`, RF `6.728092996221333e-6`, S `9.338899878251489e-6` | +| hexa_freq | MSVC x64 Debug | 10 / 10; Value 모두 PASS | `1.961049613524256e-5` | +| hexa_dynlinear | MSVC x64 Release, current production | 101 / 133926; U 모두 PASS | `3.618821318800423e-7` | +| hexa_dynnonlinear | MSVC x64 Release, current production | 101 / 133926; U 모두 PASS | `2.1555860391237846e-6` | + +각 CLI native0를 확인했다. Dynamic release의 raw recorder에 보존된 folder label은 +각각 `hexa_dynlinear-release`와 `hexa_dynnonlinear-release`다. Byte 동일 INP stem으로 논리 case를 연결한 +`comparison-execution.json`의 raw-record hash와 실제 command를 대조했으며 원시 +기록을 수정하거나 다른 입력으로 치환하지 않았다. Debug와 Release 검증을 혼합해 +전체 Debug 통과로 표시하지 않는다. + +Bounded 감사 native0·finding0 자료는 +`.dryforge/lumped-mass-adoption-20261011/independent-closed-evidence.json`이다. +필수 원본5개의 외부 비교는 위 구성에서 모두 PASS이며 새 전체 Debug/CTest는 +실행 중으로 최종 검토 대기다. 이 두 Release 동적 비교를 Debug 원본 통과로 표시하지 않는다. +기존 `execute.py` 중단 native−1과 serial 직접 전체789 CTest의 진행 상태를 구분한다. +현재 전체 green·시간/물리 검증 완료·기능 완료 판정은 하지 않는다. + +후속 serial 전체 실행에서 기존 Shell C08a 시간수렴 test의 current lumped FAIL을 +확인했다. Assertion 구성5개는 baseline과 같으나 실제 metric은 변했다. Finest +회전 가속도 error `5.6747291267426469e-4`와 두 raw order 약1.02838/1.02946은 +기존 기준 미달이며 N7 noise 분리도 미충족이다. 상세 대조는 +[HHT 독립 검토](../hht-implicit-dynamics/implementation-numerical-review.md)의 +2026-10-12 current C08a 절을 따른다. 이는 Hex8 원본5개의 bounded 외부 비교 PASS와 +구분하며 전체 회귀 green으로 승격하지 않는다. C08b 및 전체 종료는 아직 대기다. + +Current shell C08b도 종료됐으며 **FAIL**이다. h=1/64·1/128 완료 뒤 세 번째 +h=1/256 grid에서 principal rotation 입력 gate의 runtime 예외로 중단했다. +5 grids를 완료한 뒤 accuracy assertion이 실패했던 baseline과 다른 결과다. +실패 Newton trial의 근본 원인은 추가 진단이 필요하며, 이것을 외부 U PASS나 +Hex8 physical mass/invariant 검사로 닫지 않는다. 종료 body/source 경로와 별도의 +unused manufactured force-rate 병진 oracle 오류는 +[HHT 독립 검토](../hht-implicit-dynamics/implementation-numerical-review.md)의 +2026-10-12 current C08b 절을 따른다. 전체789 CTest의 종료 판정은 여전히 대기다. + +후속 HHT-LM-NR-002 병진 force-rate oracle 오류는 두 계수 수정과 private Debug +RED(native1)/GREEN(native0)·pointwise(native0) 근거로 닫혔다. 상세와 shared 전체 +binary 재빌드 범위는 같은 HHT 독립 검토의 force-rate oracle 수정 절을 따른다. +C08b runtime finding과 C08a 시간정확도 실패를 해소한 결과는 아니다. + +후속 private C08b trace는 h=1/256, increment56, Newton iteration3, +t=0.21875에서 internal node4의 finite total rotation norm +`3.8630136368942867 rad>pi`를 직접 확인했다. 따라서 immediate principal-chart +이탈은 확정됐으나 큰 Newton trial의 근본 원인은 미확정이다. 상세 identity와 +evidence 경계는 HHT 독립 검토의 C08b private trace 절을 따른다. 해당 finding은 +OPEN이며 source/tolerance 변경이나 추가 실행으로 전체 PASS를 주장하지 않았다. + +### 2026-10-12 전체 실행에서 추가 발견한 두 stale fixture + +Active serial 전체 로그에서 앞의 shell C08a/C08b 외에 test93 +`RejectsOverflowingOriginalPencilValidationScale`와 test238 +`SolidBindingPreservesThreeComponentsAndReferenceMass`의 FAIL을 확인했다. +따라서 현재 확인한 실패는4개이며 앞의 두 shell 실패만으로 전체 결과를 요약할 수 +없다. 전체 실행은 아직 종료하지 않았고 최종 native/집계는 대기다. 기존38-case +focused filter에는 이 두 cases가 없었으므로 당시 PASS는 해당 coverage가 아니다. + +**HEX-LM-NR-001 — source corrected, focused execution pending: overflow fixture.** +E=3e306, rho=2, axis half-lengths=(1,2,3), nu=.25에서 새 `M_L=12*I24`다. +독립 tensor-polynomial K 적분과 normalized dense eigensolution으로 +`||K||F/E=9.235553192303684`, `||K||inf/E=9.755555555555556`, +`max|Kij|/E=1.4037037037037037`, `lambda_max/E=0.6304620575193911`을 얻었다. +`||M||F=58.78775382679627`이므로 최대 mode의 validation matrix scale은 +`46.29900142688912*E`다. 기존3e306은 이 scale도 finite여서 성공 반환이 +production guard 오류라는 근거가 없다. Consistent 당시 all-odd Walsh mode의 +overflow 가정은 채택된 lumped fixture에서 유지되지 않는다. + +| 독립 산술량 | E=3e306 | 제안·수정한 E=4e306 | +| --- | ---: | ---: | +| 최대 local K entry | `4.211111111111111e306` | `5.6148148148148146e306` | +| lambda_max | `1.8913861725581735e306` | `2.5218482300775645e306` | +| `||K||F` | `2.770665957691105e307` | `3.6942212769214736e307` | +| `lambda_max*||M||F` | `1.111903447037563e308` | `1.4825379293834174e308` | +| 위 두 scale의 FP64 합 | `1.3889700428066735e308`, finite | nonfinite | +| `||K||inf/(4/9)` | `6.585000000000001e307` | `8.780000000000002e307`, finite | + +Matrix-scale overflow의 경계는 E 약`3.882790296678553e306`이며 raw enclosure +division의 경계 약`8.189945944703032e306`와 분리된다. 기존 mass roundoff guard의 +작은 차감은 후보4e306의 enclosure 여유를 뒤집지 않는다. 따라서 E만4e306으로 +바꾸면 local K·lambda·enclosure를 finite로 유지하면서 기존 original-pencil +nonfinite-scale gate를 실제 자극한다. 이는 현재 연산 순서의 intermediate +matrix-scale overflow 검사이며 물리 eigenvalue 자체가 무한이라는 주장이 아니다. +Owner가 E 한 값과 highest-mode 주석을 수정했다. 실제 candidate FEAST/guard 실행은 +아직 확인하지 않았고 diagnostic code·기존`1e-10`·finite gate를 바꾸지 않는다. + +**HEX-LM-NR-002 — source corrected, focused execution pending: factory oracle.** +단위 cube·rho2의 full-row lumping은24 diagonals 각각0.25, offdiagonals exact0, +한 병진방향 total mass2다. 실행 body의 `M(0,3)=0`은 이 계약과 일치한다. +기존 test의 consistent `2/54` 기대가 잔존했다. Owner는 diagonal 기존 absolute +`1e-15`, total 기존`1e-13`을 유지하고 모든 offdiagonal을 exact0로 검사하도록 +수정했다. 비교 기준을 완화한 수정이 아니다. Factory 생성·source identity/DOF +검사와 zero linear response도 보존된다. + +닫힌 두 실패 body와 독립 산술/source hash 자료는 +`.dryforge/lumped-mass-adoption-20261011/independent-hex8-stale-fixture-review.json`이다. +현재 공유 전체 binary에는 후속 test-only 수정이 반영되지 않았다. 종료 뒤 rebuild와 +focused 실행 전까지 이 두 findings의 실행 폐쇄를 주장하지 않는다. Required Hex8 +원본5개의 bounded 외부 PASS와 새 전체 회귀 FAIL/진행 상태를 구분한다. + +### 2026-10-12 최종 종료 로그와 fixture 폐쇄 + +전체 serial MSVC x64 Debug CTest가 자연 종료했다. 원시789개 결과를 직접 재집계하고 +summary/native/hash에 대조하여 **784 PASS / 4 FAIL / 1 SKIP, native8**을 확인했다. +Elapsed는9131.26초다. FAIL은 shell C08a, shell C08b, 위 overflow fixture, +factory fixture이며 SKIP은 `C04aFinestReductionComparisonIsNumericallyResolved`다. +이로써 전체 실행 대기는 종료된 **FAIL**로 갱신된다. 원래4개의 실패 body와 +skip을 삭제하거나 후속 성공으로 소급 변경하지 않는다. + +**HEX-LM-NR-001 및 HEX-LM-NR-002 — CLOSED.** 공유 binary의 최종 rebuild native0 +이후 configured CTest에서 E=4e306 original-pencil nonfinite guard와 updated +factory full24 diagonal/offdiagonal 검사2개가 모두 PASS/native0다. +`final-stale-fixtures.log` 및 native 기록으로 실제 configured 실행을 확인했다. +새 HHT force-rate derivative와 기존 pointwise oracle2개도 별도 configured +CTest에서 PASS/native0다. 이 후속4개는 이전 shared binary의 전체789 실행과 +구분한다. 최종 discovery790을 확인했지만 **전체790은 재실행하지 않았다.** + +전체 전후 production190 files와 original reference16 files의 동일 inventory/hash를 +대조하고 현재 파일도 전부 재해시했다. 최종 unit binary SHA는 +`4e39c8992a527366e66ea295bf4598a068ca44456fc32c1ab973d2376759c11a`이며 actual +파일과 manifest가 일치한다. `final-oracle-identities.json`의 force-only note는 +실제3개 test TU 변경을 모두 기술하지 못한다. 원시 note를 변경하지 않고 별도 +`final-test-identities.json`이 누락을 명시 정정했으며3개 source·record hash도 +독립 확인했다. Production·원본·tolerance/gate 변경을 후속 test 수정에 섞지 않았다. + +닫힌 전체/focused/identity 감사는 +`.dryforge/lumped-mass-adoption-20261011/independent-final-regression-review.json`이다. +Hex8의 두 stale fixture findings는 폐쇄됐지만 HHT C08a 정확도/noise 문제와 +C08b principal-chart Newton failure는 **OPEN**이다. Final focused4 PASS를 +전체 green이나 shell 시간정확도 해결로 확대하지 않는다. Reviewer는 추가 +build/test·source 수정 없이 읽기 전용 감사와 보고서 정적 검토만 수행했다. diff --git a/docs/hex8-structural-analysis/physics-evaluation.md b/docs/hex8-structural-analysis/physics-evaluation.md new file mode 100644 index 0000000..6520e97 --- /dev/null +++ b/docs/hex8-structural-analysis/physics-evaluation.md @@ -0,0 +1,122 @@ +# Hex8 lumped 질량 변경본의 물리 평가 + +검토일: 2026-10-11–12. 적용 계약은 [PRD](PRD.md), [정식화](formulation.md), +[numeric controls](numeric-controls.md), [reference mapping](reference-model.md), +[HEX8-ADR-010](ADR.md)이다. `$fem-physics-review`에 따라 코드·계약·원본·출력을 +변경하지 않고 현재 생성된 evidence만 검토했다. 단위는 입력 일관 단위이며 SI로 단정하지 않는다. + +**현재 판정: 원본 5 case의 질량·모드·정적 및 HHT 관측 수지에 한정한 물리 대조 PASS. +전체 configured Debug 회귀는 실패로 종료했으며 최종 test-only 변경 후 전체 790개는 미실행이다. +기능 전체 통과나 release 승인이 아니다.** 과거 consistent 결과를 +lumped 변경본의 통과로 승계하지 않는다. + +## 원본 고유치의 독립 재계산 + +현재 evidence는 +`.dryforge/lumped-mass-adoption-20261011/references/hexa_freq/`의 +`native.json`, `comparison.json`, `hexa_freq_results.h5`다. CLI는 MSVC x64 Debug이며 +native exit 0, comparator도 PASS다. HDF5 SHA-256은 +`94a576bbfe1d5826235a6323e6d470163ed2e970c4fe6f65a86b2d65a3db7f8a`다. +원본과 실행 복사본의 raw SHA는 +`42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347`로 같다. + +저장된 기준 좌표·연결·E/ν/ρ로 Python/NumPy/SciPy에서 별도 8점 적분을 수행했다. +선형 강성은 deviatoric 항과 `κbbᵀ/V` 체적 항으로 재조립하고, 요소별 +`m_a=Σ_g ρN_a det J₀g`를 **전체 절점에 조립한 후** 고정 자유도를 제한했다. +생산 `ComputeMass`나 저장된 검사값을 독립 계산의 입력으로 사용하지 않았다. + +| 검사 | 현재 계산값 | 해석 | +| --- | --- | --- | +| Inventory와 BC | 442 nodes, 300 elements, 고정 51 / free 1275 scalar DOFs | 원본 모델과 일치 | +| 적분점 기준 Jacobian | `det J₀ ∈ [0.0173052408541, 0.0311031172125]` | 현재 적분점은 양수; whole-cell 인증 대체가 아님 | +| 기준 체적·질량 | `V=56.56854152`, `ρV=444063.050932` | 한 병진 축의 총 질량과 일치; 세 축 trace를 총 질량으로 쓰지 않음 | +| 조립 절점 질량 | `[423.377959037, 1380.99055553]` | 모두 양수이며 전체 영역의 기준 질량을 보존 | +| 모드·강체 증상 | IDs 1–10, 모든 λ>0, 고정 좌표의 eigenvector exact 0 | 지지된 모델에서 불필요한 강체 모드 징후 없음 | +| 독립 `max eta_r` / `max eta_energy` | `1.16389132e-17` / `4.15247286e-19` | 계약 `1e-10` 이내 | +| 독립 mass Gram / modal norm 결함 | `1.33287771e-15` / `4.44089210e-16` | 계약 `1e-10` 이내 | +| 원본 10 λ의 최대 상대차 | `1.96104961e-5 = 0.00196104961%`, mode 4 | 원본 singleton RMS 기준 1% 이내 | + +직접 λ 대조는 제공 TXT의 `Value`를 사용했다. 주파수의 제곱이나 인접 모드 재매칭을 +사용하지 않았다. 저장된 returned-pair 검사에는 25개가 있으며 최대 `eta_r=1.05545514e-17`, +전체 Gram `4.37942691e-15`다. Reviewer의 독립 벡터 재검산은 공개된 10개에 한정된다. +최저 모드 count/search bound의 별도 수치 검토를 이 물리 검사로 대체하지 않는다. + +## 신규 정적 2 case와 HHT 2 case의 수지 검산 + +닫힌 Debug 정적 2 case와 current production **Release** 선형/TL HHT 각각 101 frames를 +별도 8점 적분으로 재구성했다. 원본/복사본 raw bytes, native exit 0과 HDF SHA를 확인했고 +각 comparator도 PASS다. 상세 artifact SHA와 관측량은 +[lumped 계산 상세](lumped-mass-physics-details.json)에 있다. +동적 폴더는 `references/hexa_dynlinear-release/`와 `references/hexa_dynnonlinear-release/`이며 +Debug 동적 실행으로 표시하지 않는다. + +강성의 reference-relative derivative로 실제 infinitesimal/Green strain과 +`2μ dev(strain)+κ mean(trace)I`, TL first Piola/Cauchy stress, 내력·에너지를 +재계산했다. 동적 관측은 `T=½Σm_a|v_a|²`, `P=Σm_av_a`, +`L=Σ(X_a+u_a)×m_av_a`, 실제 endpoint force의 trapezoid work를 사용했다. +정적 case에는 동적 work/energy defect를 정의하지 않았다. + +| 현재 결과 | 주요 독립 계산의 최대 차이 | +| --- | --- | +| 선형 정적 | RF `1.74623e-10` force, stress `1.23382e-8` force/length², U `1.13687e-13` force·length | +| TL 정적 10 frames | RF `2.32831e-10`, stress `1.37079e-8`, U `1.42109e-13`; 동일 차원 순서 | +| 선형 HHT 101 frames | RF `3.49246e-10`, T `7.10543e-15`, P `3.63798e-12`, L `6.54836e-11`; 각 force / force·length / mass·length/time / mass·length²/time | +| 선형 HHT work / defect | `1.13687e-13` / `1.27898e-13` force·length | +| 선형 HHT force balance | normalized `1.41900e-16`; 저장 free residual을 포함한 ledger 차이 `7.22645e-10` force | +| TL HHT 101 frames | RF `3.49246e-10`, T `7.10543e-15`, P `5.45697e-12`, L `8.00355e-11`; 선형 HHT 행과 같은 차원 순서 | +| TL HHT work / defect | 각각 `1.70530e-13` force·length | +| TL HHT force / current moment balance | normalized `1.39768e-16` / `2.74239e-16` | +| 요소 합력·해당 arm 모멘트 | 정적/선형/TL HHT의 상쇄 전 norm 합 대비 모두 `2.46e-16` 이하 | + +구속 U 및 동적 V/a/A와 free RF는 exact 0이다. Positive 하중에 최종 중심 U의 세 성분이 +positive이며 거의 대칭인 원본 형상에서 x/y 차이는 `3.46e-10` length 이하이다. +TL 정적의 실제 Gauss-point `detF≥0.999986939`이고 energy는 양수다. +TL 정적 raw free residual 최대 `35.3624` force, 전체 force balance normalized +`2.48995e-6`은 승인된 정적 Newton residual 계약의 관측이다. 이를 동적 strict criterion으로 +바꾸거나 exact equilibrium으로 설명하지 않는다. Stored free residual을 포함한 static ledger의 +차이는 `7.10259e-10` force 이하다. + +선형 K의 내부 moment는 **reference arm**에서 0이다. Current arm에는 +`Σu×f_int`가 남아 선형 HHT의 실제 current moment balance 최대 `287.045278 force·length`다. +같은 내부 current moment를 포함한 ledger 차이는 `1.54483e-9 force·length`로 일치한다. +이를 TL 회전 불변성과 동일시하거나 0으로 강제하지 않는다. + +선형 HHT 최종 `(T,U,W,B)`는 +`(.249978981888,177.740764261,256.221236292,−78.2304930487)`이고 최대 T는 +`51.6145686844`다. T/U는 비음수다. Alpha<0와 endpoint work에서 정확 보존이나 +매-frame 단조 감소를 요구하지 않았으며 coarse original만으로 시간 정확도를 보증하지 않는다. +Rounded HDF state의 독립 free residual 재구성 최대 `1.10035e-7` force와 tiny 저장 residual은 +구분한다. 이 audit는 내부 high+low gate의 독립 재실행이 아니다. + +TL HHT에서는 현재 arm의 내부 moment 최대 `2.34564e-9 force·length`, 저장 free residual을 +포함한 current moment ledger 차이 `1.79830e-9`로 회전 불변 내력과 일관된다. +Gauss-point `detF≥0.999979043552`, T/U는 비음수다. 최종 `(T,U,W,B)`는 +`(.251339920298,177.770554367,256.242640663,−78.2207463760)`이고 최대 T는 +`51.6133464012`다. 새 TL HDF SHA-256은 +`8730e5562c91b3c7c9e654c811d2791ab7d24fdcc62286b0b28efa7cdc5957d6`다. +큰 strain/회전·임의 distorted mesh의 정확도에 이 작은 변형 원본을 확대하지 않는다. + +## 남은 검토와 coverage + +외부 V/A/energy 원본이 없으므로 U CSV 통과만으로 rate·시간 정확도를 판정하지 않는다. + +최초 focused 실행은 중단 기록(`exit -1`)이므로 전체 focused PASS로 사용하지 않는다. +후속 `new-kernels.log`/`new-kernels-native.json`은 exit 0 / 38 tests PASS를 확인했다. +여기에는 warped nodal 질량 적분, Jensen energy, BC 전 full mass, scalar/MDOF 시간수렴과 +readback 검사가 포함된다. 이 실행 범위를 전체 회귀·임의 warped cell 검증으로 확대하지 않는다. +전체 Debug CTest는 native 8로 자연 종료했으며 raw **784 PASS / 4 FAIL / 1 SKIP (789개)**를 +보존했다. Shell C08a 시간수렴과 C08b의 새 chart 이탈 외의 두 실패는 이전 consistent +off-diagonal을 요구하던 factory expectation과 lumped pencil에서는 finite인 overflow fixture다. +Test-only 수정 후 두 검사는 `final-stale-fixtures.log`/native record에서 **2 PASS / native 0**이다. +Factory는 diagonal nodal mass를 확인하고 overflow는 `E=4e306`에서 실제 nonfinite validation을 +검사한다. `E=3e306` 사례를 실패시키도록 production gate나 tolerance를 바꾸지 않았다. + +같은 최종 Debug rebuild의 HHT force-rate oracle/pointwise 두 검사도 별도 PASS다. +최종 discovery는 790개이며 **전체 790개는 재실행하지 않았다**. Raw 789개와 후속 2+2 결과를 +합쳐 새 전체 통과 수를 만들지 않는다. Production 190/reference 16 files의 현재 SHA를 +`closed-identities-after-final-regression.json`과 독립 대조해 불일치 0을 확인했으므로, +앞의 원본 5 case 물리 대조는 유지한다. C08a/C08b OPEN 및 C04a SKIP과 이 원본 대조를 구별한다. +새 C08b 예외를 과거 baseline의 동일 실패라고 분류하지 않으며 해당 영향과 최종 manifest는 +[Shell 물리 검토](../hht-implicit-dynamics/physics-evaluation.md)에 있다. +전역 최신 상태는 +[PRD checklist](PRD.md)를 따른다. diff --git a/docs/hex8-structural-analysis/physics-review.md b/docs/hex8-structural-analysis/physics-review.md index ef6c979..4d5d045 100644 --- a/docs/hex8-structural-analysis/physics-review.md +++ b/docs/hex8-structural-analysis/physics-review.md @@ -1,5 +1,7 @@ # Hex8 high+low 동해석의 한정된 물리 검토 +2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. + 적용 계약은 [precision formulation](precision-formulation.md)과 [PRD](PRD.md)다. 2026-10-10 `hex8_precision_physics` reviewer가 작성자와 독립적으로 아래 닫힌 evidence와 해석적 oracle를 검토했다. 검토 범위에서 물리 blocker는 없지만 원본 비교·전체 기능 완료의 diff --git a/docs/hex8-structural-analysis/precision-formulation.md b/docs/hex8-structural-analysis/precision-formulation.md index d7c6a8c..7dc46a6 100644 --- a/docs/hex8-structural-analysis/precision-formulation.md +++ b/docs/hex8-structural-analysis/precision-formulation.md @@ -1,5 +1,7 @@ # Hex8 동해석 high+low 정식화 +2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. + 적용: 사용자가 2026-10-09 선택 A로 승인한 [정밀도 제안](precision-proposal.md). 기본 물리식·DOF·부호·적분점 순서는 [formulation](formulation.md), 판정 원본은 [numeric-controls](numeric-controls.md), 영속 출력은 [I/O](io.md)다. 본 문서는 diff --git a/docs/hex8-structural-analysis/precision-proposal.md b/docs/hex8-structural-analysis/precision-proposal.md index 6c279b3..14e5145 100644 --- a/docs/hex8-structural-analysis/precision-proposal.md +++ b/docs/hex8-structural-analysis/precision-proposal.md @@ -1,5 +1,7 @@ # Hex8 동해석 내부 정밀도 변경안 — 승인됨 +2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. + 2026-10-09 사용자가 A를 선택해 내부 high+low 물리 상태와 Float64 출력의 반올림 의미를 승인했다. 이 문서는 [PRD](PRD.md)·[정식화](formulation.md)· [numeric controls](numeric-controls.md)의 변경 근거이며, 구현 완료를 뜻하지 않는다. diff --git a/docs/hex8-structural-analysis/reference-discrepancy-proposal.md b/docs/hex8-structural-analysis/reference-discrepancy-proposal.md index 39895f2..b86d5a8 100644 --- a/docs/hex8-structural-analysis/reference-discrepancy-proposal.md +++ b/docs/hex8-structural-analysis/reference-discrepancy-proposal.md @@ -1,5 +1,7 @@ # 정적 원본 불일치와 변경 선택지 — B 승인 +2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. + 2026-10-10 사용자는 B: 체적 평균 energy 도입 후 전체 재검증을 승인했다. 새 정식화는 [PRD](PRD.md)·[ADR-009](ADR.md)·[formulation](formulation.md)을 따른다. 전체 high+low 물리 상태·원본·수치 기준은 유지한다. A는 선택되지 않았다. diff --git a/docs/hex8-structural-analysis/reference-mass-investigation.md b/docs/hex8-structural-analysis/reference-mass-investigation.md new file mode 100644 index 0000000..e2b06b2 --- /dev/null +++ b/docs/hex8-structural-analysis/reference-mass-investigation.md @@ -0,0 +1,149 @@ +# Hex8 원본 질량·요소 설정 조사 + +2026-10-11 사용자가 제공한 고유치 결과의 불일치를 조사했다. 원본 입력에서 확인한 사실, +공식 문서의 동작 설명, 별도 수치 재현을 구분한다. 이 문서는 질량 정식화 채택이나 승인 +변경이 아니다. 현재 요구와 완료 판정은 [PRD](PRD.md), 실제 생산 결과의 FAIL은 +[verification](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)에 유지한다. + +## 결론과 증거의 범위 + +**현재 FESA의 consistent 질량과 Abaqus 1차 요소의 row-sum lumped 질량 차이가 +이번 고유치 불일치의 주된 원인이라는 강한 근거를 확보했다.** +승인된 평균 체적 강성을 유지하고 질량만 row-sum lumped로 바꾼 별도 계산에서 +최저10개 고유치가 모두 원본과 상대차이0.00196105% 이하로 일치했다. +같은 계산의 consistent 질량은 실제 FESA 고유치를 상대차이4.57e-12 이하로 재현했다. + +이는 공식 문서와 동일 입력의 통제된 수치 재현에 기반한 판단이다. 원본 Abaqus 실행의 +실제 K/M 계수를 직접 확보한 것은 아니며 private 내부 알고리즘 전체의 동등성 증명이 아니다. +Production 수식·질량·reference·tolerance는 수정하지 않았다. 별도 계산의 일치를 +현재 FESA의 필수 modal 비교 PASS로 승격하지 않는다. + +## 입력에서 직접 확인한 설정 + +원본은 [hexa_freq.inp](../../reference/hexa/hexa_freq.inp)이며 raw SHA는 +[원본 inventory](reference-model.md)에 있다. 파일의 전체 keyword를 확인했다. + +| 항목 | 원본 설정 | 의미·확인 범위 | +| --- | --- | --- | +| 생성기 표기 | Abaqus/CAE Learning Edition 2024 | 입력 작성 도구 표기이며 실제 실행 solver 버전 증명은 아님 | +| 요소 | `*ELEMENT, TYPE=C3D8`,300개 | 8절점 선형 brick; `C3D8R`, `C3D8I`, `C3D8H`가 아님 | +| 절점·자유도 | 442절점, 병진1–3 | 구속51성분, free1275성분; 회전 zero BC는 승인된 inactive no-op | +| Section | `*SOLID SECTION, ELSET=Set-1, MATERIAL=Material-1` | 모든300개에 같은 solid material 연결; 별도 section controls 없음 | +| 재료 | `*ELASTIC`: E=2.1e11, nu=.3 | 상수 등방성 탄성 | +| 밀도 | `*DENSITY`:7850 | 단위계는 user-consistent-unspecified; SI라고 별도 확정하지 않음 | +| Step | 유일한 `Step-1`, `NLGEOM=NO, PERTURBATION` | 선행 general step·initial stress 없는 원형상 frequency | +| Eigensolver | `LANCZOS, SIM` | 최저10 modes 요청; 별도 frequency range/shift 입력 없음 | +| Normalization | `NORMALIZATION=MASS` | 고유벡터의 generalized mass를1로 정규화하는 설정 | +| Acoustic coupling | `ACOUSTIC COUPLING=ON` | acoustic/ASI/tie 요소가 없는 이 입력에서 연성 모델을 추가하지 않음 | +| 추가 질량 | 관련 keyword 없음 | point mass·rotary inertia·nonstructural mass·mass scaling·matrix input 정의 없음 | + +`NORMALIZATION=MASS`는 consistent mass 선택 옵션이 아니다. 공식 +[*FREQUENCY 문서](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm)의 +Normalization 절은 실제 사용하는 구조 질량행렬에 대해 고유벡터 크기를 정규화한다고 설명한다. +고유벡터에 상수를 곱하는 것과 질량행렬을 변경하는 것은 서로 다른 동작이다. + +## 공식 문서의 요소·질량 동작 + +[Solid isoparametric quadrilaterals and hexahedra](https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-solidisoquadhex.htm)의 +Fully integrated first-order 절은 Gauss point의 체적변화를 요소 평균으로 대체하는 +selective reduced integration을 설명한다. 따라서 C3D8의 full integration이라는 이름을 +체적 항까지 수정 없는 pointwise `BᵀCB`로 해석하면 안 된다. +현재 FESA는 승인된8점 deviatoric+평균 trace 체적 energy를 사용한다. 이번 조사에서 +강성을 새로 변경하지 않았으며, 유한변형에서 Abaqus의 평균 J/Fbar 처리와 평균 Green +trace 모델 전체가 같다는 결론도 내리지 않는다. + +[Implicit dynamic analysis](https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-dynamics.htm)의 +질량 정의 다음 문단은 Abaqus의1차 요소가 대각 lumped 질량을 사용하며 consistent +행렬의 각 행 합을 대각에 모으는 방법이라고 명시한다. 이 설명은 자연진동수 수치 실험도 +직접 언급한다. 앞의 C3D8 입력은 이1차 요소에 해당한다. 문서상의 질량 관계는 다음과 같다. + +\[ +(M_C)_{ai,bj}=\delta_{ij}\int_{V_0}\rho_0N_aN_b\,dV_0, +\qquad (M_L)_{ii}=\sum_j(M_C)_{ij},\qquad (M_L)_{ij}=0\ (i\ne j). +\] + +현재 FESA는 `M_C`를 사용하고 문서상 Abaqus 1차 요소 동작은 `M_L`이다. +같은 총질량이라도 off-diagonal 관성 coupling이 달라지므로 각 모드의 고유치 차이가 +일정 비율일 필요는 없다. `NORMALIZATION=MASS`와 이 차이를 혼동하지 않는다. + +인용한 공식 문서는2025판이다. 2024판 해당 URL은403으로 본문을 확보하지 못했다. +따라서2024 실행의 내부 계수까지 확인했다는 의미로 쓰지 않는다. 다만 아래 실제 원본 +고유치 재현은 문서 설명과 일관된다. + +## 같은 모델에서 K/M 차이를 분리한 계산 + +원본442절점·300요소·밀도·BC51성분을 그대로 읽고3N 행렬을 별도로 조립했다. +강성 두 종류와 질량 두 종류의 조합을 비교했다. 강성은 평균 infinitesimal trace 또는 +pointwise 체적 항, 질량은8점 consistent 또는 그 full 행 합 lumped다. +Lumping은 **구속 열을 제거하기 전 full 행렬에서 수행**하고, 그 뒤 같은 free1275공간으로 +제한한다. 구속을 먼저 제거한 Mff의 행 합은 원래 구속 절점의 기여를 잃으므로 사용하지 않는다. + +Python/SciPy sparse generalized eigensolve로 최저10개를 구했다. 같은 입력·node ordering, +고정 시작벡터와 sigma0 shift-invert를 사용하며 반복 고유치를 제거하지 않았다. +원본 Value=λ를 그대로 mode별 비교하고 공통1% RMS/row5%를 유지했다. + +| 별도 계산 조합 | 최대 고유치 상대차이 (%) | 1% 기준 내 modes | +| --- | ---: | ---: | +| 평균 trace K + consistent M | 20.2513234932 | 3/10 | +| 평균 trace K + row-sum lumped M | **0.0019610496** | **10/10** | +| Pointwise 체적 K + consistent M | 20.2513359080 | 1/10 | +| Pointwise 체적 K + row-sum lumped M | 4.3745703299 | 2/10 | + +전체 모드를 확인했으며 대표 변화는 다음과 같다. 표의 출력 자리만 줄이고 실제 비교에는 +반올림 전 값을 사용했다. + +| Mode | 원본 λ | 평균 K + consistent M | 평균 K + lumped M | +| ---: | ---: | ---: | ---: | +| 1 | 496.28 | 497.153597 | 496.281253 | +| 2 | 496.28 | 497.156909 | 496.284560 | +| 3 | 18302 | 18519.547027 | 18302.192012 | +| 4 | 18302 | 18519.716390 | 18302.358911 | +| 5 | 52797 | 63489.091265 | **52796.905642** | +| 6 | 131213 | 134772.818712 | 131212.943849 | +| 7 | 131214 | 134773.663066 | 131213.797734 | +| 8 | 165943 | 166062.030100 | 165943.347547 | +| 9 | 449258 | 470919.350202 | 449257.575005 | +| 10 | 449260 | 470921.678068 | 449259.777928 | + +Reference volume=56.56854152, total mass=444063.050932이며 consistent/lumped의 +각 병진 방향 총질량도 같았다.4조합의 최대 infinity-norm backward residual은 +2.43e-14 이하, mass Gram 오차는2.11e-15 이하다. 진단 JSON의 `max_eta_r`라는 field는 +이 infinity-norm metric이며 승인된 T5 Euclidean/Frobenius eta_r와 구분한다. +원본14개 파일의 전후SHA도 동일하다. 이는 별도 계산의 수치 정합성과 원본 보존 근거이며 +FESA 구현을 변경·재실행한 근거가 아니다. Private eigsh 계산은 실제 FEAST의 +lowest-N count certification을 수행하지 않았으므로 공식 고유치 절차 검증을 대신하지 않는다. + +## 원시 자료와 채택 전 과제 + +실제 명령은 `uv run --with h5py --with scipy python -B .dryforge/investigate_hex8_modal_mass.py`, +native exit0으로 자연 종료했다. Script·stdout·argv/native/timestamps는 로컬 +`.dryforge/investigate_hex8_modal_mass.py`, `hex8-modal-mass.log`, `hex8-modal-mass-native.json`에 있다. +행렬·고유벡터·10개 모드의 전체 metric은 +`.harness/hex8-evidence/mean-volume/modal-mass-investigation/result.json`과 인접npz에 보존했다. +원시 자료는 ignored 진단 evidence이며 공식 출력이나 사용자 원본이 아니다. + +별도 reviewer가 script의 engineering shear·Gauss gradient·체적 평균 coupling·mass 조립과 +full-row-sum 뒤 BC restriction을 검토했다. 저장된 K/M/고유벡터에서 eigen residual·mass Gram· +10개 source 오차와 baseline의 실제 FESA 재현을 독립 재계산해 audit native0·finding0을 확인했다. +Euclidean/Frobenius eta_r의4조합 최댓값은3.79e-15 이하, Gram Frobenius 오차는3.36e-15 이하다. +소비 자료의 전후SHA도 동일했다. 원시 독립 자료는 같은 폴더의 `independent-result.json`, +`independent-native.json`, `independent-audit.py`다. 결과 SHA는 +`6dab2a7e7d7bb1a3d4a71fdb240fe00e552242c77ef0781a01a92cf00ee8b159`다. +이 bounded 검토는 production 채택·실제 FEAST count certification·외부 전체 검증이 아니다. + +추가 직접 확인에는 실제 Abaqus 실행 버전·job 진단과 mode vectors 또는 operator evidence가 +도움이 된다. [*MATRIX GENERATE 문서](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-matrixgenerate.htm)는 +`MASS`/`MASS=CONSISTENT`로 consistent 행렬을 생성한다고 설명하므로, export된 M을 +무조건 frequency의 lumped M과 동일시하지 않는다. 원본 모델이나 외부 solver를 이번 조사에서 +실행·변경하지 않았다. + +FEM-REQ-HEX8-007과 HEX8-ADR-002는 eigen/HHT 공통 consistent M을 요구하고 lumping을 금지한다. +이번 진단으로 그 계약은 변경되지 않는다. Frequency만 silent lumping으로 바꾸는 것도 계약 변경이다. +채택 판단에서는 공통 mass 방침과 입력·결과 metadata의 의미를 먼저 결정하고, 질량 불변량, +original-pencil, 정적·동적을 포함한 필요한 회귀와 reference 비교를 재확인해야 한다. +과거 동적 U 일치만으로 두 mass 행렬이 같다고 추론하지 않는다. + + +## 2026-10-11 후속 질량 정책 승인 + +사용자는 고유치·HHT lumped mass 채택을 명시 승인했다([HEX8-ADR-010](ADR.md)). 위 조사와 private 비교는 채택 전 원문 기록이며 production 검증으로 승계하지 않는다. 현재 채택 수식은 [formulation](formulation.md), 변경본 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. 원본 reference·허용값·HHT 계수와 출력 layout은 유지한다. diff --git a/docs/hex8-structural-analysis/reference-model.md b/docs/hex8-structural-analysis/reference-model.md index 71cb15b..27ed3d0 100644 --- a/docs/hex8-structural-analysis/reference-model.md +++ b/docs/hex8-structural-analysis/reference-model.md @@ -1,7 +1,8 @@ # Hex8 원본과 비교 mapping 기준은 [PRD](PRD.md)의 FEM-REQ-HEX8-022–023와 [공통 수치 정책](../TOLERANCE.md)이다. -Source revision은2382d3a이며 사용자 제공 `reference/hexa/`의5 INP·8 CSV를 read-only로 사용한다. +기존 source revision은2382d3a이며 사용자 제공 `reference/hexa/`의5 INP·8 CSV와 +2026-10-11 첨부된 `hexa_freq.txt`를 read-only로 사용한다. 새 TXT의 raw SHA로 추가 원본을 식별한다. 아래 hash는 현재 Windows working-tree raw bytes(CRLF) 기준이며 Git LF blob hash와 구분한다. ## 원본 inventory @@ -9,7 +10,7 @@ Source revision은2382d3a이며 사용자 제공 `reference/hexa/`의5 INP·8 CS 442 nodes/300 C3D8 elements, material E=2.1e11/nu=.3/rho=7850, source Step-1이다. Static DIRECT h=.1/T=1의 마지막 Increment10을 비교하고 nonlinear은 NLGEOM=YES다. Dynamic DIRECT h=.1/T=10의 Increment0..100 전체를 비교한다. Amp-1은 `(0,0),(.1,1),(10,1)`다. -Frequency는 original unstressed 상태의10 modes 요청이며 결과 Value는 아직 제공되지 않았다. +Frequency는 original unstressed 상태의10 modes 요청이며 결과 Value는 `hexa_freq.txt`에 제공됐다. 원본5개 모두 Set-1의 zero rotational BC4/5/6을 포함한다. 사용자 승인된 [HEX8-ADR-007](ADR.md#hex8-adr-007--inactive-zero-rotational-bc의-한정된-호환-예외)에 따라 이 행만 source warning/no-op으로 처리하며 원본과 실제3N mapping을 보존한다. @@ -21,6 +22,7 @@ Frequency는 original unstressed 상태의10 modes 요청이며 결과 Value는 | `hexa_dynnonlinear.inp` | — | `1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9` | | `hexa_dynnonlinear_U.csv` | 44642 | `f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226` | | `hexa_freq.inp` | — | `42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347` | +| `hexa_freq.txt` | 10 modes | `3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370` | | `hexa_linearstatic.inp` | — | `67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647` | | `hexa_linearstatic_RF.csv` | 442 | `3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b` | | `hexa_linearstatic_S.csv` | 2400 | `8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8` | @@ -40,6 +42,20 @@ Stress는300×8×6 전부 포함하며 elemental-nodal stress·절점 외삽· Dynamic U는101 frame 각각442×3인 독립 blocking family다. Frequency Value는 mode별 singleton이며 MITC4 eigen scoped5% RMS 예외를 적용하지 않는다. +제공 TXT의 행 형식은 `Mode n: Value = lambda Freq = f (cycles/time)`다. +`Value`는 고유치 λ(`1/time^2`)이며 HDF5 `eigen/modes.eigenvalue`와 직접 비교한다. +`Freq`는 cycles/time의 보조 열이고 비교값으로 변환하지 않는다. 시간 단위를 SI로 추정하지 않는다. +TXT에는 step field가 없으므로 고정 case `hexa_freq`와 hash-checked 입력의 유일한 `Step-1`에 +한정해 대응한다. 다른 모델·step을 판별하는 범용 형식으로 설명하지 않는다. +Mode ID1–10을 일대일 대응하고 반복 고유치를 제거하거나 가까운 값으로 재매칭하지 않는다. +빈 줄은 허용하되 잘못된 형식·mode 누락/추가/중복·비유한/음수 값·mode별 역순 Value는 실패다. +실제 비교에서는 원본 raw SHA도 고정하며 수정한 복사본을 정상 원본으로 취급하지 않는다. + +2026-10-11 후속 [질량·요소 설정 조사](reference-mass-investigation.md)는 Abaqus1차 요소의 +row-sum lumped 질량과 조사 당시 FESA consistent 질량의 차이를 확인했다. 동일 평균 K에 +lumped M을 사용한 별도 진단은10개 λ 모두 상대차이0.00196105% 이내였지만, +생산 구현의 mass 계약이나 실제 modal FAIL 판정을 변경하지 않는다. + Key는 source case/step/frame 또는 increment/canonical instance/node 또는 element/IntPt/component다. CSV header whitespace만 lexical 정규화하고 duplicate/missing/extra/nonfinite required value를 tolerance 전에 실패시킨다. `PART-1-1`과 input raw `Part-1-1`은 기존 Abaqus case 의미로 대응한다. @@ -64,12 +80,18 @@ PASS가 아니다. Nearest-position matching을 수행하지 않았고 어떤 `.harness/hex8-evidence/reference-inventory.json`이며 해당 ignored evidence를 지속할 사용자 파일로 오인하지 않는다. Formal comparator의 identity/coordinate controls는 동일 의미를 실제 tests로 검증한다. -## 비교 정책과 준비 대기 +## 비교 정책과 남은 검증 + +2026-10-11 [HEX8-ADR-010](ADR.md)이 reference lumped mass를 승인했다. 다음7/10 FAIL은 +consistent M의 과거 판정이며 변경본은 원본5 case와 독립 물리/시간 검증을 다시 수행한다. +현재 metadata는 `lumped-reference`이며 과거 파일을 metadata만 바꾸어 재사용하지 않는다. Common policy: reference-only S=max abs, B=.01S, near-zero error<=B, 일반 relative<=.05, family RMS/S<=.01, S=0 exact-zero다. 다른 quantities/units/frame을 합쳐 scale을 바꾸지 않는다. -Frequency 원본 quantity/units/mode/step/hash는 제공 후 먼저 확인한다. 결과를 생성·추정하거나 -FESA 결과를 reference로 사용하지 않는다. 필수 원본 부재는 미실행/기능 검증 대기다. +Frequency 원본 quantity/units/mode/step binding/hash 확인과 실제 비교를 수행했다. +최저10개 중7개 singleton이1% RMS 기준을 초과해 기능 검증은 완료 대기다. +상세 판정은 [최종 고유치 비교](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)에 있다. +결과를 생성·추정하거나 FESA 결과를 reference로 사용하지 않는다. 원본 부재 시에는 미실행이다. Dynamic V/A/reaction/energy의 외부 자료는 없어 independent physical/temporal 검증이 필수다. 현재 inventory/convention 확인은 parser 실행·FESA 수치 결과 비교·기능 검증 PASS가 아니다. diff --git a/docs/hex8-structural-analysis/verification.md b/docs/hex8-structural-analysis/verification.md index 7f16c24..5e293e7 100644 --- a/docs/hex8-structural-analysis/verification.md +++ b/docs/hex8-structural-analysis/verification.md @@ -1,5 +1,14 @@ # Hex8 verification and original comparison evidence +2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. + +현행 필수 원본5개 비교는 모두 PASS이며 최저10 modal Value의 최대 상대차는 +`0.0019610496%`다. [변경본 검증](lumped-mass-adoption.md)에 전체789개 자연 종료와 +test-only 수정 후 재검사를 구분했다. 기존 consistent modal FAIL은 아래 이력이며 +현재 불일치가 아니다. 당시 Shell C08b runtime 실패는 후속 승인된 초기 Newton +정책에서 해소됐다. 최신 검증과 사용자 중단, 전체 검증 유예의 범위는 +[최종 인계](final-handoff.md)를 따르며 과거 PASS/FAIL을 최신 전체 통과로 승계하지 않는다. + This page records the build/test evidence, comparison-only Python tool and actual original results. Historical pointwise results and the approved mean-volume change are recorded separately. It does not replace the feature PRD, numerical controls or completion @@ -34,7 +43,7 @@ The tool is not a solver launcher, result generator, reference repair or release readiness check. The fixed source inventory is the [reference-model](reference-model.md) inventory: -442 nodes, 300 C3D8 elements and 13 frozen original files. Input and CSV raw SHA256 +442 nodes, 300 C3D8 elements and 14 frozen original files, including the supplied modal TXT. Input and CSV/TXT raw SHA256 must match the documented Windows working-tree bytes. The HDF5 metadata must identify the actual lexically normalized absolute scratch path and that file's FNV1a64 content identity; a different path with identical bytes is not silently accepted. @@ -73,12 +82,73 @@ row deletion or cancellation of signed errors is applied. Reports preserve each scalar identity/value/error/branch/pass and family scale/band/max-absolute-error, absolute/relative RMS, source SHA and policy. -The independent typed modal comparison behavior requires explicit source step, -mode1–10, eigenvalue or frequency quantity, and matching `1/time^2` or `1/time` -units. Each mode is a singleton using the same RMS1% policy. This is not an -assumption about the absent original Value file's eventual CSV layout. Actual -modal original comparison remains **NOT RUN** until a genuine reference is -provided and its semantics and hashes are confirmed. +The supplied modal TXT uses `Mode n: Value = lambda Freq = f (cycles/time)`. +Value is compared directly with the HDF5 eigenvalue (`1/time^2`); Freq is finite +auxiliary data, without conversion or assumed SI time units. The TXT has no step +field: its fixed hexa_freq case binds to the sole Step-1 in the hash-checked input. +Modes1–10 are matched by ID, retaining repeated eigenvalues. Each mode is a +singleton using the same RMS1% policy. An absent TXT remains NOT RUN; malformed +or hash-mismatched data fail prechecks. The previous consistent-mass result failed +seven families, as recorded below; the current lumped-mass result passes all ten. + +## 2026-10-11 제공된 고유치 원본의 최종 비교 + +사용자 제공 `reference/hexa/hexa_freq.txt`의 raw SHA256은 +`3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370`이다. +기존 `18b36c1` frozen CLI가 native0으로 자연 종료한 실제 공식 HDF5를 사용했다. +HDF5 SHA는 `f6203936883df7f27e86a20311726b7e59fefa117e5f9fa67f71bdf63ec2e4cb`이며 +이번에 새 C++ solver 실행으로 표현하지 않는다. 실제 scratch 입력·결과 hash 및 closed +CLI record,442절점·300요소·51구속·10 modes, quantity/unit/finite precheck는 PASS다. + +```powershell +uv run --with h5py python -B scripts/verification/compare_hex8.py ` + --case hexa_freq ` + --input .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/hexa_freq.inp ` + --results .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/hexa_freq_results.h5 ` + --execution-record .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/native.json ` + --report .harness/hex8-evidence/mean-volume/modal-final/comparison.json +``` + +실제 comparator native exit1, numerical FAIL이다. Mode별 singleton의 RMS/S는 +`abs(lambda_fesa-lambda_reference)/abs(lambda_reference)`이며 공통1% 기준을 적용했다. +다음 표는 가독성을 위해 출력 자리만 줄였고 실제 판정에는 반올림 전 값을 사용한다. + +| Mode | 원본 Value λ | FESA λ | RMS/S (%) | 판정 | +| ---: | ---: | ---: | ---: | --- | +| 1 | 496.28 | 497.153597379 | 0.176029 | PASS | +| 2 | 496.28 | 497.156908818 | 0.176696 | PASS | +| 3 | 18302 | 18519.547026780 | 1.188652 | FAIL | +| 4 | 18302 | 18519.716390186 | 1.189577 | FAIL | +| 5 | 52797 | 63489.091264684 | 20.251323 | FAIL | +| 6 | 131213 | 134772.818711666 | 2.713008 | FAIL | +| 7 | 131214 | 134773.663065696 | 2.712868 | FAIL | +| 8 | 165943 | 166062.030100247 | 0.071730 | PASS | +| 9 | 449258 | 470919.350201648 | 4.821584 | FAIL | +| 10 | 449260 | 470921.678067527 | 4.821635 | FAIL | + +10 families 중7개 RMS 실패, scalar row5% 실패는 mode5의1개다. MITC4의 scoped5% +RMS 예외를 적용하거나 frequency로 변환하지 않았다. Source 반복 고유치를 합치거나 +값이 가까운 모드에 재매칭하지 않았다. TXT 원본은 수정하지 않았다. + +비교기 새 동작11개의 RED 실패를 관측한 뒤 원본 TXT reader와 실제 frequency 분기를 연결했다. +추가된 성공 경로까지12개 새 검사와 기존 영향 검사 모두 PASS다. 실제 명령은 +`uv run --with h5py --with pytest python -B -m pytest tests/test_compare_hex8.py tests/test_compare_hht_dynamic.py -q --junitxml=.harness/hex8-evidence/mean-volume/modal-final/affected.xml`, +native0·136 PASS(95 Hex8/41 HHT)·24.52초다. Raw log·JUnit·argv/native/timestamps는 +`modal-final/affected.log`, `affected.xml`, `affected.json`에 보존했다. +Schema fixture의 PASS/의도된 FAIL은 비교기 동작 근거이며 실제 modal 일치의 PASS가 아니다. + +독립 read-only 감사는 native0·finding0으로 동일한7개 실패를 재현했다. 원본14개를 포함한 +소비23개 artifact의 SHA를 전후 확인했다. 이번 추가 검증의 종료 요약은 +`modal-final/closure.json`이며 과거 원본 부재 시의 `mean-volume/closure.json`과 +`comparisons/hexa_freq/comparison.json`은 당시 NOT RUN 기록으로 보존했다. + +이번 변경은 비교기·Python 검사·문서에 한정되고 C++ 수식/질량/절차/출력은 변경하지 않았다. +직전에 완료한 전체787 회귀는 아래 기록대로 native8·784 PASS·기존 FAIL2·SKIP1이며 +이번 Python 검사로 전체 회귀를 새로 실행한 것으로 보고하지 않는다. 전체 Python의 +기존 collection5 오류도 해결한 것으로 보고하지 않는다. +최종 modal 수치 불일치가 남아 기능 완료는 대기다. 원인 분리와 승인 경계는 +[미해결 문제](../tracking/findings.md#hex8-제공-고유치-원본과-최저10-모드-불일치)에 기록한다. +독립 검토의 범위와 원시 자료는 [수치 검토](numerical-review.md)를 따른다. ## 비교기 개발과 변경 전 pointwise 구현의 관측 이력 diff --git a/docs/hht-implicit-dynamics/ADR.md b/docs/hht-implicit-dynamics/ADR.md index 5398adb..c635b40 100644 --- a/docs/hht-implicit-dynamics/ADR.md +++ b/docs/hht-implicit-dynamics/ADR.md @@ -56,6 +56,7 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen ## HHT-ADR-007 — HHT 일관질량 선택 +- 대체 이력: 2026-10-11 [HHT-ADR-012](#hht-adr-012--고유치hht-lumped-mass-채택)이 질량 선택을 대체했다. 아래는 당시 승인 기록이다. - 상태: `accepted-user-decision` - Owner: 메인 assistant; 수학 정의는 formulation-agent. - 승인 근거: 사용자가 질량 선택 질문에 “일관질량 (추천): shell 속도 보간의 운동에너지를 그대로 적분”을 선택했다. @@ -73,6 +74,7 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen ## HHT-ADR-009 — I/O·구현·Physics Evaluation 수행 +- 대체 이력: 질량 선택 부분은 2026-10-11 HHT-ADR-012로 대체되며 나머지 승인 범위는 유지한다. - 상태: `accepted-for-implementation`; 검증 결과의 통과와 구별. - Owner: 메인 assistant; I/O 정의·구현·독립 physics review는 각 할당 담당자. - 승인 근거: 사용자의 “I/O definition, implementation, physics evaluation gate 모두 진행하세요” 및 후속 “깃에 커밋 하면서 진행하세요”. @@ -82,6 +84,7 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen ## HHT-ADR-010 — Newton 시작 형상과 영변형 산술 +- 대체 이력: 2026-10-12 [HHT-ADR-013](#hht-adr-013--두-초기-형상의-newton-시작-선택)이 q_n 단독 시작 정책을 대체했다. 영변형 산술 수정과 당시 검증 기록은 유지한다. - 상태: `accepted-implementation-detail`; reference 통과를 의미하지 않는다. - Owner: 메인 assistant; 독립 수치 검토는 numerical-review-agent. - 근거: 승인된 전체 구현 범위 안의 수치 시작값 선택. `.harness/build/hht-numerical/zero-trial-red.log`와 original reference 실행에서 먼저 실패를 재현했다. @@ -97,3 +100,71 @@ Feature 범위·상태는 [PRD](PRD.md), 상세 acceptance intent는 [requiremen - 결정: 기존 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 오차는 별도로 해결해야 하며 채택은 검증 결과를 제시한 뒤 결정한다. + +## HHT-ADR-012 — 고유치·HHT lumped mass 채택 + +- 상태: `accepted-user-decision`; 변경본 검증 완료와 구별. +- 승인: 2026-10-11 사용자 “앞으로 고유치 해석과 HHT 동해석에서 질량 행렬은 lumped mass로 계산”. +- 결정: 기존 MITC4 eigen의 nodal block lumped 질량은 유지한다. HHT는 `rho*N_i*dV0`의 nodal kinetic measure로 M, I, c, DqI, DvI, T, P, L 및 rates를 함께 계산한다. Scalar diagonal 치환이나 finite-rotation global matrix의 단순 row sum이 아니다. +- 보존: 기준/현재 geometry 검사, 3×3×3 mass 적분, 회전 chart와 moving drilling null·실제 free null intersection, physical20 positivity 및 정확한 관성 미분을 유지한다. HHT 계수·physical a/auxiliary A·초기화·schedule·tolerance·field/shape/dtype/schema layout은 유지한다. Metadata는 `nodal-lumped-kinetic`이다. +- 대체: HHT-ADR-007 및 HHT-ADR-009의 consistent mass 선택 부분을 대체한다. 기존 consistent 연구·검증은 역사적 evidence로 보존하고 변경본 통과로 승계하지 않는다. +- 검증: 독립 nodal oracle·eigen 초기 M 대조·warped moment·Jensen·관성 partial/접선·momentum/power·C08·원본 비교와 전체 Debug 회귀를 새로 실행한다. 기존 C08 실패와 정확도 요구는 유지한다. 진행 상태는 [PRD](PRD.md)의 현재 checklist만 따른다. + +## HHT-ADR-013 — 두 초기 형상의 Newton 시작 선택 + +- 상태: `accepted-user-task-implementation`; 실행·정확도 판정과 구별. +- 날짜·승인 근거: 2026-10-12 사용자 “newton 회전 실패를 피하기 위한 방법을 적용하세요”. +- 근거: [실패 조사](newton-rotation-investigation.md)에서 q_n 시작의 off-root 관성 잔차와 moving-null 미분의 상쇄를 확인했다. q_p 단독 시작은 기존 큰 DIRECT 증분에서 geometry가 유효해도 초기 잔차가 약 `4.60e19`여서 후속 Newton geometry 실패를 만들었다. +- 결정: frozen HHT predictor와 old physical a를 유지한 채 q_p와 q_n의 rates·원래 endpoint E/Keff를 평가한다. 둘 다 유효하면 같은 초기 ell의 자유 `||D^T E||inf`가 작은 전역 좌표 벡터를 선택하고 exact tie는 q_p다. q_p=q_n이면 중복 평가를 생략한다. 최초 q_p의 genuine geometry/director/principal-chart 실패만 q_n 선택을 허용하며 rate·질량·recovery·접선·기타 산술 실패와 비교 norm overflow는 실패다. q_n 평가 실패도 전달한다. +- 경계: dynamic-rotation 진단은 실제 source 순서의 첫 실패 절점에서 chart 조건을 확인한다. 다른 절점의 chart 위반으로 먼저 발생한 rate overflow를 숨기지 않는다. 유효 geometry에서 발생한 nonfinite strain/stress는 기존 recovery 진단으로 분리한다. +- 보존: 선택한 assembly를 iteration0에서 사용한다. 이후 full Newton correction·100회 제한·모든 수용 gate·고정 DIRECT dt·계수·kinetic mass·physical a/auxiliary A·history·commit/rollback·결과 schema와 reference/tolerance는 그대로다. Newton 보정 후 retry·line search·clamp·cutback·rechart를 추가하지 않는다. +- 영향: HHT-ADR-010의 q_n 단독 시작 부분을 대체한다. 작은 초기 잔차가 모든 모델의 수렴을 보장하지 않으며 C08/N7 시간 정확도를 해결했다는 결정이 아니다. 일반화한 명시적 drilling 잔차 Newton 후보는 채택하지 않는다. [방법·검증 기록](newton-start-policy.md), 현재 상태는 [PRD](PRD.md)를 따른다. + +## HHT-ADR-014 — 시간수렴 수정과 reduced-coordinate 구현 + +- 상태: `accepted-for-implementation`; 실제 구현·검증 통과와 구별한다. +- 날짜·승인: 2026-10-12 사용자가 [후속 검증 보고서](temporal-remediation.md)의 세 변경안에 “승인합니다”라고 답했다. +- 결정1: Flat centered all-free C08b의 P에는 기존 absolute bound `<=1e-3`와 원 balance/update consistency를 유지하고 strict temporal-decrease 조건을 제거한다. E/L의 기존 감소·bound는 유지한다. 정확한 원 HHT branch가 모든 h에서 P를 보존하여 strict 감소가 `0<0`을 요구한다는 독립 검토를 근거로 한다. P를 P0로 덮어쓰거나 drift를 clamp하지 않는다. +- 결정2: 기존64–1024 grid 결과를 보존하고32768/65536/131072를 C08b 최종 수렴 판정에 추가한다. Final q/v/physical-a self-difference bound `<=1e-4`, 마지막 두 차수 `>=1.8`와 N7 noise separation은 유지한다. 실제 finer 실행 성공을 보장하는 결정이 아니다. +- 결정3: C08a 해결을 위해 reduced-coordinate HHT를 실제 shell에서 구현·검증한다. Chain-rule physical q/v/a, 정확한 초기 full state, 원 endpoint residual/hidden conditions를 유지한다. Public full A는 diagnostic full-chart filter combination으로 명시하고 shell dynamic 결과를 schema v2 및 formulation metadata로 구분한다. Private reduced history를 public A와 혼용하지 않는다. Solid HHT/static/eigen schema는 보존한다. +- 구현 경계: Fixed embedding regularity·positive reduced mass·actual free/null intersection을 검사한다. 검증되지 않은 chart/history 전환·nonzero BC 확대·임의 drilling mass·FD production tangent·silent projection은 도입하지 않는다. Carried-A 산술 후보는 같은 full-coordinate recurrence의 개선으로 별도 검증하며 legacy q-inverse N7 estimator를 새 map의 인증으로 승계하지 않는다. +- 대체: HHT-ADR-011의 “production/schema 변경 미승인” 경계를 위 승인 범위에 한해 대체한다. 기존 실패·수식 반례·schema v1 evidence는 보존한다. 구현 후 관련 검사·독립 수치/물리 검토·전체 configured Debug/CTest·필수 원본 비교가 필요하다. + +## HHT-ADR-015 — C08a 최종 refinement와 hidden rate 판정 + +- 상태: `accepted-user-decision`; 변경본 검증 통과와 구별한다. +- 날짜·승인: 2026-10-13 사용자가 [두 변경 제안](c08a-refinement-proposal.md)에 “승인합니다. dryforge 계획에 따라서 남은 단계를 진행하세요”라고 답했다. +- 결정1: 원 16/32/64/128/256 grid와 실패 evidence를 보존하고 512/1024를 최종 grid로 추가한다. 전체 시점 최대 q/v/physical-a 오차의 finest bound `<=1e-4`, 마지막 두 refinement 차수 `>=1.8`, 최종 세 grid의 N7 factor100 separation을 유지한다. 초기 frame이나 transient를 제외하지 않는다. +- 결정2: C08a hidden1/2의 strict temporal decrease만 각 frame의 `|ψk_i|/Sk_i <=1e-10` 판정으로 대체한다. 원래 단위와 uncancelled scale을 유지하고 scale0은 raw defect exact0을 요구한다. Raw defect와 scale을 기록하며 floor·clamp·projection을 추가하지 않는다. 실제 물리 시간수렴과 N7은 별도로 통과해야 한다. +- 영향: C08b 및 다른 N1–N7 계약·물성·forcing·정확한 초기 state·HHT 계수는 유지한다. 이전 scratch finer 결과를 공식 PASS로 승계하지 않고 변경본을 재실행한다. 현재 상태는 [PRD](PRD.md), 상세 계약은 [검증 사례](verification-cases.md)를 따른다. + +## HHT-ADR-016 — Reduced 좌표 증분 산술과 저장 표현의 분리 + +- 상태: `accepted-for-implementation`; 실제 검증 통과와 구별한다. +- 날짜·승인: 2026-10-13 사용자가 [구체적인 N3 변경 제안](c08-n3-coordinate-representation-proposal.md)에 “승인합니다”라고 답했다. +- 근거: 공식 C08a의58개 requested trace 실패 모두 가장 가까운 binary64 좌표와 양쪽 이웃에서도 기존 high-only 기준을 만족할 수 없었다. 실제 candidate pair와 요청 target의 정확한 차이는 최대7.70e-34였다. 기존 FAIL 로그를 보존한다. +- 결정: Reduced private p의 whole/requested 두 증분 검사에서 실제 `(p_high+p_low)-old_accepted_high`를 EFT expansion으로 비교한다. 원래 uncancelled scale·`1e-12`·finite-first·scale0 exact-zero 판정을 유지한다. 이전 accepted low를 숨겨 history에 더하지 않는다. +- 저장 계약: Public/model의 high가 실제 pair의 round-to-nearest/ties-to-even 결과인지 별도로 검사한다. Raw high-only 증분 오차와 표현 거리를 진단으로 보존한다. 임의 ULP floor·추가 허용량·nextafter/clamp·projection을 도입하지 않는다. +- 보존: Absolute update·full physical residual·hidden constraints·CA whole-history radius·N2/N4/N7·시간 차수와 factor100·schema·원본 reference 및 외부 tolerance는 유지한다. Production/controller와 산술 회귀를 함께 갱신하고 변경본 C08·원본 비교·전체 configured Debug를 재검증한다. 현재 상태는 [PRD](PRD.md)를 따른다. + +## HHT-ADR-017 — 병진 기준 만족 후 회전·보조변수 제한 Newton + +- 상태: `accepted-for-implementation`; 실제 구현·검증 통과와 구별한다. +- 날짜·승인: 2026-10-13 사용자가 [구현 제안](c09-channel-newton-proposal.md)에 “승인합니다”라고 답했다. [독립 검토](numerical-review-channel-newton.md)는 제안의 N2-L 영역과 N7 대응을 명시했다. +- 근거: C09 full Newton100의 병진 잔차는 통과하지만 회전 잔차는 실패했다. 최종 병진 상태를 유지한 read-only 회전·보조변수 진단은 두 보정 후 원 full endpoint 기준을 만족했다. 이는 저장 가능한 해의 존재증거이며 자연 trajectory의 수렴 증거는 아니다. +- 결정: 비어 있지 않은 병진 U의 원 residual 및 실제 마지막 mapped q/v/a/public A·관련 private Ar correction 검사가 모두 통과하고 phi residual이 실패한 경우만 제한 solve를 허용한다. 원 scaled augmented K의 U를 제외한 J에는 angular p와 모든 auxiliary unknown/hidden row를 포함한다. 실제 K[J,J] 보정의 U 성분은0이며 translation p high/low/Ar/vp/ap는 bitwise 유지하고 inherited CA radius도 유지한다. +- N2-L 변경: 제한 step의 backward-error 검사 영역은 실제 K[J,J]다. 기존 all-free 선형계 검사와 같지 않으며 threshold 1e-12는 유지한다. 모든 후보의 원 full endpoint N2/N3/N4·hidden·regularity 검사는 계속 요구한다. +- 해제·실패: U 기준을 벗어나면 다음 solve를 full로 선택한다. Retry·candidate 되돌림·예산 환급은 없고 실제 보정 합계100회 및101번째 solve 금지를 유지한다. 제한 행렬 singularity/nonfinite/backward 실패는 즉시 원 실패 절차로 처리한다. 다음 증분은 full 시작이며 mode는 영속 schema나 accepted physics에 저장하지 않는다. +- N7: Restricted-last는 actual correction, restricted linear defect 해, 같은 trial의 full-model linear defect 해(제외 U 행 포함), fresh accepted full residual/hidden defect 해의 mapped norm 네 항을 합산한다. Full-last는 기존 세 항이다. 각 항의 q/v/a/private Ar/public A mapping·CA·factor100과 FAIL/INCONCLUSIVE 기준을 유지하며 full-model defect solve 실패를 통과로 처리하지 않는다. +- 영향: HHT-ADR-013의 이후 full Newton-only 정책을 위 조건에 한해 대체한다. Physics·초기 state·계수·질량·BC·schema·reference·외부 tolerance는 유지한다. Production/C08 controller의 같은 의미 구현, trigger/thaw·combined100·rollback·omitted-U defect 회귀와 자연 C09/C08·전체 Debug·원본 비교가 필요하다. 현재 진행 상태는 [PRD](PRD.md)를 따른다. + +## HHT-ADR-018 — 초기 analytic null 직교 보완공간의 고정 basis + +- 상태: `accepted-for-implementation`; 구현·검증 완료와 구별한다. +- 날짜·승인: 2026-10-13 사용자 “제안된 내용을 승인합니다”로 [고정 null 보완공간 제안](fixed-null-basis-proposal.md)을 승인했다. [실제 C09 진단](channel-newton-covariance-diagnostic.md)과 [독립 검토](numerical-review-channel-newton.md)를 근거로 한다. +- 결정: Null이 있고 회전 세 성분이 모두 자유인 절점은 원 frame0의 analytic drilling null을 normalize한 n0와 그 직교평면의 stable orthonormal t1/t2를 사용한다. 최소 absolute component Cartesian axis를 투영하여 basis를 구성하고 시간 동안 고정한다. `phi=t1*p1+t2*p2+n0*z`의 constant sparse injection을 모든 graph/rate/augmented assembly 및 correction map에 사용한다. +- 부분구속: 실제 free/null intersection은 유지한다. 회전 일부 성분이 구속된 절점은 기존 component chart를 유지하는 혼합 정책이다. Global BC를 local basis flag로 옮기지 않으며 지원 범위를 확대하지 않는다. +- 수치 계약: 원 full frame0 q/v/a/A 및 state는 projection하지 않는다. Initial basis projection·roundtrip·N3 pair/RN-even·global reconstruction·CA 실제 product/sum을 검증한다. G regularity와 current-null/fixed-basis transversality는 별개로 검사하며 기존 fail-closed 기준을 유지한다. Private channel/full support metadata를 구분하고 basis index를 fullDOF 번호로 쓰지 않는다. [상세 수식](formulation-fixed-null-basis.md)은 실제 augmented row/unknown scaling과 물리 역변환, 원 private consistency와 추가 basis-lift 검사, 저장된 null 입력의 basis 구성 radius 범위를 명시한다. +- 보존: HHT-ADR-017의 restricted/full solve·copy/thaw·combined100 및 N7 3/4항을 유지한다. Continuous physics·원 full endpoint 기준·hidden/N4·시간 차수/factor100·HHT 계수·lumped measure·BC·schema·원본 reference·외부 tolerance는 변경하지 않는다. +- 영향: HHT-ADR-014의 global component selector를 위 all-free rotational subset에서 대체하므로 discrete trajectory는 달라질 수 있다. Exact arithmetic에서는 proper-Q의 retained-plane 변환이 constant O(2)이며 nonlinear reparameterization defect를 제거한다. 실제 tolerance/rounding·partial-BC subset의 일반 covariance까지 자동 보장하지 않는다. +- 검증: 구현 상세 수식과 독립 검토 후 initial-state·basis/null/Gram·부분구속·N3/CA/N7·실제 warped/shared/nonzero-C1 N5·C09 모든 이력/좌표변환/결정론·공식 C08a7/C08b8 grid·구성된 전체 Debug 및 원본101-frame 비교를 새 identity에서 수행한다. 기존 C09 FAIL과 과거 PASS의 scope를 보존하고 현재 checklist는 [PRD](PRD.md)를 따른다. diff --git a/docs/hht-implicit-dynamics/FEATURED_AGENTS.md b/docs/hht-implicit-dynamics/FEATURED_AGENTS.md index 14a3193..a12bf6a 100644 --- a/docs/hht-implicit-dynamics/FEATURED_AGENTS.md +++ b/docs/hht-implicit-dynamics/FEATURED_AGENTS.md @@ -17,6 +17,14 @@ 기존 개인 설정·reference·다른 작업자의 변경을 보존하며 실패를 tolerance 완화로 숨기지 않는다. 문서만 수정하면 정적 검토를 수행하고, 동작 변경에는 관련 검사와 필요한 독립 검토를 수행한다. -Consistent kinetic mass, 물리적 a/보조 A, generalized/spatial moment, full residual을 구분한다. -C08a/C08b 실패·C04a SKIP과 가속도 복구 후보의 미채택을 유지한다. 원본 변위 비교 PASS와 +현행 nodal lumped kinetic mass, 물리적 a/보조 A, generalized/spatial moment, full residual을 구분한다. +C08a/C08b의 기존 실패·C04a SKIP과 가속도 복구 후보의 역사적 미채택을 보존한다. +현재 HHT-ADR-014가 reduced-coordinate 구현 및 shell schema v2 의미 구분을 승인했고, +HHT-ADR-015가 C08a 최종 grid와 hidden1/2 판정을 승인했다. +HHT-ADR-016은 reduced 두 증분의 pair 산술 검사와 저장 high의 RN-even 검사를 승인했다. +HHT-ADR-017은 병진 기준을 만족한 후보의 회전·보조변수 제한 Newton 및 +실제 부분 행렬 N2-L/full-model defect N7 검사를 승인했다. +HHT-ADR-018은 all-free rotational null 절점의 초기 null 직교 보완공간을 +사용한 fixed sparse basis와 부분구속 혼합 chart를 승인했다. +실제 완료 여부는 PRD의 checklist를 따른다. 원본 변위 비교 PASS와 굽힘 단면력 계수 수정은 실제 shell 시간수렴 또는 동해석 전체 완료를 뜻하지 않는다. diff --git a/docs/hht-implicit-dynamics/PRD.md b/docs/hht-implicit-dynamics/PRD.md index fe593dd..da3da01 100644 --- a/docs/hht-implicit-dynamics/PRD.md +++ b/docs/hht-implicit-dynamics/PRD.md @@ -9,7 +9,7 @@ 사용자는 HHT implicit 적분법을 사용한 dynamic 해석 구현을 준비하기 위해 requirement/research, formulation, numerical research를 차례로 요청했고, 검증 모델로 `reference/shellNL-dyn-meshfine`을 지정했다. 현재 산출물은 요구사항·근거·정식화·독립 수치 검토와 검증 계약이다. 사용자의 후속 I/O definition·implementation·physics evaluation 전체 진행 요청에 따라 [I/O 계약](io-contract.md)과 [구현 계획](README.md#재사용-handoff)을 작성하고 실제 solver 구현·검증을 진행한다. -[시간적분 정식화](formulation.md)와 [shell 관성 상세](formulation-inertia.md)의 후속으로 [독립 수치 검토](numerical-review.md#numerical-review), [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [추가 연구](research.md#numerical-research)를 작성한다. 사용자가 **consistent kinetic mass**를 선택했으며 이번 HHT 구현 범위는 일관질량이다. 후속 전체 gate 진행 요청에 따른 구현 대상·공개 subset·출력 schema는 [HHT-ADR-009](ADR.md)에 기록한다. +[시간적분 정식화](formulation.md)와 [shell 관성 상세](formulation-inertia.md)의 후속으로 [독립 수치 검토](numerical-review.md#numerical-review), [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [추가 연구](research.md#numerical-research)를 작성한다. 2026-10-11 사용자가 **nodal lumped kinetic mass**를 승인했다([HHT-ADR-012](ADR.md)). 과거 consistent 검증은 당시 evidence이며 변경본 통과로 승계하지 않는다. 후속 전체 gate 진행 요청에 따른 구현 대상·공개 subset·출력 schema는 [HHT-ADR-009](ADR.md)에 기록한다. 최소 구현 목표 후보는 기존 FESA-MITC4 shell의 선형 탄성 재료·기하비선형 동적 해석이다. 단일 step의 `*Dynamic,direct`, 초기 정지 상태, 고정 외곽 경계와 집중하중에 필요한 지원을 우선 정의한다. 질량·회전 관성·HHT 생략값·공식 동적 결과 범위는 근거를 확인하여 후속 정식화와 연결한다. 임의 amplitude, 시간변화 경계, 물리적 damping, contact, 소성, explicit, 다중 step/restart 또는 다른 요소의 dynamics는 이번 요청에서 지원을 약속하지 않는다. @@ -59,7 +59,7 @@ Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference | --- | --- | --- | | HHT-OPEN-001 | 음수 alpha 관례, 결합 beta/gamma, 물리적 a와 보조 A 분리 | 추천 HHT 확장 채택 및 공개 parameter subset | | HHT-OPEN-002 | frame 0을 `0+`로 정의, 전값 force와 동적·대수 초기 평형으로 a0 계산, A0=a0; 수치 기준 N2–N4 정의 | 초기화 계약 채택과 I/O 진단 binding, 구현 후 검증 | -| HHT-OPEN-003 | **사용자 선택: consistent kinetic mass**; lumped는 비교 연구로 보존하고 이번 HHT 지원에서 제외 | 질량 종류 결정 완료; 임의 drilling inertia 없이 회전관성·영공간의 실제 구현 검증 필요 | +| HHT-OPEN-003 | **사용자 선택: nodal-lumped-kinetic**; 기존 shell eigen nodal block lumping 유지 | 질량 종류 결정 완료; 임의 drilling inertia 없이 회전관성·영공간의 실제 구현 검증 필요 | | HHT-OPEN-004 | 기존 total rotation-vector chart에서 exact 관성·convective 항·비대칭 접선, moving-null 조건; N4–N7 및 C05–C08 정의 | 구현 후 실제 shell의 regularity·시간 수렴·회전 검증 | | HHT-OPEN-005 | 물리적 a/각가속도와 A, endpoint 반력, T/Uphys/Udrill/W의 수학적 의미 구별 | 공식 공개 quantity·HDF5 schema 및 mapping의 I/O 결정 | | HHT-OPEN-006 | 고정 100 increments, full Newton, 실패 trial 폐기, 동일 state의 전체 이력 commit; N2의 100 corrections/수렴 기준 정의 | I/O 실패 lifecycle과 reference 밖 입력 범위, 구현 후 실패 보존 검증 | @@ -76,12 +76,24 @@ Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference ## 현재 checklist +아래 날짜 없는 실행 완료 항목은 기존 consistent 구현의 이력이다. 변경본의 통과로 승계하지 않는다. + +- [x] HHT-ADR-012 변경본의 nodal measure 일관성·독립 관성/접선/물리 검토·원본 reference 재검증. [채택 evidence](../hex8-structural-analysis/lumped-mass-adoption.md): 관련 Debug C++ 38 PASS·Python 137 PASS, production Release 원본 U 101 families PASS·UR 경고200. +- [x] HHT-ADR-012 변경본 전체 Debug 회귀의 자연 종료와 판정: 789개 native8(784 PASS·4 FAIL·1 SKIP). Test-only 수정 후 관련4개 PASS와 discovery790은 별도 evidence이며 전체790 재실행은 아니다. C08a/C08b 해결·C04a coverage는 미완료로 유지. +- [x] 변경본 C08a/C08b 재실행과 결과 판정: C08a 정확도 FAIL, C08b `h=1/256`의 Newton trial principal-chart 이탈로 새 runtime FAIL. 허용값은 유지하며 실패 해결은 아래 미완료 항목이다. [현재 evidence](../hex8-structural-analysis/lumped-mass-adoption.md). +- [x] 2026-10-12 C08b 실패 state의 원인 조사: history·moving-null 미분·선형 solve 독립 대조, predictor 시작과 명시적 drilling 잔차의 private 정확 Newton 후보 작성 및 scoped N5 검사. [조사 보고서](newton-rotation-investigation.md). 후보 채택·공식 C08 통과를 뜻하지 않는다. + +- [x] 2026-10-12 [HHT-ADR-013](ADR.md) 초기 Newton 정책 구현: 같은 frozen predictor의 q_p/q_n 자유 energy 잔차 비교, 실제 첫 회전 오류 분류 및 nonfinite recovery 진단 분리. 관련 Debug37/37 native0·독립 수치 검토 완료. [변경 evidence](newton-start-policy.md). +- [x] HHT-ADR-013 변경본의 h=1/256 runtime 회귀와 current-source Release 원본101-frame 재생성·비교: 65-frame runtime PASS·U101 families PASS/UR 경고200·독립 kinetic/balance 대조 일치. [변경 evidence](newton-start-policy.md). Runtime/원본 일치를 C08/N7 시간 정확도 해결로 승계하지 않는다. +- [x] HHT-ADR-013 변경본의 전체802 Debug·공식 C08b 전체5 grid의 자연 종료와 판정. 제외 없는 전체 CTest는11384.61초·native8:799 PASS·C08 정확도 FAIL2·기존 C04a SKIP1이며 추가 예외0이다. C08b 5개 grid의 runtime finding은 CLOSED, 시간 정확도는 미완료다. Source·원본·binary identity 대조와 독립 bounded 검토는 [변경 evidence](newton-start-policy.md)를 따른다. execute.py의1800초 timeout native1과 최초 중단은 전체 완료 evidence가 아니다. +- [x] 2026-10-12 권장 후속 조사 실행: 소형 moving-null DAE의 전체 시점 차수 독립 검산, 실제 C08b 해상도 및 fixed-state P/history drift 분리, 같은 HHT carried-A private 후보의512–4096 native0 실행. [실행 보고서](temporal-remediation.md). Production 채택·C08/N7 통과·acceptance 변경을 의미하지 않는다. + - [x] 사용자 지정 모델·출력과 현행 dev 기준 확인. - [x] 격리 worktree 및 Feature 핵심 문서 작성. - [x] Requirement 초안: 원자적 요구사항과 acceptance intent 작성. - [x] Research 초안: 일차·공식 근거의 열람 범위, 입력 생략 의미, 검증 후보와 근거 공백 정리. - [x] 문서 간 범위·비교 정책·로컬 링크 및 reference 원본 보존 정적 검토. -- [x] 사용자 질량 선택 반영: 이번 HHT 기본·구현 범위는 consistent kinetic mass. +- [x] 2026-10-11 질량 선택 반영: 이번 HHT 기본·구현 범위는 nodal lumped kinetic mass. - [x] 나머지 물리·공개 parameter·공식 결과 범위 확정: HHT-ADR-009와 I/O 계약. - [x] Formulation 후보 작성: HHT·정확한 유한회전 관성·초기화·잔차·접선·회복. - [x] 독립 수식 검토와 variable-mass / moving-null 제조해 검산; 메인 재현 확인. @@ -91,9 +103,140 @@ Reference의 `max|U3|/thickness≈9.84e-5`, 기존 동일 mesh eigen reference - [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를 유지한 실패 재현 완료. +- [x] 2026-10-12 [HHT-ADR-014](ADR.md) 사용자 승인: C08b P absolute/balance 판정, 최종 finer grid 추가, 실제 shell reduced-coordinate HHT와 shell schema v2 의미 구분. 승인은 구현 통과가 아니다. +- [x] 2026-10-13 [HHT-ADR-015](ADR.md) 사용자 승인: C08a 원 grid 보존 및 최종512/1024 추가, hidden1/2 모든 frame normalized bound 판정. 승인은 검증 통과가 아니다. +- [x] 2026-10-13 [HHT-ADR-016](ADR.md) 사용자 승인: Reduced N3 whole/requested 증분의 실제 high+low 산술 검사와 저장 high의 RN-even 검사 분리. 승인은 검증 통과가 아니다. +- [x] 2026-10-13 [HHT-ADR-017](ADR.md) 사용자 승인: 병진 기준 만족 후 회전·보조변수 부분 행렬 보정, 실제 부분 행렬 N2-L 검사 및 full-model defect를 보존하는 N7. [독립 검토](numerical-review-channel-newton.md) 완료; 구현 통과와 구별한다. +- [ ] HHT-ADR-017 production/C08 controller 구현·trigger/thaw/100/rollback·omitted-U N7 회귀와 자연 C09/C08·원본·전체 Debug 재검증. +- [x] 2026-10-13 [HHT-ADR-018](ADR.md) 사용자 승인: 초기 analytic null 직교 보완공간의 fixed sparse basis와 부분구속 혼합 chart 정책. 승인은 solver 검증 통과가 아니다. +- [x] HHT-ADR-018 [상세 수식](formulation-fixed-null-basis.md) 및 [독립 정적 수치 검토](numerical-review-fixed-null-basis.md): sparse augmented blocks·scaled operator/undo·횡단성·초기화·N3/CA/N7 계약. Runtime PASS와 구별한다. +- [ ] HHT-ADR-018 production/controller 및 N3/CA/N7 변환·initial/부분구속/N5/C09·공식 C08·원본·전체 Debug 재검증. +- [ ] HHT-ADR-016 production/controller·표현 경계/산술 mutation 검사·C08·reference·전체 Debug 재검증. +- [x] HHT-ADR-015 변경본 C08a 전체7 grid의 공식 시간수렴·hidden1/2·N7 재검증: ADR-018 최종 controller 계수 수정본 Release native0·703.90초. C08b·전체 Debug·reference 완료와 구분한다. +- [ ] Carried-A production 산술 및 해당 N5/N7·BC·실패보존 검증. +- [ ] Reduced shell embedding·정확한 chain-rule/접선·초기화·부분구속·원 residual/hidden 검증. +- [x] Shell dynamic schema v2·public diagnostic A 의미·reader/comparator/readback focused 검증: state/writer 관련 Debug와 Python comparator47 PASS. Actual production 원본101-frame 비교와 전체 회귀는 아래 미완료 항목으로 구분한다. +- [ ] 승인된 C08b32768/65536/131072 실제 실행과 시간수렴·P/E/L 판정. - [ ] 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 검증. 최신 Debug build 및 C08 temporal2개 제외 CTest는475 PASS/1 C04a SKIP; C08 실패와 전체 gate 미완료는 유지한다. +2026-10-13 동결 source의 reduced operator·actual N5·procedure·산술 Debug15 PASS 및 +Release16 PASS를 확인했다. Large DIRECT의 Ar→좌표 재구성 상쇄를 실제 p 증분 누적으로 +수정했으며 원 N3의 requested increment trace·기존 수치 기준을 유지했다. +[현재 실행 기록](temporal-remediation.md#좌표-증분-산술-수정-후-현재-범위)과 +[구현 기록](implementation-c08-reduced.md)을 따른다. 원본 Release 실행은 +증분39·t=3.9에서 increment trace 검사로 실패했다(CLI exit5). +C08b는 기존5 grid 실행 후 첫 추가 grid에서 +hidden position 판정 실패로 종료했다(599.92초, native8). C08a의 추가 grid/hidden 판정은 +[승인된 변경](c08a-refinement-proposal.md)이다. 승인 grid7개를 실행한 Release는 +최종 오차·차수를 만족했으나 q increment trace 및 추가 velocity gate로 native8이었다. +누적 산술 수정과 계약 정정 후의 최신 검증을 별도로 수행한다. + +보상 누적 변경본의 C08a 전체7 grid도 888.432초·native8로 종료했다. +Whole/requested 좌표 trace는 각각58건 실패했다. 독립 exact 검산에서 +58개 모두 현재 값이 가장 가까운 binary64 좌표였으며 인접 좌표도 원 기준을 +만족하지 못했다. [좌표 표현 분리 제안](c08-n3-coordinate-representation-proposal.md)은 +HHT-ADR-016으로 승인됐으며 변경본의 검증은 진행 중이다. 승인 이전 FAIL 판정은 보존한다. +ADR-016 exact threshold 변경본은 전체 Debug target build 및 focused9개가 통과했다 +(149.36초, native0). N3 산술6개, warped 공유 절점 실제 N5, genuine nonzero C1 및 +독립5³ 관성 대조의 범위다. 초기 재구성 C09·공식 C08 grid·production reference· +전체 configured Debug 검증 완료를 뜻하지 않는다. +Actual N5 third-gradient mutation 검사는 통과했다. Proper-Q C09의 초기 +행별 평형 실패는 canonical primitive-gradient 수정 후 통과했지만, +direct director increment 변경본도 increment1·outer100의 physical moment N2에서 +실패했다. 요소 관련 Debug16개 PASS를 전체 C09 통과로 승계하지 않는다. +승인 N2 채널 기준 및 실제 재조립 scale와의 +계약 정정은 [후속 실행 기록](temporal-remediation.md#10-보상-좌표-누적-적용-후-재검증)을 따른다. + 문서 gate의 완료와 solver 기능의 완료를 구별한다. 현재 구현 단계에서는 내부 수치 검증, solver build/test 및 지정 reference 해석·비교를 실행한다. 통과 여부와 physics 평가는 실제 evidence로 갱신한다. + +2026-10-13 ADR-017 구현 전 최신 Release 공식 C08a7-grid는470.47초·native0으로 +통과했다. Configured Debug 관성13개·actual N5·partition 회귀는 통과하지만 +C09 full Newton100은 실패했다(전체 focused15 PASS·1 FAIL). Helper/partition +추가 Debug 두 검사는 native0이다. 이 bounded evidence는 ADR-017 변경본의 +검증으로 승계하지 않는다. [현재 실행 기록](temporal-remediation.md)을 따른다. + +ADR-017 변경본의 configured Debug C09는 여섯 solver trajectory를 완료했지만 +finite-rotation global covariance에서 native8·113.03초로 실패했다. +[실제 진단](channel-newton-covariance-diagnostic.md)은 matched-state assembly와 +비선형 selector recurrence 차이를 분리했다. [고정 null 보완공간 제안](fixed-null-basis-proposal.md)은 +HHT-ADR-018로 승인된 후속 chart/integrator 변경이며 기능 완료 checklist는 그대로 미완료다. + +ADR-017 최종 parity의 Release C08a7-grid+helper2는 native0·760.84초에 +통과했다(최소order1.80500237/N7 separation157.542906). Debug 실제 초기 이력 +64-step+helper2도 native0·786.88초다. 이 bounded 결과는 C09 covariance, +C08b 전체8-grid·원본 production 비교·전체 configured Debug의 대체가 아니다. + +ADR-018의 첫 configured Debug 전체 target build는 native0이며, 같은 동결 source의 +focused26개가 native0·176.41초에 통과했다. 비영 initial analytic null의 비성분 basis, +부분구속 exact0·proper-Q 평면 변환·S/G 분리·계수 radius 보존·N3/제한 Newton/실패 보존과 +실제 warped/shared-node mixed-time N5 및 항 누락 검사가 포함된다(N5 152.47초). +이는 C09 전체 이력, graph coefficient-BL certificate, 공식 C08·원본·전체 Debug의 +완료 evidence가 아니다. 별도 private proper-Q 실행의 inner-graph100 실패도 보존하며 +변경본 기능 checklist는 미완료다. + +같은 첫 source epoch의 configured Debug C09는 native8·238.51초에 실패했다. +Proper-Q 병진 trajectory의 증분2·t=0.5에서 inner-graph100에 도달했다. +독립 raw 감사는 전체 q/z의4-cycle과 일부 phase의 정확한2-lag global-q 반복을 +확인했다. Private z만 검사하던 기존 반복 감지의 보완은 원 endpoint 기준을 +유지하는 수정으로 진행하며, 변경본 C09 통과와 공변성 판정은 아직 미완료다. + +Actual-q 반복 감지와 graph certificate 보완을 포함한 후속 Debug binary의 +경계12개 검사는 native0·2.86초, configured C09는 native0·117.23초에 통과했다. +Native basis 생성의7개 입력·63계수는 같은 raw binary64 입력과 고정 선택축의 +독립 Decimal1000/1200 대조에서 실제 출력 radius 안에 있었다. +Controller 소스의 실행 중 한정 위치 이동·복원 후 hash 불일치는 별도로 기록하며, +이 실행을 완전한 source7 identity 일치로 표현하지 않는다. Production·검사 exporter· +실행 binary의 관련6개 hash는 일치한다. Projection/lift의 오차 반경을 실제 +Neumaier 합산 순서로 재현하는 후속 소스와 fresh identity 검증은 진행 중이다. +공식 C08·원본·전체 Debug와 기능 완료 checklist는 계속 미완료다. + +Neumaier source-order projection·p→z combined lift·실제 frame 중심 차이 반경을 +반영한 최종 epoch의 configured Debug 전체 target build는 native0이다. +Controller 경계4개(native0·2.15초), reduced-core27개(native0·372.14초), +CA/제한 Newton/N7 omitted-U5개(native0·1.98초)가 통과했다. +Actual warped/shared mixed-time N5 및 항 누락 검사는314.76초에 통과했다. +소스6개와 실행 binary의7개 SHA는 실행 전후 모두 일치하며 소스 스냅샷도 보존했다. +Release C08a7-grid와 새 production 원본 해석은 실행 중이다. 해당 결과와 +C08b8-grid·원본 비교·독립 물리·전체 Debug를 아직 완료로 표시하지 않는다. + +같은 Neumaier epoch의 configured Debug C09는 native0·217.24초에 통과했다. +동결 source snapshot과 실행 binary를 보존했고, 후속 controller 수정은 해당 +CTest 종료 후 승인된 수정 범위에서 수행했다. +Release C08a7-grid는 native8·819.31초로 실패했다. 실패83,520건은 모두 새 +basis-lift 일관성 검사 하나이며, 다른 시간수렴·hidden·N7 오류는 보고되지 않았다. +Controller가 `LpᵀδA` 대신 `Lpᵀδa`를 비교한 `1+α` 누락을 독립 검토로 확인했다. +Production에는 해당 계수가 이미 올바르게 적용되어 있다. 기준을 유지한 controller +수정의 Debug build 및 비성분 basis 계수 누락 회귀는 native0·1.24초에 통과했다. +수정 후 공식 C08a7-grid 재검증은 아직 완료되지 않았다. + +최종 controller 계수 수정본의 공식 Release C08a7-grid와 계수 관련 회귀2개는 +native0·703.90초에 통과했다(C08a 자체703.39초). 승인된 마지막 세 grid의 +최소 시간수렴 차수는1.80500237, 최소 N7 separation은157.615676이다. +소스6개와 Release 검사 binary의7개 SHA가 실행 전후 일치한다. +실행 원본과 별도 계산한 지표는 `adr018-filter-c08a-release.raw.log` 및 +`adr018-filter-c08a-metrics.json`에 보존했다. 승인된 C08b 전체8-grid와 +production 원본 해석은 실행 중이며, 원본101-frame 비교·독립 물리·전체 +configured Debug와 기능 완료 checklist는 여전히 미완료다. + +같은 동결 source에서 필수 `python scripts/execute.py`를 시작했다. +실행 시작 시 소스6개·Debug 검사 binary의7개 SHA가 이전 identity와 일치했다. +해당 실행은 전체 deadline1800초에 도달하여 2026-10-13 14:40 KST에 +native1로 종료했다. 출력상44개 검사는 통과했으며45번 C08a 시간수렴 +실행 중 timeout이었다. 이는 solver 검사 실패의 확정이나 전체 PASS가 아니다. +`adr018-filter-configured-harness`와 별도 `adr018-filter-harness-timeout/`에 +종료 및 부분 CTest 기록을 보존했다. Debug 자식 프로세스가 남지 않았음을 +확인한 뒤 동일 preset 전체 CTest를 직접 시작했으며, 최종 native 결과는 +`adr018-filter-full-debug`로 별도 확인한다. 제외 검사나 기준 완화는 없다. + +2026-10-13 16:33:50 KST 사용자가 세 실행의 종료와 저장 구간 비교를 요청했다. +원본 Release 해석·Release C08b·전체 Debug CTest 및 자식 프로세스를 모두 +종료했으며 native exit는 각각 `-1`이다. 사용자 중단으로 분류한다. +Debug44/856 PASS와 완료된 `h=1/64` controller 요약의 Release 일치, +원본 증분99·t=9.9까지 accepted 로그의 수렴 상태를 검산했다. +중간 HDF5가 없어 현재 Abaqus U/UR 비교는 수행할 수 없다. +[중단 시점 비교](interrupted-validation-comparison.md)에 근거와 한계를 기록했다. +사용자 요청에 따라 hexa 완료·성능 최적화 후 전체 검증을 다시 수행하며, +이번 중단 후 해석·CTest를 재시작하지 않는다. diff --git a/docs/hht-implicit-dynamics/README.md b/docs/hht-implicit-dynamics/README.md index a1b7082..f1949dc 100644 --- a/docs/hht-implicit-dynamics/README.md +++ b/docs/hht-implicit-dynamics/README.md @@ -2,12 +2,31 @@ ## 목적과 현재 상태 -Consistent kinetic mass, 정확한 유한회전 관성·convective 항, HHT 잔차·접선·증분 state와 -HDF5를 구현했다. 원본 U의101-frame 비교 PASS와 UR 경고200건 기록이 있지만 실제 shell의 +2026-10-11 [HHT-ADR-012](ADR.md)에 따라 nodal lumped kinetic mass로 변경한다. +변경본의 관성·convective 항·접선·state/HDF5 관련 Debug 검사38개와 Python 비교기137개가 +통과했고, 같은 production 소스의 Release 원본 U 101-frame 비교 PASS·UR 경고200건을 +확인했다. 독립 수치·물리 검토는 bounded PASS다. [채택 보고서](../hex8-structural-analysis/lumped-mass-adoption.md)에 +검증 구성과 한계를 기록한다. 새 전체 Debug CTest789개는 자연 종료했다(native8: +784 PASS·4 FAIL·1 SKIP). Stale Hex8 test 두 개는 수정 후 공식 focused 검사에서 PASS다. +이 실행 당시 C08a 시간 정확도 FAIL·C08b 새 Newton 회전 예외 및 C04a SKIP이 남았다. +2026-10-12 사용자 요청으로 [두 시작점 정책](newton-start-policy.md)을 구현했다. 관련37개 +Debug 회귀와 독립 수치 검토가 완료됐다. 전체802 CTest는 제외 없이 자연 종료했다 +(11384.61초·native8:799 PASS·C08 정확도 FAIL2·기존 C04a SKIP1). 실제 C08b의5개 grid와 +새65-frame runtime 회귀에서 회전 예외가 해소됐으며 fresh 원본 U101 families PASS· +UR 경고200건과 독립 kinetic/balance 대조를 확인했다. Source·원본·binary identity는 +검증 전후 일치한다. Runtime 해결을 시간 정확도 해결로 해석하지 않는다. +다음 기존 consistent 구현의 이력과 원본 변위 통과를 현재 전체 검증으로 승계하지 않는다. 실제 shell의 C08a/C08b 시간수렴 실패는 미해결이다. 구현됨과 기능 검증 완료를 구분한다. ## 계약과 사용법 +2026-10-12 후속 [HHT-ADR-014](ADR.md)로 P 판정·C08b 최종 finer grid와 reduced shell +HHT/schema v2 구현을 승인받았다. 실제 채택식은 +[축소 좌표 정식화](formulation-reduced-coordinate.md), +[carried-A arithmetic/noise](formulation-carried-a-noise.md), +[schema v2 상세](io-reduced-coordinate.md)를 따른다. 현재 구현과 검증은 진행 중이며 +기존 v1 결과·실패 이력을 변경본 통과로 승계하지 않는다. + - [PRD](PRD.md)·[ADR](ADR.md)·[요구사항](requirements.md): 범위·미해결·현재 checklist. - [정식화](formulation.md), [유한회전 관성](formulation-inertia.md), [가속도 복구 후보](formulation-acceleration-recovery.md): 채택식과 미채택 후보 구분. @@ -16,13 +35,28 @@ C08a/C08b 시간수렴 실패는 미해결이다. 구현됨과 기능 검증 완 - [수치 기준](numerical-controls.md), [검증 사례](verification-cases.md), [수학 검산](numerical-review.md#numerical-review), [연구](research.md#research). - [구현 검토·실패·수정](implementation-numerical-review.md), [물리 평가](physics-evaluation.md). +- [Consistent/lumped 질량 비교 실험](mass-comparison.md): 채택 전 private 비교 이력과 후속 승인; production 재검증과 구별. +- [Newton 회전 실패 원인·해결 후보](newton-rotation-investigation.md): 변경 전 moving-null 접선 상쇄의 독립 대조와 private 후보 실험. +- [두 시작점 정책의 구현·검증](newton-start-policy.md): HHT-ADR-013 실제 정책·시행착오·현재 evidence·적용 한계. C08 시간 정확도와 구분. +- [시간 정확도·P 감소 실패의 해결 후보 조사](research.md#temporal-remediation-research): 축소 좌표·속도 수준 DAE 적분·시간 해상도·합산의 조사와 채택 경계. Solver 변경 또는 실패 폐쇄를 뜻하지 않는다. +- [시간 정확도·P 후속 검증](temporal-remediation.md): 소형 DAE 독립 검산, 실제 finer-grid와 carried-A private 산술 후보, P strict-decrease 계약 문제. 기존 C08 FAIL과 미채택 알고리즘을 구분한다. +- [Reduced C08 구현](implementation-c08-reduced.md): 실제 controller·N7·전체 산술 이력 및 좌표 증분 누적의 경계. +- [C08a 추가 refinement 결정](c08a-refinement-proposal.md): HHT-ADR-015로 승인된 두 변경과 승인 전 진단 evidence. 변경본 공식 검증은 별도로 수행한다. +- [N3 좌표 표현 결정](c08-n3-coordinate-representation-proposal.md): HHT-ADR-016으로 승인된 exact pair 증분 검사와 RN-even 저장 검사. 승인과 변경본 검증 완료를 구분한다. +- [병진 유지 Newton 명세](c09-channel-newton-proposal.md), [독립 검토와 N7 대응](numerical-review-channel-newton.md): HHT-ADR-017로 승인된 제한 보정·부분 행렬 N2-L 검사·full-model defect 보존. [C09 산술 진단](c09-newton-rounding-diagnostic.md)의 endpoint 존재증거와 자연 trajectory 검증을 구분한다. +- [Channel Newton 구현과 실행 기록](implementation-channel-newton.md): private helper/자연 proper-Q 진단과 configured 검증의 범위를 구분한다. +- [유한회전 공변성 실패 진단](channel-newton-covariance-diagnostic.md), [초기 null 직교 보완공간 제안](fixed-null-basis-proposal.md): 실제 selector recurrence 반례와 HHT-ADR-018로 승인된 basis/integrator 변경의 경계. +- [고정 null 기저 상세 정식화](formulation-fixed-null-basis.md), [독립 수치 검토](numerical-review-fixed-null-basis.md): sparse projection/lift, 혼합 부분구속 chart, augmented scaled operator, 초기 상태와 CA/N7의 구현 계약. 정적 수식 검토와 변경본 실행 검증은 별도다. +- [고정 null 기저 구현과 실행 기록](implementation-fixed-null-basis.md): 실제 scaled solve, basis 계수 오차 반경, global 좌표 반복 감지와 현재 검증의 범위. +- [고정 null 기저 물리 평가](physics-evaluation-fixed-null-basis.md): 새 C09의 실제 검증 범위, 강제 강체 병진의 독립 한계 계산과 reference 물리 검산의 진행 상태. +- [사용자 중단 시점 비교](interrupted-validation-comparison.md): Debug44개 완료와 Release 요약 일치, 원본99증분의 수렴 로그, 현재 HDF5 부재로 인한 Abaqus 비교 한계 및 후속 실행 순서. 환경·명령은 [operations](../operations.md)를 따른다. I/O의 지원 `*DYNAMIC, DIRECT` subset과 고정 HHT 계수, 출력의 물리적 가속도와 보조 acceleration 구분을 확인한다. ## 재사용 Handoff -Eigen derived lumped mass와 HHT consistent kinetic mass는 목적이 다르다. Total rotation-vector +Eigen의 기존 nodal block lumped mass는 유지하고 HHT도 동일한 scalar moments의 nodal kinetic measure를 사용한다. HHT의 회전 의존 M·convective force·접선과 운동량은 같은 measure로 계산하며 scalar diagonal 치환은 하지 않는다. Total rotation-vector chart의 generalized moment와 spatial moment도 다르다. Physical a와 algorithmic A를 바꾸어 쓰지 않으며 moving-null 제약과 동적·대수 초기평형을 유지한다. 같은 trial에서 full residual, inertia와 tangent를 계산하고 실패 candidate가 accepted history를 변경하지 않게 한다. diff --git a/docs/hht-implicit-dynamics/c08-n3-coordinate-representation-proposal.md b/docs/hht-implicit-dynamics/c08-n3-coordinate-representation-proposal.md new file mode 100644 index 0000000..afe95f7 --- /dev/null +++ b/docs/hht-implicit-dynamics/c08-n3-coordinate-representation-proposal.md @@ -0,0 +1,47 @@ +# C08 N3 좌표 표현과 increment arithmetic 분리 제안 + +상태: **2026-10-13 사용자 승인, HHT-ADR-016**. 아래 변경안의 구현·검증을 진행한다. 승인 이전 공식 compensated C08a는 native8/888.432s **FAIL**이며 변경본 통과로 승계하지 않는다. 아래 승인 전 설명은 제안 당시의 범위와 결정 근거로 보존한다. + +## 현재 충돌의 실제 증거 + +공식 로그 `.dryforge/hht-remediation-20261012/compensated-c08a-release.log`의 SHA256은 `a8e8d5fcee3fe1d6aa60b56394fc53a8f74f42807e7c10089e8268aeb8611309`이다. Required requested-trace 실패는58개(512 grid6개,1024 grid52개)이며 동일 component의 whole-q update 실패도58개다. + +각17-digit 로그 값을 원래 binary64로 복원하여 Python `Fraction`으로 정확히 계산했다. Gate target은 `old_p + stored_increment`, 별도 requested target은 `old_p + signed_sum + compensation`이다. Gate target의 가장 가까운 binary64 좌표와 양쪽 인접 좌표를 검사했다. **모든58개에서 현재 high가 최적값이며 세 좌표 모두 원1e−12 조건에 실패한다.** 좌표 간격은 monotonic이므로 더 먼 binary64 좌표도 통과할 수 없다. 이 사례들의 subtraction low는0이며 최종 subtraction 손실이 원인은 아니다. + +| 사례 | 첫 실패 | 최악 실패 | +|---|---:|---:| +| grid/increment/full | 512/278/6 | 1024/555/6 | +| old p | .071709031890658609 | .07170906968934286 | +| current/nearest high | .071707935756794142 | .07170874594859544 | +| stored increment | −1.096133864469764e−6 | −3.2374074742216707e−7 | +| uncancelled scale | 1.0961338644697645e−6 | 3.237407474221672e−7 | +| allowed defect `1e−12*scale` | 1.0961338644697644e−18 | 3.2374074742216723e−19 | +| actual best defect | 2.600391148070702e−18 | 3.911862848216376e−18 | +| best ratio | 2.3723299063737948e−12 | 1.208331938245387e−11 | +| predecessor/current/successor ratios | 1.02883e−11 / 2.37233e−12 / 1.50330e−11 | 3.07837e−11 / 1.20833e−11 / 5.49503e−11 | +| current low | −2.6003877354211524e−18 | −3.911862569787138e−18 | + +두 표 사례는 `high + low`와 정확 requested target이 **exactly 동일**하다. 전체58개 pair-target gap의 최대는7.703719777548943e−34이다. 따라서 남은 실패를 더 정밀한 correction 누적으로 해결한다는 증거는 없다. 이전 C08b1024의 plain-addition 실패는 neighbor가 PASS 가능했고 compensated arithmetic으로 실제 해결된 별도 사례다. + +재현 command: `python .dryforge/hht-reduced-c08a-finer-20261013/analyze-compensated-c08a.py` (exit0). 전체58개 exact rational gap, nearest/neighbor ratio, source-log identity는 같은 디렉터리 `compensated-c08a-representability.json`에 기록했다. 독립 numerical reviewer도 Fraction 계산으로 같은 결론을 확인했다. 실행 중인 shared binary나 원본 reference는 변경하지 않았다. + +## 최소 변경안: 산술 검사는1e−12, 저장 표현은 별도 측정 + +원N3의 작은 increment 손실 검출 의도는 유지한다. **독립 requested trace와 실제 compensated candidate pair의 increment를 기존 uncancelled scale 및1e−12로 검사**하고, public/model에 저장하는 high의 표현 오차를 별도로 검사하는 방안을 제안한다. 이 변경은 acceptance 변경이므로 사용자 승인 전 구현하지 않는다. + +1. 현재 실제 TwoSum 경로의 `(p_high,p_low)`와 독립 Neumaier requested trace를 유지한다. Trace를 candidate state에 복사하지 않는다. Predictor의 원래 두 요청 항, 선택된 old-start의 exact correlation, 모든 requested Newton correction을 포함한다. +2. Exact candidate increment `D_pair=(p_high+p_low)−old_accepted_high`를 EFT TwoDiff/TwoSum expansion으로 계산한다. `|D_pair−T|/S<=1e−12`를 whole-q 및 requested trace 양쪽에 적용한다. `T`는 독립 요청 trace 또는 원래 HHT 우변이고 `S`는 해당 원래 uncancelled 항 절댓값 합이다. Old accepted history는 실제 저장 high이며 이전 increment의 low를 숨겨서 더하지 않는다. Zero-scale exact0와 finite-first는 유지한다. `p=pp+beta*h²*Ar`를 다시 계산하여 현재 primary candidate를 대체하지 않는다. +3. 실제 저장 high가 pair의 round-to-nearest/ties-to-even 결과인지 별도로 검사한다. `B_repr=|p_low|`를 측정하며 인접 좌표 spacing의 half-ULP 안에 있어야 한다. Exact tie는 even 규칙까지 검사한다. Low의 overflow/underflow 및 EFT 유효성은 fail-closed로 다룬다. 필요 subtraction/trace rounding은 실제 compensated 연산의 별도 outward radius로 기록하며 임의 norm floor를 넣지 않는다. +4. Raw stored-high increment의 기존 ratio와 정확 representation distance는 diagnostic으로 계속 기록한다. 별도의 ULP floor나 representation budget을1e−12 분모/허용량에 더하지 않는다. Arithmetic gate와 independently checked correct-rounding gate를 모두 통과해야 한다. 검증 expansion 자체의 유효성/finite 조건을 만족하지 못하면 FAIL이며 표현 오차로 산술 결함을 숨기지 않는다. + +현재 남은 두 사례의 pair arithmetic defect는0인 반면 stored high representation defect가 scale 기준을 초과한다. 이 분리가 필요하다는 구체적 근거다. `1e−12` 자체를 올리거나 `max(1,...)` 분모를 추가하는 제안이 아니다. 최종 high 좌표를 nextafter/clamp/projection으로 바꾸는 방식도 사용하지 않는다. + +이 제안은 reduced private p의 resolved whole/requested increment 검사에 한정한다. Absolute q/v/ap/public-A update, full physical residual, hidden constraints, CA whole-history radius, N2/N4/N7, temporal order와 factor100, public schema와 stored reference를 유지한다. Pair low는 실제 arithmetic remainder이며 새로운 물리 history 변수로 재해석하지 않는다. 모든 이전 FAIL 로그는 보존한다. + +## 승인 후 필요한 검증 + +- Exact binary64 nearest/half-ULP/tie, subnormal 및 nonfinite 단위 검사. 실제 correction을 누락하거나 잘못 더한 mutation은 arithmetic gate에서 FAIL해야 한다. +- 위 공식58개 frozen 사례에서 기존 stored-high criterion FAIL을 먼저 유지하고, 승인된 pair arithmetic 및 representation 검사를 각각 검증한다. 첫/최악 사례와 이전 solvable C08b 사례를 구분한다. +- Production와 C08 controller에 같은 기준을 적용하고 configured 관련 unit checks 및 공식 C08a/C08b 전체 grid, N7 separation, 원본 reference를 새 source identity로 재실행한다. 과거 trajectory/scratch PASS를 현재 공식 PASS로 승계하지 않는다. + +관련 구현·이전 red/green: [implementation-c08-reduced.md](implementation-c08-reduced.md). 현재 계약 원문: [numerical-controls.md](numerical-controls.md#n3-update초기화대수조건). diff --git a/docs/hht-implicit-dynamics/c08a-refinement-proposal.md b/docs/hht-implicit-dynamics/c08a-refinement-proposal.md new file mode 100644 index 0000000..8b99438 --- /dev/null +++ b/docs/hht-implicit-dynamics/c08a-refinement-proposal.md @@ -0,0 +1,57 @@ +# C08a 최종 refinement와 hidden defect 판정 제안 + +상태: **2026-10-13 사용자 승인**. 아래 두 변경을 [HHT-ADR-015](ADR.md)에 기록했다. +기존 FAIL과 진단 evidence를 보존하며, 승인 후 변경본의 공식 검증은 미완료다. +근거는 [독립 검토](numerical-review-reduced-coordinate.md)와 +[실행 기록](temporal-remediation.md#2026-10-13-후속-실행)이다. + +## 실제 진단 evidence + +기존 16/32/64/128/256 grid를 변경하지 않은 Release 실행은 native8이다. +별도 scratch target은 같은 실제 shell controller·물성·독립 forcing·원본 초기값을 +사용하여 512/1024 grid만 추가 조사했다. MKL/OMP=1, native0, 323.759초이며, +그 실행의 `official_acceptance=NOT_EVALUATED` marker를 보존했다. +공식 acceptance 또는 구성된 전체 Debug 통과로 승계하지 않는다. + +| denominator | 최대 normalized angular-a error | 직전 grid와 차수 | error/N7 최대 noise | +| --- | --- | --- | --- | +| 256 | 1.003052994395584e-4 | 128→256 약2차 | 기존 실행에서 factor100 만족 | +| 512 | 2.8705427708469167e-5 | 1.8050023730926419 | 167.7319066257858 | +| 1024 | 7.3119405878985488e-6 | 1.9729972986554705 | 157.6087511308705 | + +나머지 5개 channel도 두 finer refinement에서 차수1.8 이상, finest error1e-4 이하와 +factor100 separation을 만족한다. 이후 controller/source 수정본은 새로 실행해야 한다. +Raw log·source/production library/binary identity는 +`.dryforge/hht-reduced-c08a-finer-20261013/`에 보존했다. + +## 제안1: 최종 두 grid 추가 + +기존 16–256 evidence와 실패를 보존하고 512/1024를 C08a 최종 refinement로 추가한다. +물성·T=1·forcing·정확한 초기값·HHT 계수는 유지한다. 최대 q/v/physical-a error +`<=1e-4`, 마지막 두 refinement의 차수 `>=1.8`, factor100 N7 separation은 유지한다. +기존 grid의 실패를 삭제하거나 초기 frame·초기 transient를 제외하지 않는다. + +실제 physical-a 오차와 algebraic-only recovery의 오차는 거의 동일했다. +독립 oscillator probe에서도 stiff elastic startup과 최대시점 이동으로 64→128 차수가 +1.8 미만일 수 있었다. 이는 actual shell의 정확한 원인 확정 또는 새 grid의 성공 보장이 +아니며, 더 잘 분해한 고주파 transient에서 동일 오차/차수 기준을 평가하는 제안이다. + +## 제안2: 재구성된 hidden1/2의 absolute 판정 + +Reduced rate reconstruction에서 analytic ψ1/ψ2는 0이다. 현재 normalized defect는 +hidden1 약1e-16, hidden2는256/512/1024에서 약3.64e-13/8.84e-12/1.71e-11로 +변동한다. 이 zero quantity의 strict refinement 감소를 truncation order로 해석하지 않는다. + +C08a의 hidden1/2에는 각 frame의 `|ψk_i|/Sk_i <=1e-10` upper bound를 요구하고 +strict temporal decrease를 대체한다. `Sk_i`는 원래 사용한 같은 단위의 uncancelled +scale이며 새 floor·clamp·물리 가속도 projection을 도입하지 않는다. Scale0이면 +raw defect도 exact0이어야 한다. Raw ψ1/ψ2와 scale·normalized 최대값을 계속 기록한다. +실제 q/v/physical-a 시간수렴과 N7 판정은 별도로 모두 통과해야 한다. + +이는 기존 초기 N3의 숫자를 C08a의 endpoint hidden1/2에도 적용하는 **acceptance 변경**이다. +기존에 endpoint1/2 unconditional upper bound가 이미 있었다고 주장하지 않는다. +Defect 자체를 포함한 graph RHS uncertainty로 같은 defect를 unresolved 처리하거나, +단위가 다른 physical-a N7 noise를 hidden uncertainty로 재사용하지 않는다. + +승인된 검증 계약은 [검증 사례 C08a](verification-cases.md), 현재 완료 여부는 +[PRD checklist](PRD.md)를 따른다. 변경본 전체 grid와 필수 검증을 새로 실행한다. diff --git a/docs/hht-implicit-dynamics/c09-channel-newton-proposal.md b/docs/hht-implicit-dynamics/c09-channel-newton-proposal.md new file mode 100644 index 0000000..7a609df --- /dev/null +++ b/docs/hht-implicit-dynamics/c09-channel-newton-proposal.md @@ -0,0 +1,28 @@ +# C09 translation 유지 Newton 전략 — 승인된 구현 명세 + +상태: 2026-10-13 사용자 승인, [HHT-ADR-017](ADR.md). 아래 승인 전 조사와 검증 요구는 보존한다. 구현·자연 trajectory 통과는 별도 evidence다. + +현재 full Newton100 FAIL은 기준 자체의 불가능이 아니다. 실제 최종 translational p high/vp/ap/Ar를 고정한 read-only angular/hidden block 진단은2회 보정 후 원 full N2, hidden evidence, N4, graph regularity 및 N3 update 검사를 만족했다. Phi ratio는1→.00898031→1.4072994e-13이고 U ratio8.70943e-16는 그대로다. Commit하지 않았으며 private 의도 종료 native1/5.703s다. 공용 알고리즘은 변경하지 않았다. + +## 승인 요청 범위 + +같은 HHT equations/원 full acceptance를 유지하면서, 한 증분 안에서 이미 원 translational residual와 correction 검사를 만족하는 후보의 translational p/Ar를 유지하고 angular/hidden Newton만 수행하는 내부 전략을 승인했다. 새 물리구속이나 BC가 아니며 공개 입력/결과/threshold를 변경하지 않는다. 기존 full augmented Newton 정책의 실행 방식과 N2-L 검사 영역을 아래 조건에 한해 변경한다. + +1. Original pold/pp start 선택과 전체 augmented tangent assembly를 유지한다. +2. 비어 있지 않은 U의 원 residual 및 마지막 실제 mapped correction의 병진 q/v/a/public A와 관련 private Ar 검사가 모두 통과하고 phi residual이 실패한 경우에만 진입한다. Phi correction-only 실패나 empty channel은 진입 조건이 아니다. 원 scale와 threshold 및 scale0의 exact-zero 검사를 유지한다. +3. 원 scaling을 적용한 full augmented system을 K*x=b, x=(dp,dz,dvz,daz)로 둔다. Free translational p index 집합 U를 제외한 J의 실제 K[J,J]*x[J]=b[J]를 풀고 x[U]=0으로 둔다. All psi/velocity-psi/acceleration-psi rows와 all auxiliary blocks는 남긴다. 원 direct solver와 backward-error threshold 1e-12를 사용하되, **N2-L 검사 영역은 실제 부분 행렬 J로 변경된다. 원 all-free 선형계 검사와 동일하지 않으며 이 변경도 승인 대상이다.** Full endpoint 잔차 검사는 유지한다. +4. Translational p high/low/Ar와 해당 vp/ap를 bitwise copy한다. Zero correction을 다시 누적하여 pair를 재정규화하지 않는다. Angular p와 Ar, implicit graph/rates는 원 갱신 식을 적용한다. 원 incremental trace와 inherited arithmetic history radius는 reset/clamp하지 않는다. +5. 이후 매 candidate에서 원 full E, S_U, S_phi 및 correction 검사를 다시 적용한다. U가 원 조건을 벗어나면 다음 solve를 full Newton으로 선택한다. Candidate를 되돌려 retry하거나 예산을 환급하지 않는다. 양 모드의 actual correction을 합쳐 원100회 한도를 적용하며 101번째 solve는 없다. Restricted singularity/nonfinite/backward-check 실패는 원 실패 절차로 처리한다. +6. Commit에는 기존 hidden/N4/regularity/N3/filter 및 모든 endpoint 검사를 그대로 요구한다. 모드나 선택 좌표를 다음 accepted history의 새 physics로 영속화하지 않는다. + +## 검증과 정식화 검토 범위 + +Private frozen-final 진단은 표현가능한 endpoint의 존재를 보여주며, 처음부터 자연 HHT trajectory로 이 정책이 수렴한다는 증거는 아니다. Actual C09 initial/properQ/finite-phi/multiple-partitions 및 existing failure/state/100-boundary 검사가 필요하다. 같은 actual method를 사용하는 C08 controller도 일치시켜야 하며 공식 temporal/N7, configured full build/CTest 및 원본 reference를 새 identity에서 다시 검사해야 한다. + +독립 정식화 검토를 완료했다. [검토와 N7 구현 명세](numerical-review-channel-newton.md)는 실제 restricted last operator와 원 full-model operator를 구분한다. Restricted-last의 N7은 실제 correction, restricted linear defect 해, **누락 U 행을 포함한 같은 trial의 full linear defect 해**, fresh accepted full residual/hidden defect 해의 mapped norm 네 항을 합산한다. Full-last는 기존 세 항을 유지한다. 모든 q/v/a/private Ar/public A mapping과 inherited CA radius를 유지하고 factor100을 바꾸지 않는다. 추가 full-model solve 실패는 N7 통과로 처리하지 않는다. 이 estimator는 forward-error bound가 아니다. + +승인 후 trigger/thaw·실패 rollback·combined100/101 경계와 omitted-U defect 회귀를 먼저 구현하고 실제 C09 및 C08 전체 승인 grid, configured Debug 전체 검사와 원본 reference를 재검증한다. Restricted block singularity, U/phi coupling으로 인한 모드 왕복 및 large-arm/tiny-convective representation은 별도 검증 위험이다. 검토 완료는 production 구현 또는 자연 trajectory의 통과를 뜻하지 않는다. + +## 증거 + +`.dryforge/hht-fixed-translation-c09-20261013/fixed-procedure.cpp`는 captured final100 state의 history/predictor identity를 확인하고 매 evaluation에 translational q/v/a의 bitwise 불변을 검사한다. Fixed block의 source/current inertia/library SHA는 identity.json에 저장했다. fixed-runtime.log, fixed-iteration.log 및 fixed-analysis.json은 모든48 full rows와 요청/적용 보정을 보존한다. 원 full Newton 경로의 선형/반올림 비교는 [C09 산술 진단](c09-newton-rounding-diagnostic.md)에 있다. diff --git a/docs/hht-implicit-dynamics/c09-newton-rounding-diagnostic.md b/docs/hht-implicit-dynamics/c09-newton-rounding-diagnostic.md new file mode 100644 index 0000000..d3717f9 --- /dev/null +++ b/docs/hht-implicit-dynamics/c09-newton-rounding-diagnostic.md @@ -0,0 +1,31 @@ +# C09 Newton 보정과 저장 좌표 산술 진단 + +Latest RateSum library snapshot과 coefficient-first inertia objectoverride의 실제 properQ C09 fixture는 원100회 정책으로 increment1/outer100에서 FAIL했다. Private build/link native0, actual runtime native1/454.432s다. 초기 재구성은 PASS지만 전체 C09 closure는 아니다. Source/기준/state/공용 binary/reference는 변경하지 않았다. + +| 최종 채널 | numerator | 원 channel scale | ratio | +| --- | ---: | ---: | ---: | +| U | 1.3322676295501878e-15 | 1.5296843745689783 | 8.70943e-16 | +| phi | 3.3567686214448646e-17 | 3.3567686214448646e-17 | 1 | + +최악full46에서 physical force−3.340385641864892e-17, inertia−1.6382979579972208e-19, drilling2.5868401886028114e-36이다. Selected rotational rows의 max residual은3.3567686214448646e-17이고 omitted z rows는6.963816335630029e-18이다. Selected rows도 실패하므로 omitted physical-null moment만 남는 상황이 아니다. Actual n·E max3.85186e-33 및 scalar psi max3.25696e-35는 지배적이지 않다. + +## 실제 보정과 force authority + +Last90..99의 full mapped correction을 원 Kint/Iq/Iv/M에 적용한 predicted E+Kint*dq+Iq*dq+Iv*dv+M*da는 모든 rotational row에서 max4.429060775850292e-32다. 같은 endpoint의 선형 해가 selected/omitted full residual을 모두 zero 근처로 옮긴다는 지표다. + +그러나 physical force는 실제 저장 high 좌표를 평가한다. Zero-state physical matrix(Kinternal−Kdrilling)와 anchored displacement/tiny rotation의 exact stored-coefficient Fraction 계산은 native force와 max defect/uncancelled action2.038688672288276e-16로 일치했다. Last90..99 actual physical-force 변화와 K0*actual-high-coordinate-change의 max차이도1.5450867111269945e-31다. 현재 residual을 physical force value/gradient 불일치로 설명할 근거는 없다. + +K0*(actual high change−requested correction)의 max는1.5704396711082182e-16이다. Translation high 반올림 action의 max1.553519432281809e-16이며, 이에 따라 graph가 다시 계산한 dependent z action max1.0770896510389219e-16도 있다. Selected rotary p의 직접 반올림 action은2.8143925125040197e-32에 불과하다. 대표 iteration96/full27에서 requested K0 action−4.092854540103234e-17 대비 actual high action−1.9797251251185415e-16이고 actual force 변화는−1.9797251251185405e-16다. + +400회의 AdvanceCoordinate를 독립 Fraction으로 검사하면 모든 new high가 old high+old low+requested dp의 RN-even과 일치한다. Pair total의 max산술 gap은3.0814879110195774e-33이다. 누적 carry loss나 더 나은 단일 RN high 선택이 현재 근거에 나타나지 않는다. + +이는 현재 full-Newton 경로의 requested correction과 실제 high/implicit-graph map 차이가 physical forcing을 바꾼다는 근거다. 모든 표현가능한 상태에서 원N2를 만족할 수 없다는 증명은 아니다. 기준 완화, zeroing, residual projection 또는 production state 보정은 적용하지 않았다. Final translational high를 고정한 read-only rotary/hidden block 진단은 후속 실행에서 원 endpoint 기준을 만족했다. 결과와 production 미적용 범위는 아래에 기록한다. + +## Artifacts와 명령 + +별도 epoch `.dryforge/hht-latest-inertia-final-c09-20261013/`의 identity.json에 source/procedure/library SHA를 보존했다. final-runtime.log에는 last90..100의48 full q/v/a/physical/drilling/inertia/E/scales, p/ap/pp/high/low/Ar 및 requested/applied correction을 기록했다. final-iteration.log는 원 channel norms/판정과 최종100회 실패를 보존한다. final-analysis.json과 parse-final.py는 exact Fraction/RN 및 K0 action 계산이다. physical-map.log/physical-map-exact.json은 같은 physical kernel의 linear-map 감사다. + +실행 명령: `cmd /c .dryforge\hht-latest-inertia-final-c09-20261013\build-final.cmd`, private `final-probe.exe --gtest_filter=Diagnostic.C09RotatedInitialReconstruction`, `python .dryforge/hht-latest-inertia-final-c09-20261013/parse-final.py`. Shared configured 최신 C09/N5/C08/reference 판정은 별도다. + + +후속 승인된 read-only fixed-translation 진단은2회 보정 후 원fullN2/hidden/N4/regularity/N3를 만족했다. Translational q/v/a는 bitwise 불변이며 commit 전에 의도 종료(native1/5.703s)했다. Phi5.9848273021833354e-32/S4.252704241500445e-19→1.40730e-13다. 따라서 기준의 불가능으로 결론내리지 않는다. [Translation 유지 Newton 제안](c09-channel-newton-proposal.md)은 HHT-ADR-017로 사용자 승인됐으며 production/controller 구현과 자연 trajectory 검증을 진행한다. diff --git a/docs/hht-implicit-dynamics/channel-newton-covariance-diagnostic.md b/docs/hht-implicit-dynamics/channel-newton-covariance-diagnostic.md new file mode 100644 index 0000000..90c4bee --- /dev/null +++ b/docs/hht-implicit-dynamics/channel-newton-covariance-diagnostic.md @@ -0,0 +1,52 @@ +# Actual C09 공변성 실패 진단 + +2026-10-13. Production/tests/기준은 변경하지 않았다. Configured C09는 여섯 trajectory의 실행 성공 후 공변성 비교에서 native8/113.03s로 실패했다. 원본 로그는 `.dryforge/hht-remediation-20261012/adr017-natural-c09-debug-raw.log`다. 아래 private 측정은 실행 성공과 원 공변성 기준 통과를 구분한다. + +## 실제 경로별 오차 + +같은 production procedure/operators와 복사한 solver library로 원 순수 병진 pair 및 finite-phi pair를 실행했다. Finite pair는 T=.02를 유지하고 h=.01/.005/.0025로 각각2/4/8증분을 자연 종료했다. 모두 원 endpoint 검사로 accepted됐다. 측정 probe native0/350.545s는 **공변성 PASS가 아니라 여덟 trajectory 실행 성공**이다. + +원 C09 scale은 q=1, v=1/T, a/A=1/T², force=1, director/triad=1이다. 모든 node/component/frame의 최대 오차를 사용했다. 순수 병진 pair는 모든 비교에서1e-10 이하이며 q≤4.45e-16, v≤1.34e-15, a/A≤3.56e-15, force/residual≤1.79e-14, director/triad≤2.23e-16이다. 실패는 finite-phi pair에 있다. + +| Quantity/channel | 2증분 | 4증분 | 8증분 | +| --- | ---: | ---: | ---: | +| q, angular | 4.2449713e-7 | 1.0008274e-7 | 2.1971053e-8 | +| v, angular | 7.9297623e-7 | 2.4574791e-7 | 6.3087721e-8 | +| a, angular | 2.5940786e-6 | 6.5595226e-7 | 1.6907375e-7 | +| A, angular | 2.4966904e-6 | 6.3710091e-7 | 1.6818281e-7 | +| I/Fint, max full component | 5.9519130e-7 | 1.6052073e-7 | 4.1361613e-8 | +| director | 4.6176713e-7 | 1.0884266e-7 | 2.3901148e-8 | +| triad | 5.6441014e-7 | 1.3284724e-7 | 2.9211792e-8 | + +Finite2의 translational q/v/a/A 오차도 각각6.27749e-10/1.85494e-9/4.76153e-9/4.58596e-9다. 각 경로의 full E는 수렴하지만 서로 다른 accepted physical state가 생긴다. Trajectory residual의 공변성 차이는≤2.14e-16다. Finite2 energy 차이/reference100은 kinetic1.17776e-11, physical3.48377e-12, drilling3.29e-38이다. Angular a 차이의 refinement order는 약1.983/1.956이며,8증분도 원 공변성1e-10 기준에 실패한다. Refinement를 공식 fixture/기준 변경으로 사용하지 않는다. + +## 같은 physical state의 조립을 별도로 비교 + +Finite2 source의 각 accepted q/v/a/A를 fixed proper rotation R로만 변환하고 rotated Domain에서 fresh assembly했다. Target trajectory state를 사용하지 않았다. 이 bounded probe는 native0/4.111s다. + +- t=.01/.02의 inertia force 공변성 absolute defect≤5.56e-17, internal force≤1.48e-17이다. Internal force의 max-reference relative defect≤3.00e-15다. +- 동일 mass에 대한 `R*(M*x)`와 `M_rot*(R*x)`의 unit-column action defect≤3.39e-20다. +- Canonical scalar primitive value 차이≤3.90e-20, full gradient의 rotated comparison 차이≤3.04e-18다(gradient max reference≈.0026). +- External force는 exact 일치했다. 잔차 차이≤1.12e-16이다. 잔차 자체가 거의0이므로 잔차를 분모로 한 relative 수치는 원 full N2 scale를 대신하지 않는다. + +이 결과는 해당 상태의 constitutive/mass/primitive 공변성 오차가 trajectory force 차이5.95e-7보다 훨씬 작음을 보여준다. 일반 모든 geometry/state의 공변성 증명은 아니다. + +## Actual recurrence에서 nonlinear selector 문제 확인 + +현재 [RC-03/04](formulation-reduced-coordinate.md)는 fixed global-component selector의 p에 HHT/Newmark recurrence를 적용한다. 두 fixture의 initial null direction에서 global Z가 최대이므로 각 node의 φZ가 z이고 φX/φY가 p다. Source finite2의 max |φZ|는 t=.01에서1.4298223e-7, t=.02에서3.2923220e-6이며, max |φ|는 .00361005다. φZ는 algebraic graph에서 복구하므로 source의 global Z 자체는 독립 Newmark 좌표가 아니다. + +Proper rotation 후 선택 좌표는 `y=L'_p^T R_f Q(p)`다. R이 constant linear rotation이어도 z(p)가 nonlinear이면 y(p)는 nonlinear이다. Coordinate-wise Newmark는 이 nonlinear 좌표 변환에 불변이지 않다. + +Actual source history에서 p의 position recurrence defect는4.34e-19이고 velocity defect는3.47e-18이다. 같은 physical history를 R로만 변환한 뒤 target selector에 대입하면 angular position defect는4.820072708909e-7/uncancelled scale.001933790222256≈2.493e-4, velocity defect는3.878217179085e-5/.208746818840≈1.858e-4다. Public A의 selected component는 해당 private Ar와 같은 값이므로 actual history의 q/v/A로 이 recurrence를 재평가할 수 있다. + +Stored binary64 입력의 Fraction 대조는 source dependent-Z position/velocity defect1.618323538251e-6/1.302098645892e-4가 R의 Z→selected-X/Y 성분을 통해 위 transformed defect를 만든다는 점을 확인했다. Source X/Y의 기여 remainder는 position≤1.64e-19, velocity≤2.99e-17뿐이다. 실제 graph/time-discretization 좌표 의존성을 확인한 근거이며, 단순 endpoint tolerance 또는 force summation 문제로 설명하지 않는다. Translation freeze 정책만을 원인으로 확정하지 않는다. + +## 해결 후보와 결정 경계 + +Fully free node에서 existing initial objective triad의 tangent_a/tangent_b/director를 fixed rotational basis B로 사용하면, rotated model의 basis가 R*B가 되어 reduced scalar coordinates가 proper rotation 아래 동일하다. `L_p/L_z`를 coordinate scatter 대신 이 constant basis injection으로 일반화하고 graph/rates/augmented tangent/초기화/CA/N7를 함께 정식화하는 후보가 있다. 같은 physical equations라도 현재 승인된 global-component selector 및 discrete integration operator를 바꾸므로 독립 정식화 검토와 사용자 결정이 먼저 필요하다. Partial global-component BC의 admissible basis, chart/rank 조건과 public global q/v/a 의미도 별도 검토해야 한다. + +현재 조사에서 production 변경이나 acceptance 완화는 하지 않았다. 더 작은 h를 공식 공변성 기준의 대체로 삼거나 실패 finite-phi fixture를 제거하지 않는다. + +## 재현과 identity + +Artifacts는 `.dryforge/hht-channel-newton-20261013/covariance-*`다. `covariance-build.cmd` 및 `covariance-probe.exe --gtest_filter=DiagnosticCovariance.CurrentKernel`로 trajectory를, `covariance-matched-build.cmd` 및 `covariance-matched.exe --gtest_filter=DiagnosticCovariance.MatchedFiniteStateAssembly`로 matched assembly를 실행했다. `covariance-analyze.py`, `covariance-recurrence.py`, `covariance-exact-projection.py`가 각각 quantity/frame/node maxima, actual recurrence, exact binary projection을 계산한다. Raw full frames/summary/recurrence/Fraction 결과는 해당 JSON에 보존했다. `covariance-identity.json`에는 source/library/object/probe/log SHA와 single-thread 설정을 기록했다. 공용 build/CTest와 원본 reference는 수정하지 않았다. diff --git a/docs/hht-implicit-dynamics/fixed-null-basis-proposal.md b/docs/hht-implicit-dynamics/fixed-null-basis-proposal.md new file mode 100644 index 0000000..2feb197 --- /dev/null +++ b/docs/hht-implicit-dynamics/fixed-null-basis-proposal.md @@ -0,0 +1,102 @@ +# 초기 null의 직교 보완공간을 사용하는 고정 축소 좌표 제안 + +상태: 사용자 승인, 2026-10-13 [HHT-ADR-018](ADR.md). 구현 상세 수식과 변경본 검증은 별도 수행한다. +독립 검토: [수치 검토의 actual covariance 및 fixed-basis 절](numerical-review-channel-newton.md). +HHT-ADR-017의 제한 Newton 구현을 대체하거나 취소하는 제안이 아니다. +[실제 C09 진단](channel-newton-covariance-diagnostic.md)에서 확인한 +global-component chart의 이산 공변성 문제를 해결하기 위한 후속 변경이다. + +## 문제와 변경 경계 + +ADR-017 변경본은 C09 여섯 trajectory를 자연 종료했지만 유한회전의 +proper-Q 비교에서 원1e-10 기준을 넘었다. 동일 물리 상태의 fresh assembly는 +회전 변환과 일치한다. 현재 selected coordinate의 변환 +`p'=L'_p^T R6*q(p)`가 비선형이므로 HHT/Newmark recurrence를 보존하지 않는다. +Read-only 2/4/8-step 진단은 이 차이가 약2차로 감소함을 보였다. +수렴 반복 수나 잔차 tolerance를 더 줄이는 것으로 이 이산화 차이를 제거할 +근거는 없다. 비교 기준 완화는 제안하지 않는다. + +변경 대상은 null이 있고 회전 세 성분이 모두 자유인 절점의 **고정 선형 +좌표 분해**다. Continuous full equation과 endpoint 기준은 유지하지만 +private coordinate를 적분하는 이산 방법은 달라지며 HHT-ADR-018로 승인됐다. +병진 좌표·물리 BC·HHT 계수·lumped measure·public global 결과·schema 및 +원본 reference는 유지한다. + +## 고정 basis의 구성 + +1. Frame0 원 full q/v/a와 실제 회전 kinematics에서 analytic drilling null + `n_raw=Jl(phi0)^(-1)*d(phi0)`를 얻는다. Reference geometric director를 + 비영 초기 회전의 실제 null 대신 사용하지 않는다. +2. Positive finite norm으로 `n0=n_raw/||n_raw||2`를 만든다. 이 연산은 private + basis 구성이고 model rotation/director/state의 재정규화가 아니다. +3. `|n0[k]|`가 최소인 Cartesian axis `e_k`를 선택한다. Exact tie는 component + 순서다. `b=e_k-(e_k·n0)*n0`, `t1=b/||b||2`, `t2=n0×t1`로 만든다. + 수학적으로 `||b||2>=sqrt(2/3)`이므로 임의 floor나 tiny-vector fallback이 + 필요 없다. Finite·positive 및 기존1e-12 Gram 검사를 요구한다. +4. 각 절점에서 `phi=t1*p1+t2*p2+n0*z`로 둔다. Basis는 run 동안 고정이며 + current null을 따라 바꾸거나 rechart하지 않는다. + +Tangent basis가 proper-Q에서 그대로 회전될 필요는 없다. 두 model의 initial +null이 `n0'=s*Q*n0`, `s=±1`이고 각 retained basis가 해당 null 직교평면을 +span하면 `p'_rot=T2*p_rot`, `z'=s*z`, `T2∈O(2)`다. 이는 상수 선형 변환이다. +Cartesian axis의 선택이 바뀌어도 평면을 보존하면 비선형 chart 전환이 되지 +않는다. 병진도 `p'_u=Q*p_u`이므로 exact arithmetic의 HHT recurrence가 이 +변환과 commute한다. Floating-point 연산과 channel infinity norm 때문에 +bitwise covariance나 실제1e-10 통과를 자동 보장한다는 주장은 하지 않는다. + +## 부분 구속과 초기 상태 + +- Null이 실제 free 공간과 만나는지 판단하는 기존 계약을 유지한다. + 회전 일부 성분이 구속된 절점은 기존 component chart를 유지한다. + Global BC flag를 새 local coordinate의 같은 번호에 복사하지 않는다. + 이 혼합 chart 정책을 명시하고 부분구속 실제 모델을 회귀 검증한다. +- Fully fixed rotation은 exact prescribed value를 유지한다. Nonzero prescribed + BC의 공개 지원 범위를 확대하지 않는다. +- Frame0의 원 full q/v/a/A·force·accepted history는 projection하지 않는다. + Private p/z 및 rates의 basis 변환은 연산 radius와 roundtrip/initialization + 검사를 새로 수행한다. 원 초기 gate를 못 만족하면 fail-closed이며 + 초기 force/state 보정이나 hidden polishing으로 통과시키지 않는다. +- Actual `G=psi_q*Lz`의 regularity와 positive reduced mass 검사를 유지한다. + Current moving null과 fixed n0의 transversality가 나빠지면 기존 실패 + 정책을 적용한다. Principal rotation bound만으로 이를 보장하지 않는다. + `G` regularity와 `N(q)^T*Lz` transversality는 별개의 검사다. 기존 pivot의 + current-null nonzero 검사를 actual `n(q)·n0`와 해당 scaled conditioning으로 + 일반화한다. `G` 통과로 selector의 full-root equivalence 검사를 생략하지 않는다. + +## 행렬·보정·N3/CA/N7의 변경 + +Index scatter 대신 constant sparse injection `Lp/Lz`를 사용한다. +Full row physical equilibrium은 `Lp^T*E`로 축소하고 augmented tangent는 +같은 basis의 exact constant chain rule로 구성한다. Hidden gradient/Hessian/ +third/time 항과 모든 auxiliary block도 동일 injection을 사용한다. +Production finite differences나 full dense basis matrix는 도입하지 않는다. + +`dq=Lp*dp+Lz*dz`, `dv=Lp*cv*dp+Lz*dvz`, +`da=Lp*ca*dp+Lz*daz`, `dA=(1+alpha)*da`를 실제 sparse 연산으로 계산한다. +ADR-017의 U trigger/copy/thaw와 combined100 및 all-free full endpoint 검사는 +유지한다. Private basis ordering을 public equation 번호로 노출하지 않는다. +기존 `p_dofs[i]%6` 분류나 direct index scatter를 basis coordinate에 적용하지 +않는다. Private coordinate의 channel 및 full support metadata를 명시하고 +trigger·copy·CA·N7가 같은 injection과 분류를 사용하도록 한다. + +N3 private pair의 accepted high/requested increment·RN-even 저장 검사를 유지하고, +global reconstruction의 basis product/sum 및 정확한 constrained zeros를 별도로 +검산한다. CA는 초기 projection, 모든 basis action, graph/rate 재구성과 copied +history의 실제 연산을 추적한다. 기존 index-only radius를 승계하지 않는다. +N7의 actual restricted/full-last/fresh-full defect와3/4항 규칙을 새 map에 적용한다. +Full physical q/v/a/public A와 private Ar의 역할·단위 및 factor100을 유지한다. + +## 구현 및 검증 순서 + +1. Fixed sparse basis·partial-BC mapping·initial-state 보존 정식화 및 독립 검토. +2. Analytic null/Gram, linear frame transition, exact constrained zeros와 + basis roundtrip/radius·N3 mutation 회귀. Actual G conditioning도 검사한다. +3. Production/verification executor를 같은 injection으로 변경하고 실제 + nonzero-C1/warped/shared-node N5와 ADR-017 rollback/count 검사를 실행한다. +4. 현재 실패한 finite-phi C09의 모든 이력·proper-Q·3회 결정론·partitions, + 2/4/8-step 진단과 matched-state force/inertia를 fresh identity로 재검증한다. +5. 공식 C08a7 grid와 C08b8 grid의 시간 정확도·hidden·N7·P/E/L, + 구성된 전체 MSVC Debug/CTest 및 원본101-frame production 비교를 수행한다. + +단계별 실패·미실행은 보존한다. 이 제안의 승인은 새 방법의 실제 수렴, +공변성·시간 정확도 또는 reference 통과를 뜻하지 않는다. diff --git a/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md b/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md index 9a5e013..8196e33 100644 --- a/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md +++ b/docs/hht-implicit-dynamics/formulation-acceleration-recovery.md @@ -1,5 +1,7 @@ # 제약 일관 가속도 복구 후보 +2026-10-11 질량 정책 변경: [HHT-ADR-012](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. + - 상태: `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). diff --git a/docs/hht-implicit-dynamics/formulation-carried-a-noise.md b/docs/hht-implicit-dynamics/formulation-carried-a-noise.md new file mode 100644 index 0000000..13adbca --- /dev/null +++ b/docs/hht-implicit-dynamics/formulation-carried-a-noise.md @@ -0,0 +1,88 @@ +# Carried-A HHT의 arithmetic/noise 인계 + +상태: `implementation-ready-estimator; independent-review-pending`, 2026-10-12. [축소 좌표 정식화](formulation-reduced-coordinate.md)와 별개로, 동일 full-coordinate HHT에서 A를 직접 갱신하는 산술을 다룬다. 기존 [N7](numerical-controls.md)의 separation 기준을 완화하지 않는다. Half-ULP `q-qp-sA` closure는 이전 predictor·seed·update 오차 또는 history bound가 아니다. + +## 1. 실제 연산 경로 + +`s=beta*h²`, `r=gamma*h`, `k=1+alpha`다. Frozen accepted history에서 qp/vp를 기존 predictor로 계산한다. 첫 trial assembly가 기존 `EvaluateNewtonStart`의 qn 또는 qp를 선택한다면 그 **실제** Aseed와 seed inverse 연산을 포함한다. 이후 모든 Newton correction에 대해 + +\[ +\Delta A=\Delta q/s,\quad A\leftarrow A+\Delta A,\quad +q=qp+sA,\quad v=vp+rA,\quad a=(A+\alpha a_{old})/k. +\tag{CA-01} +\] + +Requested Δq와 rounded reconstructed q 차이는 다른 값이다. 외력·평형 및 마지막 linear/nonlinear solve defect는 기존 N7 경로에서 별도로 계산한다. Stored last correction 하나는 앞선 update의 arithmetic를 나타내지 않는다. + +## 2. 최소 online component radius + +전체 Δq 목록을 저장하지 않고 component별 A radius `B_A`를 반복마다 누적할 수 있다. `hat x`는 실제 binary64 값, `B_x≥|hat x-x*|`는 같은 frozen input/correction path의 exact arithmetic 값에 대한 절대 radius다. 실제 evaluation order를 따라 아래 primitive rule로 scalar coefficient, predictor, seed, update, reconstruction의 모든 연산을 추적한다. Constrained 성분은 정확한 0이며 새로운 scale floor는 없다. + +Normal finite binary64 operation의 rounding term은 + +\[ +\rho(\hat z)=\frac{u}{1-u}|\hat z|+\eta,\quad u=2^{-53}, +\tag{CA-02} +\] + +로 둘 수 있다. eta는 underflow를 지원하는 실제 IEEE 실행의 absolute rounding bound다. Flush-to-zero 여부를 확인하지 않은 채 정상 수의 상대오차 식만으로 subnormal을 인증하지 않는다. η를 물리 scale floor나 acceptance floor로 사용하지 않는다. 일반 범위에서는 검증된 gamma_m의 uncancelled operand sum bound로 구현해도 된다. + +\[ +\begin{aligned} +B_{x\pm y}&=B_x+B_y+\rho(\widehat{x\pm y}),\\ +B_{xy}&=|\hat x|B_y+|\hat y|B_x+B_xB_y+\rho(\widehat{xy}),\\ +B_{x/y}&=\frac{B_x+|\widehat{x/y}|B_y}{|\hat y|-B_y} ++\rho(\widehat{x/y})\left(1+\frac{B_y}{|\hat y|-B_y}\right). +\end{aligned} +\tag{CA-03} +\] + +Division은 `|hat y|-B_y>0`일 때만 bound가 성립한다. 식은 실제 quotient에 대한 rounding uncertainty도 denominator perturbation과 함께 전파한 보수적인 bound다. Radius 계산 자체의 부동소수점 오차도 upper rounding/추가 gamma bound로 포함해야 한다. Bound 계산의 down-rounding으로 실제보다 작은 B를 반환하지 않는다. + +Predictor의 `h*h*(.5-beta)` 및 `h*(1-gamma)`, `s,r,k`, 두 predictor sums를 CA-03으로 계산한다. Seed `(q_start-qp)/s`도 subtraction/division rule을 사용한다. q_start가 qp인 정확 동일-object 분기에서는 exact seed=0의 correlation을 사용 가능하지만 검증되지 않은 다른 state에 같은 cancellation을 적용하지 않는다. Old coordinate start에서는 actual qold radius를 seed에 포함한다. + +매 correction Δq의 산술 입력 radius를 0으로 둘 때, 그 correction을 exact로 고정한 arithmetic-only radius다. Linear/nonlinear solve estimator는 별도이며 이를 correction rounding 0의 근거로 혼동하지 않는다. Δq scatter/scaling에 rounding이 있으면 그 primitive도 radius에 포함한다. 다음 방식으로 B_A를 반복마다 갱신한다: + +\[ +B_{\Delta A}=\operatorname{divideBound}(\Delta q,s),\quad +B_{A,new}=B_{A,old}+B_{\Delta A}+\rho(\widehat{A+\Delta A}). +\tag{CA-04} +\] + +최종 accepted q/v/a radius는 + +\[ +\begin{aligned} +B_q&=B_{qp}+|\hat s|B_A+|\hat A|B_s+B_sB_A+\rho_{mul}+\rho_{add},\\ +B_v&=B_{vp}+|\hat r|B_A+|\hat A|B_r+B_rB_A+\rho_{mul}+\rho_{add},\\ +B_{num}&=B_A+|\alpha|B_{a,old}+\rho_{\alpha a}+\rho_{sum},\\ +B_a&=\operatorname{divideBound}(\widehat{A+\alpha a_{old}},\hat k). +\end{aligned} +\tag{CA-05} +\] + +CA-05의 rho terms는 corresponding 실제 연산의 term이다. 사용한 alpha 자체를 exact binary64 입력으로 고정했다면 Balpha=0; alpha가 별도 계산 결과이면 해당 product term을 추가한다. Predictor의 correlation을 이용하지 않는 bound는 더 보수적이어도 유효하나 자동 PASS를 위한 cancellation은 금지다. Accepted A/predictor/last-solve만으로 CA-04 전체를 복원할 수 없으므로 online accumulator 또는 actual trace가 필수다. + +## 3. Frozen-step과 history를 구분 + +각 step 시작의 old q/v/a/A radius를 0으로 두면 **frozen-step local arithmetic bound**다. 이를 global discretization error나 전체 history bound로 보고하지 않는다. 이전 accepted radii를 다음 predictor/seed/CA-04/05의 input radii로 넘기면 고정 Newton corrections 및 고정 선택 분기의 whole-history arithmetic bound를 얻는다. 그 bound는 rounding의 전파를 포함하나 perturbed nonlinear equilibrium의 correction sensitivity는 포함하지 않는다. 기존 solve defect/stability evidence와 함께 판단한다. + +Equivalent 선형화 설명: state 순서 `(q,v,a,A)`, `b=h²(.5-beta)`, `d=h(1-gamma)`에서 frozen correction path의 initial-seed derivative는 q-start가 predictor일 때 `j=0`, old q일 때 `j=(0,-h/s,0,-b/s)`다. Exact accepted transition의 rows는 + +\[ +T_A=j,\quad T_q=(1,h,0,b)+s j,\quad +T_v=(0,1,0,d)+r j,\quad T_a=j/k+(0,0,\alpha/k,0). +\tag{CA-06} +\] + +`B_next≤|T|B_old+B_local`는 scalar coefficient uncertainty를 별도로 포함했을 때의 보수적인 component-history bound다. 이 fixed-correction-path |T| propagation은 cancellation을 잃어 커질 수 있다. Bound가 커지거나 overflow하면 N7 inconclusive로 남겨야 한다; norm을 줄이거나 floor를 추가하지 않는다. 실제 nonlinear stable trajectory의 더 날카로운 a posteriori bound는 독립 review가 필요한 별도 작업이다. + +고정밀 replay는 stored binary64 history/coefficients/각 δq를 exact inputs로 보고 실제 selection 및 evaluation 순서를 재현해야 한다. Local replay는 local 산술 검산, recursively replayed whole path는 CA-06/online history bound의 독립 검산이다. High-precision 재계산 결과를 current accepted physical a로 덮어쓰거나 equilibrium-consistent corrected solution으로 표시하지 않는다. + +## 4. N7 판정 인계 + +Component radii를 기존 length/time normalization으로 q/v/a 병진·회전 channels에 모아 전체 endpoint 최대를 구한다. Finest error/self-difference와 비교할 때 기존 N7의 approved factor/separation assertion을 유지하고 solve noise와 complete carried-A arithmetic evidence 중 큰 값을 사용한다. Grid pair는 기존처럼 두 grid의 radius를 함께 포함한다. + +기존 q-subtraction 기반 gamma32 estimator를 carried-A의 완전한 estimator로 승계하지 않는다. Predictor·seed division·모든 update·재구성 및 필요한 history 전파가 없으면 해당 arithmetic evidence는 incomplete다. 반대로 기존 arithmetic estimate를 함께 보존하면 regression 진단에 도움이 되지만 새 경로의 correctness 증명은 아니다. 기존 N7 time amplification을 새 local radius에 곱하는 선택은 승인된 heuristic의 비교 evidence이며 독립적으로 whole-history rigorous bound라고 부르지 않는다. + +필수 검산은 (1) exact/고정밀 frozen arithmetic와 primitive radius 비교, (2) seed qn/qp 양 분기, (3) multiple corrections와 tiny correction/addition absorption, (4) finite/division denominator/underflow 실패, (5) solver defect와 arithmetic radius의 별도 기록이다. Source·test·tolerance를 본 owner가 변경하거나 통과 승인하지 않았다. diff --git a/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md b/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md new file mode 100644 index 0000000..ba92e1b --- /dev/null +++ b/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md @@ -0,0 +1,505 @@ +# 고정 초기 null 기저의 sparse reduced HHT 정식화 + +상태: `implementation-ready; independent-review-and-runtime-pending`, 2026-10-13. +승인 범위는 [고정 null 기저 제안](fixed-null-basis-proposal.md)과 +[HHT-ADR-018](ADR.md)의 사용자 결정이다. 본 문서는 수식·연산 계약이며 +자기 수치 승인이나 현재 production PASS 기록이 아니다. +[기존 축소 정식화](formulation-reduced-coordinate.md)의 fully-free rotation +component selector를 아래 고정 ON 기저로 대체한다. 기존 +[N1–N7](numerical-controls.md), [제한 Newton](c09-channel-newton-proposal.md), +[독립 검토](numerical-review-channel-newton.md)와 허용값은 유지한다. + +## 1. 적용 가정과 물리 계약 + +Total Lagrangian MITC4, 큰 변위·유한회전·작은 탄성 변형률, 등방 선형 탄성, +objective drilling potential, `nodal-lumped-kinetic`, 기존 공간 적분·두께 적분과 +fixed-initial total rotation vector를 유지한다. 재료 history update는 없다. +관성·내력·공간 각속도·단면력은 [기존 물리 정식화](formulation.md)와 +[관성 상세](formulation-inertia.md)가 소유한다. 좌표 변경은 constitutive law, +mass measure, drilling stiffness 또는 recovery formula를 바꾸지 않는다. + +Full node-major ordering은 `q_i=(u_x,u_y,u_z,phi_X,phi_Y,phi_Z)`다. +`u`: length, `phi`: rad, `v=dot q`, `a=ddot q`이며 `v_phi`와 `a_phi`는 +공간 각속도·각가속도가 아니다. Zero fixed BC를 제거한 공간에서 + +\[ + E=I(q,v,a)+g(q,t),\quad I=M(q)a+c(q,v),\quad + g=f_{int}(q)-F(t),\quad \delta q^T E=0. \tag{FB-01} +\] + +Residual 부호는 internal+inertia−external이고 Newton RHS는 −residual이다. +공개 CLOAD는 constant global force이고 damping/follower load/nonzero BC/initial +condition 입력을 확대하지 않는다. `Fdot,Fddot`는 C08a private oracle에만 +사용하며 원 analytic 시간미분을 보존한다. 이 변경은 continuous equation의 +roots를 유지하는 **승인된 private 좌표 시간 이산화 변경**이다. + +## 2. 고정 기저와 혼합 chart + +Frame0의 actual rotation kinematics에서 + +\[ + n_{raw}=J_l(\phi_0)^{-1}d(\phi_0),\quad + n_0=n_{raw}/\|n_{raw}\|_2,\quad + k=\arg\min_{X,Y,Z}|n_0[k]|, +\] +\[ + b=e_k-(e_k^Tn_0)n_0,\quad t_1=b/\|b\|_2,\quad + t_2=n_0\times t_1,\quad B_p=[t_1,t_2],\quad B_z=n_0. \tag{FB-02} +\] + +Exact tie는 X,Y,Z 순서다. Norm은 finite positive이며 scaled sum-of-squares를 +사용한다. `||b||>=sqrt(2/3)`이므로 tiny-vector fallback/floor는 필요 없다. +기존 `1e-12` ON/Gram 검사를 적용한다. Model director/phi를 정규화하지 않고 +reference geometric director를 actual analytic null 대신 사용하지 않는다. +기저는 run 내 불변이며 current null에 맞추어 회전·pivot 변경·rechart하지 않는다. + +| 절점의 실제 free rotation/null | 고정 분해 | +| --- | --- | +| 세 회전 모두 free, admissible analytic null 1개 | `phi=Bp p_rot+Bz z`, 두 angular p와 한 z | +| 부분 회전 BC, admissible null 1개 | 기존 maximum-null-component pivot 및 component selector 유지 | +| 부분 회전 BC가 null을 절단하여 admissible null 0개 | 모든 free component를 p에 유지 | +| 세 회전 fixed | rotation private unknown 없음; exact prescribed0 유지 | + +Null 교집합은 기존 exact component 계약이다. Tiny constrained null 성분을 +0으로 자르지 않는다. Initial admissible-node inventory와 각 trial inventory가 +달라지면 fixed-rank branch 실패다. Partial global BC를 `p_rot`의 같은 번호에 +복사하면 다른 BC가 되므로 금지한다. 일반 partial-BC frame covariance는 주장하지 않는다. + +Full에 대한 constant sparse injection을 `Lp,Lz`로 표기한다. 병진과 기존 +component-chart 열은 identity support, 고정 plane 열은 세 global rotation +성분 support다. Constrained rows는 exact0이고 free 공간에서 + +\[ + q= L_p p+L_z z,\quad L_p^TL_p=I,\quad L_z^TL_z=I,\quad + L_p^TL_z=0,\quad L_pL_p^T+L_zL_z^T=I_f. \tag{FB-03} +\] + +이는 exact-arithmetic identity이며 stored binary64 Gram은 기존 gate로 검산한다. +Production full dense basis matrix는 요구하지 않는다. Projection `Lp^T y`, +lift `Lp x+Lz w` 및 `Lp^T K Lz` 등은 동일 sparse support의 source-ordered +product/sum이다. 한 full DOF가 두 p 및 한 z에 기여할 수 있으므로 direct index +scatter나 one-index reverse map으로 대체하지 않는다. + +Private column metadata에는 immutable canonical node/source identity, +`U`/`angular` channel, full support와 coefficient, fixed-plane/component-chart +구분을 둔다. z/constraint rows는 initial null-node canonical order다. +정확 저장 타입은 구현 owner가 결정한다. Plane column 번호를 full DOF 번호로 +간주하거나 `%6`로 channel을 판정하지 않는다. Public equation/source identity는 +기존 DofManager 계약이며 private ordering을 영속 결과에 노출하지 않는다. + +Proper `Q`에서 `n0'=s Q n0` (`s=±1`)이면 retained planes 사이 +`T2=Bp'^T Q Bp∈O(2)`, `p_rot'=T2 p_rot`, `z'=s z`다. +`Bp'=Q Bp` 자체는 필수 조건이 아니다. Axis/tie 선택이 달라도 이 전환은 +상수 선형이며 HHT recurrence와 exact arithmetic에서 commute한다. Floating +rounding·infinity norm·mode branching의 실제 `1e-10` 통과는 별도 검증이다. + +## 3. Graph, hidden rates와 서로 다른 regularity + +Current normalized analytic null의 lift를 `N(q)`로 둔다. 물리 inertia의 null +identity `N^T I=0`와 기존 direct scalar primitive + +\[ + \psi=N^Tg=N^TE,\quad C=\psi_q,\quad G=C L_z, +\] +\[ + G z_v=-C L_p v_p-\psi_t,\quad v=L_pv_p+L_z z_v, +\] +\[ + G z_a=-C L_p a_p-\psi_{qq}[v,v]-2\psi_{qt}v-\psi_{tt}, + \quad a=L_pa_p+L_z z_a \tag{FB-04} +\] + +를 사용한다. Position graph `psi(Lp p+Lz z,t)=0`은 coupled global solve다. +Gradient/Hessian/third·external time-mixed terms는 기존 RC-02, RC-13–15의 +analytic primitive를 그대로 사용하고 모든 injection을 FB-03으로 일반화한다. +Shared node external term은 한 번만 추가한다. Numerical FD는 production tangent가 아니다. + +검사는 다음처럼 분리한다. + +| Operator / 조건 | 의미 | +| --- | --- | +| `G=psi_q Lz` 및 기존 `W^-1 G W^-1` conditioning | 선택된 graph의 implicit derivative/rate solve 가능성 | +| `N(q)^T Lz`와 아래 normalized spanning matrix S | selector residual의 full-root equivalence와 정량적 횡단성 | +| `psi_q N(q)`의 N4 null-coordinate conditioning | 실제 moving null 방향의 물리 대수 regularity | +| `J=Lp+Lz z_p` rank, `J^T M J` positivity 및 기존 mass/N4 검사 | 축소 물리 range의 비퇴화 | + +여기서 `W_i=sqrt(k_i)`, `k_i=N_i^T Kdrill_metric N_i>0`는 원 N4 scale다. +G 검사와 moving-null 검사는 기존 `2^-32` 정책·finite-first·실제 operator로 +수행하며 하나의 PASS를 다른 operator의 PASS로 승계하지 않는다. +Node-local `N^T Lz`는 fixed-plane node의 `n(q)^T n0`, component node의 원 +nonzero pivot component다. Exact0/nonfinite는 실패다. 작은 비영 내적의 정량적 +검사는 `D_f`를 N1의 free-row scale로 둔 다음 무차원 square matrix에서 수행한다. + +\[ + S=[D_f^{-1}L_{p,f}D_p,\ D_f^{-1}N_f(q)],\qquad + rcond_\infty(S)=1/(\|S\|_\infty\|S^{-1}\|_\infty)\ge2^{-32}. \tag{FB-04a} +\] + +S의 all-free angular block은 `[t1,t2,n(q)]`이고 부분 null block은 +`[retained component axes,n_free(q)]`, null이 없는 block은 identity다. +병진 열은 ell로 정규화되어 identity다. Canonical node/block 순서의 inverse-action +solves로 S와 inverse의 최대 row-sum을 계산하고 global dense inverse는 만들지 않는다. +1×1 `N^T Lz`의 rcond는 비영일 때1이므로 작은 횡단각을 검출하지 못한다. +S 대신 `S^TS`에 동일 threshold를 대입하면 conditioning 의미가 바뀌므로 하지 않는다. +이 검사는 기존 `2^-32` 기준을 새 fixed-plane complement의 실제 normalized operator에 +적용한다. 임의 cosine cutoff를 추가하지 않는다. G/moving-null/range 검사는 별도다. +Principal `||phi||