Files
FESADev/docs/mitc4-shell-feast-eigen2/implementation-numerical-review-s3-static.md
T

66 lines
4.8 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.
# S3 partial-BC 정적 평형 불일치
- Feature: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; 검토일: `2026-09-09`.
- Finding: **NR-IMP-10 / upstream-contract-conflict**. [현재 보고서](implementation-numerical-review.md)의 추가 검토다.
- 입력: [S3 정식화](formulation-mass-stabilization.md), [E2-C09](numerical-review-cases.md), 채택 [C7](../mitc4-shell-feast-eigen/numerical-review-controls.md), 기존 [linear formulation §14.1](../linear-static-mitc4-shell/formulation.md), [linear I/O §6.5](../linear-static-mitc4-shell/io.md).
## 독립 수치 결론
`d=(3/5,0,4/5)`, node1 URZ만 free, applied moment `(-4/3,0,1)=(5/3)b`,
`M0=1`인 승인 S3에서 다음은 정확하다. Moment의 단위는 `[force·length]`다.
\[
\theta_{1Z}=7500/10369,\qquad
\gamma_1=d^T\theta_1=6000/10369,\qquad k_d=19/4800.
\]
Physical stiffness의 spatial total moment는 0이지만,
`Kdrill`은 node1에 `tau_d=kd gamma1 d`를 더한다. `r=Kq-F`의 free 성분은 0이므로
applied load와 **constrained full residual**을 더한 기존 global moment evidence는
\[
e_M=\tau_d=(57/41476,\ 0,\ 19/10369),\qquad
\|e_M\|=95/41476\approx0.002290481242164143\ne0.
\]
Global Z45° 회전에서는 `e_M'=Q e_M`이며 norm은 같다. Applied moment가 tangent라는 사실은
partial global BC가 만든 `gamma1!=0`을 없애지 않는다. Load의 constrained X 성분을 추가해도
`Ff=1`과 위 nonzero torque는 그대로다. Physical rigid representative의 회전은 `P_i Omega`이고,
full spatial `Omega`와 numerical drilling energy를 혼동하면 이 불일치를 놓친다.
[기존 독립 oracle](numerical-review-evidence.md)의 첫 Python block을 그대로 실행한 뒤
원 `K,q,F`에서 constrained `Kq-F`, 각 node의 `X cross R+RM`을 따로 합산했다.
현재 [global recovery](../../src/fesa/results/global_equilibrium_recovery.cpp) 193–249행과 같은
정규화에서 `reaction moment scale=3.1253278233567374`,
`applied moment scale=5/3`, `eta_M=0.0007328771161369957`을 얻었다.
Fraction 산술의 위 exact torque와 일치한다. 따라서 기존 `1e-10` 검사가 실패하는 것은 예상된 결과다.
이것은 독립 수학 실행이며 C++/reference/solver 재실행이 아니다.
## E2-C09 검증 계층과 계약 경계
**E2-C09 자체는 public `LinearStaticProcedureExecutor::Execute`의 성공을 명시하지 않는다.**
S3, E2-C09 및 채택 C7의 해당 문장은 `thetaZ`, complete full `Kq-F`, same-BC/load 회전 공변성을 요구한다.
기존 독립 evidence도 direct1DOF partition solve로 이를 검증했고 zero global moment를 확인한 적은 없다.
따라서 production kernel의 complete K를 geometry/frame부터 재계산하여 `Kff theta=Ff`를 풀고,
전체 `r=Kq-F`와 원/회전 결과를 비교하는 **직접 pencil 테스트는 E2-C09에 맞는 검증**이다.
Constrained residual이 0이어야 한다는 의미로 complete residual 기준을 적용하지 않는다.
이는 case의 test layer를 바로잡는 것이며 threshold·물리·reaction 계약을 바꾸지 않는다.
동시에 **public static 실패는 별개의 실제 계약 충돌로 남는다.** 기존
[linear requirements](../linear-static-mitc4-shell/requirements.md)의 017–019는 이 global component BC와
tangent CLOAD를 지원하고, 029/046/057 및 기존 I/O는 full residual reaction과 spatial global balance를 유지한다.
새 요구 024/027은 그 의미를 보존한다. 승인된 M2의 rotation-only drill penalty와 이 조합은
S3에서 exact algebra상 동시에 public 성공 조건을 만족할 수 없다.
직접 테스트 통과만으로 public static 회귀가 해소되었다거나 이 입력이 새로 unsupported라고 선언하면 안 된다.
**처리:** E2-C09의 algebraic 검증과 현재 public failure 재현은 따로 보존한다.
Global balance를 완화하거나 drill torque를 빼거나 reaction을 projection하거나 fixture BC/load를 바꾸어 실패를 감추지 않는다.
Public static의 해당 supported 범위까지 성공해야 하는 완료 판정을 내려면 메인이 formulation/requirements owner에게
이 exact 반례를 전달하고, physics·지원 범위·recovery/acceptance 중 어떤 계약을 바꿀지 사용자 결정을 받아야 한다.
현재 numerical reviewer에게 그 변경을 자체 승인할 권한은 없다. Eigen S3의 finite-pencil target은 이 static 충돌로 바뀌지 않는다.
후속 실행 전달: 메인은 E2-C09를 direct pencil/full `Kq-F` covariance 테스트로 수정하여 통과했고,
별도 public static 테스트는 현재 global-equilibrium rejection을 재현한다고 보고했다.
이는 수학 case와 public 실패를 분리해 검증한 evidence이며, 지원 범위의 상위 계약 충돌을 해결하거나
public failure를 승인된 unsupported-input 진단으로 바꾼 결정은 아니다.