15 KiB
MITC4 독립 수치 검토 evidence
- Feature ID:
mitc4-shell-feast-eigen - Owner:
numerical-review-agent - Input contract revision:
r1 - 기본 보고서: numerical-review.md
- 검토일 / web access date:
2026-09-06
NR-MFE-001 직접 계산 반례
관련 원문은 requirements의 002(기존 kernel 유지),
008(선택 질량의 유한 spectrum 보존), 014(eigen 해석의 coordinate-invariance
evidence)와 V5다.
실제 kernel의
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이었다.
@'
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 소유다.
비충돌 수학 검토
| 대상 | 독립 검토 결과와 한계 |
|---|---|
| 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 해결 전 확정하지 않는다. |
독립 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 실행을 대신하지 않는다.
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 비례식을 잡는다.
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에서 보장된다는 실행 결과로 바꾸지 않는다.
FEAST 독립 source 대조
Intel C 2026.0 URL edition의 parameter 표를
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 정의는 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 문서는
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 값의 승인이 아니다.
재검토 범위
NR-MFE-001 때문에 bounded return을 먼저 수행한다. 아래 항목은 최종 numerical gate 전에 NR가 같은 승인 revision에서 구체적인 수치와 필수 case를 고정해야 하며 미완료로 남긴다.
- 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 완화로 임의 해결하지 않는다.
실행 evidence
다음 read-only 조사 명령은 exit 0이었다. 원본 reference를 쓰거나 실행하지 않았다.
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의 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 변경을 구분했다.