Files
FESADev/docs/hht-implicit-dynamics/implementation-fixed-null-basis.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

8.0 KiB

Fixed-null basis 구현 기록

2026-10-13, HHT-ADR-018 정식화와 독립 core 검토를 적용했다. 이 기록은 production 구현·컴파일·실행 결과를 구분하며 PRD의 완료 체크를 대신하지 않는다. Physics/public schema/원본 reference/tolerance는 변경하지 않았다.

Source와 private API

hht_reduced_internal.h, hht_reduced_operators.cpp, hht_reduced_procedure.cpp가 production 변경 범위다. FixedChart.p_dofs/z_dofs는 canonical representative label만 남기고 계산에는 p_columns/z_columns의 node/channel/fixed-plane metadata와 sparse support를 사용한다. Fully-free admissible-null node는 actual frame0 analytic null의 ON complement이고, partial rotation BC는 원 component chart다. Basis는 run 동안 고정한다.

ProjectPhysical/ProjectAlgebraic는 sparse transpose, Lift는 source-ordered compensated product/sum이다. Graph Jacobian, retained Jacobian, implicit q/time derivatives, full v/a, projected equilibrium와 augmented tangent의 모든 block, full q/v/a correction을 같은 injection으로 연결했다. Frame0 원 q/v/a/A·force는 덮어쓰지 않으며 원 public exact q/v 초기 gate를 보존한다. Initial projection 후 accepted private history를 매 증분 재투영하지 않는다.

AssembleAugmentedReducedSystem(...,cv,ca,ell,h)는 actual Sr*Kraw*Sx와 Sr*braw를 반환한다. row_scale/unknown_scale을 함께 보존하고 MapAugmentedCorrection이 actual solution을 undo한 후 full state로 map한다. Nonzero scaling/undo의 underflow/overflow는 fail-closed다. Restricted Newton도 actual scaled principal system을 풀며 U high/low/Ar/vp/ap와 trace를 그대로 복사한다. Combined100/원 commit 조건은 유지한다.

CheckSelectorTransversality는 normalized moving-null와 retained basis의 node-local spanning operator S를 직접 만들고 inverse-action/actual backward checks로 global infinity rcond를 계산한다. S^T*S나 임의 cosine cutoff를 사용하지 않는다. 원 2^-32를 적용하며 G/moving-null/mass range 검사와 구분한다. CheckGraphRegularity는 S와 actual G를 각각 검사한다.

Basis coefficient radius와 N3

FixedBasisColumn.support_radii는 support와 평행한 BL다. Actual norm은 frozen m=max|x|, y=x/m, s=(y0²+y1²)+y2², sqrt(s), m*sqrt(s)다. Normalize/projection/cross의 실제 연산과 outward radius를 함께 계산한다. FE-nearest 및 gradual-underflow 환경을 검사한다. Zero coefficient도 support/BL를 보존하며 invalid/nonfinite radius는 chart 생성 실패다.

BL의 범위는 stored binary64 analytic null을 exact input으로 둔 frozen chosen branch의 ideal basis construction이다. FEM/AD의 ideal analytic null 오차나 branch perturbation을 인증하지 않는다. Component identity coefficient의 BL0은 exact constant 의미다. Controller는 초기 projection과 모든 basis action/history에 이 BL를 사용해야 하며 과거 index-only CA PASS를 승계하지 않는다.

구현 중 division roundoff의 rho*(1+Bden/lower) 증폭과 nonzero subnormal product/quotient가0으로 반올림되는 radius enclosure를 추가로 교정했다. denorm_min은 산술 radius의 상향 enclosure이며 physical scale/floor가 아니다. Opaque hypot의1u 가정은 제거했다.

N3는 원 private k*delta ap 대 delta Ar single-term1e-12 gate 및 component-chart mapped full A gate를 유지한다. 별도의 Lp^T*delta Afull consistency를 actual coefficient product의 절댓값 합과 |delta Ar|로 검사한다. 이 추가 gate를 기존 single-term gate의 동일 표현이라고 부르지 않는다. Whole/requested private high+low pair와 RN-even 조건을 유지하고 global sparse q/v/a reconstruction과 full A filter를 따로 검사한다.

현재 evidence와 남은 상태

Private isolated MSVC production/fixture compile·link는 native0다. 최초 syntax compile에서 Vector3를 std::array metadata에 직접 넣는 type mismatch가 있었으며 explicit component copy로 수정했다. Main의 첫 configured Debug production 두 cpp는 컴파일됐으나 전체 build는 controller namespace/fixture 오류로 native2였다. Production-only compile을 전체 build PASS로 보고하지 않았다.

이후 main configured Debug full-target build는 native0, focused26 검사는 native0/176.41s다. Actual noncomponent finite-initial-null warped/shared/time-load N5는 mutation 포함152.47s PASS이며, basis5/BL/policy/N3/lifecycle 회귀도 통과했다. Artifacts는 .dryforge/hht-remediation-20261012/adr018-core-linked-debug-build*, adr018-core-focused-debug*, adr018-core-focused-identity.json이다. 같은 epoch actual C09는 native8/238.51s로 같은 inner-graph100 실패를 재현했다. 이26개 PASS가 C09/C08/reference closure를 뜻하지 않는다.

진행 중이던 private proper-Q natural 실행은 native1/84.735s FAIL이다. Original frame0와 increment1/iteration3은 accepted였으나 increment2/outer1에서 inner graph100에 도달했다. Last psi infinity norm은 4.87541e-20(row3), normalized norm은 .000282689, correction infinity norm은 1.72978e-17(column3)이다. Tiny graph residual만으로 원인 또는 기준의 불가능을 확정하지 않는다. 원 scale/threshold/state를 유지했고 추가 실행/production 변경은 configured feedback 전 보류했다.

이 private epoch는 .dryforge/hht-fixed-null-basis-20261013/의 build.cmd, basis-proper-q-runtime.log, actual-iteration.log, identity.json에 분리했다. Actual command는 actual.exe --gtest_filter=DiagnosticChannelNewton.ActualProperQNatural이다. 복사한 기존 solver library에 current procedure/operators object를 override했으며 공용 build/CTest는 수정하지 않았다. ADR017의 covariance FAIL 및 과거 private PASS는 현재 basis PASS로 승계하지 않는다.

공용 source를 수정하지 않은 instrumented private copy는 native1/144.191s로 동일 실패를 재현했다. Failing graph call9의 tail은 full q/z/operator fingerprint 모두 4-cycle이며 전체를1/2-cycle이라고 부르지 않는다. Last13의17자리 raw q/z를 IEEE binary64로 재구성하여 period4 bitwise equality9쌍을 확인했고, period2는 전체에 성립하지 않았다. 다만 next lifted q와 prior evaluated q의 actual full-vector memcmp는48회 같았으며 최초 iteration5다. Next z와 prior z는 같지 않아 기존 z-only1/2 guard가 이 actual-argument 반복을 검출하지 못했다. Same q에서 모든 scalar/gradient/Hessian/time/third operator fingerprint는 동일했다. 원 graph100 및 endpoint 기준의 FAIL은 유지했다.

basis-inner-graph-trace.log, graph-trace-runtime.log, graph-trace-summary.json, analyze-graph-period.py, graph-trace-identity.json에 이 증거를 별도로 저장했다. Trace replay iteration log는 원 private FAIL의 pretrace SHA와 exact 일치함을 확인했고 graph-trace-iteration.log에도 별도 보존했다.

독립 raw 감사 후 actual-argument 반복을 기존 stagnation 처리에 적용했다. Existing unchanged/two-z 처리 다음에 next Lift의 finite 여부와 current/prior evaluated q에 대한 bitwise equality만 확인한다. 반복이면 current evaluated p/z/q/operators와 raw diagnostics를 그대로 반환한다. Next z나 best-state를 적용하지 않으며 별도 tolerance/all-history search/budget refund는 없다. 후속 original full endpoint/N3/N4가 acceptance를 판단한다. 이 guard의 graph convergence 또는 새 전체 trajectory PASS를 선보고하지 않는다. Root가 valid ON basis의 ReturnsEvaluatedTrialWhenLiftAbsorbsAChangedPrivateRoot 회귀를 추가했고, 새 configured runtime은 PENDING이다.

새 configured basis/BL/S/scaled-N5 검사, actual C09 전체 경로, controller CA/N7, C08a7/C08b8 grid, 전체 Debug/CTest와 원101-frame reference는 새 source identity에서 닫아야 한다. Main이 공용 build/CTest와 acceptance 문서를 소유한다.