chore: remove retired workflow and historical material

This commit is contained in:
KOKO\Mimi
2026-10-17 22:39:47 +09:00
parent 4bd19f5bf0
commit 774b80099c
768 changed files with 0 additions and 54164 deletions
-104
View File
@@ -1,104 +0,0 @@
# Hex8 기능 결정 기록
Feature ID: `hex8-structural-analysis`. 상태: 사용자 승인된 구현 계약.
기준: [프로젝트 지침](../../AGENTS.md), [공통 PRD](../PRD.md), [공통 ADR](../ADR.md).
상세 행동은 [PRD](PRD.md), 수식은 [formulation](formulation.md)을 따른다.
아래 결정은 ready 인터뷰 및 최종 승인 뒤 go 실행 요청으로 확정했다. 구현/검증 통과를 의미하지 않는다.
## HEX8-ADR-001 — Full-integration TL–StVK
**선택:** 8절점 일반 등매개 육면체, 3개 병진 DOF,2×2×2 전체 Gauss 적분,
Total Lagrangian–St. Venant–Kirchhoff의 energy/internal force/material+geometric tangent.
**이유와 영향:** 큰 회전·작은 elastic strain을 대상으로 같은 energy의 미분 일관성을 검증한다.
이 최초 선택의 pointwise 체적 항은 이후 HEX8-ADR-009로 대체됐다. Hourglass/hybrid/incompatible mode는 범위 밖이다. 굽힘/체적 잠김과
거의 비압축성 conditioning 한계를 공개한다. Abaqus C3D8 내부 처리와 동일하다고 주장하지 않는다.
## 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이 없다.
## HEX8-ADR-003 — End-to-end Solid-only 절차
**선택:** Linear/nonlinear static, 원형상 unloaded frequency, linear/nonlinear HHT와 공식 HDF5를 연결한다.
Nodal force와 static 영/비영 prescribed displacement만 지원하며 mixed Beam/Shell/Solid·pressure/
body force·prestressed modes는 제외한다. Dynamic은 initial q/v0, fixed zero BC·fixed step이다.
**영향:** Model/DOF/state/writer에 Solid의3성분 분기가 필요하며 dummy6성분 결과로 대체하지 않는다.
## HEX8-ADR-004 — Reference ramp와 integration-point stress
**선택:** 제공된 dynamic 원본에 필요한 TABULAR/STEP TIME/RELATIVE piecewise-linear CLOAD
amplitude를 지원한다. 사용자 최종 답변 `1A, 2B 적분점 응력 결과로 수정했습니다.`에 따라
수정된 static S의8점6성분을 필수 비교한다. Static/BC amplitude·비영 초기 상태는 추가하지 않는다.
**영향:** 곡선별 source load block을 보존하고 endpoint/initial force를 평가한다. Point key는
element/IntPt/component이며 elemental-nodal stress·평균·외삽으로 바꾸지 않는다.
## HEX8-ADR-005 — 독립 검증과 필수 외부 비교
**선택:** 분석/불변량·독립 numerical/physics 검토·실제 전체 Debug 회귀 및 승인 원본 비교를 결합한다.
**영향:** 공통 row5%/RMS1%를 유지한다. MITC4 eigen RMS5% scoped exception은 적용하지 않는다.
원본 frequency Value 부재는 필수 비교 미실행이며 기능 검증 완료 대기다. 제공된4개 응답 case와
독립 eigen 검증은 진행한다. 기존 HHT baseline FAIL/SKIP을 신규 문제와 구분하며 전체 green을 주장하지 않는다.
## HEX8-ADR-006 — 기존 프로젝트와 소유권 유지
**선택:** Absent local marker에도 사용자 선택 A에 따라 기존 AGENTS/docs 맥락을 유지한다.
**영향:** Foundation과 공통 요구/결정을 재작성하지 않는다. Feature 문서는 자체 계약과 필요한
handoff/evidence만 소유한다. Shared CMake/factory와 prepared/HDF5 연결에 단일 writer를 둔다.
Failed candidate/출력 실패에서 accepted history와 기존 final HDF5를 보존한다.
## HEX8-ADR-007 — Inactive zero rotational BC의 한정된 호환 예외
**승인:** 2026-10-09 사용자는 필수 원본의 zero DOF4–6 경계와 strict 거부 계약 충돌에 대해
A(영 회전 경계만 경고/no-op으로 수용)를 선택했다. 독립 검토 HEX8-NR-001의 해결이다.
**선택:** Solid-only supported displacement BC의 exact-zero DOF4–6(생략0 포함)만 source/location
warning/no-op으로 수용한다. Mixed1–6 range의1–3은 적용하고4–6만 경고한다.
**영향:** 실제 DOF·constraint·state/output은3성분이다. 비영 회전 BC·모든 회전 CLOAD,
DOF범위 밖이나 의미 있는 미지원 BC 옵션은 계속 거부한다. 원본을 수정·preprocess하지 않는다.
Parser에서 경고·translational 적용·회전 equation 부재·거부 경계를 행동 테스트로 확인한다.
## HEX8-ADR-008 — High+low 내부 물리 상태와 Float64 observable
**승인:** 2026-10-09 사용자는 제한된 단일·두 좌표 및 보상 가산 관찰 실패 이후
A([내부 정밀도 변경안](precision-proposal.md))를 선택했다.
**선택:** Solid HHT 내부 상태·predictor·힘·rates·수지·gate에 normalized high+low를
일관되게 사용하고 accepted history/rollback도 전체 상태를 보존한다. 기존 Float64
backend와 HDF5 field/shape/dtype은 유지하되 공식 값은 전체 물리량의 반올림 observable이다.
**영향:** 기존 Si/exact-zero·strict gate·HHT 계수·기준 M·고정 h/schedule·100회와 외부
tolerance는 유지한다. Kernel/geometry에 low를 전달하지 않는 update carry와 구분한다.
작은 독립 산술/Hex8·시간수렴·상태 보존 검증과 긍정적 실제 실행 이후 필수 원본101개
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를
사용한다. Reference 8점 가중치와 실제 infinitesimal/Green strain의 deviatoric 항을 유지하고,
체적 항을 `kappa*V*theta_bar^2/2`, `theta_bar=sum(w*trace(strain))/V`로 정의한다.
내력과 Kmat/Kgeo/Kt는 이 energy의 일관 미분이며 체적 tangent는 서로 다른 Gauss 점의
coupling을 포함한다. 평균 determinant/Fbar/로그변형률 재료식은 채택하지 않는다.
**영향:** ADR-001의 pointwise 체적 energy/구성식과 그 강성을 대체한다. 실제 strain을
출력하고 응력은 요소 평균에 의존하는 law로 복구한다. Reference consistent M·HHT 식·
고정 schedule·100회·strict gate·전체 pair 상태·반올림 observable·공식 field/schema와
원본·수치 기준은 유지한다. 새 solver 선택 옵션이나 원본 diagnostic 전환은 추가하지 않는다.
**검증:** 한 선형 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를 따른다.
@@ -1,53 +0,0 @@
# Hex8 구조해석 작업 지침
Feature ID: `hex8-structural-analysis`. 사용자 승인: 2026-10-08 ready 문서 승인 및 go 실행 요청.
개인 연구용 FESA에 reference8점 deviatoric·체적 평균 energy Hex8의 선형/기하비선형 강성·reference row-sum lumped 질량과
static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완료를 구분한다.
상위 기준은 [프로젝트 지침](../../AGENTS.md), [공통 PRD](../PRD.md),
[공통 ADR](../ADR.md), [기능 문서 관리](../FEATURE_DOCUMENTATION.md)다.
현재 요구와 유일한 checklist는 [PRD](PRD.md), 선택 이력은 [ADR](ADR.md)에 있다.
| 문서 | 책임·용도 |
| --- | --- |
| [README](README.md) | 개발 목적·CLI 사용·다른 기능의 참조점·적용 한계 |
| [formulation](formulation.md) | 3D local 계산, energy/force/tangent, mass·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 검토의 결과 |
| [lessons](lessons.md) | 정밀도 손실·수렴 실패와 수정의 근거 및 재사용할 주의점 |
| [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를 소유한다.
Static/eigen/dynamic owner는 별도 Solid state와 executor를 소유한다. 중앙 prepared/result/CLI/
HDF5 dispatch는 한 owner가 연결하고, 공용 CMake/factory 등록은 메인이 병합 후 처리한다.
다른 owner의 변경을 revert하거나 중앙 파일에 병행 writer를 추가하지 않는다.
이 기능은 Solid-only·3N이다. Shell의6N/drilling/null/회전 state나 nodal mass reduction을
사용하지 않는다. 요소 행렬은24×24, output은 N×3와 E×8×6이다. Geometry는 cell 전체의
positive Jacobian을 보수적으로 인증하고 uncertain geometry/trial을 명시적으로 실패시킨다.
절점 순서와 IntPt 순서를 구분하며 tensor shear와 engineering shear를 혼용하지 않는다.
원본 `reference/hexa/`는 read-only다. 외부 tolerance를 완화하거나 reference를 생성·보정하지
않는다. Frequency 원본 modal Value가 없는 동안 구현은 계속할 수 있으나 전체 기능 검증은
완료하지 않는다. 동적 reference는101 frame 전체 U, 정적은 U/constrained RF/Gauss Cauchy S가 필수다.
새 정식화와 구현 수치 변경은 독립 numerical review를, 실제 결과는 필요한 독립 physics
평가를 거친다. 일반 승인 작업마다 승인 gate를 추가하지 않는다. Physics·영속 schema·acceptance
변경 또는 해결되지 않은 필수 reference 충돌만 메인이 사용자에게 근거와 영향을 전달한다.
Dev 통합·push/release는 별도 명시된 사용자 결정이다.
2026-10-13 현재 인계는 [최종 인계](final-handoff.md)를 따른다. 사용자는 장시간
전체 검증을 수행하지 않도록 요청했다. 이번 관련91개·Python96개 및 저장된
원본5개 결과 재대조를 전체 통과로 확대하지 않는다. Hex8 구현·검토·인계와
최적화 이후의 최신 전체 통합 완료 판정은 구분한다.
-532
View File
@@ -1,532 +0,0 @@
# Hex8 구조해석 제품 요구사항
Feature ID: `hex8-structural-analysis`. 작성일: 2026-10-08. 상태: 구현·필수 원본5개 비교·검토·인계 완료; 사용자 요청으로 장시간 전체 검증을 유예하여 최종 통합 완료 판정 보류.
기준 저장소: `dev`, `2382d3af7ef335bef216d963540f2e9bd2befd68`.
## 목적과 선택 이유
개인 연구용 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)를 따른다. 2026-10-11 승인 [ADR-010](ADR.md)에 따라 full reference element M의 행 합 대각 질량을
고유치와 동해석 모두에 사용한다. 허용값이나 안정화로 계산 결과를 맞추지 않는다.
일반 등매개 육면체를 지원하며 체적 projection의 안정성·conditioning 및 남은 굽힘 잠김 한계를 검증·공개한다.
초기 합의의 일정 동하중에 더해, 제공된 reference의 ramp를 처리하도록 구간별 선형
집중력 amplitude를 포함한다. 지정 변위의 시간 변화나 비영 초기 변위·속도까지 확대하지 않는다.
상위 기준: [공통 요구](../PRD.md), [구조](../ARCHITECTURE.md),
[외부 계약](../contracts.md), [수치 정책](../TOLERANCE.md),
[기능 기록](../FEATURE_DOCUMENTATION.md). 기존 상세 계약을 구현 편의로 덮어쓰지 않는다.
지역 지침과 문서 목록은 [FEATURED_AGENTS](FEATURED_AGENTS.md), 결정은 [ADR](ADR.md),
상세 유도는 [formulation](formulation.md), 입력/내부 API는 [io](io.md), 수치 controls는
[numeric-controls](numeric-controls.md), 원본 mapping은 [reference-model](reference-model.md)을 따른다.
## 요구사항과 계산 계약
### FEM-REQ-HEX8-001 — 지원 해석과 모델
육면체 단독 모델에서 선형 정적, 기하비선형 정적, 원형상·무응력 선형 frequency,
선형 및 기하비선형 HHT 동해석을 지원한다. 한 입력에 단일 step·단일 procedure이며
기존 Part/identity Instance·target/set subset을 재사용한다. 혼합 Beam/Shell/Solid 모델은 거부한다.
서로 다른 유효한 영역에 재료를 배정할 수 있지만 한 요소 내부의 재료는 균질하다.
### FEM-REQ-HEX8-002 — 요소·형상·순서
Source `C3D8`을 FESA Hex8로 연결하고 source 표기·instance·element/node label을 보존한다.
`C3D8R`, `C3D8I`, `C3D8H`, 20절점 요소를 alias로 수용하지 않는다. 요소는 서로 다른
8개 절점과 병진 `[UX,UY,UZ]`를 가지며 local 행렬은 node-major 24×24다.
자연 좌표 절점 순서는 다음과 같다.
| 절점 | ξ | η | ζ |
| --- | ---: | ---: | ---: |
| 1 | -1 | -1 | -1 |
| 2 | +1 | -1 | -1 |
| 3 | +1 | +1 | -1 |
| 4 | -1 | +1 | -1 |
| 5 | -1 | -1 | +1 |
| 6 | +1 | -1 | +1 |
| 7 | +1 | +1 | +1 |
| 8 | -1 | +1 | +1 |
\(N_a=(1+\xi_a\xi)(1+\eta_a\eta)(1+\zeta_a\zeta)/8\),
\(X=\sum N_aX_a\), \(u=\sum N_au_a\). J0의 column은 자연 좌표에 대한 X 미분이다.
\(G_a=\nabla_XN_a=J_0^{-T}\nabla_\xi N_a\)를 사용한다.
뒤틀린 면·기울어진 모서리를 허용한다. 비유한·중복/퇴화 절점, 반전·접힌 형상은 거부한다.
유효성은 자연 cell의 양의 Jacobian을 확인하는 보수적 검증으로 정의하고, 적분점만 양수인
접힌 cell을 정상으로 선언하지 않는다. 양성을 판정하지 못한 형상은 명시적 진단으로 거부한다.
현재 형상의 반전도 trial 실패다. `abs(det J)`·절점 재배열·epsilon 보정은 금지한다.
### FEM-REQ-HEX8-003 — 재료와 단위
상수 등방성 탄성 \(E>0,-1<\nu<0.5\)와 기준 밀도 \(\rho_0>0\)를 사용한다.
모든 값과 파생 shear/bulk 실행 계수는 finite여야 한다. 밀도는 고유치·동해석에서 필수이며 정적
입력의 양의 density는 보존하되 강성에 사용하지 않는다. 입력 일관 단위를 유지한다.
\(\mu=E/[2(1+\nu)]\), \(\kappa=E/[3(1-2\nu)]\)다. 두 실행 계수는 finite·positive여야 한다.
거의 비압축성인 입력을 다른 재료식으로 바꾸지 않으며 잠김과 conditioning을 구분해 보고한다.
### FEM-REQ-HEX8-004 — 적분 규칙
강성·내력·접선·질량·에너지에 동일한 2×2×2 Gauss 규칙을 사용한다.
각 축은 ±1/√3, weight=1이며 volume weight는 det J0다. 출력 point ID는
`1:---, 2:+--, 3:-+-, 4:++-, 5:--+, 6:+-+, 7:-++, 8:+++` 순서다.
절점 순서와 적분점 순서를 혼동하지 않는다. 모든 평균과 deviatoric 항은 이8점의 reference
체적 가중치로 계산한다. 체적 항은 요소 평균 trace energy이며 pointwise8점 체적 항이나
중심점 단일 적분으로 바꾸지 않는다. One-point reduced element·hourglass 항은 없다.
일반 뒤틀린 요소에서 8점 질량이나 비선형 적분이 연속체 적분과 항상 exact하다고 주장하지 않는다.
높은 차수 적분 oracle는 정확도·한계의 검사이며 production 규칙의 자동 변경이 아니다.
### FEM-REQ-HEX8-005 — 선형 강성
미소변형률 \(\epsilon_g=\operatorname{sym}\nabla_Xu\), \(V=\sum_gw_g\),
\(\bar\theta=\sum_gw_g\operatorname{tr}\epsilon_g/V\),
\(\sigma_g=2\mu\operatorname{dev}\epsilon_g+\kappa\bar\theta I\)다.
공학 전단 벡터 순서는 `[ε11,ε22,ε33,2ε12,2ε13,2ε23]`, 응력은
`[S11,S22,S33,S12,S13,S23]`다. 선형 energy는
\(U=\sum_gw_g\mu\operatorname{dev}\epsilon_g:\operatorname{dev}\epsilon_g+\kappa V\bar\theta^2/2\)다.
\(K_0=\partial^2U/\partial u^2\), \(f_{int}=K_0u\)이며 weighted divergence vector의
외적 \(\kappa bb^T/V\)로 서로 다른 point의 체적 coupling을 포함한다.
대칭성·6개 강체 영모드·상수 변형률 patch·단위와 scale을 독립 검증한다.
### FEM-REQ-HEX8-006 — 비선형 내력과 접선
기준 형상에서 \(F=I+\sum_a u_a\otimes G_a\),
\(E_{Gg}=(F_g^TF_g-I)/2\), \(\bar\theta=\sum_gw_g\operatorname{tr}E_{Gg}/V\)와
\(U=\sum_gw_g\mu\operatorname{dev}E_{Gg}:\operatorname{dev}E_{Gg}+\kappa V\bar\theta^2/2\),
\(S_g=2\mu\operatorname{dev}E_{Gg}+\kappa\bar\theta I\), \(P_g=F_gS_g\)다.
\(f_{ai}=\sum_g P_{iJ}G_{aJ}\det J_{0g}\)와 같은 에너지의 일관 미분
\(K_t=K_{mat}+K_{geo}\)를 반환한다.
\[
Z_g^{ai}=\operatorname{sym}(F_g^T(e_i\otimes G_{ag})),\quad
b_{ai}=\sum_gw_g(F_gG_{ag})_i,
\]
\[
(K_{mat})_{ai,bk}=2\mu\sum_gw_g\operatorname{dev}Z_g^{ai}:\operatorname{dev}Z_g^{bk}
+\kappa b_{ai}b_{bk}/V,\quad
(K_{geo})_{ai,bk}=\delta_{ik}\sum_gw_gG_{ag}^TS_gG_{bg}.
\]
F64와 paired 경로 모두 실제 relative kinematics의 같은 derivative인 Ghat를 사용한다.
평균 trace의 미분을 유지하고 point-local 기존 C로 체적 tangent를 대체하지 않는다. Kgeo만으로 전체 비선형 강성을
대체하지 않는다. 내부 API는 두 항과 합, 내력·에너지·복구량을 구별한다. 같은 trial에서
계산하며 유한차분 접선을 production 계산으로 사용하지 않는다. 강체 유한회전의 zero
strain/energy, 에너지 gradient·내력 tangent, 좌표 공변성, 선형극한을 검사한다.
### FEM-REQ-HEX8-007 — Reference row-sum lumped 질량
\((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 관성은 없다.
고유치와 동해석은 같은 전역 lumped M을 사용한다. 행 합은 BC restriction 전에 계산하며
M_C의 free block만 행 합하거나 warped 요소를 rho*V/8로 대체하지 않는다.
대칭 양정성·각 병진 방향 총질량·좌표 회전·독립 적분을 검증한다. 전역 행렬은 sparse로 조립한다.
### FEM-REQ-HEX8-008 — 경계와 집중력
실제 `*BOUNDARY`와 `*CLOAD` 성분은 DOF1–3이다. Solid-only 입력 호환 예외로
지원 displacement `*BOUNDARY`의 DOF4–6 exact-zero(생략된0 포함)만 source/location을
남기는 명시적 warning/no-op으로 수용한다. 범위1–6은1–3을 적용하고4–6만 경고한다.
회전 equation·constraint·state는 만들지 않는다. 비영 회전 BC, DOF4–6 CLOAD(값0 포함),
DOF1–6 밖의 경계와 의미 있는 미지원 BC 옵션은 계속 거부한다.
정적은 영/비영 지정 변위를 지원하고, 선형은 \(K_{ff}u_f=F_f-K_{fc}u_c\)다.
비선형 정적에서는 지정 값과 외력을 같은 load factor로 증가시켜 이전 accepted 상태에서
Newton을 수행한다. 동해석은 고정 exact-zero 경계만 지원한다. 동일 resolved node/DOF의
집중력은 source 순서로 합산한다. 모든 자유도가 constrained인 유효한 모델은 empty free
system으로 처리한다. 미구속 자유 강체의 정적 특이성은 질량·임의 고정점으로 보정하지 않는다.
### FEM-REQ-HEX8-009 — 동하중 amplitude
육면체 dynamic에서 모델-level `*AMPLITUDE, NAME=...`의 TABULAR, STEP TIME,
VALUE=RELATIVE만 지원한다. 각 선택자는 생략 시 이 값이며 명시된 동일 값도 허용한다.
유일한 이름과 한 개 이상 finite `(t,A)` pair, `t>=0`·strictly increasing 시간을 요구한다.
한 row의 여러 pair와 여러 data row를 허용한다. Knot은 원 값, 내부는 구간별 선형 보간,
범위 밖은 첫/마지막 값 유지다. Unresolved/duplicate 이름, 같은 시간, 역순·홀수 항목,
nonfinite, 다른 정의·시간 기준·값 종류·smoothing 옵션은 명시적 실패다.
`*CLOAD, AMPLITUDE=name`의 \(F(t)=A(t)F_{base}\)를 source 순서로 합산한다.
각 load block의 curve를 보존하며 서로 다른 curve를 미리 하나의 base force로 합치지 않는다.
Amplitude 없는 CLOAD는 `0+`부터 일정 하중이다. 표의 첫 시간/값을 강제로 0으로 만들지 않는다.
현재 reference Amp-1은 `(0,0),(0.1,1),(10,1)`이다. 지정 변위 amplitude와 static amplitude,
TOTAL TIME·SMOOTH STEP·주기 하중·물리적 damping은 이번 범위가 아니다.
### FEM-REQ-HEX8-010 — 공개 입력과 CLI
기존 lexical/source identity를 재사용하고 `*SOLID SECTION, ELSET=..., MATERIAL=...`와
생략 또는 blank data row를 허용한다. Thickness/plane stress/axisymmetric 의미를 추가하지 않는다.
`*STATIC`과 `*STATIC, DIRECT`의 고정 증분 subset을 지원한다. DIRECT의 `h,T`가 양수이며
`N*h==T`, `N<=INC`를 만족해야 한다. 일반 STATIC의 기존 load-factor subset도 유지한다.
`*FREQUENCY`의 mode 수가 권위이며 Lanczos/SIM source 옵션은 실제 MKL FEAST와 구별한다.
`*DYNAMIC, DIRECT`는 `NLGEOM=NO` 또는 `YES`, 고정 h/T와 INC를 지원한다.
Static/frequency/dynamic 각각의 기존 무해한 출력 요청 subset 및 제공 원본의 PRESELECT 요청을
명시적으로 검증한다. Output no-op이 필수 결과의 삭제·선택 기능이 되지 않는다.
기존 CLI 입력·lexical sibling 결과/로그 경로·exit category를 유지한다.
### FEM-REQ-HEX8-011 — 소유권과 전역 조립
Domain은 의미·재료/section·topology·amplitude를, DofManager는 3N full/free mapping과
scatter/pattern을, element는 local 계산을, analysis는 state/trial/commit을 소유한다.
공유 sparse 직접 쓰기 없이 source 순서의 결정적 누적을 유지한다. 6N Shell layout이나
회전 영공간에 Hex8을 끼워 넣지 않는다. 사용되지 않는 절점·잘못된 scatter는 fail-closed다.
내부 C++ API의 행동 계약은 다음과 같다. 구체적인 class/method 이름은 구현 계획의 영역이다.
| 연산 | 입력·출력과 불변량 |
| --- | --- |
| 요소 생성 | 검증된 source topology·기준 좌표·재료로 immutable 요소 생성; 실패는 기존 Result/Status |
| 선형 평가 | K0[24,24]·M[24,24], 주어진 u[24]의 f[24]·W·8점 복구량 |
| 비선형 trial 평가 | u[24]에서 f[24], Kmat/Kgeo/Kt[24,24], W, 8점 Cauchy/Green tensor; 호출이 accepted state를 변경하지 않음 |
| 조립·절차 실행 | Domain과 3N DOF mapping으로 sparse K/M 및 검증된 procedure별 결과; source 순서 유지 |
| 기록 | 완결된 accepted 결과만 받는 Solid writer; 검증 실패 시 기존 final 파일 보존 |
길이·성분 불일치와 nonfinite trial을 실패로 반환하며 vendor handle/type은 공개 API에 노출하지 않는다.
### FEM-REQ-HEX8-012 — 선형 정적
Kff solve 후 prescribed 값을 정확히 복구하고 full residual `K0u-F`를 계산한다.
Constrained 성분은 반력, free 성분은 평형 잔차이며 서로 별도 dataset으로 보존한다.
완료 load factor의 결과를 frame0으로 저장한다. 빈 free solve와 solver 실패를 구별한다.
### FEM-REQ-HEX8-013 — 비선형 정적
Accepted 증분별 q·내외력·응력·에너지와 convergence evidence를 보존한다. Newton은
\(f_{int}(u)-F\)의 free residual과 일관 tangent를 사용한다. 불안정 tangent를 SPD라고
가정하지 않는다. Recovery까지 검증한 candidate만 accept하며 실패 증분은 공개하지 않는다.
현재 일반 Newton controls를 재사용할 때 물리 3성분·force/length 단위에 맞는 적용을 검토한다.
회전·모멘트의 dummy channel은 만들지 않는다. 초기 tuning default는 기존 정적 기준의
force residual/translation correction 상대 `1e-2`, scale0 absolute `1e-3`의 해당 입력
force/length 단위, 증분당 최대100 iteration이다. 분모·분자·branch·단위·판정을 남긴다.
내부 solver tuning 조정은 독립 검토와 재검증을 기록하며 외부 acceptance를 바꾸지 않는다.
### FEM-REQ-HEX8-014 — 일반화 고유치
실제 동차 경계 적용 후 \(K_{ff}\phi=\omega^2M_{ff}\phi\)의 최저 N 모드를 구한다.
반복 고유치를 제거하지 않고 실제 3N 공간으로 복구해 mass-normalize한다. 해석 출력에는
lambda, frequency, mode vector와 residual/Gram evidence를 구별한다. 음수값을 abs/clamp하지 않는다.
강체 모드·cluster 경계·모드 누락·empty free/과도한 N을 검증한다.
\(\|K\phi-\lambda M\phi\|/[(\|K\|+|\lambda|\|M\|)\|\phi\|]\),
\(|\phi^TM\phi-1|\)와 mass Gram 오차는 `1e-10` 이하를 요구하며 zero denominator는
exact-zero 분기로 처리한다. 모든 backend 반환 pair를 검증한 뒤 공개 N을 선택한다.
Shell 전용 nodal whitening을 일관 M에 적용하지 않는다. 실제 generalized-SPD sparse
FEAST 또는 일관 문제를 정확히 보존하는 변환을 사용한다. Sparse pencil을 바꿔 수렴시키지 않는다.
### FEM-REQ-HEX8-015 — HHT 동해석
초기 q/v=0, constrained q/v/a/A=0이다. \(M_{ff}a_{0f}=F_f(0+)-f_{int,f}(0)\),
\(A_0=a_0\)로 초기화한다. Amplitude가 0이면 그 초기 힘을 그대로 사용한다.
공개 계수는 기존 HHT의 `alpha=-0.05`, `beta=0.275625`, `gamma=0.55`다.
Predictor/Newmark 갱신은 auxiliary A를 사용하고
\(A_{n+1}=(1+\alpha)a_{n+1}-\alpha a_n\)로 physical a와 구별한다.
\[
R=M A_{n+1}+(1+\alpha)(f_{n+1}-F(t_{n+1}))-\alpha(f_n-F(t_n)),
\quad K_{eff}=M/(\beta h^2)+(1+\alpha)K_t.
\]
이 weighted residual은 이전 physical endpoint 평형을 포함하며, 같은 관계로 환산한
endpoint 잔차를 쓰는 것도 동등성 검증을 전제로 허용한다. 서로 다른 표현의 tangent와
reaction을 혼용하지 않는다. Amplitude는 실제 각 endpoint에서 평가하고 한 step의 힘을
고정해두거나 잘못된 시간에서 한 번만 평가하지 않는다. 질량은 상수이므로 Shell의
회전 chart·moving-null·convective 관성은 이 절차에 없다. 선형은 K0, 비선형은 Kt를 사용한다.
물리 반력은 constrained \(Ma+f_{int}-F(t)\), free endpoint residual은 별도 evidence다.
초기부터 마지막까지 `n=0..N`, `time=double(n)*h`, exact schedule `N*h==T`를 유지한다.
마지막 증분 축소·adaptive time·restart는 지원하지 않는다.
동적 초기 tuning default는 기존 HHT의 normalized residual/correction `1e-10`,
Newmark update 일치 `1e-12`, 증분당 최대100 iteration이다. Force 잔차의 scale은
같은 endpoint의 uncancelled inertia/internal/external force로 만들며 scale0은 exact-zero다.
Correction은 기준 형상의 양의 길이 L로 u를, L/h와 L/h²로 v와 physical/auxiliary a를
정규화해 각각 확인한다. 회전 channel을 복제하거나 잔차를 보정한 뒤 accept하지 않는다.
### FEM-REQ-HEX8-016 — 응력·변형률 복구
8개 적분점에서 선형 global Cauchy stress·미소변형률, 비선형
\(\sigma=FSF^T/\det F\)와 기준 global Green–Lagrange strain을 복구한다.
Tensor strain 성분은 `[11,22,33,12,13,23]`의 실제 shear이며 B 계산용 engineering shear와
구별한다. 적분점 평균·절점 외삽·nodal smoothing을 하지 않는다. Cauchy stress와 PK2를
같은 이름으로 저장하지 않는다. 기본 공식 응력은 Cauchy다. Frequency의
mode vector를 물리 응답 변위/응력으로 복구하지 않는다.
### FEM-REQ-HEX8-017 — HDF5 계약
새 형식은 `/metadata`의 `feature_id=hex8-structural-analysis`, `schema_version=1`과
`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=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],
free0/constrained1이다. 다음 mandatory compound field 순서와 dtype을 사용한다.
U64/U8/F64는 각각 unsigned 64/8-bit integer와 Float64 little-endian이며 문자열은 UTF-8다.
| model 경로 | field 순서·dtype |
| --- | --- |
| `/model/nodes` | `internal_node_id:U64, instance_name:string, source_label:string, coordinates:F64[3]` |
| `/model/elements` | `internal_element_id:U64, instance_name:string, source_label:string, source_element_type:string, internal_formulation:string, node_internal_ids:U64[8], solid_section_internal_id:U64, material_internal_id:U64` |
| `/model/solid/materials` | `internal_material_id:U64, name:string, youngs_modulus:F64, poisson_ratio:F64, density_present:U8, density:F64` |
| `/model/solid/sections` | `internal_section_id:U64, source_file:string, source_line:U64, source_elset:string, material_internal_id:U64` |
| `/model/solid_integration_points` | `internal_element_id:U64, point_id:U8, natural_coordinates:F64[3], reference_coordinates:F64[3]` |
Internal ID는 각 inventory의 zero-based index이고 point ID는1–8이다. 요소는 Domain 선언 순서,
integration-point row는 element-major/point-major다. `density_present`는0/1이고 부재 시
`density=0`은 저장 placeholder이며 해석 밀도로 사용하지 않는다. 필수 밀도 절차에서는 부재를
writer 이전에 거부한다. 원본 positive density가 있는 정적 모델은 이를 그대로 기록한다.
| 경로 또는 frame 상대 경로 | shape / 의미 |
| --- | --- |
| `/steps/Step-1/accepted_frames` | 아래 정의한 비선형 정적/동적 compound table |
| `/steps/Step-1/frames/<n>/nodal/displacement` | [N,3], U1/U2/U3 |
| `nodal/reaction` / `nodal/residual` | 각각 [N,3], 반력은 free exact0, residual은 full endpoint/static residual |
| `solid/stress` / `solid/strain` | [E,8,6], point 순서·global frame·Cauchy 또는 Green/infinitesimal 의미 attribute |
| `global/strain_energy` | scalar; accepted physical elastic energy |
| 동적 `nodal/velocity`, `acceleration`, `algorithmic_acceleration` | 각각 [N,3], V·physical a·auxiliary A |
| 동적 `global/kinetic_energy`, `external_work`, `energy_balance_error` | scalar; 서로 다른 양, 계산 정의 attribute |
| 동적 `global/linear_momentum`, `angular_momentum` | [3], global O=(0,0,0) 기준 |
| `/steps/Step-1/eigen/modes`, `frequencies`, `vectors` | 아래 정의한 mode records, frequency subset, F64[Nmode,Nnode,3] mass-normalized vector |
위 `Step-1`은 기존 storage step key이고 source step 이름은 metadata에 별도 보존한다.
모든 물리 배열·scalar는 F64다. Accepted table은 아래 field를 정확히 이 순서로 가진다.
- 비선형 정적: `frame_index:U64, increment_index:U64, load_factor:F64, iteration_count:U64, is_factor_one:U8`.
- 동적: `frame_index:U64, increment_index:U64, time:F64, iteration_count:U64, is_initial:U8`.
Flag는0/1이다. Static linear에는 accepted table이 없다. 비선형 정적 frame0은 첫 accepted
증분이고 baseline factor0은 공개 frame이 아니다. Dynamic은 frame=increment=n,
initial의 iteration_count=0이며 이후 값은 실제 accepted Newton/선형 solve 횟수다.
Final-static flag는 마지막 factor1 frame에만1이다.
Eigen `modes`는 `mode_id:U64, eigenvalue:F64, classification:U8, cluster_id:U64`,
`frequencies`는 `mode_id:U64, frequency:F64`다. Mode/cluster ID는1부터 증가하며 mode는
lambda 오름차순이다. Classification 집합은0=rigid-near-zero, 1=positive다. 검증된 near-zero
음수 lambda도 원 값으로 남기고 frequency row를 만들지 않으며 유의한 음수는 solver failure다.
Nonnegative lambda에만 `frequency=sqrt(lambda)/(2*pi)`를 기록한다. 초기 tuning default는
`lambda_scale=max_i(abs(Kff_ii)/Mff_ii)`에서 `abs(lambda/lambda_scale)<=1e-9`를 near-zero,
인접 normalized gap `>1e-8`을 새 cluster로 분류한다. 양의 M diagonal과 finite positive
lambda_scale을 확인한다. 이 scale은 FEAST interval의 스펙트럼 상한으로 주장하지 않는다.
기능 numeric-controls에 scale·설정·독립 검증을 기록하고 저장 lambda를 보정하지 않는다.
`/steps/Step-1/eigen/verification/pairs`는 backend가 반환한 모든 검증 pair의 table이며
`sorted_rank:U64, solver_column:U64, eigenvalue:F64, modal_mass:F64, rayleigh_quotient:F64, eta_r:F64, eta_norm:F64, eta_energy:F64`다.
Backend column은0-based, rank는1-based다. 같은 verification group의 `eta_gram`,
`max_eta_orth`는 F64 scalar다. Backend 고유 trace는 기존 공개 의미로 추가 기록할 수 있으나
필수 original K/M 검증량을 다른 operator의 잔차로 대체하지 않는다.
Static frame0은 완료 결과, nonlinear static frame은 accepted 증분, dynamic frame0은 initial이다.
Frequency에는 static/dynamic frame dataset을 요구하지 않는다. 각 결과에 component_names,
unit dimensions, coordinate/location, step/frame/time 또는 load_factor 의미를 명시한다.
Self-check는 위 dtype/field 순서·shape·identity·flag·finite·frame schedule와 accepted 값의
readback 일치를 검증한다. 기능 I/O 문서는 이 계약을 상세화하며 다른 field 집합으로 바꾸지 않는다.
기존 Beam/Shell/Thermal 파일의 required dataset이나 schema를 바꾸지 않는다.
Full/element matrix dump는 공식 결과에 포함하지 않는다.
### FEM-REQ-HEX8-018 — 물리 수지와 에너지
정적은 힘·모멘트 평형, 동적은 운동량 변화율과 applied/support 힘·모멘트를 검사한다.
Consistent M으로 \(T=v^TMv/2\), \(U=\sum W_g\det J_{0g}\)를 계산한다.
외력 일은 endpoint force와 displacement increment의 trapezoid 누적이며 초기0,
`energy_balance_error=T+U-T0-U0-Wext`다. 현재 BC는 동적 exact0여서 support work=0이다.
HHT의 알고리즘 소산과 quadrature에 따른 work 오차를 설명하며 각 frame exact conservation을
강제하지 않는다. Alpha0 내부 검사에서는 선형 무하중 보존을 독립 확인한다.
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 — 실패와 진단
미지원 physics/옵션, geometry/trial 반전, 비유한 값, singular/invalid matrix, 수렴 실패,
backend resource 실패를 source/entity와 함께 명시적으로 보고한다. Invalid model과
solver failure, output failure를 기존 category로 구분한다. 실패 candidate는 마지막
accepted state/history와 기존 final HDF5를 변경하지 않는다. Write·readback·close·atomic
replace 실패를 검사한다. 로그 보존과 final 결과 보존은 서로 다른 계약이다.
### FEM-REQ-HEX8-020 — 결정론
Serial/parallel local 계산에서 source identity·equation/scatter·ordered reduction·결과 row와
진단 순서를 재현한다. 같은 수치 설정에서 반복 실행 결과를 검증한다. Modal sign은
최대 절대 성분의 최초 source-order index를 양수로 고정한다. 반복 고유값의 벡터별 일치는
외부 비교하지 않으며 해당 공간의 mass Gram·residual·subspace 불변량으로 검증한다.
## 검증과 완료 조건
### FEM-REQ-HEX8-021 — 독립 수치·물리 검증
정식화·numeric controls를 독립 검토한 뒤 의미 있는 local/integration 검사를 수행한다.
검사 oracle는 production 식·assembly를 단순 복제하지 않는다. 최소 사례는 다음과 같다.
1. 정육면체의 독립 정확 적분 K/M, 다항 patch, 6 rigid modes, total mass·scale·좌표변환.
2. 비대칭 왜곡·뒤틀린 요소의 Jacobian, folded/inverted/degenerate 및 비유한 입력.
3. 유한 rigid rotation과 strained-then-rotated 상태, 에너지 gradient·tangent directional
difference의 step sweep, Kmat/Kgeo 분리와 zero-state Kt=K0.
4. 비영 BC·전체 구속·static singular 모델·성공/실패 state와 HDF5 보존.
5. 실제 generalized K/M 고유쌍의 독립 dense 작은 모델 oracle, density scaling,
clustered/rigid modes·최저 N·original-free residual/Gram.
6. 선형 oscillator의 해석해 및 alpha0, amplitude knot 전/정확/후·초기 a·서로 다른 curve,
비선형 constant-mass 제조해의 전체 u/v/physical a 시간수렴.
7. 실제 Hex8 mesh의 h/h2/h4 응답·가속도·힘/모멘트/에너지 수지, 큰 회전과 작은 strain,
spatial mesh refinement·full-integration 잠김 한계, serial/parallel 결정론.
내부 zero/noise scale과 conditioning 기준은 수식·정밀도·oracle에 근거한 기능별
numeric controls로 정하고 독립 검토한다. 외부 5%/1%를 내부 정확성 기준으로 사용하지 않는다.
시간수렴은 변위만 맞는 사례로 대신하지 않으며 유의한 오차 구간과 미분량 차수를 함께 판정한다.
### FEM-REQ-HEX8-022 — 필수 reference
2026-10-08 확인된 원본은 `reference/hexa/`다. 모두 read-only다.
| case | 입력 | 결과·필수 family |
| --- | --- | --- |
| 선형 정적 | `hexa_linearstatic.inp` | `_U.csv`, `_RF.csv`, `_S.csv`: 완료 frame의 U1–3, constrained RF1–3, Cauchy S 6성분 |
| 비선형 정적 | `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` | 사용자 제공 `hexa_freq.txt`의 최저10 modal Value(고유치 λ)를 비교 |
현재 inventory는 442 nodes, 300 elements다. 정적 U/RF 각442행, 수정된 정적 S 각2400행의
`IntPt=1..8`, 동적 U 각각44642행이다. 기존 elemental-nodal 응력 CSV의 위치 계약을
사용하지 않는다. 동적 V/A·reaction/energy reference는 없으므로 독립 검증이 필수다.
필요한 고유치 원본이 없으면 그 비교는 미실행이고 전체 기능 완료도 대기다.
원본 추가 전이라도 독립 구현·검증 작업은 계속할 수 있다.
### FEM-REQ-HEX8-023 — 비교 identity와 수치 정책
Nodal key는 case/source step/increment/instance/node/component, stress key는
case/source step/frame/instance/element/IntPt/component다. CSV header의 공백은 lexical
정규화하되 source row를 삭제·평균하거나 nonfinite를 보정하지 않는다. 좌표와 point convention은
원본 precision을 고려한 보조 검증이며 nearest-position matching으로 ID를 추정하지 않는다.
Dynamic은 integer increment로 대응한 뒤 각 source decimal time과 binary64 n*h schedule을
검증한다. Static은 마지막 factor-one frame에 대응하고 storage frame 번호가 같다고 가정하지 않는다.
정적 U-global·RF-global·S-global은 서로 다른 blocking family, 동적 U-global은 frame별
blocking family다. RF는 원본 전체442행 inventory를 먼저 확인한 뒤 실제 constrained components를
투영한다. Free RF를 FESA free residual로 비교하지 않는다. S는 각 case/frame의 300×8×6을
포함한다. Modal Value는 mode별 singleton blocking family이며 외부 mode-shape 비교는 비목표다.
Missing/extra/duplicate/identity/nonfinite 오류는 tolerance 이전 실패다.
공통 정책의 S=max|reference|, B=.01S, 일반 row relative≤.05, family RMS/S≤.01,
S=0 exact-zero를 적용한다. MITC4 eigen의 RMS5% 예외는 육면체에 적용하지 않는다.
Source C3D8의 입력 호환성과 Abaqus 내부 integration/constitutive/time-algorithm 동등성은
서로 다르다. 불일치 시 정식화·reference identity·절차를 조사하며 acceptance를 임의 완화하지 않는다.
### FEM-REQ-HEX8-024 — 회귀·완료 판정
구현 완료 시 실제 설정의 MSVC x64 Debug 전체 build/CTest와 필수 reference 비교,
독립 수치·물리 검토가 필요하다. 최신 source revision·명령·native exit·metric·hash를 기록한다.
모든 신규/영향 검사 PASS, 모든 필수 reference PASS, 미해결 신규 physics 오류0이 완료 조건이다.
기존 HHT C08 두 FAIL·C04a SKIP의 과거 기록은 baseline으로 직접 재확인하고, 동일하다면
기존 미해결로 별도 보고한다. 전체 suite를 green이라 부르거나 제외 실행으로 대체하지 않는다.
기존 오류를 새 오류와 섞거나 현재 작업의 성공을 위해 Shell/Thermal 수식·policy를 변경하지 않는다.
Reference·필수 실행이 대기라면 구현/내부 검증 완료와 기능 검증 완료를 분리한다.
## 범위 밖
20절점·tetra·wedge·hybrid/incompatible/reduced 요소, lumped 선택 API, 큰 strain용 다른
재료·소성·contact·물리 damping·압력·중력·체적력·시간변화 BC·비영 초기 q/v,
mixed mesh·Shell–Solid 연결·prestressed modes·좌굴·다중 step/restart·adaptive/explicit dynamics,
열-구조 연성·matrix dump·외부 배포·release-readiness는 포함하지 않는다.
## 방법과 자료의 한계
평균 Green trace energy는 선택한 탄성 regime의 FESA 모델이며 Abaqus `*ELASTIC, NLGEOM=YES`의
평균 J/Fbar·유한변형 재료 알고리즘과 동일하다고 주장하지 않는다. 선형 체적 평균 일치를
비선형 동등성으로 승계하지 않는다. 제공 결과의 일치만으로 다른 regime을 보증하지 않는다.
Amplitude의 step-time·상대 값·선형 보간·끝 값 유지 의미는
[Abaqus 공식 설명](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEPRCRefMap/simaprc-c-amplitude.htm)을 따른다.
Generalized sparse FEAST의 공개 진입점은
[Intel 공식 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html)에서 확인했다.
이는 설치 runtime·빈 interval·workspace·정식화 검증 evidence를 대신하지 않는다.
## 현재 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로 승계하지 않는다.
2026-10-09 사용자 A 승인은 [내부 정밀도 변경안](precision-proposal.md)의 전체 high+low
물리 상태와 Float64 반올림 observable을 FEM-REQ-HEX8-015·017–020에 적용한다.
HHT 식·기준 consistent M·입력·고정 schedule·100회·Si/exact-zero·원래 strict gate 및
외부 tolerance는 유지한다. 아래 구현·검증 checklist는 이 승인만으로 완료되지 않는다.
- [x] 승인된 체적 평균 수식·입출력·numeric controls·원본 mapping 정리 및 독립 numerical review 완료
- [x] 체적 평균 Hex8 K0/consistent M/비선형 f/Kmat/Kgeo/Kt·형상·복구 kernel 검증
- [x] Solid Domain/parser/3N DOF/ordered assembly/amplitude 검증
- [x] 체적 평균 선형·비선형 정적 accepted state/반력/잔차 내부 검증
- [x] 체적 평균 generalized consistent-mass frequency·최저 N·original-pencil 내부 검증
- [x] 체적 평균 선형·비선형 HHT u/v/physical a·시간수렴·수지 내부 검증
- [x] 체적 평균 공식 HDF5/CLI/self-check/실패 final 보존 내부 검증
- [x] 정적2·동적2 원본 필수 family 비교 PASS
- [ ] 사용자 원본 최저10 modal Value 필수 비교 PASS — 원본 제공 완료, 7/10 family FAIL
- [x] 최신 전체 MSVC Debug build/CTest·기존 baseline 대조 완료
- [ ] 최종 필수 고유치 불일치 해결 및 independent numerical/physics blocker0·범위/한계/evidence 완료
체적 평균 구현은 frozen `b2abd739`를 root `18b36c1`로 연결했다. 작성자 관련150/150,
시간수렴3 GTests/4물리 사례 및 최종 실제 재컴파일3/3은 native build/CTest0/0이다.
모든 u/v/physical a 관측 차수는1.98022 이상으로 기존1.8 기준을 충족했다. 독립 numerical와
작은 사례 physics 검토는 해당 범위의 bounded PASS다. Root 연결 후 kernel·frequency·
공식 출력 관련65/65도 native build/CTest0/0이다. 새로운 다섯 원본 CLI는 모두 native0으로
자연 종료했다. 제외 없는 전체787 CTest도 자연 종료했으며 native8,
784 PASS·기존 Shell FAIL2·SKIP1이다. 기존617개를 보존했고 추가170개는 모두 PASS다.
새 예외는0이며 전체 green은 아니다. 두 기존 실패의 metric body는 baseline과 동일하고,
SKIP은 보존된 상세 출력이 없어 이름·상태의 동일성만 확인했다.
새 선형·비선형 정적 원본의 U1326/RF51/S14400은 각각 필수 비교 native0으로 PASS했다.
새 고유치 공식 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 수치 불일치와 기존 회귀 예외는 이 통과로 없어지지 않는다.
공간수렴 증거는 실제 두 축을 세분화한 지정 굽힘장 에너지다. 평형 cantilever는 길이
방향만 세분화하고 두께/폭은2요소로 고정한 tip 추세이며 평형해의 공간차수 증거가 아니다.
정규 brick rank와 검증한 warped 사례를 모든 admissible warped cell로 확대하지 않는다.
Local kernel과 입력·3N mapping은 독립 검토 및 연결 후 관련180개 검사를 통과했다.
정적 구현 `a34466f`의 관련98개와 고유치 구현 `0e07b4d`의 관련48개 검사가 각각
native CTest exit0이며 독립 수치 검토를 통과했다. 두 정적 원본과442절점 고유치 원본은
직접 API로 실행했지만 원본 결과값 비교를 수행한 것은 아니다. 연결 source `28be39f`의
전체 MSVC Debug build는 exit0이며 이 build 자체를 전체 CTest 통과로 해석하지 않는다.
과거 단일 Float64 구현 `f661864`는 관련76개 검사와 독립 수치 검토를 통과했지만,
두 동적 원본의 세 번째 증분에서 strict gate를 만족하지 못했다. 이 실패는
[lessons](lessons.md)에 보존하며 현재 방식의 결과와 구분한다.
승인된 전체 high+low 구현 `c49cae4`는 소규모32/32 및 별도 성공한 LIN/TL·SDOF/MDOF
시간수렴 사례와 독립 numerical/physics 검토를 확보했다. Root 연결 후 관련49/49와
추가 직렬/TBB low 일치1/1 검사도 native build/CTest0/0이다. 두 원본의 초기 상태와
증분1–3은 unchanged schedule로 관측했고, 원래 모든 free 성분의 전체 pair 물리 gate를
독립 재계산했다. 이 관측은 네 번째 증분 전에 종료했으며 전체101 endpoint 완료가 아니다.
상세 범위와 한계는 [수치 검토](numerical-review.md), [물리 검토](physics-review.md)에 있다.
공식 결과 연결은 `e2c3c5b`에 통합했다. 작성자 행동본의 관련101/101과 public header만
보완한 후속본의5절차 API/schema1/1이 native build/CTest0/0이며, 독립 수치·I/O 검토에서
요청 밖 modal pair의 입력 검증 누락을 보완하고 잔여 finding0을 확인했다. 메인 연결 후
실제 CLI·HDF5·full-pair RN64·실패 final 보존 관련17/17도 native build/CTest0/0이다.
이 범위의 완료와 외부 비교·최신 전체 회귀는 구분한다. 실행 방법은 [README](README.md),
세부 근거와 한계는 [수치 검토](numerical-review.md)에 있다.
다음은 원본 frequency 결과가 제공되기 전 pointwise 구현의 비교 이력이다.
비교기 `317fe5c`는 원본 identity·schema·finite·허용오차·원본 덮어쓰기 보호의 독립 검토와
관련124/124 Python 검사(native0)를 통과했다. Root 연결 후 같은 관련124/124도 native0이며
정적 수치 실패와 modal NOT RUN을 재현했다. 두 정적 원본은 실제 CLI native0이지만
U/RF/S 필수 비교는 모두 FAIL이다. 고유치 공식 readback은 검사했으나 원본 Value 부재로
비교는 NOT RUN이다. [verification](verification.md)의 metric과
[승인된 변경 근거](reference-discrepancy-proposal.md)를 구분한다. 별도 선형 Python 후보의
수치 일치는 현재 구현의 PASS가 아니다. Source `1eb9cdd`의 전체 build는 native0이고
제외 없는780개 CTest는 native8,777 PASS·2 FAIL·1 SKIP으로 종료됐다. 추가163개는 모두
PASS이며 기존 예외3개의 이름·status·metric body가 baseline과 동일하다. 전체 green은 아니다.
기존 pointwise 구현의 두 동적 원본도 native0으로101 endpoint를 완료했다. 이는 새 체적
평균 energy의 결과가 아니며 변경본의 검증은 위 checklist에 따라 다시 수행한다.
@@ -1,68 +0,0 @@
# 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 결과는 그 실행을 대체하지 않는다.
-157
View File
@@ -1,157 +0,0 @@
# Hex8 입출력과 내부 전달 계약
권위 있는 field/enum/shape·지원 입력·진단/실패 의미는 [PRD](PRD.md)의
FEM-REQ-HEX8-008–011,016–020,022–023다. Public CLI·path/lease/exit는
[공통 계약](../contracts.md), tolerance는 [TOLERANCE](../TOLERANCE.md)를 따른다.
이 문서는 그 계약을 구현 경계까지 상세화한다. Physics 선택은 [ADR](ADR.md)를 따른다.
## Source 입력과 실패 경계
Solid HHT의 [승인된 high+low 계산](precision-proposal.md)은 내부 전체 물리 상태를
accepted history와 다음 trial에 유지한다. 공식 HDF5의 기존 field·shape·Float64 dtype은
변경하지 않으며 값은 전체 물리량의 round-to-Float64 observable이다. Self-check는
직렬화가 그 반올림과 일치하는지 확인한다. 내부 gate PASS를 rounded 배열 자체의
동일 gate PASS로 해석하지 않는다. 로그에 내부 산술을 명시하고 직렬화 비유한 값·
overflow는 실패로 처리해 기존 final을 보존한다. Restart는 지원하지 않는다.
기존 single Part/identity Instance/set/target subset을 재사용하고 source spelling/location/
instance/label과 internal index를 구분한다. C3D8의8 distinct nodes와 SOLID SECTION의 elset/
material 연결, constant E/nu 및 procedure별 density capability를 검증한다. Blank section row는
허용하되 thickness/material orientation·다른 solid type를 default로 흡수하지 않는다.
실제 BC/CLOAD 성분은 DOF1–3이다. 사용자 승인된 호환 예외로 supported displacement BC의
exact-zero DOF4–6(생략0 포함)만 source/location warning/no-op으로 처리한다. Mixed1–6 range는
1–3을 적용하고4–6만 경고하며 회전 equation/state를 만들지 않는다. 비영 회전 BC와 모든
회전 CLOAD는 거부하고 unsupported BC 옵션·DOF범위 밖 의미를 이 예외로 수용하지 않는다.
Static 비영 prescribed는 absolute target이며 nonlinear의
factor가 force/target 모두에 적용된다. Frequency는 homogeneous BC, dynamic은 exact-zero BC와
initial q/v0만 허용한다. Unused node·mixed element·alias element·unknown set/material/source
identity·bad density/geometry·unsupported meaningful keyword는 model/input failure다.
TABULAR amplitude는 canonical name uniqueness를 검증하며 raw name/location을 보존한다.
TIME=STEP TIME/VALUE=RELATIVE/DEFINITION=TABULAR의 생략 default와 명시 동일 값만 지원한다.
One/many rows의 pair를 flatten해 finite time>=0/strict increasing/value finite를 검사한다.
Knot 원 값·linear interpolation·end hold를 사용한다. Curve 없는 CLOAD는 initial0+부터 constant다.
다른 curve를 사용하는 load block은 미리 하나의 base vector로 합치지 않는다. Static/BC amplitude,
TOTAL TIME/SMOOTH STEP/smoothing option을 fail-closed로 거부한다.
STATIC DIRECT는 h/T/INC의 fixed schedule을 지원하며 nonlinear load factor는 n*h/T다.
기존 일반 STATIC fixed-factor subset도 유지한다. DYNAMIC DIRECT h/T/INC는 integer n과
binary64 n*h로 대응한다. FREQUENCY의 N은 source mode request이며 LANCZOS/SIM option 표기와
실제 generalized MKL FEAST를 metadata/diagnostic에서 구분한다. Provided PRESELECT/무해한
output/restart 요청은 명시된 no-op이고 required 공식 결과를 삭제하는 selector가 아니다.
## T2/T3와 이후 절차의 typed 경계
다음 class/method 이름은 구현 계획용 초기 interface다. 같은 행동/배열 크기·소유권을 유지하는
repository-conforming 이름 조정은 허용하며 physics/schema 수정은 아니다.
- `Hex8Element`는 기존 Element interface의 linear `ComputeStiffness`와 `Recover`를 제공한다.
Create 입력은 internal element index, source/local layout, 기준 좌표8×3, 기존 isotropic
elastic material와 optional density다. 생성은 Solid Domain/section 정의 대신 이 local
입력에 의존한다. Layout은8 source-order nodes×UX/UY/UZ다.
- Explicit `EvaluateLinear(u)`/`EvaluateNonlinear(u)`는 immutable element의 local u[24]를 받아
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()`는
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이며 평균된
대체 strain이 아니다. 응력은 같은 point의 deviatoric strain과 요소 전체의 reference-volume
평균 trace에 의존한다. 비선형은 PK2를 실제 F/J로 Cauchy 변환하며 평균 Cauchy pressure를
가정하지 않는다. Generic recovery variant의 Solid payload는 별도 type이다.
- Semantic Domain은 Solid element/section/material/density·amplitude 정의를 소유한다.
DOF profile은 `kSolidStructural`에 해당하는3-component 구조이며 `FullDof`, free/constrained,
generic `ElementScatter`, sparse pattern의 기존 공개 의미를 유지한다. 동작별 node component
count를 조회해6으로 고정된 loops를 Solid branch에서 제거한다.
- Matrix assembly는 local layout+24×24 contribution의 stable ordered reduction이다. Mass/stiffness
storage는 같은 full-space pattern이며 free restriction은 실제 constraint mask를 사용한다.
Runtime factory 연결은 Domain material/coords를 Hex8 Create에 전달하는 단일 owner가 수행한다.
- Static/eigen/dynamic executor는 procedure별 typed outcome/state를 반환한다. Accepted frames는
source identity·3N physical arrays·8점 result·physical scalars와 validation evidence를 소유한다.
Eigen은 modes/vector/all-pair check/Gram을 소유하고 static displacement frame으로 위장하지 않는다.
- Trial은 accepted history의 독립 값이며 invalid geometry/finite/recovery/iteration failure는
commit하지 않는다. Static force/correction·dynamic force/rate channels의 raw norm/scale/branch/
unit/pass와 increment/iteration을 기록한다. 필요한 failure evidence는 Status/로그까지 전달한다.
Shared Shell4-channel logger에 dummy rotation/moment convergence를 만들지 않는다.
- Central prepared outcome·writer/CLI 연결은 T7의 한 owner다. Vendor objects는 private adapter에
두고 공개 Matrix/Vector/Result/Status 경계를 유지한다.
## HDF5 metadata와 결과 attribute
Model/accepted/eigen compound field 집합과 순서·dtype는 PRD017 그대로다. New Solid schema1과
procedure/element/integration/mass attributes로 식별하고 기존 file contract는 유지한다.
Required strings는 UTF-8, numeric은 explicit little-endian U64/U8/F64다.
Metadata의 추가 공개 의미는 다음과 같다.
| attribute | 값/의미 |
| --- | --- |
| `source_input_identity` | 실제 읽은 원본 byte identity; 기존 공통 hashing 의미 |
| `source_step_name` | 입력 raw step 이름; storage key Step-1과 별도 |
| `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` 또는
`load_factor:F64`, `coordinate_system=global-cartesian`, 필요한 `location`을 붙인다.
Result array의 leading node/element inventory와 component list를 self-check한다.
| quantity | component_names / unit_dimensions / 필요한 의미 |
| --- | --- |
| displacement | `U1,U2,U3` / `length` |
| reaction/residual | `RF1,RF2,RF3` 또는 `R1,R2,R3` / `force`; reaction은 constrained projection |
| stress | `S11,S22,S33,S12,S13,S23` / `force/length^2`; `stress_measure=cauchy`, `location=integration-point` |
| strain | `E11,E22,E33,E12,E13,E23` / `dimensionless`; `strain_measure=infinitesimal` 또는 `green-lagrange`, `shear_convention=tensor` |
| velocity | `V1,V2,V3` / `length/time` |
| physical/algorithmic acceleration | `A1,A2,A3` / `length/time^2`; 각각 `acceleration_kind=physical`/`algorithmic` |
| strain/kinetic energy, work, balance error | `scalar` / `force*length`; 각 계산 정의를 별도 `definition` attribute로 기록 |
| linear/angular momentum | `P1,P2,P3` 또는 `L1,L2,L3` / `mass*length/time` 또는 `mass*length^2/time`; angular origin은 global0 |
| lambda/frequency | `eigenvalue` 또는 `frequency` / `1/time^2` 또는 `1/time`; 서로 다른 eigen table field |
| mode vectors | `UX,UY,UZ` / `mass-normalized`; `normalization=phi^T*M*phi=1` |
Strain-energy definition은 linear `0.5*u^T*K0*u`, nonlinear `sum(W*detJ0)`다.
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은 동일한 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에서 확인한다.
## 출력 candidate와 self-check
Writer는 완결된 accepted state만 받는다. Dtype/정확한 compound member/order·shape·source
IDs·finite·flags·frame/increment/time/factor·physical3 component·eigen norm/검증량을 확인한다.
Write 후 readback 값을 candidate와 대조하고 close까지 성공한 뒤 atomic replace한다.
잘못된 payload, 임시 write/readback/close/replace 실패에서 기존 final HDF5를 보존한다.
File 존재와 이번 실행 성공은 별개이며 CLI native exit와 stored source identity를 확인한다.
## Comparison projection
Quantity/key/family와 원본 준비 상태는 [reference-model](reference-model.md)에 있다.
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는 제공된 `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 오류는 실패다.
-309
View File
@@ -1,309 +0,0 @@
# Hex8 계산 정밀도와 검증에서 확인한 점
현재 완료 여부는 [PRD](PRD.md)의 checklist가 소유한다. 아래 기록은
[정식화](formulation.md)와 [수치 기준](numeric-controls.md)을 바꾸지 않고
계산 정밀도를 개선한 근거다. 내부 검사 통과와 원본 동적 모델의 수렴은 구분한다.
## 작은 변형률에서 단위행렬을 빼지 않는다
`E=(F^T F-I)/2`를 그대로 계산하면 작은 변형률에서 유효 숫자를 잃는다.
`H=grad(u)`로부터 `E=sym(H)+H^T H/2`를 계산하면 같은 Green 변형률을
단위행렬 차감 없이 구한다. StVK 재료식, 에너지, Cauchy 응력과 접선은 유지한다.
탄성계수 `2.1e11`, Poisson 비 `0.3`인 직육면체의 signed affine stretch
`±1e-10`, `±1e-8`에서 독립 응력·에너지·면 traction 적분으로 기존 오류를
재현했다. 수정 `7d191036`은 요소 검사 27개와 독립 수치 검토를 통과했다.
비선형 동적 원본의 첫 증분 잔차 비율은 약 `1.42e-5`에서 `6.02e-10`으로
줄었지만, 승인된 `1e-10` 기준은 여전히 충족하지 못했다.
## 곱셈, 합산, 변위 차감의 오차를 각각 보존한다
강체 병진을 제거한 상대변위로 내력을 계산해도 큰 항들이 상쇄되는 행에서는
계산 순서의 영향이 남는다. 원본 선형 동적 사례의 두 요소 행에서 local 곱의
절댓값 합은 각각 약 `3.63e6`이었고, FMA 곱셈 잔여와 보상 합산으로 복구한
내력 차이의 합은 `8.20e-10`이었다. 당시 전체 잔차 `9.06e-10`과 같은 크기였다.
수정 `c50e68e`는 캐시된 K0를 그대로 두고 상대변위와의 곱셈·합산을 보상한다.
수정 `8153796`은 절점 변위 기울기 및 비선형 `sum(w*P*G)`에도 같은 보상을
적용한다. 각각 관련 검사 60개와 독립 수치 검토를 통과했으나 동적 원본은 실패했다.
기울기·내력·에너지·접선은 같은 trial의 물리식을 사용한다.
작은 절점 변위의 갱신은 입력 double에서 표현 가능해도, 더 큰 기준 절점 변위를
뺀 상대변위에서는 소실될 수 있다. 수정 `8ccd1b2`는 TwoDiff로 차감의 잔여를
보존하고, 상대변위의 두 부분을 내력·기울기·선형 에너지 계산에 함께 사용한다.
독립 정확 유리수 검산의 유한 차이 125,039쌍에서 불일치가 없었고, 관련 native
검사 60개와 독립 수치 검토도 통과했다. 이 검산은 native solver 검증을 대체하지
않으며, 입력 자체의 반올림으로 잃은 값을 복원한다는 의미도 아니다.
## 수렴 정체와 허용치 변경을 구분한다
위 수정 후 선형 동적 원본은 첫 증분을 5회 solve, 잔차 비율 `9.54e-11`로
수용했다. 두 번째 증분은 100회에서 `1.01993e-10`으로 실패했다. 실패 좌표의
직전 적용 보정량은 약 `-0.496 ULP`여서 저장된 변위를 바꾸지 못했다.
100회 종료 지점에서는 다음 solve를 하지 않으므로 이 값으로 다음 Newton 갱신을 추론하지 않는다.
비선형 원본도 첫 증분에서 약 `1.35e-10`으로 실패했다.
이는 전체 원본 검증 완료의 근거가 아니다. 물리 잔차의 component별 원래 Si,
correction, update 및 max100 기준을 유지하면서 표현 가능한 변위에서 추가
정제가 가능한지 확인해야 한다. 예측 잔차는 trial 선택에만 사용할 수 있고,
수용은 실제 rates·형상·내력·복구·모든 free 성분의 원래 판정으로 수행해야 한다.
원본·허용치를 보정하거나 실패한 candidate를 accepted history에 넣지 않는다.
## 잔차 점수만으로 Newton 갱신의 정체를 판단하지 않는다
각 trial의 `abs(r_i)/Si`는 최종 수렴 판정에 사용하지만, 그 최대값이 증가했다고
갱신이 정체된 것은 아니다. 작은 강체 운동 사례에서 한 성분의 잔차는 약
`9.88e-24`에서 `3.17e-25`로 줄었으나 Si가 더 빠르게 줄어 비율은 증가했다.
이 갱신을 한 좌표의 ULP 정제로 대체한 구현은 기존 축·하중 크기 회귀에서 실패했다.
현재 failing 성분의 Si를 고정한 별도 점수도 다른 축의 유효한 갱신을 가로막았다.
완전한 변위가 반복되더라도 다음 반복의 정제 대상 자유도가 바뀌면 계산은 더
진행될 수 있다. 따라서 정체의 근거에는 실제 변위와 정제 대상의 변화가 모두
필요하며, 잔차 점수의 왕복만으로 전체 상태의 반복을 추론하지 않는다.
최종 수용에서는 여전히 실제 모든 free 성분의 원래 Si와 수렴 기준을 검사한다.
변위와 직전 solve mask만 비교한 수정 `1063abc`는 관련74개 검사를 통과했지만
두 동적 원본은 세 번째 증분100회에서 실패했다. 선형 잔차 비율은 `2.10874e-8`,
비선형은 `9.99819e-8`이었다. 이 실패 행의 전체 내력 보상 합산 차이는0이고,
관성력 보상 차이는 약 `1e-17`이므로 해당 실패를 합산 오차만으로 설명하지 못한다.
동일 구현에 동작을 바꾸지 않는 계측을 추가하고 실제 반복 상태를 저장했다.
선형은 다음 반복14의 상태가 진입11과, 비선형은20이18과 정확히 같았다.
전체 변위1326개·진입 시 holding mask1275개·incoming correction metric4개의
유한 값이 모두 일치했고 그 구간의 실제 ULP 이동은0건이었다. 기존 두 상태
판별은 false였으며 prospective physical gate도 FAIL이었다. 독립 검토가 계측과
원시 배열을 대조했고, 독립 Python 검산은 exit0이었다. 진단 실행 두 건은 각각
native exit1로 자연 종료했으며 원본 solver PASS의 증거가 아니다.
고정 증분에서 이전 accepted state·M·하중·predictor가 고정되고 fresh solve와
탄성 local recovery가 결정적일 때, 재현되는 반복 상태는 전체 변위·reactivation 전
holding mask·incoming correction4개다. 다음 상태는 실제 fresh Newton 변위·freeze 후
mask·fresh correction4개로 비교해야 한다. History는 증분 시작과 실제 ULP 적용 후
초기화하고, physical FAIL 및 finite correction PASS 진입만 보관한다. Prospective
physical PASS는 정상 Newton 경로를 유지한다. 이 한정된 판별 수정 `b394ae7`은 관련75개
검사와 독립 코드 검토를 통과했다. 7개 판별 조건을 각각 제거한 behavior mutation도
native build0/CTest8로 실패를 검출했다. 기존 수렴 기준·100회 제한·최종 수용은 유지한다.
동일 immutable binary의 두 원본 실행은 여전히 세 번째 증분100회에서 native exit1로
실패했다. 선형은419.360초, 잔차 비율 `7.21125e-9`, 비선형은431.045초,
`1.27770e-8`이었다. 선형95번째 반복의 ULP 이동은 실제 점수를 `7.21125e-9`에서
`4.66385e-9`로 낮췄으나 뒤의 정상 Newton 갱신에서 다시 증가했다. 이는 각 정제의
국소 감소가 전체 갱신 과정의 진전을 보장하지 않는다는 증거이며, 전체 변위가 같은
상태로 복귀했다는 증거는 아니다. 비선형의 잔차 점수 왕복도 전체 상태 반복의 증거가 아니다.
Incoming correction4개의 실제 수치는 정상 Newton의 rates·tangent·rhs에 사용하지 않으며,
유한 값과 PASS 여부가 수용에 쓰인다. 추가 계측에서 선형 진입20→다음23, 비선형72→80은
각각 같은 순수 Newton 구간의 전체1326개 변위·1275개 mask가 정확히 같았으나 correction
숫자4개는 달랐다. 모두 finite/PASS이고 prospective physical FAIL이었으며 기존 판별은
false였다. 선형 진입23→다음30은 실제 ULP 이동을 사이에 두고 변위·mask·correction
숫자까지 같았지만 history 초기화로 판별하지 못해 정상 Newton이 적용되는 경로였다.
독립 검토와 원시 배열 Python 검산 exit0으로 두 조건의 영향을 확인했다. 비선형에서
ULP를 사이에 둔 복귀는 입증하지 않았으며 전체 혼합 알고리즘의 주기 반복도 주장하지 않는다.
수정 `f661864`는 고정 증분 전체의 적격 실패 진입을 유지하고, 실제 변위·mask와 각각의
finite correction PASS로 동등성을 판별한다. Correction 숫자의 차이는 진단으로 유지한다.
관련76개 검사는 native build/CTest0이며 독립 검토를 통과했다. 실제 Hex8 사례의
history 초기화 재삽입은 두 번째 증분100회 실패를 만들었다. 숫자 일치 재삽입은
두 helper 검사의 assertion 실패를 만들었다. 올바른 원본을 복원하고 실제 object를
재컴파일한 뒤 최종 회귀를 수행했다.
이 재현은 질량이 지배적인 작은 문제의 제어흐름 검사이며 원본 conditioning 해결의 증거가
아니다. 원래 gates·100회 제한은 유지한다.
동일 immutable binary의 원본101개 endpoint 검사 두 건은 다시 세 번째 증분100회에서
native exit1로 자연 종료했다. 선형408.202초의 잔차 비율은 `1.7773871030665027e-8`,
비선형416.052초는 `8.7357210799572219e-9`다. 최신 실패 행의 전체 내력 보상 합산 차이는
0이고 관성력 차이는 약 `1e-17`이다. 최종 다섯 반복에서 전체 변위와 mask는 계속 바뀌므로
잔차 점수만으로 정확한 전체 상태 반복을 추론하지 않는다. 새 판별의 내부 검증과 실제 원본
수렴은 구분해야 하며, 원본 conditioning·local 계산 또는 결합 좌표의 표현 가능성을 더
분석해야 한다. 실패한 state를 통합 완료나 reference PASS로 표시하지 않는다.
추가 원시 proof와 검산은 로컬 `.harness/hex8-evidence/t6-independent-semantic/`에,
수정·mutation·최종 회귀 로그는 별도 구현의
`.harness/build-ninja-msvc-debug/hex8-evidence/t6/`에 보존한다. 선형 진단은 닫힌 proof 검토
후 명시적으로 중단했고 비선형 진단은 native exit1로 자연 종료했다. 둘 다 solver PASS가 아니다.
재현 가능한 원시 tuple 검산과 SHA256은 로컬 evidence
`.harness/hex8-evidence/t6-independent-tuple/check-v3.py` 및 `v3-check-result.json`에
보존했다. 원시 진단과 native 실패 로그는 별도 구현의
`.harness/build-ninja-msvc-debug/hex8-evidence/t6/tuple-trace3/`에 있다.
명령·native exit·실패 로그는 해당 source와 함께 보존한다. 최종 통합 및 외부 비교
결과는 이후 verification 기록에서 이 개발 중 실패와 구분한다.
## 고정한 실패 상태에서 산술 오차와 갱신 소실을 구분한다
`f661864`의 terminal 상태를 관찰하는 별도 실행은 원래 계산식을 그대로 두고 각300개
reference cache·native response와 전체 state/M/Kt를 저장했다. 두 실행은 native exit1로
자연 종료했으며 원래 출력한 수치 trace와 일치했다. 계측은 byte 단위로 복원하고 재빌드했다.
원래 실행은 full terminal 변위를 저장하지 않았으므로 두 실행의 전체 변위 일치를 주장하지
않는다. 수집한 local 변위/scatter·전역 내력·M*a/M*A·r/Si는 모두 정확히 재조립됐고,
독립 Fraction 검산 두 건은 Python exit0이며 다른 검토자가 원시 계수로 재계산했다.
이 검산은 관찰한 binary64 계수를 고정한 정확한 다항식 계산이다. 이상적인 geometry나
원본 solver 동등성, 표현 가능한 해의 존재/부재를 증명하지 않는다. 선형 cached K dot의
실행 오차는 `+5.82e-13`으로 해당 행의 허용 잔차 `1.49e-11`보다 작았다. Cached G로
operator를 다시 구성하면 내력이 `-3.78e-10` 달라지지만 잔차는 여전히 `2.27e-9`다.
비선형의 고정밀 내력은 `+5.52e-11` 달라져 잔차를 `4.11e-10`에서 `4.66e-10`으로
키웠다. H의 high/low collapse 오차는 존재하지만 이 실패를 산술 정밀도만으로 해결할
근거는 없다. Operator 형성 차이와 runtime dot 오차를 혼동해 force만 교체하지 않는다.
저장한 PRE holding mask를 현재 물리 기준으로 reactivate한 뒤, 같은 순서의 rounded
Keff와 old residual을 포함한 weighted RHS를 별도 SuperLU로 풀었다. 정확한 방정식 잔차
비율은 두 건 모두 약 `2e-16`이다. 선형102개 active 보정은 모두 저장된 변위를 바꾸지
못했고, 비선형81개에서는9개 변위가 바뀌고 실패 좌표71개 보정이 소실됐다. 이는 독립
backsolve의 관측이며 production PARDISO의 현재 fresh 방향이나 actual trial PASS가 아니다.
직전 적용 보정량과 이번 fresh 방향을 구분해야 한다.
Weighted R=0의 physical target은 `alpha*r_old/(1+alpha)`다. 비선형 실패 행에서 이 값의
크기 `2.60e-11`은 현재 허용 잔차 `4.70e-12`보다 크다. 현재 최종 조건은 weighted R=0을
요구하지 않으므로 이것만으로 계약 충돌이나 수치적 불가능성을 선언하지 않는다. Old residual을
버리거나 물리 가속도를 다른 정의로 바꾸는 근거도 아니다. 다음 후보는 실제 native
rates·geometry·모든 원래 Si·update·weighted identity로 검증해야 한다.
같은 고정 상태의 native replay는 실제 Hex8 kernel·rates·하중과 저장 CSR을 사용했다.
먼저17자리 십진 문자열로 저장한 값을 Float64로 복원하고, 재계산한 전체 변위·속도·
두 가속도 배열 및 predictor·하중·내력·관성력·r/Si·최대 점수가 저장 값과 정확히
일치하는지 확인했다. 저장 CSR의 재생이며 독립적인 M/Kt 재조립 검증은 아니다.
RF는 저장되지 않았으므로 constrained residual/free0의 파생 identity만 확인했다.
TEMP 검사는 원래 파일과 byte 단위로 복원하고 실제 object를 재컴파일했다.
Native PARDISO의 현재 fresh solve도 선형102개 보정이 모두 변위를 바꾸지 못했다.
비선형은81개 active 좌표에서9개 변위가 바뀌고71개 실패 좌표의 보정이 소실됐으며,
최대 잔차 비율은 `8.73572e-9`에서 `1.27770e-8`로 커졌다. 정확 산술로 예측한 상위8개
단일 ULP 후보를 각각 실제 계산한 최선 비율은 선형 `4.75888e-9`, 비선형 `6.73857e-9`다.
두 fresh Newton 및16개 ULP trial 모두 원래 physical limit `1e-10`에 실패했다.
다른 update·weighted identity·correction·geometry 검사는 통과했다. Native exit0인 두
replay 검사는 관측 재현 검사의 성공이며 원본 수렴이나 accepted history의 성공이 아니다.
단일 이웃의 실패만으로 여러 좌표를 함께 움직이는 해의 부재를 추론하지 않는다.
기존에 실제 평가한 최선 단일 이웃에서 Newton/history 없이 단일 ULP 정제를 이어가는
별도 관찰은 최대100회 추가 이동으로 제한했다. 먼저4회·24회 관찰과 겹치는 전체 trial
배열을 정확히 재현했다.
선형은77회 개선 후 `5.25815e-10`에서 남은 예측 개선3개가 실제로는 모두 같은 최대값을
만들었다. 비선형은38회 개선 후 `9.85274e-10`에서 남은 예측 개선1개가 실제 최대값을
키워 거절됐다. 두 경우 모두 physical FAIL이며 다른 gates는 PASS다. 마지막 cursor에서
각각2547개·2549개 실제 단일 방향은 검사하지 않았으므로 모든 단일 이웃의 정체를
증명하지 않는다.
진단의100회 이동과 production의100회 Newton solve는 다른 수량이다. 이 관찰은
accepted frame·다음 fresh solve·전체101개 endpoint의 검증도 아니다.
최대 비율이 줄어도 실패한 행 수는 늘 수 있다. 마지막 실패 행 수는 선형162개,
비선형132개였다. 최대값의 엄격한 감소만으로 모든 행의 최종 평형을 보장하지 않는다.
두 정체 상태에서 모든 원래 free 좌표의 ±1 ULP를 정수 변수로 둔 별도 minimax 예측은
각20초 후 timeout이었다. 관찰 script의 Python exit0과 최적화 종료 상태를 구분한다.
반환 후보의 정확 산술 잔차 비율은 `2.84e-8`·`5.62e-8`로 현재 상태보다 컸다.
검증된 zero-change 후보가 주는 목적값 상한을 추가한 각각20초의 후속 예측도 timeout이며
정수 후보를 얻지 못했다. 상한은 기존 rounded surrogate 최적해를 보존하지만 solver에
초기 후보를 전달하는 warm start는 아니다. 이 결과를 native 후보 통과나 표현 가능한
해의 부재로 해석하지 않는다. 최적화 도구는 로컬 진단에서만 사용했고 production은
변경하지 않았다.
두 좌표를 함께 ±1 ULP 이동하는 별도 예측은 마지막 단일 정제 상태에서 시작했다.
최대 잔차 행의 M 또는 Kt 구조적 support에 적어도 한 좌표가 연결되는 조합을 검사했다.
선형313236개·비선형210588개의 Float64 affine 예측을 완료했고, 상위8개씩은
고정 계수의 정확 산술로 Ma·내력·새 Si를 다시 계산했다. 이 support 제한은 affine
예측에 대한 것이며 실제 비선형/반올림 계산의 모든 두 좌표 이웃을 포함한다는 뜻은 아니다.
최선 예측은 각각 `5.23348e-10`·`9.75010e-10`으로 현재 최대값보다 작지만 여전히
원래 기준 `1e-10`을 초과했다.
이16개 후보를 각각 같은 변경하지 않은 cursor에서 실제 kernel·rates로 평가했다.
선형8개는 최대값 `5.25815e-10`이 그대로였고, 비선형은 모두 현재 `9.85274e-10`보다
커졌다. 모든 후보의 실제 변위 변경은 서로 다른 원래 free 두 좌표의 한 ULP로
확인됐으며 physical FAIL, 다른 gates PASS였다. 전체 배열·r/Si·원시64개 artifact의
SHA를 별도 검산한 Python exit는0이다. 두 native 관측 검사의 exit0은 평가와 재현의
성공이며 후보 개선이나 원본 동해석 수렴의 성공이 아니다. Cursor는 이동하지 않았고
다음 fresh solve·accepted history는 실행하지 않았다. 예측 개선을 실제 개선으로
대체하거나 이16개 실패로 모든 표현 가능한 해의 부재를 주장하지 않는다.
Increment-local 보상 가산은 물리 상태를 단일 Float64 변위로 유지하면서 덧셈의 소실량만
다음 Newton 갱신에 누적하는 별도 관찰이었다. 같은 최선 cursor에서 plain/carry 각각
12회씩, 선형·비선형 총48회 fresh solve를 수행했다. 두 경로 모두 원래1275개 free
방정식 전체를 풀고 실제 current Kt를 재조립했으며 old residual과 모든 기존 gates를 유지했다.
Production의 principal refinement·history·ULP 탐색은 이 비교에 포함하지 않았다.
첫 Kt/Keff/RHS·fresh 방향·전체 물리 배열은 두 경로에서 정확히 같았다. 이후 carry는
실제로 다른 변위 경로를 만들었지만 모든48개 physical 판정은 FAIL이었다. 최종 비율은
선형 plain/carry `3.14971e-8`/`3.14508e-8`, 비선형 `4.43049e-8`/`1.54565e-7`로,
둘 다 시작 cursor보다 컸다. 다른 gates는 모두 통과했다. Native exit0의 두 관측 검사는
수렴 성공이 아니며, 독립 Python 검산 exit0은 원시201개 SHA·carry 산술·연산/경로·r/Si와
게이트를 검증한 것이다. TEMP source는 실행 전 복원하고 실제 object를 재컴파일했다.
이 결과는 production carry 도입이나 반복 횟수 확대를 뒷받침하지 않는다.
이 진단 종료 시점에는 low를 물리 변위로 사용하는 변경안을 채택하지 않았다.
이후 사용자가 2026-10-09 선택 A로 [내부 정밀도 변경안](precision-proposal.md)을 승인했다.
단순 carry와 구분해 전체 계산 상태를 high+low로 유지하고 Float64는 반올림 observable로
출력한다. 기존 실패 evidence는 새 방식의 통과 증거가 아니며 물리 기준·원본은 유지한다.
원시 capture·정확 산술·backsolve·이웃 예측·native replay의 재현 자료와 독립 raw 검산은
로컬 `.harness/hex8-evidence/t6-independent-frozen/`에 보존한다. 기능 checklist는
그대로 미완료다.
## 승인된 전체 high+low 요소의 첫 검증
2026-10-09 승인 A 후, low를 누락하는 대조 kernel에서 실제 요소 assertion3개가 실패했다.
전체 pair로 H/Green strain/응력/힘/에너지/접선을 계산한 kernel은 native build0/CTest0이다.
원래 요소27개와 새 검사17개의 최종 묶음44/44가 통과했고, quarter-turn 작은 전단의 힘
covariance와 독립 exact-dyadic primitive oracle을 포함한다. Native 산술6/6은 RN/FTZ/DAZ
실행 전제와 normal high에 최소 subnormal FMA error가 붙는 경계까지 확인했다.
동적 선형과 비선형은 같은 상대변위 gradient의 미분을 사용한다. 기존 rounded K0를 새 힘에
혼합하지 않는다. 기준 절점0의 signed 방향 차분은 접선·에너지 gradient와 일치했고,
두 brick의 공유 면 힘, linear/NL zero-state Hessian 및 low만 남은 현재 셀의 ±폭을 검사했다.
중앙 에너지 차분의 StVK cubic 오차는 step²로 감소한다. 이를 exact 미분값으로 간주해
과도한 test bound를 적용했던 실패를 구분하고 분석적 truncation bound를 적용했다.
큰 반복 비용을 줄이기 위해 선형 Hessian은 같은 paired zero-state graph의 결과를
immutable cache로 보관한다. Cache 생성 실패는 기존 Float64 Create 지원을 거부하지 않는다.
변형·실패 trial 후에도 high/low Hessian은 같고 힘·에너지·복구와 비선형 접선은 같은 전체
trial에서 계산한다. 독립 reviewer가 이 캐시와 native44/44의 원시 로그도 확인했다.
독립 numerical reviewer는 실제 shared arithmetic·kernel·geometry의 한정된 범위를 PASS로
판정했다. 재현 로그는 `.harness/hex8-evidence/precision/`에 보존한다. 이 결과는 동적 전체
상태·시간수렴·원본 endpoint·공식 출력의 완료를 뜻하지 않는다. 현재 checklist는 미완료다.
## 전체 상태의 제한적 원본 관측과 연결
전체 high+low T6 `c49cae4`는 원래 시간 간격·INC를 바꾸지 않고 두 원본의 초기 상태와
증분1–3을 accept했다. Test-only typed stop으로 다음 증분 전에 종료해 prefix 상태를
관측했으며 native0·2/2를 전체 원본 완료로 보고하지 않는다. 메인이 전체 pair·full M/Mff,
모든1275 free r/Si·zero branch·HHT update·weighted old-r·실제 solve 보정을 exact Fraction으로
검산했다. 물리 비율 최대값은 선형3.12680e-20, 비선형1.3043731e-16이다.
Root 연결의 related49/49와 두 brick의 LIN/TL 전체 low 직렬/TBB 일치1/1은 native0이다.
최초 broad filter가 긴 전체 원본 smoke를 함께 선택한 실행은 의도적으로 중단했고
CTest exit−1로 보존했다. 완료하지 않은 실행을 수렴 실패로 해석하거나 현재 PASS에 합산하지
않는다. 공식 출력·101 endpoint·원본 비교·전체 회귀는 후속 검증이다.
## 점 수와 체적 정식화를 구분하기
실제 두 정적 원본은 CLI/schema 성공 뒤 U/RF/Gauss S가 모두 외부 기준에 실패했다.
Source identity와 point mapping을 확인하고 독립 표준 full8 조립/solve·회복을 대조한
결과 현재 구현은 승인된 수식과 일치했다. 같은8점이라는 이유로 Abaqus C3D8의 체적
처리까지 같다고 가정하면 차이를 입력 오류나 rounding으로 잘못 분류할 수 있다.
전체 요소의 원본 변위·응력을 사용한 hydro/dev 분리와 reference-volume 평균의 별도
energy/Hessian 후보가 차이를 설명하는 근거다. Stress만 평균화하거나 tolerance를 늘리는
수정은 energy/force/tangent 계약을 깨거나 실제 모델 차이를 숨긴다.
후보의 선형 수치 관찰과 production·비선형·동적 PASS를 분리해야 한다.
실제 metric과 변경 근거는 [verification](verification.md)·[변경안](reference-discrepancy-proposal.md)에 있다.
사용자는 이후2026-10-10 B로 체적 평균 energy 도입과 전체 재검증을 승인했다. 이전 실패와
후보의 일치를 보존하며 변경본의 내력·접선·절차·원본 검증 결과와 구분한다.
비교 도구의 `--references` 변경은 원본 보호 기준을 좁히지 않아야 한다. Report와
source/result의 hardlink·symlink alias도 보호하고, 잘못된 HDF rank는 failed precheck로
기록해야 한다. Source path는 writer와 같은 lexical 정규화를 사용하며 물리적 symlink
대상으로 identity를 바꾸지 않는다. 이 세 문제는 안전한 behavior RED와 최종124개 검사로 확인했다.
## 체적 평균 energy의 독립 oracle와 실패 해석
첫 weighted warped fixture는 weighted/unweighted 평균의 차이가 거의 없어 판별력이
부족했다. 형상과 비균일 변위를 수정한 oracle는 이전 pointwise 구현에서7/7 실패하고
새 식에서 통과했다. 독립 검증 fixture 자체의 실패를 production 수식 오류로 단정하지
않고, 실제 weighted 평균과 cross-GP Hessian을 판별하는지 먼저 확인한다.
중앙 차분 step sweep에서는 가장 작은 step에서 오차가 계속 줄어드는 경우도 있다.
최솟값이 반드시 중간 step에 있어야 한다는 가정은 정확한 접선을 실패시킬 수 있다.
Analytical energy 미분과 차분 오차·절단항을 함께 확인한다. 이전 실패 로그와 수정 후
150개 검사 및 시간수렴 기록은 [verification](verification.md)에 구분해 보존했다.
고정 두께1요소의 길이 refinement는 mean-bulk discretization의 continuum bias를
없애지 않는다. 두 축 지정 굽힘장 energy의 수렴과 고정 두께/폭 cantilever tip 추세를
서로 다른 증거로 기록한다. 두 결과를 평형해의 동일 공간차수 증거로 합치지 않는다.
@@ -1,168 +0,0 @@
# 고유치·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) 한 곳에 둔다.
@@ -1,262 +0,0 @@
{
"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"
}
}
@@ -1,150 +0,0 @@
# Hex8 numeric controls
행동/외부 acceptance 원본은 [PRD](PRD.md), 식은 [formulation](formulation.md)이다.
여기의 내부 tuning default는 독립 numerical review와 영향 재검증을 기록해 조정할 수 있다.
외부 [common-reference-tolerance](../TOLERANCE.md) 및 승인 physics/schema는 변경하지 않는다.
## 계산·형상 인증
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을 유지한다.
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)를 허용하지 않는다.
Depth default10, 처리한 cell budget default65536이며 uncertain 시 fail-closed다. 이 값은
resource/precision tuning이고 accepted geometry의 positive 조건을 완화하는 tolerance가 아니다.
현재 Xa+ua를 인증할 때 addition uncertainty도 포함한다. Failed trial은 immutable cache를 보존한다.
## 체적 평균 energy의 실행 계수와 누적
2026-10-10 승인된 B는 reference weights의 순서0..7을 유지해 V와 weighted trace를 누적한다.
Mu는 `E/(2*(1+nu))`, kappa는 `E/(3*(1-2*nu))`를 Float64로 직접 계산·finite positive
검증한다. Kappa의 exact-real identity인 `lambda+2*mu/3`를 실행값으로 빼기/더하기해
nu→−1의 큰 계수 취소로 bulk를 잃지 않는다. E/3을 먼저 계산하는 재배열은 실행 계수
계약이 아니다. Overflow/underflow로 supported positive 계수를 만들 수 없으면 실패하며
clamp·임의 material bound를 추가하지 않는다.
같은 저장된 F64 mu/kappa/weights/gradient를 paired 경로에 exact lift한다. V·mean trace·
dev strain·cross-point bulk outer product·energy/force/Kt/recovery의 pair를 중간에 F64로
접지 않는다. F64와 pair 모두 실제 relative kinematics의 동일 derivative를 사용한다.
Ghat의 partition sum만으로 finite rotation의 exact-zero를 보장하지 않으며 기하 완전성과
coefficient/graph roundoff를 분리해 검증한다. 새로운 수식 검증은 weighted mean vs center,
signed energy/force/tangent sweep, extra-null/conditioning 및 low-only bulk 응답을 포함한다.
기존 Newton·형상·시간수렴·수지 기준과 외부 비교 tolerance는 유지한다.
## 정적 Newton
Force residual numerator는 free residual infinity norm이다. 기존
`nonlinear_static_control.cpp::EvaluateResidualChannel`과 같이 free external infinity norm이
exact0이면 denominator=0의 absolute branch를 선택한다. External이 nonzero이면 같은 trial의
free internal/external infinity norm maximum을 relative denominator로 사용한다.
Translation correction numerator는 fresh free correction infinity norm, scale은 현재 증분의
free translation increment infinity norm이다. 기존 force/translation norm·branch 의미를 유지한다.
순수 prescribed 변위 문제에서 fint_free 자체를 denominator로 사용해 residual ratio가 항상1이
되게 만들지 않는다. Nonfinite/크기 불일치는 branch와 관계없이 실패다.
Relative branch limit1e-2, exact-zero scale branch absolute1e-3의 force 또는 length 단위다.
Max iteration100/increment가 default다. Moment/rotation dummy channel은 없다.
Raw norms·branch·threshold unit·iteration·passed를 기록한다. 수렴은 recovery/geometry까지
검증한 candidate에만 적용하며 normalized residual만 수정해 accept하지 않는다.
## 동적 Newton와 update
Residual은 physical free endpoint에서 평가한다. Componentwise uncancelled scale
Si=|(Ma)i|+|finti|+|Fi|, normalized metric은 max_i(|ri|/Si)다. Si=0은 ri=0을 요구하며
그 외의 zero branch는 failure다. Internal cancellation으로 작은 residual이 나온 것만 평가하지 않는다.
Weighted residual을 사용할 때도 physical endpoint와 동일한 scale/판정을 함께 기록한다.
L은 reference nodal bounding-box 대각 길이로 finite positive다. Correction u/L, h·dv/L,
h²·da/L, h²·dA/L를 모두 확인한다. Residual/correction limit1e-10, update equality1e-12,
max iteration100이 default다. Update scale은 동일 단위의 uncancelled formula term 합이며 scale0은
exact-zero다. 빈 free vector는 vacuous convergence이며 required prescribed/recovery validation은 유지한다.
### 이전 Float64 구현의 내부 정제 기록
검토된 별도 동적 구현 `f661864`는 위 판정을 유지하며 다음 정제를 사용한다.
관련76개 검사와 독립 코드 검토는 통과했지만 두 동적 원본은 세 번째 증분에서 실패했다.
이전 구현 `b394ae7`의 원본 실패와 변경 근거는 [lessons](lessons.md)에 기록한다.
아래는 이전 경로의 검토 기록이며 새 paired 경로의 실행 지침이 아니다.
새 경로는 [precision formulation](precision-formulation.md)의 전체 상태 Newton을 적용하고,
모든 원래 free 성분을 푼다. 이전 holding/history/ULP 탐색을 자동으로 이식하지 않는다.
물리 잔차가 통과한 좌표에서 sub-ULP 갱신 소실이 발생하면, 물리 잔차와 각 좌표의
fresh correction4개가 모두 통과한 좌표를 hold한다. 다음 반복부터 원래 effective tangent의
나머지 principal block을 푼다.
Holding은 새 BC나 equation 제거가 아니다. 다음 반복에서 해당 성분이 원래 물리 기준을
실패하면 즉시 다시 solve에 포함한다. 최종 판정은 항상 모든 원래 free 성분을 사용한다.
정체 판별은 잔차 최대 점수의 증가 대신 이미 실패한 Newton 진입 상태로의 복귀를 사용한다.
진입 tuple은 전체3N 변위·reactivation 전 holding mask·incoming correction4개다.
Physical FAIL 및 finite correction4개가 각각 PASS인 진입만 저장한다. 실제 다음 Newton의
전체 변위·freeze 후 mask가 정확히 같고 fresh correction4개도 각각 finite/PASS이면
동등한 실패 상태로 판별한다. Correction 숫자의 차이는 진단으로 남기지만 동일성을 요구하지
않는다. 숫자 자체는 정상 Newton의 rates·tangent·rhs에 사용되지 않는다는 검토에 근거한다.
고정 증분의 M·하중·이전 accepted state·predictor 및 결정적인 fresh solve/탄성 local
recovery가 전제다. History는 증분 시작에만 초기화하고 실제 ULP 이동 후에도 유지한다.
Prospective physical PASS, correction FAIL 또는 새로운 전체 변위/mask는 정상 Newton을
유지한다. 별도 history cap이나 threshold는 없으며 기존100회 제한으로 기록 수가 제한된다.
이는 알려진 실패 상태의 재방문을 감지해 내부 정제를 시도하는 선택이며 전체 알고리즘의
수렴 보장은 아니다. 실제로 개선하는 이웃이 없으면 기존 Newton 경로를 유지한다.
재현이 확인된 경우에만 각 free 좌표의 양·음 방향 한 ULP 이웃을 예측한다.
물리 관성력 변화는 `M*delta_u/((1+alpha)*beta*h^2)`, 내력 변화는 `Kt*delta_u`로
분리하여 모든 free 성분의 예측 Si를 계산한다. 유한하며 원래 최대 점수를 줄이는 이웃을
점수·source DOF 순서로 검사하고 방향 tie는 음 방향을 먼저 둔다. 예측 성공은 수용이 아니다.
각 trial은 같은 원래 candidate에서 실제 rates·형상·내력·모든 원래 Si·update·weighted
identity를 재계산한다. 앞의 trial이 개선하지 못해도 이후 후보를 검사하며 evaluator 실패는
그대로 실패다. 실제 전체 최대 점수의 엄격 감소를 확인한 이동만 local candidate에 반영한다.
이동량의 correction4개를 기록하고 다음 정상 반복에서 모든 원래 최종 조건을 다시 검사한다.
원래100회 제한을 유지하며 별도 residual floor·clamp·projection을 두지 않는다.
## Eigen 검증과 분류
Vector norm은 Euclidean, matrix norm은 Frobenius로 original free pencil을 평가한다.
eta_r=||Kphi−lambda Mphi||/((||K||F+|lambda|||M||F)||phi||2),
eta_norm=|phiᵀMphi−1|,
eta_energy=|phiᵀKphi−lambda phiᵀMphi|/((||K||F+|lambda|||M||F)||phi||2²)다.
Zero denominator는 numerator exact0이면0, 아니면 failure다. All returned-pair limits는1e-10.
eta_gram은 ||PhiᵀM Phi−I||F, max_eta_orth는 normalized off-diagonal maximum이고 limit1e-10다.
분류 scale=max_i |Kii|/Mii는 finite positive여야 하며 default normalized near-zero1e-9,
인접 cluster gap1e-8이다. 유의한 negative lambda는 실패한다. Near-zero negative는 원 값으로
남기고 frequency를 만들지 않는다. 이 분류 scale은 FEAST interval upper bound가 아니다.
실제 search/count·SPD/roundoff budget은 backend 연결에서 검증하며 최저 N 보장 근거를 기록한다.
## 독립 local/temporal 검사의 수치 기준
Zero 기대량에는 임의 absolute floor 대신 same-unit uncancelled term scale 또는 수식에 따른
strain/force/energy scale을 사용한다. Initial invariant budget은 double eps와 연산 길이·geometry
condition 추정에 비례하는512 eps scale이다. Scale0은 exact-zero다. Conditioning 때문에 budget이
물리 결함을 가릴 정도로 커지면 검사를 통과시키지 않고 모델/검사 유효 범위를 보고한다.
Directional difference는 signed direction과 h sweep으로 truncation/roundoff 구간을 확인한다.
기본 목표는 유의한 nonzero oracle scale에 대해 gradient/tangent 최적 구간 relative1e-7 이하다.
한 h에서 가까운 값만 고르지 않고 예상 error curve·analytic affine 사례·zero-state linear limit를
함께 확인한다. 필요 budget 수정은 oracle conditioning과 independent review evidence로 설명한다.
HHT temporal case는 analytic/manufactured u/v/physical a를 각각 평가한다. Smooth forcing 구간의
기본 목표는 h/h2/h4에서 observed order1.8 이상이며 noise floor에 가까운 quantity는 다른 유의한
case/time/step 범위로 검사한다. Knot를 가로지른 비매끄러운 forcing을 smooth-order 증거로 쓰지 않는다.
Spatial refinement·locking은 수렴 경향과 적용 한계의 검사이며 reference tolerance를 재정의하지 않는다.
## 원본 비교
Reference-only S/B, row5%, RMS1%, exact-zero는 common policy를 따른다. Identity/finite/completeness
오류를 tolerance로 처리하지 않는다. Stress point 좌표는 출력 precision에 따른 auxiliary convention
검사이며 ID matching은 element/IntPt다. Input/CSV raw SHA는 현재 working-tree byte 기준이며
Git LF blob과 Windows CRLF bytes를 혼동하지 않는다. 실제 읽은 원본 byte identity를 evidence에 남긴다.
@@ -1,487 +0,0 @@
# 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는 없으나
필수 원본/입력 계약 충돌은2026-10-09 사용자 선택 A로 해소했다. 구현 전 문서 blocker0이며
실제 solver 수치 PASS가 아니다.
## 2026-10-09 — 승인된 high+low의 한정된 검토
`hex8_t5_numerical_spec` reviewer가 [precision formulation](precision-formulation.md)과
실제 shared arithmetic·paired kernel·geometry를 독립 검토했다. Canonical zero와 scalar
−0 lifting의 두 결함은 수정했고 native fixture로 검증했다. 동일 상대변위 gradient의 chain
rule, isotropic material Hessian·geometric 항·Cauchy 복구와 full X+high+low interval은
일관된다. 산술의 실제 graph bound와 exact-dyadic 기대값을 별도로 검토했으며 native6/6
산술 검사 로그를 확인했다. 해당 범위 bounded PASS이며 새 actionable finding은 없다.
일반 correctly-rounded106-bit 보장이나 T6 전체 state/시간수렴/원본 PASS가 아니다.
T6 consumer·backend·worker 경계와 rollback은 해당 구현이 고정된 후 별도 검토한다.
이후 같은 reviewer가 optional immutable paired-linear Hessian cache를 검토했다.
동일 graph·선형 force/energy/recovery·비선형 trial Hessian·기존 F64 Create 지원을 유지하며
native44/44 원시 로그를 확인했다. 이 캐시 변경도 bounded PASS다.
## 2026-10-10 — 전체 동적 상태와 원본 세 증분의 제한적 검토
동일 독립 reviewer가 고정된 T6 `c49cae4`의 predictor/rates, 기준 M의 전체 pair 작용,
ordered force/tangent 누적, full residual·scale, 실제 old residual을 포함한 weighted 식,
fresh solve와 실제 상태 변경의 네 보정 채널, backend/worker 이후 실행 전제 검사,
accepted low의 복사·검증·rollback을 검토했다. 원시73개 inventory와 owned/shared source,
binary·patch의 hash를 확인했고 해당 consumer 범위 bounded PASS, actionable finding0이다.
Current32/32 검사와 과거 temporal4/5 실행의 성공 사례를 구분한다.
이후 변경하지 않은 두 원본의 초기 상태와 증분1–3을 관측했다. 원래 h=0.1,T=10,INC=100,
1326 full/1275 free/51 constrained를 유지하고, 네 번째 증분 local 계산 전 test-only 예외로
종료했다. 관측 native0·2/2는 이 종료 조건의 성공이며 전체 해석 완료가 아니다.
메인은51개 raw artifact의 hash/크기를 확인한 뒤 두 binary64 성분을 exact dyadic Fraction으로
읽어 모든 상태의 normalization, 실제 Mff의 full M restriction, 원래 모든 free 성분의
물리 r/Si와 exact-zero, HHT 세 update 식과 weighted old-r 항등식을 독립 재계산했다.
Exact CSR M 작용으로 재계산한 물리 비율의 최댓값은 선형3.12680e-20,
비선형1.3043731e-16으로 승인1e-10 이내다. Update·weighted identity는1e-12 이내이며
초기1275개 free row는 모두 exact0이다. 실제 PARDISO 보정의 선형6회·비선형9회 기록으로
Newton 시작값인 이전 accepted u부터 최종 u를 재구성하고, fresh/observed 네 보정 채널도
각각 확인했다. 비선형 최대 보정 비율1.01046e-13은 승인1e-10 이내다.
Storage graph 대조의 별도 절대 오차 budget과 물리 gate를 혼동하지 않는다. Exact M 작용과
저장된 pair Ma의 상대 차이는 최대2.88e-32였다. Strict physical gate에 floor를 추가하거나
high만으로 full 상태를 대신하지 않았다. 재현 자료는 로컬
`.harness/hex8-evidence/precision/{prefix3-frozen,prefix-independent.json,check_prefix.py}`다.
Root 연결 후 관련49/49 검사의 native build/CTest는0/0이다. 이어 두 brick의 LIN/TL 직렬·TBB
전체 low 필드 일치와 실제 nonzero low를 확인한 focused1/1 검사도0/0이다.
최초 넓은 filter가 전체 원본 smoke를 선택해 중단한 실행은 CTest exit−1로 보존하며
수렴 실패 또는 통과로 해석하지 않는다. 전체101 endpoint·공식 HDF5·원본 비교는 아직 없다.
동일 독립 reviewer가 메인의 Fraction checker 전체를 정적으로 검토하고 frozen51개 자료에
읽기 전용으로 재실행해 결과가 정확히 같음을 확인했다. Oracle 수식 오류는 발견하지 않았고
source-prefix bounded PASS를 반환했다. 저장값 비교의2^-90 budget을 모든 범위의 primitive
graph/106-bit 정확도 보장으로 확대하지 않는다. 이 검산은 accepted 상태와 실제 반환 du를
확인하며 중간 각 solve의 Kt/Keff·RHS 방정식 잔차를 별도로 증명한 것은 아니다.
## 공식 결과·prepared/CLI 연결의 독립 검토
작성자 행동본 `9144eef`와 public header 직접 include·Doxygen만 보완한 후속본 `63cfdd0`을
독립 reviewer가 검토했다. Typed Solid static/frequency/dynamic outcome, 실제5절차 dispatch,
source warning, static 실제2채널·dynamic scalar 로그와 로그 실패 우선순위를 확인했다.
HDF5 field·dtype/endian/UTF-8·shape·source identity·units, 전체 pair 검증 이후 RN64 출력,
callback 이후 산술 환경, 실제 writer/reader checked-close·readback·atomic replace와 기존
final 보존을 확인했다. Rounded 배열에서 물리 gate를 다시 계산하지 않는다.
요청 mode 뒤의 backend pair에는 차원 상한·정렬·유의 음수 lambda 검증이 빠져 있었다.
전체 pair 수를 free 차원 이하로 제한하고 T5와 같은 `lambda/scale>=-1e-9` 정책을 적용했다.
실제3-free/request1 API 결과에서 요청 밖 row를 음수·역순·차원 초과로 각각 변형해
서로 다른 거부 원인과 기존 final byte 보존을 확인했다. Raw near-zero 음수를0으로
바꾸거나 그 frequency를 생성하지 않는다. 이 finding은 해소됐으며 잔여 actionable finding0이다.
행동본의 실제 native build/CTest는0/0, 관련101/101 PASS·112.60s다. Header-only 후속본은
전체 configured 대상 recompile0 및5절차 API/schema1/1 PASS·9.88s이며101개를 후속본에서
다시 실행한 것으로 보고하지 않는다. 메인 `e2c3c5b`는 같은13개 owned blob과4개 CMake
등록을 연결했고 관련17/17을 native build/CTest0/0·72.95s로 확인했다.
원시114개 SHA/크기와 source13개 committed blob/snapshot 일치를 reviewer와 메인이 각각
확인했다. 로컬 자료는 `.harness/hex8-evidence/{t7-output-frozen,t7-integrated}/`다.
이 판정은 T7의 bounded PASS다. 전체780개 CTest·공식 원본 CLI 수치 비교·기능 완료와
release PASS를 뜻하지 않는다.
## HEX8-NR-001 — 영 회전 경계와 필수 원본 충돌
검토 당시 PRD008/I/O는 BC/CLOAD DOF4–6을 값0이어도 거부했다. 그러나 모든 필수 INP에
`Set-1, 4, 4`, `Set-1, 5, 5`, `Set-1, 6, 6`의 생략된 영 지정값이 있다.
Static2/frequency는794–796행, dynamic2는796–798행이다. Read-only 원본을 그대로
사용하면5개 모두 input failure이므로 end-to-end integration/필수 비교를 진행할 수 없다.
원본의 영 회전 BC만 warning/no-op으로 수용하는 입력 호환 예외와, strict 거부를 유지하고
사용자가 원본을 수정하는 두 대안을 제시했다. 2026-10-09 사용자는 A를 승인했다.
PRD008/I/O를 zero rotational displacement BC만 source warning/no-op으로 수용하는 한정된
호환 예외로 수정했다. 비영 회전 BC·모든 회전 CLOAD는 계속 거부하고 원본을 보존한다.
따라서 문서 blocker는 해소됐으며 구현에서 경고·실제3N·거부 경계를 테스트해야 한다.
동일 독립 reviewer가 승인된 수정 부분만 bounded recheck했고 `blockers: []`를 반환했다.
정적 읽기 확인 exit0이며 수식 재검토·code 변경·solver 실행은 하지 않았다.
## 독립 검토에서 정리한 내용
초기 static convergence 문서의 max(internal_free,external_free) branch는 prescribed-only에서
residual=internal_free라 ratio1을 만들어 수렴을 막을 수 있었다. Draft를 기존
`EvaluateResidualChannel`의 external_free exact0 absolute branch로 수정했다. Reviewer는 수정 후
기존 source219–246과의 일치를 확인했다. 승인 physics/schema/external acceptance는 바꾸지 않았다.
Reviewer의 독립 표준-library 산술 확인은 exit0이며 TL tangent relative 최적 오차 약4.59e-11,
Bernstein27 재구성 최대오차7.77e-16, mass Walsh 최소 모드값.03703703703703707≈1/27,
scalar HHT u/v/physical a 관측 차수 약2.00/1.98–1.99/2.00이었다. 초기 NumPy 계산은 모듈
부재로 exit1이었고 표준-library 계산으로 대체했다. 문서/코드/원본 읽기 명령은 exit0,
glob discovery 검색 하나는 exit1이었다. File edit/build/test/external solver 실행은 하지 않았다.
이 숫자는 문서 식의 독립 산술 확인이며 production kernel/backend/mesh 검증 evidence가 아니다.
TL energy/Hessian·engineering/tensor shear, degree(2,2,2) Jacobian 인증, mass SPD와 real/FP bound
구분, original generalized K/M·최저 N, HHT a/A·weighted/endpoint tangent·초기 force/physical
reaction, typed/HDF5·failed accepted 보존에는 문서 수식의 추가 blocker가 없었다.
검토해야 할 주요 위험은 다음과 같다.
- J0의 column/gradient 변환과 point3/4·7/8 순서; det J polynomial Bernstein 변환과 outward
interval/subdivision이 whole-cell 양성을 보증하는지, uncertain/resource failure가 보수적인지.
- TL energy variation에서 material/geometric tangent의 index와 work conjugacy,
rigid rotation/strain objectivity·zero-state 선형극한과 unaveraged Cauchy/Green recovery.
- 8점 consistent M의 SPD·총질량·reference 상수성·local spectral bound와 실제 sparse pencil
roundoff/control의 구분; Shell null/nodal whitening 미사용 및 lowest-N count 검증.
- HHT auxiliary/physical acceleration·weighted/endpoint residual의 동등 조건·tangent scale,
initialization/amplitude endpoints·physical reaction·u/v/a 시간수렴과 numerical dissipation.
- Static/Newton의 approved defaults·force/length 단위·zero-scale branch, internal oracle budget과
외부 reference acceptance 분리, geometry/finite/recovery 이후 atomic state/output commit.
- Original required U/RF/Gauss S·dynamic101 frame projection·frequency 미제공 상태를 정확히
구분하는지. Coordinate sanity 확인을 stress/reference correctness로 승격하지 않는지.
이 risk는 이후 실제 interval primitive/subdivision·brick/warped oracle·tangent step sweep·
generalized runtime/count·prescribed-only state·HHT mesh 시간수렴·formal HDF5/reference 사전검사로
검증해야 한다. 아직 실행하지 않은 solver build/test/reference를 PASS로 적지 않는다.
## T8 비교기 독립 검토와 실제 원본 불일치
Frozen author `0b93c0c59cf64db44003ebe5217a4efb8307a8ba`는 bounded PASS,
추가 actionable code finding0이다. Root 연결은 `317fe5c`다. Reviewer는 별도로 네 owned
LF commit blob/current/snapshot과 manifest·65 raw artifact의 hash/size, 양 checkout의
원본13 SHA를 확인했다. Actual stdout/JUnit에서124/124(Hex8 83·기존 HHT 41),
failure/error/skip0·native0·81.41s를 확인했다. 일부 초기 로그의 count가 원시 stdout으로
증명되지 않았던 한계는 최종 raw closure로 해결했으며 과거 native 기록은 유지한다.
실제 발견하고 behavior RED 후 수정한 사항은 alternate reference 선택 시 기본 원본을
report로 덮어쓸 수 있던 보호 누락, scalar modal pair의 rank 검사 전 IndexError,
`..` lexical path가 같은 scratch의 C++ source identity와 달라지던 문제다.
Default/selected reference·input/result/record와 symlink/hardlink alias 보호, Dataset/1D
검사, C++와 같은 lexical 절대경로 정규화와 targeted5 regressions를 확인했다.
두 정적 공식 HDF5는 source/schema/model/point/frame/finite precheck PASS·CLI native0이나
세 수치 family FAIL이다. Reviewer의 독립 standard full8 조립·회복·반력/에너지와 정식
비교 metric이 일치했다. Frequency 공식 readback의 precheck와 missing Value NOT RUN을
분리한다. Whole configured Python은 기존 collection5 오류로 native2·실행0개이며 PASS가 아니다.
실제 수치는 [verification](verification.md), 물리 모델 차이는
[변경 근거](reference-discrepancy-proposal.md)에 있다. 그 변경안의 energy 미분과 선형
후보 배열의 independent K/S/energy·U/RF/S 수치 관측도 검토했지만 production 채택이나
비선형·동해석 일치 검증은 아니다. 전체 CTest와 남은 동적 원본은 이 bounded 판정 밖이다.
Root 보존 자료는 로컬 `.harness/hex8-evidence/t8-comparator-frozen/`, 독립 full8 원시
재현은 `t8-independent-full8-audit/`, 후보 계산/수식은 `t8-reference-law-investigation/`다.
## 2026-10-10 체적 평균 energy 변경 전 실행 종료와 수식 검토
이후 두 frozen API 원본은 unchanged101 endpoint를 자연 종료(native0)했고, 다섯 공식
CLI도 native0으로 종료했다. 두 동적 공식 HDF5의101-frame precheck는 PASS이나 외부 U는
각각88/101 family FAIL이다. 전체780 CTest는 native8:777 PASS·2 FAIL·1 SKIP이며,
추가163개는 모두 PASS이고 기존 예외의 status·metric body가 동일하다. 상세 raw 경로와
실패 수치는 [verification](verification.md)에 있다. 이 종료 결과는 이전 pointwise 식의
evidence이며 승인된 변경본의 numerical PASS가 아니다.
사용자 B 승인 후 reference-volume 평균 Green trace energy의 독립 정적 수학 검토에서
내력·전체 Hessian, cross-GP `kappa*b*b^T/V` 및 `S*:delta²E` 기하항의 일관성을 확인했다.
직접 F64 mu/kappa를 검증하고 pair로 lift하며, relative kinematics와 같은 Ghat derivative를
쓰는 선택을 확인했다. 이전 affine 응답과의 수학적 일치는 동일 mu/kappa/Ghat 전제다.
실제 rounded cache의 affine completeness와 partition sum을 혼동하지 않는다.
Nonuniform trace·warped weighted mean·node0 방향 미분·LINE/TL zero Hessian·low-only bulk
응답·material 경계·새 spatial/temporal evidence는 변경 구현에서 검증해야 한다.
## 체적 평균 구현의 독립 검토
Frozen `b2abd739`의8개 변경 source/current snapshot/commit blob과141개 종료된 raw
artifact의 hash·size를 독립 대조했다. 두 pass의 weighted trace, node0 상대변위와
동일 Ghat derivative, cross-GP bulk Hessian, `S*` 기하항 및 actual strain의 Cauchy
복구가 승인된 energy와 일치한다. Paired 계산은 같은 연산에서 low 성분을 보존하고
직접 F64 mu/kappa의 동일 lift를 사용한다. LINE zero cache도 같은 Hessian이다.
이전 식에서 실패하는 corrected7-oracle RED와 변경본150/150, 시간수렴4물리 사례,
최종 실제 재컴파일3/3의 native 기록 및 소스 전후 SHA를 확인했다. 최소 u/v/physical a
관측 차수1.98022가 기존 기준1.8을 충족한다. 판정은 이 구현·내부 evidence에 한정한
bounded PASS, 잔여 actionable finding0이다. Root 연결 `18b36c1`의 실제 재컴파일
관련65/65도 native0이다. 전체 CTest·원본 비교의 실제 종료 결과는 [verification](verification.md)을 따른다.
공간수렴은 두 축을 실제로 세분화한 지정 굽힘장의 energy다. 고정 두께/폭2요소의
평형 cantilever 길이 refinement는 tip 추세와 locking 관찰이며 평형해 공간차수를
입증하지 않는다. Brick rank18과 검증된 warped cell은 모든 admissible warped cell의
영공간 보증이 아니다. 원본 modal Value 부재나 기존 전체 회귀 예외는 이 bounded
검토로 없어지지 않는다. 원시 자료는 작성자 worktree의
`.harness/hex8-evidence/mean-volume/frozen-b2abd73/`와 관련 종료 evidence에 있다.
새로 종료한 실제 정적·고유치 실행의 별도 evidence audit에서도 finding0이다. Imported
8개 source가 frozen commit과 같고 root kernel object가 실제 재컴파일됐으며 frozen/current
실행 파일 SHA도 동일하다. 원본13개 및66개 소비 artifact의 전후 SHA를 확인했다.
HDF 실제 배열과 원본 CSV로 정적 보고서의 모든 행·near-zero/relative 분기·오차·RMS를
다시 계산했으며 U1326/RF51/S14400의 실패0과 양쪽 비교 native0을 확인했다. 전체
RF442행의 identity·finite·free RF exact0도 대조했다. Frequency missing Value의
native2·NOT RUN, root65 검사 native0, 새 전체 Python collection5/native2를 정확히
구분했다. 자료는 `.harness/hex8-evidence/mean-volume/final-evidence-audit-static-frequency/`다.
이 evidence audit은 당시 미종료였던 동적·전체787 검사의 판정이 아니며, 이후 종료 감사와 구분한다.
이후 자연 종료한 새 선형 동적 원본도 별도 read-only evidence audit에서 bounded PASS,
finding0이다. CLI/comparator native0, HDF SHA와 원본13 SHA, frozen executable 및31개
소비 artifact의 전후 SHA를 확인했다. 원본44642개 node row, HDF101×442×3 및 비교
보고서133926개 scalar가 정확히 대응하며 누락·중복·비유한 값은0이다. Increment0–100,
CSV decimal time와 HDF `double(n)*h`를 구분해 확인하고 모든 행의 오차·분기·기준·RMS를
재계산했다. 초기 exact-zero family의 relative RMS null은 실패나 누락이 아니다.
101개 family PASS·실패 행0과 [verification](verification.md)의 수치가 일치한다.
자료는 `.harness/hex8-evidence/mean-volume/final-evidence-audit-dynlinear/`다.
비선형 동적·전체787 및 동적 물리 수지는 이 수치 비교 감사 밖이다.
비선형 동적 원본의 종료 evidence도 별도 read-only audit에서 bounded PASS,
finding0이다. 45개 소비 artifact의 전후 SHA와 원본13개 보존, CLI/comparator native0을
확인했다. 모든101 frame·133926 scalar의 시간·identity·finite·오차 분기·기준·RMS를
독립 재계산했으며 누락·중복·실패 행은0이다. 최대 상대 RMS는
0.003133373067174733, 최대 절대 오차는1.3397499223151595e-5이며 초기 exact-zero의
relative RMS null도 확인했다. 다섯 원본 CLI와 queue wrapper의 native0 및 source 전후
동일성을 확인했다. 자료는
`.harness/hex8-evidence/mean-volume/final-evidence-audit-dynnonlinear/`다.
전체787의 종료 판정과 비선형 동적 물리 수지는 이 감사에 포함되지 않는다.
## 변경본 전체 회귀 종료의 독립 감사
실제 unfiltered 전체787 CTest의 종료 raw/native·discovery 및 baseline617개를 별도
read-only 감사했다. configure/build/discovery는 native0, CTest는 native8이며
784 PASS·기존 Shell FAIL2·C04a SKIP1이다. 이름·기존 상대순서·각 discovery와 실행
ordinal·status를 대조했고 추가170개 모두 PASS·뜻밖 예외0을 확인했다. 두 실패의
전체 출력은 elapsed-ms 표기만 제외해 정확히 같아 실패 내용과 metric도 동일하다.
SKIP 상세 출력은 baseline에 없어 NOT VERIFIED다. 소비22개 artifact SHA를 전후
대조했고 실제 세 테스트 실행 파일의 중간 관측·종료 SHA도 동일하다. 이를 실행 전
binary hash라고 표현하지 않는다. 감사 native0·finding0, bounded evidence PASS다.
원시 자료는 `.harness/hex8-evidence/mean-volume/final-evidence-audit-full/`에 있다.
판정은 종료 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 수정 없이 읽기 전용 감사와 보고서 정적 검토만 수행했다.
@@ -1,122 +0,0 @@
# 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)를 따른다.
@@ -1,197 +0,0 @@
# 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는 없지만 원본 비교·전체 기능 완료의
판정은 아니다. 현재 checklist는 PRD에만 둔다.
## 확인한 결과와 계산
| 범위 | 독립 근거·결과 |
| --- | --- |
| 강체 병진·축·scale | 단위 brick의 밀도2에서 총질량2, mass row sum0.25다. 절점당 힘0.25는 a=1을 준다. 세 축×세 하중 크기의 실제 모든 endpoint 검사 PASS |
| 관성 반력 | 독립 consistent M의 constrained coupling과 Q=Ma+f−F를 대조한다. All-constrained Fy=7에서 Qy=−7, a=0, W=0 검사 PASS |
| 독립 oscillator | m=2/27, Kii=8/3, Kij=0.8의 해석적 모드 분해로 u/v/physical a를 대조한다. SDOF와 MDOF의 최소 관측 차수는1.98637·1.96518로 기준1.8 이상 |
| 두 brick의 LIN/TL | 모든 u/v/physical a의 관측 차수는 대략2다. 제조 TL의 최종 회전49.7727°, Green principal strain0.00697372, detF1.02099395는 유한회전·작은 strain 범위다 |
| 운동량·모멘트 | 독립 brick 질량 적분으로 T/p/pdot/L/Ldot와 symmetric M의 Σv×Mv=0을 검사한다. 자유 잔차를 포함한 수지와 LIN/TL의 서로 다른 reference/current arm 의미를 확인 |
| 에너지·한계 | alpha0의 trapezoid work와 무하중 tail 에너지 보존, 무하중 exact rest 검사 PASS. Full-integration 굽힘 locking의 큰 coarse-mesh 오차는 적용 한계로 유지 |
제조하중은 production K/M/quadrature를 호출하지 않는 polynomial brick 적분이다.
각 refinement의 HHT endpoint에 동일한 매끄러운 함수 값을 공급한 시간수렴 증거이며,
일반 비매끄러운 tabular amplitude의 수렴 보장은 아니다. 위 TL strain/stress/energy의
해석적 sanity 계산 자체를 실제 point 출력의 수치 비교 PASS라고 표현하지 않는다.
## Evidence의 시점과 제한
Frozen T6 source는 `c49cae499d8b965fdaa74bca9792f65f18843ec7`, shared kernel은
`e878379`다. Current affected native build/CTest exit0/0,32/32 PASS다. 처음 uncached
temporal 실행은4/5 PASS·CTest exit8이며 실패는 이전 principal trace assertion이었다.
그 실행의 실제 LIN/TL·독립 SDOF/MDOF 시간수렴 양성 결과를 current32개에서 다시 실행한
것으로 표현하지 않는다. Current의 이전 두 실패는 Float64 shadow와 initial mass record 수의
진단 assertion을 수정한 것이며 physics acceptance 완화가 아님을 frozen diff로 확인했다.
원시 로그·73개 inventory·source/binary hash는 로컬
`.harness/hex8-evidence/precision/t6-frozen-c49cae4/`에 보존한다. 메인이73개 raw와
owned/shared source·원본 두 INP·binary·patch hash를 대조했다. Reviewer는 관련22개 raw와
7개 owned source·patch를 별도로 대조했다.
첫32개 검토 이후 원본 prefix의 전체 pair를 아래와 같이 별도 재계산했다. 전체101 endpoint·
필수 reference 비교는 아직 없다. Rounded observable 불변량 검사와 전체 pair의 production
gate 통과를 구분한다. Alpha−0.05의 장시간 에너지, warped dynamic mesh,
near-incompressibility 및 큰 strain StVK 적용은 이번 evidence로 보증하지 않는다.
## 원본 초기 상태와 세 증분의 독립 물리 계산
변경하지 않은 LIN/TL 두 원본의 초기 상태와 증분1–3에 대해 reviewer가 모든 high+low를
exact Fraction으로 읽었다. 기준 CSR M·reference X·실제 full force를 사용해 T/W/balance,
p/pdot/L/Ldot, reference/current/free-residual moments와 global force/moment 수지를
총240개 대조했다. 실제 pair Add의 discarded-tail bound를 전파한 별도 절대 graph budget
내였으며 재생 graph의 high/low도240/240 일치했다. 구속 u/v/a/A와 support work는 exact0다.
Source442절점·300연결·51구속·하중·원래 h/T/INC와 test-only 관측 종료 조건도 대조했다.
선형 U와 독립0.5uᵀf의 최대 절대차는1.30e-29였다.
Captured F64 M의 ordered coefficient에는7752개의 비대칭 entry가 있고
최대|Mij−Mji|=2.84217e-14다. 이에 따른 exact Σv×Mv의 작은 비영 값은512eps same-unit
coefficient-roundoff budget 이내이며 이 비대칭으로 정확히 설명된다. Pair 산술 오류와
계수 오차를 구분하고 M을 대칭화하거나 모멘트를0으로 보정하지 않는다. Ldot=x×Ma는
같은 endpoint의 계약 observable로 확인했다. LIN의 current internal moment는 O(u²)로
비영이며 TL의 reference moment도 별도0 기대량이 아니다.
Alpha−0.05의 frame별 energy balance는 관측량이지 exact conservation gate가 아니다.
Prefix에서 나타난 balance와 진동에 따른 trapezoid work 감소를 그대로 보존한다.
이 범위에서 물리 blocker는 없다. 재현 자료는 로컬
`.harness/hex8-evidence/precision/physics-prefix-review/`와 `prefix3-frozen/`다.
직접 읽어 고정한 기준 Ga(a>0)·wg·Lamé 계수와 전체 pair 상대변위로 LIN/StVK energy
polynomial도 독립 계산했다. 양쪽4개 frame의 U는 모두 실제 graph bound 이내이고
high/low 재생값도 일치했다. LIN/TL 최대 절대차는1.19926e-29/2.96343e-30,
최대 graph bound는1.98236e-28/2.04184e-28이다. 모든 적분점의 detF는 대략
[0.999980558,1.000019725], strain 최대 성분은 약2.4105e-5로 이번 작은 변형률 범위에 있다.
독립 polynomial oracle에서 구한 strain/Cauchy stress의 RN64는230400개 공개 성분과
일치했다. Point tensor low는 capture하지 않았으므로 full-pair tensor 저장 검증은 아니다.
이 검사는 적분점의 확인이며 전체 cell 양성 인증의 독립 재검증을 대신하지 않는다.
Reviewer의 최종 판정은 frame0–3에 한정한 물리 PASS, blocker0이다. 별도 cache raw42개의
hash와 크기는 메인이 대조하고 `reference-cache-frozen/`에 보존했다.
## 실제 선형 정적 원본의 독립 평형과 구성식 대조
공식 CLI 결과 `e2c3c5b`를 기존 원본 형상·BC·하중으로 별도 standard full8 조립/solve했다.
Native 변위와 독립 해의 상대 최대차1.75e-11, 자유 잔차/하중5.15e-12,
구속 RF 최대차4.07e-10 force, stress 최대차4.01e-7 stress-unit,
strain 최대차1.51e-18이다. Energy178.762694318679와0.5F·u178.762694317263은
상대차 약7.92e-12다. Force·reference-arm moment와 free RF exact0도 별도로 관찰했다.
이는 정적 해의 독립 물리 진단이며512eps 동적 invariant gate 통과를 새로 주장하는 것이 아니다.
원본 CSV 변위를 같은 승인된 full8 K에 대입한 자유 잔차 최대값은87147.6514 force,
0.5u·Ku와0.5F·u의 상대차는 약4.72%다. 원본이 다른 체적 모델을 쓰는 경우 이 대입은
그 모델의 평형 검사가 아니므로 원본 오류로 단정하지 않는다. 요소 평균 trace를 사용한
별도 선형 energy 후보는 U/RF/S와 매우 일치했다. 원본·현재 구현·후보 계산의 scope를
[변경안](reference-discrepancy-proposal.md)에서 분리한다. 이 조사로 현재 필수 비교 FAIL,
후보 비선형·고유치·동해석 미검증이나 원본 Value 부재를 없애지 않는다.
원시 재현 script/stdout/JSON·native exit와7파일 전후 SHA는 로컬
`.harness/hex8-evidence/t8-independent-full8-audit/`에 있다. Solver 재실행 없이 기존
결과를 재분석했으며 production/reference를 수정하지 않았다.
## 2026-10-10 변경 전 실행 종료와 후속 물리 검증
이후 pointwise 구현의 두 API 원본과 두 공식 동적 CLI는101 endpoint/frame을 자연 종료했다.
이는 앞선 frame0–3 독립 물리 검토의 범위를101개로 자동 확대하지 않는다. 공식 원본 U
비교는 두 경우 모두88/101 family FAIL이며, 실행·정밀도 gate·외부 일치를 구분한다.
완료된 전체780 CTest에서도 기존 Shell 시간수렴 실패2개와 SKIP1개가 그대로다.
상세 종료 결과는 [verification](verification.md)에 있다.
사용자 B가 승인한 체적 평균 energy는 다섯 절차에 적용하며 변경본의 평형·수지·시간 및
공간수렴을 다시 확인한다. 두께를 한 요소로 고정한 bending refinement에서는 평균 trace
항 때문에 이전 pointwise continuum에 대한 bias가 남을 수 있다. 그 discrete limit 관찰을
실제 두께/길이 공간수렴으로 보고하거나 기준을 새 limit로 바꿔 continuum PASS라 하지 않는다.
선형 원본에 맞춘 별도 후보와 수식 검토는 변경본 물리 검증을 대신하지 않는다.
## 체적 평균 변경본의 실제 정적 원본 물리 대조
Root `18b36c1`의 새 공식 HDF5를 별도 산술로 재구성했다. Solver 재실행·추가 solve
없이 원본 geometry·하중·BC와8개 reference 가중치에서 동일 mean energy의 구성식,
element force·moment 및 전역 full residual을 계산했다. 두 원본 비교의 전 row PASS는
[verification](verification.md)에 있으며 여기의 물리 판정 범위와 구분한다.
선형300개 요소의 실제 strain·stress 최대차는1.23937e-18/1.91798e-7이고 구속 RF
최대차1.746e-10 force다. Native energy186.35946178395656과 독립 energy의 상대차는
6.10e-16, `0.5F·u`와의 상대차는8.408e-13이다. 자유 잔차 최대2.604e-7 force를
포함한 전역 ledger의 force/reference moment 잔여는7.493e-11/1.352e-10 이하다.
Local force/moment의 uncancelled 비율은2.45e-16/4.24e-16 이하다. 실제 trace의
요소 내 분포를 보존하면서 동일 요소 hydro stress는 평균 trace 식과 일치한다.
비선형10개 frame의300개 요소를 모두 재구성했다. Actual Green·Cauchy 최대차는
9.17972e-20/1.33878e-8 stress-unit이고 native/독립 energy의 상대차는9.42e-16
이하다. 최종 native energy186.3185317087937이다. PK2 hydro 항은 요소별 평균이며
actual Cauchy hydro는 F/J mapping 때문에 요소 내 변한다. Actual Green을 평균
strain으로 치환하지 않았다. Local force/current moment 비율은2.28e-16/6.75e-16
이하이고 전역 free residual을 포함한 ledger 잔여는3.12724e-10 force/
6.46502e-10 force·length 이하다.
비선형 최종 free residual 최대35.3467066284 force는0이 아니다. 독립 재구성과의
최대차는2.24691e-9 force다. 승인된 static 로그의 최종 비율은
35.3467/100017=.000353407이고10개 frame 모두 기존.01 기준 이하(최대.00353023)다.
총 F+RF 및 current moment의 비영 결함은 이 free residual로 설명된다. 따라서 판정은
기존 static acceptance 내 구성식·평형 ledger의 bounded PASS이며 exact equilibrium
통과가 아니다. 비선형의 `0.5F·u`는 진단값이며 energy identity로 사용하지 않는다.
Source/reference/input-copy/HDF/native/comparison 로그의 전후 SHA와 independent
script·native0·JSON·raw 배열은 로컬 `.harness/hex8-evidence/mean-volume/`의
`physics-linear/`, `physics-nonlinear/`에 보존했다. 작은 사례의 내부 시간수렴·수지
검토와 실제 두 정적 원본의 판정은 새 전체 동적 이력이나 modal 외부 비교를 대신하지 않는다.
## 체적 평균 변경본의 실제 선형 동적101 endpoint 대조
새 LINE dynamic HDF5의101개 endpoint를 독립 재구성했다. Source/time/amplitude·
model/schema/point identity 및 initial exact0·구속 U/V/a/A와 free RF exact0을 확인했다.
Actual stress/infinitesimal strain 최대차는4.44961e-7/2.30790e-18이다. 별도의 상대변위 H
표현에서도 회복값이 일치한다. 기준 geometry의 consistent M을 모든 frame에 고정 사용하고
별도8점 직접 적분의 kinetic energy·linear/current angular momentum과도 대조했다.
Native strain/kinetic energy 최대차1.13687e-13/2.13163e-14 force·length,
endpoint work와 balance error 최대차는 각각2.27374e-13이다.
공개 α=-.05,β=.275625,γ=.55의 RN64 상태 갱신 결함 비율은2.060e-16 이하이고 이전
physical force를 포함한 weighted identity도 대조했다. Stored free residual 최대
6.20169e-19와 RN64 state로 재구성한 최대1.10905e-7 force는 다른 관측이다. 후자의
cancellation/계수 반올림을 내부 high+low gate 실패나 통과의 근거로 사용하지 않는다.
Physical RF는 `Ma+f-F`의 constrained projection과 일치한다. 전체 force ledger 차이는
5.76479e-10 force 이하다. 선형 K0의 현재 arm 모멘트는 일반적으로 `Σu×f` 때문에
비영이며 최대287.099763335 force·length다. 이를 포함한 moment ledger 차이는
3.42095e-9 force·length 이하다.
최종 U178.92766323729418,T.27177166481189713,W257.34360955254886에서
`B=T+U-T0-U0-W=-78.14417465044276` force·length다. 첫 증분 B는+1.8941761591671697이다.
이 α와 endpoint trapezoid work에서 exact/단조 energy conservation을 요구하거나
관측값을 보정하지 않는다. 판정은 실제101 endpoint의 구성식·질량·상태 갱신·물리
observable 계약에 한정한 bounded PASS다. 이 원본에는 외부 U CSV만 있으므로 stress/RF
재구성을 외부 stress/RF 비교 통과로 보고하지 않는다. 임의 step의 시간 정확성·비선형
원본·전체 기능은 별도 범위다. Solver 재실행 없이 원본/copy/HDF/log의 SHA를 보존했고
자료는 `.harness/hex8-evidence/mean-volume/physics-dynlinear/`에 있다.
## 체적 평균 변경본의 실제 비선형 동적101 endpoint 대조
새 TL dynamic의 모든101 endpoint·300개 요소를 독립 계산한 결과도 bounded physics
PASS다. Actual Green·mean-law PK2/P/Cauchy·내력·에너지와 고정 reference M의 kinetic
energy·운동량·현재 angular momentum·RF·잔차·HHT 갱신을 대조했다. 응력/actual Green
최대차는2.08300e-7 force/length² 및8.46980e-19, strain/kinetic energy 최대차는
1.13687e-13/1.42109e-14 force·length다. 별도8점 질량 직접 적분도 일치했다.
입력·복사본·HDF·native/comparison/log/UCSV의 전후 SHA를 보존했고 두 독립 계산은
native0이다. 자료는 `.harness/hex8-evidence/mean-volume/physics-dynnonlinear/`다.
Actual Green trace의 요소 내 spread 최대1.84387e-5를 보존했다. PK2 isotropic part의
point spread6.98492e-10과 Cauchy hydro spread53.12235는 F/J mapping으로 구별된다.
관측 Gauss-point detF는.9999790347721854…1.0000212541790632이며 whole-cell
certificate를 다시 증명한 것은 아니다. Stored free residual 최대4.42274e-12와 RN64
재구성 최대9.96777e-8 force를 구분한다. 반올림 HDF로 strict paired gate의 통과나
실패를 판정하지 않는다. Physical RF 최대차3.49246e-10 force, 전체 force/current
moment ledger 차이8.18364e-10 force/2.47995e-9 force·length다. TL 내부 current moment
최대2.60364e-9는 기준 arm과 `Σu×f`의 상쇄를 확인하며 LINE의 현재 모멘트와 구별된다.
최종 U178.96011630302056,T.2729454262030376,W257.36751015513966에서
B=-78.13444842591608 force·length이며 첫 증분 B는+1.8903734544186321이다.
Work/balance 최대차는1.70530e-13/2.13163e-13이다. Exact conservation·매 frame 단조
감소·비선형 `U=.5Fᵀu`는 주장하지 않는다. 이 판정은 실제 원본의 구성식·질량·상태
갱신·물리 observable에 한정한다. 외부 RF/S 비교, 임의 step 시간차수, arbitrary warped
cell, 큰 변형 안정성 및 전체 기능 PASS는 범위 밖이다.
@@ -1,59 +0,0 @@
# 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)의 변경 근거이며, 구현 완료를 뜻하지 않는다.
실패 근거와 검증 범위는 [lessons](lessons.md)에 기록한다.
## 변경이 필요한 이유
현재 production은 단일 Float64 물리 상태를 사용한다. 두 동적 원본은 세 번째 증분의
100회 제한에서 componentwise physical residual 기준을 만족하지 못했다. Fresh Newton
보정이 저장된 변위를 바꾸지 못하는 경우를 실제 실행과 독립 검산으로 확인했다.
제한된 단일·두 좌표 탐색의 실패는 표현 가능한 해의 부재를 증명하지 않는다.
갱신 중 사라진 덧셈을 다음 반복에 누적하는 carry와, 실제 변위를 high+low로 표현하는
물리 상태는 다르다. Carry 실험의 kernel·rates·형상은 rounded high만 사용한다.
아래 승인안은 low도 물리 계산에 사용하는 별도 정밀도 계약이며, 원본 수렴을 보장하지 않는다.
## 제안하는 계산과 결과의 의미
- 내부 변위·속도·physical a·auxiliary A와 predictor를 두 Float64 값의 합으로 표현한다.
Low를 유지한 candidate와 accepted endpoint를 복사하고 다음 증분에도 전달한다.
연산별 반올림 오차·비유한 값·정규화 조건을 정의하고 독립 검증한다.
재방문 판별의 동일 상태 비교에는 low를 포함한다.
- Hex8의 상대 변위·H/E/S/P·내력·에너지·응력과 tangent는 같은 전체 상태를 사용한다.
형상 인증도 전체 상태를 포함하는 보수적 경계를 사용한다. Kernel 직전이나 H를 만든
직후 low를 버리는 구현은 이 제안을 충족하지 않는다.
- 기준 consistent M과 material/geometry 입력은 기존 정의를 유지한다. 관성력·weighted
residual·old residual·reaction·수지·수정량·update 판정도 같은 전체 상태로 계산한다.
Sparse factorization은 기존 Float64 backend를 사용하되, 보정량을 전체 상태에 누적한다.
Rounded tangent와 전체 상태 residual 사이의 일관성을 별도로 검증한다.
- HHT 계수·고정 h·exact schedule·100회 제한, 모든 원래 free 성분의 Si·exact-zero branch,
residual/correction `1e-10` 및 update/weighted identity `1e-12`를 유지한다.
Low를 사후 residual 보정이나 평형 projection으로 만들지 않는다.
- HDF5의 field·shape·Float64 dtype은 유지한다. 각 값은 내부 물리량을 Float64로 반올림한
observable이다. 내부 전체 상태의 gate PASS를 HDF5 배열만으로 같은 식을 재계산한
gate PASS로 표현하지 않는다. Self-check는 내부 값의 올바른 직렬화와 기존 schema·identity를
검증하고, 로그에 사용한 내부 산술을 명시한다. Restart는 계속 지원하지 않는다.
Float64 직렬화의 overflow·비유한 값은 실패로 처리하며 기존 최종 파일을 보존한다.
승인한 변경에서는 accepted state가 high+low 전체 물리 상태이며, published Float64 state는
그 반올림 observable이다. 같은 계산 입력이라는 이전 의미를 적용하지 않는다.
## 구현 전에 고정할 검증
1. 독립 정확 산술 oracle과 binary-power 사례로 덧셈·곱셈·나눗셈·low 보존 및 유한 범위를
검증한다. 단일 Float64로 collapse하는 대조 구현이 실패하는 의미 있는 사례를 포함한다.
2. 작은 coupled Hex8 사례에서 low가 실제 변형률·힘·관성력에 전달되는지 확인한다.
에너지 미분·tangent·객관성·형상 인증·비영 old residual의 HHT identity와 네 수정량
channel을 검증한다. 승인한 low를 제외한 다른 상태에서 gate를 계산하지 않는다.
3. Accepted/trial 복사와 실패 rollback, geometry/backend 실패, 원래 범위의 시간수렴·
에너지·운동량·반력을 검증한다. 정적·고유치의 기존 계산을 불필요하게 변경하지 않는다.
4. 제한된 실제 동적 실행에서 개선 근거를 얻고 독립 검토한 후, 원본 두 건의101개 endpoint와
공식 HDF5/외부 비교·전체 회귀를 수행한다. 외부 row5%/RMS1% 기준과 원본은 유지한다.
작은 사례에서 개선을 입증하지 못하면 추가 정밀도 확대를 자동으로 반복하지 않는다.
다음 접근과 계약 영향을 사용자에게 다시 제시한다.
@@ -1,108 +0,0 @@
# 정적 원본 불일치와 변경 선택지 — 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는 선택되지 않았다.
이 문서는 변경 근거와 승인 범위를 보존한다. 아래 공식 결과와 private 후보는 변경 전
pointwise 구현의 불일치 조사이며 변경본 production PASS가 아니다. 실제 비교 기록은
[verification](verification.md)에 있다.
## 확인한 차이
선형·비선형 정적 원본의 CLI는 native exit0으로 종료했다. Byte-identical scratch input,
원본13개의 SHA, source step/factor1,442절점·300요소·51구속, source IntPt1–8,
형식·좌표·tensor·finite 검사도 통과했다. 두 경우 모두 U/RF/S가 공통 RMS1%를 초과했다.
| 실제 공식 결과 | U RMS/S | constrained RF RMS/S | S RMS/S |
| --- | ---: | ---: | ---: |
| 선형 정적 | 0.01673952 | 0.06818893 | 0.04270903 |
| 비선형 정적 | 0.01673779 | 0.06818993 | 0.04270851 |
선형 독립 표준 full8 조립·solve는 현재 변위와 상대 최대차1.75e-11로 일치했다.
같은 식의 응력 복구 최대차는4.01e-7 stress-unit, 자유 잔차/하중은5.15e-12다.
반력·일과 에너지를 별도로 대조했으며 source mapping 오류는 발견하지 않았다.
원본 변위를 같은 표준 full8 식에 대입하면 자유 평형 잔차가 크다. 이는 원본이 다른
체적 처리 모델과 일관될 수 있다는 관찰이며 원본이 잘못됐다는 판정은 아니다.
원본 변위에서 점별 deviatoric strain은 유지하고 체적 trace만 요소의 reference-volume
가중 평균으로 계산하면 원본 응력의 최대차가 약1.054e6에서44.15 stress-unit으로 줄었다.
[Abaqus 공개 Theory Guide](https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-solidisoquadhex.htm)는
fully integrated 8절점 요소의 체적 항 평균화를 설명한다. 점 수8만으로 승인된 비수정
pointwise full8 식과의 동등성을 추론할 수 없다. 읽은 공개 자료는2025이며 원본 CAE2024의
정확한 revision이나 ODB 출력 precision을 확인한 것은 아니다.
## 선택 A — 현재 정식화 유지와 별도 reference
현재 energy/force/tangent/recovery·consistent mass·절차를 유지한다. 동일한 비수정
8점 규칙·구성식·하중·구속·복구량 의미를 명시한 독립 reference를 별도 경로에 준비한다.
FESA 결과를 reference로 복사하거나 기존 원본을 변경하지 않는다.
필수 reference 지위를 바꾸면 비교 계약 변경이 필요하다. 현재 불일치 원본을 diagnostic으로 보존하고
새 자료를 필수 reference로 지정할지, 현재 필수 지위를 유지해 완료를 계속 보류할지
사용자가 결정한다. 새 자료의 경로·quantity·시점·단위·hash와 독립성을 확인하기 전에는
필수 비교 PASS가 아니다. 외부 solver 실행이나 reference 생성은 별도의 명시 범위다.
## 선택 B — Green strain 체적 평균 energy 도입
8개 reference Gauss 점과 그 가중치 w_g, 실제 F_g·Green strain E_g를 유지하고
체적 energy만 다음 요소 전체 항으로 정의한다. mu와 kappa는 기존 shear·bulk 계수다.
```text
V = sum_g(w_g), theta_bar = sum_g(w_g * trace(E_g)) / V
U* = sum_g(w_g * mu * dev(E_g):dev(E_g)) + kappa * V * theta_bar^2 / 2
S*_g = 2*mu*dev(E_g) + kappa*theta_bar*I
P*_g = F_g*S*_g, Cauchy_sigma_g = F_g*S*_g*transpose(F_g)/det(F_g)
f = dU*/du, Kt = d²U*/du²
```
체적 항의 material Hessian은 서로 다른 Gauss 점의 coupling을 포함한다. 방향 p/q에
대해 Z_g[p]=sym(F_g^T D_g[p]), D_g[p]=sum_a(p_a tensor G_ag)라 두면 체적 항은
`(kappa/V)*sum_g(w_g*trace(Z_g[p]))*sum_h(w_h*trace(Z_h[q]))`다.
Paired 경로의 G_ag는 [precision formulation](precision-formulation.md)의 동일 Ghat derivative다.
Deviatoric material 항과 S*의 geometric 항도 같은 energy에서 미분한다. Stress만
평균화하거나 기존 point-local tangent를 그대로 쓰면 이 energy의 내력·접선이 아니다.
선형은 같은 energy의 zero-state Hessian을 쓴다. 비선형은 TL·실제 Green strain을
유지하고 새 energy의 내력·Kmat/Kgeo/Kt를 쓴다. 실제 Green strain을 출력하되 stress는
같은 point strain만의 기존 StVK law가 아닌 요소 평균에 의존한다는 의미를 명시한다.
Reference consistent M과 기존 HHT·strict gate·100회 제한·Float64 결과 반올림 의미는 유지한다.
평균·내력·접선·복구의 paired 경로까지 변경해야 하며 eigen과 두 HHT의 강성도 달라진다.
후보 B의 **선형 한 사례만** private NumPy/SciPy로 독립 조립·solve했다. 실제 원본
구속·하중과 unchanged reference-only row5%/RMS1% 정책을 사용한 수치 관찰이다.
| 후보 선형 계산 | row 실패/전체 | RMS/S | 최대 절대차 |
| --- | ---: | ---: | ---: |
| U | 0/1326 | 9.317914e-9 | 6.096814e-11 length |
| constrained RF | 0/51 | 7.309763e-9 | 0.01474826 force |
| S | 0/14400 | 3.425947e-9 | 0.1224464 stress |
관찰한300 local matrix의 numerical rank는18,1275 free matrix의 numerical rank는1275이며
Cholesky가 성공했다. Rank는 spectral threshold를 사용한 관찰이다.
후보 평형·에너지·독립 stress→force를 대조했다. 이는 production 구현·공식 HDF5 비교나
모든 형상의 안정성 증명이 아니다. 비선형·고유치·동해석의 원본 일치는 아직 입증하지 않았다.
이 모델은 평균 Green trace를 사용하며 공개 finite Fbar와 다르다. Fbar의 평균 determinant,
수정 F와 dev 구성식까지 재현하려면 별도의 선택·변분·paired 산술·복구량 계약이 필요하다.
공개 Abaqus 유한변형 알고리즘의 동등성을 이 선형 결과로 주장하지 않는다.
## 변경 후 필요한 검증과 결정 경계
B를 선택하면 static/frequency/LIN·TL HHT 전체에 동일 energy를 적용하는 범위와 복구량
의미를 feature 계약에 기록한 뒤 구현한다. Independent U→f→Kt 방향 미분, cross-GP 항,
distorted patch·6 rigid modes·큰 회전 객관성, extra-null/conditioning·공간수렴,
consistent M·반력·work/energy·운동량, 모든 low 전달·rollback·시간수렴을 검증해야 한다.
모든 원본을 새 구현으로 다시 비교하고 최신 전체 MSVC Debug 회귀를 수행한다.
이미 종료된 현행 구현의 evidence를 변경본의 PASS로 재사용하지 않는다.
A/B 어느 선택도 원본·tolerance를 보정하지 않는다. 공개 Fbar 자체를 목표로 하려면
별도 정식화 조사를 선택해야 한다. 고유치 원본 Value 부재와 기존 Shell 회귀 문제도 별개로 남는다.
Physics 변경 B는 승인됐으며 필수 reference 지위는 유지한다. 승인만으로 변경본 검증을 완료하지 않는다.
원시 독립 표준 full8 audit는 로컬 `.harness/hex8-evidence/t8-independent-full8-audit/`,
체적 조사·후보 수식·한 번의 선형 계산과 SHA는
`.harness/hex8-evidence/t8-reference-law-investigation/`에 보존했다.
독립 numerical review는 후보 energy의 first/second variation과 한 선형 후보의
cross-GP K·응력·에너지·수치 정책 관측을 확인했다. 후보 채택·production 검증은 아니다.
@@ -1,149 +0,0 @@
# 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은 유지한다.
@@ -1,97 +0,0 @@
# Hex8 원본과 비교 mapping
기준은 [PRD](PRD.md)의 FEM-REQ-HEX8-022–023와 [공통 수치 정책](../TOLERANCE.md)이다.
기존 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
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는 `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을 보존한다.
| 원본 | CSV rows | SHA-256 raw |
| --- | ---: | --- |
| `hexa_dynlinear.inp` | — | `f8db81b8ea56b689ab0ad892e6a84b7c6a0162c9d3ff95328ea99722f3de078e` |
| `hexa_dynlinear_U.csv` | 44642 | `623c20489e8cc18d23fa1728563ce5a26059f321861514ef8569e3d204ef6cb5` |
| `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` |
| `hexa_linearstatic_U.csv` | 442 | `1ff49aea3ec601cfd796d6a2fb6a4f91be3fc3de9426cdf3744d981216d4bd5f` |
| `hexa_nonlinearstatic.inp` | — | `7858254025b96c6bfe3fb6498605ecf9c473425c2bc3593f5fbdc6902fd7c6cb` |
| `hexa_nonlinearstatic_RF.csv` | 442 | `3ba67a4fb75b2ce3edee13d35b2ea66ac7d52fc16e612c086ed1122a834fee7b` |
| `hexa_nonlinearstatic_S.csv` | 2400 | `a8866a730f0d65b1e3921d504d255b72158b4a2b9ee30fc691712d94982b07ba` |
| `hexa_nonlinearstatic_U.csv` | 442 | `bd6c2fe2b2bb2ffb0bc2ea52f67513c3967a396b5707bbebc9533fde7be25ac6` |
## Quantity와 identity
Static은 U1/U2/U3의 U-global, RF1/RF2/RF3 constrained projection의 RF-global,
integration-point Cauchy S11/S22/S33/S12/S13/S23의 S-global을 각각 독립 blocking family로 비교한다.
U/RF는442-row 전체 inventory를 먼저 확인하고,
RF만 실제 constrained components로 투영한다. Free Abaqus RF와 FESA free residual을 비교하지 않는다.
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 의미로 대응한다.
FESA storage Step-1/frame0과 source name/Increment10의 서로 다른 의미를 유지한다.
Dynamic은 integer increment로 match 후 source decimal time과 binary64 n*h를 대조한다.
Original coordinate는 reference 위치이며 nonlinear current 위치로 바꾸어 맞추지 않는다.
## Integration point convention의 보조 확인
Natural node 순서는 `---,+--,++-,-+-,--+,+-+,+++,-++`, IntPt 순서는
`---,+--,-+-,++-,--+,+-+,-++,+++`다. 뒤의3/4·7/8을 node 순서와 혼동하지 않는다.
전체300×8 point에서 고정 element/IntPt key로 입력 shape의 기준 위치를 계산해 CSV X/Y/Z와
대조했다. 선형/비선형 S 모두 최대 absolute coordinate difference는
`[1.4328052233558708e-7,1.4747179877261374e-7,2.4956611142101792e-6]`이었다.
이 보조 확인의 budget은 coordinate 성분의 uncancelled shape sum에16×float32 eps를 곱했다.
모든 point에서 maximum budget ratio=.112265였다. 이는 단정밀도 수준의 원본 출력 해상도를
기준으로 한 convention sanity check이며 실제 원본 precision metadata의 증명이나 stress값의
PASS가 아니다. Nearest-position matching을 수행하지 않았고 어떤 좌표/ID/값도 수정하지 않았다.
명령은 `python .dryforge/inspect-reference.py`, native exit0이었다. 로컬 raw 보고서는
`.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 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가 아니다.
@@ -1,338 +0,0 @@
# 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
checklist. The comparator reads official rounded Float64 quantities; it does not
recompute the internal high+low solver acceptance gates from those observables.
## Entry point and identities
`uv run --with h5py --with pytest python scripts/verification/compare_hex8.py`
requires `--case`, the actual scratch `--input`, official `--results`, and
`--report`. `--references` defaults to `reference/hexa`. The optional
`--execution-record` consumes a closed native CLI record; it never executes its
command. A supplied record must have native exit0, unchanged original/copy byte
identities, and the exact input and result hashes. Without that record the report
explicitly certifies file comparison only, not successful solver execution.
For example, after a real original run has naturally completed:
```powershell
uv run --with h5py --with pytest python scripts/verification/compare_hex8.py `
--case hexa_linearstatic --input <scratch>/hexa_linearstatic.inp `
--results <scratch>/hexa_linearstatic_results.h5 `
--execution-record <scratch>/native.json --report <evidence>/comparison.json
```
The report path may not overwrite an input, reference, execution record or result.
Authoritative repository originals remain protected even with alternate copied
references; existing symlink/junction and hardlink aliases are also checked.
Exit0 means the declared comparison passes; exit1 means a numerical family fails;
exit2 means an identity/schema/finite/precondition error or missing modal reference.
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 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.
Complete CSV identities are checked before any physical values are converted.
Complete required Solid model/frame/physical schemas, UTF-8 attributes and explicit
LE F64/U64/U8 widths are then checked. Result arrays join the source node or
source element/point labels through their internal ID maps; CSV row order is not
an identity. Physical values, including nonprojected RF rows and unused exported
CSV derived quantities, must be finite before tolerance evaluation.
Static reference increment10 maps to the completed load-factor1 frame, independent
of its HDF5 storage frame index. RF validates all442 source rows before projecting
the actual51 constrained scalar components. It never compares free RF with free
residual. Stress compares all300×8×6 unaveraged global Cauchy components. Fixed
IntPt1–8 conventions are checked without nearest-coordinate remapping. Point
coordinates are auxiliary: CSV coordinate errors use the approved
`16*float32-eps*sum(abs(Na*Xa_axis))` source-resolution budget; the scalar stress
policy is unchanged.
Dynamic comparisons require exactly101 accepted frames. Integer increment0–100
is matched first, source decimal time must equal n/10, and each stored time must
be binary64 `n*0.1`. Each frame's1326 U scalars form a separate blocking family.
There is no interpolation, nearest-time matching, scale sharing between frames,
rotation family or acceleration/energy reference claim.
## Common numerical policy
Every static case has independent U-global, constrained RF-global and S-global
blocking families. Every dynamic frame has its own U-global blocking family.
For each family, only reference values define S=max(abs(reference)) and B=.01S.
Rows with abs(reference)<=B require absolute error<=B; other rows require relative
error<=.05. All-row RMS/S must also be<=.01. Boundaries are inclusive, and S=0
requires every actual value to be exactly0. No absolute floor, denominator clamp,
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 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 구현의 관측 이력
The initial seven behavior assertions failed before implementation (pytest native
exit1). The first expanded suite passed63/63 with native exit0. Those tests include
original-sized independently declared HDF5 schema fixtures and reference values;
they are comparator behavior fixtures, not actual FESA source validation evidence.
The affected Hex8 plus legacy HHT comparator suite passed119/119 (native exit0,
62.51s) before independent review fixes. Those bounded fixes were reproduced by
safe behavior RED tests and the five targeted regressions then passed5/5. Final affected checks after all three independent findings were corrected passed
124/124 with native exit0 (81.41s), with raw stdout and JUnit retained under
`.harness/hex8-evidence/t8/final-affected/`. The preliminary whole `uv ... pytest -q` attempt and the separate exact
configured `uv run --with h5py --with pytest python -B -m pytest -v -rs`
(`docs/operations.md:87`, adding h5py) both stopped during collection with native
exit2 and five legacy operational import errors (`msvc_harness` and removed `scripts.hooks`). It is not a whole-suite PASS;
no tests were excluded and no retired orchestration was restored.
Actual official linear-static and nonlinear-static results passed source,
model, schema, point, finite and frame prechecks and failed all three numerical
families. Their closed CLI evidence records both have native exit0 and matching
original/copy/result hashes; their comparator commands have native exit1.
These are genuine comparison failures under the unchanged policy, not reader
precheck failures or solver native execution failures. Frequency official readback
passes its prechecks; its comparator exits2 with `not-run`, not PASS.
| Case / blocking quantity | Scalars | Failing rows | S | Maximum absolute error | RMS/S |
| --- | ---: | ---: | ---: | ---: | ---: |
| linear static U | 1326 | 79 | .00186131289 | .00007588175038730229 | .016739519723527385 |
| linear static RF | 51 | 34 | 513497.094 | 78630.61640144575 | .06818892528188494 |
| linear static S | 14400 | 7783 | 3430145 | 982855.3871926877 | .04270903417463437 |
| nonlinear static U | 1326 | 79 | .00186110672 | .00007586510202476195 | .016737790679783753 |
| nonlinear static RF | 51 | 34 | 513445.594 | 78623.61011241788 | .0681899286018377 |
| nonlinear static S | 14400 | 7782 | 3429817.75 | 982753.151651503 | .04270850513087158 |
Official result SHA256 values are
`3ef92c35ea83ddb4d11437ff87ef15eca7dac179d378eda19570abae579b09d0` (linear),
`0095ebf2d360a8bd8a71212af0dd500ed611a56540a173a39d9c8d88d8e05bbf` (nonlinear),
and `0ec4d2b09250bab17a8532228cd34a312518c04023076f971e929b387031c6b3` (frequency).
Scratch inputs are retained under
`.harness/hex8-evidence/t8-original-cli/<case>/<case>.inp`.
Root preserved each exact command, closed native exit and full row report under
`.harness/hex8-evidence/t8-comparator-frozen/official-comparisons/<case>/`.
The command records identify the actual scratch input, original reference directory,
HDF5 and closed native CLI record consumed. The frozen author revision
`0b93c0c59cf64db44003ebe5217a4efb8307a8ba` passed independent bounded review
and was integrated as `317fe5c`. Root and reviewer separately verified four owned
source blobs/snapshots, 65 closed raw artifacts and all13 unchanged source hashes.
The raw affected stdout/JUnit certifies124 tests (Hex8 83, legacy HHT 41), zero
failures/errors/skips and native0. This review certifies the comparator behavior
and evidence, not numerical agreement with the originals. Naturally completed
dynamic originals and whole-feature validation are tracked separately.
After integration, the root affected suite also passed124/124 with native0
(70.92s). Root comparison-only commands consumed the same naturally closed official
results and again returned static native1 with the same failed family metrics and
frequency native2 (`not-run`). These commands and raw stdout/JUnit/row reports are
retained under `.harness/hex8-evidence/t8-integrated/`. No original solver case was
rerun to perform these comparisons.
| Actual original | Closed pointwise baseline comparison state (before approved B) |
| --- | --- |
| `hexa_linearstatic` | Full precheck PASS; U/RF/S numerical FAIL (comparator native1) |
| `hexa_nonlinearstatic` | Full precheck PASS; U/RF/S numerical FAIL (comparator native1) |
| `hexa_dynlinear` | CLI native0,101-frame precheck PASS;88/101 U families FAIL (comparator native1), maximum RMS/S .08163737360707901 |
| `hexa_dynnonlinear` | CLI native0,101-frame precheck PASS;88/101 U families FAIL (comparator native1), maximum RMS/S .08160653291688992 |
| `hexa_freq` | Official HDF5 precheck PASS; modal Value absent, actual comparison NOT RUN (native2) |
Full MSVC build/CTest, original CLI orchestration, independent numerical/physics
investigation of the reference conflict and whole-feature completion are root-owned
and are not inferred from this Python implementation or its fixture tests.
The two actual dynamic CLI runs closed naturally with all101 frames before the
2026-10-10 energy change. Each comparison consumed all101 original increments,
1326 scalars per increment and44642 original node rows. Failed scalar-row totals
were74098 (linear) and73974 (nonlinear); maximum absolute errors were
.0003979358365926728 and.00039786754005028237. Full commands, native records,
source/result hashes and row reports are preserved under
`.harness/hex8-evidence/t8-dynamic-closure/<case>/`. The separately frozen API
`c49cae4` also naturally completed both101-endpoint strict-gate checks with native0;
it did not itself write official HDF5 or establish original agreement.
The closed pointwise source `1eb9cdd` full MSVC Debug build exited0. Its unfiltered
780-test CTest exited8:777 PASS,2 FAIL,1 SKIP, with all163 added tests PASS.
The baseline exception names, statuses and raw metric bodies matched exactly:
`HhtShellPhysics.C08aRigidManufacturedOrbitFullCoordinateTimeConvergence`,
`HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`,
and `HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved`.
Raw records and the independent closure summary are retained under
`.harness/hex8-evidence/t9-full-current/`. This is not a whole-suite PASS.
Approved B replaces the pointwise bulk energy and requires new validation of all
five procedures. None of the historical native, internal or reference outcomes
above is a validation result for the mean-volume implementation. Originals,
tolerances, strict gates and comparator contracts remain unchanged.
## 2026-10-10 체적 평균 energy 구현과 현재 재검증
Frozen 작성자 `b2abd739`를 root `18b36c1`에 연결했다. 두 pass로 reference-volume
가중 trace 평균을 계산하고 같은 energy에서 내력·전체 Hessian·복구 응력을 구한다.
Cross-GP bulk 항과 `S*:delta²E` 기하항을 함께 유지한다. LINE의 K0는 같은 식의
영변위 Hessian이다. 질량·HHT·strict gate·원본·I/O·허용오차는 변경하지 않았다.
수정한 weighted warped oracle를 이전 구현에 대입한7개 검사는 모두 실패했다.
변경본 작성자 관련150/150, 시간수렴3 GTests의4물리 사례, 최종 실제 재컴파일3/3은
각각 native build/CTest0/0이다. u/v/physical a의 최소 관측 차수1.98022는 기존1.8
기준을 충족한다. Root 실제 재컴파일 후 관련65/65도 native0이다. 정규 brick의 rank,
두 축 지정 굽힘장 에너지 수렴과 고정 두께 cantilever tip 추세는 서로 다른 증거다.
상세 범위는 [수치 검토](numerical-review.md)와 [물리 검토](physics-review.md)에 있다.
새 공식 CLI는 frozen executable과 byte-identical scratch INP를 사용한다. 아래 두
정적 해석은 자연 종료 native0이며, 변경 없는 공식 비교기도 각각 native0이다.
Source/model/schema/point/frame/finite 사전검사와 각 family의 모든 row가 통과했다.
| 원본 / blocking quantity | Scalars | Failing rows | Maximum absolute error | RMS/S |
| --- | ---: | ---: | ---: | ---: |
| linear static U | 1326 | 0 | 6.096370478748947e-11 | 9.317898154374918e-9 |
| linear static RF | 51 | 0 | .014746726665180176 | 7.3098163267228364e-9 |
| linear static S | 14400 | 0 | .12245691940188408 | 3.425934236751431e-9 |
| nonlinear static U | 1326 | 0 | 9.832466303596647e-10 | 2.169911561350724e-7 |
| nonlinear static RF | 51 | 0 | 12.826179522729944 | 6.728092996221331e-6 |
| nonlinear static S | 14400 | 0 | 93.34994950843975 | 9.338899878251489e-6 |
새 HDF5 SHA256은 linear `023769e50d05226ef8defe87e29bc9046fbdd5071783007ebb39a49fd9d7d617`,
nonlinear `2acb3471c7799597d554d4d9ee224e8c611522866808f38b2b2c202e0f98a4bd`다.
Frequency CLI도 native0으로 종료했고 공식 readback 사전검사는 PASS다. 새 결과 SHA는
`f6203936883df7f27e86a20311726b7e59fefa117e5f9fa67f71bdf63ec2e4cb`다.
원본 modal Value 부재로 비교는 native2·NOT RUN이며 수치 통과가 아니다.
새 선형 동적 CLI가 native0으로 자연 종료했고101-frame 사전검사와101개 U family가
모두 PASS다(비교 native0). 총133926개 scalar의 실패 행은0개다. 초기 exact-zero family를
포함하며100개 nonzero-scale family의 최대 RMS/S는.0031316511389477947,
전체 최대 absolute error는1.3395048822648645e-5다. 마지막 RMS/S는.001392775677333779다.
Actual HDF SHA는 `5476c557bc8e1c0a1e8b57a1cc8d763eb822a47e27aa2b2723fcbdc2246f9b40`다.
이 외부 변위 비교는 rounded HDF만으로 내부 high+low strict gate를 재계산한 검사가 아니다.
새 비선형 동적 CLI도 native0으로 자연 종료했고101-frame 사전검사 및101개 U family가
모두 PASS다(비교 native0). 총133926개 scalar의 실패 행은0개다. 초기 exact-zero와
100개 nonzero-scale family를 구분했으며 최대 RMS/S는.003133373067174733,
전체 최대 absolute error는1.3397499223151595e-5, 마지막 RMS/S는.0013958914416137816이다.
Actual HDF SHA는 `023b4558a28f8d9365f6b11346a6cb4a5d2faafa68607c5c56bbf226fe816210`다.
다섯 새 공식 CLI queue는 wrapper0으로 자연 종료했고 원본13개 SHA를 보존했다.
독립 검토의 범위는 해당 수치·물리 검토 문서를 따른다.
제외 없는 전체787 CTest는2026-10-11 자연 종료했다. MSVC x64 Debug configure/build는
native0/0이며 CTest는 native8:784 PASS·2 FAIL·1 SKIP이다. 기존617개가 모두 유지됐고
추가170개는 모두 PASS이며 새 예외는0이다. 두 기존 Shell 실패의 수치 로그20/30줄은
baseline과 정확히 같다. SKIP은 이름·상태가 동일하지만 output-on-failure raw에 상세
본문이 없어 그 metric 검증은 NOT VERIFIED다. 전체 green으로 보고하지 않는다.
정확한 CLI/비교 명령·native record·
원본/copy/result SHA·전 row report는 로컬 `.harness/hex8-evidence/mean-volume/`의
`original-cli/`, `comparisons/`, `integrated-focused/`, `full/`에 보존한다.
동일 revision에서 전체 Python 명령
`uv run --with h5py --with pytest python -B -m pytest -v -rs`도 다시 실행했다.
기존 `msvc_harness`·제거된 `scripts.hooks` import의 collection5 오류로 native2,
실행0개다. `.harness/hex8-evidence/mean-volume/python-full/`의 native 기록을 따른다.
기존 실패를 제외하거나 폐기된 절차를 복원하지 않았으며 전체 Python PASS가 아니다.
## 2026-10-11 전체 재검증 종료 기록
전체 C++ 검증은 설치된 MSVC x64와 dependency 환경에서 아래 preset backend 명령을
제외 없이 실행했다. `.harness/config.json`이 없고 generic runner는30분 deadline을
사용하므로 수시간의 전체 실행은 직접 backend로 완료했다. `scripts/execute.py`의 별도
실행 성공을 주장하지 않는다. 실제 argv·시각·native 종료 코드는 `full/`에 보존했다.
```powershell
cmake --preset windows-msvc-ninja-debug
cmake --build --preset windows-msvc-ninja-debug
ctest --preset windows-msvc-ninja-debug --show-only=json-v1
ctest --preset windows-msvc-ninja-debug --output-on-failure
```
전체 실제 시간은16839.26초다. 기존 실패는
`HhtShellPhysics.C08aRigidManufacturedOrbitFullCoordinateTimeConvergence` 및
`HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`,
SKIP은 `HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved`다.
기존617개와 새170개의 discovery·실행 ordinal·status 및 종료 artifact SHA 대조는
`full/independent-closure-summary.json`에 있다. 다섯 CLI·네 실제 원본 비교·modal NOT RUN·
Python collection 오류와 원본13개/frozen binaries 보존을 함께 기록한 최종 자료는
`.harness/hex8-evidence/mean-volume/closure.json`이다. 독립 감사와 실제 원본 물리 복구의
bounded 판정·한계는 [수치 검토](numerical-review.md), [물리 검토](physics-review.md)를 따른다.
종료 후 독립 전체 evidence 감사도 native0·finding0이다. 별도22개 artifact SHA와
세 실제 테스트 실행 파일의 중간 관측/종료 SHA, 모든 discovery/실행 행과 기존 상대
순서·status를 대조했다. 자료는 `final-evidence-audit-full/`에 있다. 두 실패 출력은
elapsed-ms 표기만 제외해 정확히 동일하다. 이 감사 PASS는 CTest native8이나 modal
NOT RUN을 통과로 재분류하지 않는다.