1174 lines
74 KiB
Markdown
1174 lines
74 KiB
Markdown
# MITC4 질량·축소·stabilization 유도 근거
|
||
|
||
이 폴더는 이전 MFE baseline의 유도·반례 근거다. 현재 구현 계약은 [eigen2](../mitc4-shell-feast-eigen2/README.md)이며 채택·비채택 범위는 그 정식화에서 명시한다. 아래 과거 controls·reference portfolio·pass를 자동 승계하지 않는다.
|
||
|
||
<a id="formulation"></a>
|
||
|
||
<a id="formulation--mitc4-질량행렬과-feast-고유치-정식화"></a>
|
||
## MITC4 질량행렬과 FEAST 고유치 정식화
|
||
|
||
- Feature ID: `mitc4-shell-feast-eigen`
|
||
- Input contract revision: `r2`
|
||
- 요청 outcome: `pass`; 다음 owner: `numerical-review-agent`.
|
||
- 상태: 독립 numerical review 요청이며 자기 승인이나 workflow 전이가 아니다.
|
||
|
||
필수 입력은 [FEATURED_AGENTS](README.md), [PRD](README.md), [ADR](README.md),
|
||
[requirements](README.md), [requirements evidence](README.md),
|
||
[research](README.md), [research evidence](README.md)이다.
|
||
[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../solver-core/README.md), [ARCHITECTURE](../solver-core/README.md),
|
||
[공통 ADR](../solver-core/README.md), [TOLERANCE](../solver-core/README.md), [agent 계약](../solver-core/README.md),
|
||
[문서 소유권](../solver-core/README.md)을 적용했다.
|
||
|
||
<a id="formulation--핵심-계약"></a>
|
||
### 핵심 계약
|
||
|
||
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)에 있다.
|
||
|
||
<a id="formulation--requirement-coverage"></a>
|
||
### 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 |
|
||
|
||
<a id="formulation--evidence와-handoff"></a>
|
||
### 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를 주장하지 않는다.
|
||
|
||
<a id="formulation-mass"></a>
|
||
|
||
<a id="formulation-mass--mitc4-consistent-mass와-nodal-block-lumping-유도"></a>
|
||
## MITC4 consistent mass와 nodal block lumping 유도
|
||
|
||
- Feature ID: `mitc4-shell-feast-eigen`
|
||
- Input contract revision: `r2`
|
||
- 기본 보고서: [formulation.md](formulation.md#formulation)
|
||
|
||
근거는 [research evidence](README.md)의 `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 식은 영향 확인 후 보존했다.
|
||
|
||
<a id="formulation-mass--m1-변수-원형상과-운동학"></a>
|
||
### 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<nu<0.5`와 기존 단일층 등방성 plane-stress 재료를 유지한다.
|
||
모든 입력 및 중간 결과는 finite여야 한다. 여기의 `t`는 두께이며 시간은 `tau`로 쓴다.
|
||
|
||
자연 좌표는 `(xi,eta,zeta) in [-1,1]^3`, source node 순서는
|
||
`(-1,-1),(1,-1),(1,1),(-1,1)`이다. 다음 형상함수와 실제 volume mapping을 사용한다.
|
||
|
||
\[
|
||
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}],
|
||
\quad dV=J\,d\xi d\eta d\zeta. \tag{M1}
|
||
\]
|
||
|
||
`sum Ni=1`, `Ni>=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를 적용하지 않는다.
|
||
|
||
<a id="formulation-mass--m2-strongweak-form과-기존-stiffness"></a>
|
||
### 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/README.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는 없다.
|
||
|
||
<a id="formulation-mass--m3-consistent-matrix와-충분한-quadrature"></a>
|
||
### 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`를 일반식으로 사용하지 않는다.
|
||
|
||
<a id="formulation-mass--m4-계산된-consistent-moment에서-nodal-block-유도"></a>
|
||
### 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를 직접 더하지 않는다.
|
||
|
||
<a id="formulation-mass--m5-보존되는-양과-근사되는-양"></a>
|
||
### 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의 좌표 불변성을 비교한다.
|
||
|
||
<a id="formulation-mass--m6-직접-적분-가능한-평판-oracle"></a>
|
||
### 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를 강제하지 않는다.
|
||
|
||
<a id="formulation-stabilization"></a>
|
||
|
||
<a id="formulation-stabilization--좌표-공변적인-drilling-scale과-적용-경계"></a>
|
||
## 좌표 공변적인 drilling scale과 적용 경계
|
||
|
||
- Feature ID: `mitc4-shell-feast-eigen`
|
||
- Input contract revision: `r2`
|
||
- 기본 보고서: [formulation.md](formulation.md#formulation)
|
||
|
||
승인 근거는 [MFE-ADR-007](README.md),
|
||
`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및 [기존 계약 대체 범위](README.md)다.
|
||
[연구 R07](README.md)의 후보에서 아래 하나를 선택한다.
|
||
식 S1~S8은 FESA 계약에 대한 유도이며 외부 solver의 stabilization과 동일하다는 주장이 아니다.
|
||
|
||
<a id="formulation-stabilization--s1-초기-physical-trace로-고정하는-단일-scale"></a>
|
||
### 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)에 있다.
|
||
|
||
<a id="formulation-stabilization--s2-positive-inventory-유효-geometry와-계산-순서"></a>
|
||
### S2. Positive inventory, 유효 geometry와 계산 순서
|
||
|
||
기존 승인 geometry·director·section·material 검증을 먼저 적용한다. 기존 8개 stiffness
|
||
점에서 `J_g>0,w_g>0`, `t>0,E>0,-1<nu<0.5`이면 `C5≻0`이고 M4에 의해
|
||
|
||
\[
|
||
d_r=(K_{20}^0)_{rr}
|
||
=\sum_g J_gw_g\|C_5^{1/2}\bar B_g e_r\|^2\ge0,
|
||
\quad r=(\alpha_1,\beta_1,\ldots,\alpha_4,\beta_4). \tag{S2}
|
||
\]
|
||
|
||
따라서 S1이 양수인 필요충분조건은 이 여덟 값 중 적어도 하나가 양수인 것이다.
|
||
이는 [기존 요구 034/036](../linear-static-mitc4-shell/README.md)의 유효 physical
|
||
rotation inventory 조건과 같다. 개별 `R_i`가 모두 PD여야 한다는 새 조건은 없다.
|
||
Exact zero diagonal/block도 합에 포함하므로 기존 허용 geometry를 선별해 줄이지 않는다.
|
||
유효 geometry는 noncollinear midsurface를 가지며, 기존 physical kernel의 non-rigid
|
||
positivity 계약상 translation 0인 비영 tangent-rotation field 전체가 zero-energy일 수 없다.
|
||
그 field가 rigid라면 모든 node에서 `c+Omega×X_i=0`이므로 noncollinearity에서 `Omega=c=0`이다.
|
||
이것이 기존 물리 rank 조건과 양의 inventory의 연결이다. Geometry predicate만으로 모든
|
||
왜곡 element의 rank를 검증했다고 주장하지 않고 기존 physical rank/patch 검증을 유지한다.
|
||
|
||
계산·실패 순서는 다음으로 고정한다.
|
||
|
||
1. 기존 순서의 quadrature로 초기 `K20^0`를 완성하고 모든 항의 finiteness를 확인한다.
|
||
Node1→4, 각 node의 alpha→beta 순서로 정확히 여덟 `d_r`를 읽는다.
|
||
2. Negative diagonal은 S2와 불일치하는 numerical stiffness failure다. Zero는 허용한다.
|
||
Nonfinite/negative를 생략·절댓값·0으로 보정하지 않는다. Physical symmetry/PSD의 독립
|
||
검증을 양의 trace 하나로 대체하지 않는다.
|
||
3. `d_max=max_r d_r`를 구한다. `d_max=0`이면 빈 positive inventory failure다.
|
||
그 외에는 고정된 순서의 안정된 합으로
|
||
`k_ref=d_max*((sum_r(d_r/d_max))/8)`을 평가한다. 이는 S1의 동치 계산이며 임의 floor가 아니다.
|
||
Exact 산술에서 괄호는 `[1/8,1]`이므로 유한한 최댓값보다 큰 중간 trace를 만들 필요가 없다.
|
||
4. `k_ref`와 `k_d=10^-3 k_ref`가 각각 finite·strictly positive인지 확인한다.
|
||
Underflow로 0, overflow 또는 invalid가 되면 실패하고 최소 양수로 대체하지 않는다.
|
||
안정된 합도 연산 불능을 감추지 않으며 수치 기준·conditioning은 NR가 고정한다.
|
||
5. Source element/node 순서의 기존 reduction으로 조립한다. 임의의 좌표 회전에 대한
|
||
bitwise equality와 고정 입력·reduction 순서의 결정론은 구분한다. 전자는 NR의 정규화
|
||
congruence 기준을 만족해야 하며 기준 밖 실패를 floating-point라는 말로 수용하지 않는다.
|
||
|
||
Mass나 geometry rank cutoff를 새로 만들지 않는다. 유효한 positive stiffness라도
|
||
표현 범위를 넘는 경우의 numerical failure는 지원 geometry 종류를 축소하는 대체 규칙이 아니다.
|
||
|
||
<a id="formulation-stabilization--s3-독립-재계산한-complete-k와-제약의-공변성"></a>
|
||
### 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다.
|
||
|
||
<a id="formulation-stabilization--s4-linear-rigid-modes와-massless-drilling의-다른-의미"></a>
|
||
### 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는 별개로 요구하지 않는다.
|
||
|
||
<a id="formulation-stabilization--s5-nonlinear-objective-potential와-초기-고정-lifecycle"></a>
|
||
### 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으로 확장하지 않는다.
|
||
|
||
<a id="formulation-stabilization--s6-nr-mfe-001의-새-algebraic-target과-정적-대응"></a>
|
||
### S6. NR-MFE-001의 새 algebraic target과 정적 대응
|
||
|
||
[NR 소유 반례](README.md)의 독립 적분 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의 의미는 합치지 않는다.
|
||
|
||
<a id="formulation-stabilization--s7-대체보존-범위와-필수-verification"></a>
|
||
### 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](README.md)를 따른다.
|
||
새 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 소유다.
|
||
|
||
<a id="formulation-eigen"></a>
|
||
|
||
<a id="formulation-eigen--제약-후-질량-공간-유한-spectrum과-feast"></a>
|
||
## 제약 후 질량 공간, 유한 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](README.md)의
|
||
`S03`~`S08`, `P01`, `R03/R04/R07`를 적용한다. 아래 reduction은
|
||
[r2 scale](formulation.md#formulation-stabilization)로 개선된 원형상 stabilized stiffness와
|
||
**derived lumped mass**의 pencil에 정확히 대응한다. 기존 nonlinear trial tangent와는 별개다.
|
||
|
||
<a id="formulation-eigen--e1-조립-단위-scaling과-실제-global-제약"></a>
|
||
### 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은 같지 않다.
|
||
|
||
<a id="formulation-eigen--e2-nullpositive-basis를-node마다-결정"></a>
|
||
### 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로 확인한다.
|
||
|
||
<a id="formulation-eigen--e3-개선된-stiffness에서-decoupling의-정확한-증명"></a>
|
||
### 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에 적용하지 않는다.
|
||
|
||
<a id="formulation-eigen--e4-일반-schur-식과-비정상-rank의-의미"></a>
|
||
### 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과 다른 문제이며 자동 해석하지 않는다.
|
||
|
||
<a id="formulation-eigen--e5-spd-whitening-복원과-sparsity"></a>
|
||
### 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다.
|
||
|
||
<a id="formulation-eigen--e6-유한-search-interval과-요청-개수"></a>
|
||
### 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<gL<=gU<b0`를 확보한다.
|
||
이는 물리 mass/eigenvalue floor나 zero clamp가 아니다.
|
||
|
||
CSR count `c(a,b)`는 endpoint가 분리된 interval에 대해 Intel `fpm[49]=1`이 반환한
|
||
count와 status다. `c(a0,b0)=n`을 먼저 확인한다. 다음은 finite search의 결정적 규칙이다.
|
||
|
||
1. 모든 count는 원 enclosing lower bound `a0`부터의 prefix count로 평가한다.
|
||
`lo=a0`의 알려진 prefix count는 0, `hi=b0`의 count는 n이다.
|
||
Upper search에서 midpoint `v`의 count가 `N` 미만이면 `lo=v`, 아니면 `hi=v`로 둔다.
|
||
성공한 `hi`와 count를 항상 보존한다. `N<=count<=min(n,2N+8)`인 upper endpoint를
|
||
얻으면 이 최적화를 끝낼 수 있다. 이는 workspace 목표이며 N의 변경이나 mode cap이 아니다.
|
||
2. Cluster 때문에 목표 count로 줄일 수 없어도 `count>=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가 소유한다.
|
||
|
||
<a id="formulation-eigen--e7-feast-경계와-deterministic-실행"></a>
|
||
### E7. FEAST 경계와 deterministic 실행
|
||
|
||
Actual eigenpairs는 `dfeast_scsrgv`로 E6의 `(A,I)` 또는 E6에서 동일하게 scale한
|
||
`(B,I)`를 풀어 구한다. Real symmetric, SPD second matrix, `n>0`,
|
||
`0<m0<=n`, strict finite `emin<emax`를 만족한다. `uplo=U`로 A와 identity mass의
|
||
각 CSR을 전달하며 row/column 증가 순서, duplicate-free, 1-based row pointer,
|
||
terminal `nnz+1`을 검증한다. 두 pattern이 같을 필요는 없다.
|
||
`MKL_INT`, `n`, `nnz+1`, column index와 `n*m0*sizeof(double)`의 변환/곱은 checked다.
|
||
FEAST vendor type과 scratch resource는 private backend에만 있다.
|
||
|
||
Call마다 `feastinit`한 128-entry parameter 배열에서 이번 call의 설정을 채운다.
|
||
CSR check, SPD check를 켜고 subspace-only mode는 끈다. Zero mode에도 적용할 수 있도록
|
||
trace stopping을 사용하고 독립 residual을 반드시 후검증한다. `epsout`만으로 pass하지
|
||
않는다. Contour points, stopping exponent, finite loop bound는 NR가 정한다.
|
||
User initial subspace를 선택하고 고정 seed/명시된 integer generator 및 고정 QR 순서로
|
||
full-column-rank 초기 공간을 만든다. `m0=n`에서는 identity를 쓴다.
|
||
Initial guess가 모든 eigenspace와 충분히 overlap한다는 보장은 없으므로 count/solve/Gram
|
||
검증으로 부족한 projection을 검출한다. Seed를 바꾸며 통과할 때까지 반복하지 않는다.
|
||
Backend의 thread/재현 설정과 seed는 실행 evidence에 기록한다. 동일 source 입력의
|
||
sparse structure, reduction, row 및 diagnostic 순서는 고정하며 repeated mode의 개별
|
||
벡터 방향은 수학적으로 유일하지 않다는 제한을 유지한다.
|
||
|
||
Solve는 `e,res`의 m0 entries와 column-major `x[n*m0]`를 준비하며 첫 m columns만
|
||
소비한다. Count call의 m0는 output count로 overwrite되므로 solve 요청수/실제 allocation
|
||
capacity와 분리한다. 설치 API가 count-only workspace의 작은 용량을 명시하지 않은
|
||
경우 보수적으로 count scratch는 `m0=n`, `x[n*n]`까지 준비하고 count 단계 사이에
|
||
재사용한다. Solve 전 해제할 수 있다. Reference n=3125에서 이 scratch는 약 78.1 MB
|
||
(74.5 MiB)이고 10모드의 실제 solve subspace는 이보다 작다. Count용 보수적 allocation은
|
||
dense Schur와 별개지만 `O(n²)` memory 비용이므로 Planning/Implementation이 peak 및
|
||
shifted sparse factorization fill을 측정한다. Allocation 실패 시 N을 줄이지 않는다.
|
||
|
||
Intel 근거: [API/storage/capacity](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html),
|
||
[C-index parameter와 count](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html),
|
||
[status/endpoint/고립 cluster 주의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html).
|
||
2026-09-06 확인. `info=0` 이외의 빈 interval, 미수렴, subspace 부족, count/inner solver,
|
||
allocation 또는 SPD 실패는 status와 stage를 보존하여 진단한다. Count success는 eigenpair
|
||
success가 아니며, caller의 count authority는 끝까지 `.inp`다.
|
||
|
||
<a id="formulation-eigen--e8-mode-identity-normalization과-상태"></a>
|
||
### 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으로 출력하지 않는다.
|
||
|
||
<a id="formulation-verification"></a>
|
||
|
||
<a id="formulation-verification--질량과-modal-candidate의-검증식-및-numerical-review-인계"></a>
|
||
## 질량과 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](../solver-core/README.md)를 그대로 적용한다.
|
||
|
||
<a id="formulation-verification--v1-공통-scale과-zero-branch"></a>
|
||
### 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을 곱한다.
|
||
|
||
<a id="formulation-verification--v2-질량-rank와-보존-검증"></a>
|
||
### 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를 요구하지 않는다.
|
||
|
||
<a id="formulation-verification--v3-reduction과-full-modal-residual"></a>
|
||
### 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를 확인한다.
|
||
|
||
<a id="formulation-verification--v4-mass-normalization-gram-energy와-rayleigh"></a>
|
||
### 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를 추가하지 않는다.
|
||
|
||
<a id="formulation-verification--v5-rigid-mode-coordinate-및-density-불변식"></a>
|
||
### 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로 만들지 않는다.
|
||
|
||
<a id="formulation-verification--v6-lowest-n-cluster-near-zero와-오류-판정-소유권"></a>
|
||
### 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](README.md)의 10개 singleton family·모두 blocking 계약과
|
||
공통 정책에 따른 실효 mode별 1%는 보존할 근거다. Formulation이 이를 재선택하지 않으며
|
||
r2 영향 재확인은 NR 소유다. V1~V6의 내부 수치 기준은 아직 NR에서 최종 고정하지 않았다.
|
||
Schema 경로/저장 field/public diagnostic 이름은 I/O owner의 계약이다.
|
||
|
||
<a id="formulation-verification--v7-실행-evidence와-남는-위험"></a>
|
||
### 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를 제시해야 해소된다.
|
||
|
||
<a id="formulation-verification--v8-r2-영향-확인과-bounded-evidence"></a>
|
||
### 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은 이 단계에서 미실행이다.
|