diff --git a/docs/mitc4-shell-feast-eigen/ADR.md b/docs/mitc4-shell-feast-eigen/ADR.md index bf9c0fb..cbdb41c 100644 --- a/docs/mitc4-shell-feast-eigen/ADR.md +++ b/docs/mitc4-shell-feast-eigen/ADR.md @@ -61,3 +61,12 @@ - 근거: [Formulation 핵심 계약](formulation.md#핵심-계약), [mass M1~M10](formulation-mass.md), [eigen E1~E8](formulation-eigen.md). - 영향: 곡면 coupling 및 mass/centroid·energy 차이를 명시하고 인공 drilling mass와 일반 dense Schur는 도입하지 않는다. Numerical Review는 수식·conditioning·FEAST controls·reference 준비를 독립 검토한다. - 남은 검토: [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)의 기존 basis-dependent stabilization 한계와 `FEM-REQ-MITC4-EIGEN-014` coordinate-invariance coverage 관계를 NR가 명시적으로 확인해야 한다. 이 기록으로 acceptance 범위를 조용히 좁히지 않는다. + +## MFE-ADR-007 — 기존 stabilization과 좌표 불변성 acceptance 정합 + +- 상태: 미결정; Requirement owner의 intent 검토 중. 사용자 critical 결정 여부도 아직 판정 전이다. +- 발견 owner: numerical-review-agent; requirement intent owner: requirement-agent; 기록 owner: coordinator-agent. +- 근거: [NR-MFE-001](numerical-review.md#blocking-finding), [재현 가능한 반례](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례). +- 발견: 동일 물리 partial rotation BC를 유지한 회전에서 기존 basis-dependent `kd=min(tangent diagonals)` 때문에 고유치가 상대 `1.1291343961675893e-5`만큼 달라진다. 새 mass 또는 analytic reduction의 확인된 결함은 아니다. +- 다음 판단: `FEM-REQ-MITC4-EIGEN-002/008/014`의 보존·검증 의미를 Requirement owner가 함께 검토한다. 기술적으로 해소 가능한 기존 intent와 제품 acceptance 변경이 필요한 선택을 구분하여 반환한다. +- 경계: Coordinator/NR는 기존 stiffness 수정, partial BC 지원 제외, invariant 실패의 diagnostic 강등 또는 tolerance 완화로 해결하지 않는다. 필요하면 실제 critical 대안·영향·권고만 사용자에게 요청한다. diff --git a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md index 9619d18..1c17ca2 100644 --- a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md +++ b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md @@ -33,13 +33,16 @@ Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실 | [PRD.md](PRD.md) | coordinator-agent | r1 | 사용자 요구 요약 | | [ADR.md](ADR.md) | coordinator-agent | r1 | 후속 결정 기록 | | [coordination.md](coordination.md) | coordinator-agent | r1 | workflow 상태 원본 | -| [requirements.md](requirements.md) | requirement-agent | r1 | Coordinator gate pass; 26개 must 요구사항 | +| [requirements.md](requirements.md) | requirement-agent | r1 | 26개 must; NR-MFE-001에 따른 002/008/014 intent 재검토 | | [requirements-evidence.md](requirements-evidence.md) | requirement-agent | r1 | 원본 관찰·결정·정적 evidence audit 완료 | -| [research.md](research.md) | research-agent | r1 | Coordinator gate pass; primary source coverage | -| [research-evidence.md](research-evidence.md) | research-agent | r1 | 수식 후보·API·한계·verification 근거 audit 완료 | -| [formulation.md](formulation.md) | formulation-agent | r1 | Coordinator gate pass; 독립 NR 인계 | +| [research.md](research.md) | research-agent | r1 | primary-source 근거 보존; 014 coverage 영향 부분 stale | +| [research-evidence.md](research-evidence.md) | research-agent | r1 | 수식/API 근거 보존; R06 좌표 검증 coverage 부분 stale | +| [formulation.md](formulation.md) | formulation-agent | r1 | 수학 계약 보존; 014 acceptance coverage 부분 stale | | [formulation-mass.md](formulation-mass.md) | formulation-agent | r1 | M1~M10·적분·lumping·보존량 수학 계약 | | [formulation-eigen.md](formulation-eigen.md) | formulation-agent | r1 | E1~E8·제약/null·FEAST·복원 수학 계약 | -| [formulation-verification.md](formulation-verification.md) | formulation-agent | r1 | V1~V7·검증식·NR 수치 기준 인계 | +| [formulation-verification.md](formulation-verification.md) | formulation-agent | r1 | V1~V7 보존; V5 coordinate-invariance coverage stale | +| [numerical-review.md](numerical-review.md) | numerical-review-agent | r1 | return-upstream; NR-MFE-001, gate 미통과 | +| [numerical-review-evidence.md](numerical-review-evidence.md) | numerical-review-agent | r1 | 재현 반례·mass oracle·API 근거 보존 | +| [reference-model.md](reference-model.md) | numerical-review-agent | r1 | artifact/logical readiness 확인; 전체 NR gate 미통과 | 아직 작성되지 않은 specialist 보고서는 목록에 승인 산출물로 등록하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/PRD.md b/docs/mitc4-shell-feast-eigen/PRD.md index 87e659d..ded3fc5 100644 --- a/docs/mitc4-shell-feast-eigen/PRD.md +++ b/docs/mitc4-shell-feast-eigen/PRD.md @@ -3,7 +3,7 @@ - Feature ID: `mitc4-shell-feast-eigen` - Owner: `coordinator-agent` - Input contract revision: `r1` -- 검토 상태: requirements·research·formulation r1 gate pass; 독립 numerical/reference review 진행. +- 검토 상태: NR-MFE-001로 numerical-review gate 미통과; Requirement owner가 기존 stabilization 보존과 coordinate-invariance acceptance 의도를 정합 중. 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md). 지역 지침과 문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)를 따른다. @@ -42,4 +42,7 @@ Reference는 선행 preload 없는 단일 frequency step의 10모드이며 상 두 질량 계산의 연결에 관한 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)는 사용자 후속 요구로 확정되었다. 실제 FEAST mass는 [MFE-ADR-004](ADR.md#mfe-adr-004--feast에-사용하는-질량행렬)에 따라 lumped로 승인되었다. 상세 lumping 수식은 Research/Formulation owner가 정의한다. Primary-source 근거와 적용 한계는 [research](research.md), 상세 근거는 [research-evidence](research-evidence.md)에 있으며 최종 수식·수치 기준의 승인을 대신하지 않는다. -구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md)에 있다. 수치 acceptance 및 reference readiness는 NR 판정 전이다. +구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md)에 있다. 내부 수치 기준은 미확정이다. +[Reference artifact·logical readiness](reference-model.md)는 확인했지만 전체 NR gate는 통과하지 않았다. +NR의 [blocking finding](numerical-review.md#blocking-finding)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계다. +사용자가 확정한 질량 계산 흐름·FEAST 사용 mass·입력 N·외부 Value-only 범위는 유지한다. 이 발견을 근거로 강성이나 acceptance를 이미 변경했다고 해석하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/coordination.md b/docs/mitc4-shell-feast-eigen/coordination.md index 8cec70b..fd1fbad 100644 --- a/docs/mitc4-shell-feast-eigen/coordination.md +++ b/docs/mitc4-shell-feast-eigen/coordination.md @@ -3,13 +3,15 @@ - Feature ID: `mitc4-shell-feast-eigen` - Owner: `coordinator-agent` - Contract revision: `r1` (사용자 최종 질량 요구를 반영한 requirements baseline) -- Stage: `numerical-review` -- Outcome: `pass` (formulation gate; 독립 numerical 판정 전) -- Next owner: `numerical-review-agent` -- Attempt: `0` +- Stage: `requirements` +- Outcome: `return-upstream` (NR-MFE-001) +- Next owner: `requirement-agent` +- Attempt: `1` (numerical-review r1의 해당 failure 관찰 횟수) - Completion: 미완료 -- Failure classification / retry key: `null` -- Escalation class / blocker: `null` +- Failure classification: `upstream-contract` +- Retry key: `mitc4-shell-feast-eigen|numerical-review|upstream-contract|r1` +- Escalation class: `null` +- Blocker: `NR-MFE-001` — 기존 stabilized pencil 보존과 REQ-014 eigen coordinate-invariance acceptance intent 정합 필요. 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), [SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md). @@ -24,6 +26,7 @@ | requirements r1 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md), MFE-ADR-002/004 사용자 명시 결정 | pass; 26개 must와 owner/revision/hash 검증, 미결정 0 | | research r1 | [research](research.md), [primary-source 상세 근거](research-evidence.md) | pass; primary source 11개 그룹·프로젝트 근거2개, 26개 requirement coverage 및 API 보장 한계 확인 | | formulation r1 | [기본 수학 계약](formulation.md), [mass](formulation-mass.md), [eigen](formulation-eigen.md), [verification](formulation-verification.md) | pass; owner/revision/상세 수식·26개 coverage·정적 evidence 확인, 독립 수치판정은 NR 소유 | +| numerical-review r1 | [NR verdict](numerical-review.md), [반례·독립 evidence](numerical-review-evidence.md), [reference-model](reference-model.md) | return-upstream; NR-MFE-001, 전체 internal controls 미확정, gate 미통과 | 공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다. 확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다. @@ -32,6 +35,17 @@ Root의 시작 Git 조사에서 worktree clean을 확인했다. 구현·build/te ## 현재 bounded dispatch +NR owner의 실제 보고서 3개와 `return-upstream` envelope를 확인하여 정확한 Requirement owner로 반환한다. +같은 지원 partial BC를 보존한 45도 회전의 직접 계산에서 `lambda=23.04088888888889 -> 23.040628726287263`, +상대차 `1.1291343961675893e-5`가 재현되었다(`python -B -`, exit `0`). 기존 `kd` 규칙과 REQ-014의 acceptance intent 사이의 발견이다. +NR의 independent rational mass oracle, Intel API/count/trace 검토와 reference 원본/10-mode logical readiness evidence는 보존한다. +Owner 정적 검사는 3문서/35 local links/issues0, exit `0`; 수치 reference comparison·FEAST runtime·구현은 미실행이다. +`014`에 영향을 받는 research R06 coverage와 formulation V5/coverage를 부분 stale로 표시하고, 나머지 수학·reference evidence는 향후 revision 영향 검토 후 재사용한다. +Requirement owner는 기존 literal intent의 기술적 정합 가능성과 실제 critical acceptance/physics 선택을 구분한다. 새로운 사용자 결정을 이미 필요하거나 승인된 것으로 표시하지 않는다. +이번 건은 upstream 계약 문제이며 Implementation/Correction Agent로 보내지 않는다. Correction 및 transport 재시도 budget은 사용하지 않았다. + +### Numerical-review 이력 + Formulation owner의 r1 `pass` envelope와 실제 기본/상세 문서 4개를 감사하여 numerical-review로 전이한다. Owner 정적 검사는 `4`문서, `38` local links, requirement coverage `26`, issues `0`, `python -B -` exit `0` 및 `git diff --check` exit `0`이다. Coordinator는 모든 상세 문서의 metadata·수식/단위/identity/오류/검증/한계 절과 링크를 읽고 필수 항목 존재를 확인했으며 수학적 correctness verdict를 대신하지 않았다. @@ -39,6 +53,7 @@ NR는 수학 correctness와 reference-model readiness를 모두 검토하고 명 Root의 두 독립 감사 포인트를 필수 handoff로 포함한다: count 기능의 실제 API 보장보다 강한 completeness를 주장하지 않을 것; 기존 basis-dependent drilling stabilization과 `FEM-REQ-MITC4-EIGEN-014`의 coordinate-invariance coverage 관계를 명시하여 acceptance의 조용한 축소를 막을 것. 현재 새 사용자 미결정이나 implementation correction은 없다. +Formulation checkpoint는 Root가 `2c3a86a` (`docs: define MITC4 mass and FEAST formulation`)로 8개 exact paths를 커밋했고 이후 clean을 확인했다. ### Formulation 이력 @@ -117,6 +132,10 @@ Root는 global environment, Hook state/code를 변경하지 않았다. 추가 Root read-only 확인: Python `3.11.15`, oneMKL `mkl_rt.lib`/`bin/mkl_rt.3.dll` 및 FEAST 선언이 존재한다. 현재 작업 경로는 primary `C:/git/FESADev`의 linked worktree이며 branch는 `Eigen`이다. Implementation profile은 `gpt-5.6-terra` / `xhigh` / `workspace-write`이고 실제 configure/link/runtime는 아직 미실행이다. +Root가 읽은 현재 config schema는 dependency environment/cacheVariables를 직접 받지 않으며, root preset은 dependency `$env{...}` 값을 cacheVariables로 지정한다. +개별 subprocess environment가 부모 Stop process에 전파된다고 가정하지 않는다. Planning은 실제 Hook backend/환경과 CMake cache·preset을 함께 대조한다. +AGENTS의 Ninja preset은 예시이며 필수 검증은 MSVC/x64/Debug CMake/CTest다. 자동 감지의 VS18 cache 재사용도 현재 환경에서 가능한지 평가할 수 있으나, +과거 native sandbox의 FileTracker 한계와 현재 runner 정책까지 확인해야 한다. 아직 backend 선택·config 변경·실행은 하지 않았으며 일반 환경 준비는 기존 사용자 진행 승인 안에서 해당 owner가 수행한다. 현재 `.harness/config.json`은 없고 preset과 `.harness/config.example.json`은 있다. Planning은 자동 감지 결과와 승인 MSVC preset을 대조하여 실행명령 및 Hook backend를 명시해야 한다. diff --git a/docs/mitc4-shell-feast-eigen/numerical-review-evidence.md b/docs/mitc4-shell-feast-eigen/numerical-review-evidence.md new file mode 100644 index 0000000..9edd019 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/numerical-review-evidence.md @@ -0,0 +1,219 @@ +# MITC4 독립 수치 검토 evidence + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `numerical-review-agent` +- Input contract revision: `r1` +- 기본 보고서: [numerical-review.md](numerical-review.md) +- 검토일 / web access date: `2026-09-06` + +## NR-MFE-001 직접 계산 반례 + +관련 원문은 [requirements](requirements.md)의 `002`(기존 kernel 유지), +`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance +evidence)와 [V5](formulation-verification.md#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 소유다. + +## 비충돌 수학 검토 + +| 대상 | 독립 검토 결과와 한계 | +| --- | --- | +| 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 실행을 대신하지 않는다. + +```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에서 보장된다는 실행 결과로 바꾸지 않는다. + +## 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 값의 승인이 아니다. + +## 재검토 범위 + +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를 쓰거나 실행하지 않았다. + +```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 변경을 구분했다. diff --git a/docs/mitc4-shell-feast-eigen/numerical-review.md b/docs/mitc4-shell-feast-eigen/numerical-review.md new file mode 100644 index 0000000..3be093a --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/numerical-review.md @@ -0,0 +1,77 @@ +# MITC4 질량·FEAST 독립 수치 검토 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `numerical-review-agent` +- Input contract revision: `r1` +- 요청 outcome: `return-upstream` +- Next owner: `requirement-agent` +- Failure classification: `upstream-contract` +- 검토일: `2026-09-06` + +필수 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), +[requirements](requirements.md), [requirements evidence](requirements-evidence.md), +[research](research.md), [research evidence](research-evidence.md), +[formulation](formulation.md)과 연결된 mass/eigen/verification 상세 문서다. +[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), +[공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md), +[agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md)를 적용했다. + +## Blocking finding + +**NR-MFE-001 — 기존 stabilization 보존과 eigen coordinate-invariance acceptance의 미정합.** +`FEM-REQ-MITC4-EIGEN-002`는 기존 kernel을 유지하고, `014`는 두 질량과 선택된 질량의 +eigen 해석에 coordinate-invariance evidence를 요구한다. 그러나 +[V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)는 eigen +좌표 불변성 검증을 모든 회전이 free 또는 모두 fixed인 node 사례로 한정한다. +허용된 부분 global 회전 BC의 유한 공간에는 기존 drilling stiffness가 남으며, +그 계수는 global-axis 기반 tangent frame에서의 최소 대각값에 의존한다. + +유효한 `4×2` 평판, `t=1`, `E=12`, `nu=0`, `rho=1`, +`d=(0.6,0,0.8)`, 한 절점의 `URZ`만 free인 모델의 독립 직접 적분 결과는 다음과 같다. +Global Z축으로 45° 회전하면 **같은 지원 BC가 같은 물리 제약을 유지**하지만, +고유치는 `23.04088888888889`에서 `23.040628726287263`으로 바뀐다. +상대 차이는 `1.1291343961675893e-5`이며 roundoff 설명이 아니다. +수식·geometry·명령·exit code는 [반례 evidence](numerical-review-evidence.md#nr-mfe-001-직접-계산-반례)에 있다. + +이는 새 consistent/lumped mass나 E2~E5 reduction의 확인된 결함이 아니다. +V5가 이미 기록한 **기존 stiffness의 실제 한계**와 현재 acceptance intent 사이의 문제다. +NR가 부분 BC를 조용히 제외하거나 invariant 실패를 diagnostic으로 낮추면 안 된다. +외부 reference 1% 기준으로 이 내부 항등식 위반을 통과시킬 수도 없다. + +Requirement owner는 `002/008/014`를 함께 검토하여 기존 한계와 `014`의 의도·적용 범위를 +명시적으로 정합시켜야 한다. 전체 지원 모델의 좌표 불변성을 유지하려면 기존 stabilization +보존 계약에 영향이 있고, 제한을 수용하면 acceptance 설명에 영향이 있다. 기술 evidence로 +기존 의도를 확정할 수 없는 critical 선택만 Coordinator에게 반환한다. NR는 어느 선택도 +승인하거나 요구사항·강성을 수정하지 않았다. 같은 질량 선택을 사용자에게 다시 묻지 않는다. + +## 완료한 검토와 보존할 evidence + +- M1~M10의 부호·단위·quadrature degree, consistent physical rank20, nodal lumped + rank5, odd-thickness coupling, 보존량과 Jensen 차이는 수학적으로 일관된다. + Independent rational-polynomial fixture에서 integrand degree `(4,4,4)`, + 3-point 최대 entry 오차 `1.1102230246251565e-16`, 2-point 오차 + `6.018518518518257e-4`, 양의 central inertia와 exact centroid identity를 확인했다. +- E1~E5는 실제 global BC 뒤 analytic null intersection을 사용하며 원 constrained + stabilized pencil을 보존한다. Tiny positive mass를 rank cutoff로 삭제하지 않는 계약, + nodal whitening 및 원 free DOF 전체 residual은 유지해야 한다. +- Intel `fpm[49]`의 total count는 stochastic estimate로 기술되지 않는다. + Enclosure·empty prefix·count/solve 일치·Gram·독립 residual을 함께 요구하는 E6는 + floating-point 무조건 완전성 theorem을 주장하지 않는다. Trace stopping은 interval + endpoint scale을 사용하므로 영고유치 자체가 분모 0의 근거는 아니다. + 출처와 검토 한계는 [수치 상세](numerical-review-evidence.md)에 기록했다. +- [Reference-model](reference-model.md)은 지정 input/TXT 원본, 모든 10개 `Value`, + step/mode/frame identity, singleton family와 공통 tolerance의 논리 계약을 완성했다. + Reference artifact readiness에 결손은 발견하지 않았다. 수치 비교 실행 성공은 미판정이다. + +## Handoff와 미완료 범위 + +이번 gate는 **통과하지 않았다**. Requirement owner의 정합 결과 후 영향받은 formulation +V5와 NR evidence를 같은 revision으로 재검토한다. Reference 계약과 위 비충돌 계산은 +revision 영향 검토 후 재사용할 수 있다. + +전체 V1~V6 internal threshold, conditioning limit, FEAST parameter·endpoint/count/solve +budget 및 필수 case matrix의 최종 고정은 이 조기 upstream 반환에서 완료하지 않았다. +구현 담당자가 빈 기준을 정하거나 현재 보고서를 I/O/구현 진입 승인으로 사용하면 안 된다. +미완료 항목은 [재검토 범위](numerical-review-evidence.md#재검토-범위)에 명시했다. +외부 solver·CMake/CTest·Harness·FEAST runtime·FESA reference 비교는 미실행이다. +Workflow 전이와 critical decision 전달은 Coordinator 소유다. diff --git a/docs/mitc4-shell-feast-eigen/reference-model.md b/docs/mitc4-shell-feast-eigen/reference-model.md new file mode 100644 index 0000000..b42dd05 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/reference-model.md @@ -0,0 +1,111 @@ +# MITC4 FEAST 고유치 reference-model 계약 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `numerical-review-agent` +- Input contract revision: `r1` +- 검토일: `2026-09-06` +- Artifact·logical comparison readiness: 필요한 입력과 비교값 확인 완료. +- Numerical comparison result: 미실행. +- Stage outcome은 [numerical-review](numerical-review.md)의 `return-upstream`을 따른다. + +지역 범위는 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), +`FEM-REQ-MITC4-EIGEN-009/011/015/020/021/022`는 [requirements](requirements.md), +공통 판정은 [TOLERANCE](../TOLERANCE.md)의 `common-reference-tolerance`, +effective date `2026-08-18`, ADR-022를 따른다. + +## Case와 원본 artifact + +| Role | 지정 경로 | SHA-256 | +| --- | --- | --- | +| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` | +| 외부 reference | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` | + +Case identity는 `shellNL-eigen-meshfine`다. 원형상 `729` nodes, `676` S4 elements, +면적 `100`, `t=0.5`, `rho=2700`, `E=2.1e11`, `nu=0.3`인 평판의 외곽 `104`개 +절점이 DOF 1~6 모두 고정된다. Interior nodes `625`, 예상 `nf=3750`, `nz=625`, +finite dimension `3125`다. 이 수는 구현의 실제 rank/count 검증을 대신하지 않는다. + +유일한 source step은 `Step-2`, 무응력·무하중·무감쇠이며 preload가 없다. +Requested `N=10`의 권위는 `.inp *FREQUENCY` data다. TXT의 행수에서 N을 얻지 않는다. +목적은 동일 입력을 사용하는 derived lumped-mass FEAST 결과의 첫 10개 고유치를 외부 +수치값에 대조하는 것이다. Original TXT를 직접 읽으며 CSV 변환, rename, metadata, +provenance, version file 또는 mode-shape reference를 새 readiness 조건으로 추가하지 않는다. + +## Quantity와 deterministic identity + +| 항목 | Logical 계약 | +| --- | --- | +| Quantity / component | `eigenvalue` / `Value`, `lambda=omega²` | +| 차원 / 좌표계 | `T^-2` / coordinate-invariant scalar 의미; SI 자동 추론 없음 | +| Source row identity | `(case, source step name, modal frame mode id, component)` | +| 현재 expected identity | `case=shellNL-eigen-meshfine`, `step=Step-2`, `mode=1..10`, `component=Value` | +| FESA 대응 | 같은 source step의 검증된 오름차순 eigenvalue rank `1..N`; source mode identity로 대응 | +| Actual analysis mass | Consistent에서 유도한 lumped; backend `MKL FEAST` | +| 판정 영향 | 모든 10개 mode `blocking`; warning-only quantity 없음 | + +TXT의 `Frame: Mode i`는 mode-domain frame identity를 준다. TXT에 step 이름이 없는 것은 +지정 input에 frequency step이 정확히 하나인 사실로 결정적으로 해소한다. 이 예외를 다중 +step이나 step이 모호한 artifact에 일반화하지 않는다. Modal frame id와 임의의 ODB +storage frame index를 같은 정수라고 추정하지 않는다. +공개 의미의 근거는 [연구 S10/S11](research-evidence.md#source-inventory)이다. + +물리 eigenvalue가 같아도 다른 mode identity는 보존한다. 현재 표시값의 `(2,3)`, +`(7,8)`, `(9,10)` 쌍을 평균·merge하지 않는다. 같은 표시값만으로 exact degeneracy를 +추정하거나 mode vector로 행을 재배치하지 않는다. FESA 값 자체를 재정렬해 가까운 TXT +값에 임의 matching하지 않고, 승인된 solver rank와 source mode를 연결한다. + +공식 FESA 결과는 input의 lexical sibling `shellNL-eigen-meshfine_results.h5`다. +실제 dataset path, field type, persistent vector 및 comparison-view layout은 I/O owner가 +정한다. 이 문서는 HDF5 schema를 대신 선택하지 않는다. + +## Tolerance 전 사전검사 + +1. 지정 두 artifact와 FESA 공식 결과가 존재하며 같은 input/case/source step이다. + FESA 결과의 quantity·unit dimension·backend·actual mass가 위 계약과 맞아야 한다. +2. TXT의 모든 비어 있지 않은 행이 명시적인 `Frame: Mode : Value = `와 + 기존 `Freq = (cycles/time)` 표기에 맞아야 한다. Malformed 행을 건너뛰지 + 않는다. Freq는 구조 식별에만 쓰고 Value를 재계산하거나 tolerance 대상으로 쓰지 않는다. +3. Required row identity set이 양쪽 모두 정확히 `1..10`이다. Missing/extra/duplicate, + 잘못된 mode label·step·component·quantity/schema는 실패다. 입력 N과 따로 검사한다. +4. 모든 required `Value`가 finite여야 한다. `NaN/Inf`를 누락처럼 무시하거나 0으로 + 바꾸지 않는다. Required FESA dataset/component 누락도 먼저 실패한다. +5. 유일 identity로 대응한 뒤 increasing mode 순서로 검사·보고한다. TXT 행 순서 변경은 + 결과를 바꾸지 않으며 duplicate 검사 전에 dictionary overwrite하지 않는다. + +## Comparison family와 고정 판정 + +Family identity는 `(case=shellNL-eigen-meshfine, step=Step-2, +modal-frame=mode i, quantity=eigenvalue, units=T^-2, coordinates=scalar, +impact=blocking)`이며 `i=1..10`이다. **10개의 singleton family**이고 각 component는 +`Value` 하나다. 서로 다른 source modal frame을 저장 table이 같다는 이유로 합치지 않는다. + +각 family에 공통 정책을 그대로 적용한다. `S=max|r|`, `B=0.01S`, +`e=|f-r|`; `|r|<=B`이면 `e<=B`, 그 외에는 `e/|r|<=0.05`다. +Family relative RMS도 반드시 계산하여 `sqrt(mean(e²))/S<=0.01`을 함께 요구한다. +모든 경계는 inclusive다. 현재 각 reference가 양수인 singleton이므로 RMS는 +`e/|r|`이고 **모든 mode의 실효 상대 한계는 1%**다. 이것은 NR가 새로 고른 tighter +tolerance가 아니라 공통 same-frame family와 RMS 규칙의 직접 결과다. + +`S=0`이면 대응 FESA도 정확히 0인 경우만 통과한다. 그렇지 않으면 +`zero-reference-scale-nonzero-error`를 기록한다. Arbitrary absolute floor, +`max(1,S)`, frequency로 대체한 오차, engineering zero clamp는 허용하지 않는다. +Freq·mode shape·stress·reaction·다른 mass variant를 별도 외부 판정에 추가하지 않는다. + +보고서는 input/reference/result identity, prechecks, 각 family/component/row count/S, +원본 r/f/e, 적용 row branch·판정, RMS·판정, blocking failure 및 전체 verdict를 남긴다. +Internal FEAST count/잔차와 외부 singleton reference 판정은 별도 evidence다. + +## 검증 coverage와 제한 + +Comparator의 필수 음성/경계 사례는 missing/extra/duplicate/nonfinite/malformed row, +wrong step/quantity/mass, 행 순서 변경, 같은 Value의 서로 다른 mode, +정확한 1% RMS 경계·그 초과·5% row 경계, zero-scale 양성·음성이다. +Generic policy 테스트에는 near-zero `|r|=B`와 그 양옆도 포함한다. +이 reference singleton의 양수 데이터에 실제 near-zero row가 있다고 주장하지 않는다. + +실제 read-only `Get-Content`, `Get-FileHash`, `python -B -` inventory/identity script는 +exit `0`: `729/676/104/625` nodes/elements/boundary/interior, 단일 `Step-2`, input N=10, +유일 finite positive Values `10`, 위 두 hash 일치를 확인했다. +명령·검토 evidence는 [수치 상세](numerical-review-evidence.md#실행-evidence)에 연결한다. +단일 clamped flat case는 curved/partial-BC/null/zero-mode correctness를 검증하지 않는다. +원본 Abaqus 결과와 내부 정식화의 동등성, 구현의 수치 통과 또는 release를 주장하지 않는다.