feat: adopt lumped mass and reduced-coordinate shell HHT

Integrate Hex8 mass verification and fixed-null-basis shell dynamics with numerical and physics handoff evidence. Preserve interrupted reference and full-validation status; full integration validation is deferred until after performance optimization.
This commit is contained in:
KOKO\Mimi
2026-10-13 16:57:19 +09:00
parent ede137c6b4
commit eaa5cbeb21
110 changed files with 15274 additions and 971 deletions
+16
View File
@@ -15,6 +15,7 @@ Total Lagrangian–St. Venant–Kirchhoff의 energy/internal force/material+geom
## HEX8-ADR-002 — Constant reference consistent mass
**대체 이력:** 2026-10-11 HEX8-ADR-010이 질량 선택을 대체했다. 아래는 당시 승인 기록이다.
**선택:** M은 기준 밀도와 형상의 rho NiNj I 적분이며 eigen과 linear/nonlinear HHT에 동일하게 사용한다.
**영향:** 전역 sparse generalized K/M가 필요하다. Shell nodal whitening·null-space 처리나
row-sum lumping을 호환 경로로 쓰지 않는다. Solid에는 회전/convective 관성이나 drilling이 없다.
@@ -72,6 +73,7 @@ endpoint·HDF5/외부 비교·전체 회귀를 진행한다. 승인과 수렴
## HEX8-ADR-009 — Reference-volume 평균 Green trace energy
**대체 이력:** 2026-10-11 HEX8-ADR-010이 consistent M 보존 부분만 대체한다. 평균 energy 결정은 유지한다.
**승인:** 2026-10-10 사용자는 [체적 차이와 변경안](reference-discrepancy-proposal.md)의
B: 체적 평균 energy 도입 후 전체 재검증을 선택했다.
**선택:** 선형·비선형 정적, unloaded frequency, 선형·비선형 HHT 모두 같은 요소 energy를
@@ -86,3 +88,17 @@ coupling을 포함한다. 평균 determinant/Fbar/로그변형률 재료식은
**검증:** 한 선형 private 후보의 원본 일치와 독립 변분 검토는 근거이며 production PASS가 아니다.
새 kernel/절차·시간/공간수렴·공식 출력·필수 원본·전체 MSVC Debug 회귀를 다시 검증한다.
기존 pointwise 구현의 통과·실패 기록은 과거 evidence로 보존하고 변경본에 승계하지 않는다.
## HEX8-ADR-010 — 고유치·HHT reference row-sum lumped mass
**승인:** 2026-10-11 사용자 “앞으로 고유치 해석과 HHT 동해석에서 질량 행렬은 lumped mass로 계산”.
**선택:** Full reference consistent24×24 M_C를 기존8점 적분으로 계산한 후 각 row sum을
대각에 둔 M_L을 eigen과 선형/비선형 HHT에 공통 사용한다. BC restriction 이전 요소 전체
행 합을 계산한다. Free block만 lump하거나 warped 요소의 절점 질량을 rho*V/8로 치환하지 않는다.
**영향:** HEX8-ADR-002 및 ADR-009의 consistent M 보존 부분만 대체한다. 평균 체적 energy,
high+low state/force/rates/gate·HHT 계수·schedule·100회·strict gate·외부 tolerance·출력 layout은
유지하며 metadata는 `lumped-reference`다. 관성력·T·P·L와 rates에도 같은 M_L을 사용한다.
**검증:** 질량·대각/SPD·warped 독립 적분·Jensen·BC 전후의 차이·원래 pencil residual/Gram/count와
HHT/반력·시간수렴·공식 readback·필수 원본5개·전체 Debug 회귀를 새로 확인한다. 기존 consistent
PASS/FAIL 및 private 후보의 일치는 변경본 production 통과로 승계하지 않는다.
현재 진행 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
@@ -1,7 +1,7 @@
# Hex8 구조해석 작업 지침
Feature ID: `hex8-structural-analysis`. 사용자 승인: 2026-10-08 ready 문서 승인 및 go 실행 요청.
개인 연구용 FESA에 reference8점 deviatoric·체적 평균 energy Hex8의 선형/기하비선형 강성·일관 질량과
개인 연구용 FESA에 reference8점 deviatoric·체적 평균 energy Hex8의 선형/기하비선형 강성·reference row-sum lumped 질량과
static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완료를 구분한다.
상위 기준은 [프로젝트 지침](../../AGENTS.md), [공통 PRD](../PRD.md),
@@ -15,6 +15,7 @@ static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완
| [io](io.md) | 입력 의미·typed 경계·공식 결과 metadata/units·진단 |
| [numeric controls](numeric-controls.md) | 수치 scale·zero branch·tuning·독립 검사 기준 |
| [reference model](reference-model.md) | read-only 원본 inventory·quantity/key/point/time mapping |
| [reference mass investigation](reference-mass-investigation.md) | 원본 C3D8 질량 설정·공식 문서·K/M 분리 진단 및 채택 경계 |
| [verification](verification.md) | 비교 도구 사용·공식 원본 비교·Python 검사 결과와 한계 |
| [reference discrepancy proposal](reference-discrepancy-proposal.md) | 승인된 B 체적 변경안·과거 원본 불일치와 별도 선형 후보 관측 |
| [numerical review](numerical-review.md) | 작성자와 독립된 정식화/controls 검토의 결과 |
@@ -22,6 +23,9 @@ static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완
| [precision proposal](precision-proposal.md) | 승인된 내부 정밀도 변경안·결과 의미·구현 전 검증 범위 |
| [precision formulation](precision-formulation.md) | HHT 전체 high+low 상태·동일 gradient 미분·산술 범위·반올림 출력 계약 |
| [physics review](physics-review.md) | 소규모 시간수렴·반력·운동량·에너지의 독립 평가와 coverage 한계 |
| [lumped 채택 evidence](lumped-mass-adoption.md) | 현행 질량의 원본5개·전체 회귀·test-only 후속 수정 결과 |
| [현행 물리 평가](physics-evaluation.md) | lumped 변경본 원본 모드·수지 검토와 최종 미해결 범위 |
| [최종 인계](final-handoff.md) | 최신 bounded 검사·기존 원본 재대조·source 동일성·성능 최적화 후 전체 검증으로 넘길 범위 |
메인이 문서·공유 연결·완료 판단을 소유한다. Kernel owner는 Hex8 local 계산/복구 payload와
직접 consumer를, semantic owner는 Domain/parser/3성분 DOF/load/assembly를 소유한다.
@@ -42,3 +46,8 @@ positive Jacobian을 보수적으로 인증하고 uncertain geometry/trial을
평가를 거친다. 일반 승인 작업마다 승인 gate를 추가하지 않는다. Physics·영속 schema·acceptance
변경 또는 해결되지 않은 필수 reference 충돌만 메인이 사용자에게 근거와 영향을 전달한다.
Dev 통합·push/release는 별도 명시된 사용자 결정이다.
2026-10-13 현재 인계는 [최종 인계](final-handoff.md)를 따른다. 사용자는 장시간
전체 검증을 수행하지 않도록 요청했다. 이번 관련91개·Python96개 및 저장된
원본5개 결과 재대조를 전체 통과로 확대하지 않는다. Hex8 구현·검토·인계와
최적화 이후의 최신 전체 통합 완료 판정은 구분한다.
+35 -15
View File
@@ -1,19 +1,19 @@
# Hex8 구조해석 제품 요구사항
Feature ID: `hex8-structural-analysis`. 작성일: 2026-10-08. 상태: 사용자 승인된 구현 계약; 검증 완료 대기.
Feature ID: `hex8-structural-analysis`. 작성일: 2026-10-08. 상태: 구현·필수 원본5개 비교·검토·인계 완료; 사용자 요청으로 장시간 전체 검증을 유예하여 최종 통합 완료 판정 보류.
기준 저장소: `dev`, `2382d3af7ef335bef216d963540f2e9bd2befd68`.
## 목적과 선택 이유
개인 연구용 FESA에 8절점 육면체의 선형 강성, 기하비선형 내력·접선 강성, 일관 질량을
개인 연구용 FESA에 8절점 육면체의 선형 강성, 기하비선형 내력·접선 강성, reference row-sum lumped 질량을
구현하고 입력부터 정적·고유치·동해석과 HDF5 결과까지 연결한다. 요소 행렬 계산만으로
완료하지 않는다. 기존 프로젝트를 유지하며 새 프로젝트 기준을 재작성하지 않는다.
첫 구현은 큰 회전·작은 탄성 변형률을 대상으로 한다. 전체 8점 적분과 Total Lagrangian
St. Venant–Kirchhoff의 deviatoric 항과 요소 평균 Green trace 체적 energy를 선택해
에너지·내력·접선의 일관성을 독립 검증한다. 2026-10-10 사용자 B 승인으로 최초 pointwise
체적 항을 대체했으며 [ADR-009](ADR.md)를 따른다. 일관 질량은
고유치와 동해석 모두에 사용한다. 집중 질량이나 안정화로 계산 결과를 맞추지 않는다.
체적 항을 대체했으며 [ADR-009](ADR.md)를 따른다. 2026-10-11 승인 [ADR-010](ADR.md)에 따라 full reference element M의 행 합 대각 질량을
고유치와 동해석 모두에 사용한다. 허용값이나 안정화로 계산 결과를 맞추지 않는다.
일반 등매개 육면체를 지원하며 체적 projection의 안정성·conditioning 및 남은 굽힘 잠김 한계를 검증·공개한다.
초기 합의의 일정 동하중에 더해, 제공된 reference의 ramp를 처리하도록 구간별 선형
@@ -119,11 +119,13 @@ F64와 paired 경로 모두 실제 relative kinematics의 같은 derivative인 G
계산하며 유한차분 접선을 production 계산으로 사용하지 않는다. 강체 유한회전의 zero
strain/energy, 에너지 gradient·내력 tangent, 좌표 공변성, 선형극한을 검사한다.
### FEM-REQ-HEX8-007 — 일관 질량
### FEM-REQ-HEX8-007 — Reference row-sum lumped 질량
\((M_e)_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_b\det J_{0g}\)를 사용한다.
\((M_C)_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_b\det J_{0g}\)를 먼저 full24×24로 계산하고,
\((M_L)_{ai,bj}=\delta_{ab}\delta_{ij}\sum_c(M_C)_{ai,ci}\)를 사용한다.
기준 형상과 밀도로 정해져 변형·시간에 따라 바뀌지 않으며 회전 자유도·drilling 관성은 없다.
고유치와 동해석은 같은 전역 일관 M을 사용한다. Row-sum lumping·nodal block 치환은 금지한다.
고유치와 동해석은 같은 전역 lumped M을 사용한다. 행 합은 BC restriction 전에 계산하며
M_C의 free block만 행 합하거나 warped 요소를 rho*V/8로 대체하지 않는다.
대칭 양정성·각 병진 방향 총질량·좌표 회전·독립 적분을 검증한다. 전역 행렬은 sparse로 조립한다.
### FEM-REQ-HEX8-008 — 경계와 집중력
@@ -256,7 +258,7 @@ mode vector를 물리 응답 변위/응력으로 복구하지 않는다.
`analysis_procedure`로 식별한다. 값 집합은 `linear-static`, `nonlinear-static-full-newton`,
`linear-frequency`, `hht-linear-dynamics`, `hht-nonlinear-dynamics`다.
`element_formulation=FESA-Hex8`, `integration_rule=gauss-2x2x2`,
`mass_formulation=consistent-reference`, source step 이름·입력 byte identity·단위 의미를 보존한다.
`mass_formulation=lumped-reference`, source step 이름·입력 byte identity·단위 의미를 보존한다.
Model row의 source instance/label은 기존 model identity 의미를 유지하되 Solid topology/section
분기를 추가한다. Node row는 Domain 선언 순서다. `/model/nodal_constraint_mask`는 U8[N,3],
@@ -330,7 +332,8 @@ Consistent M으로 \(T=v^TMv/2\), \(U=\sum W_g\det J_{0g}\)를 계산한다.
`energy_balance_error=T+U-T0-U0-Wext`다. 현재 BC는 동적 exact0여서 support work=0이다.
HHT의 알고리즘 소산과 quadrature에 따른 work 오차를 설명하며 각 frame exact conservation을
강제하지 않는다. Alpha0 내부 검사에서는 선형 무하중 보존을 독립 확인한다.
Moment와 angular momentum은 현재 위치와 consistent interpolation의 kinetic 식으로 평가한다.
Moment와 angular momentum은 현재 절점 위치와 reference lumped M의 kinetic measure로 평가한다.
T=0.5*v^T*M_L*v, P=sum(m_a*v_a), L=sum(x_a×m_a*v_a) 및 rates를 같은 measure로 계산한다.
### FEM-REQ-HEX8-019 — 실패와 진단
@@ -380,7 +383,7 @@ numeric controls로 정하고 독립 검토한다. 외부 5%/1%를 내부 정확
| 비선형 정적 | `hexa_nonlinearstatic.inp` | 동일 suffix: 완료 load-factor frame의 U·RF·적분점 Cauchy S |
| 선형 동적 | `hexa_dynlinear.inp` | `hexa_dynlinear_U.csv`: initial 포함 101 frame U1–3 전체 |
| 비선형 동적 | `hexa_dynnonlinear.inp` | `hexa_dynnonlinear_U.csv`: initial 포함 101 frame U1–3 전체 |
| Frequency | `hexa_freq.inp` | 원본 modal Value 결과 아직 없음. 사용자 준비 자료로 최저10 modes를 비교해야 함 |
| Frequency | `hexa_freq.inp` | 사용자 제공 `hexa_freq.txt`의 최저10 modal Value(고유치 λ)를 비교 |
현재 inventory는 442 nodes, 300 elements다. 정적 U/RF 각442행, 수정된 정적 S 각2400행의
`IntPt=1..8`, 동적 U 각각44642행이다. 기존 elemental-nodal 응력 CSV의 위치 계약을
@@ -438,6 +441,21 @@ Generalized sparse FEAST의 공개 진입점은
## 현재 checklist
- [x] 2026-10-11 HEX8-ADR-010의 full reference row-sum M: BC 이전 행 합·warped oracle·질량/에너지·고유치/HHT/출력 검증.
- [x] Lumped 변경본 독립 numerical/physics 검토와 필수 원본5 case 재검증. [채택 evidence](lumped-mass-adoption.md): 정적2·고유치 Debug, 동적2 production Release.
- [x] Lumped 변경본 전체 MSVC Debug CTest의 자연 종료·판정: 789개 native8(784 PASS·4 FAIL·1 SKIP). Stale factory/overflow test 수정 후 공식 focused 2 PASS; C08a 정확도·C08b 새 회전 예외 및 C04a SKIP은 미해결로 구분. [채택 evidence](lumped-mass-adoption.md).
- [x] 필수 최저10 modal Value 불일치 해결: 변경본 Debug 실행·원본 비교 모두 native0, 최대 상대차 `0.0019610496%`. 기존 consistent의7/10 FAIL은 아래 과거 이력으로 보존한다.
- [x] 최종 변경 diff의 독립 검토와 후속 개발 인계: 공용 mass consumer·BC partition·관성/반력·출력 metadata 연결에 새 코드 finding0. [최종 검토와 인계](lumped-mass-adoption.md#최종-검토와-인계)에 완료 경계와 C08b 후속 조사 조건을 기록했다.
- [x] 2026-10-13 장시간 전체 검증을 제외한 후속 확인·인계: 현재 Debug 관련91 PASS·Python96 PASS·보존된 원본5개 재비교 PASS. [최종 인계](final-handoff.md)에 source 동일성·독립 검토·최적화 이후 검증 범위를 구분했다.
- [ ] FEM-REQ-HEX8-024 최종 완료 판정: 과거 C08b runtime FAIL은 후속 승인된 초기 Newton 정책에서 해소됐고 ADR-018의 C09·공식 Release C08a7도 통과했다. 최신 C08b·Shell 원본·전체 Debug는 사용자 중단이며 전체 검증은 성능 최적화 후 수행한다. 기존 전체802의799 PASS·C08 정확도 FAIL2·C04a SKIP1 이력은 보존하고 최신 source의 전체 통과로 승계하지 않는다. [최종 인계](final-handoff.md)를 따른다.
## 이전 구현의 검증 이력
이하 체크박스는 해당 시점의 수행·미완료 기록이며 현재 checklist가 아니다.
기존 modal FAIL을 새 질량의10개 PASS로 소급 변경하지 않는다.
아래 체적 평균 구현의 기존 체크와 수치는 consistent M 당시 이력이며 lumped 변경본 통과로 승계하지 않는다.
2026-10-10 사용자 B 승인은 HEX8-ADR-009의 체적 평균 energy를 다섯 절차에 적용하고
전체 재검증하는 변경이다. 아래 관련 항목은 변경본에서 다시 확인한다. 이어지는 이전
pointwise 구현의 실행 기록은 과거 evidence이며 변경본 PASS로 승계하지 않는다.
@@ -455,9 +473,9 @@ HHT 식·기준 consistent M·입력·고정 schedule·100회·Si/exact-zero·
- [x] 체적 평균 선형·비선형 HHT u/v/physical a·시간수렴·수지 내부 검증
- [x] 체적 평균 공식 HDF5/CLI/self-check/실패 final 보존 내부 검증
- [x] 정적2·동적2 원본 필수 family 비교 PASS
- [ ] 사용자 원본 최저10 modal Value 제공 및 필수 비교 PASS
- [ ] 사용자 원본 최저10 modal Value 필수 비교 PASS — 원본 제공 완료, 7/10 family FAIL
- [x] 최신 전체 MSVC Debug build/CTest·기존 baseline 대조 완료
- [x] Independent numerical/physics blocker0·범위/한계/evidence 기록 완료
- [ ] 최종 필수 고유치 불일치 해결 및 independent numerical/physics blocker0·범위/한계/evidence 완료
체적 평균 구현은 frozen `b2abd739`를 root `18b36c1`로 연결했다. 작성자 관련150/150,
시간수렴3 GTests/4물리 사례 및 최종 실제 재컴파일3/3은 native build/CTest0/0이다.
@@ -469,10 +487,12 @@ HHT 식·기준 consistent M·입력·고정 schedule·100회·Si/exact-zero·
새 예외는0이며 전체 green은 아니다. 두 기존 실패의 metric body는 baseline과 동일하고,
SKIP은 보존된 상세 출력이 없어 이름·상태의 동일성만 확인했다.
새 선형·비선형 정적 원본의 U1326/RF51/S14400은 각각 필수 비교 native0으로 PASS했다.
새 고유치 공식 readback은 precheck PASS이나 modal Value 부재로 비교 native2·NOT RUN이다.
새 고유치 공식 readback은 precheck PASS다. 2026-10-11 제공된 TXT의 최저10 Value를
실제 비교한 결과 native1·7/10 family FAIL이다. 원본 부재로 native2·NOT RUN이었던
이전 기록은 과거 evidence로 보존한다. [최종 비교](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)를 따른다.
새 두 동적 원본도 각각101개 U family 비교 native0·실패 행0개다. 두 동적 원본의 수치·물리
독립 검토도 실제101 endpoint에 한정한 bounded PASS다. 전체 Python은 기존 import의
collection5 오류/native2·실행0개다. Modal 비교 부재와 기존 회귀 예외는 이 통과로 없어지지 않는다.
collection5 오류/native2·실행0개다. Modal 수치 불일치와 기존 회귀 예외는 이 통과로 없어지지 않는다.
공간수렴 증거는 실제 두 축을 세분화한 지정 굽힘장 에너지다. 평형 cantilever는 길이
방향만 세분화하고 두께/폭은2요소로 고정한 tip 추세이며 평형해의 공간차수 증거가 아니다.
@@ -498,7 +518,7 @@ native CTest exit0이며 독립 수치 검토를 통과했다. 두 정적 원본
실제 CLI·HDF5·full-pair RN64·실패 final 보존 관련17/17도 native build/CTest0/0이다.
이 범위의 완료와 외부 비교·최신 전체 회귀는 구분한다. 실행 방법은 [README](README.md),
세부 근거와 한계는 [수치 검토](numerical-review.md)에 있다.
원본 frequency 결과 부재는 구현 진행을 막지 않지만 기능 검증 완료를 막는다.
다음은 원본 frequency 결과가 제공되기 전 pointwise 구현의 비교 이력이다.
비교기 `317fe5c`는 원본 identity·schema·finite·허용오차·원본 덮어쓰기 보호의 독립 검토와
관련124/124 Python 검사(native0)를 통과했다. Root 연결 후 같은 관련124/124도 native0이며
정적 수치 실패와 modal NOT RUN을 재현했다. 두 정적 원본은 실제 CLI native0이지만
+31 -4
View File
@@ -1,16 +1,39 @@
# Hex8 구조해석
개인 연구용 FESA에 8절점 육면체의 선형 강성, Total Lagrangian–StVK 기하비선형
내력·접선 강성과 기준 형상의 consistent 질량을 추가한다. 요소당 병진 자유도는24개이며
내력·접선 강성과 기준 형상의 row-sum lumped 질량을 추가한다. 요소당 병진 자유도는24개다.
2026-10-11 [HEX8-ADR-010](ADR.md)이 질량 정책을 변경했다. 아래 기존 구현의 실행 결과는
consistent M의 당시 evidence이며 lumped 변경본 재검증은 [PRD](PRD.md)의 현재 checklist를 따른다.
2026-10-13 현재 구현·필수 원본5개 비교·검토·인계를 마쳤다. 이번 확인은
Debug 관련 C++91 PASS·Hex8 비교기 Python96 PASS 및 보존된 원본5개 결과의
현재 비교기 재대조 PASS다. 새 장시간 원본 실행이나 전체 CTest는 수행하지 않았다.
정적2·고유치의 원본 결과는 Debug, 동적2는 Release에서 생성한 기존 근거다.
Hex8 경로의 source 동일성과 독립 검토, 성능 최적화로 넘길 범위는
[최종 인계](final-handoff.md)에 기록했다.
초기 lumped 변경본의 관련38개·Python137개·전체789개의 결과와 당시 Shell
실패는 [채택·재검증 보고서](lumped-mass-adoption.md)의 과거 이력이다.
당시 C08b runtime 실패는 후속 승인된 초기 Newton 정책으로 해소됐고,
ADR-018의 C09와 공식 Release C08a7도 통과했다. 최신 C08b·Shell 원본·전체
Debug는 사용자 중단이며, 전체 검증은 성능 최적화 후 진행한다.
FEM-REQ-HEX8-024의 최종 통합 완료 판정은 보류한다.
선형/비선형 정적, reference lumped-mass frequency,
선형/비선형 HHT 동해석을 typed state에서 공식 HDF5와 CLI까지 연결한다.
다음 단락은 변경 전 consistent mass 구현의 이력이다.
강성·질량·복구에2×2×2 reference 적분점을 사용한다. 2026-10-10 승인으로 deviatoric 항과
요소 평균 infinitesimal/Green trace 체적 energy를 사용한다. 변경본 구현·내부 검증은 완료했고
두 정적 원본의 U/RF/S 및 두 동적 원본의101-frame U 필수 비교도 PASS다.
실제 정적·동적 원본의 독립 수치·물리 검토도 bounded PASS다. 전체787 CTest는
784 PASS·기존 Shell FAIL2·SKIP1(native8)으로 종료했고 추가170개는 모두 PASS다.
전체 green은 아니며 modal Value 원본은 대기 중이다. 전체 Python도 기존 collection5
전체 green은 아니다. 2026-10-11 제공된 modal Value 원본과 실제 비교했으나
최저10개 중7개가1% RMS 기준을 초과했다. 최대 차이는5번 고유치의20.2513%이며
[최종 비교](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)에 근거를 기록한다.
필수 modal 불일치가 해결되기 전 기능 검증 완료는 대기다. 전체 Python도 기존 collection5
오류로 native2·실행0개다.
선형/비선형 정적, consistent-mass frequency,
선형/비선형 HHT 동해석을 typed state에서 공식 HDF5와 CLI까지 연결한다.
구현과 기능 검증 완료는 다르다. 원본 정적2·동적2의 필수 수치 비교, 사용자 modal Value와
최신 전체 회귀·최종 검토가 완료 조건이다. 현재 상태는 [PRD checklist](PRD.md#현재-checklist),
@@ -65,6 +88,10 @@ Restart는 지원하지 않는다. [정밀도 정식화](precision-formulation.m
[원본 mapping](reference-model.md)은 case/frame/source identity·point 순서·RF projection을
소유한다. 독립 평가의 범위는 [수치 검토](numerical-review.md)와 [물리 검토](physics-review.md),
실패와 수정 근거는 [lessons](lessons.md)에 보존한다.
원본 고유치 불일치의 [질량·요소 설정 조사](reference-mass-investigation.md)는 공식
Abaqus row-sum mass 설명과 별도 K/M 분리 계산을 기록한다. Mean K+lumped M의
수치 재현은 채택 전 연구 이력이다. 현재 [HEX8-ADR-010](ADR.md)의 production 변경본은
[별도 새 실행](lumped-mass-adoption.md#원본-비교)으로 원본5개 비교 PASS를 확인했다.
## 적용 한계
@@ -0,0 +1,68 @@
# Hex8 구현·검토 인계
2026-10-13. 사용자 요청에 따라 장시간 전체 검증을 수행하지 않고 남은
검토·기존 결과 재대조·인계를 정리했다. Hex8 구현과 이 범위의 검증은
확보했으며, FEM-REQ-HEX8-024의 최신 전체 통합 완료 판정은 보류다.
현재 체크리스트는 [PRD](PRD.md#현재-checklist)에만 둔다.
## 이번에 확인한 근거
| 확인 | 결과 | 적용 범위 |
| --- | --- | --- |
| 구성된 MSVC x64 Debug 관련 CTest | 91/91 PASS, native0,254.64초 | Hex8 kernel·Solid static/frequency·HHT state/kinematics/dynamics/Float64 history. 전체 CTest·장시간 원본 동해석·전체 시간수렴 아님 |
| Hex8 비교기 Python 검사 | 96 PASS, native0,38.29초 | `tests/test_compare_hex8.py`; Python 전체 suite 아님 |
| 현재 비교기로 보존된 원본5개 결과 재대조 | 정적2·고유치·동적2 모두 native0 | 기존 성공 native/HDF5와 현재 read-only 원본을 사용한 새 비교. 새 솔버 원본 실행 아님 |
| 기존 검증본과 source identity 대조 | production190 중180 동일,10 변경; 원본16개 모두 동일 | Hex8 및 Solid 실행·질량·복구·출력 경로는 동일. 변경10개는 Shell HHT/state/element/writer 관련이며 전체 공용 binary의 동일성은 주장하지 않음 |
| 독립 수치·물리 인계 검토 | 해당 범위에서 새로 조치할 문제 없음 | Hex8 직접 소비 소스27개 및 기존 evidence39개의 hash 대조. 별도 질량 적분의 한 축 총질량444063.050932, 양의 nodal mass와 기존 수지 검토 확인. 최신 전체 물리 PASS 아님 |
이번 작업에서는 production·C++ 검사·physics·질량·입력·schema·tolerance를
변경하지 않았다. 전체 build/CTest와 C08b 미세 grid, 장시간 원본 CLI를
시작하지 않았다. 기존 실패·중단 기록을 PASS로 바꾸지 않았다.
실행 근거는 `.dryforge/hht-remediation-20261012/`의
`hex8-handoff-bounded-debug.{native.json,raw.log}`, `hex8-handoff-python.{native.json,log}`,
`hex8-handoff-comparisons/execution.json` 및 case별 보고서다.
독립 검토는 같은 폴더의 `hex8-handoff-numerical-review.json`과
`hex8-handoff-physics-review.json` 기록을 따른다. 과거 manifest에 없는
private header는 현재 hash만 별도로 기록하며 과거 동일성 입증 범위에 넣지 않는다.
## 보존할 구현·물리 경계
Local kernel은 reference8점 deviatoric 항과 요소 평균 trace energy를 사용한다.
선형 K와 비선형 f/Kmat/Kgeo/Kt는 같은 energy에서 유도하며, 응력·변형률은
Gauss point identity로 반환한다. 질량은 full element consistent M의
reference row sum을 **BC 제한 전에** 구한 대각 M이다. Eigen/HHT·관성력·
반력·운동에너지·운동량은 같은 질량을 사용한다.
Solid HHT의 normalized high+low 상태와 최종 RN64 결과 의미를 유지한다.
실패 candidate가 accepted history나 기존 최종 HDF5를 변경하지 않아야 한다.
원본5개 비교와 기존 독립 수지·modal 검산은 검증한 모델에 한정한 근거다.
임의 distorted mesh·큰 변형·다른 시간간격의 정확도나 전체 green을 보증하지 않는다.
상세 물리 근거는 [물리 평가](physics-evaluation.md),
수치 기준은 [numeric controls](numeric-controls.md)를 따른다.
## Shell 영향과 미검증 범위
초기 lumped 변경본의 C08b 회전 runtime 실패는 후속 승인된 초기 Newton
정책에서 해소된 이력이다. 이후 ADR-018 변경본의 C09와 공식 Release
C08a7-grid도 통과했다. 이 결과들을 과거 전체789/802 검사에 소급 합산하지 않는다.
최신 전체 Debug는44/856 PASS 후 사용자 중단, Release C08b도 중단됐다.
최신 Shell 원본은99증분·t=9.9까지 accepted 로그만 있으며 현재 HDF5가 없어
새 Abaqus 변위 비교를 수행할 수 없다. [중단 시점 비교](../hht-implicit-dynamics/interrupted-validation-comparison.md)를
따르며 C08b·현재 Shell 원본 비교·전체 통합·독립 전체 물리 판정은 남아 있다.
이는 Hex8 필수 원본5개 비교가 다시 실패했다는 뜻이 아니다.
## 성능 최적화 후 재검증으로 넘길 내용
사용자가 요청한 다음 순서는 성능 최적화 후 전체 검증이다. 이번 작업은
최적화 구현을 시작하지 않았으며 느린 연산의 원인을 계측 없이 단정하지 않는다.
먼저 같은 source/input·빌드 구성·thread 설정에서 local 계산·조립·solve·
복구·출력 시간을 분리해 기준을 확보한다. 중복 계산 제거와 데이터 재사용은
실제 state/operator 수명을 지켜야 한다.
연산 순서나 reduction을 바꾸면 수치 변경으로 다룬다. 시간간격·grid·질량·
반복 제한·수용 기준을 줄여 성능 개선으로 보고하지 않는다. 최적화 전후
관련 analytical/invariant·failure preservation·serial/TBB 결정론을 대조하고,
최종 source에서 구성된 전체 MSVC Debug build/CTest와 필수 원본 비교 및
독립 물리 검토를 다시 수행한다. 현재 bounded 결과는 그 실행을 대체하지 않는다.
+21 -10
View File
@@ -184,22 +184,33 @@ S의 isotropic 항이 요소 내 공통이어도 finite Cauchy pressure가 반
저장 strain을 \(\operatorname{dev}E+\bar\theta I/3\)로 치환하지 않는다. Point stress는 같은 point의
strain만으로 결정되는 이전 pointwise law가 아니라 element mean에 의존한다.
## Consistent mass와 generalized eigen
## Reference row-sum lumped mass와 generalized eigen
\[
M_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_bw_g,
\quad T={1\over2}v^TMv.
(M_C)_{ai,bj}=\delta_{ij}\sum_g\rho_0N_aN_bw_g,
\quad m_a=\sum_b(M_C)_{ai,bi}=\sum_g\rho_0N_aw_g,
\quad (M_L)_{ai,bj}=\delta_{ab}\delta_{ij}m_a,
\quad T={1\over2}v^TM_Lv.
\]
M은 reference-state 상수다. Positive weights와8점 interpolation matrix의 full rank에서 SPD가
따른다. Axis-aligned brick의 scalar block은 \(\rho V/216\)에 각 축 sign이 같으면2/다르면1인
세 factor의 곱이다. Direction별 총합은 rho V, row sum은 rho V/8다. Production에서는 lump하지 않는다.
세 factor의 곱이다. Direction별 총합은 rho V, row sum은 rho V/8다. 2026-10-11
[HEX8-ADR-010](ADR.md) 승인에 따라 production은 full24×24 M_C의 행 합 M_L을 사용한다.
행 합은 BC restriction 전에 계산한다. Warped 요소에서는 일반적으로 m_a가 같지 않다.
Positive rho/N/weights에서 m_a>0이며 M_L은 diagonal SPD다.
같은 nodal v에서 `T_L−T_C=0.25*sum_g rho*w_g*sum_ab N_a*N_b*|v_a−v_b|²>=0`이다.
따라서 M_L−M_C는 positive semidefinite이며 다음 consistent lower bound는 M_L에도
보수적으로 유효하다. Uniform translation energy와 총질량을 보존하지만 일반 속도장의
에너지·orbital inertia·고유치는 달라진다. Shell의 finite-rotation nodal block 방식과 구별한다.
8점 shape evaluation의 minimum singular value 제곱은1/27이다. Exact local quadrature에서
\(m_{e,lower}=\rho\min_gw_g/27\)는 local M의 positive lower bound다. Global scatter·principal free
restriction에도 active-node incidence를 고려한 lower bound가 보존된다. 예를 들어 모든 active
node에 적어도 하나의 element가 있는 경우 min_e bound는 conservative global lower bound다.
실제 FP matrix의 roundoff와 SPD evidence를 포함해야 하며 이 수학적 식만으로 설치 backend의
실제 FP matrix의 기존 roundoff guard에는 full row-sum 누적/조립 graph를 포함해 검토하고
SPD evidence를 확인해야 한다. 이 수학적 식만으로 설치 backend의
실행을 검증했다고 주장하지 않는다.
무응력 원형상에서 위 새 energy의 K0를 사용해 \(K_{ff}\phi=\lambda M_{ff}\phi\)를 풀며 constrained component0으로 복구하고
@@ -236,7 +247,7 @@ R=MA_{n+1}+(1+\alpha)(f_{n+1}-F_{n+1})-\alpha(f_n-F_n),
\]
f/U/Kt는 위 평균 trace energy에서 함께 평가한다. Linear HHT는 그 zero-state K0,
비선형 HHT는 trial의 cross-GP 전체 Hessian이다. 상수 reference consistent M·계수·고정 h·
비선형 HHT는 trial의 cross-GP 전체 Hessian이다. M은 상수 reference lumped M_L이며 계수·고정 h·
100회·strict physical/correction/update 판정은 변경하지 않는다.
이전 free endpoint가 \(Ma_n+f_n-F_n=0\)이면 R=(1+alpha)(Ma_next+f_next−F_next)다.
@@ -245,10 +256,10 @@ Endpoint 표현을 쓰면 tangent도1/(1+alpha)로 함께 환산해야 한다. I
Ma+f−F의 constrained projection이다. Initial u/v0에서 Mff a0=Ff(0+)−ff(0), A0=a0다.
곡선은 endpoints에서 실제 평가하며 prescribed dynamic q/v/a/A는 exact0다.
Physical momenta는 interpolated current x/v를 사용해 \(p=\int\rho v\,dV_0\),
\(L=\int x\times\rho v\,dV_0\)다.8점 consistent quadrature와 nodal mass 표현이 일치해야 한다.
Angular-momentum rate는 \(\int x\times\rho a\,dV_0\)이며 v×v 항은0이다.
Consistent symmetric M에서 nodal 표현의 \(\sum v_a\times(Mv)_a=0\)도 성립한다.
Physical momenta는 current nodal x/v와 같은 reference lumped measure를 사용해
\(p=\sum_a m_av_a\), \(L=\sum_a x_a\times m_av_a\)다.
Rates는 \(\dot p=\sum_a m_aa_a\), \(\dot L=\sum_a x_a\times m_aa_a\)이며
각 node에서 v×v 항은0이다. 독립 oracle도 같은 `rho*N_a*dV0` 적분을 사용한다.
External/support moment는 같은 current 위치로 구한다. HHT 및 force trapezoid work는 frame별
exact energy conservation을 의미하지 않는다. Wext는 endpoint force·du trapezoid 누적,
error=T+U−T0−U0−Wext다. Alpha0 linear unforced benchmark에서는 독립 보존을 확인한다.
+23 -4
View File
@@ -54,7 +54,11 @@ repository-conforming 이름 조정은 허용하며 physics/schema 수정은 아
f[24], Kmat/Kgeo/Kt[24,24], strain energy와8 typed integration-point rows를 반환한다.
Linear은 새 체적 평균 energy의 zero Hessian material=K0/geo=0,
nonlinear은 같은 trial의 체적 평균 Green energy 미분이다. `ComputeMass()`는
local consistent24×24 Matrix contribution이며 absent density이면 실패한다.
full reference consistent24×24 matrix의 각 row sum을 대각에 둔 local lumped24×24
Matrix contribution이며 absent density이면 실패한다. Row sum은 BC reduction 전에
전체24 성분으로 계산하고 이후 실제 constraint mask로 restriction한다. Warped 요소에서
동일한 `rho*V/8`을 모든 절점에 대신 배정하지 않는다. Eigen/HHT는 같은 reference mass를
사용하며 시간·변형에 따라 재계산하는 current mass가 아니다.
- Typed Solid point row는 internal element index, point ID1–8, natural/reference coordinate3,
Cauchy stress6·infinitesimal/Green tensor strain6를 가진다. Identity/상수 coordinates를 trial마다
다른 source row로 만들지 않는다. 저장 strain은 실제 kinematics의 strain이며 평균된
@@ -92,6 +96,16 @@ Metadata의 추가 공개 의미는 다음과 같다.
| `unit_system_label` | `user-consistent-unspecified` |
| `coordinate_convention` | `global-cartesian; reference-strain; current-cauchy-stress` |
| `component_order` | `node-major; UX,UY,UZ` |
| `mass_formulation` | `lumped-reference`; full reference element matrix의 row-sum diagonal mass |
2026-10-11 사용자 승인으로 질량의 공개 의미와 `mass_formulation` 값을
`consistent-reference`에서 `lumped-reference`로 변경한다. 입력에 질량 선택 parameter를
추가하지 않으며 기존 CLI, schema_version=1, dataset field/shape/dtype, high+low 내부 상태의
round-to-Float64 규칙은 유지한다. 과거 consistent 결과는 당시 evidence로 보존하며 현재
reader/self-check/comparator는 mass identity mismatch를 tolerance 적용 전에 거부한다.
Metadata를 바꾸어 과거 수치 결과를 새 정책의 결과로 표시하지 않는다. 이 변경만으로
새 정책의 verification PASS를 선언하지 않으며 production readback와 원본 비교는 새
실행 evidence가 필요하다.
Physical dataset은 `component_names`와 `unit_dimensions`를 UTF-8 string으로 기록한다.
각 frame dataset에는 `frame_index:U64`, `increment_index:U64` 및 해당 `time:F64` 또는
@@ -116,7 +130,9 @@ K0는 승인된 mean-trace energy의 zero Hessian이고 nonlinear Wg는
`mu*dev(Eg):dev(Eg)+0.5*kappa*theta_bar^2`다. 같은 theta_bar를8점의 reference 가중치로
계산하므로 그 합은 요소 체적 항 `0.5*kappa*V*theta_bar^2`와 같다. 기존 attribute 문자열과
field/schema/dtype은 유지하며 새 energy 의미는 HEX8-ADR-009 및 정식화를 따른다.
Kinetic은 `0.5*v^T*M*v`, work는 `sum(0.5*(F_old+F_new)*delta_u)`이며 initial0이다.
Kinetic은 동일한 reference lumped M으로 계산한 `0.5*v^T*M*v`이고, eigen의
mass normalization과 HHT의 관성력·반력·physical momentum에도 같은 M을 사용한다.
Work는 `sum(0.5*(F_old+F_new)*delta_u)`이며 initial0이다.
Balance error는 `T+U-T0-U0-Wext`이고 HHT numerical dissipation을0으로 보정하지 않는다.
Constrained mask/prescribed 의미·point ordering은 model inventory에서 확인한다.
@@ -134,5 +150,8 @@ Quantity/key/family와 원본 준비 상태는 [reference-model](reference-model
Static은 final factor-one source increment를 FESA final accepted frame에 대응한다. Dynamic은
integer increment0..N과 decimal source time을 n*h에 대응한다. RF는 constrained projection,
S는 element/IntPt와6 global Cauchy component다. 좌표는 보조검사이고 ID 추정에 쓰지 않는다.
Modal Value는 원본이 제공되면 quantity/units/mode/step을 확인하며 최저10 eigenvalues를
singleton families로 비교한다. Missing 원본·nonfinite/identity/completeness 오류는 미실행/실패다.
Modal Value는 제공된 `hexa_freq.txt`의 고유치 λ(`1/time^2`)를 최저10개 mode별
singleton families로 직접 비교한다. `Freq (cycles/time)`는 보조 열이며 변환하지 않는다.
TXT에 없는 step field는 고정 case와 승인 입력의 sole `Step-1`에 한정해 대응한다.
형식·hash·mode/finite 검사는 [원본 mapping](reference-model.md)을 따른다.
Missing 원본은 미실행, nonfinite/identity/completeness 오류는 실패다.
@@ -0,0 +1,168 @@
# 고유치·HHT lumped mass 채택과 재검증
2026-10-11 사용자가 고유치와 HHT의 질량을 lumped mass로 승인했다.
[HEX8-ADR-010](ADR.md)과 [HHT-ADR-012](../hht-implicit-dynamics/ADR.md)의 변경본 evidence다.
기존 consistent 구현의 통과·실패와 private 비교 연구를 현재 검증으로 승계하지 않는다.
현재 checklist는 각 기능 PRD에 유지한다.
## 계산과 결과 계약
- MITC4 고유치의 기존 nodal block lumped mass는 유지한다.
- MITC4 HHT는 `rho*N_i*dV0`의 절점 운동에너지에서 질량·관성력·convective 항·
관성 접선·운동에너지·선형/각운동량과 시간 미분을 함께 계산한다. 회전 block을
scalar diagonal로 치환하지 않는다. Geometry·moving drilling null·physical20
SPD/rcond 검사와 HHT 계수·초기화·허용값을 유지한다.
- Hex8은 기존 8점 적분의 전체 24×24 reference consistent matrix를 만든 뒤 각 행의
합을 대각에 배치한다. 이후 BC를 축소한다. Warped 요소의 절점 질량은 `rho*V/8`로
치환하지 않는다. 선형/비선형 HHT와 고유치가 같은 질량을 사용한다.
- HDF5의 mass metadata는 Shell `nodal-lumped-kinetic`, Hex8 `lumped-reference`다.
기존 consistent metadata는 현재 비교기가 거부한다. Schema layout·dtype와 공개 입력
옵션은 유지한다. 원본 reference와 tolerance를 변경하지 않았다.
## 변경본 검사
Evidence는 `.dryforge/lumped-mass-adoption-20261011/`에 보존한다. Git HEAD만으로는
아직 커밋하지 않은 변경본을 식별할 수 없으므로 실제 binary·입력·결과 hash도 기록한다.
| 검사 | 현재 결과 |
| --- | --- |
| MSVC x64 Debug 빌드 | native0; 새 production kernel·절차·writer와 unit/integration/reference executable 연결 |
| 새 질량 관련 focused C++ | 38/38 PASS, native0 (`new-kernels.log`·`new-kernels-native.json`) |
| HHT/Hex8 Python 비교기 | 137 PASS (`python-focused.log`) |
| 독립 수치 검토 | 수식·조건 검사·BC 전 lumping·독립 oracle 검토 완료; 닫힌 실행 evidence와 남은 범위는 각 numerical report 참조 |
| 전체 Debug CTest | 789개 제외 없이 자연 종료, native8: 784 PASS·4 FAIL·1 SKIP (`full-direct-summary.json`) |
| 마지막 테스트 수정 후 Debug 재빌드·focused 검사 | build native0, discovery790. 외력 미분/pointwise 2 PASS 및 factory/overflow 2 PASS, 각각 CTest native0 |
Focused 검사는 Shell의 analytic mass·eigen 초기 질량 대조·warped nodal moments·Jensen·
moving null·scaled 관성 partial/effective tangent sweep와 omission mutation, Hex8의 affine/
warped 독립 절점 질량·BC 전 행합의 dense eigen oracle·관성 반력·독립 SDOF/MDOF 2차
U/V/A 수렴, 공식 HDF5 readback을 포함한다. 이 통과는 C08의 시간 정확도를 대신하지 않는다.
초기 `focused-kernels.log` 실행은 독립 dense oracle가 constrained 열을 먼저 제거한 오류를 검출했다.
전체 24 DOF 질량을 먼저 구성하도록 수정한 뒤 새 38개 검사를 통과했다. 이전 partial
실행 로그와 중단 이유는 `focused-interrupted.json`에 보존했다.
`python scripts/execute.py`는 현재 Debug preset으로 호출했다. 기존 전체 CTest의
16839초 기록이 runner의 1800초 deadline을 초과하며, 개별 테스트가 같은 임시 경로를
공유하므로 CTest 병렬 실행은 선택하지 않았다. 부분 실행을 보존하고 직접
`ctest --preset windows-msvc-ninja-debug --output-on-failure`로 제외 없이 직렬 실행한다.
이 실행은 `MKL_NUM_THREADS=1`, `OMP_NUM_THREADS=1`, `CTEST_PARALLEL_LEVEL=1`이며
수식·gate·허용값을 변경하지 않는다. 실행 중단을 수치 실패나 PASS로 보고하지 않는다.
새 C08a는 731.27초 후 FAIL로 종료했다. Finest `h=1/256`의 회전 좌표 가속도 최대
오차는 `5.6747291e-4`로 `1e-4`를 초과하고 마지막 두 오차 비의 raw log2 값은 `1.02838`, `1.02946`으로
요구 `1.8`보다 작다. 회전 속도/가속도의 100배 noise-separation도 충족하지 못했다.
Noise-separation 미달로 해당 rate의 N7 시간 정확도는 INCONCLUSIVE이며 raw 차수를
인증된 차수로 해석하지 않는다. 기존 consistent C08a와 실패 predicate는 같지만 새 질량의 수치가 달라졌으므로
metric body 동일성을 주장하지 않는다.
새 C08b는 438.18초 후 `h=1/256`에서 `invalid-dynamic-rotation` 예외로 종료했다.
완료한 `h=1/64,1/128`의 energy/L drift는 감소했지만, 나머지 세 grid와 마지막 두
refinement의 self-difference·finest 기준은 생성되지 않았다. 기존 consistent C08b는
다섯 grid를 완료한 뒤 정확도 기준에서 실패했으므로 이번 예외를 같은 baseline 실패로
취급하지 않는다. 별도 Debug probe는 `h=1/256`, 증분56, Newton 반복3,
`t=0.21875`에서 node index4의 유한한 회전 좌표
`(0.64127523,-1.19777570,3.61620987)`가 principal chart를 벗어났음을 확인했다.
자료는 `c08b-diagnostic/run.log`·`run-native.json`에 있다. 이 실행 당시 큰 Newton trial의
근본 원인은 미확정이었다. 후속 [2026-10-12 원인 조사](../hht-implicit-dynamics/newton-rotation-investigation.md)는
off-root moving-null 접선 상쇄와 두 private 해결 후보를 확인했다. 공식 C08b와 완료
blocker는 열린 상태이며 gate 완화나 coordinate clamp로 숨기지 않는다.
독립 검토에서 verification-only `RigidForceRates`의 사용되지 않던 병진 미분에
consistent 계수 `0.2/3`이 남아 있음을 발견했다. 이를 nodal mass `0.2`로 수정하고,
독립 volume force의 5-point 시간차분과 모든 24 rows를 대조하는 검사를 추가했다.
별도 Debug probe의 변경 전 RED는 병진 오류를 검출했고, 변경 후 미분 검사와 기존
pointwise force/power/momentum 검사 각각 PASS였다(`force-rate-oracle/`). 이 변경은
전체 CTest binary에 포함되지 않았으며, 종료 후 재빌드한 공식 Debug binary에서 관련 두
검사를 다시 통과했다(`final-oracle-rebuild/ctest.log`).
전체 로그를 집계하면서 추가 두 FAIL을 발견했다. Factory의 기존 consistent off-diagonal
기대값을 nodal diagonal `0.25`와 off-diagonal zero 검사로 수정했다. Overflow fixture의
`E=3e306`은 새 mass에서 validation scale이 finite이므로, 독립 계산에 따라 local K·λ·
spectral enclosure는 finite이면서 `||K||F+|λ|*||M||F`만 overflow하는 `E=4e306`으로
바꿨다. Production guard·tolerance는 유지했고 두 검사 모두 공식 Debug focused CTest에서
통과했다(`final-stale-fixtures.log`·`final-stale-fixtures-native.json`). 원문 전체 실행의
네 FAIL을 두 FAIL로 덮어쓰거나, 마지막 discovery790개를 전체 재실행했다고 주장하지 않는다.
전체 실행은 9131.26초 후 자연 종료했다. 마지막 세 test source의 수정 전후 production
190개 파일과 필수 원본16개 hash는 동일하다. 원본 두 동해석의 Debug 101 endpoints도
각각 PASS였다. 남은 미해결은 C08a 정확도·C08b Newton trial과 기존 C04a SKIP이며
전체 green 또는 HHT 기능 완료를 선언하지 않는다.
최종 test source 세 개·Debug binary·닫힌 로그의 hash와 후속 검사의 구분은
`final-test-identities.json`에 보존한다. 초기 helper identity record의 force-only 설명에
빠진 두 Hex8 test 수정을 별도 annotation으로 정정하고 원문 record는 유지했다.
## 원본 비교
각 원본 INP를 byte-identical 복사한 별도 경로에서 실제 CLI를 실행했다. Hex8 정적·
고유치는 Debug, 긴 원본 동해석은 같은 production 소스의 Release다. 전체 Debug 회귀와
reference 실행 구성을 구분한다. Private kernel override는 사용하지 않는다.
| 모델 | CLI / 비교 결과 |
| --- | --- |
| Hex8 frequency | Debug native0 / 원본 10 Value 모두 PASS. 최대 상대차 `0.0019610496%` |
| Hex8 linear static | Debug native0 / U·RF·8점 S PASS |
| Hex8 nonlinear static | Debug native0 / U·RF·8점 S PASS |
| Hex8 linear dynamic | Release native0 / 전체 101-frame U PASS |
| Hex8 nonlinear dynamic | Release native0 / 전체 101-frame U PASS |
| MITC4 HHT | Release native0 / 전체 101-frame U PASS, UR 경고 200건 |
원본 고유치의 기존 consistent mass 불일치는 새 production 실행에서 해소됐다.
원본 Value의 단위/quantity·모드 identity·행5%/RMS1% 정책은 그대로다. 독립으로
mean-volume K와 nodal mass를 조립한 공개 10개 모드의 residual은 최대 `1.16e-17`,
mass Gram 오차는 `1.33e-15`이며 고정 모드 성분은 exact0이다.
[물리 검토](physics-evaluation.md)는 이러한 제한된 확인과 잔여 범위를 구분한다.
다섯 Hex8 원본과 Shell 원본의 닫힌 실행 증거·HDF observable·외부 비교 metric/hash를
독립 감사했다(finding0). 자료는 `independent-closed-evidence.json`이며 실제 energy·
force/moment·반력·운동량 ledger는 두 기능의 `lumped-mass-physics-details.json`에 둔다.
Release 동해석으로 대체한 중복 Debug 원본 실행은 의도적으로 중단했다. 각 `interrupted.json`
및 raw native record를 보존하며 완료한 원본 비교로 세지 않는다. Release recorder의 folder
label이 case에 들어간 경우 원본 record를 보존하고 실제 입력 stem에서 logical identity를
명시적으로 유도한 `comparison-execution.json`을 별도로 사용했다.
Shell 원본은 변위 비교를 확인하는 coarse 시간간격의 모델이다. U 일치로 물리 가속도의
시간 정확도·에너지 보존·C08 완료를 추론하지 않는다. 기존 C08 실패와 잔여 지원 범위는
[HHT PRD](../hht-implicit-dynamics/PRD.md)와 [물리 검토](../hht-implicit-dynamics/physics-evaluation.md)에 유지한다.
## 최종 검토와 인계
2026-10-12 `hht_mass_probe_review`의 읽기 전용 최종 diff 검토에서 새 actionable 코드
finding은 없었다. Hex8 frequency/HHT는 full element M을 계산한 뒤 BC를 partition하고,
같은 assembled M을 high+low 관성 작용·endpoint 반력·운동에너지·선형/각운동량·effective
tangent에 전달한다. Shell eigen의 기존 lumped 경로와 HHT의 새 nodal kinetic 경로,
두 요소의 writer/self-check/comparator mass metadata 연결도 일치한다. Test-only 세 파일은
승인된 질량 oracle와 기존 nonfinite gate를 검증한다. 이 검토에서는 실행 근거를 재사용했고
build/test를 추가 실행하지 않았다.
아래 P1 판단과 인계는 초기 lumped 변경본의 실패 당시 기록이다. 후속 사용자 승인으로
[HHT-ADR-013 초기 Newton 정책](../hht-implicit-dynamics/newton-start-policy.md)을 적용했고
공식 C08b 5개 grid 모두 T=.25까지 회전 예외 없이 완료해 해당 runtime finding을
닫았다. 기존 시간 정확도·P 감소 실패는 유지하며 변경본 전체802 Debug 회귀는
native8:799 PASS·2 FAIL·1 SKIP으로 자연 종료했다. 원본 Hex8 선형/비선형 HHT의
101-frame smoke도 PASS다. 이 후속 결과를 아래 과거789개의 통과로 소급하지 않는다.
**당시 완료 판정의 P1 blocker는 C08b의 새 runtime 실패였다.**
[FEM-REQ-HEX8-024](PRD.md#fem-req-hex8-024--회귀완료-판정)는 신규/영향 검사 PASS와
신규 physics 오류0을 요구한다. 과거 C08b는 모든 grid를 완료한 뒤 정확도 기준에서
실패했고 현행 결과는 principal chart 예외이므로 동일 baseline 예외로 분류할 수 없다.
Hex8 원본5개·독립 수치/물리 검토·최종 diff 검토 완료와 기능 검증 완료를 구분한다.
후속 owner는 다음 자료와 경계를 인계받는다.
- 실제 실패 검사는 `HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`다.
전체 raw는 `.dryforge/lumped-mass-adoption-20261011/full-direct.log`와
`full-direct-summary.json`, 별도 계측은 같은 폴더의 `c08b-diagnostic/run.log`에 있다.
Probe의 증분56·반복3·node index4는 source node label5이며 회전 norm은 약 `3.86301>π`다.
- 다음 조사에서는 직전 accepted state와 predictor, correction, effective tangent 및
drilling regularity를 함께 확인해 큰 Newton trial의 원인을 분리한다. Positive physical20
mass나 원본 U 일치만으로 이 갱신의 안정성을 추론하지 않는다.
- 기존 gate·100회 full Newton·fixed schedule·물리 질량을 유지해 구현 오류를 조사한다.
시간 적분·회전 chart·수용 기준 변경이 필요하면 정식화와 독립 검토, 필요한 사용자
결정이 선행되어야 한다. 좌표 clamp나 tolerance 완화로 결과를 통과시키지 않는다.
- 수정 후 관련 검사·필수 비교·전체 Debug 회귀를 수행하고 C08a와 C04a도 별도 판정한다.
현행 전체789개와 후속 focused4개를 합쳐 최종790개 전체 PASS로 보고하지 않는다.
현재 완료 checklist는 [Hex8 PRD](PRD.md#현재-checklist) 한 곳에 둔다.
@@ -0,0 +1,262 @@
{
"review_date": "2026-10-12",
"scope": "\ub2eb\ud78c lumped \uc0dd\uc0b0 HDF\uc758 \uae30\uc900 8\uc810 \ub3c5\ub9bd \ubcf5\uad6c; \uc194\ubc84 \uc7ac\uc2e4\ud589 \uc5c6\uc74c; \ub0b4\ubd80 high+low gate \ud1b5\uacfc \uc8fc\uc7a5 \uc5c6\uc74c",
"cases": {
"hexa_linearstatic": {
"folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_linearstatic",
"configuration": "MSVC x64 Debug",
"sha256": "025fe733ac4fa1017babe8c698471a17ad275a43820356de9de535cdf3ba6a20",
"native_exit": 0,
"metadata_mass": "lumped-reference",
"frames": 1,
"mass_total": 444063.05093199987,
"maximums": {
"fixed_U": 0,
"free_RF": 0,
"RF_gap": 1.7462298274040222e-10,
"free_RN64_reconstruction": 2.696491492315545e-07,
"strain_gap": 9.677351422380381e-20,
"stress_gap": 1.2338205124251544e-08,
"U_gap": 1.1368683772161603e-13,
"force_ledger_gap": 1.978719410544727e-10,
"force_balance_ratio": 1.4290793322311065e-13,
"element_force_sum": 1.1641532182693481e-10,
"element_moment_sum": 1.4551915228366852e-10,
"element_force_ratio": 1.3028207107302464e-16,
"element_moment_ratio": 1.42464370853327e-16,
"center_xy_symmetry": 3.396772114885177e-10
},
"minimums": {
"detF": 0.9999869380847567,
"U": 186.35946178395668,
"T": 0.0
},
"final": {
"frame": 0,
"time": 0.0,
"node2_U": [
0.001861312878526077,
0.0018613125388488654,
4.563818307322808e-06
],
"T": 0.0,
"U": 186.35946178395668,
"W": null,
"defect": null,
"support_F_sum": [
-99999.99999931706,
-100000.00000010608,
-100000.00000000751
]
},
"max_T": 0.0,
"max_abs_defect": null,
"comparison_passed": true
},
"hexa_nonlinearstatic": {
"folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_nonlinearstatic",
"configuration": "MSVC x64 Debug",
"sha256": "33ee601b4c094474f28648f3671e254e3610d9ef46f021fc0c54ae8b87579e81",
"native_exit": 0,
"metadata_mass": "lumped-reference",
"frames": 10,
"mass_total": 444063.05093199987,
"maximums": {
"fixed_U": 0,
"free_RF": 0,
"RF_gap": 2.3283064365386963e-10,
"free_RN64_reconstruction": 35.36235751599321,
"strain_gap": 1.079172914361182e-19,
"stress_gap": 1.3707904145121574e-08,
"U_gap": 1.4210854715202004e-13,
"force_ledger_gap": 7.102585186657961e-10,
"force_balance_ratio": 2.489950723468516e-06,
"element_force_sum": 1.4551915228366852e-10,
"element_moment_sum": 2.9103830456733704e-10,
"element_force_ratio": 1.856999104988803e-16,
"element_moment_ratio": 1.7619557460248046e-16,
"center_xy_symmetry": 3.3990287624449667e-10
},
"minimums": {
"detF": 0.9999869391442063,
"U": 1.8636157385260317,
"T": 0.0
},
"final": {
"frame": 9,
"time": 0.0,
"node2_U": [
0.0018611071696827675,
0.0018611068297798912,
4.358230949307811e-06
],
"T": 0.0,
"U": 186.31853170879367,
"W": null,
"defect": null,
"support_F_sum": [
-100000.00455958676,
-100000.00455951673,
-100001.18947294424
]
},
"max_T": 0.0,
"max_abs_defect": null,
"comparison_passed": true
},
"hexa_dynlinear": {
"folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_dynlinear-release",
"configuration": "MSVC x64 Release, current production source",
"sha256": "051f92942d056672140aea4156134452aaaf006d7e6e6adeff381163e879f325",
"native_exit": 0,
"metadata_mass": "lumped-reference",
"frames": 101,
"mass_total": 444063.05093199987,
"maximums": {
"fixed_U": 0,
"free_RF": 0,
"RF_gap": 3.4924596548080444e-10,
"free_RN64_reconstruction": 1.1003464805980911e-07,
"strain_gap": 9.953828270320105e-19,
"stress_gap": 2.3102620616555214e-07,
"U_gap": 1.1368683772161603e-13,
"force_ledger_gap": 7.226450549069341e-10,
"force_balance_ratio": 1.4190042506689565e-16,
"element_force_sum": 3.2014213502407074e-10,
"element_moment_sum": 2.9103830456733704e-10,
"element_force_ratio": 2.1273649523223604e-16,
"element_moment_ratio": 2.199818933208794e-16,
"center_xy_symmetry": 3.4514411684574697e-10,
"fixed_V": 0,
"fixed_a": 0,
"fixed_A": 0,
"T_gap": 7.105427357601002e-15,
"P_gap": 3.637978807091713e-12,
"L_gap": 6.548361852765083e-11,
"W_gap": 1.1368683772161603e-13,
"defect_gap": 1.2789769243681803e-13,
"current_moment_ledger_gap": 1.5448254373149724e-09,
"current_internal_moment": 287.045277721086,
"actual_current_moment_balance": 287.04527772194706,
"current_moment_balance_ratio": 2.9064182947722226e-05
},
"minimums": {
"detF": 0.9999790423308456,
"U": 0.0,
"T": 0.0
},
"final": {
"frame": 100,
"time": 10.0,
"node2_U": [
0.0018176922724947634,
0.001817691931726987,
4.563816808086208e-06
],
"T": 0.24997898188787254,
"U": 177.74076426102997,
"W": 256.22123629162513,
"defect": -78.2304930487073,
"support_F_sum": [
-96232.31268672507,
-96232.31259548312,
-99999.75662111596
]
},
"max_T": 51.614568684415126,
"max_abs_defect": 78.2304930487073,
"comparison_passed": true
},
"hexa_dynnonlinear": {
"folder": ".dryforge\\lumped-mass-adoption-20261011\\references\\hexa_dynnonlinear-release",
"configuration": "MSVC x64 Release, current production source",
"sha256": "8730e5562c91b3c7c9e654c811d2791ab7d24fdcc62286b0b28efa7cdc5957d6",
"native_exit": 0,
"metadata_mass": "lumped-reference",
"frames": 101,
"mass_total": 444063.05093199987,
"maximums": {
"fixed_U": 0,
"free_RF": 0,
"RF_gap": 3.4924596548080444e-10,
"free_RN64_reconstruction": 1.0344348311264184e-07,
"strain_gap": 9.18501352178882e-19,
"stress_gap": 2.1944288164377213e-07,
"U_gap": 8.526512829121202e-14,
"force_ledger_gap": 9.998437633385038e-10,
"force_balance_ratio": 1.3976814460427568e-16,
"element_force_sum": 2.473825588822365e-10,
"element_moment_sum": 3.4924596548080444e-10,
"element_force_ratio": 2.297419857405169e-16,
"element_moment_ratio": 2.456492632639856e-16,
"center_xy_symmetry": 3.4549370656056233e-10,
"fixed_V": 0,
"fixed_a": 0,
"fixed_A": 0,
"T_gap": 7.105427357601002e-15,
"P_gap": 5.4569682106375694e-12,
"L_gap": 8.003553375601768e-11,
"W_gap": 1.7053025658242404e-13,
"defect_gap": 1.7053025658242404e-13,
"current_moment_ledger_gap": 1.798303914284888e-09,
"current_internal_moment": 2.3456436792912427e-09,
"actual_current_moment_balance": 1.6298145055770874e-09,
"current_moment_balance_ratio": 2.7423916459990335e-16
},
"minimums": {
"detF": 0.9999790435523218,
"U": 0.0,
"T": 0.0
},
"final": {
"frame": 100,
"time": 10.0,
"node2_U": [
0.0018178450958853847,
0.0018178447552973686,
4.365606357013274e-06
],
"T": 0.25133992029753627,
"U": 177.77055436719652,
"W": 256.2426406634893,
"defect": -78.22074637599522,
"support_F_sum": [
-96263.0385934654,
-96263.03853592947,
-100002.93934163265
]
},
"max_T": 51.61334640118332,
"max_abs_defect": 78.22074637599522,
"comparison_passed": true
}
},
"final_verification_scope": {
"full_789": {
"native_exit": 8,
"counts": {
"pass": 784,
"fail": 4,
"skip": 1
},
"log_sha256": "47b814880ebeaf923002a52d0919703fc4e0671b298e4ba2c026c5c2ba331da6",
"note": "\ucd5c\uc885 test-only \uc218\uc815 \uc804 raw \ud310\uc815\uc744 \ubcf4\uc874"
},
"final_debug_build_exit": 0,
"final_discovery_count": 790,
"final_790_full_executed": false,
"final_hht_oracle_focused": {
"native_exit": 0,
"passed": 2
},
"final_hex8_stale_fixture_focused": {
"native_exit": 0,
"passed": 2
},
"final_test_manifest_sha256": "83dfab0cad81d11351c0a039161da565529f0cc7f455263088d362cfd5426446",
"production_file_count": 190,
"reference_file_count": 16,
"independent_identity_mismatches": 0,
"remaining_status": "HHT C08a/C08b OPEN; C04a SKIP; \uc804\uccb4 \ud1b5\uacfc \uc8fc\uc7a5 \uc5c6\uc74c"
}
}
@@ -6,13 +6,22 @@
## 계산·형상 인증
2026-10-11 [HEX8-ADR-010](ADR.md)에 따라 M은 full reference row-sum diagonal이다.
아래 consistent M의 완료·실패 수치는 당시 이력이다. Lumped 변경본의 필수 원본5개
비교와 수치·물리 검토는 완료했으며 현재 범위는 [최종 인계](final-handoff.md)를 따른다.
사용자가 유예한 최신 전체 통합 검증은 완료로 표시하지 않는다.
Mass positivity 및 eigen search bound는 M_L−M_C>=0의 보수적 lower bound를 사용할 수
있으나 full row-sum 누적/조립의 실제 roundoff graph와 SPD evidence도 검토해야 한다.
BC 제한 이후 행 합으로 바꾸거나 기존 guard·수치 기준을 비교 결과에 맞춰 완화하지 않는다.
모든 input/파생 값/결과를 finite 검증하고 positive Jacobian·밀도·material capability를 확인한다.
정적·고유치와 기존 계산은 Float64다. 사용자 승인 [정밀도 변경안](precision-proposal.md)에 따라
Solid HHT의 내부 물리 상태와 힘·rates·수지·gate 계산은 normalized high+low를 사용한다.
Float64 sparse backend와 반올림 출력은 유지하며, 전체 상태 gate를 rounded 출력만으로
재계산한 gate PASS로 표현하지 않는다. 변경본 내부 검증과 정적2·동적2 원본 비교는
완료했다. 전체787 회귀 실행·baseline 대조도 완료했으나 기존 FAIL2·SKIP1을 유지한다.
Modal 비교는 원본 대기다. 실제 완료 범위는
Consistent M 당시 Modal 원본 비교는7/10 family FAIL이었다. 현재 lumped M의
최저10 Value는 모두 PASS이며 이 과거 실패를 소급 변경하지 않는다. 실제 완료 범위는
[PRD checklist](PRD.md#현재-checklist)를 따른다.
Whole-cell 인증은 outward interval coefficient bounds와
subdivision이며 estimate-only positive 검사와 abs(det J)를 허용하지 않는다.
@@ -1,5 +1,7 @@
# Hex8 독립 수치 검토
2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
검토 대상은 [PRD](PRD.md), [formulation](formulation.md), [numeric controls](numeric-controls.md),
[I/O](io.md), [reference mapping](reference-model.md)이다. 2026-10-08 작성자와 독립된
`hex8_t1_numerical` reviewer가 문서·관련 코드·원본을 대조했다. 수식에 추가 blocker는 없으나
@@ -242,3 +244,244 @@ binary hash라고 표현하지 않는다. 감사 native0·finding0, bounded evid
판정은 종료 evidence의 일관성·새 회귀 없음에 한정하며 전체 green·release 또는
미제공 modal Value의 통과 판정이 아니다. 실제 원본의 독립 물리 수지 범위는
[physics review](physics-review.md)를 따른다.
## 2026-10-11 제공 modal 원본의 독립 검토
제공된 `hexa_freq.txt`의 직접 읽기와 root 비교기 diff를 작성자와 독립적으로 검토했다.
새 TXT parser·실제 frequency 분기·원본 raw hash/보고서 보호·mode1–10 일대일 대응·반복
고유치 보존·유일한 source Step-1 binding·HDF5 quantity/unit/dtype/finite가 bounded PASS다.
영향 Python native0·JUnit136 PASS(95 Hex8/41 HHT)도 closed artifact로 확인했다.
원본14개를 포함한23개 소비 artifact의 SHA를 검토 전후 대조했고 모두 동일하다.
독립 audit native0·finding0은 비교 코드와 증거의 일관성 판정이다.
실제 λ 오차와 공통 row5%/singleton RMS1%를 독립 재계산한 결과 mode3/4/5/6/7/9/10의
7개 family FAIL을 재현했다. 최대 mode5는 원본52797 대 FESA63489.09126468376,
relative RMS0.20251323493160142다. `Value`와 `Freq`의 각 decimal 표시 해상도 구간에서
`f=sqrt(lambda)/(2*pi)` 관계는 일관되지만 이 보조 검토의 구간을 비교값 보정이나 tolerance로
사용하지 않았다. 동일 mode ID의 출력 값 그대로 판정했고 frequency로 바꾸지 않았다.
공식 readback의24 returned pairs와 선택10개, 저장된 original-pencil verification도 확인했다.
이는 FESA 자체 pencil의 검증량 확인이며 새 matrix 조립·eigensolve나 Gram 독립 재계산을
수행했다고 주장하지 않는다. 원본 λ만으로 K/M 중 원인을 특정할 수 없고, 원본 mode shape·
modal mass·실제 element/mass law 또는 operator evidence 없이 수식·질량·기준 변경을
정당화하지 않는다. 최종 기능 완료는 필수 modal 불일치 해결까지 대기다.
자료는 `.harness/hex8-evidence/mean-volume/modal-final/independent-result.json`,
`independent-native.json`, `independent-inventory.json`, `independent-audit.py`다.
결과 JSON SHA는 `48c359cf670f9e39792cf58bbe5d7498effabcfd5789c3025904ac8562af5e99`다.
전체 C++ 회귀는 직전 `18b36c1` 실행 기록을 참조했고 이번 새 실행으로 표현하지 않았다.
## 2026-10-11 원본 질량 분리 진단의 독립 검토
후속 [질량·요소 조사](reference-mass-investigation.md)의4way 계산을 독립 검토했다.
Fresh engineering shear B/Cdev·체적 평균 coupling·consistent 적분과 full 행 합 lumping 뒤
free restriction의 의미가 맞다. 저장된 두 K·두 M·고유벡터에서 같은 source mode별 오차,
총질량과 자체 residual·Gram을 독립 재계산했다. Audit native0·finding0, 소비자료 SHA 불변이다.
Mean K+consistent M은 실제 FESA λ를 상대차이4.57e-12로 재현하고, mean K+lumped M은
원본10개 λ 모두 상대차이0.00196105% 이내다. 이는 질량 선택 차이를 설명하는 강한 근거다.
원본 actual operator 직접 대조나 재조립/eigensolve를 수행했다고 주장하지 않는다.
진단 script의 `max_eta_r`는 infinity-norm backward residual이다. 공식 T5의
Euclidean/Frobenius eta_r와 이름만으로 동일시하지 않으며 두 규격을 별도 재계산했다.
후자의4조합 최댓값은3.79e-15 이하, Gram Frobenius 오차는3.36e-15 이하다.
Private eigsh의sigma0/k10 결과는 실제 FEAST lowest-N count/completeness 인증이 아니다.
현재 FESA mass 정책이나 실제 modal FAIL은 변경하지 않았다.
자료는 `.harness/hex8-evidence/mean-volume/modal-mass-investigation/independent-result.json`과
같은 폴더의 native/audit에 보존한다. 상세 원본·문서·metric·채택 경계는 위 조사 문서를 따른다.
## 2026-10-11 row-sum lumped production 채택의 독립 검토
[HEX8-ADR-010](ADR.md)에 따라 변경된 `ComputeMass`와 eigen/HHT oracle·metadata를
읽기 전용으로 검토했다. Full reference consistent24×24를 기존8점으로 계산한 뒤
각 전체 행 합을 대각에 저장한다. BC는 이후 procedure에서 적용되므로 구속 열의
질량을 잃지 않는다. Positivity/finite 실패를 값 보정으로 숨기지 않으며 stiffness,
high+low 상태·계수 lifting·HHT gate를 변경하지 않는다.
**HEX8-LM-NR-001 — CLOSED: dense eigen oracle의 BC 순서.** 최초 oracle는
full_mass를 free×free loop 안에서만 채워 constrained 열을 누락했다. 독립 검토에서
이를 지적했고, 전체24 DOF의 독립 closed-form consistent 행렬 생성→full row sum→
free restriction으로 수정된 코드를 확인했다. 새 실행 검증은 전체 회귀 결과와 구분한다.
수정 전 binary의 부분 실패/중단은
`.dryforge/lumped-mass-adoption-20261011/focused-interrupted.json`에 보존한다.
Warped fixture의 독립 map은
`X=(xi+.12*eta*zeta, 2*eta+.09*xi*zeta, 3*zeta+.15*xi*eta)`다. 직접 전개한
detJ는 `6-.0135*xi²-.036*eta²-.0324*zeta²+.00324*xi*eta*zeta`로 신규 oracle와
일치한다. rho2의 절점 질량은 `11.9454±.00024`이며 부호는 `sx*sy*sz`다.
Ni*detJ의 축별 차수는3 이하라 기존2점 rule과 독립3점 적분이 수학적으로 일치한다.
비균일 속도 `v_ax=a+1`에서 uniform rhoV/8 shortcut의 T와 차이는 −.00192이므로
새 검사는 총질량만 같은 잘못된 uniform lumping도 구별한다.
Mass lower bound `rho*min(w)/27`는 계속 보수적으로 사용할 수 있다. 양의 shape와
weights에서 `M_L-M_C`의 quadratic form은 절점 속도 차이 제곱의 양의 합이다.
따라서 기존 consistent SPD lower bound는 lumped에도 유효하다. 추가 full-row 양의
합산은 고정 순서이며 기존512eps element/assembly budget과 비교했다. 새로운 기준
완화나 eigen upper-bound를 diagonal ratio로 대체하지 않았다. 비트 수준의 PSD나
수학적 lower bound만으로 실제 solver 검증을 대신한다는 의미는 아니다.
Fresh production **MSVC x64 Debug** `hexa_freq` CLI native0와10개 Value 비교를
독립 확인했다. 원본 TXT와 HDF5 mode1–10으로 singleton 행/RMS를 직접 재계산했으며
공통 row5%/RMS1%로 모두 PASS다. 최대 상대 RMS는 `1.961049613524256e-5`
(0.001961049613524256%)이다. 원본·byte 동일 입력 복사본·binary·HDF5 해시와
`lumped-reference` metadata를 대조했고 소비 artifact SHA는 검토 전후 동일했다.
저장된25 returned pairs의 max eta_r/eta_norm/eta_energy는 각각
`1.0554551422827935e-17 / 4.440892098500626e-16 / 7.476286423773325e-19`,
eta_gram/max_eta_orth는 `4.379426909390015e-15 / 1.0729264698916552e-15`다.
이는 저장된 original-pencil checks의 판독이며 reviewer가 production K/M을 새로
조립하거나 eigensolve/count certification을 독립 수행한 것은 아니다.
Bounded audit native0·finding0 자료는
`.dryforge/lumped-mass-adoption-20261011/references/hexa_freq/independent-adoption-audit.json`이다.
결과 HDF5 SHA는 `94a576bbfe1d5826235a6323e6d470163ed2e970c4fe6f65a86b2d65a3db7f8a`다.
전체 Debug/CTest와 정적2·동적2 원본의 새 종료 evidence는 아직 검토하지 않았다.
현재 상태는 [PRD](PRD.md)의 checklist를 따른다. 이 bounded modal PASS를 동적
시간수렴·전체 green·기능 완료로 확대하지 않으며 이전 consistent modal FAIL은
해당 질량 선택의 이력으로 보존한다. Reviewer는 코드·테스트·상위 계약을 수정하지 않았다.
### 2026-10-12 종료된 검증 근거의 보완
수정된 dense oracle를 포함한 새8 suites/38 C++ tests의 전체 PASS/native0를 확인했다.
Warped nodal mass·비균일 energy, full-row lumped pencil, one-free-DOF/구속 경계의
관성 반력, 독립 scalar/3DOF brick oscillator 시간수렴 및 HDF5 readback이 포함된다.
이 실행은 수정 전 focused binary의 부분 실패/중단을 새 결과와 분리한다.
별도 `python-focused.log`의 pytest137 PASS도 확인했다.
종료된 원본 comparison의 모든 보고 scalar에서 reference-only scale, near-zero,
row5%/RMS1%, exact-zero 분기와 최종 판정을 직접 재계산했다. U는 HDF5 source
node/frame 값에도 대조했으며 input/native record/binary/HDF5/원본 hash와
`lumped-reference` metadata를 확인했다. RF/S는 보고된 scalar 수치·identity/hash
감사이며 별도 stress/reaction recovery oracle를 새로 실행했다는 뜻은 아니다.
| 종료된 원본 | 실행 구성 | 확인한 families/scalars | 최대 상대 RMS |
| --- | --- | ---: | --- |
| hexa_linearstatic | MSVC x64 Debug | 3 / 15777; U/RF/S 모두 PASS | U `9.31789815437491e-9`, RF `7.309816326722838e-9`, S `3.42593423675143e-9` |
| hexa_nonlinearstatic | MSVC x64 Debug | 3 / 15777; U/RF/S 모두 PASS | U `2.169911561350721e-7`, RF `6.728092996221333e-6`, S `9.338899878251489e-6` |
| hexa_freq | MSVC x64 Debug | 10 / 10; Value 모두 PASS | `1.961049613524256e-5` |
| hexa_dynlinear | MSVC x64 Release, current production | 101 / 133926; U 모두 PASS | `3.618821318800423e-7` |
| hexa_dynnonlinear | MSVC x64 Release, current production | 101 / 133926; U 모두 PASS | `2.1555860391237846e-6` |
각 CLI native0를 확인했다. Dynamic release의 raw recorder에 보존된 folder label은
각각 `hexa_dynlinear-release`와 `hexa_dynnonlinear-release`다. Byte 동일 INP stem으로 논리 case를 연결한
`comparison-execution.json`의 raw-record hash와 실제 command를 대조했으며 원시
기록을 수정하거나 다른 입력으로 치환하지 않았다. Debug와 Release 검증을 혼합해
전체 Debug 통과로 표시하지 않는다.
Bounded 감사 native0·finding0 자료는
`.dryforge/lumped-mass-adoption-20261011/independent-closed-evidence.json`이다.
필수 원본5개의 외부 비교는 위 구성에서 모두 PASS이며 새 전체 Debug/CTest는
실행 중으로 최종 검토 대기다. 이 두 Release 동적 비교를 Debug 원본 통과로 표시하지 않는다.
기존 `execute.py` 중단 native−1과 serial 직접 전체789 CTest의 진행 상태를 구분한다.
현재 전체 green·시간/물리 검증 완료·기능 완료 판정은 하지 않는다.
후속 serial 전체 실행에서 기존 Shell C08a 시간수렴 test의 current lumped FAIL을
확인했다. Assertion 구성5개는 baseline과 같으나 실제 metric은 변했다. Finest
회전 가속도 error `5.6747291267426469e-4`와 두 raw order 약1.02838/1.02946은
기존 기준 미달이며 N7 noise 분리도 미충족이다. 상세 대조는
[HHT 독립 검토](../hht-implicit-dynamics/implementation-numerical-review.md)의
2026-10-12 current C08a 절을 따른다. 이는 Hex8 원본5개의 bounded 외부 비교 PASS와
구분하며 전체 회귀 green으로 승격하지 않는다. C08b 및 전체 종료는 아직 대기다.
Current shell C08b도 종료됐으며 **FAIL**이다. h=1/64·1/128 완료 뒤 세 번째
h=1/256 grid에서 principal rotation 입력 gate의 runtime 예외로 중단했다.
5 grids를 완료한 뒤 accuracy assertion이 실패했던 baseline과 다른 결과다.
실패 Newton trial의 근본 원인은 추가 진단이 필요하며, 이것을 외부 U PASS나
Hex8 physical mass/invariant 검사로 닫지 않는다. 종료 body/source 경로와 별도의
unused manufactured force-rate 병진 oracle 오류는
[HHT 독립 검토](../hht-implicit-dynamics/implementation-numerical-review.md)의
2026-10-12 current C08b 절을 따른다. 전체789 CTest의 종료 판정은 여전히 대기다.
후속 HHT-LM-NR-002 병진 force-rate oracle 오류는 두 계수 수정과 private Debug
RED(native1)/GREEN(native0)·pointwise(native0) 근거로 닫혔다. 상세와 shared 전체
binary 재빌드 범위는 같은 HHT 독립 검토의 force-rate oracle 수정 절을 따른다.
C08b runtime finding과 C08a 시간정확도 실패를 해소한 결과는 아니다.
후속 private C08b trace는 h=1/256, increment56, Newton iteration3,
t=0.21875에서 internal node4의 finite total rotation norm
`3.8630136368942867 rad>pi`를 직접 확인했다. 따라서 immediate principal-chart
이탈은 확정됐으나 큰 Newton trial의 근본 원인은 미확정이다. 상세 identity와
evidence 경계는 HHT 독립 검토의 C08b private trace 절을 따른다. 해당 finding은
OPEN이며 source/tolerance 변경이나 추가 실행으로 전체 PASS를 주장하지 않았다.
### 2026-10-12 전체 실행에서 추가 발견한 두 stale fixture
Active serial 전체 로그에서 앞의 shell C08a/C08b 외에 test93
`RejectsOverflowingOriginalPencilValidationScale`와 test238
`SolidBindingPreservesThreeComponentsAndReferenceMass`의 FAIL을 확인했다.
따라서 현재 확인한 실패는4개이며 앞의 두 shell 실패만으로 전체 결과를 요약할 수
없다. 전체 실행은 아직 종료하지 않았고 최종 native/집계는 대기다. 기존38-case
focused filter에는 이 두 cases가 없었으므로 당시 PASS는 해당 coverage가 아니다.
**HEX-LM-NR-001 — source corrected, focused execution pending: overflow fixture.**
E=3e306, rho=2, axis half-lengths=(1,2,3), nu=.25에서 새 `M_L=12*I24`다.
독립 tensor-polynomial K 적분과 normalized dense eigensolution으로
`||K||F/E=9.235553192303684`, `||K||inf/E=9.755555555555556`,
`max|Kij|/E=1.4037037037037037`, `lambda_max/E=0.6304620575193911`을 얻었다.
`||M||F=58.78775382679627`이므로 최대 mode의 validation matrix scale은
`46.29900142688912*E`다. 기존3e306은 이 scale도 finite여서 성공 반환이
production guard 오류라는 근거가 없다. Consistent 당시 all-odd Walsh mode의
overflow 가정은 채택된 lumped fixture에서 유지되지 않는다.
| 독립 산술량 | E=3e306 | 제안·수정한 E=4e306 |
| --- | ---: | ---: |
| 최대 local K entry | `4.211111111111111e306` | `5.6148148148148146e306` |
| lambda_max | `1.8913861725581735e306` | `2.5218482300775645e306` |
| `||K||F` | `2.770665957691105e307` | `3.6942212769214736e307` |
| `lambda_max*||M||F` | `1.111903447037563e308` | `1.4825379293834174e308` |
| 위 두 scale의 FP64 합 | `1.3889700428066735e308`, finite | nonfinite |
| `||K||inf/(4/9)` | `6.585000000000001e307` | `8.780000000000002e307`, finite |
Matrix-scale overflow의 경계는 E 약`3.882790296678553e306`이며 raw enclosure
division의 경계 약`8.189945944703032e306`와 분리된다. 기존 mass roundoff guard의
작은 차감은 후보4e306의 enclosure 여유를 뒤집지 않는다. 따라서 E만4e306으로
바꾸면 local K·lambda·enclosure를 finite로 유지하면서 기존 original-pencil
nonfinite-scale gate를 실제 자극한다. 이는 현재 연산 순서의 intermediate
matrix-scale overflow 검사이며 물리 eigenvalue 자체가 무한이라는 주장이 아니다.
Owner가 E 한 값과 highest-mode 주석을 수정했다. 실제 candidate FEAST/guard 실행은
아직 확인하지 않았고 diagnostic code·기존`1e-10`·finite gate를 바꾸지 않는다.
**HEX-LM-NR-002 — source corrected, focused execution pending: factory oracle.**
단위 cube·rho2의 full-row lumping은24 diagonals 각각0.25, offdiagonals exact0,
한 병진방향 total mass2다. 실행 body의 `M(0,3)=0`은 이 계약과 일치한다.
기존 test의 consistent `2/54` 기대가 잔존했다. Owner는 diagonal 기존 absolute
`1e-15`, total 기존`1e-13`을 유지하고 모든 offdiagonal을 exact0로 검사하도록
수정했다. 비교 기준을 완화한 수정이 아니다. Factory 생성·source identity/DOF
검사와 zero linear response도 보존된다.
닫힌 두 실패 body와 독립 산술/source hash 자료는
`.dryforge/lumped-mass-adoption-20261011/independent-hex8-stale-fixture-review.json`이다.
현재 공유 전체 binary에는 후속 test-only 수정이 반영되지 않았다. 종료 뒤 rebuild와
focused 실행 전까지 이 두 findings의 실행 폐쇄를 주장하지 않는다. Required Hex8
원본5개의 bounded 외부 PASS와 새 전체 회귀 FAIL/진행 상태를 구분한다.
### 2026-10-12 최종 종료 로그와 fixture 폐쇄
전체 serial MSVC x64 Debug CTest가 자연 종료했다. 원시789개 결과를 직접 재집계하고
summary/native/hash에 대조하여 **784 PASS / 4 FAIL / 1 SKIP, native8**을 확인했다.
Elapsed는9131.26초다. FAIL은 shell C08a, shell C08b, 위 overflow fixture,
factory fixture이며 SKIP은 `C04aFinestReductionComparisonIsNumericallyResolved`다.
이로써 전체 실행 대기는 종료된 **FAIL**로 갱신된다. 원래4개의 실패 body와
skip을 삭제하거나 후속 성공으로 소급 변경하지 않는다.
**HEX-LM-NR-001 및 HEX-LM-NR-002 — CLOSED.** 공유 binary의 최종 rebuild native0
이후 configured CTest에서 E=4e306 original-pencil nonfinite guard와 updated
factory full24 diagonal/offdiagonal 검사2개가 모두 PASS/native0다.
`final-stale-fixtures.log` 및 native 기록으로 실제 configured 실행을 확인했다.
새 HHT force-rate derivative와 기존 pointwise oracle2개도 별도 configured
CTest에서 PASS/native0다. 이 후속4개는 이전 shared binary의 전체789 실행과
구분한다. 최종 discovery790을 확인했지만 **전체790은 재실행하지 않았다.**
전체 전후 production190 files와 original reference16 files의 동일 inventory/hash를
대조하고 현재 파일도 전부 재해시했다. 최종 unit binary SHA는
`4e39c8992a527366e66ea295bf4598a068ca44456fc32c1ab973d2376759c11a`이며 actual
파일과 manifest가 일치한다. `final-oracle-identities.json`의 force-only note는
실제3개 test TU 변경을 모두 기술하지 못한다. 원시 note를 변경하지 않고 별도
`final-test-identities.json`이 누락을 명시 정정했으며3개 source·record hash도
독립 확인했다. Production·원본·tolerance/gate 변경을 후속 test 수정에 섞지 않았다.
닫힌 전체/focused/identity 감사는
`.dryforge/lumped-mass-adoption-20261011/independent-final-regression-review.json`이다.
Hex8의 두 stale fixture findings는 폐쇄됐지만 HHT C08a 정확도/noise 문제와
C08b principal-chart Newton failure는 **OPEN**이다. Final focused4 PASS를
전체 green이나 shell 시간정확도 해결로 확대하지 않는다. Reviewer는 추가
build/test·source 수정 없이 읽기 전용 감사와 보고서 정적 검토만 수행했다.
@@ -0,0 +1,122 @@
# Hex8 lumped 질량 변경본의 물리 평가
검토일: 2026-10-11–12. 적용 계약은 [PRD](PRD.md), [정식화](formulation.md),
[numeric controls](numeric-controls.md), [reference mapping](reference-model.md),
[HEX8-ADR-010](ADR.md)이다. `$fem-physics-review`에 따라 코드·계약·원본·출력을
변경하지 않고 현재 생성된 evidence만 검토했다. 단위는 입력 일관 단위이며 SI로 단정하지 않는다.
**현재 판정: 원본 5 case의 질량·모드·정적 및 HHT 관측 수지에 한정한 물리 대조 PASS.
전체 configured Debug 회귀는 실패로 종료했으며 최종 test-only 변경 후 전체 790개는 미실행이다.
기능 전체 통과나 release 승인이 아니다.** 과거 consistent 결과를
lumped 변경본의 통과로 승계하지 않는다.
## 원본 고유치의 독립 재계산
현재 evidence는
`.dryforge/lumped-mass-adoption-20261011/references/hexa_freq/`의
`native.json`, `comparison.json`, `hexa_freq_results.h5`다. CLI는 MSVC x64 Debug이며
native exit 0, comparator도 PASS다. HDF5 SHA-256은
`94a576bbfe1d5826235a6323e6d470163ed2e970c4fe6f65a86b2d65a3db7f8a`다.
원본과 실행 복사본의 raw SHA는
`42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347`로 같다.
저장된 기준 좌표·연결·E/ν/ρ로 Python/NumPy/SciPy에서 별도 8점 적분을 수행했다.
선형 강성은 deviatoric 항과 `κbbᵀ/V` 체적 항으로 재조립하고, 요소별
`m_a=Σ_g ρN_a det J₀g`를 **전체 절점에 조립한 후** 고정 자유도를 제한했다.
생산 `ComputeMass`나 저장된 검사값을 독립 계산의 입력으로 사용하지 않았다.
| 검사 | 현재 계산값 | 해석 |
| --- | --- | --- |
| Inventory와 BC | 442 nodes, 300 elements, 고정 51 / free 1275 scalar DOFs | 원본 모델과 일치 |
| 적분점 기준 Jacobian | `det J₀ ∈ [0.0173052408541, 0.0311031172125]` | 현재 적분점은 양수; whole-cell 인증 대체가 아님 |
| 기준 체적·질량 | `V=56.56854152`, `ρV=444063.050932` | 한 병진 축의 총 질량과 일치; 세 축 trace를 총 질량으로 쓰지 않음 |
| 조립 절점 질량 | `[423.377959037, 1380.99055553]` | 모두 양수이며 전체 영역의 기준 질량을 보존 |
| 모드·강체 증상 | IDs 1–10, 모든 λ>0, 고정 좌표의 eigenvector exact 0 | 지지된 모델에서 불필요한 강체 모드 징후 없음 |
| 독립 `max eta_r` / `max eta_energy` | `1.16389132e-17` / `4.15247286e-19` | 계약 `1e-10` 이내 |
| 독립 mass Gram / modal norm 결함 | `1.33287771e-15` / `4.44089210e-16` | 계약 `1e-10` 이내 |
| 원본 10 λ의 최대 상대차 | `1.96104961e-5 = 0.00196104961%`, mode 4 | 원본 singleton RMS 기준 1% 이내 |
직접 λ 대조는 제공 TXT의 `Value`를 사용했다. 주파수의 제곱이나 인접 모드 재매칭을
사용하지 않았다. 저장된 returned-pair 검사에는 25개가 있으며 최대 `eta_r=1.05545514e-17`,
전체 Gram `4.37942691e-15`다. Reviewer의 독립 벡터 재검산은 공개된 10개에 한정된다.
최저 모드 count/search bound의 별도 수치 검토를 이 물리 검사로 대체하지 않는다.
## 신규 정적 2 case와 HHT 2 case의 수지 검산
닫힌 Debug 정적 2 case와 current production **Release** 선형/TL HHT 각각 101 frames를
별도 8점 적분으로 재구성했다. 원본/복사본 raw bytes, native exit 0과 HDF SHA를 확인했고
각 comparator도 PASS다. 상세 artifact SHA와 관측량은
[lumped 계산 상세](lumped-mass-physics-details.json)에 있다.
동적 폴더는 `references/hexa_dynlinear-release/`와 `references/hexa_dynnonlinear-release/`이며
Debug 동적 실행으로 표시하지 않는다.
강성의 reference-relative derivative로 실제 infinitesimal/Green strain과
`2μ dev(strain)+κ mean(trace)I`, TL first Piola/Cauchy stress, 내력·에너지를
재계산했다. 동적 관측은 `T=½Σm_a|v_a|²`, `P=Σm_av_a`,
`L=Σ(X_a+u_a)×m_av_a`, 실제 endpoint force의 trapezoid work를 사용했다.
정적 case에는 동적 work/energy defect를 정의하지 않았다.
| 현재 결과 | 주요 독립 계산의 최대 차이 |
| --- | --- |
| 선형 정적 | RF `1.74623e-10` force, stress `1.23382e-8` force/length², U `1.13687e-13` force·length |
| TL 정적 10 frames | RF `2.32831e-10`, stress `1.37079e-8`, U `1.42109e-13`; 동일 차원 순서 |
| 선형 HHT 101 frames | RF `3.49246e-10`, T `7.10543e-15`, P `3.63798e-12`, L `6.54836e-11`; 각 force / force·length / mass·length/time / mass·length²/time |
| 선형 HHT work / defect | `1.13687e-13` / `1.27898e-13` force·length |
| 선형 HHT force balance | normalized `1.41900e-16`; 저장 free residual을 포함한 ledger 차이 `7.22645e-10` force |
| TL HHT 101 frames | RF `3.49246e-10`, T `7.10543e-15`, P `5.45697e-12`, L `8.00355e-11`; 선형 HHT 행과 같은 차원 순서 |
| TL HHT work / defect | 각각 `1.70530e-13` force·length |
| TL HHT force / current moment balance | normalized `1.39768e-16` / `2.74239e-16` |
| 요소 합력·해당 arm 모멘트 | 정적/선형/TL HHT의 상쇄 전 norm 합 대비 모두 `2.46e-16` 이하 |
구속 U 및 동적 V/a/A와 free RF는 exact 0이다. Positive 하중에 최종 중심 U의 세 성분이
positive이며 거의 대칭인 원본 형상에서 x/y 차이는 `3.46e-10` length 이하이다.
TL 정적의 실제 Gauss-point `detF≥0.999986939`이고 energy는 양수다.
TL 정적 raw free residual 최대 `35.3624` force, 전체 force balance normalized
`2.48995e-6`은 승인된 정적 Newton residual 계약의 관측이다. 이를 동적 strict criterion으로
바꾸거나 exact equilibrium으로 설명하지 않는다. Stored free residual을 포함한 static ledger의
차이는 `7.10259e-10` force 이하다.
선형 K의 내부 moment는 **reference arm**에서 0이다. Current arm에는
`Σu×f_int`가 남아 선형 HHT의 실제 current moment balance 최대 `287.045278 force·length`다.
같은 내부 current moment를 포함한 ledger 차이는 `1.54483e-9 force·length`로 일치한다.
이를 TL 회전 불변성과 동일시하거나 0으로 강제하지 않는다.
선형 HHT 최종 `(T,U,W,B)`는
`(.249978981888,177.740764261,256.221236292,−78.2304930487)`이고 최대 T는
`51.6145686844`다. T/U는 비음수다. Alpha<0와 endpoint work에서 정확 보존이나
매-frame 단조 감소를 요구하지 않았으며 coarse original만으로 시간 정확도를 보증하지 않는다.
Rounded HDF state의 독립 free residual 재구성 최대 `1.10035e-7` force와 tiny 저장 residual은
구분한다. 이 audit는 내부 high+low gate의 독립 재실행이 아니다.
TL HHT에서는 현재 arm의 내부 moment 최대 `2.34564e-9 force·length`, 저장 free residual을
포함한 current moment ledger 차이 `1.79830e-9`로 회전 불변 내력과 일관된다.
Gauss-point `detF≥0.999979043552`, T/U는 비음수다. 최종 `(T,U,W,B)`는
`(.251339920298,177.770554367,256.242640663,−78.2207463760)`이고 최대 T는
`51.6133464012`다. 새 TL HDF SHA-256은
`8730e5562c91b3c7c9e654c811d2791ab7d24fdcc62286b0b28efa7cdc5957d6`다.
큰 strain/회전·임의 distorted mesh의 정확도에 이 작은 변형 원본을 확대하지 않는다.
## 남은 검토와 coverage
외부 V/A/energy 원본이 없으므로 U CSV 통과만으로 rate·시간 정확도를 판정하지 않는다.
최초 focused 실행은 중단 기록(`exit -1`)이므로 전체 focused PASS로 사용하지 않는다.
후속 `new-kernels.log`/`new-kernels-native.json`은 exit 0 / 38 tests PASS를 확인했다.
여기에는 warped nodal 질량 적분, Jensen energy, BC 전 full mass, scalar/MDOF 시간수렴과
readback 검사가 포함된다. 이 실행 범위를 전체 회귀·임의 warped cell 검증으로 확대하지 않는다.
전체 Debug CTest는 native 8로 자연 종료했으며 raw **784 PASS / 4 FAIL / 1 SKIP (789개)**를
보존했다. Shell C08a 시간수렴과 C08b의 새 chart 이탈 외의 두 실패는 이전 consistent
off-diagonal을 요구하던 factory expectation과 lumped pencil에서는 finite인 overflow fixture다.
Test-only 수정 후 두 검사는 `final-stale-fixtures.log`/native record에서 **2 PASS / native 0**이다.
Factory는 diagonal nodal mass를 확인하고 overflow는 `E=4e306`에서 실제 nonfinite validation을
검사한다. `E=3e306` 사례를 실패시키도록 production gate나 tolerance를 바꾸지 않았다.
같은 최종 Debug rebuild의 HHT force-rate oracle/pointwise 두 검사도 별도 PASS다.
최종 discovery는 790개이며 **전체 790개는 재실행하지 않았다**. Raw 789개와 후속 2+2 결과를
합쳐 새 전체 통과 수를 만들지 않는다. Production 190/reference 16 files의 현재 SHA를
`closed-identities-after-final-regression.json`과 독립 대조해 불일치 0을 확인했으므로,
앞의 원본 5 case 물리 대조는 유지한다. C08a/C08b OPEN 및 C04a SKIP과 이 원본 대조를 구별한다.
새 C08b 예외를 과거 baseline의 동일 실패라고 분류하지 않으며 해당 영향과 최종 manifest는
[Shell 물리 검토](../hht-implicit-dynamics/physics-evaluation.md)에 있다.
전역 최신 상태는
[PRD checklist](PRD.md)를 따른다.
@@ -1,5 +1,7 @@
# Hex8 high+low 동해석의 한정된 물리 검토
2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
적용 계약은 [precision formulation](precision-formulation.md)과 [PRD](PRD.md)다.
2026-10-10 `hex8_precision_physics` reviewer가 작성자와 독립적으로 아래 닫힌 evidence와
해석적 oracle를 검토했다. 검토 범위에서 물리 blocker는 없지만 원본 비교·전체 기능 완료의
@@ -1,5 +1,7 @@
# Hex8 동해석 high+low 정식화
2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
적용: 사용자가 2026-10-09 선택 A로 승인한 [정밀도 제안](precision-proposal.md).
기본 물리식·DOF·부호·적분점 순서는 [formulation](formulation.md), 판정 원본은
[numeric-controls](numeric-controls.md), 영속 출력은 [I/O](io.md)다. 본 문서는
@@ -1,5 +1,7 @@
# Hex8 동해석 내부 정밀도 변경안 — 승인됨
2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
2026-10-09 사용자가 A를 선택해 내부 high+low 물리 상태와 Float64 출력의 반올림 의미를
승인했다. 이 문서는 [PRD](PRD.md)·[정식화](formulation.md)·
[numeric controls](numeric-controls.md)의 변경 근거이며, 구현 완료를 뜻하지 않는다.
@@ -1,5 +1,7 @@
# 정적 원본 불일치와 변경 선택지 — B 승인
2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
2026-10-10 사용자는 B: 체적 평균 energy 도입 후 전체 재검증을 승인했다.
새 정식화는 [PRD](PRD.md)·[ADR-009](ADR.md)·[formulation](formulation.md)을 따른다.
전체 high+low 물리 상태·원본·수치 기준은 유지한다. A는 선택되지 않았다.
@@ -0,0 +1,149 @@
# Hex8 원본 질량·요소 설정 조사
2026-10-11 사용자가 제공한 고유치 결과의 불일치를 조사했다. 원본 입력에서 확인한 사실,
공식 문서의 동작 설명, 별도 수치 재현을 구분한다. 이 문서는 질량 정식화 채택이나 승인
변경이 아니다. 현재 요구와 완료 판정은 [PRD](PRD.md), 실제 생산 결과의 FAIL은
[verification](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)에 유지한다.
## 결론과 증거의 범위
**현재 FESA의 consistent 질량과 Abaqus 1차 요소의 row-sum lumped 질량 차이가
이번 고유치 불일치의 주된 원인이라는 강한 근거를 확보했다.**
승인된 평균 체적 강성을 유지하고 질량만 row-sum lumped로 바꾼 별도 계산에서
최저10개 고유치가 모두 원본과 상대차이0.00196105% 이하로 일치했다.
같은 계산의 consistent 질량은 실제 FESA 고유치를 상대차이4.57e-12 이하로 재현했다.
이는 공식 문서와 동일 입력의 통제된 수치 재현에 기반한 판단이다. 원본 Abaqus 실행의
실제 K/M 계수를 직접 확보한 것은 아니며 private 내부 알고리즘 전체의 동등성 증명이 아니다.
Production 수식·질량·reference·tolerance는 수정하지 않았다. 별도 계산의 일치를
현재 FESA의 필수 modal 비교 PASS로 승격하지 않는다.
## 입력에서 직접 확인한 설정
원본은 [hexa_freq.inp](../../reference/hexa/hexa_freq.inp)이며 raw SHA는
[원본 inventory](reference-model.md)에 있다. 파일의 전체 keyword를 확인했다.
| 항목 | 원본 설정 | 의미·확인 범위 |
| --- | --- | --- |
| 생성기 표기 | Abaqus/CAE Learning Edition 2024 | 입력 작성 도구 표기이며 실제 실행 solver 버전 증명은 아님 |
| 요소 | `*ELEMENT, TYPE=C3D8`,300개 | 8절점 선형 brick; `C3D8R`, `C3D8I`, `C3D8H`가 아님 |
| 절점·자유도 | 442절점, 병진1–3 | 구속51성분, free1275성분; 회전 zero BC는 승인된 inactive no-op |
| Section | `*SOLID SECTION, ELSET=Set-1, MATERIAL=Material-1` | 모든300개에 같은 solid material 연결; 별도 section controls 없음 |
| 재료 | `*ELASTIC`: E=2.1e11, nu=.3 | 상수 등방성 탄성 |
| 밀도 | `*DENSITY`:7850 | 단위계는 user-consistent-unspecified; SI라고 별도 확정하지 않음 |
| Step | 유일한 `Step-1`, `NLGEOM=NO, PERTURBATION` | 선행 general step·initial stress 없는 원형상 frequency |
| Eigensolver | `LANCZOS, SIM` | 최저10 modes 요청; 별도 frequency range/shift 입력 없음 |
| Normalization | `NORMALIZATION=MASS` | 고유벡터의 generalized mass를1로 정규화하는 설정 |
| Acoustic coupling | `ACOUSTIC COUPLING=ON` | acoustic/ASI/tie 요소가 없는 이 입력에서 연성 모델을 추가하지 않음 |
| 추가 질량 | 관련 keyword 없음 | point mass·rotary inertia·nonstructural mass·mass scaling·matrix input 정의 없음 |
`NORMALIZATION=MASS`는 consistent mass 선택 옵션이 아니다. 공식
[*FREQUENCY 문서](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm)의
Normalization 절은 실제 사용하는 구조 질량행렬에 대해 고유벡터 크기를 정규화한다고 설명한다.
고유벡터에 상수를 곱하는 것과 질량행렬을 변경하는 것은 서로 다른 동작이다.
## 공식 문서의 요소·질량 동작
[Solid isoparametric quadrilaterals and hexahedra](https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-solidisoquadhex.htm)의
Fully integrated first-order 절은 Gauss point의 체적변화를 요소 평균으로 대체하는
selective reduced integration을 설명한다. 따라서 C3D8의 full integration이라는 이름을
체적 항까지 수정 없는 pointwise `BᵀCB`로 해석하면 안 된다.
현재 FESA는 승인된8점 deviatoric+평균 trace 체적 energy를 사용한다. 이번 조사에서
강성을 새로 변경하지 않았으며, 유한변형에서 Abaqus의 평균 J/Fbar 처리와 평균 Green
trace 모델 전체가 같다는 결론도 내리지 않는다.
[Implicit dynamic analysis](https://docs.software.vt.edu/abaqusv2025/English/SIMACAETHERefMap/simathe-c-dynamics.htm)의
질량 정의 다음 문단은 Abaqus의1차 요소가 대각 lumped 질량을 사용하며 consistent
행렬의 각 행 합을 대각에 모으는 방법이라고 명시한다. 이 설명은 자연진동수 수치 실험도
직접 언급한다. 앞의 C3D8 입력은 이1차 요소에 해당한다. 문서상의 질량 관계는 다음과 같다.
\[
(M_C)_{ai,bj}=\delta_{ij}\int_{V_0}\rho_0N_aN_b\,dV_0,
\qquad (M_L)_{ii}=\sum_j(M_C)_{ij},\qquad (M_L)_{ij}=0\ (i\ne j).
\]
현재 FESA는 `M_C`를 사용하고 문서상 Abaqus 1차 요소 동작은 `M_L`이다.
같은 총질량이라도 off-diagonal 관성 coupling이 달라지므로 각 모드의 고유치 차이가
일정 비율일 필요는 없다. `NORMALIZATION=MASS`와 이 차이를 혼동하지 않는다.
인용한 공식 문서는2025판이다. 2024판 해당 URL은403으로 본문을 확보하지 못했다.
따라서2024 실행의 내부 계수까지 확인했다는 의미로 쓰지 않는다. 다만 아래 실제 원본
고유치 재현은 문서 설명과 일관된다.
## 같은 모델에서 K/M 차이를 분리한 계산
원본442절점·300요소·밀도·BC51성분을 그대로 읽고3N 행렬을 별도로 조립했다.
강성 두 종류와 질량 두 종류의 조합을 비교했다. 강성은 평균 infinitesimal trace 또는
pointwise 체적 항, 질량은8점 consistent 또는 그 full 행 합 lumped다.
Lumping은 **구속 열을 제거하기 전 full 행렬에서 수행**하고, 그 뒤 같은 free1275공간으로
제한한다. 구속을 먼저 제거한 Mff의 행 합은 원래 구속 절점의 기여를 잃으므로 사용하지 않는다.
Python/SciPy sparse generalized eigensolve로 최저10개를 구했다. 같은 입력·node ordering,
고정 시작벡터와 sigma0 shift-invert를 사용하며 반복 고유치를 제거하지 않았다.
원본 Value=λ를 그대로 mode별 비교하고 공통1% RMS/row5%를 유지했다.
| 별도 계산 조합 | 최대 고유치 상대차이 (%) | 1% 기준 내 modes |
| --- | ---: | ---: |
| 평균 trace K + consistent M | 20.2513234932 | 3/10 |
| 평균 trace K + row-sum lumped M | **0.0019610496** | **10/10** |
| Pointwise 체적 K + consistent M | 20.2513359080 | 1/10 |
| Pointwise 체적 K + row-sum lumped M | 4.3745703299 | 2/10 |
전체 모드를 확인했으며 대표 변화는 다음과 같다. 표의 출력 자리만 줄이고 실제 비교에는
반올림 전 값을 사용했다.
| Mode | 원본 λ | 평균 K + consistent M | 평균 K + lumped M |
| ---: | ---: | ---: | ---: |
| 1 | 496.28 | 497.153597 | 496.281253 |
| 2 | 496.28 | 497.156909 | 496.284560 |
| 3 | 18302 | 18519.547027 | 18302.192012 |
| 4 | 18302 | 18519.716390 | 18302.358911 |
| 5 | 52797 | 63489.091265 | **52796.905642** |
| 6 | 131213 | 134772.818712 | 131212.943849 |
| 7 | 131214 | 134773.663066 | 131213.797734 |
| 8 | 165943 | 166062.030100 | 165943.347547 |
| 9 | 449258 | 470919.350202 | 449257.575005 |
| 10 | 449260 | 470921.678068 | 449259.777928 |
Reference volume=56.56854152, total mass=444063.050932이며 consistent/lumped의
각 병진 방향 총질량도 같았다.4조합의 최대 infinity-norm backward residual은
2.43e-14 이하, mass Gram 오차는2.11e-15 이하다. 진단 JSON의 `max_eta_r`라는 field는
이 infinity-norm metric이며 승인된 T5 Euclidean/Frobenius eta_r와 구분한다.
원본14개 파일의 전후SHA도 동일하다. 이는 별도 계산의 수치 정합성과 원본 보존 근거이며
FESA 구현을 변경·재실행한 근거가 아니다. Private eigsh 계산은 실제 FEAST의
lowest-N count certification을 수행하지 않았으므로 공식 고유치 절차 검증을 대신하지 않는다.
## 원시 자료와 채택 전 과제
실제 명령은 `uv run --with h5py --with scipy python -B .dryforge/investigate_hex8_modal_mass.py`,
native exit0으로 자연 종료했다. Script·stdout·argv/native/timestamps는 로컬
`.dryforge/investigate_hex8_modal_mass.py`, `hex8-modal-mass.log`, `hex8-modal-mass-native.json`에 있다.
행렬·고유벡터·10개 모드의 전체 metric은
`.harness/hex8-evidence/mean-volume/modal-mass-investigation/result.json`과 인접npz에 보존했다.
원시 자료는 ignored 진단 evidence이며 공식 출력이나 사용자 원본이 아니다.
별도 reviewer가 script의 engineering shear·Gauss gradient·체적 평균 coupling·mass 조립과
full-row-sum 뒤 BC restriction을 검토했다. 저장된 K/M/고유벡터에서 eigen residual·mass Gram·
10개 source 오차와 baseline의 실제 FESA 재현을 독립 재계산해 audit native0·finding0을 확인했다.
Euclidean/Frobenius eta_r의4조합 최댓값은3.79e-15 이하, Gram Frobenius 오차는3.36e-15 이하다.
소비 자료의 전후SHA도 동일했다. 원시 독립 자료는 같은 폴더의 `independent-result.json`,
`independent-native.json`, `independent-audit.py`다. 결과 SHA는
`6dab2a7e7d7bb1a3d4a71fdb240fe00e552242c77ef0781a01a92cf00ee8b159`다.
이 bounded 검토는 production 채택·실제 FEAST count certification·외부 전체 검증이 아니다.
추가 직접 확인에는 실제 Abaqus 실행 버전·job 진단과 mode vectors 또는 operator evidence가
도움이 된다. [*MATRIX GENERATE 문서](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-matrixgenerate.htm)는
`MASS`/`MASS=CONSISTENT`로 consistent 행렬을 생성한다고 설명하므로, export된 M을
무조건 frequency의 lumped M과 동일시하지 않는다. 원본 모델이나 외부 solver를 이번 조사에서
실행·변경하지 않았다.
FEM-REQ-HEX8-007과 HEX8-ADR-002는 eigen/HHT 공통 consistent M을 요구하고 lumping을 금지한다.
이번 진단으로 그 계약은 변경되지 않는다. Frequency만 silent lumping으로 바꾸는 것도 계약 변경이다.
채택 판단에서는 공통 mass 방침과 입력·결과 metadata의 의미를 먼저 결정하고, 질량 불변량,
original-pencil, 정적·동적을 포함한 필요한 회귀와 reference 비교를 재확인해야 한다.
과거 동적 U 일치만으로 두 mass 행렬이 같다고 추론하지 않는다.
## 2026-10-11 후속 질량 정책 승인
사용자는 고유치·HHT lumped mass 채택을 명시 승인했다([HEX8-ADR-010](ADR.md)). 위 조사와 private 비교는 채택 전 원문 기록이며 production 검증으로 승계하지 않는다. 현재 채택 수식은 [formulation](formulation.md), 변경본 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다. 원본 reference·허용값·HHT 계수와 출력 layout은 유지한다.
@@ -1,7 +1,8 @@
# Hex8 원본과 비교 mapping
기준은 [PRD](PRD.md)의 FEM-REQ-HEX8-022–023와 [공통 수치 정책](../TOLERANCE.md)이다.
Source revision은2382d3a이며 사용자 제공 `reference/hexa/`의5 INP·8 CSV를 read-only로 사용한다.
기존 source revision은2382d3a이며 사용자 제공 `reference/hexa/`의5 INP·8 CSV와
2026-10-11 첨부된 `hexa_freq.txt`를 read-only로 사용한다. 새 TXT의 raw SHA로 추가 원본을 식별한다.
아래 hash는 현재 Windows working-tree raw bytes(CRLF) 기준이며 Git LF blob hash와 구분한다.
## 원본 inventory
@@ -9,7 +10,7 @@ Source revision은2382d3a이며 사용자 제공 `reference/hexa/`의5 INP·8 CS
442 nodes/300 C3D8 elements, material E=2.1e11/nu=.3/rho=7850, source Step-1이다.
Static DIRECT h=.1/T=1의 마지막 Increment10을 비교하고 nonlinear은 NLGEOM=YES다.
Dynamic DIRECT h=.1/T=10의 Increment0..100 전체를 비교한다. Amp-1은 `(0,0),(.1,1),(10,1)`다.
Frequency는 original unstressed 상태의10 modes 요청이며 결과 Value는 아직 제공되지 않았다.
Frequency는 original unstressed 상태의10 modes 요청이며 결과 Value는 `hexa_freq.txt`에 제공됐다.
원본5개 모두 Set-1의 zero rotational BC4/5/6을 포함한다. 사용자 승인된
[HEX8-ADR-007](ADR.md#hex8-adr-007--inactive-zero-rotational-bc의-한정된-호환-예외)에 따라
이 행만 source warning/no-op으로 처리하며 원본과 실제3N mapping을 보존한다.
@@ -21,6 +22,7 @@ Frequency는 original unstressed 상태의10 modes 요청이며 결과 Value는
| `hexa_dynnonlinear.inp` | — | `1685f86f844e8020bf46e1747b949699ac9aff0d7570bd21ec95109399365ff9` |
| `hexa_dynnonlinear_U.csv` | 44642 | `f5832a24577f54838bb49dec86a0dc9668cf43e78953f718a9d3635e0f574226` |
| `hexa_freq.inp` | — | `42cbcec2a8b738f8b6d2c1e13114b8840dccdde6fc3e6f8a43a3272e85d82347` |
| `hexa_freq.txt` | 10 modes | `3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370` |
| `hexa_linearstatic.inp` | — | `67183909c5dc962a4d4b65ffb81f7bd65b72e89a5d015c8369a8e0226347a647` |
| `hexa_linearstatic_RF.csv` | 442 | `3e04e71ec075ffef098cf4870d77f9c400557fccb375369da8bf67cf67c1e36b` |
| `hexa_linearstatic_S.csv` | 2400 | `8840a502b9d28a91e5685349301a56fed37d2ac62327b71304716b714db577e8` |
@@ -40,6 +42,20 @@ Stress는300×8×6 전부 포함하며 elemental-nodal stress·절점 외삽·
Dynamic U는101 frame 각각442×3인 독립 blocking family다. Frequency Value는 mode별 singleton이며
MITC4 eigen scoped5% RMS 예외를 적용하지 않는다.
제공 TXT의 행 형식은 `Mode n: Value = lambda Freq = f (cycles/time)`다.
`Value`는 고유치 λ(`1/time^2`)이며 HDF5 `eigen/modes.eigenvalue`와 직접 비교한다.
`Freq`는 cycles/time의 보조 열이고 비교값으로 변환하지 않는다. 시간 단위를 SI로 추정하지 않는다.
TXT에는 step field가 없으므로 고정 case `hexa_freq`와 hash-checked 입력의 유일한 `Step-1`에
한정해 대응한다. 다른 모델·step을 판별하는 범용 형식으로 설명하지 않는다.
Mode ID1–10을 일대일 대응하고 반복 고유치를 제거하거나 가까운 값으로 재매칭하지 않는다.
빈 줄은 허용하되 잘못된 형식·mode 누락/추가/중복·비유한/음수 값·mode별 역순 Value는 실패다.
실제 비교에서는 원본 raw SHA도 고정하며 수정한 복사본을 정상 원본으로 취급하지 않는다.
2026-10-11 후속 [질량·요소 설정 조사](reference-mass-investigation.md)는 Abaqus1차 요소의
row-sum lumped 질량과 조사 당시 FESA consistent 질량의 차이를 확인했다. 동일 평균 K에
lumped M을 사용한 별도 진단은10개 λ 모두 상대차이0.00196105% 이내였지만,
생산 구현의 mass 계약이나 실제 modal FAIL 판정을 변경하지 않는다.
Key는 source case/step/frame 또는 increment/canonical instance/node 또는 element/IntPt/component다.
CSV header whitespace만 lexical 정규화하고 duplicate/missing/extra/nonfinite required value를
tolerance 전에 실패시킨다. `PART-1-1`과 input raw `Part-1-1`은 기존 Abaqus case 의미로 대응한다.
@@ -64,12 +80,18 @@ PASS가 아니다. Nearest-position matching을 수행하지 않았고 어떤
`.harness/hex8-evidence/reference-inventory.json`이며 해당 ignored evidence를 지속할 사용자 파일로
오인하지 않는다. Formal comparator의 identity/coordinate controls는 동일 의미를 실제 tests로 검증한다.
## 비교 정책과 준비 대기
## 비교 정책과 남은 검증
2026-10-11 [HEX8-ADR-010](ADR.md)이 reference lumped mass를 승인했다. 다음7/10 FAIL은
consistent M의 과거 판정이며 변경본은 원본5 case와 독립 물리/시간 검증을 다시 수행한다.
현재 metadata는 `lumped-reference`이며 과거 파일을 metadata만 바꾸어 재사용하지 않는다.
Common policy: reference-only S=max abs, B=.01S, near-zero error<=B, 일반 relative<=.05,
family RMS/S<=.01, S=0 exact-zero다. 다른 quantities/units/frame을 합쳐 scale을 바꾸지 않는다.
Frequency 원본 quantity/units/mode/step/hash는 제공 후 먼저 확인한다. 결과를 생성·추정하거나
FESA 결과를 reference로 사용하지 않는다. 필수 원본 부재는 미실행/기능 검증 대기다.
Frequency 원본 quantity/units/mode/step binding/hash 확인과 실제 비교를 수행했다.
최저10개 중7개 singleton이1% RMS 기준을 초과해 기능 검증은 완료 대기다.
상세 판정은 [최종 고유치 비교](verification.md#2026-10-11-제공된-고유치-원본의-최종-비교)에 있다.
결과를 생성·추정하거나 FESA 결과를 reference로 사용하지 않는다. 원본 부재 시에는 미실행이다.
Dynamic V/A/reaction/energy의 외부 자료는 없어 independent physical/temporal 검증이 필수다.
현재 inventory/convention 확인은 parser 실행·FESA 수치 결과 비교·기능 검증 PASS가 아니다.
+77 -7
View File
@@ -1,5 +1,14 @@
# Hex8 verification and original comparison evidence
2026-10-11 질량 정책 변경: [HEX8-ADR-010](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
현행 필수 원본5개 비교는 모두 PASS이며 최저10 modal Value의 최대 상대차는
`0.0019610496%`다. [변경본 검증](lumped-mass-adoption.md)에 전체789개 자연 종료와
test-only 수정 후 재검사를 구분했다. 기존 consistent modal FAIL은 아래 이력이며
현재 불일치가 아니다. 당시 Shell C08b runtime 실패는 후속 승인된 초기 Newton
정책에서 해소됐다. 최신 검증과 사용자 중단, 전체 검증 유예의 범위는
[최종 인계](final-handoff.md)를 따르며 과거 PASS/FAIL을 최신 전체 통과로 승계하지 않는다.
This page records the build/test evidence, comparison-only Python tool and actual
original results. Historical pointwise results and the approved mean-volume change
are recorded separately. It does not replace the feature PRD, numerical controls or completion
@@ -34,7 +43,7 @@ The tool is not a solver launcher, result generator, reference repair or release
readiness check.
The fixed source inventory is the [reference-model](reference-model.md) inventory:
442 nodes, 300 C3D8 elements and 13 frozen original files. Input and CSV raw SHA256
442 nodes, 300 C3D8 elements and 14 frozen original files, including the supplied modal TXT. Input and CSV/TXT raw SHA256
must match the documented Windows working-tree bytes. The HDF5 metadata must
identify the actual lexically normalized absolute scratch path and that file's FNV1a64 content
identity; a different path with identical bytes is not silently accepted.
@@ -73,12 +82,73 @@ row deletion or cancellation of signed errors is applied. Reports preserve each
scalar identity/value/error/branch/pass and family scale/band/max-absolute-error,
absolute/relative RMS, source SHA and policy.
The independent typed modal comparison behavior requires explicit source step,
mode1–10, eigenvalue or frequency quantity, and matching `1/time^2` or `1/time`
units. Each mode is a singleton using the same RMS1% policy. This is not an
assumption about the absent original Value file's eventual CSV layout. Actual
modal original comparison remains **NOT RUN** until a genuine reference is
provided and its semantics and hashes are confirmed.
The supplied modal TXT uses `Mode n: Value = lambda Freq = f (cycles/time)`.
Value is compared directly with the HDF5 eigenvalue (`1/time^2`); Freq is finite
auxiliary data, without conversion or assumed SI time units. The TXT has no step
field: its fixed hexa_freq case binds to the sole Step-1 in the hash-checked input.
Modes1–10 are matched by ID, retaining repeated eigenvalues. Each mode is a
singleton using the same RMS1% policy. An absent TXT remains NOT RUN; malformed
or hash-mismatched data fail prechecks. The previous consistent-mass result failed
seven families, as recorded below; the current lumped-mass result passes all ten.
## 2026-10-11 제공된 고유치 원본의 최종 비교
사용자 제공 `reference/hexa/hexa_freq.txt`의 raw SHA256은
`3d2dacbee13cd2cc8d3f7c1a38210611a72de41d5e31d169e636bf40e00d4370`이다.
기존 `18b36c1` frozen CLI가 native0으로 자연 종료한 실제 공식 HDF5를 사용했다.
HDF5 SHA는 `f6203936883df7f27e86a20311726b7e59fefa117e5f9fa67f71bdf63ec2e4cb`이며
이번에 새 C++ solver 실행으로 표현하지 않는다. 실제 scratch 입력·결과 hash 및 closed
CLI record,442절점·300요소·51구속·10 modes, quantity/unit/finite precheck는 PASS다.
```powershell
uv run --with h5py python -B scripts/verification/compare_hex8.py `
--case hexa_freq `
--input .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/hexa_freq.inp `
--results .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/hexa_freq_results.h5 `
--execution-record .harness/hex8-evidence/mean-volume/original-cli/hexa_freq/native.json `
--report .harness/hex8-evidence/mean-volume/modal-final/comparison.json
```
실제 comparator native exit1, numerical FAIL이다. Mode별 singleton의 RMS/S는
`abs(lambda_fesa-lambda_reference)/abs(lambda_reference)`이며 공통1% 기준을 적용했다.
다음 표는 가독성을 위해 출력 자리만 줄였고 실제 판정에는 반올림 전 값을 사용한다.
| Mode | 원본 Value λ | FESA λ | RMS/S (%) | 판정 |
| ---: | ---: | ---: | ---: | --- |
| 1 | 496.28 | 497.153597379 | 0.176029 | PASS |
| 2 | 496.28 | 497.156908818 | 0.176696 | PASS |
| 3 | 18302 | 18519.547026780 | 1.188652 | FAIL |
| 4 | 18302 | 18519.716390186 | 1.189577 | FAIL |
| 5 | 52797 | 63489.091264684 | 20.251323 | FAIL |
| 6 | 131213 | 134772.818711666 | 2.713008 | FAIL |
| 7 | 131214 | 134773.663065696 | 2.712868 | FAIL |
| 8 | 165943 | 166062.030100247 | 0.071730 | PASS |
| 9 | 449258 | 470919.350201648 | 4.821584 | FAIL |
| 10 | 449260 | 470921.678067527 | 4.821635 | FAIL |
10 families 중7개 RMS 실패, scalar row5% 실패는 mode5의1개다. MITC4의 scoped5%
RMS 예외를 적용하거나 frequency로 변환하지 않았다. Source 반복 고유치를 합치거나
값이 가까운 모드에 재매칭하지 않았다. TXT 원본은 수정하지 않았다.
비교기 새 동작11개의 RED 실패를 관측한 뒤 원본 TXT reader와 실제 frequency 분기를 연결했다.
추가된 성공 경로까지12개 새 검사와 기존 영향 검사 모두 PASS다. 실제 명령은
`uv run --with h5py --with pytest python -B -m pytest tests/test_compare_hex8.py tests/test_compare_hht_dynamic.py -q --junitxml=.harness/hex8-evidence/mean-volume/modal-final/affected.xml`,
native0·136 PASS(95 Hex8/41 HHT)·24.52초다. Raw log·JUnit·argv/native/timestamps는
`modal-final/affected.log`, `affected.xml`, `affected.json`에 보존했다.
Schema fixture의 PASS/의도된 FAIL은 비교기 동작 근거이며 실제 modal 일치의 PASS가 아니다.
독립 read-only 감사는 native0·finding0으로 동일한7개 실패를 재현했다. 원본14개를 포함한
소비23개 artifact의 SHA를 전후 확인했다. 이번 추가 검증의 종료 요약은
`modal-final/closure.json`이며 과거 원본 부재 시의 `mean-volume/closure.json`과
`comparisons/hexa_freq/comparison.json`은 당시 NOT RUN 기록으로 보존했다.
이번 변경은 비교기·Python 검사·문서에 한정되고 C++ 수식/질량/절차/출력은 변경하지 않았다.
직전에 완료한 전체787 회귀는 아래 기록대로 native8·784 PASS·기존 FAIL2·SKIP1이며
이번 Python 검사로 전체 회귀를 새로 실행한 것으로 보고하지 않는다. 전체 Python의
기존 collection5 오류도 해결한 것으로 보고하지 않는다.
최종 modal 수치 불일치가 남아 기능 완료는 대기다. 원인 분리와 승인 경계는
[미해결 문제](../tracking/findings.md#hex8-제공-고유치-원본과-최저10-모드-불일치)에 기록한다.
독립 검토의 범위와 원시 자료는 [수치 검토](numerical-review.md)를 따른다.
## 비교기 개발과 변경 전 pointwise 구현의 관측 이력