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
@@ -1,5 +1,7 @@
# HHT 관성 구현 독립 수치 검토
2026-10-11 질량 정책 변경: [HHT-ADR-012](ADR.md)에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 [formulation](formulation.md), 재검증 상태는 [PRD](PRD.md)의 현재 checklist를 따른다.
- Owner: `numerical-review-agent`; date: `2026-09-22`.
- 상태: `source-delta-reviewed; runtime-verification-pending`. 수식/API 중간 검토이며 전체 구현 gate 통과 판정이 아니다.
- 범위: [관성 API](../../include/fesa/elements/nonlinear_mitc4_inertia.h), [관성 구현](../../src/fesa/elements/nonlinear_mitc4_inertia.cpp), [관성 tests](../../tests/unit/elements/nonlinear_mitc4_inertia_test.cpp), [비선형 내력](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의 directional third-derivative, [초기화·null algebra](../../src/fesa/analysis/hht_dynamic_algebra.cpp), [동적 조립](../../src/fesa/analysis/hht_dynamic_assembly.cpp), [HHT procedure](../../src/fesa/analysis/hht_dynamic_procedure.cpp).
@@ -219,3 +221,251 @@ Full residual metric은 각 mode의 `||K*phi-lambda*M*phi||2 / [(||K||2+abs(lamb
| 1/1024 | .3123438723 |
**한정 결론:** coarse grids가 초기 고주파 탄성 모드를 잘 분해하지 못할 가능성은 추가 조사할 만하다. 그러나 최대 eigenfrequency만으로 C08b의 실패 원인을 확정하거나 finest의 asymptotic accuracy를 보증할 수 없다. Dump의 `EmptyFrame`은 v=0이므로 실제 C08b의 nonzero initial velocity에서 생기는 convective tangent/velocity coupling을 포함한 dynamic Jacobian spectrum이 아니다. 해당 모드의 초기 가진 크기, 비선형 진행 중의 frequency/phase 변화, 오차 history와의 대응 및 실제 rate convergence가 남는다. 기존 grid·C08/N7 threshold·실패 판정은 유지하며, 이 진단은 grid 변경이나 production recovery 채택의 근거가 아니다.
## 2026-10-11 lumped production 채택의 독립 검토
[HHT-ADR-012](ADR.md)에 따른 변경본을 읽기 전용으로 검토했다. 현재 판정은
**source/oracle delta reviewed; fresh runtime evidence pending**이다. 이전 consistent
검증과 [private 질량 비교](mass-comparison.md)의 통과를 변경본 실행으로 승계하지 않는다.
현재 진행 상태는 [PRD](PRD.md)의 checklist가 소유한다.
`rho*N_i*dV0`를 고정 기준 measure로 두고 kinetic interpolation만 절점 i의
`x_i=X_i+u_i+z*d_i`로 변경한 구현은 [관성 상세](formulation-inertia.md)의 T_L과
일치한다. Geometry용 shape/J0와 current 27점 validity는 그대로다. M, I, c,
DqI, DvI, T, P, L 및 rates가 같은 nodal measure를 사용하며, DqI의
`D²x[p,·]ᵀ*xddot`, `Hᵀ*D²x[p,a]`, `Hᵀ*D³x[p,v,v]` 항과 DvI의 계수2를
보존한다. c를 `I-Ma`의 차감으로 계산하지 않으며 off-node mass block은 exact0이다.
임의 drilling inertia나 현재 질량의 scalar row-sum을 도입하지 않았다.
**HHT-LM-NR-001 — CLOSED: conditioning 검사 범위.** 기존 실제 physical20
positivity와 `rcond_inf>=2^-32`를 유지한다. Nodal lumped의 scaled physical20은
각 node physical5의 block diagonal이다. 따라서
`||B||inf=max_i||Bi||inf`, `||B^-1||inf=max_i||Bi^-1||inf`이며
`rcond_inf(B)<=rcond_inf(Bi)`다. 전체20 Cholesky/rcond 통과는 각 node5의
양정성/동일 rcond 기준도 보장한다. 공통 positive scaling은 rcond에서 상쇄된다.
이는 기존 실제 acceptance 유지의 근거이며 node별 조건으로 기준을 완화하지 않는다.
독립5³ nodal energy/force/momentum oracle, 초기 eigen lumped24 대조와 same-q/v
Jensen fixture의 변경은 measure와 일관된다. 기존 warped·moving-null·단위/좌표변환,
scaled partial/effective tangent sweep와 momentum/power 검사의 기준은 유지한다.
Metadata writer/self-check와 comparator의 `nodal-lumped-kinetic`도 일치한다.
현재 검토에서 추가 수식 오류는 발견하지 않았다.
새 C08·전체 Debug/CTest·원본 HHT 비교의 종료 evidence는 아직 검토하지 않았다.
수정 전 focused binary의 부분 실패와 중단은
`.dryforge/lumped-mass-adoption-20261011/focused-interrupted.json`에 보존되어 있으며
변경본 PASS가 아니다. 기존 NR-009–010의 DAE startup/가속도 정확도 문제는 질량
변경만으로 닫지 않는다. Reviewer는 production 코드·테스트·수치 기준을 수정하거나
별도 C++ build/test를 실행하지 않았다.
### 2026-10-12 종료된 검증 근거의 보완
새 `new-kernels.log`와 native 기록을 확인했다. 8 suites/38 C++ tests가 모두 PASS이며
실행 native0이다. Warped nodal moment/energy/power, 초기 eigen lumping·Jensen,
moving drill null, D3·scaled partial/effective inertia tangent sweep와 metadata/readback
검사가 포함된다. 이는 앞 절의 해당 focused 실행 대기를 해소하며 전체 회귀나 C08
통과 판정은 아니다. `python-focused.log`의 pytest137 PASS도 별도 실행 근거로 확인했다.
Current production **MSVC x64 Release** 원본 shell HHT CLI와 comparator의 native0를
확인했다. 101 U families는 모두 PASS, UR은100 families/600 rows 실패이며 기존
warning-only200건이다. 최대 U/UR family 상대 RMS는 각각
`0.0022824245022755826 / 0.025346048785888527`이다. 보고서의 모든5454 scalar
오차·near-zero 분기·RMS·판정을 직접 재계산하고 U/UR을 HDF5 source node/frame에
대조했다. `nodal-lumped-kinetic`,101 accepted frames, byte 동일 입력·binary·원본·
결과 해시도 확인했다. HDF5 SHA는
`e08f0ab304174f71c21c6644a6b7075ff5b122b2f7096936ddbcac6bcfbfb4ed`다.
Bounded 독립 감사 native0·finding0 자료는
`.dryforge/lumped-mass-adoption-20261011/independent-closed-evidence.json`이다.
이는 승인된 외부 U 비교와 실행 증거의 검토이며 V/A·에너지의 Abaqus 비교나
시간 정확도의 인증을 추가하지 않는다.
전체 `execute.py` 실행은 deadline/공유 임시 경로 문제로 중단했고 native−1을 보존했다.
이후 MKL/OMP threads1의 serial 전체789 CTest를 직접 실행 중이며 전체 PASS가 아니다.
`full-direct.log`의 C08a rigid-orbit force/power/momentum test PASS는 확인했으나
별도 C08a/C08b 시간수렴과 전체 회귀의 종료 판정은 아직 대기다. NR-009–010과
기존 정확도 요구를 유지하며 새 mass 또는 외부 U PASS만으로 닫지 않는다.
### 2026-10-12 current C08a 시간수렴 실패의 독립 대조
Serial 전체 실행의 `HhtShellPhysics.C08aRigidManufacturedOrbitFullCoordinateTimeConvergence`
종료 body를 확인했다. Current lumped 변경본은 **FAIL**, CTest elapsed731.27초이며
5개의 assertion이 실패했다. 이는 앞 절의 C08a 시간수렴 대기를 해소한 실패 결과다.
C08b와 전체789 실행의 종료는 아직 대기이며 전체 native code를 추정하지 않는다.
| C08a fixed-chart 회전 물리 가속도 φ̈의 normalized max error | 이전 baseline | Current lumped |
| --- | ---: | ---: |
| Finest h=1/256 | `0.0005675659240050177` | `0.00056747291267426469` |
| h=1/64→1/128 raw order | `1.0286686694389584` | `1.0283765928414674` |
| h=1/128→1/256 raw order | `1.0289692381730642` | `1.0294567508174022` |
5 grids의 전체 시점 maximum으로 두 마지막 `log2(e_h/e_h2)`를 직접 재계산했다.
Current finest error는 기존 `<=1e-4`를 넘고 두 raw order도 기존 `>=1.8` 미만이다.
Finest error의 baseline 대비 상대 변화는 약−0.0163878%로 작은 감소지만 통과가 아니다.
실패 assertion의 구성은 이전과 같으며 실제 metric이 동일하다고 보고하지 않는다.
나머지 두 assertion은 N7의 noise100 분리 실패다. Finest φ̇ error
`1.1876972777062108e-6`는 required100-noise `1.6576860896252254e-6` 이하이며,
φ̈ error `5.6747291267426469e-4`도 required100-noise
`8.1218686879245508e-4` 이하이다. 따라서 이 두 finest rate의 시간오차/차수 근거는
**N7 INCONCLUSIVE**다. 관측 raw order를 인증된 시간차수로 확대하지 않으며,
inconclusive를 PASS나 실패 수치 삭제로 처리하지 않는다. Accuracy 미달과 noise 분리
미달을 모두 보존하고 finest/차수/noise 기준을 바꾸지 않았다.
Bounded 감사 native0 자료는
`.dryforge/lumped-mass-adoption-20261011/independent-c08a-assessment.json`과
같은 폴더의 `independent-c08a-current-section.log`다. Baseline은
`.harness/hex8-evidence/mean-volume/full/ctest.log`의 해당 종료 body를 직접 읽었다.
Active 전체 로그와 닫힌 C08a body를 구분한다. 이 audit native0는 실패 재현/대조의
성공이며 C08a test PASS가 아니다. 외부 U 비교와 lumped 관성 불변량의 통과가
NR-009–010의 shell DAE 가속도 정확도 문제를 해결했다는 근거는 확보되지 않았다.
### 2026-10-12 current C08b의 새 runtime 실패
**HHT-LM-NR-003 — OPEN: fine-grid Newton trial의 principal-chart 이탈.** Current
`C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`는438.18초 후
`invalid-dynamic-rotation: Dynamic rotation requires finite principal coordinates
and a unit initial director.` 예외로 **FAIL**했다. h=1/64와1/128만 완료했으며,
h=1/256 완료 기록과 이후 시간차수·물리 불변량의 최종 판정은 없다. Baseline은
5792.27초 동안5 grids를 모두 완료한 뒤 accuracy assertion이 실패했다. 따라서
이번 결과를 이전과 같은 실패나 baseline 예외로 분류하지 않는다.
정확한 문구는 `EvaluateDynamicRotation`의 첫 입력 gate에서만 나온다.
`EvaluateAssembly`는 그 직전 전체 q/v/a의 finite를 검사하고, initial director는
fixture의 고정 `eZ`다. RunPlate는 모든 grids 뒤에만 AccelerationSplit을 호출하며
RecordNoise/RecoverAcceleration은 회전 API를 재호출하지 않는다. 이 경로에서
직접 좁혀지는 원인은 유한한 Newton trial의
`||phi||>=pi-sqrt(epsilon_double)`다. 완료한 두 grid의 accepted maximum
`0.27391502319015193 / 0.27394592218709063`는 실패한 중간 trial을 제한하지 않는다.
실패 frame/iteration/node와 직전 correction이 기록되지 않아 이탈을 유발한
근본 원인까지 확정하지는 않는다.
다음 진단은 private 실행에서 해당 identity·phi norm·직전 q/Δq, scaled physical/
drilling-null correction과 effective tangent의 null regularity/Schur conditioning을
보존하는 것이다. Linear backward error `<=1e-12`나 positive physical mass는
near-singular nonlinear tangent의 큰 correction 및 massless DAE의 시간안정성을
보장하지 않는다. Principal clamp, 기준 완화 또는 grid 생략으로 닫지 않는다.
닫힌 body snapshot과 baseline/source hash를 보존한 읽기 전용 감사는
`.dryforge/lumped-mass-adoption-20261011/independent-c08b-assessment.json`이다.
전체789 CTest는 아직 실행 중이며 이 감사 native0는 test PASS가 아니다.
**HHT-LM-NR-002 — OPEN: manufactured force-rate oracle의 잔존 consistent 계수.**
`RigidForceRates`의 두 병진 계수 `0.2/3`와 `integral(N_i X)=X_i/3` 주석은
기존 consistent 식이다. 단일 centered rectangle의 nodal mass는 `0.2`이므로
채택한 T_L의 `Fdot_u=0.2*x'''`, `Fddot_u=0.2*x''''`가 맞다. 회전 계수
`0.008/12`는 유지한다. 세 callers는 모두 ManufacturedHidden으로 전달하고,
그 함수는 회전 rows만 읽으므로 현재 C08a 수치에는 이 병진 오류가 전달되지 않는다.
C08b의 manufactured=false 경로에는 호출 자체가 없으므로 위 예외의 원인이 아니다.
Owner는 두 계수·주석을 수정하고, 모든24 force-rate rows를 독립 시간미분한
`Integrate(RigidOrbit(t))`와 대조하는 작은 검사를 추가해야 한다. Generic interior
t와 미분 step sweep 또는 독립 미분 quadrature를 사용해 현재 consumers가 무시하는
비영 병진 rows도 검증한다. Reviewer는 source/test나 acceptance를 수정하지 않았다.
### 2026-10-12 force-rate oracle 수정의 독립 확인
**HHT-LM-NR-002 — CLOSED: source 수정 및 bounded 실행 근거 확인.** 두 병진
계수가 `0.2`로 수정됐고 nodal moment 주석도 일치한다. 새
`NodalRigidForceRatesMatchIndependentTimeDifferences`는 t=0.37,
delta=0.02/0.01/0.005에서 독립5³ quadrature force의5점 시간미분을 계산한다.
모든24 rows를 포함하되 병진/회전 norm을 각각 분리하고, 두 미분 모두 positive
reference norm과 상대 norm error `<=1e-6`를 검사한다. 미분 stencil의 부호와
`12*delta / 12*delta²` 분모를 확인했다. 이는 새 oracle 검사이며 기존 C08의
accuracy/order/noise 또는 외부 비교 기준을 변경하지 않는다.
Private RED/GREEN TU의 산술 차이는 두 병진 계수뿐이며, GREEN TU는 현재 test
source에 private main만 더한 것과 동일하다. RED native1에서6개 병진 검사가
상대 norm error 약0.66666663–0.66666667로 FAIL했으므로 잔존 consistent 계수를
실제 검출한다. GREEN의 새 검사1개와 기존 pointwise force/power/momentum 검사
1개는 각각 PASS/native0다. Compile records는 MSVC x64 Debug·현재 production
solver library의 link와 native0를 기록한다. 원시 log·TU·binary 해시를 포함한 감사는
`.dryforge/lumped-mass-adoption-20261011/force-rate-oracle/independent-oracle-review.json`이다.
현재 shared 전체 CTest binary는 이 추가 검사로 재빌드되지 않았으므로 위 결과는
별도 private probe 근거다. GREEN의 정확한 성공 error margin은 log에 출력되지 않는다.
이 oracle finding만 닫으며 NR-009–010, C08a 시간정확도 실패와 HHT-LM-NR-003의
새 C08b runtime 실패는 그대로다. Reviewer는 build/test를 실행하거나 source를
수정하지 않았으며 보고서 정적 검토만 수행했다.
### 2026-10-12 C08b private trace로 확정한 실패 위치
**HHT-LM-NR-003 — OPEN; 직접 principal-chart 이탈은 실행으로 확인.** Private
single-grid Debug runner의 `run.log`와 native1에서 같은 예외가 재현됐다.
h=1/256, increment56, Newton iteration3, t=0.21875의 `phase=newton`,
`third=false` 평가에서 internal node4(source label5)의 total 회전 좌표는
`phi=(0.64127523289755728,-1.1977756953049712,3.6162098692194427)`다.
로그 성분으로 독립 계산한 `||phi||=3.8630136368942867 rad`는 π보다
`0.7214209833044936 rad` 크다. 회전 q/v/a 성분은 모두 finite이며, production
전체-vector finite 검사를 지난 뒤 principal gate에서 실패하는 경로와 일치한다.
앞 절의 bounded 추론은 이 직접 실패 위치에 대해서는 실행 근거로 확정됐다.
이 runner는 MakeFixture(2)의 h=1/256 grid를 직접 시작하므로 이전 두 coarse
grids의 선행 실행 없이도 재현했다. 다만 직전 q/Δq 및 null/effective-tangent
conditioning은 이 실행 trace에 없으므로 큰 invalid Newton trial의 근본 원인을
mass 산술·DAE 시간안정성·conditioning·Newton 전략 중 하나로 확정하지 않는다.
현재 private TU에는 이 log에 없는 추가 instrumentation이 있으므로 현재 TU와
당시 실행 source가 byte 동일하다는 주장은 하지 않는다. 원시 log/native/기존
binary 해시와 scalar 검산은
`.dryforge/lumped-mass-adoption-20261011/c08b-diagnostic/independent-trace-review.json`에
보존했다. 추가 재실행이나 source/tolerance 변경은 하지 않았다. 직접 실패 위치
확인은 전체 C08b 시간수렴 통과나 HHT-LM-NR-003의 폐쇄가 아니다.
후속 active 전체 로그에서 Hex8 overflow/factory stale fixture의 FAIL 두 개도
확인되어 현재 실패 관측은 총4개다. 두 fixture의 독립 수치 원인·test-only 수정과
실행 대기 상태는 [Hex8 독립 검토](../hex8-structural-analysis/numerical-review.md)의
2026-10-12 전체 실행 절을 따른다. 앞의 shell 두 실패만으로 전체 집계를 요약하지
않으며, 아직 종료하지 않은 전체 native/최종 판정을 추정하지 않는다.
### 2026-10-12 최종 전체/focused 종료 근거
전체789 serial MSVC x64 Debug CTest의 자연 종료 로그를 직접 재집계해
**784 PASS / 4 FAIL / 1 SKIP, native8, elapsed9131.26초**를 확인했다.
원래 shell C08a/C08b와 Hex8 overflow/factory4개 FAIL 및 C04a finest reduction
SKIP은 보존된다. 전체 종료는 FAIL이며 앞 절의 진행/최종 판정 대기를 해소한다.
이후3개의 test-only TU 수정으로 shared binary rebuild native0, discovery790을
확인했다. 새 force-rate derivative·기존 pointwise force/power/momentum2개는
`final-oracle-rebuild/ctest.log`의 configured CTest에서 PASS/native0다.
따라서 HHT-LM-NR-002의 폐쇄 근거는 private probe에 더해 최종 shared 실행도
확보했다. Hex8의 수정된 overflow/factory2개도 configured focused CTest에서
PASS/native0이며 두 stale findings가 닫혔다. **전체790은 재실행하지 않았다.**
HHT C08a 시간정확도/noise와 HHT-LM-NR-003 C08b runtime finding은 **OPEN**이며
두 oracle PASS 또는 Hex8 fixture 폐쇄로 닫지 않는다.
전체 전후 production190 files/original16 files의 hash 동일성을 현재 파일의 직접
재해시로 확인했다. Final actual unit SHA
`4e39c8992a527366e66ea295bf4598a068ca44456fc32c1ab973d2376759c11a`도 일치한다.
`final-test-identities.json`은 raw helper의 force-only note에 빠졌던 factory/
overflow test-only 변경을 별도 annotation으로 정정하며3개 test source/record
hash를 확인했다. 최종 읽기 전용 감사는
`.dryforge/lumped-mass-adoption-20261011/independent-final-regression-review.json`이다.
전체4 FAIL의 원시 이력과 후속2+2 focused PASS를 구분하며 전체 green·기능 완료를
주장하지 않는다. Reviewer는 source/tolerance 수정이나 추가 build/test를 실행하지 않았다.
### 2026-10-12 초기 Newton 정책 변경의 독립 검토
사용자 요청에 따른 HHT-ADR-013은 [구현·검증 기록](newton-start-policy.md)을 따른다.
Reviewer가 task 시작 before snapshot과 실제 변경6개 파일을 대조해 기존 mass 변경을
제외했다. 두 초기 좌표의 동일 predictor/rates·free energy norm·iteration0 assembly 소비·
후속 full correction·기존 gate·실패 logging/commit 경계를 확인했다.
HHT-START-NR-001: source 순서의 앞 절점 rate overflow를 뒤 절점 chart 위반으로
오인하는 분류 결함을 발견했다. Actual configured mixed-node 검사 native8 RED 뒤,
동일 후보 rates로 첫 실패 절점만 판정하도록 수정해 CLOSED했다. 관련37/37 검사에는
새 helper11개와 기존 large DIRECT 회귀·대수·shell recovery·HDF5 실패 보존이 포함되며
native0다. 남은 actionable source blocker는 발견하지 못했다.
후속 closed-log 감사에서는 실제 C08b 5개 grid의 회전 예외 해소와 runtime 회귀 PASS,
남아 있는16개 정확도/P 판정 실패를 독립 재계산했다. C08b N7 noise는 모두 PASS이며
C08a의5개 실패와 finest noise INCONCLUSIVE는 별도로 유지한다. Fresh reference의
실제 HDF5·CSV·202개 family·200 warnings도 독립 재계산해 U101 PASS와 일치했다.
검증 시작 identity 대비 production190·원본16·task6·binary4 hash가 모두 일치했다.
전체802도 제외 없이11384.61초 뒤 native8로 자연 종료했다:799 PASS·2 FAIL·1 SKIP.
Discovery와 실제 완료 이름이 정확히 일치하고 검증 전후 source·원본·binary hash가
보존됐다. 전체 예외는 C08a/C08b 정확도 판정과 기존 C04a SKIP이다. 이전789개의
실패 metric 동일성 또는 HHT 전체 기능 완료를 주장하지 않는다.
최종 독립 감사도 raw802행의 이름·순서·번호, native8·집계·원문 hash와 현재 identity를
재대조해 일치함을 확인했다. 추가 actionable source blocker는 발견하지 못했다.
Scratch 독립 기록은 `.dryforge/hht-predictor-newton-20261012/independent-review.{md,json}`이다.
현재 C08/N7 정확도 finding은 별도로 유지한다. 과거789 FAIL·790 discovery 기록은
당시 evidence이며 이번 변경의 전체 판정은 [PRD](PRD.md)의 연결 evidence를 따른다.