docs: define eigen2 mass stabilization and feast formulation

This commit is contained in:
KOKO\Mimi
2026-09-08 21:22:26 +09:00
parent 72e38d0505
commit 48627a7fd8
7 changed files with 449 additions and 2 deletions
+9
View File
@@ -46,3 +46,12 @@
- 승인 근거: “research 단계부터 io-definition 단계까지 작업을 진행”, “작업시간이 30분 이상 걸리면 작업을 중지하고 진행사항과 오래걸리는 이유를 보고”.
- 영향: 기존 수식·control·schema는 새 전문 검토를 거쳐 채택 여부를 명시한다. 문서 승인과 실제 solver 검증을 구분하며 구현·reference 실행·push는 수행하지 않는다.
- 제한: 2026-09-08 12:07:56 UTC부터 12:37:56 UTC까지. 제한 내 미완료 작업은 통과로 바꾸지 않고 상태·원인을 보고한다.
## MFE2-ADR-006 — 정식화 r1의 선택과 연구 gap 처리
- 상태: 승인된 요구 범위 안의 formulation 선택. 독립 numerical 판정은 별도 기록한다. Owner: formulation-agent; 기록: 메인 assistant.
- 결정: [정식화](formulation.md)의 27점 consistent moments→nodal block lumping, 실제 BC 우선 analytic null 제거·nodal whitening 및 초기 physical rotary trace 평균 stabilization을 이번 수학 계약으로 선택한다. Nonlinear objective potential과 초기 scale 고정 lifecycle을 유지한다.
- 이유: 질량 유도 관계·drilling null·부분 회전 제약을 보존하고 기존 최소 대각 scale의 기저 의존성을 해결한다. 기존 유도의 채택 범위를 새 문서에 명시하며 과거 pass를 승계하지 않는다.
- FEAST: 독립 outer enclosure와 성공 total count를 기준으로 lower endpoint를 고정하고 upper-prefix 축소만 선택적으로 사용한다. 미확인 empty-count 성공에 의존하지 않으며 최적화 실패 시 마지막 확인된 구간을 사용한다.
- 근거·한계: [연구 G01/G02](research-evidence.md)에서 count-only 빈 구간 및 작은 workspace 보장이 확인되지 않았다. 보수적 workspace와 실제 runtime·memory 검증 의무를 남기며 backend 통과를 선언하지 않는다.
- 승인 경계: 기존 사용자 요구의 수학적 구체화이며 새로운 물리 범위·외부 tolerance·공개 호환성 변경은 없다. 수치 controls·검토는 NR, 영속 schema는 I/O가 소유한다.
@@ -32,5 +32,6 @@
| [requirements.md](requirements.md) | requirement-agent | 원자적 요구사항·acceptance intent·검증 matrix |
| [requirements-evidence.md](requirements-evidence.md) | requirement-agent | 재사용 근거·기존 요구 대응·reference 정적 관찰·미해결 사항 |
| [research.md](research.md), [research-evidence.md](research-evidence.md) | research-agent | 일차 출처·적용 판단·검증 후보·미해결 근거 |
| [formulation.md](formulation.md), [질량·stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md) | formulation-agent | 구현 가능한 수학 계약·기존 유도 채택 경계 |
반환은 결과·변경 파일·정적 확인·미해결 항목으로 충분하다. Git 경로 선택·커밋과 최종 결과 확인은 메인이 수행한다.
+1 -1
View File
@@ -63,7 +63,7 @@ solver build/test·reference 비교와 release 감사는 포함하지 않는다.
- [x] 상대 링크·ID를 검사하고 커밋 대상이 새 Feature 문서 5개뿐인지 확인한다.
- [x] Research: [연구](research.md)와 [근거](research-evidence.md)에 일차 출처·질량/축소/stabilization 후보 및 실제 runtime 확인이 필요한 FEAST 두 항목을 기록했다.
- [ ] Formulation: 질량·안정화·축소·고유치 해법의 구현 가능한 수학 계약을 작성한다.
- [x] Formulation: [정식화](formulation.md)에 질량·공변 stabilization·constraint-first 축소·FEAST·복구 수학 계약을 작성했다. 독립 numerical review는 별도 항목이다.
- [ ] Numerical review: 독립 계산·검토로 정식화와 검증 계획의 적합성을 판단한다.
- [ ] I/O definition: 입력·진단·결과 schema·reference mapping 계약을 정의한다.
- [ ] 신규 문서의 링크·계약 일관성과 변경 범위를 확인하고 단계별 변경을 커밋한다.
@@ -0,0 +1,199 @@
# 구속된 lumped pencil, FEAST와 modal 복구
Feature `mitc4-shell-feast-eigen2`, formulation r1. [기본 보고서](formulation.md)와
[질량·stabilization](formulation-mass-stabilization.md)의 기호를 사용한다.
Intel evidence는 [research R04/G01/G02](research-evidence.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<gL<=gU<b0`를 확보한다.
B=0에는 dimensionless outer bracket (-1,1)을 쓸 수 있다. 이는 eigenvalue clamp가 아니다.
Lower a0는 **항상 유지**한다. 독립 enclosure 자체가 a0보다 낮은 spectrum 부재의 근거다.
1. `(a0,b0)`에 성공한 count=n을 확인한다. 독립 enclosure와 total count가 불일치하면
유한 endpoint 재시도 후 실패다. 성공한 `(a0,b0,count=n)`을 fallback으로 보존한다.
2. 선택적 upper-prefix subdivision은 `(a0,v)`만 count한다. 유효한 성공 count c>=N이면
safe upper=v, c<N이면 search lower=v로 이동한다. 마지막 safe interval을 보존한다.
Count-only zero가 보장되지 않으므로 실패·미정 status를 0으로 바꾸지 않는다.
3. Count=0에 대한 인증된 성공을 얻지 못하거나 endpoint/midpoint·budget 한계에 이르면
최적화를 끝내고 마지막 safe interval, 최소한 total enclosing interval을 사용한다.
별도의 empty-prefix 탐색이나 lower-bound 축소를 필수 경로로 두지 않는다.
4. 최종 interval의 성공 count 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 `emin<emax`, `n>0`, `0<m0<=n`, SPD second matrix를 만족한다.
Upper triangle·1-based CSR에서 sorted unique indices, terminal nnz+1, finite values를 검증한다.
K와 identity의 pattern이 같을 필요는 없다. Vendor types와 workspace는 private backend다.
매 call마다 `feastinit` 후 명시 controls를 채운다. C-index `fpm[49]=1`은 CSR count를
m0로 반환하고 flag가 0으로 reset된다. Count output m0·solve requested m0·allocated capacity를
분리한다. CSR/SPD 검사를 켜고 subspace-only를 끈다. Zero mode에도 적용할 수 있도록
`fpm[5]=1` trace stopping을 사용하며 residual을 독립 검증한다. `epsout`은
`|trace_i-trace_previous|/max(|emin|,|emax|)`이며 eigenpair 상대오차가 아니다.
`info=1`은 certified empty count가 아니다. 넓은 interval의 isolated cluster를 놓친
상태일 수 있다. `info=0,m0=0`의 empty-count 성공이나 count-only 작은/null scratch
면제는 공식 문서가 보장하지 않는다. 이 설계는 보수적으로 count용 m0=n,
x[n*n], e[n], res[n]을 준비하되 이를 vendor의 최소 workspace 의무라고 부르지 않는다.
Count scratch는 재사용·solve 전에 해제할 수 있다. O(n²) 비용, shifted sparse fill,
checked n*m0/nnz/index 변환 및 실제 peak memory를 후속 구현에서 검증한다.
Fixed initial subspace 생성법·seed·QR 순서·thread 설정·contour·loop·stopping controls는
NR가 고정하고 evidence에 남긴다. Full capacity m0=n에서는 identity initial basis를 쓸 수 있다.
Seed를 바꿔 통과할 때까지 반복하지 않는다. 고정 source 입력의 assembly/reduction·row·
diagnostic 순서를 유지하되 repeated eigenvectors의 유일한 방향을 주장하지 않는다.
## E6. Original-global recovery와 검증식
복구된 `yf=C^T D^-1 phi`, `k=||Kf||F`, `m=||Mf||F`에서
\[
r_f=K_fy_f-\lambda M_fy_f,\qquad
\eta_r=\frac{\|r_f\|_2}{(k+|\lambda|m)\|y_f\|_2}. \tag{E5}
\]
원 조립행렬의 **모든 original free DOF**에서 검사한다. 축소 residual만으로 복원 오류를
숨기지 않는다. M은 항상 actual lumped다. 제약 성분의 modal residual을 reaction으로 출력하지 않는다.
`Mf Z`, `Kf Z-Z diag(kappa)`, `P^T Z`, Cholesky reconstruction 및 constraint 복원도 검사한다.
Nz=0이면 null 검사는 N/A이며 zero metric의 통과를 만들어내지 않는다.
`gi=phi_i^T M phi_i`가 finite positive일 때만 `phi_i/=sqrt(gi)`로 정규화한다.
정규화 후 최종 phi에서 `gi=phi_i^T M phi_i`와 `yf_i=C^T D^-1 phi_i`를 다시 계산한다.
이후 모든 residual·Gram·Rayleigh·energy 검사는 이 재계산 값만 사용한다.
전체 c개에 대해 `Gij=phi_i^T M phi_j`, `G≈I`, Gram rank c를 검사한다.
Rayleigh quotient `Ri=(yf_i^T Kf yf_i)/gi`와
\[
\eta_{energy,i}=\frac{|y_{f,i}^TK_fy_{f,i}-\lambda_i g_i|}
{(k+|\lambda_i|m)\|y_{f,i}\|_2^2} \tag{E6}
\]
를 검사한다. 같은 단위 norm에서 symmetry·congruence error를 평가한다.
모든 ratio는 분모>0에서만 계산하며 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를 만들지 않는다.
@@ -0,0 +1,172 @@
# 질량과 공변 numerical stabilization
Feature `mitc4-shell-feast-eigen2`, formulation r1. [기본 보고서](formulation.md)의 적용·채택 경계를 따른다.
## M1. 운동학과 physical stiffness
길이·질량·시간 차원은 `L,M,T`, 두께는 `t`, 시간은 `tau`다. 일정한 `rho>0 [M/L³]`,
centered constant `t>0 [L]`, `E>0 [M/(LT²)]`, `-1<nu<1/2`를 사용한다.
밀도 필수 조건은 eigen에만 적용한다. 기존 지원 geometry/director·section 조건을 유지한다.
원 node `X_i`, incident element가 공유하는 unit director `d_i`, 오른손 tangent frame
`(a_i,b_i,d_i)`를 사용한다. Corner 순서는 `(-1,-1),(1,-1),(1,1),(-1,1)`이다.
\[
N_i=\tfrac14(1+\xi_i\xi)(1+\eta_i\eta),\quad z=t\zeta/2,\quad
X=\sum_iN_i(X_i+z d_i),\quad J=\det[X_{,\xi},X_{,\eta},X_{,\zeta}]. \tag{M1}
\]
전역 `q_i=[u_X,u_Y,u_Z,theta_X,theta_Y,theta_Z]`, `u [L]`, `theta [1]`이며
양의 director 변화는 `theta cross d`다. `S_i=-[d_i]_cross`, `P_i=I-d_i d_i^T=S_i^T S_i`,
`G_i=[I,zS_i]`, `H=[N_1G_1,...,N_4G_4]`에서 `v=H q_dot`이다.
회전 physical 성분 `alpha=a_i^T theta,beta=b_i^T theta`, drilling `gamma=d_i^T theta`다.
`S_i theta=-b_i alpha+a_i beta`, `S_i d_i=0`. 보간 director를 재정규화하지 않는다.
기존 [shell 정식화](../linear-static-mitc4-shell/formulation.md)의 geometry·MITC tying·
20↔24 변환을 그대로 사용한다. Engineering strain 순서
`[epsilon11,epsilon22,gamma12,gamma13,gamma23]`에 대해
\[
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}^0=\sum_{g\in2\times2\times2}\bar B_g^TC_5\bar B_gJ_gw_g,
\]
\[
K_e=T_p^TK_{20}^0T_p+T_d^T(k_{d,e}I_4)T_d. \tag{M2}
\]
`T_p` maps to 4×`[uX,uY,uZ,alpha,beta]`; `T_d` maps to four gamma values.
Plane stress `sigma33=0`, 작은 변형·무응력 원형상이다. Parent momentum balance는
`rho u_ddot=div sigma`, 자유 traction은 0이다. MITC admissible variation의 약형은
`integral rho delta u·u_ddot + integral delta e_bar^T C5 e_bar + delta gamma^T kd gamma=0`.
Lumping 후 반이산 잔차 `r=M_L q_ddot+Kq`, tangent는 각각 `M_L,K`이고 harmonic
ansatz에서 `K phi=lambda M_L phi`, `lambda=omega² [T^-2]`다.
Shear factor `5/6`을 velocity/mass에 적용하지 않는다. 새 재료 history·감쇠·prestress·
time integrator 또는 modal stress/reaction recovery는 없다.
## M2. Consistent scalar moments와 적분
\[
C^{(k)}_{ij}=\int\rho N_iN_jz^kJ\,d\xi d\eta d\zeta\quad(k=0,1,2),\qquad
(M_C)_{ij}=\begin{bmatrix}C^{(0)}_{ij}I&C^{(1)}_{ij}S_j\\
C^{(1)}_{ij}S_i^T&C^{(2)}_{ij}S_i^TS_j\end{bmatrix}. \tag{M3}
\]
`T_C=1/2 q_dot^T M_C q_dot`. 각 C는 symmetric 4×4, 차원은 `ML^k`,
mass block 차원은 `M,ML,ML²`다. M1의 J는 각 자연좌표 차수 ≤2이고
`Ni Nj z^k J`는 ≤`(4,4,4)`이므로 3×3×3 Gauss–Legendre로 정확 적분한다
(roundoff 제외). 축별 point `[-sqrt(3/5),0,sqrt(3/5)]`, weight `[5/9,8/9,5/9]`다.
증가 xi→eta→zeta, node/component와 moment 합 순서를 고정한다.
모든 27점에서 기존 geometry predicate·finite·J>0를 검사한다. 이 검사를 전체
volume injectivity theorem으로 확대하지 않는다. Stiffness의 8점 적분은 유지한다.
곡면에서는 `C1`이 비영일 수 있고 `C2=t² C0/12`는 일반식이 아니다.
완성한 C와 M_C를 검증·보존하고 다음 row sum의 실제 원본으로 사용한다.
Mass 원본을 lumped로 덮어쓰거나 독립 mass를 별도로 만들어 derived라 부르지 않는다.
## M3. Derived nodal block lumping과 보존 범위
\[
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&h_iS_i\\h_iS_i^T&j_iP_i\end{bmatrix},\quad
M_{L,e}=\operatorname{blockdiag}_i L_i. \tag{M4}
\]
전체 24×24 row sum 또는 diagonal scaling이 아니라 **scalar moment row sum 뒤 tensor 재구성**이다.
`L_i=integral rho Ni Gi^T Gi dV`이므로 node 간 coupling은 0, 같은 node의 6×6 coupling은
허용한다. Incident elements는 같은 d_i를 사용하고 stable source 순서로 block을 더한다.
\[
q_i^TL_iq_i=m_i|u_i+(h_i/m_i)S_i\theta_i|^2+
(j_i-h_i^2/m_i)|S_i\theta_i|^2. \tag{M5}
\]
양의 volume measure와 thickness에 의해 `mi>0,ji>0,mi ji-hi²>0`, rank=5,
`ker Li=span([0;di])`다. 부호·finite·variance 검사를 clamp로 통과시키지 않는다.
거의 singular인 양의 mass를 rank cutoff로 제거하지 않고 conditioning 실패를 별도 진단한다.
보존하는 양은 `sum mi=integral rho dV`, `sum hi=integral rho z dV`,
`sum ji=integral rho z² dV`, first spatial moment
`sum(mi Xi+hi di)=integral rho X dV`다. Uniform translation energy는 consistent와 같다.
`ji Pi`는 tangent rotary inertia이며 arbitrary rigid rotation의 **orbital inertia tensor**까지
consistent와 같게 만드는 계약은 아니다. 실제 차이는 `vi=ui_dot+z Si theta_i_dot`에 대해
\[
\dot q^T(M_L-M_C)\dot q=\tfrac12\int\rho\sum_{ij}N_iN_j|v_i-v_j|^2dV\ge0. \tag{M6}
\]
서로 다른 일반 속도장의 energy·spectrum 동일성은 요구하지 않는다.
Affine rectangle 면적 A·평행 director의 독립 oracle은
\[
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=t^2C^0/12,
\quad(m_i,h_i,j_i)=(\rho t A/4,0,\rho t^3 A/48). \tag{M7}
\]
곡면 oracle는 독립 volume integration으로 C1와 변동 J까지 검사한다.
## S1. 초기 trace 평균 선택과 공변성
`R_i`는 **구속 전 초기 physical** K20의 node i에 대한 2×2 tangent rotary principal block이다.
\[
k_{ref,e}=\frac18\sum_{i=1}^4\operatorname{tr}R_i,\qquad
k_{d,e}=10^{-3}k_{ref,e}>0. \tag{S1}
\]
단위는 `ML²/T²`; 8개 rotary diagonal 전부를 평균한다. Translation diagonal·mass·density·
trial tangent·BC·reference 오차는 입력이 아니다. Negative/nonfinite diagonal은 실패,
exact zero는 평균에 포함, 8개 전부 zero면 positive inventory 실패다. 개별 Ri의 SPD를
새 geometry 조건으로 요구하지 않는다. Overflow 방지 계산은 `dmax*((sum dr/dmax)/8)`이며
고정 node1→4, alpha→beta 순서로 합한다. Underflow/nonpositive kd를 floor로 대체하지 않는다.
Proper global rotation Q와 재생성 tangent `Ui'=Q Ui Oi`에서
`Ri'=Oi^T Ri Oi`, `tr Ri'=tr Ri`. `S_Q=blockdiag_i(Q,Q)`이면
`Kphys'=S_Q Kphys S_Q^T`, `Kdrill'=S_Q Kdrill S_Q^T`, `M'=S_Q M S_Q^T`이다.
Q=I인 독립 tangent basis 변경에도 성립한다. **새 geometry/frame에서 K20·kd·complete K를
모두 다시 계산**해야 하며 이미 계산한 tensor만 회전해서는 이 선택을 검증할 수 없다.
BC가 양쪽의 지원 component subset으로 같은 물리 free space를 표현할 때 constrained
spectrum·static response의 공변성을 검증한다. 다른 BC를 같은 문제로 비교하거나 MPC를 추가하지 않는다.
물리 rigid field는 `ui=c+Omega cross Xi`, `theta_i=Pi Omega`이며 strain=gamma=0이다.
여섯 물리 rigid modes는 양의 mass를 갖는다. Pure numerical drill `[0;di]`는 mass=0,
stiffness>0이다. Linear UR에 full spatial Omega를 넣는 field와 이 physical 대표값을 구분한다.
## S2. 비선형 objective potential과 고정 scale
기존 [nonlinear 정식화 §10](../nonlinear-static-newton-raphson/formulation.md)의 polar
corotation, total nodal rotation, minimal swing 및 objective `gamma_i=atan2(s_i,c_i)`를
유지한다. S1을 초기 reference에서 한 번 계산하고 모든 trial·commit·increment·rollback에서
그 값을 고정한다. `D kd=D² kd=0`이다.
\[
\Pi_d=\tfrac12 k_d\gamma^T\gamma,\quad r_d=k_dD_\gamma^T\gamma,\quad
K_d=k_d\left(D_\gamma^TD_\gamma+\sum_i\gamma_iD^2\gamma_i\right). \tag{S2}
\]
Polar/swing/atan2의 미분과 branch validation을 생략하지 않는다. Trial마다 scale을 바꾸지 않는다.
일반 nonlinear Hessian 전체의 SPD는 주장하지 않는다. 초기에도 Dgamma는 corotation coupling을
포함하므로 linear Td와 동일시하지 않는다. 기존 physical 선형극한, directional residual/Hessian,
objective rigid orbit·state rollback을 검증한다. 새 eigen에는 이 nonlinear state를 전달하지 않는다.
Physical strain/stress/reaction의 의미와 Newton·하중·commit 계약은 보존한다.
## S3. 필수 partial-BC exact target
`a=(0,1,0), b=(-4/5,0,3/5), d=(3/5,0,4/5)`,
`X=(-2a-b,2a-b,2a+b,-2a+b)`, `t=1,E=12,nu=0,rho=1`인 rectangle이다.
모든 DOF를 고정하되 node1 global URZ만 free다. Independent rotary block의
diagonal은 `49/12,23/6`, off-diagonal은 corner에 따라 `±1/8`이다. S1에서
\[
k_{ref}=95/24,\quad k_d=19/4800,\quad M_{ff}=3/50,\quad
K_{ff}=10369/7500,\quad\lambda=10369/450. \tag{S3}
\]
Global Z축 45° 회전 뒤에도 같은 BC를 유지하고 geometry/frame부터 재계산한다.
URZ에 양의 mass가 있으므로 drill 좌표라고 삭제하면 안 된다. 이 값은 `NR-MFE-001`의
새 식 target이며 과거 pass 재사용이 아니다. NR가 독립 재유도한다.
Static 대응 load는 node1의 tangent moment `m=(5/3)M0 b`, 다른 load=0이다.
`d·m=0,mZ=M0`; `theta1Z=M0/Kff`, full residual `r=Kq-F`다.
회전 뒤 `m'=Qm`을 사용한다. Pure global eZ moment는 drilling 성분 때문에 기존 load
계약에 부합하지 않는다. Eigen의 constrained residual을 static reaction으로 출력하지 않는다.
@@ -0,0 +1,66 @@
# MITC4 질량·공변 stabilization·FEAST 정식화
- Feature: `mitc4-shell-feast-eigen2`; Owner: `formulation-agent`; 정식화 revision: `r1`.
- 입력: [requirements r1](requirements.md), [근거](requirements-evidence.md), [Feature ADR](ADR.md).
- 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ADR-028](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md).
- 상태: 독립 numerical review에 인계하는 수학 계약. 구현·runtime·reference 통과 선언이 아니다.
## 선택과 적용 범위
원형상·무응력 단일 무감쇠 선형 고유진동을 `K phi = lambda M_L phi`로 정의한다.
실제 질량은 consistent scalar moments에서 유도한 nodal block lumped mass다.
3 병진·2 director 접평면 회전의 관성을 유지하고 numerical drilling에 인공 질량을 넣지 않는다.
실제 global 동차 BC를 먼저 적용한 뒤 analytic mass null과 free space의 정확한 교집합만
제거한다. 양의 nodal mass를 whitening한 identity second matrix도 같은 lumped 문제다.
기존 MITC4 물리 strain·constitutive·integration·source `S4`/`S4R` 의미를 유지한다.
Numerical scale은 초기 physical rotary diagonal 8개 trace 평균의 `10^-3`으로 선택한다.
기존 최소 양의 대각 선정과 그 식 자체의 검사를 대체한다. 개선 전 complete K와의
동일성, consistent/lumped spectrum 동일성 또는 Abaqus 내부 절차의 동등성은 요구하지 않는다.
개선된 **실제 constrained pencil의 모든 finite spectrum 보존**은 요구한다.
| 상세 계약 | 정의하는 내용 | 요구 번호 접미사 |
| --- | --- | --- |
| [질량·stabilization](formulation-mass-stabilization.md) | 운동학, 27점 적분, moment→lumping, 관성 불변식, scale·비선형 lifecycle, partial-BC 반례 | 002–008, 014, 024, 026–027 |
| [축소·FEAST·복구](formulation-eigen.md) | 실제 BC, analytic null, whitening, lowest N, 실패, modal residual·state | 001, 007–014, 018–019 |
## 기존 유도의 명시 채택 경계
이전 Feature는 읽기 전용 유도 근거다. 아래 채택은 새 요구와의 대조 결과이며 과거
검토의 pass, control 값, schema, execution evidence 또는 제외 portfolio의 승계가 아니다.
| 이전 자료 | 이번 채택 | 이번에 채택하지 않는 부분 |
| --- | --- | --- |
| [mass M1–M10](../mitc4-shell-feast-eigen/formulation-mass.md) | 동일 geometry·H 보간, moments, 27점 정확성, block lumping 및 Jensen identity; 새 상세에 재기재 | 이전 revision·readiness 진술 |
| [stabilization S1–S6](../mitc4-shell-feast-eigen/formulation-stabilization.md) | trace 평균 후보를 이번 식으로 선택; 공변성, frozen objective potential, 반례 exact target | S7의 옛 reference portfolio 및 과거 해소 판정 |
| [eigen E1–E5/E8](../mitc4-shell-feast-eigen/formulation-eigen.md) | constraint-first analytic split, nodal whitening, global recovery 원리 | E6/E7의 빈 count 성공 가정·기존 수치 controls 자동 승계 |
| [verification V1–V5](../mitc4-shell-feast-eigen/formulation-verification.md) | 같은 단위의 residual/Gram·energy·covariance·density 측정량 | 기존 tolerance 값·test 수·gate·실행 portfolio |
질량 및 trace 평균은 FESA 운동학에서 유도한 선택이다. 외부 source가 이 lumping/scale을
지정한다고 주장하지 않는다. 최신 API 근거와 검토 한계는 [research](research.md)와
[research evidence](research-evidence.md)에 연결한다. FEAST count의 `fpm[49]=1`과
trace stopping의 `fpm[5]=1`은 C-index다. 빈 count interval의 `info=0,m0=0`과 작은
scratch 허용은 보장된 vendor 계약으로 채택하지 않는다.
## 검증 의무와 미해결 항목
두 질량의 독립 적분 oracle, 총 병진 질량·first moment·tangent inertia·drill null,
여섯 physical rigid modes, density scaling 및 full original-free residual/Gram을 검증한다.
`NR-MFE-001`의 `k_d=19/4800`, `lambda=10369/450`는 새 식의 exact target이며
독립 NR가 재계산해야 한다. 좌표 변환 후 geometry·director·frame·**complete K를 재계산**하고,
같은 물리 partial BC 및 admissible tangent moment를 사용하는 정적 대응도 검사한다.
Nonlinear scale immutability·objective energy·일관 residual/Hessian·선형극한을 재검증한다.
외부 portfolio는 오직 새 [requirements의 지정 범위](requirements.md)를 따른다.
`shell`, `shellNL`, `shellNL-eigen-meshfine`의 retained 의무와 synthetic 내부 검사를 유지한다.
제외된 네 예제는 원본·복사본·cache·과거 결과로 재사용하지 않는다. Eigen 외부 비교는
원본 TXT의 `Value`이며 [공통 tolerance](../TOLERANCE.md)를 변경하지 않는다.
NR가 내부 수치 기준, FEAST control·endpoint separation·bounded call budget·seed를
독립 검토하여 고정해야 한다. 실제 설치 runtime의 count/solve·zero/cluster/full-capacity
동작과 memory는 후속 실행 evidence다. Numerical review 전 수학적 correctness를
스스로 승인하지 않는다. I/O owner는 입력 allowlist, result schema·identity 및 실패 진단을
정의한다. 이 문서는 신규 physical scope 또는 영속 layout을 추가하지 않는다.
문서 작업에는 build/test를 실행하지 않는다. 링크·식·소스 경계의 정적 대조를 수행하며
실제 solver·reference 검증은 미실행으로 남긴다.
@@ -94,7 +94,7 @@ initial scale immutability. 과거 반례 수치·새 trace 후보 기대값은
`fpm[49]=1`은 CSR 구간 전체 고유치 수를 `m0`로 반환하고 flag를 0으로 재설정한다.
`fpm[26]`은 CSR 검사, `[27]`은 B 양정치 검사이며 `[5]=1`은 trace stopping이다.
**Fact S07:** `epsout=|trace_i-trace_previous|/max(|emin|,|emax|)`;
`0<m0<=n`, 구간 multiplicity count 이하의 m0는 불충분하다. Count와 solve의 m0 및
`0<m0<=n`, 구간 multiplicity count 미만의 m0는 불충분하다. Count와 solve의 m0 및
allocation capacity를 분리해야 한다.
**Fact S06:** `info=0` 성공, `1` empty warning, `2` 미수렴, `3` 작은 subspace,