docs: complete MITC4 eigen numerical review

This commit is contained in:
KOKO\Mimi
2026-09-06 04:27:42 +09:00
parent 4d303839c2
commit ea883ad372
9 changed files with 636 additions and 77 deletions
+11 -3
View File
@@ -55,7 +55,7 @@
## MFE-ADR-006 — 질량 lumping과 질량 없는 좌표의 정식화
- 상태: Formulation owner의 수학 계약으로 기록; 독립 Numerical Review 대기.
- 상태: Formulation owner 수학 계약 및 r2 독립 Numerical Review gate 확인.
- 결정 owner: formulation-agent; 기록 owner: coordinator-agent.
- 결정: Consistent scalar moments를 같은 `3×3×3` volume quadrature로 계산하고 moment row-sum에서 nodal `6×6` block lumped mass를 유도한다. 기존 global 제약 뒤 analytic director null과 기존 stabilization의 decoupling을 이용해 finite 공간을 투영하고 sparse nodal whitening으로 FEAST에 연결한다.
- 근거: [Formulation 핵심 계약](formulation.md#핵심-계약), [mass M1~M10](formulation-mass.md), [eigen E1~E8](formulation-eigen.md).
@@ -79,9 +79,17 @@
## MFE-ADR-008 — 초기 physical trace 평균 stabilization scale
- 상태: r2 승인 개선 범위 안의 Formulation owner 수학 계약; 독립 NR 검토 대기.
- 상태: r2 승인 개선 범위 안의 Formulation owner 수학 계약; 독립 NR에서 반례 해소 및 적용 경계 확인.
- 결정 owner: formulation-agent; 기록 owner: coordinator-agent.
- 결정: 초기 physical `K20`의 여덟 접평면 회전 대각 전체를 평균해 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 사용한다. Zero 대각도 포함하며 기존 numerical map과 nonlinear 초기 고정 lifecycle을 유지한다.
- 근거: [S1~S7](formulation-stabilization.md), [V8의 exact arithmetic·정적 evidence](formulation-verification.md#v8-r2-영향-확인과-bounded-evidence).
- 이유·경계: 접평면 기저의 scalar invariant를 쓰면서 spectral subtraction과 positive nodal block 선별을 피한다. 양성 inventory·단위·연산 순서·invalid 실패, partial BC에 남는 stabilization 및 기존 physical/nonphysical 구분은 해당 수학 계약을 따른다. 계수나 mass를 reference에 맞추어 조정하지 않는다.
- 검증 인계: NR-MFE-001의 새 algebraic target `k_d=19/4800`, `lambda=10369/450` 및 물리 tangent moment의 정적 response를 NR가 독립 재검산한다. 이 기록은 실제 C++/FEAST/reference 통과나 release evidence가 아니다.
- 검증 인계: NR-MFE-001의 새 algebraic target `k_d=19/4800`, `lambda=10369/450` 및 물리 tangent moment의 정적 response를 NR가 독립 직접 적분으로 확인했다. [r2 evidence](numerical-review-evidence.md)는 기존 실패와 새 complete K/질량/response/reaction 공변성 결과를 보존한다. 실제 C++/FEAST/reference 통과나 release evidence는 아니다.
## MFE-ADR-009 — NR 내부 controls와 외부 비교의 분리
- 상태: r2 Numerical Review owner가 고정한 수치·검증 계약; gate evidence audit 완료.
- 결정 owner: numerical-review-agent; 기록 owner: coordinator-agent.
- 결정: [Controls C1~C7](numerical-review-controls.md)의 같은 단위 metric/zero branch·analytic rank/conditioning·modal residual/Gram·FEAST parameter/seed/thread/storage/budget과 [27개 필수 case](numerical-review-cases.md)를 적용한다. 구체 수치의 원본은 해당 owner 문서다.
- 외부 비교: [reference-model](reference-model.md)의 source Step-2/mode-frame 1~10, Value=`omega²[T^-2]`, 10개 singleton family와 공통 TOLERANCE를 유지한다. 현재 양수 값의 실효 mode별 1%는 공통 RMS 정책의 결과이며 새 tolerance 변경이 아니다.
- 영향: I/O와 Planning/Implementation은 수치 threshold·mass·source identity를 임의로 바꾸지 않는다. 실제 FEAST known spectra·fresh reference 및 영향받은 static 회귀는 아직 수행할 필수 작업이다. 기존 static U/UR·reaction 역할을 새 eigen Value-only와 혼동하지 않는다.
@@ -38,13 +38,15 @@ Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실
| [requirements-evidence.md](requirements-evidence.md) | requirement-agent | r2 | fixed kd 대체 경계·기존 static 회귀·승인 evidence audit 완료 |
| [research.md](research.md) | research-agent | r2 | 27개 coverage·승인 delta evidence gate pass |
| [research-evidence.md](research-evidence.md) | research-agent | r2 | R07 공변 scale 후보·nonlinear lifecycle·null 조건; 기존 근거 보존 확인 |
| [formulation.md](formulation.md) | formulation-agent | r2 | 27개 coverage·수학 handoff gate pass; 독립 NR 대기 |
| [formulation.md](formulation.md) | formulation-agent | r2 | 27개 coverage·수학 handoff 및 독립 NR gate pass |
| [formulation-mass.md](formulation-mass.md) | formulation-agent | r2 | 질량 수학 근거 보존 확인; numerical scale만 r2 연결 |
| [formulation-eigen.md](formulation-eigen.md) | formulation-agent | r2 | 개선된 K의 null 처리·finite spectrum·복원 수학 계약 |
| [formulation-verification.md](formulation-verification.md) | formulation-agent | r2 | complete K/partial BC·static 회귀 갱신; NR 내부 수치 기준 대기 |
| [formulation-verification.md](formulation-verification.md) | formulation-agent | r2 | complete K/partial BC·static 회귀 갱신; NR controls와 함께 적용 |
| [formulation-stabilization.md](formulation-stabilization.md) | formulation-agent | r2 | trace 평균 scale·positivity·covariance·nonlinear lifecycle·반례 exact target |
| [numerical-review.md](numerical-review.md) | numerical-review-agent | r1 | r1 return-upstream 이력; r2 전체 NR gate 미실행 |
| [numerical-review-evidence.md](numerical-review-evidence.md) | numerical-review-agent | r1 | 반례·mass oracle·API 근거 보존; r2 영향 owner 검토 대기 |
| [reference-model.md](reference-model.md) | numerical-review-agent | r1 | artifact/logical 근거 보존; r2 영향 owner 검토 대기 |
| [numerical-review.md](numerical-review.md) | numerical-review-agent | r2 | 독립 수학·controls·logical reference readiness gate pass |
| [numerical-review-evidence.md](numerical-review-evidence.md) | numerical-review-agent | r2 | r1 실패 보존 및 r2 독립 반례 해소·정적 audit |
| [numerical-review-controls.md](numerical-review-controls.md) | numerical-review-agent | r2 | 내부 metric/zero/conditioning·FEAST parameter/budget/seed·정적 회귀 기준 고정 |
| [numerical-review-cases.md](numerical-review-cases.md) | numerical-review-agent | r2 | 27개 requirement와 27개 필수 logical case mapping |
| [reference-model.md](reference-model.md) | numerical-review-agent | r2 | 10개 Value·singleton family·공통 policy logical readiness; 실제 비교 미실행 |
아직 작성되지 않은 specialist 보고서는 목록에 승인 산출물로 등록하지 않는다.
+5 -5
View File
@@ -3,7 +3,7 @@
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Input contract revision: `r2`
- 검토 상태: r2 requirements/research/formulation gate pass; Numerical Review에서 독립 반례 해소 및 남은 수치 기준 검토 진행.
- 검토 상태: r2 requirements/research/formulation/numerical-review gate pass; I/O 정의 진입. 구현·실제 reference 비교는 아직 미실행.
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md).
지역 지침과 문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)를 따른다.
@@ -44,12 +44,12 @@ 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)에 있다. 내부 수치 기준은 미확정이다.
[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 관계다.
구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md), 고정된 내부 수치 기준은 [NR controls](numerical-review-controls.md), 필수 검증은 [27개 cases](numerical-review-cases.md)에 있다.
[Reference artifact·logical readiness](reference-model.md)와 독립 수학/controls evidence를 함께 확인하여 r2 NR gate를 통과했다.
r1의 [NR-MFE-001 실패 이력](numerical-review-evidence.md)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계였다.
Requirement owner는 알려진 partial-BC 반례를 단순 clarification으로 제외할 수 없다고 판단했다.
[MFE-OQ-003 대안·영향](requirements-evidence.md#nr-mfe-001-requirements-intent-검토) 중 좌표 공변적인 stabilization 개선과 영향받는 정적/eigen 재검증 범위 추가가 사용자에게 승인되었다. 단순 한계 수용 및 acceptance 축소안은 선택되지 않았다.
사용자가 확정한 질량 계산 흐름·FEAST 사용 mass·입력 N·외부 Value-only 범위는 유지한다. 개선 수식과 실제 구현·검증은 해당 owner의 후속 gate를 거쳐야 한다.
기존 fixed scale의 [대체 경계](requirements.md#r2의-기존-계약-대체-범위)와 [필수 static 회귀 포트폴리오](requirements-evidence.md#r2-승인-범위와-정적-재검증)는 Requirement owner r2에 명시되어 있다. 과거 정적 reference의 U/UR 및 reaction 검토 정책은 해당 기존 계약으로 재검증하고 새 eigen 비교량은 Value로 유지한다.
[r2 research delta](research-evidence.md#r07--r2-stabilization-근거와-영향)는 기저 불변 scale 후보, 초기 고정 nonlinear lifecycle 및 linear massless 처리의 조건을 구분한다. 최종 수식 채택과 반례 해소 판정은 후속 owner 소유이다.
[r2 stabilization 정식화](formulation-stabilization.md)는 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 채택하고 양성 inventory·complete K의 공변성·nonlinear 고정 lifecycle 및 반례의 고유치/정적 exact target을 정의한다. 독립 NR 판정과 실제 구현·재검증은 아직 완료되지 않았다.
[r2 stabilization 정식화](formulation-stabilization.md)는 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 채택하고 양성 inventory·complete K의 공변성·nonlinear 고정 lifecycle 및 반례의 고유치/정적 exact target을 정의한다. NR는 반례를 독립 직접 적분으로 재검산해 r2 수학 계약의 해소를 확인했다. 실제 C++/FEAST 구현 및 fresh reference 재검증은 후속 필수 gate다.
+19 -4
View File
@@ -3,15 +3,15 @@
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Contract revision: `r2` (사용자 승인 stabilization 개선·영향받는 정적/eigen 재검증 범위)
- Stage: `numerical-review`
- Outcome: `pass` (formulation r2 수학 handoff gate evidence 확인)
- Next owner: `numerical-review-agent`
- Stage: `io-definition`
- Outcome: `pass` (r2 numerical-review 수학·controls·reference logical readiness 확인)
- Next owner: `io-definition-agent`
- Attempt: `0` (r2 구현·수치 실패 관찰 없음; r1 이력 별도 보존)
- Completion: 미완료
- Failure classification: `null`
- Retry key: `null`
- Escalation class: `null`
- Blocker: `null` (r2 NR와 후속 기술 gate는 아직 미완료)
- Blocker: `null` (I/O 및 후속 기술 gate는 아직 미완료)
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md).
@@ -31,6 +31,7 @@
| requirements r2 | [27개 must](requirements.md), [승인 delta·회귀 범위](requirements-evidence.md#r2-승인-범위와-정적-재검증), MFE-ADR-007 | pass; 사용자 승인 반영, owner/revision/27개 ID/43 local links 및 미결정 0 확인 |
| research r2 | [research](research.md), [R07 delta](research-evidence.md#r07--r2-stabilization-근거와-영향) | pass; 27개 coverage/32 local links, 추가 primary S12/S13 및 r1 질량·FEAST·reference 근거 보존 확인 |
| formulation r2 | [main](formulation.md), [mass](formulation-mass.md), [eigen](formulation-eigen.md), [verification](formulation-verification.md), [stabilization](formulation-stabilization.md) | pass; 5개 문서/27개 coverage/57개 상대 경로 및 단일 scale·수학 적용 경계 확인; 독립 판정은 NR 소유 |
| numerical-review r2 | [verdict](numerical-review.md), [독립 evidence](numerical-review-evidence.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [reference-model](reference-model.md) | pass; NR-MFE-001 수학적 해소, 내부 수치 기준/27개 case/27개 requirement 및 logical reference readiness 모두 확인 |
공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다.
확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다.
@@ -39,11 +40,22 @@ Root의 시작 Git 조사에서 worktree clean을 확인했다. 구현·build/te
## 현재 bounded dispatch
NR owner의 r2 `pass` envelope와 실제 5개 기본/상세 문서를 감사하여 io-definition으로 전이한다.
NR-MFE-001의 r1 실패를 보존하고 독립 직접 적분의 r2 complete K/질량/고유치/정적 response·reaction covariance 결과로 수학 계약의 해소를 확인했다. 문서에서 추출한 `python -B -` 재현도 exit `0`이다.
V1~V6의 단위·zero branch·analytic rank/conditioning·원 residual/Gram·FEAST controls/seed/QR/thread/정수·memory/budget과 27개 필수 case/요구 mapping이 고정되었다. MFE-C13의 BC 조합은 실제 global component BC로 표현 가능한 경우만 적용함을 owner가 명시했다.
Owner 정적 audit은 5문서/64 local links/27개 요구/27개 cases/8개 기존 static artifacts, exit `0`; `git diff --check` exit `0`이다. 최초 audit의 encoding/URL-decoding 오류와 수정 후 재확인은 전문 evidence에 보존했다.
Coordinator는 18문서의 local-link 누락 0, NR 5개 문서 owner/r2 metadata·반환 hash, 27개 case/27개 requirement mapping 행을 확인했다(`python -B -`, exit `0`). 원본 input/TXT hash와 외부 Value-only/10 singleton/common policy는 유지한다.
I/O owner는 승인된 입력 subset·부수 옵션·density mapping, 별도 eigen procedure state와 additive HDF5/source/modal identity·failure preservation·deterministic 비교 projection을 고정한다. 수식/수치 기준을 다시 선택하지 않으며 실제 C++/FEAST/fresh reference 비교는 Implementation의 후속 필수 작업이다.
### Numerical-review r2 이력
Formulation owner의 r2 `pass` envelope와 실제 5개 문서의 변경·상세 수식/단위/ordering/실패/검증 경계를 감사하여 numerical-review로 전이한다.
Owner가 `k_ref=sum_i trace(R_i)/8`, `k_d=10^-3 k_ref`를 확정했고 S1~S8에 positivity, complete K 공변성, partial BC, physical rigid/null 및 nonlinear 초기 고정 potential/Hessian의 적용 경계를 명시했다.
Exact arithmetic `python -B -`는 exit `0`, `kd=19/4800`, `lambda=10369/450`, 단위 tangent moment 응답 `7500/10369`이며 formulation 식의 산술 확인이다. NR의 독립 반례 해소나 runtime 결과로 취급하지 않는다.
Owner 정적 검사는 5문서/57개 상대 경로/27개 coverage/issues 0, exit `0`; `git diff --check` exit `0`이다. Coordinator는 16문서 local-link 누락 0, 5개 owner/r2 metadata와 반환 SHA-256 일치를 확인했다(`python -B -`, exit `0`).
NR는 r1의 비충돌 mass oracle/API/reference 근거를 보존하고 새 stabilization을 독립 재검토한다. 이어 미완료 V1~V6 내부 threshold·conditioning·FEAST controls/endpoint/count/solve budget·seed 및 27개 요구의 필수 case matrix를 모두 고정해야 한다. 논리 reference readiness도 r2로 확인한 뒤에만 I/O로 전이할 수 있다.
Root는 formulation r2의 exact 9개 경로를 `4d30383` (`docs: define covariant MITC4 stabilization formulation`)로 커밋했고 staged diff/commit exit `0`, 이후 clean을 확인했다.
NR owner의 중간 독립 계산은 기존 R block을 입력하지 않고 평판 membrane/curvature/MITC shear work를 직접 적분해 complete `24×24 K`를 구성했다. 회전 전후 `lambda=23.04222222222223`, `thetaZ=0.7233098659465717`이 같고 K/M/response/reaction covariance 오차는 각각 `7.90e-17`/`4.66e-17`/`0`/`1.15e-16`이었다(`python -B -`, exit `0`). 최종 보고서/controls/coverage 반환 후 gate를 감사하며 C++/FEAST runtime evidence와 구분한다.
### Formulation r2 이력
@@ -182,6 +194,7 @@ Root read-only 환경 조사에서 다음 설치 경로를 확인했다. 이 목
VS `18/Community` DevShell script/dll이 존재하며 Ninja는 현재 PATH에 없다. Planning/Executor는 각 실행 subprocess의 MSVC x64 Developer 환경과 dependency 환경을 명시해야 한다.
Root는 global environment, Hook state/code를 변경하지 않았다.
후속 Root read-only `Get-Command`에서 `python`, `uv`, `cmake`, `ctest`, `codex`가 해석되었다. Codex launcher는 `C:/Users/baram/AppData/Local/Programs/OpenAI/Codex/bin/codex.exe`다. Launcher 실행·로그인·설정 변경은 없었고 tool availability는 Harness transport 성공 evidence가 아니다.
추가 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는 미실행이었다.
@@ -251,6 +264,8 @@ ctest --test-dir .harness/build -C Debug -R '^ShellSurfacePressureReference\.' -
Exit `0`, `7/7 passed`, `1.09`초이며 Git ignored `.harness/build/baseline-before-mitc4-eigen/remaining-pressure-tests/`의 `LastTest.log`/`observation.json`에 보존했다.
로그 SHA-256은 `60823270ffc3c9386a5936ddc8f3ac3fb89a5895412046b2689216ec7a50472f`다. 변경 전 baseline의 중단 실행 354 pass, 단독 재현 1 pass, 나머지 7 pass를 각각 확보했으나 단일 전체 suite 성공으로 합쳐 보고하지 않는다.
Root의 baseline 분류 작업은 종료되었고 source/test/환경/reference 변경은 없었다. 새 binary의 TDD·전체 suite·fresh reference 검증은 Implementation owner의 필수 작업이다.
Root의 read-only 시간 집계는 보존된 355개 duration 합 `1228.04`초에서 중단된 pressure `193.43`초를 성공 단독 실행 `636.97`초로 대체하고 나머지 7개 `1.09`초를 더한 `1672.67`초(약 27.9분)다.
이는 서로 다른 관찰의 합산 추정이며 실제 단일 전체 suite wall time 또는 pass evidence가 아니다. Planning은 full VERIFY와 fresh reference solve의 실제 소요를 고려하되 이 추정으로 timeout 변경·test 생략·검증 축소를 승인받았다고 해석하지 않는다.
## Retry 기록
@@ -0,0 +1,122 @@
# MITC4 eigen 필수 verification portfolio
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md)
- 수치 기준: [controls C1~C7](numerical-review-controls.md)
아래는 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 함수의 재호출로 만들지 않는다. 이 문서는 실행 결과가 아니다.
## 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-evidence.md#독립-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 우회 금지 |
## P2. Stabilization·partial BC·정적 영향
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C08 | [NR-MFE-001 원 rectangle](numerical-review-evidence.md#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를 요구하지 않음 |
## 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만으로 성공시키는 경로를 잡는다.
## 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-evidence.md#필수-회귀-포트폴리오와-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를 조작하지 않는다.
## Requirement coverage
아래 전 행의 접두사는 `FEM-REQ-MITC4-EIGEN-`이고 모두 `must`다.
Mapping은 acceptance intent를 복제하지 않으며 [requirements](requirements.md)가 원본이다.
| 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 |
@@ -0,0 +1,232 @@
# MITC4 eigen 내부 수치 기준
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md)
- 적용: IEEE binary64, MSVC x64 Debug, 실제 oneMKL FEAST adapter 및 같은 산술의 내부 검증.
[V1~V6](formulation-verification.md), [E1~E8](formulation-eigen.md),
[S1~S8](formulation-stabilization.md)의 식을 사용한다. 아래 값은 구현 전에 고정한 내부
수치 계약이며 reference fitting 값이 아니다. [외부 판정](reference-model.md)의 공통
tolerance, 기존 nonlinear Newton 종료 기준과 별개다. 실패 결과를 보고 완화하지 않는다.
## 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를 따른다.
## 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다.
## 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로 바꾸지 않는다.
## 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를 요구하지 않는다.
## 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-eigen.md#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 설정에 사용하는 것은 금지한다.
## 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을 따로 기록한다.
## 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를 덮어쓰지 않는다.
@@ -2,12 +2,15 @@
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r1`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md)
- 검토일 / web access date: `2026-09-06`
## NR-MFE-001 직접 계산 반례
이 절은 **r1의 실제 실패 evidence**이며 값·계산을 보존한다. r2의 독립 해소 판정은
아래 [r2 공변성 검산](#r2-독립-공변성-검산)에 있다. 기존 실패를 통과로 소급 변경하지 않는다.
관련 원문은 [requirements](requirements.md)의 `002`(기존 kernel 유지),
`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance
evidence)와 [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)다.
@@ -89,6 +92,10 @@ assert abs(l1-l0)>1e-6
## 비충돌 수학 검토
아래 표는 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에 들어가지 않는다. |
@@ -166,8 +173,10 @@ Known-spectrum 검증 없는 `info=0` 또는 count만으로 lowest-N를 판정
## 재검토 범위
NR-MFE-001 때문에 bounded return을 먼저 수행한다. 아래 항목은 최종 numerical gate 전에
NR가 같은 승인 revision에서 구체적인 수치와 필수 case를 고정해야 하며 미완료로 남긴다.
이 절은 r1의 조기 반환 당시 미완료 목록이다. r2에서는 아래 항목을
[controls C1~C7](numerical-review-controls.md)와
[27개 case·requirement matrix](numerical-review-cases.md)로 고정했다.
이력 목록을 삭제하지 않으며 현재 미완료 수치 계약으로 해석하지 않는다.
- V1~V4의 symmetry/oracle/moment/centroid/Jensen/null/KZ/MZ/PZ/Cholesky/constraint/
full residual/whitened residual/normalization/Gram/energy의 threshold와 zero branch.
@@ -217,3 +226,161 @@ issues `0`이다. 문서에 보존한 반례 코드를 추출해 같은 Python
위 kd/lambda/relative difference가 재현되었다. `git diff --check` exit `0`; 타 owner의
`coordination.md` LF/CRLF warning만 출력되었다. 신규 owned 문서의 whitespace는 위 별도
검사로 확인했다. `git status --short`에서 owned 신규 3개와 Coordinator 변경을 구분했다.
## r2 독립 공변성 검산
새 [S1~S8](formulation-stabilization.md)는 초기 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/기존 정적 회귀의 통과 판정은 아니다.
## 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-controls.md), 요구별 falsifiable coverage는
[cases](numerical-review-cases.md)에 있고 변경한 외부 tolerance는 없다.
## 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 계약으로 증명해야 한다.
@@ -2,76 +2,73 @@
- 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`
- 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 evidence](requirements-evidence.md),
[research](research.md), [research evidence](research-evidence.md),
[formulation](formulation.md)과 연결된 mass/eigen/verification 상세 문서다.
[formulation](formulation.md)과 연결된 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)를 적용했다.
## 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에서의 최소 대각값에 의존한다.
현재 unresolved blocking finding은 없다. **NR-MFE-001의 r1 실패는 보존하고 r2 수학 계약에서
해소되었음을 독립 확인했다.** 사용자 승인 MFE-ADR-007에 따라 초기 physical rotary trace
평균을 사용하는 [S1~S8](formulation-stabilization.md)을 검토했다. Positive inventory,
기저·좌표 공변성, partial-BC numerical contribution, linear massless decoupling 및
nonlinear frozen objective potential의 경계가 일관된다.
유효한 `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-직접-계산-반례)에 있다.
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-evidence.md)을 보존한다.
Actual C++/FEAST 실행을 대신한 판정은 아니다.
이는 새 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는 어느 선택도
승인하거나 요구사항·강성을 수정하지 않았다. 같은 질량 선택을 사용자에게 다시 묻지 않는다.
- [Controls C1~C7](numerical-review-controls.md)에 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-cases.md)는 독립 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 소유다.
## 완료한 검토와 보존할 evidence
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 변경을 보존했다.
- 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와 잔여 위험
## 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를 독립 평가한다.
이번 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 소유다.
이번 단계의 수학 계산과 문서 정적 검증은 실제 `python -B -`/`git diff --check` exit `0`으로
확인했고 상세 결과는 [evidence](numerical-review-evidence.md)에 있다.
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 완화는 허용하지 않는다.
@@ -2,11 +2,11 @@
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r1`
- Input contract revision: `r2`
- 검토일: `2026-09-06`
- Artifact·logical comparison readiness: 필요한 입력과 비교값 확인 완료.
- Numerical comparison result: 미실행.
- Stage outcome은 [numerical-review](numerical-review.md)의 `return-upstream`을 따른다.
- Stage의 I/O handoff 요청은 [numerical-review](numerical-review.md)의 `pass`를 따른다.
지역 범위는 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
`FEM-REQ-MITC4-EIGEN-009/011/015/020/021/022`는 [requirements](requirements.md),
@@ -109,3 +109,19 @@ exit `0`: `729/676/104/625` nodes/elements/boundary/interior, 단일 `Step-2`, i
명령·검토 evidence는 [수치 상세](numerical-review-evidence.md#실행-evidence)에 연결한다.
단일 clamped flat case는 curved/partial-BC/null/zero-mode correctness를 검증하지 않는다.
원본 Abaqus 결과와 내부 정식화의 동등성, 구현의 수치 통과 또는 release를 주장하지 않는다.
## r2 영향 확인과 기존 static 회귀
r2는 numerical stiffness의 초기 scalar만 개선한다. 이 reference의 input/TXT,
Value=omega² 의미, N의 입력 권위, source step/mode/frame, actual lumped mass 및 모든
10개 singleton family의 공통 판정은 변경되지 않는다. r1의 파일 내용·identity inventory를
재사용했고 r2에서 두 원본 SHA-256이 위와 동일함을 확인했다(`Get-FileHash`, exit `0`).
과거 reference readiness를 r2 FESA 수치 비교 성공으로 바꾸지 않는다.
승인된 기존 static 회귀는 [Requirement의 단일 portfolio](requirements-evidence.md#필수-회귀-포트폴리오와-identity),
[C26](numerical-review-cases.md) 및
[C7](numerical-review-controls.md#c7-승인된-정적-회귀-기준)을 따른다.
그 static U blocking/UR warning-only·nonlinear local reaction review-only와 기존
step/accepted-state/source-node/component identity는 유지한다. Eigen의 Value-only와
서로 바꾸지 않는다. Static의 최신 common-policy projection을 적용하고 옛 파일명/schema
이력으로 현재 HDF5 경로를 대체하지 않는다. 최종 dataset 정의는 I/O owner다.