From 5b77ecd26a32f060b5f9f1c100a985d4b5f5837d Mon Sep 17 00:00:00 2001 From: "KOKO\\Mimi" Date: Tue, 8 Sep 2026 21:27:10 +0900 Subject: [PATCH] docs: record independent eigen2 numerical review --- docs/mitc4-shell-feast-eigen2/ADR.md | 8 + .../FEATURED_AGENTS.md | 1 + docs/mitc4-shell-feast-eigen2/PRD.md | 2 +- .../numerical-review-cases.md | 86 ++++++++ .../numerical-review-controls.md | 112 +++++++++++ .../numerical-review-evidence.md | 184 ++++++++++++++++++ .../numerical-review.md | 64 ++++++ .../reference-model.md | 78 ++++++++ 8 files changed, 534 insertions(+), 1 deletion(-) create mode 100644 docs/mitc4-shell-feast-eigen2/numerical-review-cases.md create mode 100644 docs/mitc4-shell-feast-eigen2/numerical-review-controls.md create mode 100644 docs/mitc4-shell-feast-eigen2/numerical-review-evidence.md create mode 100644 docs/mitc4-shell-feast-eigen2/numerical-review.md create mode 100644 docs/mitc4-shell-feast-eigen2/reference-model.md diff --git a/docs/mitc4-shell-feast-eigen2/ADR.md b/docs/mitc4-shell-feast-eigen2/ADR.md index 8c87ac5..6fe645e 100644 --- a/docs/mitc4-shell-feast-eigen2/ADR.md +++ b/docs/mitc4-shell-feast-eigen2/ADR.md @@ -55,3 +55,11 @@ - FEAST: 독립 outer enclosure와 성공 total count를 기준으로 lower endpoint를 고정하고 upper-prefix 축소만 선택적으로 사용한다. 미확인 empty-count 성공에 의존하지 않으며 최적화 실패 시 마지막 확인된 구간을 사용한다. - 근거·한계: [연구 G01/G02](research-evidence.md)에서 count-only 빈 구간 및 작은 workspace 보장이 확인되지 않았다. 보수적 workspace와 실제 runtime·memory 검증 의무를 남기며 backend 통과를 선언하지 않는다. - 승인 경계: 기존 사용자 요구의 수학적 구체화이며 새로운 물리 범위·외부 tolerance·공개 호환성 변경은 없다. 수치 controls·검토는 NR, 영속 schema는 I/O가 소유한다. + +## MFE2-ADR-007 — 독립 수치 검토와 comparison family + +- 상태: numerical-review-agent의 독립 `pass-for-io-definition`, 2026-09-08. Owner: numerical-review-agent; 기록: 메인 assistant. +- 근거: [검토](numerical-review.md), [새 계산](numerical-review-evidence.md). Geometry부터 complete K·질량·부분 제약 정적 응답을 재계산하여 `lambda=10369/450` 및 좌표 공변성을 확인했다. 별도 rational mass oracle도 새로 실행했다. +- 결정: [내부 controls](numerical-review-controls.md)와 [27개 사례](numerical-review-cases.md)를 적용한다. 초기 enclosing count 재시도는 최초 포함 3회, 이후 lower endpoint 고정·upper search·전체 count/solve 유한 한계를 명시했다. B=0의 시작 구간은 (-1,1)로 고정했다. +- 외부 비교: 원본 TXT의 literal modal frame과 유일한 source Step-2를 [reference-model](reference-model.md)에 대응한다. 같은 frame 규칙에 따라 10개 singleton Value blocking family를 정의하고 공통 행 5%·RMS 1% 정책을 그대로 적용한다. 이번 양수 singleton의 실효 각 Value 한계는 RMS 1%다. +- 영향·한계: 확인된 수학 차단 이슈 없이 I/O 정의를 진행할 수 있다. 이 판정은 구현·실제 FEAST·정적 회귀·외부 비교·Physics·release 통과가 아니다. Runtime count/cluster/ABI/workspace와 메모리 검증은 후속 필수 evidence다. diff --git a/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md index 79e5165..b03652b 100644 --- a/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md +++ b/docs/mitc4-shell-feast-eigen2/FEATURED_AGENTS.md @@ -33,5 +33,6 @@ | [requirements-evidence.md](requirements-evidence.md) | requirement-agent | 재사용 근거·기존 요구 대응·reference 정적 관찰·미해결 사항 | | [research.md](research.md), [research-evidence.md](research-evidence.md) | research-agent | 일차 출처·적용 판단·검증 후보·미해결 근거 | | [formulation.md](formulation.md), [질량·stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md) | formulation-agent | 구현 가능한 수학 계약·기존 유도 채택 경계 | +| [numerical-review.md](numerical-review.md), [evidence](numerical-review-evidence.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [reference-model](reference-model.md) | numerical-review-agent | 독립 수학 검토·실제 검산·수치 기준·검증 사례·외부 비교 의미 | 반환은 결과·변경 파일·정적 확인·미해결 항목으로 충분하다. Git 경로 선택·커밋과 최종 결과 확인은 메인이 수행한다. diff --git a/docs/mitc4-shell-feast-eigen2/PRD.md b/docs/mitc4-shell-feast-eigen2/PRD.md index 37f263b..1ad58bf 100644 --- a/docs/mitc4-shell-feast-eigen2/PRD.md +++ b/docs/mitc4-shell-feast-eigen2/PRD.md @@ -64,7 +64,7 @@ solver build/test·reference 비교와 release 감사는 포함하지 않는다. - [x] Research: [연구](research.md)와 [근거](research-evidence.md)에 일차 출처·질량/축소/stabilization 후보 및 실제 runtime 확인이 필요한 FEAST 두 항목을 기록했다. - [x] Formulation: [정식화](formulation.md)에 질량·공변 stabilization·constraint-first 축소·FEAST·복구 수학 계약을 작성했다. 독립 numerical review는 별도 항목이다. -- [ ] Numerical review: 독립 계산·검토로 정식화와 검증 계획의 적합성을 판단한다. +- [x] Numerical review: [독립 검토](numerical-review.md)는 `pass-for-io-definition`이다. 새 수학 oracle 2개와 27개 verification cases, 내부 controls 및 Value-only reference family를 정의했다. 실제 solver 검증은 미실행이다. - [ ] I/O definition: 입력·진단·결과 schema·reference mapping 계약을 정의한다. - [ ] 신규 문서의 링크·계약 일관성과 변경 범위를 확인하고 단계별 변경을 커밋한다. diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review-cases.md b/docs/mitc4-shell-feast-eigen2/numerical-review-cases.md new file mode 100644 index 0000000..bf3967c --- /dev/null +++ b/docs/mitc4-shell-feast-eigen2/numerical-review-cases.md @@ -0,0 +1,86 @@ +# 필수 검증 사례와 요구사항 연결 + +- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r1`. +- 기본 보고서: [numerical-review](numerical-review.md); 판정 수치: [controls](numerical-review-controls.md). +- 아래는 후속 구현의 필수 관찰이다. 이번에 실제 실행한 수학 oracle는 [evidence](numerical-review-evidence.md)뿐이다. + +[이전 case C01–C24](../mitc4-shell-feast-eigen/numerical-review-cases.md)의 synthetic fixture와 +독립 oracle를 읽고 새 formulation에 대조해 아래에 채택한다. 숫자·fixture 상세는 그 문서를 +참조하되 **이 문서의 새 controls와 아래 예외가 우선**한다. 기존 requirement prefix, +RED 고정 순서·phase/release 절차·test 이름/개수·이전 pass는 채택하지 않는다. +Old C25–C27의 실행·portfolio 지시는 아래 새 정의로 대체한다. + +| 새 Case ID | 필수 입력·관찰과 반증 기준 | +| --- | --- | +| E2-C01 | Affine rectangle 4×2, rho3,t1/2: independent C0 matrix, C1=0,C2=t²C0/12, nodal m3,j1/16; full24/physical20, energy·rank·drill null | +| E2-C02 | 이번 rational warped director fixture의 모든 Ck/rows/first moment를 독립 적분. C1 강제0, 2-point mass, flat C2 비례식 mutation 검출. Custom director는 kernel-level이며 새 input 기능 아님 | +| E2-C03 | Consistent 원본 snapshot→row sum→block 연결, C1/C2 perturbation 전파; 직접 nodal energy 및 Jensen pairwise integral. 각 mass의 energy를 따로 검증 | +| E2-C04 | Square [-1,1]², rho=t1, m=1,2,4 mesh, velocity(x,0,0): consistent work4/3, lumping 차8/(3m²), uniform translation work4. 일반 spectrum 수렴차수 약속 아님 | +| E2-C05 | Proper rational Q 및 shift(7,-3,5), geometry/director/frame부터 두 mass 재계산; d=(1,1,1)/sqrt3의 full row-sum 실패 mutation | +| E2-C06 | 공유 node·상이 rho/t/material sections, source labels/order 변화, sequential/parallel의 stable contribution/reduction 및 정확한 scatter | +| E2-C07 | Density missing/duplicate/unresolved/nonpositive/nonfinite/dependent, invalid thickness/material/geometry/27점 평가 실패. Density 없는 static 허용 | +| E2-C08 | NR-MFE-001의 원/회전 geometry부터 complete K/ML 새 계산: kd19/4800,Mff3/50,Kff10369/7500,lambda10369/450. Node1 URZ만 free; min-diagonal mutation은 실패 | +| E2-C09 | 같은 partial BC와 admissible moment(5/3)b, thetaZ7500/10369; 회전 load와 full Kq-F reaction covariance. Pure eZ moment로 대체 금지 | +| E2-C10 | Rotary inventory[0,0,2,4,0,6,0,4]→kd.002; independent tangent changes. Allzero/negative/nonfinite/overflow/underflow 실패; zero 포함 분모8 | +| E2-C11 | Free affine element physical K20 rank14, complete K24 rank18/nullity6, consistent physical mass rank20와 lumped rank5/node. 여섯 rigid fields·positive mass Gram·drill null 분리 | +| E2-C12 | 기존 nonlinear fixture의 frozen initial kd, exact unchanged trial/commit/rollback; objective gamma potential의 1·2차 variation, finite rigid motion, physical 선형극한·recovery 제외 | +| E2-C13 | d축정렬/기울임, full/partial/all-fixed rotations와 drill-only free를 지원 global component BC로 구성. Expected null은 constrained director exact-zero 교집합, tiny nonzero 보존. Global n0/N>n 실패 | +| E2-C14 | d=(2p/(1+p²),0,(1-p²)/(1+p²)), m=j1,h0, URX fixed. p=1/2000와1e-8 모두 analytic rank5; 두 번째 conditioning failure, p0만 exact null1. Rank cutoff mutation 검출 | +| E2-C15 | K[[6,2],[2,4]],Mdiag(2,0)의 lambda5/2,z=-p/2; 단순 삭제3을 거부. Production shell에 Kpz/nonpositiveKzz 위반 주입 후 실패, general dense fallback 추가 안 함 | +| E2-C16 | M[[2,1],[1,2]],K[[6,4],[4,6]]→lambda2,10/3. Whitening/복원/original M normalization; wrong lambda/mass/vector/constraint mutation 검출 | +| E2-C17 | 실제 FEAST: n1 lambda2; [0,0,0,2,5,9] N1/4/6; [1,2,4,8] N1/2/4; n4 allzero N1/4. Production bound search로 lowest N·zero·N=n 확인 | +| E2-C18 | 실제 FEAST n64의 첫40개 lambda1, 나머지2..25, N1/41; [1,1+2^-28,1+2^-27,8] N2와 고정 Givens dense congruence. Repeated group>N, c 전체 Gram, distinct cluster merge 금지 | +| E2-C19 | [-2,0,3],[-1e-12,0,1] raw negative 및 정확한 ±tau_zero 경계. Significant negative 실패, nearzero 분류/raw 보존, 양수화/삭제 금지 | +| E2-C20 | rho×4→M×4,lambda/4,normalized amplitude1/2; 길이×1024,rho/1024³,E/1024,t×1024의 단위변환 lambda 불변. Same physical BC와 baseline s 사용 | +| E2-C21 | Count info1은 certified empty 아님. Optional failed/unknown prefix는 certified enclosure로 fallback, successful nonmonotone count는 실패. Final count/solve mismatch와 invalid/SPD/inner-solver/nonfinite/Gram/residual 등 status 주입은 C5의 retry/즉시실패 분류대로 검사 | +| E2-C22 | 실제 endpoint/cluster probes 및 mock count512/solve3/초기count3 한계, budget 직전 fallback·예약 불충분 실패. n²/nm0/nnz+1/index/byte overflow·allocation 실패. a0 below spectrum은 독립 bound로 검증; empty count 성공을 필수로 기대하지 않음 | +| E2-C23 | 원본 single Step-2/N10/density/blank bounds/normalization, source Lanczos/SIM/acoustic-free 의미; unsupported preload/acoustic/mixed/damping/비영 BC 등의 silent no-op 금지. I/O allowlist로 구체화 | +| E2-C24 | Source renumbering, HDF5 self-check와 final normalized modes/used mass/backend/count evidence; solve/validation/write/close/replace failure의 기존 state/final 보존. 정확한 layout은 I/O | +| E2-C25 | [Reference model](reference-model.md)의 원본 Value 10개, per-modal-frame singleton families·identity/finite 전검사·inclusive row/RMS/nearzero/zero scale; reordered rows/동일값 distinct IDs 허용, missing/extra/duplicate 거부 | +| E2-C26 | Retained shell/shellNL/linear-limit fresh solve·기존 U blocking/UR warning·reaction review-only, density-free static, partial-BC response, Newton tangent/objectivity/force/moment/free residual/energy/rollback·pressure synthetic·기타 기존 회귀 | +| E2-C27 | 향후 구현 시 구성 MSVC x64 Debug 전체 CMake/CTest와 actual FEAST/필수 reference를 한 번 연결. Source identity로 등록/선택/실행/제외를 구분하고 관련 없는 회귀 보존. 고정 과거 test 수 또는 중복 manual/automatic 실행 요구 없음 | + +E2-C17/18/22는 mock만으로 충족하지 않는다. E2-C21의 실패 주입은 actual FEAST를 +바꾸는 행위가 아니라 adapter 경계 테스트다. Expected eigenvalues로 production bounds를 +설정하거나 동일 production 함수를 oracle로 호출하지 않는다. Actual FEAST의 G01/G02 +installed probes에는 occupied/empty/endpoint count 반환·flag reset·full m0=n/zero matrix· +workspace/ABI/thread 복원이 포함된다. 아직 **NOT RUN**이다. + +E2-C26은 excluded original/copied/cached examples를 절대로 사용하지 않는다. +제외된 혼합 시험에 있던 retained shellNL force/moment balance·free force/moment residual +네 관찰, nonzero constrained resultant 및 shell/linear-limit 원본 보존 관찰은 retained fixture에 +따로 연결한다. Pressure external fresh coverage 부재를 내부 synthetic 통과로 대체하지 않는다. + +## 27개 requirement coverage + +접두사는 `FEM-REQ-MITC4-EIGEN2-`, Case 접두사는 `E2-C`를 생략한다. + +| Requirement suffix | Cases | +| --- | --- | +| 001 | 23,25 | +| 002 | 01,08,12,23,26 | +| 003 | 06,07,23 | +| 004 | 01,02,07 | +| 005 | 01,02,03 | +| 006 | 01,03,11,13 | +| 007 | 06,13,27 | +| 008 | 08,13,14,15,16 | +| 009 | 13,17,18,19,22,23 | +| 010 | 17,18,25,27 | +| 011 | 03,16,17,23,25 | +| 012 | 14,19,21,22,24 | +| 013 | 11,16,17,18,21 | +| 014 | 01,02,03,04,05,08,11,20 | +| 015 | 23,25 | +| 016 | 07,21,23 | +| 017 | 24,25 | +| 018 | 06,13,16,24,25 | +| 019 | 21,22,24 | +| 020 | 25,26 | +| 021 | 25 | +| 022 | 25 | +| 023 | 27 | +| 024 | 09,12,26,27 | +| 025 | 27 | +| 026 | 01,02,03,04,05 | +| 027 | 08,09,10,11,12,26 | diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review-controls.md b/docs/mitc4-shell-feast-eigen2/numerical-review-controls.md new file mode 100644 index 0000000..a984e8d --- /dev/null +++ b/docs/mitc4-shell-feast-eigen2/numerical-review-controls.md @@ -0,0 +1,112 @@ +# 내부 수치 기준과 FEAST controls + +- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r1`. +- 기본 보고서: [numerical-review](numerical-review.md); 수식: [새 formulation](formulation.md). +- IEEE binary64의 내부 검증 계약이며 [외부 TOLERANCE](../TOLERANCE.md)를 변경하지 않는다. + +## C1–C4, C6, C7의 독립 검토 후 명시 채택 + +[이전 controls](../mitc4-shell-feast-eigen/numerical-review-controls.md)의 C1, C2-01~14와 +nodal rcond 절, C3-01~08와 raw classification, C4, C6의 seed/QR/thread/storage, +C7의 retained static 기준을 전부 읽고 새 M/S/E 식에 대조하여 **수치 정의만 채택**한다. +이것은 과거 판정·runtime·reference pass의 승계가 아니다. 다음 적용 경계가 우선한다. + +- E/V/S 식 번호는 [새 formulation](formulation.md)과 그 문서가 명시 채택한 + [V1–V5 측정식](../mitc4-shell-feast-eigen/formulation-verification.md)에 대응한다. +- 이전 C5 전체와 lower/empty-prefix search는 채택하지 않는다. 아래 C5가 완전히 대체한다. +- C6 count `n×n`은 이번의 보수적 allocation 선택이며 Intel의 최소 workspace 의무가 아니다. + Count input capacity `n`, 반환 count, solve capacity `m0`, 요청 `N`은 서로 다른 값이다. +- C7는 `shell`, `shellNL`, linear-limit 및 내부 synthetic 의무에만 적용한다. + 이전 문서의 제외 예제·고정 검사 수·고정 workflow는 채택하지 않는다. +- Runtime/ABI/thread의 설치 확인은 **NOT RUN**이며 후속 implementation 의무다. + +| 분류 | 채택한 기준과 근거 | +| --- | --- | +| 단위·zero branch | `ell=max active edge length`, `D=diag(ell I3,I3)` congruence 뒤 norm. Finite-first; 분자=분모=0이면 항등식 metric0, 분모0·분자비영이면 failure. Zero vector/nonpositive mass는 실패. Floor/clamp 없음 | +| 대수 C1/C2 | Symmetry·oracle·moment·covariance·null/PZ·Cholesky reconstruction `<=1e-12`; `u=2^-53`, `gamma4096≈4.55e-13`와 기존 linear algebra 기준. 어려운 geometry의 forward accuracy 보장 아님 | +| 질량 C2 | Scalar Ck entry error를 `m_e(t/2)^k`로 나눔; first moment는 `m_e ell`. Strict `mi,ji,ji-hi²/mi>0`; analytic rank와 director constraint exact-zero intersection. Nodal scaled positive block `rcond_inf>=2^-32`; 작으면 failure이며 rank 변경 금지 | +| Modal C3 | Original free residual·whitened residual·`norm(Bx-mu x)/norm(x)`·normalization·pairwise orthogonality·Gram·energy·rigid/scaling `<=1e-10`; FEAST stopping `1e-12`와 별도 독립 후검증 | +| Known spectrum | Error/s `<=1e-10`, known distinct gap 존재 시 error `<=gap/8`; exact repeated subspace projector `<=1e-6`는 isolated known gap `>=1e-3 s`인 검증군에만 적용 | +| Raw 분류 | `mu=lambda/s`, `tau_zero=1e-9`, `tau_cluster=1e-8`; `mu<-tau_zero`는 실패, 양끝 포함 near-zero는 분류만. Raw 부호·값 보존, 작은 양수 mode 삭제 금지, 음수 frequency 생성 금지 | +| 결정론 C4/C6 | Stable raw sort, equal tie는 solver column; connected cluster 평균/merge 금지. Source 최대 scaled component sign·첫 tie. 같은 runtime/thread/input 세 반복의 structure/order exact; repeated vector는 projector 비교 | +| 정적 C7 | Linear symmetry/frame/energy `1e-12`, full residual/equilibrium `1e-10`. Nonlinear directional tangent `1e-6`, zero direction `1e-10`, objectivity `1e-10`, factor-one force/moment balance 각각 `1e-8`; 기존 typed Newton zero/100-iteration/no-cutback 계약 유지 | + +C6의 seed `0x4D495443344D4645`, uint64 recurrence +`z=6364136223846793005*z+1442695040888963407 mod 2^64`, column-major +`x=2*(double(z>>11)*2^-53)-1`, nonpivoted Householder QR 및 positive R diagonal을 채택한다. +`m0=n`은 identity. QR relative pivot `<=1e-12`는 실패, post-QR Gram `<=1e-12`다. +Seed 변경으로 통과를 찾지 않는다. oneMKL thread-local 1을 설정하고 모든 exit에서 반환된 +이전 설정을 복원한다. 이 반환 의미는 이번 [Intel 원문](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)에서 재확인했다. + +## C5. Fixed lower enclosure와 bounded upper search + +실제 backend는 `dfeast_scsrgv(B,I)`, `uplo='U'`, sorted duplicate-free 1-based CSR이다. +각 call에 `feastinit` 후 C-index fpm을 다음과 같이 다시 설정한다. + +| Index | 값 | +| --- | --- | +| `[0],[1],[2],[3]` | `0,16,12,20` | +| `[4],[5],[13]` | `1,1,0` | +| `[26],[27]` | `1,1` | +| `[49]` | Count `1`, solve `0` | +| `[63]` | `0` | + +나머지는 해당 설치의 초기값을 유지·기록한다. 이번 [Intel parameter table](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)의 허용 contour16, +trace stopping, CSR/SPD checks와 count flag reset을 확인했다. 위 값은 FESA의 고정 +제어 선택이며 어떤 matrix에서도 수렴한다는 vendor 보장이 아니다. + +Gershgorin off-diagonal absolute row sum은 매 합산 뒤 `nextafter(+infinity)`로 outward +누적하고 diagonal±sum도 바깥 한 ULP를 적용한다. `beta=norm(B,inf)`도 outward로 구한다. +`B=0`의 algorithmic enclosure에서만 beta=1이며 physical mass/λ floor가 아니다. +`ulp(v)`는 양쪽 finite adjacent spacing의 큰 값, +`delta(v)=1e-8 beta+64 ulp(v)`로 고정한다. Finite overflow/underflow로 strict bound를 +구성할 수 없으면 failure다. `a0=nextafter(gL-16delta(gL),-inf)`, +`b0=nextafter(gU+16delta(gU),+inf)`로 spectrum을 엄밀히 포함한다. +정확한 B=0은 별도 결정론 branch로 **초기 (a0,b0)=(-1,1)**를 사용하며 위 gL/gU padding +식을 적용하지 않는다. 초기 endpoint 재시도 j=0,1,2에서는 `(-2^j,2^j)`를 사용한다. +이 branch에서도 beta=1의 동일 delta·count/solve·분리·raw 검증을 적용한다. + +**하한은 a0로 고정한다.** 바깥 spectral bound가 lower completeness를 증명하므로 +empty-prefix count를 의무로 호출하지 않는다. 최초 `(a0,b0)` count는 `info=0,c=n`이어야 +한다. 초기 endpoint 재시도는 최초 포함 최대3회이며 `info=1,-5` 또는 성공 count!=n에만 +허용한다. Attempt j=0,1,2에서 최초 16delta padding을 `2^j`배로 넓히고 outward 처리한다. +최종 성공 enclosure를 a0,b0로 고정한다. 그 외 status·3회 소진은 failure다. +이 성공 bracket은 항상 fallback 후보로 보존한다. + +Upper candidate v의 세 intervals `(a0,v-delta(v))`, `(a0,v)`, `(a0,v+delta(v))`가 +strict하고 enclosing 범위 안에 있으며 모두 `info=0`이고 같은 count c이면 guarded endpoint다. +`c>=N`이면 certified upper로 저장하고 더 낮은 v를 탐색한다. `c=N 재확인; interior b는 세 guard 재확인. b0는 outward bound가 margin 증거이며 outside empty count를 요구하지 않음 | +| Solve capacity | `m0=min(n,max(c+8,ceil(3c/2)))`; c=n이면 n. Overflow 전 exact integer 검사 | +| Solve 횟수 | 최초 포함 최대3, 각 refinement 최대20 | +| Solve retry | `info=1,2,3`, count/returned-m mismatch, endpoint separation failure에만 저장한 더 큰 certified b 선택 후 재count; 최종 b0. `m0=min(n,max(new formula,2*previous m0))` | +| Retry 종료 | 더 큰 certified bracket/증가 capacity 등 바뀐 입력이 없으면 동일 실패 call 반복 금지; 최종 검증·budget 부족이면 failure | +| 즉시 실패 | Nonfinite eigenpair, Gram/residual 실패, 유의한 negative spectrum, invalid/SPD/inner-solver/index/allocation 오류. Mass/seed/backend/threshold 변경 금지 | + +Returned `m=c`, 전체 c개 독립 Gram/residual 및 `mu-a0>=delta(a0)`, +`b-mu>=delta(b)`를 검사하고 첫 N개만 공개한다. N번째가 반복군 안이면 전체 c를 +검사하되 외부 requested rows는 N개다. Bounds/status/count/m0/m/loops/epsout/최종 ranks와 +모든 실패·fallback을 기록한다. 초기 total count=n만으로 floating API의 무오류를 주장하지 +않으며 known spectra/runtime probes로 구현을 반증 가능하게 검증한다. + +## Storage와 미실행 위험 + +Count `x[n*n]`, `e[n]`, `res[n]` 보수 storage와 identity initial subspace를 사용한다. +`1<=N<=n<=MKL_INT_MAX`, `nnz+1`, `n+1`, `6*nodes`, `n*m0`, `n*n`, byte product, +container max_size 및 `min(SIZE_MAX,PTRDIFF_MAX)`를 overflow **전** 검사한다. +Global inverse를 만들지 않으며 allocation/shifted factorization 실패는 명시적으로 종료한다. +Count n² scratch는 최소 memory 보장이나 전체 peak memory 추정이 아니다. +[Research G01/G02](research-evidence.md)의 installed empty/occupied/endpoint/count reset, +workspace·header/runtime probes는 **NOT RUN**이다. Safe enclosing fallback으로 빈 count 성공이 +수학적 전제에서는 제거됐지만 실제 FEAST 실행·메모리·cluster 동작 검증 의무는 남는다. diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review-evidence.md b/docs/mitc4-shell-feast-eigen2/numerical-review-evidence.md new file mode 100644 index 0000000..6a53b04 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen2/numerical-review-evidence.md @@ -0,0 +1,184 @@ +# 독립 수학 검산 evidence + +- Feature ID: `mitc4-shell-feast-eigen2` +- Owner: `numerical-review-agent` +- 검토일: `2026-09-08`; 기본 보고서: [numerical-review](numerical-review.md). +- 대상: 새 requirement r1. 아래는 Python 표준 라이브러리만 사용하는 수학 검산이며 C++/FEAST 실행이 아니다. + +## NR-MFE-001의 geometry부터 재계산 + +`a=(0,1,0)`, `b=(-4/5,0,3/5)`, `d=(3/5,0,4/5)`이고 +`X=[-2a-b,2a-b,2a+b,-2a+b]`, `E=12`, `nu=0`, `rho=t=1`이다. +Node 1 URZ만 free이고 나머지 23 DOF는 fixed다. Z45° 회전은 같은 physical +free subspace를 유지한다. 아래는 [이전 독립 적분](../mitc4-shell-feast-eigen/numerical-review-evidence.md)의 +평판 membrane/curvature/MITC edge-work를 검토한 뒤 geometry edge에서 길이·axes·director를 +다시 얻도록 구성한 새 실행이다. 기존 수치 출력이나 저장 K를 입력으로 쓰지 않는다. +전역 24×24 physical K를 직접 적분하고 새 director의 least-aligned tangent를 재생성해 +여덟 rotary diagonal의 trace mean을 계산한다. 비교 대상 congruence에만 원 K를 회전한다. + +```python +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(a): return sqrt(dot(a,a)) +def unit(a): return tuple(x/norm(a) for x in a) +def sub(a,b): return tuple(x-y for x,y in zip(a,b)) +def rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2]) +def action(A,x): return [dot(row,x) for row in A] +def rotate_vector(v): return [x for i in range(0,len(v),3) for x in rz(v[i:i+3])] +def rotate_matrix(A): + left=list(zip(*(rotate_vector(c) for c in zip(*A)))) + return [rotate_vector(row) for row in left] +def err(a,b): return norm(sub(a,b))/(norm(a)+norm(b)) +D=[4. if i%6<3 else 1. for i in range(24)] +def merr(A,B): return err([D[i]*A[i][j]*D[j] for i in range(24) for j in range(24)],[D[i]*B[i][j]*D[j] for i in range(24) for j in range(24)]) +def qerr(a,b): return err([x/s for x,s in zip(a,D)],[x/s for x,s in zip(b,D)]) +def rerr(a,b): return err([x*s for x,s in zip(a,D)],[x*s for x,s in zip(b,D)]) +def build(X): + edge1=sub(X[1],X[0]); edge2=sub(X[3],X[0]) + lx,ly=norm(edge1),norm(edge2); ex,ey=unit(edge1),unit(edge2) + d=unit(cross(ex,ey)); area=lx*ly + 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 [(-1,-1),(1,-1),(1,1),(-1,1)]: + nx=sx*(1+sy*eta)/(2*lx); ny=sy*(1+sx*xi)/(2*ly) + 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]+=area/4*(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)) + axis=min(range(3),key=lambda k:(abs(d[k]),k)) + ta=unit(tuple(float(c==axis)-d[axis]*d[c] for c in range(3))) + tb=cross(d,ta); diag=[] + for i in range(4): + for tangent in [ta,tb]: + v=[0.]*24; v[6*i+3:6*i+6]=tangent + diag.append(dot(v,action(K,v))) + kd=fsum(diag)/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]=area/4 + 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]=area/48*(float(a==b)-d[a]*d[b]) + return K,M,kd,d,ey,diag +a=(0.,1.,0.); b=(-.8,0.,.6) +X=[tuple(s*a[k]+t*b[k] for k in range(3)) for s,t in [(-2,-1),(2,-1),(2,1),(-2,1)]] +K,M,kd,d,ey,diags=build(X) +Kr,Mr,kdr,dr,eyr,diagsr=build([rz(x) for x in X]) +load=[0.]*24; load[3:6]=[5*x/3 for x in ey]; lr=rotate_vector(load) +q=[0.]*24; qr=[0.]*24; q[5]=load[5]/K[5][5]; qr[5]=lr[5]/Kr[5][5] +r=sub(action(K,q),load); rr=sub(action(Kr,qr),lr) +targets=[float(F(19,4800)),float(F(10369,7500)),float(F(3,50)),float(F(10369,450)),float(F(7500,10369))] +actual=[kd,K[5][5],M[5][5],K[5][5]/M[5][5],q[5]] +for v,w in zip(actual,targets): assert abs(v-w)/(abs(v)+abs(w))<1e-12 +cov=[merr(Kr,rotate_matrix(K)),merr(Mr,rotate_matrix(M)),qerr(qr,rotate_vector(q)),rerr(rr,rotate_vector(r))] +assert max(cov)<1e-12 +assert abs(kd-kdr)/(abs(kd)+abs(kdr))<1e-12 +assert abs(dot(d,load[3:6]))/norm(load[3:6])<1e-12 +for A,v,f,residual in [(K,q,load,r),(Kr,qr,lr,rr)]: + assert abs(residual[5])/(abs(A[5][5]*v[5])+abs(f[5]))<=1e-10 +print('partial_bc=',actual) +print('rotated_partial_bc=',[kdr,Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5]]) +print('covariance_K_M_q_reaction=',cov) +print('fresh_rotary_diagonals=',diags,diagsr) +``` + +## 독립 rational mass oracle + +다음 coefficient-dictionary 적분은 production shape/J/질량 함수를 사용하지 않는다. +이전 문서의 rational fixture 자체는 재사용하지만 모든 계수·행합·first moment를 이번에 +다시 적분한다. Kernel-level director fixture이며 input explicit-normal 지원을 추가하지 않는다. + +```python +from fractions import Fraction as F +from itertools import permutations, product +from math import sqrt +def const(x): return {(0,0,0):F(x)} +def add(*args): + out={} + for a in args: + for p,c in a.items(): out[p]=out.get(p,F(0))+c + return {p:c for p,c in out.items() if c} +def scale(a,c): return {p:v*c for p,v in a.items() if v*c} +def mul(a,b): + out={} + for p,c in a.items(): + for q,d in b.items(): + key=tuple(x+y for x,y in zip(p,q));out[key]=out.get(key,F(0))+c*d + return {p:c for p,c in out.items() if c} +def diff(a,k): + out={} + for p,c in a.items(): + if p[k]: + q=list(p);q[k]-=1;out[tuple(q)]=c*p[k] + return out +def integ(a): return sum((c*F(8,(p[0]+1)*(p[1]+1)*(p[2]+1)) for p,c in a.items() if all(v%2==0 for v in p)),F(0)) +def value(a,x): return sum(float(c)*x[0]**p[0]*x[1]**p[1]*x[2]**p[2] for p,c in a.items()) +v=[{tuple(int(k==i) for k in range(3)):F(1)} for i in range(3)] +N=[scale(mul(add(const(1),scale(v[0],sx)),add(const(1),scale(v[1],sy))),F(1,4)) for sx,sy in [(-1,-1),(1,-1),(1,1),(-1,1)]] +X=[(-1,-1,F(1,10)),(1,-1,-F(1,10)),(1,1,F(1,5)),(-1,1,-F(1,10))] +d=[(0,0,1),(F(3,5),0,F(4,5)),(F(2,3),F(1,3),F(2,3)),(0,F(3,5),F(4,5))] +z=scale(v[2],F(1,4));pos=[add(*(mul(N[i],add(const(X[i][c]),scale(z,d[i][c]))) for i in range(4))) for c in range(3)] +J={} +for perm in permutations(range(3)): + inversions=sum(perm[i]>perm[j] for i in range(3) for j in range(i+1,3)) + term=const((-1)**inversions) + for c in range(3): term=mul(term,diff(pos[c],perm[c])) + J=add(J,term) +rhoJ=scale(J,F(3));zk=[const(1),z,mul(z,z)] +polys=[[[mul(mul(mul(rhoJ,N[i]),N[j]),zk[k]) for j in range(4)] for i in range(4)] for k in range(3)] +C=[[[integ(p) for p in row] for row in mat] for mat in polys] +rows=[[sum(row,F(0)) for row in mat] for mat in C] +assert [mat[0][0] for mat in C]==[F(17609,28800),F(11003,1440000),F(88177,6912000)] +assert [sum(row,F(0)) for row in rows]==[F(7743,1600),F(739,12000),F(517,5120)] +first=[sum((rows[0][i]*X[i][c]+rows[1][i]*d[i][c] for i in range(4)),F(0)) for c in range(3)] +assert first==[integ(mul(rhoJ,p)) for p in pos] +g=[(-sqrt(3/5),5/9),(0.,8/9),(sqrt(3/5),5/9)] +maxerr=0.;jvals=[] +for q in product(g,repeat=3): jvals.append(value(J,[s[0] for s in q])) +for k,i,j in product(range(3),range(4),range(4)): + approx=sum(value(polys[k][i][j],[s[0] for s in q])*q[0][1]*q[1][1]*q[2][1] for q in product(g,repeat=3)) + maxerr=max(maxerr,abs(approx-float(C[k][i][j]))) +assert min(jvals)>0 and maxerr<1e-12 +central=[rows[2][i]-rows[1][i]**2/rows[0][i] for i in range(4)] +assert min(central)>0 +print('mass_C11=',[str(mat[0][0]) for mat in C]) +print('mass_rows=',[[str(x) for x in row] for row in rows]) +print('mass_first_moment=',[str(x) for x in first]) +print('mass_Jrange_Gauss_error_central=',min(jvals),max(jvals),maxerr,float(min(central))) +``` + +## 이번 실행 결과 + +2026-09-08 PowerShell here-string에서 이 문서의 두 Python block을 추출하고 +`subprocess.run([sys.executable,'-B','-'])`으로 각각 실행했다. Oracle 1/2 exit `0`이다. + +| 항목 | 이번 직접 계산 | +| --- | --- | +| `kd`, `Kff`, `Mff` | `0.003958333333333333`, `1.3825333333333332`, `0.05999999999999998` | +| `lambda` 원/회전 | `23.04222222222223` / `23.042222222222208`; exact `10369/450 [T^-2]` | +| 단위 moment의 `thetaZ` 원/회전 | `0.7233098659465717` / `0.7233098659465714`; exact `7500/10369` | +| Complete `K`, `ML`, response, full reaction 공변성 ratio | `1.483e-16`, `7.915e-17`, `1.535e-16`, `1.654e-16` | +| 원/회전 free residual raw | `0`, `-1.1102230246251565e-16`; 기존 scaled `1e-10` 기준 충족 | +| Rational `C0_11,C1_11,C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` | +| `sum m,sum h,sum j` | `7743/1600`, `739/12000`, `517/5120` | +| Spatial first moment 두 독립식 | Exact equal: `(-79747/360000,-685951/2880000,49651/320000)` | +| 27점 J min/max | `0.1285991922161525` / `0.2701341411171808` | +| Gauss vs rational 최대 entry absolute error | `2.220446049250313e-16` | +| 최소 nodal central inertia | `0.022318161338791092 > 0` | + +최초 oracle 1 exit `1`은 회전 후 raw free residual에 잘못 추가한 exact-zero assertion이었다. +반력은 일반 floating arithmetic이며 원 계약은 scaled residual `1e-10`이다. +이를 기존 기준으로 수정하고 raw 값을 보존했다. Exact constrained displacement zero 조건, +정식화 또는 승인 tolerance를 변경한 것이 아니다. + +외부 solver, FEAST runtime, build/test, retained static fresh solve 및 HDF5–reference +comparison은 **NOT RUN**이다. 위 항등식의 통과는 구현/reference 통과가 아니다. diff --git a/docs/mitc4-shell-feast-eigen2/numerical-review.md b/docs/mitc4-shell-feast-eigen2/numerical-review.md new file mode 100644 index 0000000..62d26b5 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen2/numerical-review.md @@ -0,0 +1,64 @@ +# 독립 Numerical Review + +- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r1`. +- 입력: [requirements r1](requirements.md), [evidence](requirements-evidence.md), + [새 research](research.md), [새 formulation r1](formulation.md), [TOLERANCE](../TOLERANCE.md). +- Verdict: **`pass-for-io-definition`**. 새 수학 계약의 확인된 blocking defect 없음. +- 범위: 문서·독립 수학 검산. 구현, FEAST runtime, build/test, reference comparison, Physics/release 통과 판정이 아니다. + +## 판단과 독립 근거 + +새 질량·stabilization·constraint/FEAST 문서를 실제 작성 후 모두 읽었다. +기존 pass를 전제로 삼지 않고 새 요구 27개와 식·실패 경계를 대조했다. +기준 문서는 [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), +[ARCHITECTURE](../ARCHITECTURE.md), [ADR-028](../ADR.md#adr-028)이다. + +| 검토 | 판단 | +| --- | --- | +| 운동학·부호·DOF·단위 | `[uX,uY,uZ,thetaX,thetaY,thetaZ]`, `S=-[d]cross`, `S theta=theta cross d`의 signs와 mass cross-block transpose 일치. C0/C1/C2 차원 M/ML/ML²; 길이 congruence 후 eigen/residual norm 일관 | +| 적분·consistent mass | `NiNj z^k J` 최대 성분별 차수4로 27점의 degree5 정확성 충분. Positive weights/J에서 Hq=0인 다항식은 모든 nodal u=0, Si theta=0이므로 physical20 positive, drill null4. 독립 rational 적분으로 C1 비영·행합·first moment 재현 | +| Derived lumped | Partition of unity로 scalar moment row-sum과 `integral rho Ni Gi^TGi` 일치. Strict Cauchy–Schwarz로 rank5/node·central tangent inertia 양수. Jensen 차1/2와 kinetic energy 추가1/2 구분. Orbital inertia/모든 spectrum 동일성을 주장하지 않음 | +| 공변 stabilization | Rotary block trace는 independent tangent orthogonal change에 불변. 여덟 항을 모두 평균하며 양의 초기 scale. Geometry/frame부터 재적분한 complete K/ML와 partial-BC static reaction이 공변; NR-MFE-001 새 식에서 해소 | +| 실제 BC·finite spectrum | Free injection을 먼저 적용. Constrained director exact-zero 교집합만 mass null이고 tiny positive는 유지. Shared director와 positive kd로 KZ=Zdiag(kappa), Kpz=0,Kzz>0; partial BC에 남은 stabilization 보존. 일반 Schur 반례5/2 대 삭제3도 정합 | +| Whitening·안정성 | Mp nodal SPD Cholesky와 `A=L^-1KpL^-T`·`phi=DCPL^-T x`는 exact congruence. Null rank와 numerical conditioning 분리, inverse/floor/pseudoinverse 우회 없음 | +| Lowest N·multiplicity | Fixed a0의 outward enclosure가 낮은 spectrum 부재 근거. 성공 total count=n과 guarded upper search·bounded enclosing fallback, final c=count=m와 c 전체 Gram/residual을 조합. Count empty 성공의 비보장성은 필수 수학 전제에서 제거 | +| Recovery·state | 최종 normalized phi에서 gi/yf를 다시 계산한 full original-free residual·Gram·Rayleigh/energy를 검사. Constrained components exact zero; modal reaction/stress를 새 output으로 만들지 않음. 검증 candidate·writer finalize 후 state commit 경계 유지 | +| 비선형 영향 | Initial kd의 Dkd=D²kd=0으로 기존 objective potential의 residual/Hessian 미분을 유지. Nonlinear Hessian SPD나 초기 Dgamma=linear Td를 주장하지 않음. 선형극한·objectivity·회귀·rollback은 후속 실행 의무 | + +Fresh 독립 oracle의 재현 코드와 실제 값은 [numerical-review-evidence](numerical-review-evidence.md)에 있다. +NR-MFE-001은 `kd=19/4800`, `Mff=3/50`, `Kff=10369/7500`, +`lambda=10369/450`, 단위 moment `thetaZ=7500/10369`을 확인했다. +Complete K/ML/response/full reaction 공변성 ratio는 모두 `1.7e-16` 미만이다. +곡면 mass rational oracle와 27점 적분 최대 entry 차는 `2.221e-16` 미만이었다. + +## 고정한 기준과 후속 인계 + +- [내부 controls](numerical-review-controls.md): 검토 후 채택한 기존 C1–C4/C6/C7 수치 정의, + 새 fixed-lower C5·finite budgets·seed·conditioning·raw classification. 기존 workflow/제외 portfolio/과거 pass는 미채택. +- [27개 verification cases](numerical-review-cases.md): requirement 27개별 analytical/invariant, + actual FEAST·실패 주입·남는 static coverage. Expected value는 production 재호출로 생성하지 않는다. +- [reference-model](reference-model.md): 원본 TXT의 literal `Frame: Mode i`와 유일한 source + `Step-2`에서 per-modal-frame 10 singleton Value families를 새로 판정했다. 공통 정책 그대로 + 행5%·RMS1%, 이번 singleton의 실효 각 Value1%; 모두 blocking. 외부 mode shape gate 없음. + +I/O는 정확한 입력 allowlist·diagnostic·영속 HDF5 경로 및 source/modal identity를 정의한다. +최소한 used lumped mass/backend, N개 public pair와 전체 c개 검증의 재현 evidence, +raw negative/nearzero와 frequency validity, 실패한 optional optimization·fallback까지의 +count/solve history를 의미 손실 없이 연결해야 한다. 데이터 layout은 NR가 선점하지 않는다. + +## 잔여 위험·미실행 + +Research G01/G02의 installed count-empty/endpoint/workspace·ABI probes, n1/N=n/allzero/ +repeated/clustered actual FEAST와 shifted sparse factorization memory는 **NOT RUN**이다. +현재 수학 blocker는 아니지만 구현 완료 시 필수다. 넓은 enclosing fallback도 runtime 실패나 +O(n²) 메모리 비용을 없애지 않으며 bounded failure와 기존 결과 보존이 필요하다. + +얇은 shell·거의 정렬된 partial BC의 positive mass conditioning, 왜곡/곡면 MITC4의 +locking·accuracy, 27점 밖 geometry injectivity 및 floating count의 정확성 한계가 남는다. +이 한계를 arbitrary rank cutoff·reference fitting·tolerance 완화로 숨기지 않는다. +남는 shell/shellNL/linear-limit fresh solves와 nonlinear tangent/objectivity·balance는 미실행이다. +제외된 네 예제의 원본·복사·cache를 읽거나 사용하지 않았다. Pressure fresh 외부 coverage 부재를 명시한다. + +확인된 수학 correction request는 없다. 구현 owner는 명시 controls/cases를 실제 runtime과 +연결하고 I/O owner는 reference/validation projection을 보존해야 한다. Source/tests, +upstream 계약·공통 tolerance·reference artifacts·Git은 수정하지 않았다. diff --git a/docs/mitc4-shell-feast-eigen2/reference-model.md b/docs/mitc4-shell-feast-eigen2/reference-model.md new file mode 100644 index 0000000..25cff20 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen2/reference-model.md @@ -0,0 +1,78 @@ +# 외부 reference projection과 tolerance 적용 + +- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `numerical-review-agent`; revision `r1`. +- 기본 보고서: [numerical-review](numerical-review.md); 기준: [requirements](requirements.md), [TOLERANCE](../TOLERANCE.md). +- 판정: 비교 계약 정의 완료. 실제 FESA 결과 comparison은 **NOT RUN**. + +## Eigen의 지정 원본과 logical identity + +Input은 [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp), +reference는 같은 폴더의 [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt)다. +이름·내용·확장자를 보존한다. 공식 FESA 결과는 입력 lexical sibling +`shellNL-eigen-meshfine_results.h5`이며 exact dataset path·metadata는 I/O 소유다. +Actual backend MKL FEAST, actual mass derived nodal block lumped인 결과만 비교한다. + +이번 원본 TXT 직접 읽기에서 각 행은 `Frame: Mode i: Value = ... Freq = ... (cycles/time)`였다. +TXT 자체에는 step이 없다. 동일 `.inp`의 **유일한 frequency step `Step-2`**가 step authority이며 +필수 count는 해당 `*FREQUENCY`의 N=10이다. Filename의 `shellNL`이나 Step-2라는 이름에서 +preload를 추론하지 않는다. Source step이 유일하지 않으면 임의 step 선택으로 비교하지 않는다. + +Stable logical row key는 `(reference case, source step name=Step-2, modal frame=Mode i, +mode index=i, logical quantity=eigenvalue, component=Value)`다. Matrix equation index나 +행 위치를 identity로 쓰지 않는다. `i=1..10`의 오름차순 결과와 label로 직접 대응한다. +같은 Value를 갖는 다른 mode는 distinct identity다. 표시 precision이 같다는 이유로 exact +multiplicity를 단정하거나 average/deduplicate하지 않는다. + +| Modal frame / mode | 원본 Value `[T^-2]` | +| --- | ---: | +| 1 | 219507 | +| 2 | 885523 | +| 3 | 885523 | +| 4 | 1855340 | +| 5 | 2740230 | +| 6 | 2775150 | +| 7 | 4149410 | +| 8 | 4149410 | +| 9 | 6733790 | +| 10 | 6733790 | + +## Family의 독립 결정 + +공통 정책은 같은 model/step/**frame**/logical quantity/차원/좌표/판정 영향만 한 family에 +허용한다. 원본은 Mode i 각각을 frame으로 명시하므로 `eigenvalue:Step-2:Mode-i`라는 +**10개 singleton family**를 정의한다. 각각 scalar invariant 좌표, 단위 차원 `T^-2`, +component `Value`, `blocking`이다. 모든 mode를 한 frame으로 합치는 것은 원본 frame +의미를 삭제하며 낮은 mode의 scale을 높은 mode로 바꾸므로 채택하지 않는다. +이는 과거 singleton 결론을 자동 승계하거나 결과 오차를 본 뒤 고른 family가 아니다. + +각 family의 S=abs(reference Value), B=.01S, 행별 relative limit .05 및 relative RMS .01을 +그대로 적용한다. 이번 양의 singleton에서 RMS=relative error이므로 실효 각 Value limit은 +1%다. 그렇더라도 행 판정과 RMS를 각각 기록한다. Inclusive boundary, near-zero, +zero-reference-scale의 exact-zero 및 named failure는 공통 문서 그대로다. +Frequency 변환, Freq fitting, mode shapes/변위/회전/stress/reaction은 새 eigen 외부 gate가 아니다. + +File/dataset/component/schema 누락, wrong step/frame/quantity/backend/mass variant, +missing/extra/duplicate mode, 비유한 Value 또는 FESA mandatory 수치는 tolerance **전에** 실패한다. +TXT row 재정렬은 허용하되 모든 nonempty 행의 schema를 파싱하고 원본 Value를 수정하지 않는다. +Required scalar Value의 finite 검사를 별도 Freq 비교로 대신하지 않는다. Freq는 schema/의미 +확인용이며 수치 acceptance에 넣지 않는다. 모든 family/row/error/scale/RMS/판정의 순서는 결정적이다. + +## 남는 static portfolio + +아래는 [새 requirements](requirements.md)의 기존 acceptance 보존이며 eigen family와 섞지 않는다. + +| 역할 | 기존 원본과 비교 | +| --- | --- | +| `shell-s4`, `shell-s4-linear-limit` | [shell.inp](../../reference/shell/shell.inp), [shell displacements.csv](../../reference/shell/shell%20displacements.csv); 같은 fresh solve 재사용 가능하나 두 역할 evidence 구분 | +| `shellnl-s4-final` | [shellNL.inp](../../reference/shellNL/shellNL.inp), [shellNL displacements.csv](../../reference/shellNL/shellNL%20displacements.csv); factor-one accepted state | +| Nonlinear local reaction review | [shellNL reactions.csv](../../reference/shellNL/shellNL%20reactions.csv); RF1/2/3, physical spatial RM1/2 source-key·finite·inventory·error 보고는 review-only | + +Static U1/U2/U3 global length는 blocking, UR1/UR2/UR3의 기존 fixed-initial global rotation +의미는 warning-only다. 같은 case/step/frame/차원/좌표/impact별 공통 family와 source +instance/node/component identity를 유지한다. Local reaction review는 내부 force/moment +balance·free residual blocking을 대체하지 않으며 RM3/stress를 새 gate로 추가하지 않는다. + +제외된 네 예제는 원본·복사·cache·과거 결과로도 재사용하지 않는다. 정확한 제외 목록의 +권위는 requirements다. 제외 pressure 예제의 fresh 외부 coverage는 없으며 synthetic +pressure kernel/하중/평형/schema/comparator는 유지한다. 이번 원본 열람은 지정 eigen 두 +파일에 한정했고 static 파일은 경로 존재만 확인한다. Solver/reference pass 주장은 없다.