Files
FESADev/docs/mitc4-shell-feast-eigen/numerical-review.md
T
2026-10-04 03:32:59 +09:00

854 lines
65 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 이전 MFE 검산·반례·수치 기준
독립 rational 검산·NR-MFE-001 반례와 당시 판정을 보존한다. 과거 수치 기준을 새 baseline에 자동 적용하지 않는다.
<a id="numerical-review"></a>
<a id="numerical-review--mitc4-질량feast-독립-수치-검토"></a>
## MITC4 질량·FEAST 독립 수치 검토
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 요청 outcome: `pass`
- Next owner: `io-definition-agent`
- Failure classification / blocker: `null`
- 검토일: `2026-09-06`
- 의미: 수학·numerical controls·logical reference readiness의 I/O 인계 요청. Workflow 전이는 Coordinator 소유다.
필수 입력은 [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),
[formulation](formulation.md#formulation)과 연결된 mass/eigen/verification/stabilization 상세 문서다.
[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md),
[공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md),
[agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md)를 적용했다.
<a id="numerical-review--blocking-finding"></a>
### Blocking finding
현재 unresolved blocking finding은 없다. **NR-MFE-001의 r1 실패는 보존하고 r2 수학 계약에서
해소되었음을 독립 확인했다.** 사용자 승인 MFE-ADR-007에 따라 초기 physical rotary trace
평균을 사용하는 [S1~S8](formulation.md#formulation-stabilization)을 검토했다. Positive inventory,
기저·좌표 공변성, partial-BC numerical contribution, linear massless decoupling 및
nonlinear frozen objective potential의 경계가 일관된다.
NR는 기존 R block 값을 기대값 생성에 재사용하지 않고 planar membrane/curvature/MITC
shear work를 직접 적분했다. 동일 물리 URZ-only BC의 Z축 45° 회전 전후
`lambda=23.04222222222223`, 단위 tangent moment의 `thetaZ=0.7233098659465717`로 같다.
Complete K/ML/response/reaction covariance error는 각각
`7.90e-17 / 4.66e-17 / 0 / 1.15e-16`이다.
[원래 실패·r2 독립 재계산과 실제 명령](numerical-review.md#numerical-review-evidence)을 보존한다.
Actual C++/FEAST 실행을 대신한 판정은 아니다.
<a id="numerical-review--고정한-수치검증-계약"></a>
### 고정한 수치·검증 계약
- [Controls C1~C7](numerical-review.md#numerical-review-controls)에 V1~V6의 단위·scale·zero branch와
matrix/mass/null/conditioning/full residual/Gram/energy/rigid/density/coordinate 기준을
고정했다. Physical rank는 analytic BC/director intersection으로만 정하고 tiny positive
mass는 삭제하지 않는다. Frobenius residual 외 operator-scale residual도 필수다.
- FEAST parameter·seed·QR·thread·representation 경계, endpoint guard와
전체 `512` count calls/`3` solve attempts 상한을 같은 상세 문서에 고정했다.
Enclosure/empty-prefix/count/solve-count/Gram/독립 residual을 결합하며 count만으로
무조건 lowest-N completeness를 주장하지 않는다. 요청 N은 항상 `.inp` authority다.
- [필수 cases와 27개 requirement coverage](numerical-review.md#numerical-review-cases)는 독립 mass oracle,
lumping refinement, partial BC/near-null/반례 해소, actual FEAST known spectra,
negative/zero/repeated/cluster/endpoint/capacity/failure, I/O/state 및 기존 static 회귀를
포함한다. 정확한 tests/owned paths/TDD commands는 Planning에 인계한다.
- [Reference-model](reference-model.md)은 원본 input/TXT·모든 10개 Value·singleton
modal-frame family·공통 RMS에 의한 실효 mode별1%와 identity 사전검사를 유지한다.
새 eigen Value-only와 승인된 기존 static U/UR·reaction 회귀의 역할을 분리한다.
Final persistent dataset/schema는 I/O 소유다.
r1의 degree `(4,4,4)` rational mass oracle, 3-point 오차 `1.11e-16`,
positive central inertia·centroid equality, Intel count/trace 및 reference identity 근거는
r2 식의 변경 영향을 확인해 재사용했다. 같은 실험을 새로 실행했다고 보고하지 않는다.
Reference 두 SHA-256은 r2에서도 일치한다. 원본·upstream·source/test/build/phase/Hook/Git를
수정하지 않았고 다른 owner 변경을 보존했다.
<a id="numerical-review--handoff와-잔여-위험"></a>
### Handoff와 잔여 위험
I/O는 고정된 quantity·source/mode/frame·backend/mass·failure 의미와 numerical controls를
minimum syntax 및 additive persistent schema에 연결한다. Planning/Implementation은
case matrix의 관찰된 RED, 전체 configured MSVC x64 Debug suite, actual FEAST runtime,
새 binary의 fresh eigen/reference 및 영향받는 static 회귀 evidence를 생성해야 한다.
이후 Physics/Release가 같은 r2 evidence를 독립 평가한다.
이번 단계의 수학 계산과 문서 정적 검증은 실제 `python -B -`/`git diff --check` exit `0`으로
확인했고 상세 결과는 [evidence](numerical-review.md#numerical-review-evidence)에 있다.
CMake/CTest·Harness·외부 solver·FEAST runtime·FESA reference comparison은 이 stage에서
미실행이다. Ill-conditioned thin/near-aligned mass의 명시적 실패, sampling 밖 geometry
injectivity, FEAST floating-point count/cluster 한계 및 shifted fill/peak memory는
기록된 적용 한계다. 이 한계를 숨기는 cutoff·fallback·tolerance 완화는 허용하지 않는다.
<a id="numerical-review-evidence"></a>
<a id="numerical-review-evidence--mitc4-독립-수치-검토-evidence"></a>
## MITC4 독립 수치 검토 evidence
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 검토일 / web access date: `2026-09-06`
<a id="numerical-review-evidence--nr-mfe-001-직접-계산-반례"></a>
### NR-MFE-001 직접 계산 반례
이 절은 **r1의 실제 실패 evidence**이며 값·계산을 보존한다. r2의 독립 해소 판정은
아래 [r2 공변성 검산](numerical-review.md#numerical-review)에 있다. 기존 실패를 통과로 소급 변경하지 않는다.
관련 원문은 [requirements](requirements.md#requirements)의 `002`(기존 kernel 유지),
`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance
evidence)와 [V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식)다.
실제 [kernel](../../src/fesa/elements/mitc4_shell.cpp)의
`PhysicalTransformation20`(line 488), `DrillingTransformation4`(505),
`Stiffness`의 minimum tangent diagonal(633~653)을 읽기 전용으로 대조했다.
다음은 production 함수를 재호출한 expected value가 아니라 평판 다항식의 직접 적분이다.
Tangent axes `a=(0,1,0)`, `b=(-4/5,0,3/5)`, normal `d=(3/5,0,4/5)`를 둔다.
Node 순서는 `X1=-2a-b`, `X2=2a-b`, `X3=2a+b`, `X4=-2a+b`다.
`a×b=d`, 면적 8, 두께 1이고 constant director·positive Jacobian의 직사각형이다.
단일 element의 geometry-derived director와도 같다. `E=12, nu=0, rho=1`로 둔다.
모든 DOF를 고정하되 node1의 global `URZ` 하나만 free로 한다.
직사각형 `Lx=4,Ly=2`에서 `integral Nx² dA=1/6`,
`integral Ny² dA=2/3`, `|integral Nx Ny dA|=1/4`이다.
`D=Et³/[12(1-nu²)]=1`, `G=6`이며 MITC tying으로 각 nodal rotary
shear square integral은 `A/12`다. 따라서 각 node의 tangent rotary physical block은
\[
R=\begin{bmatrix}49/12&\pm1/8\\\pm1/8&23/6\end{bmatrix},
\quad j=\rho t^3A/48=1/6,\quad k_d=10^{-3}(23/6).
\]
Off-diagonal 부호는 corner의 `Nx Ny` 부호에 따라 달라지고 두 부호 모두 존재한다.
Global `eZ`의 tangent 성분은 `(0,3/5)`이고 drilling 성분은 `4/5`다.
Free mass는 `j(1-dZ²)=0.06>0`이므로 E2는 이 DOF를 삭제하지 않는다.
이 1차원 constrained pencil의 정확한 유한 eigenvalue는
\[
\lambda=\frac{(9/25)(23/6)+(16/25)k_d}{(9/25)(1/6)}
=23+(32/3)k_d.
\]
이제 전체 geometry를 global Z축으로 45° 회전한다. Free axis `eZ`와 모든 나머지
fixed subspace는 그대로이므로 동일 물리 BC가 계속 지원 component BC로 표현된다.
새 director는 `(3/(5 sqrt2),3/(5 sqrt2),4/5)`다. Least-aligned global-axis 규칙의
새 tangent와 회전 전 tangent 사이의 cosine/sine은 `-5/sqrt41,-4/sqrt41`이다.
모든 corner의 두 tangent diagonal 중 최소는 `937/246`으로 달라진다.
Physical `eZ^T Kphys eZ`와 질량은 불변이지만 `kd'=10^-3(937/246)`다.
| 값 | 회전 전 | 회전 후 |
| --- | ---: | ---: |
| `kd` | `0.0038333333333333336` | `0.003808943089430893` |
| `lambda` | `23.04088888888889` | `23.040628726287263` |
상대 차이는 `1.1291343961675893e-5`다. Tangent tie가 반대 axis를 선택해도
모든 corner/두 tangent diagonal의 minimum은 같다. 좌표변환으로 constraints를 바꾼
오류, input explicit director/MPC 기능, mass cutoff 또는 FEAST 오차를 이용한 반례가 아니다.
크기가 외부 tolerance보다 작다는 사실은 내부 coordinate-invariance 항등식의 근거가 아니다.
실행 명령은 아래 read-only here-script, `python -B -`, exit `0`이었다.
```powershell
@'
from math import sqrt
from fractions import Fraction as F
def dot(a,b): return sum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def rot(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
d=(.6,0,.8); a=(0.,1.,0.); b=cross(d,a)
Raa=F(49,12); Rbb=F(23,6); Rab=F(1,8); j=F(1,6)
k0=.001*min(Raa,Rbb)
dp=rot(d); ap0=(1-dp[0]**2,-dp[0]*dp[1],-dp[0]*dp[2])
ap=tuple(v/sqrt(dot(ap0,ap0)) for v in ap0)
u=dot(ap,rot(a)); v=dot(ap,rot(b))
diags=[float(Raa)*u*u+float(Rbb)*v*v+2*c*u*v for c in [-float(Rab),float(Rab)]]
diags += [float(Raa)*v*v+float(Rbb)*u*u-2*c*u*v for c in [-float(Rab),float(Rab)]]
k1=.001*min(diags)
l0=float(Rbb/j)+k0*.64/(float(j)*.36)
l1=float(Rbb/j)+k1*.64/(float(j)*.36)
print(float(k0),k1,l0,l1,abs(l1-l0)/l0)
assert abs(l1-l0)>1e-6
'@ | python -B -
```
이 계산은 기존 C++ kernel 실행 evidence가 아니다. 기존 승인 수식과 source의 계수
규칙이 갖는 mathematical counterexample이다. Runtime 회귀 test는 이후 Planning 소유다.
<a id="numerical-review-evidence--비충돌-수학-검토"></a>
### 비충돌 수학 검토
아래 표는 r1의 검토 기록이다. Mass·geometry·unit·BC·whitening·FEAST의 비충돌 항목은
r2 영향 확인 후 재사용한다. E3의 scalar는 r2 S1로 바뀌며 positivity/decoupling의 재검토와
V5의 complete K/partial-BC 해소는 아래 별도로 기록한다.
| 대상 | 독립 검토 결과와 한계 |
| --- | --- |
| M1/M2 | `S=-[d]x`이므로 `S theta=theta×d`; global DOF `[u,theta]`와 20↔24 transformation의 부호가 일치한다. Shear factor는 mass에 들어가지 않는다. |
| M3~M5 | `C0/C1/C2` 차원은 `M/ML/ML²`; symmetric cross block은 transpose 관계다. Trilinear map의 J degree≤(2,2,2), integrand≤(4,4,4)이므로 3×3×3의 degree5 정확성이 충분하다. |
| Consistent positivity | Positive weights/J에서 quadratic form=0이면 모든 27점에서 Hq=0. Hq는 각 자연좌표 degree≤1이므로 다항식 자체가 0이다. z=0에서 bilinear 독립성으로 모든 ui=0, z 계수에서 `Si theta_i=0`. Null은 정확히 네 drilling이며 physical20은 PD다. |
| M6~M8 | Scalar moment row-sum→nodal block은 partition of unity와 일치한다. Thickness points가 서로 달라 strict Cauchy–Schwarz이고 central inertia>0, rank5다. Tiny nonzero director component를 0으로 만드는 근거는 없다. |
| M9/M10 | Jensen 차이의 1/2 double sum과 kinetic-energy의 추가 1/2를 구분한 식이 맞다. Total mass·spatial first moment·allocated thickness moments는 보존하지만 일반 orbital inertia나 consistent spectrum은 보존하지 않는다. |
| Geometry | 기존 `EvaluateGeometry`는 실제 J>0와 finite reciprocal/frame을 검사한다. 추가 27점에도 같은 predicate를 적용하면 그 점의 부적합을 거부한다. Stiffness 8점과 validation을 바꾸지 않는다. 기존 8점만 통과한 input의 mass failure는 감추지 않으며 전역 injectivity/warp 허용 확대를 주장하지 않는다. |
| E1/E2 | Length congruence의 단위는 맞다. 실제 global free space와 director null의 교집합으로 null dimension을 정하는 조건은 정확하다. Partial BC의 full-rank local mass는 허용되며 near-null은 conditioning failure와 구분해야 한다. |
| E3/E4 | 공통 director와 element별 positive nodal scalar kd로 `KZ=Z diag(kappa)`, `Kpz=0`, `Kzz>0`이 성립한다. Partial BC에 남는 kd를 제거하면 원 pencil을 바꾼다. 일반 Schur 예제의 5/2 대 단순 삭제의 3은 옳고 general dense fallback은 필요하지 않다. |
| E5/E8 | `Mp=LL^T`, `A=L^-1 Kp L^-T`, `phi=DCP L^-T x`는 exact congruence다. Identity B의 FEAST도 actual lumped 문제다. Mass normalization 단위, constrained exact zero 및 candidate commit 의미가 맞다. |
| V1~V4 | 원 assembled free `Kf y-lambda Mf y`를 복원 후 검산해야 null 복원 오류를 잡는다. Mixed-unit norm을 직접 섞지 않고 zero denominator branch를 정의한 식은 일관된다. Gram/energy/residual은 lowest-N completeness를 대신하지 않는다. |
| Rigid/density | 기존 tangent-projected rigid field는 continuum interpolation의 rigid motion을 재현한다. Massless drilling과 6 physical rigid modes는 다르다. Density scaling과 repeated-group projector 정의는 일관된다. Eigen coordinate suite의 적용 범위는 NR-MFE-001 해결 전 확정하지 않는다. |
<a id="numerical-review-evidence--독립-mass-oracle"></a>
### 독립 mass oracle
`rho=3,t=1/2`에서 아래 kernel-level geometry/director fixture를 사용했다.
이는 현재 input의 explicit normal 기능을 추가하는 제안이 아니다. Unit rational directors와
warped coordinates를 이용한 독립 moment 적분 사례다. 전체 patch input 생성이나 기존
geometry validator 실행을 대신하지 않는다.
```text
X = [(-1,-1,1/10), (1,-1,-1/10), (1,1,1/5), (-1,1,-1/10)]
d = [(0,0,1), (3/5,0,4/5), (2/3,1/3,2/3), (0,3/5,4/5)]
```
`fractions.Fraction`으로 coefficient dictionary `(xi power,eta power,zeta power)`를
만들고 M1의 trilinear map을 미분·determinant 전개했다. Monomial integral은 홀수 차수면
0, 모든 차수가 짝수면 `8/[(p+1)(q+1)(r+1)]`다. Production shape/J/mass 함수를
호출하지 않았다. 이 exact rational 결과를 별도의 3-point 및 2-point Gauss 평가와 대조했다.
실제 read-only here-script `python -B -`, exit `0`, wall time 약 `0.52 s`였다.
| 관찰 | 결과 |
| --- | --- |
| 실제 maximum integrand degree | `(4,4,4)` |
| 27점 J 범위 | `[0.12859919221615254, 0.27013414111718076]` |
| 3-point 최대 scalar entry absolute error | `1.1102230246251565e-16` |
| 2-point 최대 scalar entry absolute error | `0.0006018518518518257` |
| `C0_11, C1_11, C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` |
| `sum mi, sum hi, sum ji` | `7743/1600`, `739/12000`, `517/5120` |
| First moment, two independent rational expressions exactly equal | `(-79747/360000, -685951/2880000, 49651/320000)` |
| Minimum nodal `ji-hi²/mi` | `0.022318161338791092 > 0` |
Independent row-sum oracle는 다음과 같으며 C1의 강제 zero나 flat rotary 비례식을 잡는다.
```text
m = [298/225, 1759/1440, 6211/5760, 2333/1920]
h = [3191/192000, 1061/72000, 337/24000, 9323/576000]
j = [5969/216000, 8807/345600, 155527/6912000, 779/30720]
```
현재 수치값은 정식화의 독립 계산 evidence다. C++ test 통과, reference spectrum 통과 또는
양의 J가 전체 volume에서 보장된다는 실행 결과로 바꾸지 않는다.
<a id="numerical-review-evidence--feast-독립-source-대조"></a>
### FEAST 독립 source 대조
Intel C 2026.0 URL edition의 [parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)를
2026-09-06 재확인했다. `fpm[49]=1`은 CSR interval의 total count를 `m0`로 반환하고 flag를
reset한다. Stochastic estimate라는 설명은 없다. 다른 standalone FEAST의 옵션 번호나
확률적 count 설명을 이 API에 대입하지 않는다. 값의 conditioning-independent 정확성은
문서가 보장하지 않으므로 이것만으로 implementation completeness를 승인하지 않는다.
[API의 epsout 정의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html)는
trace 변화량을 endpoint absolute maximum으로 나눈다. 따라서 strict nonzero-width
finite interval이면 zero eigenvalue만 있다는 이유로 trace 분모가 0이 되지 않는다.
Size1, N=n, B=0 문제는 실제 backend test가 여전히 필요하다.
Count scratch와 solve m0를 분리한 E7은 output overwrite와 용량을 혼동하지 않는다.
[Output status 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html)는
endpoint 근접 count failure와 넓은 구간 내 작은 cluster를 놓칠 수 있는 경우를 명시한다.
E6의 enclosure total n, monotone prefix/empty-prefix, safe bracket, multiplicity capacity,
returned count/Gram/full residual을 결합하는 방향은 이 한계를 숨기지 않는다.
Known-spectrum 검증 없는 `info=0` 또는 count만으로 lowest-N를 판정해서는 안 된다.
이 대조는 runtime 통과나 후속 numerical-control 값의 승인이 아니다.
<a id="numerical-review-evidence--재검토-범위"></a>
### 재검토 범위
이 절은 r1의 조기 반환 당시 미완료 목록이다. r2에서는 아래 항목을
[controls C1~C7](numerical-review.md#numerical-review-controls)와
[27개 case·requirement matrix](numerical-review.md#numerical-review-cases)로 고정했다.
이력 목록을 삭제하지 않으며 현재 미완료 수치 계약으로 해석하지 않는다.
- V1~V4의 symmetry/oracle/moment/centroid/Jensen/null/KZ/MZ/PZ/Cholesky/constraint/
full residual/whitened residual/normalization/Gram/energy의 threshold와 zero branch.
- Positive block reciprocal-condition limit, thickness central-inertia cancellation,
tiny nonzero director의 analytic rank 유지와 명시적 ill-conditioning failure.
- Operator-scale near-zero/negative/cluster classification, raw-value 보존과 endpoint ULP
margin, contour/precision/refinement, finite count/search/endpoint/solve-retry budget.
- Deterministic initial integer generator/seed/QR sign·rank 규칙, thread/runtime boundary,
n*m0/nnz/index overflow 및 count scratch/shifted factorization memory 검사.
- 필수 포트폴리오: affine M10와 위 curved moment, Jensen·rigid·density·source identity,
비축정렬/부분 BC/near-null/null dimension, 일반 Schur의 오삭제 반례,
실제 FEAST의 size1/N=n/zero/negative/repeated group>N/tight cluster/endpoint/
insufficient subspace/count mismatch/Gram rank/overflow/allocation failure.
- 요구사항 정합 후 coordinate-invariance coverage와 NR-MFE-001 사례의 정확한 판정 역할.
기존 K 수정, partial BC exclusion 또는 tolerance 완화로 임의 해결하지 않는다.
<a id="numerical-review-evidence--실행-evidence"></a>
### 실행 evidence
다음 read-only 조사 명령은 exit `0`이었다. 원본 reference를 쓰거나 실행하지 않았다.
```powershell
Get-Content .codex/skills/fem-numerical-review/SKILL.md
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness|EvaluateGeometry' src/fesa/elements/mitc4_shell.cpp
rg -n 'CreateShell|nodal_frames|directors' src/fesa/elements/element_factory.cpp src/fesa/model/shell_geometry.cpp
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 90
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
```
`python -B -` read-only inventory script도 exit `0`: `pathlib`와 keyword별 state로
nodes/elements/Set-2를 세고, 모든 nonempty TXT row에 fullmatch regex
`Frame:\s*Mode\s+(\d+):\s*Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)\s*\(cycles/time\)`를
적용했다. `1..10` identity, finite positive Value, 104 unique boundary labels,
유일한 source step 및 input frequency data를 검사했다.
결과는 [reference-model](reference-model.md)의 inventory/hash와 같다.
필수 project/feature/skill reference 문서는 `Get-Content`와 scoped `rg`로 읽었다.
Web `open/find`로 위 공식 Intel 3개 page의 parameter/status/epsout을 확인했다.
Configured vault는 이번 자료의 readiness 조건이 아니므로 추가 조회를 요구하지 않았다.
External solver, production implementation, CMake/CTest, Harness, FEAST runtime 및
FESA-vs-reference 수치 비교는 단계 범위 밖이며 미실행이다.
Owner 경계 밖 파일·Hook state·reference artifact를 수정하거나 stage/commit하지 않았다.
Owned 3개 문서를 read-only `python -B -`로 metadata·상대 링크·trailing whitespace·
final newline·display-math delimiter 검사했다. Exit `0`, documents `3`, local links `35`,
issues `0`이다. 문서에 보존한 반례 코드를 추출해 같은 Python으로 재실행했고 exit `0`,
위 kd/lambda/relative difference가 재현되었다. `git diff --check` exit `0`; 타 owner의
`coordination.md` LF/CRLF warning만 출력되었다. 신규 owned 문서의 whitespace는 위 별도
검사로 확인했다. `git status --short`에서 owned 신규 3개와 Coordinator 변경을 구분했다.
<a id="numerical-review-evidence--r2-독립-공변성-검산"></a>
### r2 독립 공변성 검산
새 [S1~S8](formulation.md#formulation-stabilization)는 초기 physical rotary block의 trace를
사용하므로 각 node의 orthogonal tangent 기저 변화와 SO(3) 회전에 불변이다.
Trace 평균은 PSD inventory에 zero가 있어도 같은 여덟 항을 포함하고, 기존 양의 inventory
전제에서 strictly positive다. Positive kd와 공통 director로 E3의 Kzz>0/Kpz=0을 유지한다.
Partial BC의 numerical contribution을 보존하므로 개선된 원 pencil의 reduction이다.
Nonlinear에서는 초기 scalar의 Dkd=D²kd=0이므로 기존 objective gamma의 first/second
variations에 같은 상수를 곱한다. Positive potential가 모든 상태의 Hessian SPD를 뜻하지
않으며 corotation coupling을 linear Td와 동일시하지 않는다. 기존 accepted branch·moment
work·state lifecycle과 [현재 nonlinear NR](../nonlinear-static-newton-raphson/numerical-review.md)을
대조했고 scale 개선 밖 physics 변경을 발견하지 않았다.
NR는 S7의 R block을 입력으로 재사용하지 않고, rectangle의 membrane/curvature/MITC
edge shear work를 직접 적분하여 **global 24×24 physical K를 독립 구성**했다.
기존 반례와 동일한 geometry에서 director 기반 tangent를 새로 생성해 trace scale을 계산하고
complete K/ML를 만들었다. 회전 뒤에도 새 geometry axes로 처음부터 적분했다.
정적 load는 d에 수직인 (5/3)b이고, 모든 full reaction을 Kq-F로 재계산했다.
실제 read-only command는 아래와 같으며 exit `0`, 약 `0.34 s`였다.
Production C++ 함수, vendor solver, reference 수치를 호출하지 않았다.
```powershell
@'
from math import sqrt, fsum
from fractions import Fraction as F
def dot(a,b): return fsum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def norm(v): return sqrt(dot(v,v))
def Rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
def tangent(d):
k=min(range(3),key=lambda k:(abs(d[k]),k))
a=tuple((1. if j==k else 0.)-d[k]*d[j] for j in range(3))
a=tuple(v/norm(a) for v in a)
return a,cross(d,a)
def action(K,v): return [dot(row,v) for row in K]
def rotate_vector(v): return [x for off in range(0,len(v),3) for x in Rz(v[off:off+3])]
def rotate_matrix(K):
cols=[rotate_vector(col) for col in zip(*K)]
left=[list(row) for row in zip(*cols)]
return [rotate_vector(row) for row in left]
def error(a,b): return norm([x-y for x,y in zip(a,b)])/(norm(a)+norm(b))
def matrix_error(A,B): return error(sum(A,[]),sum(B,[]))
def matrices(ex,ey,d):
# Independent planar polynomial work: membrane, curvature and MITC edge shear.
signs=[(-1,-1),(1,-1),(1,1),(-1,1)]
K=[[0.]*24 for _ in range(24)]
for xi in [-1/sqrt(3),1/sqrt(3)]:
for eta in [-1/sqrt(3),1/sqrt(3)]:
fields=[]
for sx,sy in signs:
Nx=sx*(1+sy*eta)/8.; Ny=sy*(1+sx*xi)/4.
tx=(1+sy*eta)/4.; ty=(1+sx*xi)/4.
for c in range(3): fields.append(([Nx*ex[c],Ny*ey[c],Ny*ex[c]+Nx*ey[c]],[0,0,0],[Nx*d[c],Ny*d[c]]))
for c in range(3): fields.append(([0,0,0],[Nx*ey[c],-Ny*ex[c],Ny*ey[c]-Nx*ex[c]],[tx*ey[c],-ty*ex[c]]))
for i,(mi,bi,si) in enumerate(fields):
for j,(mj,bj,sj) in enumerate(fields):
K[i][j]+=2*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj))
ta,tb=tangent(d); diagonals=[]
for i in range(4):
for t in [ta,tb]:
v=[0.]*24;v[6*i+3:6*i+6]=t
diagonals.append(dot(v,action(K,v)))
kd=fsum(diagonals)/8000.
M=[[0.]*24 for _ in range(24)]
for i in range(4):
for a in range(3):
M[6*i+a][6*i+a]=2.
for b in range(3):
K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b]
M[6*i+3+a][6*i+3+b]=((1. if a==b else 0.)-d[a]*d[b])/6.
return K,M,kd,diagonals
ex=(0.,1.,0.);ey=(-.8,0.,.6);d=(.6,0.,.8)
K,M,kd,diags=matrices(ex,ey,d)
Kr,Mr,kdr,diagsr=matrices(Rz(ex),Rz(ey),Rz(d))
load=[0.]*24; load[3:6]=[5*v/3 for v in ey]; loadr=rotate_vector(load)
q=[0.]*24;qr=[0.]*24;q[5]=load[5]/K[5][5];qr[5]=loadr[5]/Kr[5][5]
reaction=[x-y for x,y in zip(action(K,q),load)]; rr=[x-y for x,y in zip(action(Kr,qr),loadr)]
print('independent rotary diagonals=',diags)
print('kd=',kd,kdr,'expected=',float(F(19,4800)))
print('Kff/Mff/lambda/thetaZ=',K[5][5],M[5][5],K[5][5]/M[5][5],q[5])
print('rotated Kff/Mff/lambda/thetaZ=',Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5])
print('complete K/M/response/reaction covariance errors=',matrix_error(Kr,rotate_matrix(K)),matrix_error(Mr,rotate_matrix(M)),error(qr,rotate_vector(q)),error(rr,rotate_vector(reaction)))
print('load drill projection/free residual=',dot(d,load[3:6]),reaction[5],rr[5])
assert abs(K[5][5]/M[5][5]-float(F(10369,450)))<1e-12
assert matrix_error(Kr,rotate_matrix(K))<1e-12
assert matrix_error(Mr,rotate_matrix(M))<1e-12
assert error(rr,rotate_vector(reaction))<1e-12
'@ | python -B -
```
| 관찰 | 결과 |
| --- | --- |
| 독립 physical rotary diagonals | 각 corner 약 49/12,23/6 |
| kd before/after | 0.003958333333333333 / 0.003958333333333332 |
| Kff, Mff | 1.3825333333333332, 0.05999999999999998 |
| lambda before/after | 둘 다 23.04222222222223 |
| thetaZ per unit moment before/after | 둘 다 0.7233098659465717 |
| Complete K covariance ratio | 7.895168813539929e-17 |
| ML covariance ratio | 4.6611822355981756e-17 |
| Static response covariance ratio | 0 |
| Full reaction covariance ratio | 1.1535337419041683e-16 |
| d dot load / both free residuals | 1.1102230246251565e-16 / 0,0 |
따라서 NR-MFE-001은 **r2 수학 계약에서 해소**되었다. C2/C3/C7 기준을 만족하는
독립 계산 evidence이고 실제 C++/FEAST/기존 정적 회귀의 통과 판정은 아니다.
<a id="numerical-review-evidence--r2-보존변경-audit와-근거"></a>
### r2 보존·변경 audit와 근거
`git diff c8876da --`로 r1 checkpoint와 r2 requirements/research/formulation을 대조했다.
M1/M2/M5~M10, E6~E8, V1~V4의 식은 유지되고 변경은 scale·그 적용 대상·coordinate
coverage와 정적 회귀다. r1 rational mass oracle와 API count/trace·reference identity는
수식 영향이 없어 재계산 없이 재사용한다. Reference 두 SHA-256도 현재 원본에서 재확인했다.
AGENTS, agent/documentation 계약, NR skill 및 TOLERANCE의 같은 checkpoint 대비 diff는 없다.
기존 linear/nonlinear numerical-review/reference-model, r2 requirements 27개와
Research R07을 읽었고, 필요한 current nonlinear tangent test의 perturbation schedule을
확인했다. 최초 검색의 존재하지 않는 `numerical-methods.md` 및
`tests/fesa/elements/nonlinear_mitc4_shell_test.cpp`는 경로 오류였다.
`rg --files`로 실제 `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`를
확인하고 scoped `rg`를 exit `0`으로 재실행했다. 이를 test 실행 실패 또는 성공으로
취급하지 않는다. Source/test 파일은 변경하지 않았다.
새로 확인한 vendor 사실은 thread-local 설정/복원뿐이며
[Intel 2026.0 공식 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)를
2026-09-06 `search_query/open/find`로 확인했다. FEAST count/trace/API는 r1의 primary
근거를 재사용했다. 수치 기준의 선택·단위·근거·zero branch는
[controls](numerical-review.md#numerical-review-controls), 요구별 falsifiable coverage는
[cases](numerical-review.md#numerical-review-cases)에 있고 변경한 외부 tolerance는 없다.
<a id="numerical-review-evidence--r2-최종-정적-검증"></a>
### r2 최종 정적 검증
2026-09-06 workspace root에서 PowerShell here-string을 `python -B -`에 전달한
read-only audit의 실제 exit는 `0`이다. `pathlib`의 UTF-8 읽기, Markdown 상대 링크의
`urllib.parse.unquote`, requirement/case ID의 정규식 집합 대조, `hashlib.sha256`,
위 r2 재현 코드의 `subprocess.run([sys.executable,'-B','-'], ...)`를 사용했다.
문서 owner/revision·마지막 newline·trailing whitespace·표 내부 code span의 pipe escape도
함께 검사했다. 실제 stdout은 다음과 같다.
```text
AUDIT documents=5 local_links=64 requirements=27 cases=27 static_artifacts=8 all_pass
```
문서에서 추출한 공변성 재현 코드의 별도 process exit도 `0`이며 위 표의 모든 수치를
재현했다. 지정 input/TXT의 SHA-256은 reference-model의 두 값과 일치했다.
초기 audit의 exit `1`은 Python 기본 cp949 decode와 링크의 `%20`을 실제 경로로
해석하지 않은 audit-script 문제였다. 명시적 UTF-8과 URL decoding으로 수정해 재실행했으며
제품·reference·수치 기준을 변경하지 않았다.
`git diff --check` exit `0`을 확인했다. 소유 변경은 이 evidence와 numerical-review,
reference-model, controls, cases의 Markdown 5개이며 `coordination.md`의 동시 변경은
Coordinator 소유다. 본 단계에서 C++ build/test, FEAST runtime, 외부 solver 실행,
새 reference comparison은 수행하지 않았다. 이 필수 실행은 case matrix에 따라
Implementation이 새 binary와 r2 계약으로 증명해야 한다.
<a id="numerical-review-controls"></a>
<a id="numerical-review-controls--mitc4-eigen-내부-수치-기준"></a>
## MITC4 eigen 내부 수치 기준
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 적용: IEEE binary64, MSVC x64 Debug, 실제 oneMKL FEAST adapter 및 같은 산술의 내부 검증.
[V1~V6](formulation.md#formulation-verification), [E1~E8](formulation.md#formulation-eigen),
[S1~S8](formulation.md#formulation-stabilization)의 식을 사용한다. 아래 값은 구현 전에 고정한 내부
수치 계약이며 reference fitting 값이 아니다. [외부 판정](reference-model.md)의 공통
tolerance, 기존 nonlinear Newton 종료 기준과 별개다. 실패 결과를 보고 완화하지 않는다.
<a id="numerical-review-controls--c1-scale-공통-zero-branch와-근거"></a>
### C1. Scale, 공통 zero branch와 근거
`ell`, `D`, `Khat/Mhat`, `Kf/Mf`, `A`, `s`, `B=A/s`는 E1/E6대로 사용한다.
같은 비교의 두 행렬에는 같은 ell을 적용한다. Matrix norms는 Frobenius,
vector norms는 Euclidean이며 별도 inf 표기만 infinity norm이다. Mixed force/moment 또는
translation/rotation 원값을 직접 더하지 않는다. Scaled sum-of-squares와 stable ordered sum을
쓰고 finite-first로 검사한다. 모든 ratio는 분모가 양수일 때 계산한다.
`numerator=denominator=0`은 metric 0, `denominator=0,numerator!=0`은 named failure다.
Zero eigenvector, nonpositive modal mass 및 invalid scale은 이 zero-pass의 대상이 아니다.
어떤 branch에도 `max(1,physical_scale)`, mass/eigenvalue floor나 clamp를 추가하지 않는다.
공통 기본값은 `tau_alg=1e-12`, `tau_modal=1e-10`이다. 기존
[linear NR-D02](../linear-static-mitc4-shell/numerical-review.md)의 algebraic/rigid 기준을
유지하며 mass polynomial과 trace의 같은 단위 항등식에도 적용한다.
Unit roundoff `u=2^-53`에서 `gamma_k=ku/(1-ku)`이다. 4096개의 단순 연산을 가정한
`gamma_4096≈4.55e-13`에 비해 `1e-12`는 작은 dense block·27점 적분의 정상 산술 오차를
구분할 여유가 있다. 이는 모든 geometry의 forward-error theorem이 아니다.
Rank·conditioning·원 residual·독립 oracle를 따로 요구한다. 현재 rational oracle 및
r2 covariance 오차는 이 기준보다 충분히 작지만 기준을 그 결과에 맞춰 고른 것은 아니다.
`tau_modal`은 `1e-12` 내부 FEAST stopping보다 100배 큰 후검증 한계다.
외부 1% 판정을 내부 residual 허용값으로 쓰지 않는다. 같은 계산의 재실행 구조/row/
diagnostic 순서는 exact이고, eigenvector의 repeated-basis 비유일성은 C4를 따른다.
<a id="numerical-review-controls--c2-matrix-mass-stabilization와-reduction"></a>
### C2. Matrix, mass, stabilization와 reduction
| ID | Metric / exact predicate | 한계·zero 처리 |
| --- | --- | --- |
| C2-01 | V1 `eta_sym(Q)`; mass·physical K·linear complete K·whitened A | `<=1e-12`; Q=0이면 C1. 대칭 copy 자체만 독립 evidence로 사용하지 않음 |
| C2-02 | V1 `\|\|R-S\|\|F/(\|\|R\|\|F+\|\|S\|\|F)`; congruence, moment→matrix, 직접 적분, Cholesky reconstruction | `<=1e-12`; 단위·같은 scale 필수 |
| C2-03 | Scalar moment entry oracle: `\|Ck_ij-Ck*_ij\|/[m_e(t/2)^k]` | k=0,1,2 각각 `<=1e-12`; positive `m_e=integral rho dV`. Exact C1=0도 이 차원 일치 scale로 검사 |
| C2-04 | Mass total `\|m-m*\|/(\|m\|+\|m*\|)`; uniform translation energy | `<=1e-12`; 각 방향을 따로 검사, trace(Muu)를 총질량으로 쓰지 않음 |
| C2-05 | Shifted spatial first moment difference divided by `m_e ell` | `<=1e-12`; 한 source node를 공통 Xref로 사용. `hi di` 포함 |
| C2-06 | M9 difference vs independent pairwise integral / `(q^T ML q+q^T MC q)` | absolute mismatch `<=1e-12`; raw Delta/scale `>=-1e-12`. Zero motion/drill-only는 C1. Negative roundoff를 값을 0으로 바꾸는 데 사용하지 않음 |
| C2-07 | V2 mass-null action, MZ, KZ | 각각 `<=1e-12`; nz=0은 N/A. 정확한 analytic null만 대상 |
| C2-08 | `\|\|P^T Z\|\|F`, `\|\|[P Z]^T[P Z]-I\|\|F/sqrt(nf)` | `<=1e-12`; 각 node basis의 해당 norm도 `<=1e-12` |
| C2-09 | `mi>0,ji>0,ji-hi²/mi>0`; consistent physical20 및 모든 nonempty Mp nodal block Cholesky | strict, finite. Zero/negative pivot·variance는 실패. Consistent rank20/lumped rank5는 analytic expected rank로 검증 |
| C2-10 | `\|(ji-hi²/mi)-integral rho Ni(z-hi/mi)²dV\|/(ji+hi²/mi)` | `<=1e-12`; `vi/ell²`, `\|hi\|/sqrt(mi ji)`도 기록하며 별도 rank cutoff로 쓰지 않음 |
| C2-11 | S2 여덟 초기 rotation diagonals | 모두 finite `>=0`, 하나 이상 `>0`; zero 포함 분모8. `kd>0` finite. Negative를 허용오차로 0 처리하지 않음 |
| C2-12 | `\|kd'-kd\|/(\|kd'\|+\|kd\|)` 및 직접 trace oracle | `<=1e-12`; global 회전/독립 tangent 재생성 후 계산. Trial별 frozen kd는 exact unchanged |
| C2-13 | E3 `Kzz=diag(kappa_i)`, `kappa_i=sum incident kd,e` | 각 kappa finite `>0`, expected diagonal relation C2-02; Kpz 검사와 원 free residual을 함께 요구 |
| C2-14 | Scaled constrained component norm V3 | `0` exact; 복원한 source constrained entries도 exact zero |
Positive/null dimension은 **E2의 constrained director component exact-zero 교집합**으로만
정한다. Constrained director의 tiny nonzero 성분을 축정렬이라고 반올림하지 않는다.
각 nonempty dimension≤6 scaled nodal Mp에
`rcond_inf = 1/(||Mp||inf ||Mp^-1||inf) >= 2^-32 = 2.3283064365386963e-10`
을 요구한다. 작은 block의 Cholesky triangular solves로 inverse action norm을 구하며
global inverse는 만들지 않는다. Product overflow를 피하는 동치 ratio로 계산한다.
이 조건은 physical rank 변경이 아니라 binary64 whitening의 numerical admissibility다.
64 연산의 `gamma_64/rcond`를 약 `3.06e-5` 이하로 제한하는 최소 guard이며
모든 eigenvalue의 상대 정확도를 보장하지 않는다. Cholesky reconstruction과 full modal
residual을 통과해야 한다. 한계 미만·unresolvable estimate는 conditioning failure이고
좌표 삭제, 더 큰 mass, 다른 solver로 우회하지 않는다. 빈 nodal block은 skip하지만
global n=0 또는 요청 N>n은 명시적 failure다.
<a id="numerical-review-controls--c3-eigenpair-및-물리-내부-판정"></a>
### C3. Eigenpair 및 물리 내부 판정
계산된 c개 **전체** eigenpair를 검사한 뒤 첫 N개만 공개한다. V3/V4의 actual M은 ML다.
| ID | Metric | 한계 |
| --- | --- | --- |
| C3-01 | V1 full original free residual `eta_r`; V3 whitened `eta_w` | 각각 `<=1e-10` |
| C3-02 | 추가 operator-scale residual `rho_B=\|\|Bx-mu x\|\|2/\|\|x\|\|2` | `<=1e-10`; dimensionless. Frobenius norm의 크기로 오류가 희석되는 것을 방지 |
| C3-03 | V3 `eta_norm,i`, pairwise `eta_orth,ij`, `eta_G` | 각각 `<=1e-10`; positive mass를 먼저 확인. Gram full rank는 이 bound와 독립 column 수로 확인 |
| C3-04 | V4 energy/Rayleigh consistency `eta_energy,i` | `<=1e-10`; zero lambda도 C1/V4 분모 사용 |
| C3-05 | V5 rigid K action | 각 6개 field `<=1e-10`; physical rigid mass Gram는 Cholesky 성공, vector 수6. Drill과 혼동하지 않음 |
| C3-06 | `\|c_rho lambda_i'-lambda_i\|/s` 또는 coordinate `\|lambda_i'-lambda_i\|/s` | `<=1e-10`; repeated group 내부 pairing은 C4. 동일 물리 BC·loads 사용 |
| C3-07 | Exact known-spectrum test eigenvalue error / known s | `<=1e-10`이고, 알려진 인접 distinct gap이 있으면 absolute error도 `<=gap/8` |
| C3-08 | Simple/반복군 C4 projector error V5 | `<=1e-6`; 테스트의 해당 군과 나머지 spectrum 사이 known gap은 `>=1e-3 s`로 선택 |
C3-02는 symmetric B에서 computed mu가 실제 spectrum으로부터 residue norm 이내에
있다는 직접 spectral-decomposition bound를 사용한다. 가장 낮은 mode인지, 올바른
multiplicity인지는 증명하지 않으므로 C5 count/endpoint evidence가 별도로 필수다.
FEAST의 `res`는 backend diagnostic이고 C3의 독립 residual을 대신하지 않는다.
Zero eigenvalue에서 backend relative-residual의 분모가 0이면 해당 diagnostic은 unavailable로
기록하고 이유를 남긴다. Raw e/x, 자체 metric 및 최종 scalar 결과는 finite여야 한다.
Undefined backend diagnostic을 physical residual=0으로 바꾸거나 mandatory finite 결과에
NaN을 저장하지 않는다. Trace `epsout`은 strict interval에서 finite여야 한다.
Raw `mu=lambda/s`에서 `tau_zero=1e-9`, `tau_cluster=1e-8`로 고정한다.
`mu<-tau_zero`는 유의한 negative spectrum으로 procedure failure,
`|mu|<=tau_zero`는 near-zero classification, 그 외 양수는 positive다.
Boundary equality는 near-zero에 포함한다. Returned lambda는 부호와 raw 수치를 보존한다.
양수에서만 frequency를 파생하고 exact zero는 f=0, 작은 음수에서는 실수 frequency를
만들지 않는다. C3-02보다 10배 큰 near-zero band와 100배 큰 cluster band는 수치 분류용이다.
양의 작은 mode를 제거하거나 N을 세는 방식에 쓰지 않는다. s/λ의 nonfinite 또는
nonzero mu의 λ 환산 underflow-to-zero는 실패하고 physical scale을 1로 바꾸지 않는다.
<a id="numerical-review-controls--c4-repeated-subspace와-결정론"></a>
### C4. Repeated subspace와 결정론
Raw lambda 오름차순의 stable sort, exact equal tie는 original solver column 순서다.
인접 `|lambda_i-lambda_(i-1)|/s<=1e-8`의 connected group은 diagnostic cluster일 뿐,
distinct 값을 merge/평균하거나 vector를 섞을 권한이 아니다. 알려진 exact repeated 군의
density/rotation tests에서 V5의 mass-whitened projector norm을 사용한다.
Known gap≥1e-3 s와 C3-02이면 first-order invariant-subspace sensitivity는 약1e-7
수준이므로 C3-08의 1e-6은 방향 비유일성을 허용하면서 잘못된 공간을 검출한다.
이 조건 밖 실제 cluster는 raw eigenpair·Gram/residual을 계속 검사하고 특정 개별 vector
방향의 정확도를 새로 약속하지 않는다. Mode shape 외부 comparison은 없다.
Source DOF 순서로 largest absolute scaled global component를 찾고 sign을 양수로
정한다. 동률은 첫 source DOF다. Zero vector는 실패다. 동일 binary/runtime/thread/입력의
세 반복에서는 sparse structure·COO reduction·row/diagnostic identity가 exact 동일해야 한다.
Scalar 재현 오차는 C3-06, repeated vector는 C4를 적용한다. CPU/runtime를 바꾼 bitwise
eigenvalue/vector equality를 요구하지 않는다.
<a id="numerical-review-controls--c5-feast-controls와-bounded-interval-정책"></a>
### C5. FEAST controls와 bounded interval 정책
Actual call은 `dfeast_scsrgv`, `(B,I)`, `uplo='U'`, sorted duplicate-free 1-based CSR다.
각 call은 `feastinit`하고 아래 C-index fpm을 설정한다. 명시하지 않은 값은 해당 설치의
초기값을 유지·기록한다. Private backend를 넘어 vendor type을 노출하지 않는다.
| fpm | 값 | 근거·역할 |
| --- | ---: | --- |
| `[0]` | 0 | Status를 deterministic diagnostic으로 수집 |
| `[1]` | 16 | 공식 허용 contour 값; 기본8보다 적분 resolution에 여유, 모든 attempt 고정 |
| `[2]` | 12 | `1e-12` double stopping; 독립 C3 residual 필수 |
| `[3]` | 20 | 유한 refinement 한계; 미수렴 성공 금지 |
| `[4]` | 1 | 아래 고정 initial subspace 사용 |
| `[5]` | 1 | Endpoint-scaled trace stopping; zero mode에서 C3-02로 독립 검증 |
| `[13]` | 0 | Eigenpairs가 아닌 subspace-only 결과 금지 |
| `[26]`, `[27]` | 1, 1 | CSR validity와 second-matrix SPD check |
| `[49]` | count 1, solve 0 | Total interval count와 실제 eigenpair solve 분리 |
| `[63]` | 0 | 초기 PARDISO 정책 사용; 임의 iparm tuning 금지 |
근거는 [Intel parameter table](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)과
[E7의 API/status 출처](formulation.md#formulation-eigen--e7-feast-경계와-deterministic-실행)다.
Count는 documented total이며 stochastic estimate로 부르지 않는다. 공식 count/status의
floating-point 한계가 있으므로 아래 redundant evidence와 실제 known spectra가 필수다.
Gershgorin 각 off-diagonal absolute sum은 매 덧셈 뒤 `nextafter(+infinity)`로 outward
누적한다. `Bii-ri`/`Bii+ri`도 각각 바깥으로 한 ULP 이동한다. Overflow는 실패다.
`beta=||B||inf`를 같은 outward 방식으로 구한다. Nonzero B에서는 beta>0;
정확한 B=0은 E6의 algorithmic enclosure `[-1,1]`에 대응하여 beta=1로 둔다.
이는 physical mass/λ floor가 아니다. `ulp(v)`는 v의 두 finite adjacent spacing 중 큰 값이며
`delta(v)=1e-8 beta + 64 ulp(v)`
로 정의한다. 초기 endpoints는 `a0=nextafter(gL-16delta(gL),-infinity)`,
`b0=nextafter(gU+16delta(gU),+infinity)`다. Finite strict enclosure와 total count=n을
확인한 뒤 E6의 upper-prefix search와 empty-prefix lower 축소를 한다.
Interior endpoint v를 bracket에 반영하려면 `(a0,v-delta(v))`, `(a0,v)`,
`(a0,v+delta(v))`의 count가 모두 `info=0`이고 같아야 한다. 이 guard count는 eigenvalue
근처의 endpoint를 피하는 추가 evidence다. Guard가 enclosure 밖이면 그 부분은 알려진
outside bound를 이용하며 실제 interval이 strict하지 않으면 평가하지 않는다.
Zero count는 성공 count=0일 때만 믿고 `info=1`을 empty proof로 바꾸지 않는다.
이미 알려진 prefix count와 monotonicity가 맞지 않으면 전체 실패다.
| 제어 | 유한 값 / 정확한 처리 |
| --- | --- |
| Total count API calls | 전체 analysis 최대512. 성공·실패·guard·최종확인·retry 모두 포함 |
| Search optimization | Upper/lower 각각 최대32 midpoint 단계; optimization count calls 최대384로 남은128 예약 |
| Endpoint collision | 같은 midpoint에서 offsets `0,+1,-1,+2,-2,+4,-4` times delta, 이 순서 최대7후보. 현재 bracket 내부 후보만 사용 |
| Search 종료 | E6의 count target `N<=c<=min(n,2N+8)` 또는 폭 `<=8delta(mid)`/새 representable midpoint 없음/위 budget. 마지막 certified c>=N bracket 사용 |
| 최종 확인 | Enclosure 안의 a에 prefix0, b에 prefix c>=N, 두 endpoint guard, actual `(a,b)` count=c. 불일치/예약 budget 부족이면 실패 |
| Initial solve capacity | E6 그대로 `m0=min(n,max(c+8,ceil(3c/2)))`; c=n이면 n |
| Actual solve calls | 최초 포함 최대3; 각 call loops≤20, control/seed 동일 |
| 허용 solver retry | info1/2/3, count/returned-m mismatch 또는 endpoint separation failure만. 저장된 더 넓은 certified bracket으로 확대·재count, `m0=min(n,max(new formula,2*previous m0))` |
| Retry bracket 순서 | Upper search에 저장된 현재 b보다 큰 성공 b를 오름차순으로 선택, lower는 이전의 더 작은 certified prefix0 또는 a0; 최종 fallback은 원 enclosure |
| 금지 retry | Nonfinite eigenpair, wrong Gram/residual, negative spectrum, invalid/SPD/index/allocation/inner-solver 오류는 즉시 실패. Seed·mass·solver·threshold 변경 금지 |
새 유효 bracket이 없으면 같은 실패 call을 무조건 반복하지 않는다. Optimization 한계에서는
이미 certified enclosure를 사용할 수 있지만 실제 solve·최종 count가 실패하면 부분 결과를
공개하지 않는다. Returned m=c, interval 내부와 `mu-a>=delta(a)`, `b-mu>=delta(b)`,
모든 c columns C3 통과를 확인한다. N번째가 cluster 내부여도 전체 c를 검사하고 출력은 N개다.
Bounds·prefix/guard/status/count/m0/m/loop/epsout·chosen ranks 및 모든 실패를 보존한다.
후속 tolerance 완화나 reference Value를 bounds 설정에 사용하는 것은 금지한다.
<a id="numerical-review-controls--c6-initial-subspace-thread와-storage"></a>
### C6. Initial subspace, thread와 storage
Count scratch는 E7의 conservative n×n, identity initial x다. 실제 solve에서 m0=n도
identity다. m0<n이면 uint64 recurrence를 column-major로 한 entry마다 한 번 실행한다.
Seed `0x4D495443344D4645`, `z <- 6364136223846793005*z+1442695040888963407 mod 2^64`,
`x=2*(double(z>>11)*2^-53)-1`이다. Overflow wrap은 이 generator에만 의도적이며
size/index 산술에는 허용하지 않는다. Seed를 바꾸며 성공을 찾지 않는다.
Column ascending의 nonpivoted Householder QR를 사용한다. Scaled norm, `sign(0)=+1`,
`v1=x1+sign(x1)||x||`로 cancellation을 피하고 최종 R diagonal이 양수인 Q를 선택한다.
Original column norm에 대한 `|Rjj|/||input_col_j||2<=1e-12` 또는 zero는 initial-space
rank failure다. Post-QR `||Q^TQ-I||F/sqrt(m0)<=1e-12`를 요구한다. 이것은 모든
eigenspace overlap의 보장이 아니며 C5 count와 C3 Gram/residual이 계속 필요하다.
Backend call 동안 oneMKL thread-local count=1을 설정하고 모든 exit에서 이전 값을 복원한다.
[공식 mkl_set_num_threads_local](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)의
반환 previous setting을 사용한다. 전역 설정을 바꾸거나 vendor workspace를 동시 공유하지
않는다. 설치 runtime/ABI/유효 thread count·seed·controls를 기록한다. Element contribution
병렬 생성은 허용하되 stable reduction 순서는 유지한다.
Mode cap을 임의의 상수로 만들지 않는다. 정량 representation 경계는
`1<=N<=n<=MKL_INT_MAX`, `nnz+1<=MKL_INT_MAX`, 모든 row/column in-range,
`n+1`, `6*nodes`, `n*m0`, `n*n`, 각 `count*sizeof(T)`가 internal index 및
`min(SIZE_MAX,PTRDIFF_MAX)` 안에 있고 해당 container max_size를 넘지 않는 것이다.
곱/합은 overflow 전에 검사하며 double의 정수 근삿값으로 capacity를 계산하지 않는다.
Conservative double n×n scratch는 Win64에서 표현상 n≤`1073741823`이고 실제 사용 가능
메모리 한계는 훨씬 작다. Allocation/factorization 실패는 명시적으로 종료하며 N을 줄이지 않는다.
Reference n=3125의 count x만 `78,125,000` bytes다. 이를 전체 peak memory라고 부르지 않고
CSR, FEAST reduced storage 및 complex shifted sparse fill을 따로 기록한다.
<a id="numerical-review-controls--c7-승인된-정적-회귀-기준"></a>
### C7. 승인된 정적 회귀 기준
새 scale을 적용하되 기존 [linear NR](../linear-static-mitc4-shell/numerical-review.md)의
symmetry/frame/energy `1e-12`, rigid/full residual/global equilibrium `1e-10`을 유지한다.
NR-MFE-001 static response는 C2 congruence `1e-12`와 complete full residual `1e-10`이다.
Static moment admissibility는 기존 `|d·m|/||m||<=1e-12`, zero moment는 별도 branch다.
기존 [nonlinear NR §6](../nonlinear-static-newton-raphson/numerical-review.md)는 그대로다:
rotation/frame 및 no-applied-moment tangent symmetry `1e-12`, directional tangent error
`1e-6`(zero analytical direction `1e-10`), finite-rigid objectivity `1e-10`, factor-one
global force/moment balance 각 `1e-8`. 기존 finite-difference schedule
`[1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7]` 및 interior index3 기준을 유지한다.
근거는 [등록된 tangent test](../../tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp)와
기존 승인 numerical contract다. 새 scale의 Dkd=D²kd=0 및 gamma derivative를 검산한다.
Nonlinear Hessian 전체의 SPD 또는 linear Tdrill과의 entry equality를 추가하지 않는다.
NSNR-069/070의 네 채널·typed zero-scale·100 iteration·no cutback/retry 종료 정책도
기존 계약을 보존한다. 새 eigen C1 zero branch로 해당 승인 typed absolute branch를 덮어쓰지 않는다.
<a id="numerical-review-cases"></a>
<a id="numerical-review-cases--mitc4-eigen-필수-verification-portfolio"></a>
## MITC4 eigen 필수 verification portfolio
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 수치 기준: [controls C1~C7](numerical-review.md#numerical-review-controls)
아래는 Planning이 RED→observed failure→GREEN→focused/full VERIFY에 연결할 **필수
logical cases**다. C++ test 이름·파일과 final schema는 각 owner가 정한다. 새로운 reference
생성/수정 없이 synthetic test inputs는 tests의 승인 소유 경로에 둔다. Expected value를
production mass/reduction/FEAST 함수의 재호출로 만들지 않는다. 이 문서는 실행 결과가 아니다.
<a id="numerical-review-cases--p1-mass좌표조립"></a>
### P1. Mass·좌표·조립
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C01 | Affine rectangle `4×2`, rho=3, t=1/2, parallel unit director. M10: C0=`(rho t A/36)*[4,2,1,2;...]`, C1=0, C2=t²C0/12, node m=3, h=0, j=1/16. Full24와 physical20·각 translation energy·tangent inertia/drill null을 검사. rho×4, t×2의 C0/C2 scaling도 검사 | C2 모든 관련 scalar/matrix/rank 기준 |
| MFE-C02 | [r1 rational warped/director-varying fixture](numerical-review.md#numerical-review-evidence--독립-mass-oracle)의 X,d,rho,t와 exact coefficient/row/first-moment oracle. Independent coefficient integration 또는 별도 고차 direct integration을 사용. C1을 강제0, 2-point mass, flat C2 비례식 mutation은 실패해야 함. 같은 shape/J production 호출만으로 oracle 구성 금지 | C2-02~10; 기존 geometry predicate를 먼저 적용. Custom-director kernel fixture를 input explicit normals 지원으로 확대하지 않음 |
| MFE-C03 | Consistent/moment snapshot을 유지하고 row-sum→lumped 연결 검사. C1/C2의 controlled symmetric perturbation이 원 mass와 derived block에 모두 반영됨. Independent nodal `integral rho Ni Gi^T Gi` 및 고정 velocities의 pairwise Jensen work와 비교. Uniform translation, drill-only, nonuniform translation, tangent rotation을 각각 검사 | C2-02~10; nonnegative kinetic energy, zero branch 및 총질량·centroid 보존 |
| MFE-C04 | Square `[-1,1]^2`, rho=t=1, uniform m×m grid m=1,2,4, velocity `(x,0,0)`, theta=0. Direct polynomial gives `q^T MC q=4/3`, `q^T(ML-MC)q=8/(3m²)`. Independent constant velocity의 두 energy는 모두 총질량4 | Exact sequence에 C2-03/04/06. 이는 이 smooth field의 lumping error 검산이며 일반 spectrum 수렴 차수 약속 아님 |
| MFE-C05 | C01/C02의 global proper rotation과 origin translation. Q는 rational proper rotation `[[0,-1,0],[3/5,0,-4/5],[4/5,0,3/5]]`, shift=(7,-3,5). Geometry/director/frame/mass를 새로 계산. Scalar full-row lumping이 실패하는 d=(1,1,1)/sqrt3도 사용 | 두 mass congruence와 kinetic work C2-02; moment는 common Xref, drilling null 보존 |
| MFE-C06 | 공유 node·서로 다른 rho/thickness section의 shell patch. Element 순서와 source labels가 다른 입력의 대응 결과, sequential/병렬 contribution 및 stable reduction을 검사. 실제 constraints와 source indices를 독립 expected map으로 대조 | Exact structure/order/identity, C2 matrix equality. Input permutation 자체와 fixed source-order determinism을 구분 |
| MFE-C07 | rho=0/negative/NaN/Inf/missing/duplicate/unresolved/dependent, invalid t/material, inverted/degenerate/기존 미지원 geometry 및 27점 중 invalid evaluation을 각각 거부. Density가 없는 기존 static case는 허용 | Semantic/geometry/model failure, 상태·output 미반영. Mass zero 우회 금지 |
<a id="numerical-review-cases--p2-stabilizationpartial-bc정적-영향"></a>
### P2. Stabilization·partial BC·정적 영향
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C08 | [NR-MFE-001 원 rectangle](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례)와 Z45° 회전. S1을 새 frame에서 계산. Expected kd=19/4800, Mff=3/50, Kff=10369/7500, lambda=10369/450. 모든 DOF fixed, node1 URZ만 free. Old min rule은 이 case를 실패시켜야 함 | Complete K·두 mass·kd congruence C2, exact eigenvalue C3-07, 원 free residual. Full-free/clamp 대체 금지 |
| MFE-C09 | C08에 admissible moment `m=(5/3)M0 b`, M0=1, b=(-4/5,0,3/5). 각 geometry에서 load도 변환. Expected thetaZ=7500/10369. 원 full `Kq-F`의 모든 reaction 성분을 회전해 비교 | C7 static response/full residual/reaction covariance, physical moment projection<=1e-12 |
| MFE-C10 | Eight diagonal inventory `[0,0,2,4,0,6,0,4]`이면 kref=2,kd=.002. All-zero, 한 negative, NaN/Inf는 failure. DBL_MAX 근방 양성 inventory는 scaled mean이 가능한 경우 finite; subnormal kd underflow는 failure. Independent node별 tangent changes O angles=(0,pi/6,pi/4,pi/3)에서도 trace 동일 | C2-11/12; 분모8 고정, clamp/positive-only mean/min 금지 |
| MFE-C11 | Free affine element와 smooth patch의 세 rigid translation·세 tangent-projected rigid rotation. Pure drill은 별도 4개. Physical K20 rank14, consistent physical mass rank20, complete K24 rank18/nullity6; positive-space dimension20. Full massless reduction 후 six near-zero physical modes가 남음 | C2/C3 analytic rank·rigid K action·mass Gram; drill에 관성을 주거나 physical zero mode 삭제 금지 |
| MFE-C12 | 기존 nonlinear fixture에서 초기 scale=S1, trial/commit/rollback에 exact unchanged. 기존 objective gamma potential의 first/second directional variations, finite rigid motion, linear physical limit, physical recovery 제외와 reaction conversion | [기존 nonlinear 계약](../nonlinear-static-newton-raphson/numerical-review.md) 및 C7. Trial scale 재선정·nonlinear Hessian SPD·linear Td entry equality를 요구하지 않음 |
<a id="numerical-review-cases--p3-실제-bcmass-whiteningfeast"></a>
### P3. 실제 BC·mass whitening·FEAST
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C13 | Nodal M6 h=0,m=j=1의 manufactured block. d=(0,0,1), d=(3/5,0,4/5), d=(1,1,1)/sqrt3에 full free, URX fixed, URZ only free, all rotations fixed, drill-only free, fully constrained 조합. 조합은 Cartesian product가 아니라 지원되는 global component BC로 표현 가능한 경우만 적용하며, drill-only free는 d=(0,0,1)에서 URZ만 free이고 나머지5 DOF constrained인 경우로 한정한다(MPC 없음). Expected null은 constrained director 성분의 exact-zero 교집합. Mixed nodes에는 local finite rank0가 있어도 다른 finite node 보존 | E2 analytic dimension, C2-07~14, recovered source mask. Global n=0 또는 N>n은 failure |
| MFE-C14 | `d=(2p/(1+p²),0,(1-p²)/(1+p²))`, p=1/2000와1e-8. m=j=1,h=0; URX만 fixed, 세 translation과 URY/URZ free. 첫 case positive rank5와 conditioning pass; 두 번째는 여전히 analytic rank5이나 conditioning/Cholesky failure. p=0은 정확한 null1 | C2 rcond cutoff의 양옆 및 exact equality branch. Tiny positive mass를 rank4로 바꾸는 구현은 실패 |
| MFE-C15 | 독립 singular pencil K=[[6,2],[2,4]], M=diag(2,0)에서 finite lambda=5/2,z=-p/2. 단순 삭제의3은 오답. Production shell projection path에 nonzero Kpz 또는 nonpositive Kzz 주입 시 실패. 일반 dense Schur 기능을 구현할 필요 없음 | Original residual oracle와 E3 admissibility rejection, 임의 fallback 금지 |
| MFE-C16 | SPD nodal whitening `M=[[2,1],[1,2]]`, `K=[[6,4],[4,6]]`의 eigenvalues 2,10/3. Dense inverse 없이 congruence·복원·original-M normalization. 같은 eigenvectors에 틀린 lambda·mass variant·null coordinate/constraint를 각각 주입 | C2/C3, injected wrong pairing/mass/full residual이 실패해야 함 |
| MFE-C17 | Actual FEAST diagonal known spectra: n1 λ=2,N1; `[0,0,0,2,5,9]`에 N1/4/6; `[1,2,4,8]` N1/2/4; n4 all-zero N1/4. 요청 N은 별도 input count이고 count output과 분리 | C3/C5, lowest N/multiplicity/zero/N=n, count/guard/solve history; mock만으로 대체 금지 |
| MFE-C18 | Actual FEAST n64 spectrum: 앞40개 λ=1, 나머지 λ=2..25, N1 및N41. n4 tight spectrum `[1,1+2^-28,1+2^-27,8]`, N2. B=Q diag(lambda) Q^T의 dense-pattern test도 추가; Q는 고정 Givens(pi/6,pi/4) 곱 | C3-07/08, repeated group>N에서 c/m0가 N보다 커짐, 전체 c Gram, partial cluster merge 금지 |
| MFE-C19 | Actual backend에 `[ -2,0,3 ]`, `[ -1e-12,0,1 ]`. Backend raw negative 보존; procedure는 첫 spectrum의 유의한 음수 실패, near-zero negative는 classification·frequency-validity/raw 보존. Exact `±tau_zero*s` 및 그 양옆은 arithmetic/injection 경계 test | C3 분류와 실패 보존. 부적합 물리 K를 accepted shell이라고 주장하지 않음 |
| MFE-C20 | Density×4에서 두 M×4, λ/4, normalized vector amplitude 1/2; C08과 simple/repeated known-spectrum fixture 사용. 길이×1024, rho/1024³,E/1024,t×1024의 일관 단위 변환에서도 λ 불변 | C2/C3/C4; baseline s·same physical BC, 단위 mixing/floor 검출 |
| MFE-C21 | Endpoint=eigenvalue collision, prefix0 반환, nonmonotone count, total!=n, m!=c, info1/2/3/4/-1..-5/200..202·invalid fpm, missing/duplicate/nonfinite CSR, B-not-SPD를 각각 주입. QR rank/Gram failure·insufficient capacity·nonfinite pair·wrong residual도 주입 | C5의 정확한 retry 대상·budget/최종 failure. Error를 empty interval 또는 부분 성공으로 바꾸지 않음 |
| MFE-C22 | 실제 operator에 near endpoint/repeated cluster의 C5 history 검증과 adapter-mock count-call512/solve-call3 최대 경계, budget 직전 certified bracket fallback. Index/nnz+1/n²/n*m0 overflow 및 allocation 실패 injection | 정수 exact checks, 유한 종료, controlled failure. 큰 메모리를 실제 할당해 실패시킬 필요 없음 |
MFE-C17/18 actual FEAST case에서 bounds를 expected eigenvalues로 설정하지 않는다.
Production E6/C5 search를 실행하고 independent diagonal spectrum의 prefix count와
postsolve 결과로 history를 검증한다. Synthetic rotated pencil은 sparse CSR에 전 dense
pattern을 저장할 수 있지만 다른 eigensolver로 expected values를 계산하지 않는다.
False count/solve success가 lowest-N를 검증하지 못하는 mock도 포함해 missing low eigenpair를
Gram/residual만으로 성공시키는 경로를 잡는다.
<a id="numerical-review-cases--p4-ioreference운영-closure"></a>
### P4. I/O·reference·운영 closure
| Case ID | 필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C23 | 원본 input의 density/section mapping·S4/S4R common physical path·Step-2/N10·blank bounds·Lanczos/SIM/acoustic-free no-op·mass normalization. Unsupported fields, prior step/preload, nonzero BC, damping/acoustic/mixed elements는 fail-closed | I/O가 fixed syntax allowlist·진단으로 구체화. Source count와 actual FEAST count/backend 구분 |
| MFE-C24 | Source renumbering과 output self-check; logical mode/source identity·lambda dimension·actual mass/backend·candidate를 HDF5에서 복원. 기존 final hash/accepted state를 준비하고 solve/validation/write/close/replace failure 주입 | 정확한 schema는 I/O 소유. 모든 failure에서 계약 범위의 이전 state/final 보존, log는 별도 lifecycle |
| MFE-C25 | [새 eigen reference](reference-model.md) 10개 Value, 10 singleton families, comparator prechecks/1% RMS·5% row·near-zero·zero-scale inclusive 경계. Equal values의 distinct IDs와 reordered TXT는 허용, missing/extra/duplicate/NaN/Inf/wrong quantity/mass/schema는 실패 | 공통 policy 그대로, 모든 Value blocking. Actual FESA fresh binary 결과로 실행 |
| MFE-C26 | 아래 기존 linear/nonlinear static portfolio·configured 전체 regression suite·새 warning 없음. Density 없는 기존 static, source mapping·partial-BC response·Newton objective/tangent·평형·reaction·energy·rollback | C7와 기존 reference identity/policy. Old kd 수치 equality는 대체하되 다른 기준 유지 |
| MFE-C27 | RED가 변경 동작 때문에 실패했는지 확인, GREEN/focused/full MSVC x64 Debug CMake/CTest 실제 exit, actual FEAST/backend identity, fresh reference timestamps/hashes. 세 반복 구조/order/diagnostic 및 scalar 재현성 | C4, 전27개 requirement evidence 및 동일 r2 Physics/Release closure. 누락·실패·stale를 통과 처리 금지 |
기존 정적 포트폴리오의 원본 목록은
[Requirement evidence](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity)와
[현재 nonlinear reference-model](../nonlinear-static-newton-raphson/reference-model.md)이다.
`shell`/`shellNL`/`shellNL-meshfine`의 해당 `.inp`와 같은 폴더의 원본
`<stem> displacements.csv`, nonlinear의 required review-only reactions를 그대로 사용한다.
Linear `shell-s4`와 `shell-s4-linear-limit`는 같은 input의 서로 다른 검토 역할이며
같은 fresh solve를 재사용할 수 있어도 각 identity/회귀 증거를 생략하지 않는다.
U1/U2/U3는 global length blocking, UR1/UR2/UR3는 fixed-initial global rotation-vector
warning-only이며 같은 step/accepted state·case·dimension·coordinates·impact별 공통 family다.
Nonlinear RF1/RF2/RF3와 physical spatial RM1/RM2는 기존 source-key·finite·inventory 및
error/RMS report를 유지하는 review-only다. RM3/stress는 기존 numerical gate에 넣지 않는다.
Factor-one 내부 force/moment equilibrium은 별도 blocking이고 C7를 따른다.
`shellnl-meshfine-02-s4-final`의 post-closure 역할은 그대로 유지하며 등록 suite의 해당
실행·영향 evidence를 기록한다. 과거 세 case의 closure로 소급 합치지 않는다.
Root가 관찰한 중단 baseline/단독 재현/나머지 pressure tests는 새 binary 전체 suite의
성공 evidence가 아니다. Reference 테스트의 HDF5 cache가 이전 library보다 새롭다는
이유로 옛 solve를 재사용하지 않았는지 확인하고, r2 영향을 받는 final comparison은 새 binary의
fresh solve evidence로 남긴다. Reference input/results를 수정하거나 Hook state를 조작하지 않는다.
<a id="numerical-review-cases--requirement-coverage"></a>
### Requirement coverage
아래 전 행의 접두사는 `FEM-REQ-MITC4-EIGEN-`이고 모두 `must`다.
Mapping은 acceptance intent를 복제하지 않으며 [requirements](requirements.md#requirements)가 원본이다.
| Requirement suffix | 필수 cases |
| --- | --- |
| 001 | MFE-C23, MFE-C25 |
| 002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 |
| 003 | MFE-C06, MFE-C07, MFE-C23 |
| 004 | MFE-C01, MFE-C02, MFE-C07 |
| 005 | MFE-C01, MFE-C02, MFE-C03 |
| 006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 |
| 007 | MFE-C06, MFE-C13, MFE-C27 |
| 008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 |
| 009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 |
| 010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 |
| 011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 |
| 012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 |
| 013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 |
| 014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 |
| 015 | MFE-C23, MFE-C25 |
| 016 | MFE-C07, MFE-C21, MFE-C23 |
| 017 | MFE-C24, MFE-C25 |
| 018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 |
| 019 | MFE-C21, MFE-C22, MFE-C24 |
| 020 | MFE-C25, MFE-C26 |
| 021 | MFE-C25 |
| 022 | MFE-C25 |
| 023 | MFE-C27 |
| 024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 |
| 025 | MFE-C27 |
| 026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 |
| 027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 |