854 lines
65 KiB
Markdown
854 lines
65 KiB
Markdown
# 이전 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 |
|