# 구속된 lumped pencil, FEAST와 modal 복구 > 현재 구현·검증은 [기능 요약](README.md)을 먼저 따른다. 아래 준비 상태·owner 인계와 > 옛 source 문서명은 작성 당시 이력이며, 원문은 Git 이력에서 확인한다. Feature `mitc4-shell-feast-eigen2`, formulation r1. [기본 보고서](formulation.md)와 [질량·stabilization](formulation-mass-stabilization.md)의 기호를 사용한다. Intel evidence는 [research R04/G01/G02](README.md)에 따른다. ## E1. 실제 BC를 먼저 적용한다 K와 M=M_L은 같은 source scatter와 stable contribution/reduction 순서로 조립한다. 활성 shell 최대 edge 길이의 최댓값 `ell>0 [L]`을 사용하여 `D=blockdiag_nodes(ell I3,I3)`, `q=D y`로 둔다. 이는 단위 정합 congruence다. `Khat=D^T K D [ML²/T²]`, `Mhat=D^T M D [ML²]`이다. 실제 global homogeneous component BC의 stable free injection C에서 \[ y=C y_f,\quad K_f=C^TKhat C,\quad M_f=C^TMhat C. \tag{E1} \] Constrained 행은 0이며 nonzero prescribed base state는 이 procedure에서 허용하지 않는다. Global UR3를 drilling으로 간주하거나 local 회전을 먼저 삭제한 뒤 BC를 적용하지 않는다. Node i의 full analytic null은 `z_i=[0;d_i]`다. 이 방향이 실제 free space 안에 있을 필요충분조건은 **모든 constrained rotational component에 대해 해당 d_i 성분이 정확히 0**인 것이다. 그때만 `Zi=Ci^T zi`를 null basis로 둔다. 아니면 null dimension=0이다. Translation BC는 이 조건에 영향을 주지 않는다. 작은 비영 director 성분을 0으로 분류하여 null을 늘리지 않는다. 거의 정렬된 partial BC의 작은 양의 mass도 보존한다. Node free space에서 Zi의 직교 여공간 Pi^f를 고정 component 순서와 sign/tie로 구성한다. 세 회전 free에서는 기존 tangent a_i,b_i를 쓸 수 있고 null이 없으면 Pi^f=I다. 다른 경우도 작은 orthogonal basis construction으로 같은 공간을 만든다. 수치 고유값 cutoff로 physical rank를 결정하지 않는다. 전체 block basis P,Z에서 \[ [P\ Z]^T[P\ Z]=I,\quad M_fZ=0,\quad M_p=P^TM_fP\succ0. \tag{E2} \] Positive dimension `n=cols(P)`, null dimension `nz=cols(Z)`이며 `n+nz=nf`다. Node의 finite dimension이 0이어도 다른 node는 유지한다. Global n=0 또는 requested N>n은 고유쌍 요청 실패다. 정적 해석의 유효한 0×0 Kff와 이 count 요구를 혼동하지 않는다. ## E2. 이 shell의 정확한 massless 제거 공통 nodal director와 M2의 분리 때문에 `Tp z_i=0`, `Khat z_i=kappa_i z_i`, `kappa_i=sum_{e incident i} kd,e>0`다. E1에서 null이 실제 free space에 있는 경우에만 다음이 성립한다. \[ K_fZ=Z\operatorname{diag}(\kappa_i),\quad K_{pz}=P^TK_fZ=0,\quad K_{zz}=\operatorname{diag}(\kappa_i)\succ0,\quad K_p=P^TK_fP. \tag{E3} \] Massless equation은 `Kzz z=0`이므로 finite mode의 z=0이다. 따라서 `Kp p=lambda Mp p`는 **개선된 실제 constrained K/M의 모든 finite spectrum**을 보존한다. Null이 없는 partial BC에는 numerical drilling stiffness가 Kp에 그대로 남는다. 이를 제거하면 다른 pencil이 된다. Roundoff 잔차의 작은 coupling을 임의로 무시하는 것이 아니라 analytic identity로 축소하고 원 조립행렬에서 identity와 full residual을 검증한다. 불일치·conditioning 실패를 추가 DOF 삭제로 수리하지 않는다. 일반 pencil에서는 Kzz 가역일 때 `z=-Kzz^-1 Kzp p`, `Keff=Kpp-Kpz Kzz^-1 Kzp`가 필요하다. 예: `K=[[6,2],[2,4]],M=diag(2,0)`의 finite eigenvalue는 5/2, z=-p/2이며 행만 삭제한 값 3은 틀리다. 이는 독립 검증 oracle이며 이번 shell production에 일반 dense Schur fallback을 추가하라는 계약이 아니다. Singular/nonpositive Kzz, 공통 K/M null, 추가 mass null은 지원 전제 위반으로 진단한다. Pseudoinverse·epsilon mass/stiffness를 넣지 않는다. E3를 nonlinear Hessian이나 prestress 문제로 확장하지 않는다. ## E3. 양의 nodal mass whitening Mp는 node별 최대 6×6 SPD block이다. `Mp=L L^T`를 block Cholesky하면 \[ A=L^{-1}K_pL^{-T},\quad p=L^{-T}x,\quad Ax=\lambda x, \qquad \phi=D C P L^{-T}x. \tag{E4} \] Global dense inverse 없이 nodal triangular solve로 congruence한다. Node topology를 늘리지 않으며 기존 coupling마다 작은 dense block만 생긴다. `phi^T M_L phi=x^Tx`다. FEAST에 `(A,I)`를 넘겨도 실제 physical mass는 M_L이고 unit physical mass로 바꾼 것이 아니다. Global physical 6 DOF와 source identity를 복구하며 constrained 성분은 정확히 0이다. Cholesky positivity·reconstruction·conditioning 검증 실패 시 mode 후보를 만들지 않는다. ## E4. Lowest N과 FEAST의 유한 탐색 N은 입력의 positive integer count이며 reference는 현재 10이다. Reference Value/Freq는 scale·bracket·subspace·coefficient 선정에 사용하지 않는다. `s=||A||inf [T^-2]`에서 s>0이면 B=A/s다. A가 정확히 0일 때만 모델 scale `s=min_e E_e/(rho_e ell²)>0`로 두어 B=0을 유지한다. 잘못된 scale을 1로 대체하지 않는다. 반환값은 `lambda=s mu`다. `ri=sum_{j!=i}|Bij|`의 Gershgorin bound에 outward accumulation 또는 증명된 roundoff error bound를 포함하여 `gL<=spectrum(B)<=gU`를 만든다. NR의 finite endpoint margin과 outward nextafter로 `a0=N이면 safe upper=v, c=N을 재확인한다. Capacity는 `c<=m0<=n`이며 padding, 탐색 중단 목표 및 유한 횟수는 NR가 고정한다. c=n이면 m0=n이다. N번째가 반복 cluster 안이어도 cluster 일부를 강제로 잘라 count하지 않는다. 5. FEAST로 c개 전체 eigenpair를 계산·검증하고 lambda 오름차순 첫 N개를 선택한다. 같은 eigenvalue의 multiplicity를 평균·merge·deduplicate하지 않는다. 모든 count/solve·endpoint 재시도를 합친 유한 call budget을 NR가 고정한다. Safe bracket으로 fallback해도 workspace 부족이나 넓은 interval의 실패 가능성은 남는다. Allocation·integer range·미수렴·count 불일치에 bounded failure로 종료하며 다른 backend, 작은 N 또는 유효성 검사를 생략한 부분 결과로 성공하지 않는다. Endpoint 근접을 해결할 수 없으면 실패다. 최적화 실패를 성공 count evidence로 기록하지 않는다. Count monotonicity·solve returned m=c·Gram rank c·모든 값의 interval 내부성과 endpoint 분리·모든 pair residual을 확인한다. Total enclosure, count, rank와 residual은 별도 evidence다. Floating-point FEAST를 모든 conditioning에서 완전성 theorem으로 확대하지 않는다. 알려진 zero/negative/repeated/clustered spectrum, n=1, N=n, endpoint 근접 및 설치 runtime probe가 필수 후속 연결점이다. Significant negative mode를 건너뛰어 양수 N개를 내지 않는다. ## E5. Vendor call 경계와 재현성 실제 eigenpairs는 MKL `dfeast_scsrgv`의 real symmetric `(B,I)`로 계산한다. Strict finite `emin0`, `00에서만 계산하며 numerator=denominator=0이면 해당 zero identity metric=0, denominator=0,numerator!=0이면 실패다. Zero eigenvector 자체는 정규화 전 실패다. 임의 `max(1,scale)`·floor·zero clamp는 없다. 실제 수치 한계는 NR가 정한다. Lambda를 pair와 함께 stable 정렬하고 exact tie는 solver column order로 둔다. 최대 절댓값의 scaled global component가 양수가 되게 sign을 정하며 tie는 source DOF 순서다. Gram을 맞추려고 서로 다른 eigenvalue의 vectors를 섞지 않는다. Repeated group은 동일 mass metric의 projector로 비교하며 한 벡터의 방향을 external acceptance로 요구하지 않는다. Mass-normalized phi_u 차원은 `M^-1/2`, phi_theta는 `M^-1/2 L^-1`이고 응답변위가 아니다. 모든 density를 c_rho>0배 하면 두 mass는 c_rho배, lambda는 1/c_rho배, normalized repeated eigenspace는 1/sqrt(c_rho)배와 내부 orthogonal mixing 관계다. 여섯 rigid motions와 same-physical-BC covariance는 질량·stabilization 상세의 field를 쓴다. Raw lambda의 부호를 보존한다. NR 기준의 significant negative는 spectrum 실패, near-zero는 raw value를 유지한 분류다. 양수일 때만 `f=sqrt(lambda)/(2pi)`, 정확한 0이면 f=0이고 음수에는 실수 f를 만들지 않는다. 저장 validity·schema는 I/O가 정의한다. ## E7. Candidate와 실패 lifecycle Geometry/density→consistent moments→lumped→K/M assembly→실제 BC→analytic split→ SPD whitening→count/FEAST→global 복원·전체 c개 독립 검증→N개 candidate 순서다. 검증 전 accepted state를 바꾸지 않는다. Writer는 candidate를 완성·self-check·close한 뒤 final HDF5를 교체하고, 준비된 state 교환은 이후 실패하지 않도록 한다. 제어된 solve/ validation/write/finalization 실패에서 이전 state·final output을 보존한다. Live log는 별도 lifecycle이며 crash/power-loss 원자성을 새로 주장하지 않는다. 추가 nonlinear/material history나 modal stress/reaction state를 만들지 않는다.