# MITC4 질량·축소·stabilization 유도 근거
이 폴더는 이전 MFE baseline의 유도·반례 근거다. 현재 구현 계약은 [eigen2](../mitc4-shell-feast-eigen2/README.md)이며 채택·비채택 범위는 그 정식화에서 명시한다. 아래 과거 controls·reference portfolio·pass를 자동 승계하지 않는다.
## MITC4 질량행렬과 FEAST 고유치 정식화
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 요청 outcome: `pass`; 다음 owner: `numerical-review-agent`.
- 상태: 독립 numerical review 요청이며 자기 승인이나 workflow 전이가 아니다.
필수 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[requirements](requirements.md#requirements), [requirements evidence](requirements.md#requirements-evidence),
[research](research.md#research), [research evidence](research.md#research-evidence)이다.
[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md),
[공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md),
[문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용했다.
### 핵심 계약
1. 기존 원형상 MITC4 운동학·physical stiffness·director·global 6 DOF 의미를 유지한다.
Physical 3 translation/2 tangent rotation의 consistent mass와 구성 scalar moments를
같은 Jacobian으로 계산한다. Trilinear mapping의 mass integrand는 각 축 최대 4차이므로
mass는 3×3×3 Gauss로 충분하며 곡면의 odd-thickness coupling을 유지한다.
식과 단위·strong/weak form: [mass M1~M5](formulation.md#formulation-mass).
2. 계산된 consistent moment를 row-sum하여 global nodal 6×6 block lumped mass를 만든다.
총 병진 질량·spatial centroid·할당된 thickness moments를 보존하고 drilling은 정확한 null이다.
일반 운동에너지 차이는 nonnegative Jensen identity로 명시한다.
보존/근사 범위와 독립 평판 oracle: [mass M6~M10](formulation.md#formulation-mass).
3. 실제 homogeneous global constraints를 먼저 적용한다. Free space에 완전히 포함된
director null만 분리한다. 개선된 nodal stabilization에서도 Kpz=0, Kzz>0임을 입증하여
finite spectrum을 nodal projection으로 보존하며 부분 BC에 남는 stabilization은 유지한다.
Sparse block whitening, rank 예외와 global 복원: [eigen E1~E5](formulation.md#formulation-eigen).
4. Actual FEAST mass와 모든 modal 검증은 derived lumped다. `.inp`의 N을 유지하고
finite enclosure·prefix count·cluster capacity·count/solve 일치와 독립 eigenpair 검증을
결합한다. Endpoint/conditioning 한계를 count theorem으로 과장하지 않는다.
Backend 경계와 bounded search, 상태 보존: [eigen E6~E8](formulation.md#formulation-eigen).
5. 사용자 승인 r2의 numerical scale은 초기 physical K20의 여덟 접평면 회전 대각의
평균 `k_ref=sum_i tr(R_i)/8`, `k_d=10^-3 k_ref`로 고정한다. Zero diagonal을 포함한
전체 inventory를 사용하며 접평면 기저·전역 좌표에 불변이다. 선형/eigen의 nodal drill
map과 nonlinear의 objective potential·초기 고정 lifecycle은 각각 유지한다.
양의 inventory, 재계산 공변성, rigid modes, 반례의 exact target과 적용 경계는
[stabilization S1~S7](formulation.md#formulation-stabilization)에 있다.
### Requirement coverage
아래 ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사다. Requirements matrix의 acceptance 원본을
복제하지 않으며 formulation의 기여와 다음 owner를 구분한다.
| IDs | 정식화/검증 연결 | 후속 확인 |
| --- | --- | --- |
| `001`, `002`, `004` | mass M1~M4, stabilization S1/S2: 원형상, physical kernel·director·재료·기하 보존, numerical scale 교체 | NR, I/O |
| `003` | mass M1/M5: 양의 일정 rho와 section별 연결 전제 | I/O semantic validation |
| `005`, `006`, `026` | mass M5~M10, verification V2: consistent→lumped, coupling, positivity/null, 보존/근사 | NR independent oracle |
| `007`, `008` | eigen E1~E5, stabilization S4, verification V3: 실제 BC 뒤 개선된 pencil 보존, stable assembly/복원 | NR rank/conditioning |
| `009`, `010`, `011`, `012` | eigen E6~E8, verification V6: 낮은 N, multiplicity, 실제 FEAST, 유한 실패 | NR numerical controls, real runtime |
| `013`, `014`, `018` | verification V1~V5, stabilization S3/S6: lumped 검증과 complete K/지원 partial BC 재계산 공변성 | NR, Physics |
| `015`, `016` | mass M2 및 eigen E1/E6: 무감쇠 단일 procedure·동차 BC·input N authority | I/O exact syntax/no-op/exclusion |
| `017`, `019` | eigen E8: lambda/normalization 의미, source identity, candidate/final 보존 | I/O additive schema/failure |
| `020`, `021`, `022` | verification V6: 지정 TXT Value-only, identity 사전검사/common tolerance | NR family, I/O mapping |
| `023`, `024`, `025` | stabilization S5/S7, verification V8: 기존 linear/nonlinear scale 적용·correctness/reference 재검증 | Planning TDD/MSVC/회귀, Physics/Release closure |
| `027` | stabilization S1~S7: 단일 공변 scale·positive/null/rigid 역할과 기존 고정식 대체 경계 | NR 독립 검토, Implementation/Physics |
### Evidence와 handoff
실제 linear의 kd 선정 및 nonlinear 생성 시 초기 계수 전달·저장 경로를 대조했다.
r1의 mass M5~M10, FEAST E6~E8, full residual·transaction 수식과 NR의 독립 mass oracle
근거를 영향 확인 후 보존한다. 원본 reference hash는 r1 관찰 이력이며 재조회하지 않았다.
출처·명령·미실행은 [verification V7/V8](formulation.md#formulation-verification)에 있다.
Source/reference/upstream을 편집하지 않았고 수치 실행 결과를 통과로 보고하지 않는다.
현재 새 physics/scope/compatibility 선택이나 사용자 미결정은 없다. r2 수식은 NR-MFE-001에
대한 algebraic target을 제공하며 그 반례의 독립 해소 판정이나 runtime 통과를 주장하지 않는다.
Numerical Review는 [verification V6](formulation.md#formulation-verification)의 dimensionless metric,
zero branch, analytic rank와 finite algorithm을 독립 검토하여 threshold, FEAST control/budget,
필수 benchmark 및 reference mode/frame family를 고정한다. I/O는 영속 schema를 정의한다.
이번 formulation stage는 완결된 수학 계약을 NR에 인계하며, 실제 구현 진입에 필요한
전체 계약 bundle은 NR의 수치 기준과 후속 I/O/planning 이후 완성된다.
Count의 floating-point 한계, near-null conditioning, shifted sparse fill와 보수적 count
scratch 비용은 아직 실제 runtime evidence가 필요하다. Release readiness를 주장하지 않는다.
## MITC4 consistent mass와 nodal block lumping 유도
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md#formulation)
근거는 [research evidence](research.md#research-evidence)의 `S01`, `S02`, `P01`, `R01`~`R03`이다.
아래 유도는 FESA의 승인된 운동학에 대한 것이며 Abaqus 내부 질량과의 동등성 주장이 아니다.
r2는 M4의 numerical scale만 [S1](formulation.md#formulation-stabilization--s1-초기-physical-trace로-고정하는-단일-scale)로
대체한다. M1/M2 및 M5~M10의 질량·quadrature·moment·lumping 식은 영향 확인 후 보존했다.
### M1. 변수, 원형상과 운동학
길이·질량·시간 차원을 각각 `L`, `M`, `T`라 한다. 각 element는 원형상 좌표
`X_i [L]`, 기존 patch에서 얻은 공통 unit nodal director `d_i`, 일정한 centered thickness
`t>0 [L]`, section의 material에서 결정된 일정 density `rho>0 [M/L³]`를 사용한다.
`E>0 [M/(LT²)]`, `-1=0`이다. Interpolated director를 normalization하여 M1의 geometry를
변경하지 않는다. 기존 kernel의 `EvaluateGeometry`와 같은 Jacobian 및 부호를 사용한다.
기존 [정식화](../linear-static-mitc4-shell/formulation.md)의 §§3~5, 8~11이
director 생성, tangent frame `(a_i,b_i,d_i)`, 기하 허용 조건과 MITC strain을 소유한다.
전역 nodal 좌표는 `q_i=[u_X,u_Y,u_Z,theta_X,theta_Y,theta_Z]^T`이다.
`u [L]`, `theta [1]`이고 양의 director 변화는 `theta cross d`이다. 다음 map을 정의한다.
\[
S_i=-[d_i]_\times,\quad P_i=I-d_i d_i^T=S_i^TS_i,\quad
G_i(z)=[I_3\ \ zS_i],\quad H=[N_1G_1\ \cdots\ N_4G_4]. \tag{M2}
\]
따라서 입자 변위/속도는 `u(X)=Hq`, `v(X)=H q_dot`이다. Physical nodal coordinates
`[u_X,u_Y,u_Z,alpha,beta]`에서 회전 열은 `[-z b_i, z a_i]`이다.
`alpha=a_i^T theta`, `beta=b_i^T theta`, `gamma=d_i^T theta`이며
`S_i d_i=0`이다. 20↔24 변환은 기존 `PhysicalTransformation20`/`DrillingTransformation4`
그대로이다. MITC assumed shear와 `5/6` shear factor는 strain/stiffness에만 작용한다.
속도 보간과 질량에 이 factor를 적용하지 않는다.
### M2. Strong/weak form과 기존 stiffness
원형상·무응력 상태의 소변형 무감쇠 자유진동에 대해 continuum parent는
`rho u_ddot = div sigma`, `sigma=C_ps:epsilon`, `sigma_33=0`이다.
자유 표면·자유 edge의 generalized traction은 0이고 essential data는 동차 global DOF
제약이다. 허용한 thickness 운동학과 MITC projection에 제한한 약형은
\[
\int_{\Omega_0}\rho\,\delta u^T\ddot u\,dV+
\int_{\Omega_0}\delta\bar e^T C_5\bar e\,dV+
\delta\gamma^T K_d\gamma=0. \tag{M3}
\]
원형상 physical elastic Hessian과 quadrature는 기존 stiffness 계약을 유지한다.
\[
C_5=\operatorname{diag}\left(
\frac{E}{1-\nu^2}\begin{bmatrix}1&\nu&0\\\nu&1&0\\0&0&(1-\nu)/2\end{bmatrix},
\frac56\frac{E}{2(1+\nu)}I_2\right),
\quad K_{20}=\sum_{g\in2\times2\times2}\bar B_g^TC_5\bar B_gJ_gw_g,
\]
\[
K_e=T_p^TK_{20}T_p+T_d^T(k_d I_4)T_d,\quad
k_d=10^{-3}k_{ref,e}. \tag{M4}
\]
`bar e=[epsilon11,epsilon22,gamma12,gamma13,gamma23]`이다. `k_ref,e`는
[r2 scale S1](formulation.md#formulation-stabilization--s1-초기-physical-trace로-고정하는-단일-scale)으로 계산한다.
기존 [정식화 §12](../linear-static-mitc4-shell/formulation.md)의 physical kernel·변환·
drilling map은 유지하고 옛 최소 대각 scale만 사용자 승인 범위에서 대체한다.
이 유도 작성 당시 source는 옛 scale을 사용했다. 현재 [source](../../src/fesa/elements/mitc4_shell.cpp)의
채택식과 구현 검증은 [eigen2 정식화](../mitc4-shell-feast-eigen2/formulation.md)와
[구현 검증](../mitc4-shell-feast-eigen2/implementation-verification.md)을 따른다.
Drilling energy는 수치 stabilization이며 물리 strain/stress가 아니다.
`K_e q_e`는 내부 elastic generalized force, `M_L,e q_ddot,e`는 inertia다.
최종 반이산식은 `M_L q_ddot + Kq=0`이다. Harmonic ansatz
`q(phi,tau)=phi cos(omega tau)`에서 `Kphi=lambda M_L phi`, `lambda=omega² [T^-2]`를 얻는다.
새 constitutive/history state, geometric stiffness, damping, preload, nonlinear tangent,
time integrator 또는 modal stress/reaction recovery는 없다.
### M3. Consistent matrix와 충분한 quadrature
`T_C=1/2 integral rho |H q_dot|² dV`에서
\[
C^{(k)}_{ij}=\int_{\Omega_0}\rho N_iN_j z^k dV\quad(k=0,1,2),
\qquad
(M_C)_{ij}=\begin{bmatrix}
C^{(0)}_{ij}I_3&C^{(1)}_{ij}S_j\\
C^{(1)}_{ij}S_i^T&C^{(2)}_{ij}S_i^TS_j
\end{bmatrix}. \tag{M5}
\]
세 scalar moment matrix는 각각 symmetric `4×4`이다. 차원은 `C(k) [M L^k]`,
mass의 `uu/u-theta/theta-theta` block은 각각 `M/ML/ML²`이다.
`M_C [24×24]`는 global block 형식이며 20 physical mass의 congruence와 동일하다.
원본 `M_C`와 그것을 구성한 `C(0..2)`를 완성·검증한 후 lumping 입력으로 사용한다.
Global consistent sparse matrix를 eigen solve에 조립할 필요는 없지만 계산 원본을
lumped 결과로 덮어쓰거나 별도의 mass를 생성한 뒤 consistent에서 유도했다고 부르지 않는다.
M1은 각 자연 좌표에 최대 1차이다. Jacobian의 세 열의 최대 다항 차수는 각각
`(0,1,1)`, `(1,0,1)`, `(1,1,0)`이므로 determinant의 성분별 최대 차수는 `(2,2,2)`다.
`Ni Nj z^k J`의 차수는 최대 `(4,4,k+2)`, 즉 `(4,4,4)`이다. 따라서 **질량에는
3×3×3 Gauss–Legendre**를 사용한다. 각 축의 points는
`[-sqrt(3/5),0,+sqrt(3/5)]`, weights는 `[5/9,8/9,5/9]`이다.
3-point rule의 5차 정확성으로 M5의 모든 항을 이 geometry에서 정확 적분한다
(floating-point roundoff 제외). 추가 density/thickness 변화를 가정한 결론이 아니다.
Loop 순서는 증가하는 `xi`, 그 안의 `eta`, 가장 안의 `zeta`, 이후 `i<=j`, `k=0,1,2`로
고정하고 대칭 항을 복사한다. Mass 계산의 27개 실제 평가점에서도 기존 geometry
predicate를 적용한다. `J<=0`, nonfinite frame/basis 등의 실패를 weight 절댓값,
점 생략이나 flat replacement로 수리하지 않는다. 기존 stiffness 8-point 경로는 변경하지
않는다. 이 검사는 27점에서의 positivity를 보장하며 volume 모든 위치의 injectivity에
대한 새 theorem이나 기존 warp/curvature 범위의 확대를 주장하지 않는다.
왜곡된 flat element라도 같은 식을 쓴다. 서로 다른 director가 있으면 `J(zeta)`의 1차 항
때문에 `C(1)`이 0이 아닐 수 있다. Centered section만을 이유로 coupling을 버리거나
`C(2)=t² C(0)/12`를 일반식으로 사용하지 않는다.
### M4. 계산된 consistent moment에서 nodal block 유도
각 node의 세 row sum과 질량 block을 정의한다.
\[
m_i=\sum_j C^{(0)}_{ij},\quad h_i=\sum_j C^{(1)}_{ij},\quad
j_i=\sum_j C^{(2)}_{ij},\qquad
L_i=\begin{bmatrix}m_iI_3&h_iS_i\\h_iS_i^T&j_iP_i\end{bmatrix},
\quad M_{L,e}=\operatorname{blockdiag}(L_1,L_2,L_3,L_4). \tag{M6}
\]
이는 scalar moment row sum 후 tensor로 재구성하는 **nodal block lumping**이다.
Global 전체 행의 합, absolute row sum, diagonal scaling 또는 nodal quadrature와
혼용하지 않는다. 같은 source node의 incident element block은 기존 source element 순서로
합한다. 공통 `d_i` 때문에 조립 후에도 M6 형태다. Local와 global에서 diagonal이 아닌
`6×6` coupling은 허용한 lumped mass의 일부다.
`sum Nj=1`을 M5에 대입하면 정확히
\[
(m_i,h_i,j_i)=\int\rho N_i(1,z,z^2)dV,\quad
L_i=\int\rho N_i G_i(z)^TG_i(z)dV. \tag{M7}
\]
`m_i>0`, `j_i>0`, `m_i j_i-h_i²>0`이다. 마지막 부등식은 양의 measure에 대해
`z`가 상수가 아닌 점(양의 두께 및 서로 다른 thickness Gauss점)과 strict
Cauchy–Schwarz에서 따른다. 이를 이용하면
\[
q_i^TL_iq_i=m_i\left|u_i+\frac{h_i}{m_i}S_i\theta_i\right|^2+
\left(j_i-\frac{h_i^2}{m_i}\right)|S_i\theta_i|^2. \tag{M8}
\]
따라서 `L_i`의 rank는 5, null은 정확히 `[0;d_i]`의 span이다.
`zbar_i=h_i/m_i [L]`, `j_i-h_i²/m_i [ML²]`는 node에 할당된 thickness
measure의 centroid와 central tangent inertia다. 음/영 variance나 nonfinite를 clamp하지
않고 mass 검증 실패로 처리한다. 모든 노드에 최소 한 활성 shell이 연결되어야 한다.
M6의 유도 연결은 `C(k)` 원본→row sum→block reconstruction으로 추적한다.
동시에 M7을 독립 직접 적분하여 두 결과의 일치를 검증할 수 있다.
서로 다른 nodal frame의 rotary component를 직접 더하지 않는다.
### M5. 보존되는 양과 근사되는 양
모든 등식은 동일 원형상·density와 quadrature measure에 관한 것이다.
1. 총 병진 질량 `m=sum mi=integral rho dV` 및 모든 uniform translation의 kinetic
energy가 consistent와 정확히 같다. 각 방향의 total mass가 `m`이며 `trace(Muu)`를
총 질량이라고 정의하지 않는다.
2. Thickness scalar moment는 `sum hi=integral rho z dV`,
`sum ji=integral rho z² dV`다. 각 nodal tangent tensor는 `ji Pi`이고 drilling inertia는
0이다. 이는 물리 director의 회전 관성 정의이며 모든 rigid rotation의 전체 tensor를
consistent와 같게 만드는 계약은 아니다.
3. Lumping measure의 위치를 `x_i(z)=X_i+z d_i`로 보면 spatial first moment
`sum_i(mi Xi+hi di)=integral rho X dV`이므로 center of mass가 보존된다.
Node의 `Xi`에만 `mi`를 놓고 `hi di`를 누락하면 곡면에서 이 등식이 깨진다.
4. `v_i(z)=u_dot_i+z S_i theta_dot_i`에 대해 Jensen identity가 다음을 준다.
\[
\dot q^T(M_L-M_C)\dot q=
\frac12\int\rho\sum_{i,j}N_iN_j|v_i-v_j|^2dV\ \ge0. \tag{M9}
\]
두 kinetic energy의 차이는 M9의 절반이다. Equality는 positive-weight point마다 모든
`v_i`가 같을 때 성립한다. 일반 속도장 및 rigid angular motion의 orbital inertia는
달라질 수 있으며 lumped 값이 그 quadratic form에서 작아지지 않는다.
Rigid spatial rotation은 `u_i=Omega cross Xi`, `theta_i=Pi Omega`로 재현된다.
이때 M9는 nodal 위치 분산으로 생기는 angular-inertia 차이를 정확히 설명한다.
두 spectrum의 동일성, arbitrary mesh의 특정 수렴 차수 또는 Abaqus lumping 동등성을
acceptance로 요구하지 않는다. Smooth refinement에서 차이가 감소하는지는 독립 evidence다.
Proper orthogonal global rotation `Q`에 대해 `D_Q=blockdiag(Q,Q)`를 두면
`S(Qd)=Q S(d) Q^T`, `L'_i=D_Q L_i D_Q^T`이며 consistent에도 같은 congruence가
성립한다. 이는 tangent basis 선택과 독립적이다. Constraint도 같은 물리 공간으로 변환한
경우에만 spectrum의 좌표 불변성을 비교한다.
### M6. 직접 적분 가능한 평판 oracle
평행 director와 affine 직사각형 면적 `A`에서는
\[
C^{(0)}=\frac{\rho t A}{36}
\begin{bmatrix}4&2&1&2\\2&4&2&1\\1&2&4&2\\2&1&2&4\end{bmatrix},
\quad C^{(1)}=0,\quad C^{(2)}=\frac{t^2}{12}C^{(0)}. \tag{M10}
\]
각 node는 `mi=rho t A/4`, `hi=0`, `ji=rho t³ A/48`이다.
이는 production quadrature를 호출하지 않고 다항 적분으로 얻는 oracle다.
곡면에서는 M5~M9와 independent volume integration을 사용한다.
두께 `t` 변경 시 stiffness와 rotary inertia는 다른 차수로 변하므로 전체 spectrum에
하나의 thickness power law를 강제하지 않는다.
## 좌표 공변적인 drilling scale과 적용 경계
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md#formulation)
승인 근거는 [MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합),
`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및 [기존 계약 대체 범위](requirements.md#requirements--r2의-기존-계약-대체-범위)다.
[연구 R07](research.md#research-evidence--r07--r2-stabilization-근거와-영향)의 후보에서 아래 하나를 선택한다.
식 S1~S8은 FESA 계약에 대한 유도이며 외부 solver의 stabilization과 동일하다는 주장이 아니다.
### S1. 초기 physical trace로 고정하는 단일 scale
[M4](formulation.md#formulation-mass--m2-strongweak-form과-기존-stiffness)의 원형상 physical matrix를
`K20^0`라 한다. 각 source node i의 local physical 순서는 `[uX,uY,uZ,alpha,beta]`이고,
`R_i [2×2]`는 그 matrix에서 `alpha,beta`에 해당하는 principal block이다. 두 회전은
orthonormal tangent basis의 무차원 성분이다. Element별로
\[
k_{ref,e}=\frac18\sum_{i=1}^4\operatorname{tr}R_i,
\qquad k_{d,e}=\eta_d k_{ref,e},\qquad \eta_d=10^{-3},
\qquad K_d^l=k_{d,e}I_4. \tag{S1}
\]
`k_ref,k_d,R_i`의 단위는 force·length=`ML²/T²`다. Translation 대각, lumped/consistent
mass, density, constrained tangent, trial tangent 또는 reference 오차는 이 식의 입력이 아니다.
초기 physical K의 **여덟 회전 대각 전체**를 평균하며 양수인 항만 선별해 분모를 바꾸지 않는다.
기존 coefficient `10^-3`와 네 node에 같은 scalar를 쓰는 numerical 역할을 유지한다.
새 사용자 parameter·coefficient sweep·reference tuning은 없다.
Trace 평균은 모든 방향의 회전 강성을 사용하면서 eigenvalue subtraction과 positive
nodal-block 선별을 피한다. 최소 spectral 값도 불변량이지만 이번 scale에 필요하지 않은
작은 고유값 conditioning 문제를 추가한다. 이는 R07 후보의 단순성에 따른 선택이며,
LAPACK이 FESA의 평균 규칙을 제안한다는 뜻이 아니다. 작은 고유값의 상쇄 한계는
[LAPACK DLAEV2 원문, Further Details](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html)에 있다.
### S2. Positive inventory, 유효 geometry와 계산 순서
기존 승인 geometry·director·section·material 검증을 먼저 적용한다. 기존 8개 stiffness
점에서 `J_g>0,w_g>0`, `t>0,E>0,-1
### S3. 독립 재계산한 complete K와 제약의 공변성
`U_i=[a_i b_i]`, `G∈SO(3)`를 전역 좌표 회전이라 하자. 새 geometry에서 tangent를
독립 생성하면 `U_i'=G U_i O_i`, `d_i'=Gd_i`인 orthogonal `O_i`가 존재한다.
오른손 frame끼리는 `O_i∈SO(2)`다. 각 node의 physical 좌표 변환을
`A_i=diag(G,O_i^T)`, 전체 `A=blockdiag(A_i)`, global 24 DOF 변환을
`S_G=blockdiag_i(G,G)`라 두면 `q20'=A q20`, `q24'=S_G q24`다.
MITC strain은 같은 물리 tensor를 보간하고 isotropic C5의 quadratic work와 J는 회전에
불변이다. 따라서 물리 운동학으로 독립 재계산한 `K20'^0=A K20^0 A^T`이며
\[
R_i'=O_i^T R_i O_i,\quad \operatorname{tr}R_i'=\operatorname{tr}R_i,
\quad k_{d,e}'=k_{d,e},\quad
T_p'S_G=A T_p,\quad T_d'S_G=T_d. \tag{S3}
\]
이 등식을 M4에 대입하면
\[
K_{phys,e}'=S_G K_{phys,e}S_G^T,\quad
K_{drill,e}'=S_G K_{drill,e}S_G^T,\quad
K_e'=S_G K_e S_G^T. \tag{S4}
\]
`G=I`인 독립 node별 tangent basis 변경에도 같다. Element의 local strain frame이
재생성되더라도 isotropic work는 같다. Frame 생성 tie로 basis가 달라지는 것도 포함한다.
이미 계산한 old K에 S를 곱하는 검사만으로 S3를 검증할 수 없다. 새 geometry·frame에서
physical K와 S1을 다시 계산해야 한다. Translation of origin도 geometry derivatives,
K 및 M를 바꾸지 않는다. Mirror reflection·source connectivity reversal은 이 SO(3) 증명의 대상이 아니다.
전체 model의 block rotation을 `S`라 하면 stable assembly 뒤 `K'=S K S^T`, `M'=S M S^T`다.
E1의 `ell`은 회전에 불변이고 D와 S는 commute한다. 같은 물리 free space를 나타내는
`C,C'`에는 `SC=C'W`인 orthogonal W가 있어
\[
K_f'=W K_f W^T,\quad M_f'=W M_f W^T,
\quad y_f'=W y_f,\quad\lambda'=\lambda. \tag{S5}
\]
이는 supported partial rotation BC에도 적용된다. 비교 대상 양쪽의 같은 물리 subspace가
현재 component BC로 표현되어야 한다. 임의 회전 뒤 BC component를 그대로 유지하여 다른
문제를 비교하거나 새 MPC 기능을 요구하지 않는다. NR-MFE-001의 global Z축 회전은 그
URZ free space를 유지하므로 필수 사례다. Complete K 안의 partial-BC stabilization을
삭제하거나 acceptance를 full-free/full-clamp로 한정하지 않는다.
Static load도 `F'=SF`, prescribed displacement도 같은 물리량으로 변환하면 기존
partition/effective RHS의 해와 full residual/reaction이 함께 변환한다. Unique free 해의
경우 `q'=Sq`, `r'=Sr`, physical strain energy는 불변이다. S5는 eigen 근사식이 아니라
개선된 실제 constrained K/M의 congruence다.
### S4. Linear rigid modes와 massless drilling의 다른 의미
Linear/eigen 물리 rigid field는 `u_i=c+Omega×X_i`,
`theta_i=(I-d_i d_i^T)Omega`다. M2에 넣으면 입자 변위는 `c+Omega×X`이고
물리 strain 및 `T_d q`가 모두 0이다. 따라서 S1의 양수 값과 관계없이 `K_e q=0`이다.
비퇴화 shell의 여섯 물리 rigid motions는 positive lumped mass를 가진다. 기존 physical
non-rigid positivity와 함께 complete free element의 nullity가 여섯이라는 검증을 유지한다.
반면 한 node의 pure numerical drill `z_i=[0;d_i]`는 `T_p z_i=0`, `M z_i=0`이고
numerical stiffness만 양수다. Physical recovery에는 strain/stress/resultant를 만들지 않는다.
Full spatial Omega를 linear UR에 넣어 numerical drill까지 가진 field는 위 five-DOF
rigid 대표값과 다르다. 이 구분은 기존 물리 계약이며 새 eigen rigid acceptance의 축소가 아니다.
S1에서 모든 element의 `k_d,e>0`이고 nodal director가 incident element 사이에 공통이므로
[E3/E4](formulation.md#formulation-eigen--e3-개선된-stiffness에서-decoupling의-정확한-증명)의
`K_f Z=Z diag(sum_e k_d,e)`, `Kzz≻0`, `Kpz=0`가 그대로 성립한다. E2의 실제
global BC와 null의 교집합을 먼저 구한다. Finite mode의 null coefficient는 0이며
positive 공간으로의 투영은 개선된 원 pencil의 모든 finite spectrum을 보존한다.
Null이 없는 partial BC에는 개선된 drilling term이 finite 공간에 남는다. 이 항을 제거하거나
옛 spectrum과 같게 조정하지 않는다. Consistent→lumped의 spectrum equality는 별개로 요구하지 않는다.
### S5. Nonlinear objective potential와 초기 고정 lifecycle
기존 [nonlinear §10.1~10.4](../nonlinear-static-newton-raphson/formulation.md#10-objective-numerical-drilling-contract)의
polar element corotation `R_e`, total nodal rotation `R_i`, minimal swing `S_ei` 및
`gamma_i=atan2(s_gamma,i,c_gamma,i)`를 그대로 사용한다. 초기 reference physical K20만으로
S1을 한 번 계산하고 모든 trial/commit/increment/iteration 및 rollback 동안 같은 scalar를 쓴다.
State-dependent scale·trial 재선정·기존 objective gamma의 교체는 승인 범위 밖이다.
\[
Dk_{d,e}=D^2k_{d,e}=0,\quad
\Pi_d^e=\tfrac12 k_{d,e}\gamma^T\gamma,\quad
r_d^e=k_{d,e}D_\gamma^T\gamma,
\]
\[
K_d^e=k_{d,e}\left(D_\gamma^TD_\gamma+
\sum_i\gamma_i H_i^\gamma\right),\qquad
D_\gamma=D\gamma,\quad H_i^\gamma=D^2\gamma_i. \tag{S6}
\]
모든 polar/swing/rotation/atan2 미분과 branch validation은 기존 계약을 유지한다.
Positive k_d는 potential 비음성과 pure-drill 양의 작용을 뜻한다. 일반 nonlinear Hessian은
`sum gamma_i H_i` 때문에 모든 상태에서 SPD라는 결론이 없다. 초기 `gamma=0`에서도
`D_gamma`에는 corotation coupling이 있으므로 이를 linear `T_d`와 동일시하지 않는다.
기존 pure-drill directional quadratic form과 physical 선형극한·Newton tangent consistency를
각자의 계약대로 재검증하며 complete nonlinear Hessian의 모든 entry가 linear M4와 같다고 요구하지 않는다.
같은 물리 nonlinear 상태를 G로 표현하면 모든 rotation tensor와 initial director가
conjugation/rotation되고 scalar gamma는 같다. Initial S1도 같으므로 potential은 불변이다.
Work-conjugate Cartesian perturbation에 대해 chain rule로 residual과 tangent의 공변성이 따른다.
Superposed finite rigid motion에서는 기존 `R_e^+=R R_e`, `R_i^+=R R_i`에 의해 gamma가
같고, stress-free rigid state에는 gamma=0·physical strain=0이다. 따라서 finite rigid motion의
영에너지 및 objective rigid orbit를 따른 변분 검증을 유지한다. S4의 linear tangent-projected
UR field를 nonlinear total triad 회전에 대신 넣지 않는다.
현재 [nonlinear 생성 경로](../../src/fesa/elements/nonlinear_mitc4_shell.cpp)의
`NonlinearMitc4Shell::Create`는 초기 linear `Stiffness()`의 `drilling_stiffness`를 받아 저장한다.
이 경계에서 S1의 같은 값을 사용해야 한다. 물리 strain/material, exact external moment work,
Newton/line-search/cutback, accepted state 및 physical output은 기존 계약이다.
S4/E3 projection은 이 nonlinear Hessian·preload·prestressed eigen으로 확장하지 않는다.
### S6. NR-MFE-001의 새 algebraic target과 정적 대응
[NR 소유 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례)의 독립 적분 block을
입력 근거로 사용한다. 그 geometry·source BC·material 및 옛 실패 이력은 보존한다.
각 corner에서 `R_aa=49/12`, `R_bb=23/6`, `R_ab=±1/8`이므로
\[
k_{ref}=95/24,\quad k_d=19/4800,\quad
M_{ff}=3/50,\quad K_{ff}=10369/7500,\quad
\lambda=10369/450=23.042222\ldots . \tag{S7}
\]
Global Z축 45° 회전 뒤 재생성한 tangent basis에서도 trace는 `95/12`이므로 같은 식이다.
이는 production/FEAST 실행 결과가 아닌 r2 formula의 exact target이다. 독립 재계산과
runtime에서 반례가 해소되는지는 NR/Implementation이 각각 검증한다.
정적 대응에는 node1에 `m=(5/3)M0 b`, 다른 load는 0을 사용한다. 여기서
`b=(-4/5,0,3/5)`와 `M0`는 finite 비영 moment amplitude `[force·length]`다.
`d·m=0`, `mZ=M0`이므로 기존 physical moment admissibility를 지킨다. 단순 `m=M0 eZ`는
drilling 성분을 가져 기존 load 계약을 위반하므로 사용하지 않는다. 같은 모든 DOF 고정,
node1 URZ만 free에서
\[
\theta_{1Z}=\frac{M0}{K_{ff}},\quad
q_{constrained}=0,\quad r=Kq-F. \tag{S8}
\]
회전된 input에서는 `m'=Gm`을 component load로 주고, `mZ'=M0`와 같은 BC를 유지한다.
Supported component BC/load만으로 `thetaZ`, complete response·full reaction의 공변성을
검증할 수 있다. Physical recovery와 numerical contribution의 의미는 합치지 않는다.
### S7. 대체·보존 범위와 필수 verification
기존 linear `FESA-REQ-LSMITC4-034`, `056`의 최소 positive diagonal 선정·그 공식 검증만
S1/S2로 대체한다. 기존 `036`의 invalid positive inventory 의미는 S2로 유지한다.
Nonlinear §10.3은 초기 scale 식만 대체하고 §10.1/10.2/10.4 및 frozen lifecycle은 유지한다.
기존 feature 문서·과거 실패 evidence를 소급 수정하지 않는다.
필수 수학 검증은 S1 직접 평균/단위/zero inventory·잘못된 finite/sign 처리,
독립 node별 tangent 재생성과 global geometry 회전의 S3/S4, S7/S8의 supported partial BC,
physical six rigid modes와 pure drilling rank/separation, E3의 KZ/MZ/Kpz/Kzz 및 원 free
residual이다. Nonlinear은 같은 초기 scale·immutability, objective rigid motion,
exact first/second directional derivatives·물리 선형극한·정적 평형/reaction/energy·rollback을
기존 계약으로 재검증한다. Density 없는 기존 static 모델도 계속 유효하다.
실행해야 하는 기존 `shell`, `shellNL`, `shellNL-meshfine` 및 linear-limit closure portfolio와
후속 meshfine-02 이력의 구분, source identity, U blocking/UR warning-only, reaction review-only는
[requirements evidence의 단일 portfolio](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)를 따른다.
새 eigen 외부 비교는 지정 input/TXT의 10개 Value만 사용한다. Static reference를 eigen
mode-shape gate로 추가하거나 기존 static 회귀를 Value-only를 이유로 삭제하지 않는다.
Numerical threshold·필수 case 구체화·FEAST control/budget/seed와 독립 반례 해소 판정은 NR,
TDD/runtime/reference 실행은 Implementation, 독립 물리 판단은 Physics 소유다.
## 제약 후 질량 공간, 유한 spectrum과 FEAST
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md#formulation)
[질량 유도 M1~M10](formulation.md#formulation-mass), [research evidence](research.md#research-evidence)의
`S03`~`S08`, `P01`, `R03/R04/R07`를 적용한다. 아래 reduction은
[r2 scale](formulation.md#formulation-stabilization)로 개선된 원형상 stabilized stiffness와
**derived lumped mass**의 pencil에 정확히 대응한다. 기존 nonlinear trial tangent와는 별개다.
### E1. 조립, 단위 scaling과 실제 global 제약
Element gather `A_e`를 stable source node/component 순서로 정의하면
`K=sum A_e^T K_e A_e`, `M=sum A_e^T M_L,e A_e`이다. 이하 `M`은 항상 lumped이다.
Element contribution→stable COO key→고정 순서 reduction으로 두 행렬을 조립한다.
Lumped nodal block이므로 `M`의 node 간 block은 0이다. Worker는 global storage를
동시에 갱신하지 않는다. Source identity와 equation index는 다른 번호다.
혼합 단위를 가진 6 DOF를 그대로 Euclidean norm으로 합하지 않는다.
활성 shell의 기존 최대 edge 길이들 중 최대값 `ell>0 [L]`을 characteristic length로
선택하고 `D=blockdiag(ell I3,I3)`를 node마다 둔다. `q=D y`에서 `y`는 무차원,
`Khat=D^T K D [ML²/T²]`, `Mhat=D^T M D [ML²]`이다.
이는 congruence이며 physics와 lambda를 변경하지 않는다.
원 global homogeneous BC의 free injection을 `C`라 한다. 고정 DOF의 행은 0,
free DOF의 행은 하나의 1이며 free 순서는 DofManager의 stable 순서다.
\[
y=C y_f,\qquad K_f=C^TKhat C,\qquad M_f=C^TMhat C. \tag{E1}
\]
Nonzero prescribed base state는 이 procedure의 입력 오류다. 먼저 local 회전을 임의
삭제한 뒤 global BC를 적용하지 않는다. 특히 global `UR3`와 drilling은 같지 않다.
### E2. Null/positive basis를 node마다 결정
각 active node의 원 질량 null은 M8로부터 `z_i=[0;d_i]` 한 방향이다.
따라서 node별 실제 free 좌표에서 null이 존재하는 필요충분조건은
**constrained rotational component마다 해당 `d_i` 성분이 정확히 0**인 것이다.
그때 `Z_i=C_i^T z_i`는 unit null vector이며 otherwise null dimension은 0이다.
Translation constraint는 이 판정에 영향을 주지 않는다. 모든 회전이 고정이면 null도 없다.
이 판정은 analytic nullspace와 실제 입력 BC의 교집합이다. 작은 nonzero constrained
director 성분을 임계값으로 0으로 바꾸지 않는다. 거의 정렬된 경우 작은 양의 physical
mass가 남을 수 있으며 이를 보존한다. Numerical conditioning 검증을 통과하지 못하면
명시적 실패로 처리하고 free DOF를 추가 삭제하지 않는다.
각 node에서 `Z_i`의 Euclidean 직교 여공간 basis를 `P_i^f`라 한다.
회전 3개가 free이면 기존 tangent basis `(a_i,b_i)`를 사용할 수 있다. Free 회전 2개
안에 null이 있으면 그 평면에서 `d_i`에 수직인 단위벡터 하나, 회전 1개가 null이면
positive 회전 basis는 없다. Free translation axis는 그대로 유지한다.
Null이 없으면 `P_i^f=I`다. Source component 순서, basis sign/tie는 고정한다.
Householder 등 동등한 작은 orthogonal construction을 쓸 수 있으나 physical rank를
수치 eigenvalue cutoff로 정하지 않는다.
\[
P=\operatorname{blockdiag}(P_i^f),\quad Z=\operatorname{blockdiag}(Z_i),\quad
[P\ Z]^T[P\ Z]=I,\quad M_p=P^TM_fP\succ0,\quad M_fZ=0. \tag{E2}
\]
여기서 `P_i^f`와 [M2의 tangent projector](formulation.md#formulation-mass)는 서로 다른 기호다.
실제 positive dimension `n=cols(P)`, null dimension `nz=cols(Z)`이다.
Reference의 full clamped flat mesh에서는 625개 interior node,
`nf=3750`, `nz=625`, `n=3125`가 예상된다. 실제 assembly와 rank evidence로 확인한다.
### E3. 개선된 stiffness에서 decoupling의 정확한 증명
공통 node director는 [shell geometry](../../src/fesa/model/shell_geometry.cpp)가 한 번
정의하고 [ElementFactory::CreateShell](../../src/fesa/elements/element_factory.cpp)이
node identity로 각 element에 전달한다. [MITC4 kernel](../../src/fesa/elements/mitc4_shell.cpp)의
`PhysicalTransformation20`, `DrillingTransformation4`, `Stiffness`에서 M4의 구조를 확인했다.
옛 계수만 [S1/S2](formulation.md#formulation-stabilization)로 대체하며 모든 incident element의
`k_d,e`는 finite positive다. Physical kernel과 공통 director·nodal drill map은 그대로다.
한 node에만 `[0;d_i]`가 있는 full vector `z_i`에 대해 `T_p A_e z_i=0`이다.
Drilling 부분은 해당 node에만 작용하므로
\[
Khat z_i=\kappa_i z_i,\qquad
\kappa_i=\sum_{e\ni i}k_{d,e}>0,\qquad
K_f Z=Z\operatorname{diag}(\kappa_i). \tag{E3}
\]
마지막 등식은 E2에서 `z_i`가 **실제로 free space에 있을 때** 성립한다.
따라서
\[
K_{pz}=P^TK_fZ=0,\quad K_{zz}=Z^TK_fZ=\operatorname{diag}(\kappa_i)\succ0,
\quad K_p=P^TK_fP,\qquad K_p p=\lambda M_p p. \tag{E4}
\]
Finite mode의 massless 성분은 `z=0`이다. 이 projection은 arbitrary small coupling을
버리는 근사가 아니라 승인된 physical/drilling separation의 항등식이다.
Null이 없는 부분 제약 node에서는 `P=I`이고 개선된 drilling contribution이 `K_p`에
그대로 남는다. 이를 빼면 원 constrained stabilized pencil을 바꾸므로 금지한다.
여기서 원 pencil은 r2의 실제 BC 적용 후 K/M이다. 옛 K와 새 K의 spectrum 동일성은
요구하지 않는다. S3의 complete K 공변성은 이 partial-BC contribution까지 포함한다.
실제 floating-point matrix와 basis의 `M_f Z`, `K_fZ-Z diag(kappa)`, `P^T Z`를
별도 evidence로 남긴다. 증명된 analytic null만 구조적으로 제거하고 계산된 tiny coupling을
근거 없이 threshold로 버리지 않는다. 이 항등식의 roundoff 검증 및 복원 후 full free
residual이 NR 기준을 넘으면 assembly/director/conditioning 실패로 중단한다.
추가 massless mode를 찾아 제거하거나 개선된 K를 재조정하지 않는다.
S5의 nonlinear Hessian에는 corotation coupling이 있으므로 E3/E4를 모든 nonlinear
상태, preload 또는 prestressed eigenproblem에 적용하지 않는다.
### E4. 일반 Schur 식과 비정상 rank의 의미
E3의 구조가 없는 일반 symmetric pencil을 비교하면, `Kzz`가 가역일 때만
\[
z=-K_{zz}^{-1}K_{zp}p,\quad
(K_{pp}-K_{pz}K_{zz}^{-1}K_{zp})p=\lambda M_p p. \tag{E5}
\]
이는 massless row를 푼 정확한 elimination이며 massive DOF의 근사 Guyan reduction이
아니다. 예를 들어 `K=[[6,2],[2,4]]`, `M=diag(2,0)`이면
`lambda=5/2`, `z=-p/2`이다. 첫 행만 남기는 `lambda=3`은 잘못이다.
E5는 independent small-pencil 검산과 잘못된 projection을 잡는 기준이다.
이 Feature의 production shell 경로에는 E3이 적용되므로 일반 dense Schur 구현을 요구하지
않는다. E3과 불일치하는 input을 E5로 자동 fallback하여 승인 geometry 문제를 숨기지 않는다.
- `nz=0`: null 처리 없이 실제 constrained `Kf,Mf`의 문제다.
- Local positive rank 0: 모든 free DOF가 null이면 해당 node의 finite 좌표는 없고
양의 `Kzz`에 의해 그 free coordinate는 0으로 복원한다. Fully constrained node도
finite 좌표 0개다. 다른 node의 유효 finite 좌표는 계속 보존한다.
- Global `n=0` 또는 `N>n`: 요청 모드가 존재할 수 없으므로 명시적 model/solve 실패다.
정적 해석의 유효 `0×0 Kff` 계약과 이 양의 mode-count 요구를 혼동하지 않는다.
- 예상 `Kzz`가 singular/nonpositive이거나 활성 node에 mass contribution이 없음:
유효 shell의 E3 전제가 깨진 것이다. Common `K/M` null이면 임의 lambda에 대한
indeterminate direction이며 ordinary finite eigenmode가 아니다. 제거하거나 pseudoinverse,
stiffness/mass epsilon으로 정규화하지 않고 진단한다.
- 일반 indefinite `Kzz`의 singular/nonzero `Kpz` case는 descriptor-pencil의 추가
constraint를 요구한다. 이번 positive stabilized shell과 다른 문제이며 자동 해석하지 않는다.
### E5. SPD whitening, 복원과 sparsity
`M_p`는 node별 최대 `6×6` SPD block이다. 각 block을 Cholesky하여
`M_p=L L^T`를 얻고 다음을 정의한다.
\[
A=L^{-1}K_pL^{-T},\quad p=L^{-T}x,\quad
A x=\lambda I x,\quad
\phi=D C P L^{-T}x. \tag{E6}
\]
Inverse를 dense global matrix로 만들지 않고 작은 block triangular solve로 congruence를
구성한다. `phi`는 source node의 global 6 DOF로 복원되고 constrained entries는 정확히 0이다.
`phi^T M phi=x^T x`다. Identity mass를 전달하는 E6도 실제 lumped mass에서 얻은
generalized SPD 문제다. Consistent mass 또는 인공 unit physical mass로 바꾼 것이 아니다.
Projection/whitening은 node 간 topology를 늘리지 않는다. 기존 node coupling마다 작은
dense block만 생기며 전체 `O(n²)` Schur matrix와 dense inverse를 피한다.
Sparse shifted FEAST factorization 자체의 fill은 별도 존재한다. Full `M_C`는 element별
`24×24`와 세 `4×4` moment로 검증할 수 있고 global dense consistent matrix는 불필요하다.
Allocation/nnz/factorization memory 실패는 불완전 모드의 성공이 아니라 명시적 failure다.
### E6. 유한 search interval과 요청 개수
요청 `N`은 `.inp *FREQUENCY`의 양의 정수이며 현재 reference는 10이다.
Reference Value/Freq/행수는 interval, scale, count 또는 parameter 선정에 사용하지 않는다.
먼저 `s=||A||inf [T^-2]`를 안정된 합으로 계산한다. `s>0`이면 `B=A/s`로 두고,
반환값은 `lambda=s mu`다. `A=0`이면 `s=min_e E_e/(rho_e ell²)>0`라는
모델 유래 time scale을 사용하며 `B=0`이다. 이 zero-matrix case도 N개의 0 모드를
FEAST에서 계산·검증한다. Invalid/underflow/overflow scale을 임의 1로 바꾸지 않는다.
각 행의 off-diagonal absolute sum을 `r_i`라 하면 Gershgorin에 의해
`min_i(Bii-ri)<=mu<=max_i(Bii+ri)`다. 안정된 directed-outward accumulation 또는
동등하게 증명된 roundoff bound를 포함하여 finite enclosure `[gL,gU]`를 만든다.
`B=0`에서는 알고리즘용 dimensionless enclosure `[-1,1]`을 사용한다.
Nonzero B의 endpoint margin은 NR가 정할 dimensionless coefficient와 `||B||inf` 및
endpoint ULP로 결정하고, outward `nextafter`를 적용해 `a0=N`인 마지막 safe upper를 쓴다.
Representable midpoint가 없거나 NR endpoint separation 폭에 도달하면 subdivision을
끝낸다. 경계에 있는 반복 고유치의 일부만 count하도록 tolerance를 조정하지 않는다.
3. 불필요하게 먼 lower bound를 줄이기 위해 `a=a0`, 위에서 얻은 `b=hi`로 시작한다.
`v=(a+b)/2`의 prefix count가 0이면 `a=v`로 이동하고, 양수이면 이 하한 축소를 끝낸다.
따라서 `(a0,a)`의 empty-prefix evidence를 잃지 않는다. 아주 작은 고립 cluster에서
넓은 구간이 검색 실패를 유발하는 Intel의 경고를 이 과정과 후검증으로 다룬다.
4. 최종 `(a,b)`에서 다시 count하여 `c>=N`이고 알려진 prefix와 일치함을 확인한다.
Capacity는 `m0=min(n,max(c+8,ceil(3c/2)))`로 한다. `c=n`이면 `m0=n`이다.
Checked integer arithmetic을 쓰며 큰 multiplicity도 전체 count를 수용한다.
5. Solve 성공 후 모든 `c`개를 독립 검증하고 정렬하여 첫 N개를 결과 candidate에 넣는다.
같은 eigenvalue의 multiplicity를 지우거나 평균내지 않는다. N번째가 repeated/cluster의
내부에 있으면 내부 계산 group은 보존하고 출력 row는 정확히 N개다.
Midpoint·endpoint 이동은 overflow-safe하게 수행한다. NR는 count-call budget,
endpoint separation coefficient와 perturbation 횟수를 구현 전에 고정한다. Budget은
각 search 및 endpoint 재시도까지 포함하는 유한 정수다. `-5` 등의 endpoint 실패 시
기록된 bracket 안에서 NR가 정한 간격으로 양옆의 endpoint 후보를 순서대로 평가하며,
성공한 prefix/count evidence 없이는 bracket을 갱신하지 않는다. 마지막 valid bracket이
없거나 count monotonicity/total count가 맞지 않으면 실패다. Search 최적화 budget에
도달하면 이미 검증된 enclosing bracket을 쓸 수 있으나 실패한 count를 성공으로 바꾸지 않는다.
Postsolve에서는 returned `m=c`, finite paired vectors/values, Gram rank, interval 내부
및 endpoints와의 separation을 확인한다. Endpoint에 너무 가깝거나 `info=1/2/3`,
count/solve mismatch이면 NR가 정한 유한 회수 안에서 safe bracket 확대·재count·capacity
확대만 허용한다. 매번 count/solve history를 보존한다. 그 뒤에도 불일치하면 실패하고
부분 모드 또는 다른 eigensolver로 fallback하지 않는다. Formulation은 이 수학적 알고리즘을
NR에 인계한다. 구현 진입 bundle은 다음 stage가 수치값·budget을 고정한 뒤 완성된다.
Full enclosing bound, empty-prefix, interval count와 solve-count/Gram 검증은 낮은 N개의
누락을 탐지하는 서로 다른 evidence다. Intel의 documented total count를 모든 conditioning,
endpoint 및 floating-point 상황의 completeness theorem으로 확대하지 않는다.
독립 known-spectrum의 zero/negative/cluster/repeated/size1/request=n case와 실제
설치 runtime 검증이 필수 연결점이며 선택 및 수치 기준은 NR가 소유한다.
### E7. FEAST 경계와 deterministic 실행
Actual eigenpairs는 `dfeast_scsrgv`로 E6의 `(A,I)` 또는 E6에서 동일하게 scale한
`(B,I)`를 풀어 구한다. Real symmetric, SPD second matrix, `n>0`,
`0
### E8. Mode identity, normalization과 상태
모든 returned eigenpair를 lambda 오름차순으로 함께 정렬한다. Equal lambda의 tie는
original solver column order로 안정 정렬한다. Near-equal 값을 평균하거나 merge하지 않는다.
양의 modal mass로 column별 normalize하고, 가장 큰 absolute scaled global component의
sign이 양수가 되도록 한다(source DOF 순서로 tie 결정). 서로 다른 eigenvalues의 벡터를
Gram 보정 목적으로 임의 혼합하지 않는다. Failed orthogonality는 solve/validation 실패다.
정확한 repeated eigenspace의 다른 orthonormal basis는 같은 해이고 mode-shape external
matching은 없다. Density scaling/좌표 테스트는 repeated group의 projector로 비교한다.
Normalized `phi^T M phi=1`의 수치 convention에서 `phi_u`의 차원은 `M^-1/2`,
`phi_theta`는 `M^-1/2 L^-1`이고 modal amplitude가 `M^1/2 L`를 가진다.
Mode vector는 실제 응답 변위가 아니다. Scalar `lambda [T^-2]`와 source step/mode
identity를 분리하고 internal node/equation number를 source label로 노출하지 않는다.
원형상·density 검증→consistent/moment 검증→lumped 검증→K/M 조립→실제 BC→E2~E6
admissibility→E6~E7 FEAST→global 복원/독립 검증→candidate 결과 순서다.
반환 lambda는 부호를 보존한다. NR 기준상 유의한 음수는 불안정/invalid spectrum 실패,
near-zero는 분류와 raw value를 함께 유지하며 0으로 clamp하지 않는다.
양수에서만 `f=sqrt(lambda)/(2pi)`를 파생한다. 정확한 0은 f=0이고 작은 음수에는
실수 frequency를 만들지 않는다. 이 validity의 저장 방식은 I/O owner가 정한다.
N개 검증이 끝나기 전에 accepted state를 바꾸지 않는다. 검증된 candidate HDF5를
완성·검증·close한 뒤 final replacement를 수행하고 성공 뒤 준비된 state를 교환한다.
Replacement 이후 state 교환은 실패하지 않도록 준비한다. 제어된 solve/validation/write/
finalization failure에서 이전 accepted state와 기존 final HDF5를 보존한다.
Crash/power loss까지 원자성을 새로 주장하지 않는다. Live log lifecycle은 별도다.
Modal residual의 constrained 성분을 static reaction으로 출력하지 않는다.
## 질량과 modal candidate의 검증식 및 Numerical Review 인계
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [formulation.md](formulation.md#formulation)
[질량 식 M1~M10](formulation.md#formulation-mass), [축소·복원 식 E1~E8](formulation.md#formulation-eigen),
[개선된 scale·공변성 S1~S8](formulation.md#formulation-stabilization)의
기호를 사용한다. 이 문서는 측정량과 zero branch를 정의하며 수치 acceptance 값과
필수 benchmark 선정은 Numerical Review가 독립 검토하여 고정한다.
외부 기준의 수치는 [TOLERANCE](../TOLERANCE.md)를 그대로 적용한다.
### V1. 공통 scale과 zero branch
행렬·벡터 norm을 계산하기 전에 E1의 길이 congruence를 적용한다. 질량은 모두
`ML²`, stiffness는 `ML²/T²` 단위가 된 행렬에서 norm을 계산한다. Element-only
oracle에서는 `ell=Le`를 사용하고 assembled 비교에는 동일 global `ell`을 사용한다.
Norm과 sum-of-squares는 overflow/underflow를 피하는 scaled accumulation을 사용한다.
입력/행렬/각 eigenpair가 finite인지 먼저 검사한다.
이 문서의 모든 ratio `a/b`는 `b>0`에서만 계산한다. `a=b=0`이면 해당 항등식의
zero-case metric은 0이다. `b=0,a!=0`이면 named zero-scale failure이며 무한값/NaN
metric으로 성공 결과를 만들지 않는다. `max(1,b)`, arbitrary floor 또는 zero clamp는 없다.
대칭성은 `eta_sym(Q)=||Q-Q^T||F/||Q||F`이다. Diagonal copy로 생성한 symmetry와
독립 quadratic-work 검증은 구분한다. Cross-basis equality `R=S`는
`||R-S||F/(||R||F+||S||F)`로 측정한다. Mass/stiffness를 같은 norm의 분모에 직접 더하지
않고 필요한 lambda나 시간 scale을 곱한다.
### V2. 질량, rank와 보존 검증
- M10의 entrywise scalar oracle와 `M_C` quadratic form을 독립 적분과 비교한다.
계수·부호/두께 차수가 같은지를 component별 확인한 뒤 전체 norm을 사용한다.
- M5에서 구성한 `M_C`와 원본 moment, M6의 row-sum 결과, M7의 independent direct
integration을 따로 비교한다. 변조한 C(1)/C(2)가 lumped 결과 및 검증에 반영되는지
확인하여 두 mass 계산이 끊긴 우회 경로를 잡는다.
- Mass original과 derived 모두 `d_i` 방향의 null action을 검사한다.
Element/global scaled matrix에서 `eta_null=||Mhat z||2/(||Mhat||F ||z||2)`를 쓴다.
Lumped는 M8의 양의 두 항 및 physical positive-space Cholesky로 rank5를 검증한다.
Consistent physical 20-coordinate matrix도 positive여야 한다. 잘못된 quadrature에
의한 추가 hourglass/null mass를 허용하지 않는다.
- `mi>0`, `ji>0`, `zi=hi/mi`, `vi=ji/mi-zi²>0`를 검사한다.
`vi/ell²`, `|hi|/sqrt(mi ji)`는 dimensionless conditioning evidence다.
양의 `vi`를 낮은 rank로 바꾸는 기준을 두지 않는다. Direct centered integral
`integral rho Ni (z-zi)² dV`와 `ji-hi²/mi`의 일치는 cancellation을 드러낸다.
- Scaled node positive mass의 Cholesky reconstruction error와 reciprocal condition
estimate를 기록한다. 후자는 작은 block inverse action의 norm으로 계산할 수 있다.
물리 positive/null rank는 E2로 정하고 ill-conditioning은 별도 실패다.
- 총 질량은 uniform translation의 `q^TMq/|u|²`, geometry 적분의 `m=sum mi`를
비교한다. Spatial centroid는 M5의 scalar moment로 얻은
`sum(mi Xi+hi di)`와 독립 `integral rho X dV`를 비교한다.
좌표 원점으로 인한 cancellation을 피하려면 한 source node `Xref`를 공통 원점으로
잡고 first moment 차이를 `m ell`로 나눈다.
- M9의 `Delta=q_dot^T(M_L-M_C)q_dot`와 nonnegative pairwise integral을 독립 비교한다.
Scale은 `q_dot^T M_L q_dot + q_dot^T M_C q_dot`이며 zero motion/null-only field는
별도 zero branch다. Arbitrary velocity에서 equality를 요구하지 않는다.
### V3. Reduction과 full modal residual
`y_f=C^T D^-1 phi`, `k=||Kf||F`, `m=||Mf||F`라 두면
\[
r_f=K_f y_f-\lambda M_f y_f,\qquad
\eta_r=\frac{\|r_f\|_2}{(k+|\lambda|m)\|y_f\|_2}. \tag{V1}
\]
이것이 **모든 원 free DOF**의 inertia/elastic force balance다. 물리 공간에
project한 residual만으로 drilling/null 복원 오류를 놓치지 않는다.
`Kf y_f` 및 `Mf y_f`를 solve에 사용한 축소 matrix를 재사용하지 않고 원 조립값에서
검산한다. `Mf`는 actual lumped이며 consistent로 바꾸면 잘못된 metric이다.
`lambda=0`에서도 `k>0`이면 유효한 denominator가 있다. `Kf=0,lambda=0`은 zero branch,
zero eigenvector는 normalization 이전부터 실패다.
Whitened solve의 추가 metric은 `eta_w=||A x-lambda x||2 /
((||A||F+|lambda|)||x||2)`다. Backend `res/epsout`, eta_w, eta_r은 서로 다른 evidence다.
E3의 identity도 다음으로 검산한다.
\[
\eta_{KZ}=\frac{\|K_fZ-Z\operatorname{diag}(\kappa)\|_F}
{\|K_f\|_F\|Z\|_F+\|Z\operatorname{diag}(\kappa)\|_F},\quad
\eta_{MZ}=\frac{\|M_fZ\|_F}{\|M_f\|_F\|Z\|_F},\quad
\eta_{PZ}=\|P^TZ\|_F. \tag{V2}
\]
`nz=0`이면 V2는 적용 대상 없음으로 기록한다. M8/E3의 analytic proof가 먼저이고
V2 threshold만으로 새로운 nullspace를 발견하거나 coupling을 생략하지 않는다.
Kzz positivity와 `n/nz/nf`를 source node별 예상 null 여부와 연결한다.
Constraint metric은 `||(I-CC^T)D^-1 phi||2/||D^-1 phi||2`이며 source에 복원한
constrained components 자체도 exact zero를 확인한다.
### V4. Mass normalization, Gram, energy와 Rayleigh
각 mode의 generalized mass `g_i=phi_i^T M phi_i=y_i^T Mf y_i`는 finite, strictly
positive여야 한다. `phi_i <- phi_i/sqrt(g_i)`로 normalization한 뒤 재계산한다.
계산된 전체 c개 column에 대해
\[
G_{ij}=\phi_i^T M\phi_j,\quad
\eta_{norm,i}=|G_{ii}-1|,\quad
\eta_{orth,ij}=\frac{|G_{ij}|}{\sqrt{G_{ii}G_{jj}}}\ (i\ne j),\quad
\eta_G=\frac{\|G-I\|_F}{\sqrt c}. \tag{V3}
\]
Column pairing과 linear independence를 확인하며 FEAST의 c와 N을 구분한다.
부족한 rank를 같은 vector 복사로 채우면 V3에서 실패한다.
\[
h_i=y_i^TK_fy_i,\quad R_i=h_i/g_i,\qquad
\eta_{energy,i}=\frac{|h_i-\lambda_i g_i|}
{(k+|\lambda_i|m)\|y_i\|_2^2}. \tag{V4}
\]
`R_i [T^-2]`는 Rayleigh quotient다. V4는 eigenvalue가 0인 경우에도 쓸 수 있고
`|R_i-lambda_i|/|lambda_i|`만을 강제하지 않는다. 단위 modal amplitude에서 elastic
energy는 `h_i/2`, peak kinetic energy는 `lambda_i g_i/2`다. Physical/drilling 분해가
필요한 내부 검산에서는 `h_phys+h_drill=h_i`를 확인하되 별도의 drilling-energy
acceptance나 output quantity를 추가하지 않는다.
### V5. Rigid mode, coordinate 및 density 불변식
Free valid shell/patch의 rigid fields는 `u_i=c+Omega cross Xi`,
`theta_i=(I-di di^T)Omega`이다. 그 span에는 세 병진과 세 회전이 있다.
각 vector의 scaled K action을 `||Khat y||2/(||Khat||F ||y||2)`로 검증하고
mass Gram rank로 여섯 물리 움직임의 independence를 확인한다.
`Omega`의 full normal 성분을 UR에 넣어 drilling energy를 자극한 field는 이 테스트가 아니다.
Physical rigid zero eigenvalues는 finite mass 모드이고 E2의 massless drilling과 다르다.
Clamped reference에 여섯 zero mode를 요구하지 않는다.
Global rigid coordinate rotation과 독립 node별 tangent 재생성에서 두 질량,
physical/numerical contribution 및 **complete stiffness**의 congruence와 E1~E6 spectrum
불변성을 검사한다. S1의 scale을 새 geometry/frame에서 다시 계산하여 S3/S4를 검증한다.
고정된 tensor에 회전행렬만 곱하는 검사로 대체하지 않는다. Norm은 V1의 same-unit
congruence ratio, scalar scale은 `|kd'-kd|/(|kd'|+|kd|)`다. Spectrum은 같은 operator
time scale `s`로 `|lambda_i'-lambda_i|/s`를 측정하며 repeated 그룹은 아래 projector를 쓴다.
같은 물리 BC가 양쪽에서 지원되는 **partial rotation BC**를 포함하고,
[S6](formulation.md#formulation-stabilization--s6-nr-mfe-001의-새-algebraic-target과-정적-대응)의
NR-MFE-001 geometry/45° 회전 및 대응 정적 response/reaction을 필수 통과 사례로 둔다.
Full-free/full-clamp만으로 대체하거나 반례를 warning-only로 내리지 않는다.
Partial BC에 남는 개선된 stabilization도 포함하며 기존 K와 새 K의 값이 같을 필요는 없다.
Rotation 후 다른 물리 component BC를 같은 문제로 비교하거나 새 MPC 입력을 추가하지 않는다.
Nonlinear rigid motion은 기존 total triad의 finite rotation과 objective gamma를 사용한다.
S5의 potential/residual/Hessian을 검증하며 위 linear tangent-projected UR field 및
massless projection을 nonlinear 상태에 적용하지 않는다. 개선 전 scale 공식만을 기대한
기존 검사는 S1로 갱신하고 나머지 rigid/patch/physical positivity acceptance는 보존한다.
모든 density를 동일 `c_rho>0`로 바꾸고 geometry/material stiffness/BC를 유지하면
\[
M_C'=c_\rho M_C,\quad M_L'=c_\rho M_L,\quad
\lambda_i'=\lambda_i/c_\rho,\quad
\Phi'=\Phi Q/\sqrt{c_\rho}. \tag{V5}
\]
단일 simple eigenvalue에서는 Q가 sign이고 repeated group에서는 orthogonal mixing이다.
Eigenvalue scaling error는 `|c_rho lambda_i'-lambda_i|/s`로 측정한다
(`s`는 baseline E6 operator time scale). Group vector 비교는
`U=L^T P^T C^T D^-1 Phi`, `U'=L^T P^T C^T D^-1(sqrt(c_rho) Phi')`로 정의한
projector 차이 `||UU^T-U'U'^T||F/sqrt(2r)`를 사용한다. r은 group dimension이다.
Dense projector를 구성하지 않고 orthonormal U/U'의 cross-Gram으로 같은 norm을 계산할
수 있다. Arbitrary clustered-but-distinct vectors를 회전하여 다른 eigenpairs로 만들지 않는다.
### V6. Lowest N, cluster, near-zero와 오류 판정 소유권
E6 count/solve history는 각 `(a,b)`, prefix empty evidence, status, count, m0,
returned m, loop/epsout, bounds source와 final selected ranks를 보존한다.
모든 returned pair에 interval separation을 검사하고 requested N개만 검사하지 않는다.
Near-zero/negative 분류 scale은 `s` 또는 그와 동등한 E6 operator scale이며 reference
최소값이나 arbitrary absolute frequency가 아니다. Raw lambda는 바꾸지 않는다.
NR가 구현 전에 결정해야 할 항목은 다음과 같다.
| 대상 | 수치값/필수 검사 소유권과 필요한 scale |
| --- | --- |
| Matrix symmetry, moment/oracle/centroid/M9 | V1/V2의 same-unit norm, total mass 및 `m ell`; roundoff/독립 적분 오차 분리 |
| Null/orthogonal basis, KZ/MZ, mass conditioning | M8/E2 analytic rank, V2 및 작은 positive block condition; near-null 삭제 금지 |
| Residual, Gram, energy, rigid modes | V1~V4, V5 K-action; machine precision·차원·conditioning 근거 |
| Near-zero/negative/cluster 분류 | `|lambda|/s`, pairwise `|lambda_i-lambda_j|/s`; raw value 보존 |
| FEAST control | Contour points/precision exponent/refinement bound, finite count/endpoint/solve retry budget |
| Endpoint safety | Operator scale와 ULP, count monotonicity, enclosing total n, solve/count 및 full-rank Gram |
| Independent test portfolio | 평판 M10, warped/director-varying M5~M9, 비축정렬/부분 BC/E5 오류 case, FEAST known spectra, density/rigid/좌표 tests |
| r2 stabilization/static | S1~S8의 positivity/재계산 공변성·partial BC eigen/static, nonlinear 고정 scale·exact variation과 기존 static portfolio |
| External reference | r1 NR의 원본 input+TXT 10개 Value·singleton family·모두 blocking 논리 계약을 r2 영향 확인 후 유지 |
Small independent pencil은 손으로 대각화 가능한 값을 사용하고 동일 production
mass/reduction/eigensolver를 기대값 계산에 호출하지 않는다. API wrapper의 injected status
검사와 실제 FEAST runtime known-spectrum 검사는 모두 필요하다. Size1, N=n, repeated
group>N, tight cluster, zero/negative, empty interval, insufficient subspace, count collision,
unresolved conditioning 및 allocation/index failure가 해당 공식 계약을 검증한다.
Case의 구체적 목록·숫자는 NR가 정하고 Planning이 tests와 TDD steps에 연결한다.
외부 비교는 지정 [원본 input](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp)과
[원본 TXT](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt)의
`Value`만 사용한다. `lambda [T^-2]`, source `Step-2`, mode 1..10이 의미적 대응이다.
Frequency 재계산, mode shape correlation이나 다른 mass variant의 더 가까운 결과 선택으로
이를 대체하지 않는다. Mode/frame은 NR/I/O가 common same-frame family 규칙에 맞춰
정의하고 missing/extra/duplicate/nonfinite를 tolerance 전에 거부한다.
[r1 reference-model](reference-model.md)의 10개 singleton family·모두 blocking 계약과
공통 정책에 따른 실효 mode별 1%는 보존할 근거다. Formulation이 이를 재선택하지 않으며
r2 영향 재확인은 NR 소유다. V1~V6의 내부 수치 기준은 아직 NR에서 최종 고정하지 않았다.
Schema 경로/저장 field/public diagnostic 이름은 I/O owner의 계약이다.
### V7. 실행 evidence와 남는 위험
이 절의 명령·hash·4문서 검사는 **r1 이력**이다. r2 갱신 evidence는 V8에 둔다.
Formulation 단계에서는 승인 문서와 실제 source를 read-only로 대조하고 자체 수식을
전개했다. 다음 입력은 변경하지 않았다: requirements/research, 관리문서, source/tests/build,
Harness, 공통 tolerance 및 원본 reference. External solver, CMake/CTest, Harness, FEAST
runtime, numerical reference comparison은 실행하지 않았다. 이 문서는 수치 통과 evidence가 아니다.
`Get-Content`, scoped `rg`로 M4의 변환·stabilization과 공통 nodal frame 전달을 확인했다.
한 scoped `rg` 호출은 존재하지 않는 `runtime_element_factory.cpp`와 PowerShell literal
glob 경로 때문에 exit `1`이었다. `rg --files`/`rg -n ... src/fesa`로 실제
`element_factory.cpp`, `shell_geometry.cpp`를 찾아 재조회했고 exit `0`이었다.
Intel parameter/API/status의 공식 문서를 2026-09-06 다시 열어 count 의미,
endpoint/count failure와 m0 capacity를 확인했다(E7의 URL 및 research S05~S07).
`Get-FileHash`는 exit `0`이며 원본 SHA-256은 upstream과 같다.
Input: `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`.
TXT: `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`.
Owned 4개 문서를 `python -B -` read-only here-script(`pathlib`, `re`,
`urllib.parse.unquote`)로 정적 검사했다. Owner/Feature/revision, 26개 requirement
coverage, 상대 링크 실재, trailing whitespace/final newline, display-math delimiter와
언어 혼입을 검사했다. Exit `0`, documents `4`, local links `38`, requirements `26`,
issues `0`이다. `git diff --check`도 exit `0`이며 Coordinator 소유 `coordination.md`의
LF/CRLF warning만 출력되었다. 새 untracked owned 문서의 whitespace는 위 Python 검사로
별도 확인했다. `git status --short`에서 owned 4개와 타 owner coordination 변경을 구분했으며
stage/commit 또는 타 owner 수정은 하지 않았다.
잔여 위험은 매우 얇은 shell/거의 정렬된 부분 BC의 mass conditioning, geometry quadrature
검사점 밖의 전역 injectivity 한계, floating-point FEAST count/endpoint와 repeated subspace,
count scratch 및 shifted factorization memory다. NR가 위 metric·수치 기준·case를 고정하고
Implementation이 실제 설치 backend와 reference evidence를 제시해야 해소된다.
### V8. r2 영향 확인과 bounded evidence
r2에서는 M4의 scale, E3의 개선된 pencil 명시, V5의 complete K/partial-BC coverage와
정적 회귀 연결을 갱신했다. Mass M1/M2/M5~M10 및 FEAST E6~E8, V1~V4의 검증식은
numerical scale 선정과 독립이거나 동일 개선된 K를 대입하는 식이므로 보존한다.
r1 NR의 curved rational mass oracle·27점 degree 결과, count/trace API 근거와 reference
identity는 읽고 재사용 범위를 확인했으며 새 실행 결과로 바꾸지 않았다.
`Get-Content`와 scoped `rg`로 r2 승인 요구/연구·기존 선형 요구 034/036/038/056,
nonlinear §10.1~10.4 및 아래 실제 source를 대조했다. 이 조회는 exit `0`이었다.
```powershell
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_reference|drilling_stiffness' src/fesa/elements/mitc4_shell.cpp
rg -n 'drilling|Drilling|Stiffness\(' src/fesa/elements -g '*nonlinear*'
```
처음 nonlinear source 검색에 literal `src/fesa/elements/*nonlinear*`를 사용한 호출은
PowerShell 경로 오류를 출력했다. 해당 검색을 위 `-g` 방식으로 고쳐 exit `0`을 확인했다.
원본 reference 및 기존 NR mass oracle/옛 반례를 다시 실행하지 않았다.
2026-09-06 web `open`으로 S1의 LAPACK 공식 문서상 작은 eigenvalue 상쇄 경고를 확인했다.
Configured vault grounding 요청이 없으므로 `fem-theory-query`는 별도 적용하지 않았다.
다음은 NR의 R block을 사용해 **새 scale 식의 exact arithmetic만** 확인한 명령이다.
Production source prototype, C++ test, FEAST 또는 독립 NR 판정을 대체하지 않는다.
```powershell
@'
from fractions import Fraction as F
aa,bb=F(49,12),F(23,6)
base=[]; rotated=[]
for ab in [F(1,8),-F(1,8),F(1,8),-F(1,8)]:
base.extend([aa,bb])
rotated.extend([(25*aa+16*bb+40*ab)/41,
(16*aa+25*bb-40*ab)/41])
ref=sum(base)/8
assert ref == sum(rotated)/8 == F(95,24)
kd=ref/1000
mass=F(3,50)
stiffness=F(9,25)*bb+F(16,25)*kd
assert kd == F(19,4800)
assert stiffness == F(10369,7500)
assert stiffness/mass == F(10369,450)
assert F(3,5)*(-F(4,3))+F(4,5) == 0 # d dot (5b/3)
print('k_ref=',ref,'k_d=',kd,'Mff=',mass,'Kff=',stiffness,
'lambda=',stiffness/mass,'theta_per_unit_moment=',1/stiffness)
'@ | python -B -
```
실제 위 here-script를 문서에서 추출해 `python -B -`로 실행했다. Exit `0`,
`k_ref=95/24`, `k_d=19/4800`, `Mff=3/50`, `Kff=10369/7500`,
`lambda=10369/450`, 단위 moment 응답 `7500/10369`를 얻었다.
Owned 5개 문서의 metadata·27 requirement coverage·57개 상대 경로·whitespace·final newline·
display-math delimiter·언어 혼입을 read-only Python으로 검사했고 exit `0`, issues `0`이었다.
`git diff --check`도 exit `0`; LF/CRLF 안내만 있었으며 compiler warning 검증과는 별개다.
Stage/commit은 하지 않았고 `git status --short`의 Coordinator 변경은 보존했다.
이 exact 식에 수치 tolerance를 추가하지 않는다. NR가 S1~S8을 독립 검토하고 V6의 내부 기준·
FEAST budget/seed·mandatory matrix를 완성해야 한다. Implementation은 승인된 기존 static
portfolio와 새 eigen Value-only 비교의 실제 TDD/runtime evidence를 생성해야 한다.
Source/tests/build/phase/Hook/reference/Git 및 다른 owner 문서를 편집하지 않았다.
CMake/CTest·Harness·FEAST·외부 solver·reference numerical comparison은 이 단계에서 미실행이다.