Files
FESADev/docs/hex8-structural-analysis/lumped-mass-adoption.md
T
KOKO\Mimi eaa5cbeb21 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.
2026-10-13 16:57:19 +09:00

169 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 고유치·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) 한 곳에 둔다.