66 lines
4.8 KiB
Markdown
66 lines
4.8 KiB
Markdown
# 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 진단으로 바꾼 결정은 아니다.
|