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

13 KiB
Raw Blame History

고유치·HHT lumped mass 채택과 재검증

2026-10-11 사용자가 고유치와 HHT의 질량을 lumped mass로 승인했다. HEX8-ADR-010과 HHT-ADR-012의 변경본 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 원인 조사는 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이다. 물리 검토는 이러한 제한된 확인과 잔여 범위를 구분한다.

다섯 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와 물리 검토에 유지한다.

최종 검토와 인계

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 정책을 적용했고 공식 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는 신규/영향 검사 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 한 곳에 둔다.