chore: remove retired workflow and historical material

This commit is contained in:
KOKO\Mimi
2026-10-17 22:39:47 +09:00
parent 4bd19f5bf0
commit 774b80099c
768 changed files with 0 additions and 54164 deletions
-124
View File
@@ -1,124 +0,0 @@
# MITC4 Shell Mass Matrix와 FEAST 고유치해석 결정 기록
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `coordinator-agent`
- Input contract revision: `r2`
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md),
[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md).
이 문서는 이전 MFE baseline의 승인·운영 결정 이력이다. 현재 구현 상태는
[eigen2 PRD](../mitc4-shell-feast-eigen2/PRD.md), 이전 환경 실패는
[개발 교훈](development-notes.md#실패와-재발-방지)을 따른다. 과거 stage/Hook 결정을 현행 실행 절차로 복원하지 않는다.
## MFE-ADR-001 — 사용자 지정 backend와 reference 범위
- 상태: 사용자 요청으로 확정된 intake 범위.
- 결정 owner: user; 기록 owner: coordinator-agent.
- 결정: MITC4 질량행렬 및 고유치해석을 구현하고 고유치 계산에는 MKL FEAST를 사용한다. 지정된 `reference/shellNL-eigen-meshfine` reference에서 외부 비교는 고유치만 수행한다.
- 근거: 2026-09-06 사용자 요청; [Feature PRD 사용자 요구](PRD.md#사용자-요구와-승계-경계).
- 영향: backend 대체, 외부 mode-shape acceptance 추가 또는 reference 변경으로 요구를 우회하지 않는다.
## MFE-ADR-002 — MITC4 질량 이산화
- 상태: 사용자 후속 요구로 확정됨; 상세 lumping 수식은 Research/Formulation 소유.
- 결정 owner: user; 선택지 검토 owner: requirement-agent; 상세 수식 owner: formulation-agent.
- 결정: `consistent mass`를 계산하고 이를 이용하여 `lumped mass`도 계산한다. 앞서 제안한 둘 중 하나의 선택이 아니라 두 계산의 연결이 사용자 요구이다.
- 근거: 2026-09-06 사용자 후속 답변 “mass matrix는 consistent mass를 계산하고 이를 이용해서 lumped mass를 계산합니다.”; [원래 질문 evidence](requirements.md#requirements-evidence--중요한-결정).
- 영향: Requirement owner는 r1에서 두 계산과 관계를 baseline에 반영한다. 실제 FEAST 질량은 후속 명시 답변으로 lumped로 확정되었으며 MFE-ADR-004를 따른다.
- 경계: 기존 비물리 drilling DOF에 인공 관성을 추가하지 않는 방향을 권고한다. FEAST generalized problem의 mass SPD 조건과 질량 없는 drilling 처리는 Research와 Formulation이 물리 spectrum 보존 근거를 제시해야 한다. 축소 수식은 이 관리문서에서 정하지 않는다.
해석 기준 상태, backend 입력 관례 및 additive 결과량은 Requirement owner의 reference와 기존 계약 evidence로 정리한다.
새로 밝혀지는 비호환 영속 계약 또는 다른 critical 선택이 있으면 별도 근거와 함께 기록한다.
## MFE-ADR-003 — Local 검증 경로와 점진적 커밋
- 상태: 사용자 요청으로 승인됨.
- 결정 owner: user; 기록 owner: coordinator-agent.
- 결정: `FESA_GTEST_SOURCE_DIR`는 `C:\git\googletest`를 사용한다. 사용자 수정 `AGENTS.md`를 커밋하고 이후 작업도 Git에 점진적으로 커밋한다.
- 근거: 2026-09-06 사용자 후속 답변; Root가 해당 GoogleTest `CMakeLists.txt` 존재를 확인했다.
- 영향: Root는 사용자 수정 `AGENTS.md`와 완료된 upstream 문서의 정확한 경로 checkpoint를 커밋한다. 구현 단계 branch·step 선택·source/phase 커밋은 기존 Harness Executor 소유를 유지한다. Remote 작업 승인은 포함하지 않는다.
## MFE-ADR-004 — FEAST에 사용하는 질량행렬
- 상태: 사용자 명시 답변으로 승인됨.
- 결정 owner: user; 대안·영향 owner: requirement-agent.
- 결정: `consistent mass -> lumped mass -> 고유치 해석` 순서로 수행하고 FEAST/reference baseline의 `M`은 derived lumped mass를 사용한다. Consistent는 lumping 원본과 내부 질량 검증 대상으로 유지한다.
- 이유와 영향: 사용자가 최종 계산 흐름과 해석 사용 질량을 직접 명시했다. Modal residual, normalization 및 orthogonality의 기준 `M`도 실제 사용한 lumped mass이다.
- 근거: 2026-09-06 사용자 답변 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을 할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”; [Requirement owner r1 결정 evidence](requirements.md#requirements-evidence--중요한-결정)의 `MFE-OQ-002`를 해소한다.
- 경계: 두 mass variant 외부 비교 또는 사용자 선택 API를 추가 요구하지 않는다. Lumping 수식은 Research/Formulation이 계약과 evidence로 구체화한다.
## MFE-ADR-005 — 요청 고유치 개수의 입력 권위
- 상태: 사용자 명시 확인; 기존 r1 요구사항의 의미 유지.
- 결정 owner: user; 기록 owner: coordinator-agent.
- 결정: 고유치 개수는 `.inp`의 `*FREQUENCY` data를 사용한다. 지정 input의 요청은 `10`개이며 reference 행수나 FEAST 내부 count 추정으로 요청 개수를 역추론하지 않는다.
- 근거: 2026-09-06 사용자 답변 “inp 파일의 고유치 개수를 사용합니다”; [r1 FEM-REQ-MITC4-EIGEN-009/015](requirements.md#requirements--requirement-verification-matrix).
- 영향: 기존 mode-count 의미의 확인이므로 contract revision은 `r1`을 유지한다. FEAST interval/subspace는 입력 요청의 낮은 N개와 multiplicity·누락 검증을 충족하기 위한 내부 처리이다. 새 입력 설정 기능을 추가하지 않는다.
## MFE-ADR-006 — 질량 lumping과 질량 없는 좌표의 정식화
- 상태: 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#formulation--핵심-계약), [mass M1~M10](formulation.md#formulation-mass), [eigen E1~E8](formulation.md#formulation-eigen).
- 영향: 곡면 coupling 및 mass/centroid·energy 차이를 명시하고 인공 drilling mass와 일반 dense Schur는 도입하지 않는다. Numerical Review는 수식·conditioning·FEAST controls·reference 준비를 독립 검토한다.
- 후속 검토: r1 NR-MFE-001로 확인된 기존 basis-dependent stabilization과 REQ-014 충돌은 MFE-ADR-007의 사용자 승인 개선 범위로 해결한다. r2 [V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식)는 complete K와 supported partial BC 검증을 명시하며 수식의 독립 판정은 NR가 수행한다.
## MFE-ADR-007 — 기존 stabilization과 좌표 불변성 acceptance 정합
- 상태: 사용자 명시 승인; `MFE-OQ-003`의 좌표 공변적인 stabilization 개선 및 영향받는 정적/eigen 재검증 범위 추가안 선택.
- 발견 owner: numerical-review-agent; requirement intent owner: requirement-agent; 기록 owner: coordinator-agent.
- 근거: [NR-MFE-001](numerical-review.md#numerical-review--blocking-finding), [재현 가능한 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례).
- 발견: 동일 물리 partial rotation BC를 유지한 회전에서 기존 basis-dependent `kd=min(tangent diagonals)` 때문에 고유치가 상대 `1.1291343961675893e-5`만큼 달라진다. 새 mass 또는 analytic reduction의 확인된 결함은 아니다.
- 판단 근거: [Requirement owner 검토](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토)는 `FEM-REQ-MITC4-EIGEN-002/008/014`와 기존 shell의 fixed `kd` 계약을 대조했다. 알려진 지원 모델 반례를 제외하는 것은 acceptance 변경이며 기존 강성의 교체·삭제도 묵시적으로 승인되지 않았다.
- 검토했던 대안: 기존 stabilization과 partial BC 지원을 유지하며 좌표 의존성을 한계로 수용하고 `014` 적용 범위를 변경하는 안과, 좌표 공변적인 stabilization 개선 및 영향받는 기존 정적/eigen 계약·회귀 검증을 추가하는 안을 비교했다.
- 권고 owner와 이유: requirement-agent는 같은 물리 모델의 축 선택 의존성을 해결하는 후자를 권고한다. 기존 강성 계약 영향 검토와 정식화·회귀 검증 작업이 늘어나며 대체 수식은 Formulation 소유이다.
- 승인 근거: 2026-09-06 사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에 포함해주세요.” Root가 원문과 권고안 B 승인 사실을 Coordinator에 전달했다.
- 결정 owner: user; 상세 요구 owner: requirement-agent; 개선 수식 owner: formulation-agent.
- 영향: 승인된 scope 변경으로 contract revision을 `r2`로 올린다. Requirement owner가 기존 물리 kernel 재사용과 개선된 stabilized pencil 보존을 구분하고 해당 static/eigen 회귀 요구를 명시한다. 영향받는 Research/Formulation/NR evidence는 owner별 최소 delta 검토 후 갱신한다.
- 경계: Partial BC 지원, 질량 흐름·FEAST 사용 mass·입력 N, reference 원본과 공통 tolerance를 유지한다. 기존 feature 보고서는 읽기 전용 이력으로 참조하며 현재 feature에서 대체되는 stabilization 계약의 범위를 명시한다. 사용자 승인으로 NR의 수치 gate나 구현 검증을 대신 통과시키지 않는다.
- 후속 근거: [Research R07](research.md#research-evidence--r07--r2-stabilization-근거와-영향)에 trace/spectral 기반의 기저 불변 scale 후보와 초기 고정 nonlinear 미분 구조, linear positive/null 조건을 기록했다. 이는 연구 후보이며 수식 채택은 Formulation owner가 수행한다.
## MFE-ADR-008 — 초기 physical trace 평균 stabilization scale
- 상태: 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.md#formulation-stabilization), [V8의 exact arithmetic·정적 evidence](formulation.md#formulation-verification--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가 독립 직접 적분으로 확인했다. [r2 evidence](numerical-review.md#numerical-review-evidence)는 기존 실패와 새 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.md#numerical-review-controls)의 같은 단위 metric/zero branch·analytic rank/conditioning·modal residual/Gram·FEAST parameter/seed/thread/storage/budget과 [27개 필수 case](numerical-review.md#numerical-review-cases)를 적용한다. 구체 수치의 원본은 해당 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와 혼동하지 않는다.
## MFE-ADR-010 — Eigen 입력과 additive 결과 계약
- 상태: r2 I/O owner의 계약과 정적 evidence gate 확인.
- 결정 owner: io-definition-agent; 기록 owner: coordinator-agent.
- 결정: [입력 I1~I6](io.md#io-input)의 constant density·단일 frequency·입력 N·부수 옵션 subset을 적용한다. [O1~O5](io.md#io-schema)의 eigen procedure discriminant와 source step identity, 공개 N개 scalar/vector 및 전체 c 검증·FEAST call evidence를 저장한다.
- 이유·영향: 기존 static schema0/1의 의미와 mandatory inventory는 유지한다. 새 eigen은 `(schema_version=0, eigen_schema_version=1, analysis_procedure=linear-frequency)`와 Feature ID로 구분한다. Raw negative lambda와 unavailable real frequency를 명시적으로 분리하며 기존 non-Newton log lifecycle은 보존한다.
- 근거·경계: [M1~M5](io.md#io-mapping)의 책임·candidate replace 후 no-fail swap·원본 TXT full grammar 및 27개 요구 mapping을 따른다. 외부 projection은 공개 modes의 Value만 사용하고 10개 singleton family의 공통 판정을 유지한다. 영속 N개 vector는 내부 재현용이며 외부 mode-shape gate를 추가하지 않는다. 실제 parser/HDF5/FEAST/comparator 성공은 아직 미실행이다.
## MFE-ADR-011 — 유한 실행 준비와 검증 단위
- 상태: r2 Planning owner의 실행 계약 및 정적 gate 확인; 실제 실행은 미완료.
- 결정 owner: implementation-planning-agent; 사용자 실행 권한 해석: Root; 기록 owner: coordinator-agent.
- 결정: [계획](development-notes.md#실패와-재발-방지)의 별도 prep 1개 step 뒤 새 invocation으로 main 8개 step을 실행한다. 결합된 API/data 단위를 통합해 불필요한 full VERIFY 반복을 줄이고 각 step의 TDD·focused/full VERIFY·등록 Stop은 유지한다.
- 운영 근거: 기존 전체 검증의 약27.9분 합산 추정과 여러 1800초 deadline, nonlinear helper의 매번 solve 및 이미 로드된 Executor/Stop의 activation 경계를 [환경 E2/E3](development-notes.md#실패와-재발-방지)에 대조했다. 준비에서는 단일 유한 class timeout만 지정 후 실제 Executor main을 호출하며 runtime default의 최소 변경과 대응 Harness tests를 수행한다.
- 경계: Bootstrap은 기존 CLI option이나 sandbox 확대가 아니다. 정확한 값/명령은 Planning 문서의 원본을 따르고 Hook state·reentry·실행 메서드·retry·ownership guard를 override하지 않는다. Root/Coordinator도 active invocation 동안 non-owned 편집·커밋을 멈춘다. 보고 시점의 manual evidence와 Executor 종료 뒤 registered Stop/actual exit 사후 확인을 구분하며 성공 전 main activation을 하지 않는다.
- 실제 결과: [prep attempt1](development-notes.md#실패와-재발-방지)은 기본 workspace-write에서 지정 `.codex/hooks.json` 변경을 거부당해 `blocked-environment`로 종료했다. Partial runtime/test/doc 변경과 마지막 test 수정 미검증을 보존한다. 현재 결정은 sandbox 확대나 성공 판정 권한을 포함하지 않으며, guarded Executor checkpoint 복구 계획 후 해당 실행 직전 명시적 사용자 승인 경계를 적용한다.
## MFE-ADR-012 — Source echo 분류 오탐의 bounded 운영 correction
- 상태: 실제 최소 Correction1회와 targeted GREEN37 확인; 전체 prep gate는 환경 차단으로 미완료.
- 발견·재현 owner: Root; 계획 owner: implementation-planning-agent; correction dispatch owner: coordinator-agent.
- 근거: 실제 raw/순수함수 재현(당시 경로: `../../.harness/build/mitc4-eigen-evidence/prep/attempt1/classifier-observation.json`, 현재 checkout에 없음), [복구 R4](development-notes.md#실패와-재발-방지), [prep TDD](../../phases/mitc4-shell-feast-eigen-execution-prep/step0.md).
- 결정: 성공한 source-read 출력의 helper marker를 실제 runtime failure로 오인하는 분류 결함만 기존 `scripts/execute.py`/`tests/test_execute.py` 안에서 먼저 수정한다. 진짜 helper 진단, 명시 terminal/history, 실제 wrapper timeout만 허용되는 retry 및 sandbox/ownership 보호를 유지한다.
- 순서·이유: 기존 timeout-only AST guard로 현재 blocked/WIP를 먼저 보존하고 별도 Correction 뒤 새 Executor process를 시작한다. 이미 import된 classifier는 child source 수정만으로 바뀌지 않으며 reload/guard override로 성공을 만들지 않는다. 실제 Hook 쓰기 거부는 별도 환경 blocker로 보존한다.
- 경계: Physics/schema/tolerance `r2`와 선행6개 기술 계약을 바꾸지 않는다. Correction은 별도 signature의 unused allowance 확인 후 명시 dispatch하며 성공·검증·커밋은 실제 결과 뒤에만 기록한다. Exact-run sandbox 사용자 승인과 full VERIFY는 유지한다.
- 실제 evidence: [Correction owner 보고서](development-notes.md#실패와-재발-방지)는 RED21fail/16pass 후 GREEN37pass, full Python152pass/Hook assertion1fail, manual build의 FileTracker TEMP 접근 거부 및 CTest 미실행을 기록한다. [Coordinator 사후 관찰](development-notes.md#실패와-재발-방지)은 native/registered Stop/CTest의 실제 exit0, 별도 자동362pass와 비소유 bytes 보존을 확인했다. Source/test 교정은 아직 checkpoint 전이며 두 번째 Correction을 허용하지 않는다. 확인된 process-local workspace 환경과 unchanged Executor 보존 절차는 Planning의 후속 delta에서 고정한다.
@@ -1,22 +0,0 @@
# mitc4-shell-feast-eigen 문서·작업 지침
- Feature ID: `mitc4-shell-feast-eigen`
- 문서 진입점·목적·사용법·Handoff: [README](README.md).
- 현재 범위·checklist: [PRD](PRD.md); 결정·승인·대체 이력: [ADR](ADR.md).
- 적용 범위: 해당 기능의 문서. 자동 로드되는 코드 영역 `AGENTS.md`가 아니다.
기준: [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md),
[Feature 문서 관리](../FEATURE_DOCUMENTATION.md), [공통 tolerance](../TOLERANCE.md).
## 보존할 계약과 인계
수식·I/O·수치 기준의 원본은 README에서 연결한 전문 문서를 따른다. 기능을 재개할 때
관련 계약과 실제 실행 revision·미해결 항목을 함께 읽는다. 과거 stage pass나 현재 문서
정리를 solver 검증 통과로 계산하지 않는다. 요구사항·ADR ID와 승인 이력을 유지한다.
메인은 PRD·ADR·진입점·문서 참조를 관리하고 전문 작업자는 할당한 본문과 관련 범위만 수정한다.
기존 개인 설정·reference·다른 작업자의 변경을 보존하며 실패를 tolerance 완화로 숨기지 않는다.
문서만 수정하면 정적 검토를 수행하고, 동작 변경에는 관련 검사와 필요한 독립 검토를 수행한다.
이 폴더는 이전 MFE 요구·유도·반례의 이력이다. 현재 구현은 [eigen2](../mitc4-shell-feast-eigen2/README.md)가
소유한다. 이전 controls/schema/reference portfolio의 자동 승계와 prep/Hook 복원을 금지한다.
이전 MFE ID와 새 MFE2 ID의 대응·채택/비채택 범위를 확인한다.
-49
View File
@@ -1,49 +0,0 @@
# 이전 MITC4 질량·FEAST 요구 baseline
- Feature ID: `mitc4-shell-feast-eigen`; 이전 input contract revision: `r2`.
- 현재 용도: MFE 요구사항·승인·유도·반례의 이력. 새 구현 상태는 [eigen2 PRD](../mitc4-shell-feast-eigen2/PRD.md)가 소유한다.
- 진입점과 이전 실행 실패: [README](README.md), [개발 교훈](development-notes.md).
- 승인 이력: [ADR](ADR.md); 요구 ID·근거: [requirements](requirements.md).
## 사용자 요구와 승계 경계
Consistent mass로부터 lumped mass를 유도하고 실제 FEAST·입력 N·Value-only 원본 비교를
구현하며 공변 drilling 개선과 영향받는 정적/eigen 재검증을 요구했던 baseline이다.
과거9-stage·Hook prep는 현재 실행 절차가 아니다. 수학 근거의 채택/비채택과 MFE→MFE2
대응은 새 baseline에서 명시하며 이전 pass·controls·test 수를 자동 승계하지 않는다.
## 범위와 acceptance
입력 semantic model, 질량행렬과 equation 구성, FEAST adapter, procedure state, HDF5 결과 및 고유치 comparison의 end-to-end 기능이 대상이다.
구체적인 질량 정식화, 해석 기준 상태, 모드 요청 의미, 출력량 및 지원 subset은 Requirement Agent가 evidence를 조사하고 후속 owner와 critical decision 절차로 고정한다.
외부 mode-shape 비교, reference 생성·수정·복원과 외부 배포는 요청된 범위에 포함되지 않는다.
MSVC x64 Debug CMake/CTest, TDD, common tolerance, failure preservation과 독립 physics 검토를 적용한다.
Requirement ID별 원본 계약과 검증 matrix는 [requirements.md](requirements.md#requirements--requirement-verification-matrix)가 소유한다.
| Requirement IDs (`FEM-REQ-MITC4-EIGEN-`) | Acceptance 요약 및 원본 계약 |
| --- | --- |
| `001`~`004` | [원형상 procedure, 기존 shell mapping, material density와 section 연결](requirements.md#requirements--requirement-verification-matrix) |
| `005`~`008` | [질량 이산화 선택, 물리 관성, 조립, massless 좌표 admissibility](requirements.md#requirements--requirement-verification-matrix) |
| `009`~`014` | [낮은 모드, multiplicity, FEAST, 실패 처리, 내부 eigenpair 및 physics evidence](requirements.md#requirements--requirement-verification-matrix) |
| `015`~`019` | [입력 subset, 진단, HDF5, source/modal identity 및 candidate 보존](requirements.md#requirements--requirement-verification-matrix) |
| `020`~`022` | [고유치-only 외부 비교, identity 사전검사 및 common tolerance](requirements.md#requirements--requirement-verification-matrix) |
| `023`~`025` | [TDD·MSVC 검증, 기존 정적 회귀 및 동일 revision의 독립 closure](requirements.md#requirements--requirement-verification-matrix) |
| `026` | [Consistent에서 lumped 유도 및 질량·관성 불변식](requirements.md#requirements--requirement-verification-matrix) |
| `027` | [좌표 공변적인 numerical stabilization 및 영향받는 static/eigen 검증](requirements.md#requirements--requirement-verification-matrix) |
Reference는 선행 preload 없는 단일 frequency step의 10모드이며 상세 관찰과 단위 의미는
[requirements evidence](requirements.md#requirements-evidence--원본-reference-관찰)에 있다.
두 질량 계산의 연결에 관한 [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), 상세 근거는 [research-evidence](research.md#research-evidence)에 있으며 최종 수식·수치 기준의 승인을 대신하지 않는다.
구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md#formulation), 고정된 내부 수치 기준은 [NR controls](numerical-review.md#numerical-review-controls), 필수 검증은 [27개 cases](numerical-review.md#numerical-review-cases)에 있다.
[Reference artifact·logical readiness](reference-model.md)와 독립 수학/controls evidence를 함께 확인하여 r2 NR gate를 통과했다.
[I/O 계약](io.md#io)은 [exact 입력 subset](io.md#io-input), [additive HDF5와 내부 modal evidence](io.md#io-schema), [책임·failure·Value projection](io.md#io-mapping)을 정의했다. Source Step-2와 canonical storage Step-1, 입력 요청 N과 전체 검증 c를 구분하며 기존 static 계약은 보존한다. 구현 계획은 27개 요구와 I/O 검증 obligation을 실제 TDD·full VERIFY·fresh reference 경로에 연결해야 한다.
[실행 계획](development-notes.md#실패와-재발-방지)은 운영 준비 1개와 main 8개 step으로 구체화했고 [verification mapping](development-notes.md#실패와-재발-방지)에 요구27/NR27/I/O11 및 필수 test40개를 연결했다. 정확한 owned paths·actual backend·유한 실행시간·fresh solve·등록 Stop 사후 확인은 [환경 계약](development-notes.md#실패와-재발-방지)과 각 phase step을 따른다. 실제 실행 성공과 독립 physics/release gate는 아직 남아 있다.
r1의 [NR-MFE-001 실패 이력](numerical-review.md#numerical-review-evidence)은 기존 `002/008`의 stabilized pencil 보존과 `014`의 eigen coordinate-invariance evidence 관계였다.
Requirement owner는 알려진 partial-BC 반례를 단순 clarification으로 제외할 수 없다고 판단했다.
[MFE-OQ-003 대안·영향](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토) 중 좌표 공변적인 stabilization 개선과 영향받는 정적/eigen 재검증 범위 추가가 사용자에게 승인되었다. 단순 한계 수용 및 acceptance 축소안은 선택되지 않았다.
사용자가 확정한 질량 계산 흐름·FEAST 사용 mass·입력 N·외부 Value-only 범위는 유지한다. 개선 수식과 실제 구현·검증은 해당 owner의 후속 gate를 거쳐야 한다.
기존 fixed scale의 [대체 경계](requirements.md#requirements--r2의-기존-계약-대체-범위)와 [필수 static 회귀 포트폴리오](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)는 Requirement owner r2에 명시되어 있다. 과거 정적 reference의 U/UR 및 reaction 검토 정책은 해당 기존 계약으로 재검증하고 새 eigen 비교량은 Value로 유지한다.
[r2 research delta](research.md#research-evidence--r07--r2-stabilization-근거와-영향)는 기저 불변 scale 후보, 초기 고정 nonlinear lifecycle 및 linear massless 처리의 조건을 구분한다. 최종 수식 채택과 반례 해소 판정은 후속 owner 소유이다.
[r2 stabilization 정식화](formulation.md#formulation-stabilization)는 `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다.
@@ -1,33 +0,0 @@
# 이전 MFE 실행 실패와 Handoff
## 현재 위치
이전 `mitc4-shell-feast-eigen`의 준비 작업은 현행 구현 절차가 아니다. 재시도 계획·
Hook/Stop trust 설정·bounded dispatch·stage 소유권과 개인 workspace 복구 명령은 제거했다.
실제 구현은 [mitc4-shell-feast-eigen2](../mitc4-shell-feast-eigen2/README.md)에서 완료됐다.
이전 pass/timeout/test 수를 새 기능의 완료 evidence로 승계하지 않는다.
## 실패와 재발 방지
- Source를 출력한 stdout를 runtime error로 오분류한 문제가 있었다. exit 0의 source echo와
실제 helper failure를 구분하도록 교정했다. 당시 targeted RED 21 failed/16 passed → GREEN 37 passed.
- 교정 시 전체 pytest는 152 passed/1 failed였고 MSVC build는 FileTracker 접근 거부로 실패했다.
targeted pass를 전체 pass로 표시하지 않는다. Hook 쓰기 거부는 승인된 수식의 실패가 아니다.
- `FileTracker`의 `UnauthorizedAccessException`/`0x80070005`와 CMake discovery 실패는 별도로 진단한다.
같은 환경 실패를 반복하지 말고 실제 실행 argv·compiler·dependency·exit를 확인한다.
- MSVC x64+Ninja preset을 사용하며 compiler 경로의 `Hostx64`/`HostX64` 문자열 차이로 cache가
재초기화된 사례가 있었다. 부모 환경 설정과 child 설정의 유효 범위를 확인한다.
- 과거 자동 실행은 362 tests/exit0 기록이 있지만 수동 build는 여전히 실패한 시점이 있었다.
서로 다른 실행을 하나의 성공으로 합치지 않는다. 프로세스 PID/출력만으로 native exit를 추정하지 않는다.
- 출력 파일 lease 경합의 `output-busy`는 수식 오류나 reference 불일치와 다르다.
병렬 검사끼리 같은 최종 경로를 공유하지 않는지 확인한다.
- 개인 `.harness/config.json`·`CMakeUserPresets.json`과 당시 14400/7500/7200초의 timeout은
그 workspace 실행 이력이다. 현재 Hook를 복원하거나 공통 기본값으로 강제하지 않는다.
## 재사용과 evidence 경계
MFE 요구사항 ID·ADR, 질량·stabilization·축소 유도 및 rational 반례는 이 폴더에 남긴다.
현재의 FEAST residual stopping·모드별5%·S3 보류와 실제 실행은 eigen2가 소유한다.
환경 준비와 검사 명령은 [operations](../operations.md)·[HARNESS](../HARNESS.md)를 따른다.
원문 실행 로그·복구 계획은 Git `858e87b`의 기존 경로에 남아 있다. 현재 checkout에
존재하지 않는 ignored artifact는 당시 evidence 위치이며 재실행·검증 근거가 새로 생긴 것은 아니다.
-743
View File
@@ -1,743 +0,0 @@
# 이전 MFE 입력·결과·mapping 계약
이전 baseline의 계약 이력이다. 현재 입력·schema·controls는 [eigen2 I/O](../mitc4-shell-feast-eigen2/io.md#io)가 원본이다.
<a id="io"></a>
<a id="io--mitc4-mass와-feast-io-계약"></a>
## MITC4 mass와 FEAST I/O 계약
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 요청 outcome: `pass`; 다음 owner: `implementation-planning-agent`
- 의미: Stage 5 계약 검토 요청이며 workflow 전이·구현 완료 판정이 아니다.
지역 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[coordination](development-notes.md#실패와-재발-방지)이다. [Requirements](requirements.md#requirements)와
[승인 evidence](requirements.md#requirements-evidence), [research](research.md#research)/[상세 근거](research.md#research-evidence),
[formulation](formulation.md#formulation), [NR](numerical-review.md#numerical-review)/[독립 evidence](numerical-review.md#numerical-review-evidence),
[controls](numerical-review.md#numerical-review-controls), [cases](numerical-review.md#numerical-review-cases),
[reference-model](reference-model.md)의 r2를 적용했다.
[프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md),
[TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md),
[문서 관리](../FEATURE_DOCUMENTATION.md)가 공통 기준이다.
<a id="io--핵심-계약"></a>
### 핵심 계약
1. [입력·validation](io.md#io-input)은 constant material density, 원형상 단일 frequency step,
입력 requested N, homogeneous global BC와 원본의 부수 옵션을 고정한다. Source
Lanczos/SIM과 actual FEAST를 구분한다. 기존 static은 density 없이 계속 동작한다.
2. [결과 schema](io.md#io-schema)는 기존 static schema를 보존하고 eigen procedure 전용
additive 계약을 정의한다. 공식 파일은 lexical sibling `<stem>_results.h5`이고,
source step과 mode 1..N, raw lambda, actual lumped mass/backend 및 내부 검증 증거를
저장한다. N개 global modal vectors는 내부 검증 재현을 위해 mandatory다.
3. [책임·failure·comparison mapping](io.md#io-mapping)은 Domain/view/DOF/별도 eigen state의
경계, candidate commit, source identity, 원본 TXT의 Value-only projection과
27개 requirement 및 I/O test obligations를 연결한다. 외부 mode-shape gate는 없다.
`consistent -> derived lumped -> MKL FEAST` 및 [mass](formulation.md#formulation-mass),
[reduction/commit](formulation.md#formulation-eigen), [verification](formulation.md#formulation-verification),
[r2 stabilization](formulation.md#formulation-stabilization)의 수학을 변경하지 않는다.
FEAST 수치 controls와 외부 10개 singleton family의 공통 판정도 그대로다.
Routine field layout·새 procedure의 additive schema를 정의했으며 기존 public 계약의
비호환 변경 또는 새 사용자 결정은 발견하지 않았다.
<a id="io--evidence와-한계"></a>
### Evidence와 한계
`Get-Content`, scoped `rg`로 원본 input/TXT, 기존 linear/nonlinear/pressure I/O,
실제 syntax/model mapping, HDF5 writer, source identity 및 diagnostics 경계를 대조했다.
새 keyword 의미는 공식 Abaqus 2025 공개 문서를 확인했고 locator·적용 한계를
[입력 출처](io.md#io-input--공개-근거와-적용-한계)에 기록했다. Abaqus는 외부 syntax/quantity
convention이며 내부 parser, mass, integration, stabilization 또는 ODB와 동등성을 주장하지 않는다.
정적 검증 명령·exit, owned metadata/links/coverage와 원본 inventory는
[감사 evidence](io.md#io-mapping--정적-감사-evidence)에 기록한다.
새로 작성한 문서는 이 보고서와 `io-input.md`, `io-schema.md`, `io-mapping.md`뿐이다.
Source/tests/build/phase/Hook/Git 및 upstream/reference는 수정하지 않았다.
문서 단계이므로 C++ build/test, Harness, 실제 FEAST, 외부 solver 및 FESA/reference
수치 비교는 미실행이다. Header나 계약 존재를 실행 성공으로 보고하지 않는다.
Planning은 각 test obligation을 정확한 owned paths와 RED/GREEN/focused/full VERIFY에
연결하고, Implementation/Physics는 fresh eigen 결과 및 승인된 static 회귀를 검증해야 한다.
Ill-conditioned positive mass의 명시적 실패, FEAST floating-point count/cluster 한계,
count scratch와 shifted factorization 비용은 [NR controls](numerical-review.md#numerical-review-controls)의
잔여 위험이며 I/O가 cutoff·fallback·새 tolerance로 우회하지 않는다.
<a id="io-input"></a>
<a id="io-input--mitc4-eigen-입력-subset과-진단"></a>
## MITC4 eigen 입력 subset과 진단
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md#io)
<a id="io-input--i1-문법과-source-identity"></a>
### I1. 문법과 source identity
기존 [linear shell I/O §1](../linear-static-mitc4-shell/io.md),
[현재 pressure I/O §3](../shell-surface-pressure-load/io.md)의 공통 lexical 계약을 재사용한다.
현재 [input reader](../../src/fesa/io/abaqus/input_reader.cpp)와
[mapping context](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 읽기 전용 대조했다.
예전 nonlinear 문서의 continuation 미지원 설명보다 후속 승인된 pressure lexical 규칙이 우선한다.
- CRLF/LF를 수용한다. Physical line은 종결자를 제외해 최대 256 ASCII bytes이며 printable
ASCII와 horizontal tab만 허용한다. `**` comment와 blank line은 semantic effect가 없다.
Inline comment, data continuation, include, substitution, quoted/escaped 이름은 지원하지 않는다.
- Keyword/parameter/enum/name lookup은 ASCII case-insensitive다. Parameter 순서는 무관하지만
duplicate name은 값이 같아도 실패한다. Raw spelling, keyword physical lines, data fields와
normalized lexical input path/1-based line을 보존한다. Keyword terminal comma는 기존
parameter continuation이며 직후 comment/blank/new keyword/EOF interruption은 실패한다.
- Comma split은 빈 필드를 보존한다. 각 token 주변 space/tab만 trim한다. 아래 명시된
공란 외에 arbitrary trailing-empty 제거를 적용하지 않는다.
- Source node/element label은 positive decimal int64이고 raw digits와 numeric identity를
분리한다. Scope 내 같은 numeric label은 duplicate다. Name/target는 기존 shell의
비어 있지 않은 ASCII 이름·qualification 규칙을 재사용한다. 새 step name도 같은
name token이며 생략 시 source name은 `Step-1`이다. HDF5 path에 raw name을 삽입하지 않는다.
- 새 `rho` numeric token은 `[+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?`다.
C-locale full consumption과 binary64 finite conversion을 요구한다. NaN/Inf, hex, D exponent,
overflow/underflow conversion error는 실패한다. N은 `[0-9]+`와 checked int64 범위이며
값이 양수여야 한다. 기존 keyword의 승인된 numeric parsing은 이 기능 때문에 바꾸지 않는다.
<a id="io-input--i2-지원-keyword와-위치"></a>
### I2. 지원 keyword와 위치
Eigen input의 문법은 `heading? preprint? part+ assembly material+ model-boundary* step EOF`다.
Comments/blank는 블록 사이에 허용한다. 기존 mesh/set nesting과 forward material/section
resolution은 유지한다. 활성 모델은 S4/S4R shell만 포함한다.
| Keyword | Eigen subset·data | 의미와 validation |
| --- | --- | --- |
| `*HEADING` | Optional 첫 keyword, parameter 없음, text rows | Heading provenance. Duplicate/nesting 오류 거부 |
| `*PART`, `*END PART` | `NAME` 하나; close parameter/data 없음 | Part-local topology. 중첩/중복/미종결 거부 |
| `*NODE` | Part scope, parameter 없음; `label,x,y,z` | Finite initial global midsurface coordinates. 중복·잘못된 arity 거부 |
| `*ELEMENT` | Part scope, `TYPE=S4` 또는 `TYPE=S4R`만; `label,n1,n2,n3,n4` | 같은 MITC4 physical/mass path와 별도 source type. 네 distinct resolved nodes 필요 |
| `*NSET`, `*ELSET` | Part/assembly scope; 해당 `NSET=name` 또는 `ELSET=name`, optional flag `GENERATE`; assembly는 `INSTANCE=name` 필수. 기존 assembly ELSET의 `INTERNAL` flag도 유지 | Explicit positive labels, 또는 `first,last,increment` inclusive generate. 기존 set row trailing comma 허용. Nonpositive/역순/도달 불가능 range·empty·duplicate definition·dangling/cyclic/mixed-instance 거부 |
| `*SHELL SECTION` | Part scope, `ELSET`, `MATERIAL` 필수; 한 row `t[,integration_points]` | Centered homogeneous layer, constant finite t>0, element별 유일 assignment. Optional second field가 있으면 positive decimal integer; 아래 예외 적용 |
| `*ASSEMBLY`, `*END ASSEMBLY` | Top-level 하나, `NAME`; close parameter/data 없음 | Assembly scope, nested/duplicate 거부 |
| `*INSTANCE`, `*END INSTANCE` | Assembly scope, `NAME`, `PART`; data 없음 | Identity instances; 같은 part의 여러 identity instance 허용. Transform/dangling/duplicate 거부 |
| `*MATERIAL` | Top-level model data, `NAME`; data 없음 | Named material 소유. Case-insensitive unique |
| `*ELASTIC` | Current material, parameter 없음; 한 row `E,nu` | 기존 finite E>0, -1<nu<0.5; constant isotropic. Missing/duplicate/dependent 거부 |
| `*DENSITY` | Current material, parameter 없음; I3 | Constant positive volume mass density |
| `*BOUNDARY` | Model data 또는 sole step의 FREQUENCY 뒤·output requests 전; parameter 없음; `target,first,last[,value]` | 1<=first<=last<=6, value 생략은 exact0; 있으면 finite exact0만 허용. 네 번째 empty token은 생략과 다르며 거부 |
| `*STEP`, `*END STEP` | I4; 정확히 하나의 top-level step | Prior/multiple/nested step·preload 없음 |
| `*FREQUENCY` | I4; sole step 첫 procedure | Original configuration, undamped real lowest-N eigenproblem |
| 부수 output keywords | I5의 exact combinations만 | Mandatory output 선택/억제 기능 없음, warning provenance |
`t,5`의 두 번째 값은 [기존 사용자 승인 예외](../linear-static-mitc4-shell/io.md#11-shell-section-data-rule)에
따라 warning 없이 읽는 source provenance다. 별도 physical property를 만들지 않는다.
Stiffness는 기존 2×2×2, mass는 [M5](formulation.md#formulation-mass)의 3×3×3이며 이 값으로 바뀌지 않는다.
이 예외를 다른 section/material option에 일반화하지 않는다.
Boundary target는 기존 source resolver의 bare node label 또는 unique node-set name이다.
Assembly NSET의 INSTANCE binding으로 원하는 instance를 지정한다. 여러 instance에서
bare target가 모호하면 거부하며 새로운 dotted boundary qualification을 추가하지 않는다.
Model BC 다음 step BC 순서로 resolve하고 node/component별 exact-zero union을 적용한다.
같은 zero constraint 재선언은 동일 constraint다. Nonzero row를 상쇄·override하여 허용하지 않는다.
원본 `(Part-1-1,Set-2)`의 104 nodes×6 DOF가 모두 고정됨을 확인한다.
Global component 제약만 지원하며 tangent/local/MPC constraint를 새로 추론하지 않는다.
<a id="io-input--i3-density-material-mapping"></a>
### I3. Density material mapping
`*DENSITY`는 한 material에 최대 한 번, 정확히 한 data row이며 첫 field는 rho다.
`rho` 또는 `rho,`만 허용한다. 후자는 원본 `2700.,`의 빈 temperature slot이며
temperature dependence가 없는 constant 값으로 대응한다. Nonempty temperature/field variable,
두 개 이상의 추가 comma, 추가 data row, `DEPENDENCIES`(0 포함), `PORE FLUID`, `SLURRY`,
distribution 이름과 다른 parameter는 거부한다. Elastic과 Density의 상대 선언 순서는 자유다.
Numeric rho가 finite이며 strict >0이어야 한다. Material scope 밖 Density도 실패다.
모든 활성 shell의 `element -> section -> material -> rho`가 정확히 하나로 결정되어야 한다.
Missing rho를 0이나 기본값으로 채우지 않는다. 서로 다른 material/section의 rho/t를
global 평균으로 바꾸지 않는다. 사용하지 않은 material의 Density가 존재하면 문법·양성 검증은
동일하며, rho 존재의 필수성은 활성 material에 적용한다. Material/section reference 오류는
밀도가 있는 다른 material로 fallback하지 않는다. 단위는 `mass/length^3`, 변환 없음.
Density의 새 입력 허용은 이 eigen procedure에 속한다. 기존 static parser의 Density 지원
범위를 넓히지 않고, density가 없는 기존 static input과 material 생성 경로를 보존한다.
Material의 내부 optional density를 만들더라도 static에 필수값을 요구하지 않는다.
<a id="io-input--i4-step와-frequency의-exact-options"></a>
### I4. Step와 Frequency의 exact options
`*STEP` 허용 parameter는 optional `NAME=<name>`, optional `NLGEOM=NO`, optional
value 없는 `PERTURBATION`뿐이며 data는 없다. NLGEOM 생략은 NO다. PERTURBATION이 없어도
FREQUENCY가 원형상 linear perturbation procedure를 결정하고 source flag 유무를 보존한다.
`NLGEOM=YES`, flag NLGEOM, `PERTURBATION=...`, `INC`, 다른 option은 eigen에서 거부한다.
Frequency 외 procedure, step description data, 두 번째 procedure/step, 선행 상태는 지원하지 않는다.
| FREQUENCY parameter | 허용·기본 의미 | Observable mapping |
| --- | --- | --- |
| `EIGENSOLVER` | 생략 또는 `LANCZOS` | Source default=LANCZOS; actual=`MKL FEAST`. Explicit/omitted provenance와 backend mapping warning 기록 |
| `SIM` | 생략, value 없는 flag, `YES` | Source effective=YES. FESA SIM architecture 기능을 만들지 않음. Explicit일 때 no-op warning |
| `ACOUSTIC COUPLING` | 생략 또는 `ON` | Acoustic/ASI/TIE/coupling 정의가 전혀 없는 structural-only 모델에서만 적용 대상 없음. Explicit일 때 no-op warning |
| `NORMALIZATION` | 생략 또는 `MASS` | Source SIM=YES의 mass default를 적용. FESA 실제 ML로 phi^T ML phi=1; 값 변경 warning 없음 |
`SIM=NO`, `NORMALIZATION=DISPLACEMENT`, `AMS/SUBSPACE/FEAST` source enum,
`ACOUSTIC COUPLING=OFF|PROJECTION`, `DAMPING PROJECTION`, `RESIDUAL MODES`,
`PROPERTY EVALUATION`, `NSET` 및 다른 parameter는 지원하지 않는다.
사용자 backend 요구를 Abaqus 문법의 새 `EIGENSOLVER=FEAST` 지원으로 바꾸지 않는다.
Data는 정확히 한 physical row, comma split 후 **1~7 fields**다. 첫 field N은 mandatory
positive decimal integer이며 2~7은 존재하면 모두 empty여야 한다. 생략된 trailing fields도
unspecified다. 원본 `10, , , , ,`는 여섯 fields로 유효하다. Fields 2/3은 frequency bounds,
4는 shift, 5/6은 Lanczos controls, 7은 acoustic range factor의 source slot이다.
공란은 숫자0이 아니다. 어느 slot의 nonempty `0`도 지원하지 않으며, eighth empty field도
arity 오류다. 추가 row는 residual-mode input으로 해석하지 않고 거부한다.
이 제한은 [공식 FREQUENCY syntax](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm)의
선택된 부분집합이다. N은 마지막까지 input authority이고 TXT 행수/count scratch/returned m과 다르다.
`N>finite_dimension` 및 빈 finite problem은 equation 구성 뒤 명시적으로 실패한다.
<a id="io-input--i5-result-neutral-allowlist와-warning"></a>
### I5. Result-neutral allowlist와 warning
아래 keyword는 parameter 순서만 자유이며 duplicate/추가 parameter·data row는 거부한다.
동일 조합의 반복 output request는 각 keyword당 warning 한 개를 남기며 결과를 바꾸지 않는다.
| Keyword | 정확한 조합·위치 | Warning code |
| --- | --- | --- |
| `*PREPRINT` | Optional top-level; `ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO` 정확히 네 개, data 없음 | `ignored-input-keyword` |
| `*RESTART` | FREQUENCY/BC 뒤; flag WRITE와 FREQUENCY=0, data 없음 | `ignored-input-keyword` |
| `*OUTPUT` | FREQUENCY/BC 뒤; FIELD 또는 HISTORY flag 하나; optional VARIABLE=PRESELECT; data 없음 | `ignored-input-keyword` |
| `*NODE OUTPUT` | 활성 OUTPUT FIELD 아래; VARIABLE=PRESELECT 하나, data 없음 | `ignored-input-keyword` |
| `*ENERGY OUTPUT` | 활성 OUTPUT HISTORY 아래; VARIABLE=ALL 하나, data 없음 | `ignored-input-keyword` |
새 OUTPUT root는 앞의 output scope를 닫고, RESTART/END STEP도 닫는다. Child scope mismatch는
거부한다. Restart READ/nonzero write frequency, output variables data, element/contact output,
node history request 등 표 밖 조합은 eigen에서는 fail-closed다. 기존 static allowlist를 축소하지 않는다.
Warning message는 raw keyword와 `mandatory-eigen-output-unchanged` 이유를 포함한다.
RESTART frequency0은 write 중단 옵션이고 출력 요청들은 model equations를 바꾸지 않는
output selection이다. FESA는 이 selection을 구현하지 않는다는 차이를 알린다.
FREQUENCY에는 `source-eigensolver-mapped-to-feast` warning을 항상 하나 기록한다.
Explicit SIM에는 `source-sim-option-not-applied`, explicit acoustic ON에는
`acoustic-option-inapplicable-structural-only`를 기록한다.
위 세 code를 포함한 출력 순서는 기존 source tuple의 code 정렬을 따른다. Invalid model은
이 warning을 근거로 acoustic/coupling semantics를 버려서는 안 된다.
<a id="io-input--i6-fail-closed-validation과-diagnostics"></a>
### I6. Fail-closed validation과 diagnostics
표 밖 model/history keyword는 eigen analysis 전에 거부한다. 특히 어떤 위치의
`CLOAD/DLOAD/DSLOAD`, initial condition/stress/temperature, damping, acoustic/ASI elements,
TIE/contact/MPC, transform/orientation/explicit director, surface/beam/solid/mixed model,
concentrated/nonstructural mass, composite/offset/variable thickness, amplitudes, restart read와
다중 step은 지원하지 않는다. Zero-valued load/damping 입력도 지원되는 무하중 모델로 바꾸지 않는다.
진단 record는 기존 `severity,code,file,line,keyword,entity_identity,message`를 사용한다.
file은 lexical normalized path, line은 source 1-based다. Material/section/node/element/step,
DOF 또는 invalid parameter/field ordinal을 가능한 한 entity/message에 포함한다.
Numerical scale·threshold·observed value는 binary64 round-trip 가능한 decimal로 보고한다.
Source location 없는 backend failure도 sole Frequency location과 step을 연결한다.
기존 SortDiagnostics 순서와 same-key discovery order를 유지한다.
| Condition | Stable code | CLI exit |
| --- | --- | --- |
| Lexical/arity/duplicate parameter/name/unresolved source | 기존 `invalid-input-character`, `input-line-too-long`, `invalid-data-arity`, `invalid-keyword-parameter`, `unresolved-reference` 등 해당 기존 code | 3 |
| Density scope/data/dependency/duplicate | `invalid-density-data` / `unsupported-density-option` / `duplicate-density` | 3 |
| Active rho missing / numeric nonfinite 또는 nonpositive | `missing-material-density` / `invalid-material-density` | 4 |
| New rho malformed numeric token | `invalid-density-data` | 3 |
| Frequency parameter/count/data mismatch | `unsupported-frequency-option` / `invalid-frequency-data` | 3 |
| Multiple/preload/unsupported procedure | `unsupported-analysis-procedure` | 3 |
| Nonzero base/prescribed BC | `unsupported-eigen-boundary` | 3 |
| Model-affecting exclusion / unsupported element | `unsupported-keyword` / `unsupported-element-formulation` / `unsupported-mixed-element-model` | 3 |
| Invalid geometry/section/material | 기존 model code; mass27-point invalid는 `invalid-shell-mass-geometry` | 4 |
| Global finite n=0 / N>n | `empty-eigenproblem` / `insufficient-finite-modes` | 4 |
| Analytic/null/positive mass or conditioning 실패 | `invalid-eigen-mass-space` / `eigen-mass-conditioning` | 5 |
| Index/storage/allocation/FEAST/count/budget/negative/validation 실패 | [M2 diagnostic mapping](io.md#io-mapping--m2-backend와-failure-lifecycle) | 5 |
| Candidate/write/close/self-check/replace/log/lock 실패 | 기존 output category와 [M2](io.md#io-mapping--m2-backend와-failure-lifecycle) | 6 |
`NaN/Inf` rho는 nonfinite model value(4)로 분류하고 그 외 malformed token은 syntax(3)다.
같은 실패를 여러 code로 중복 보고하지 않고 첫 발견 원인을 유지한다. Fatal 뒤 solve/commit을
실행하지 않는다. CLI usage2/success0과 stderr format은 기존 공통 계약을 유지한다.
<a id="io-input--공개-근거와-적용-한계"></a>
### 공개 근거와 적용 한계
2026-09-06 공식 Abaqus 2025 문서를 `web.open`으로 확인했다. 사실은 syntax/외부 의미이고,
위 exact subset/default/warning policy는 승인된 FESA 요구에 대한 I/O mapping이다.
| Source | Locator와 사용 |
| --- | --- |
| [DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm) | Data lines 1~2와 optional dependencies; constant rho 및 ML^-3 차원. 온도·distribution 지원은 포함하지 않음 |
| [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm) | Optional parameters와 Lanczos data line 1~7. Source defaults·bounds/shift 공란을 구분; FESA Lanczos 내부 동작의 근거가 아님 |
| [STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm) | NAME/NLGEOM/PERTURBATION. 선행 history 전달은 제외 |
| [RESTART](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-restart.htm) | WRITE/FREQUENCY=0 및 no-data. Restart 지원을 주장하지 않음 |
| [OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-output.htm) | Output selection root |
| [NODE OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-nodeoutput.htm) | FIELD와 VARIABLE=PRESELECT |
| [ENERGY OUTPUT](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-energyoutput.htm) | HISTORY와 VARIABLE=ALL; 새 modal energy output 요청으로 확대하지 않음 |
| [Input Syntax Rules](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEMODRefMap/simamod-c-inputsyntax.htm) | Keyword/data/256-byte/continuation convention; FESA bounded 차이와 기존 정책은 I1이 권위 |
질량 정식화·private parser/model·solution algorithm·ODB internals의 동등성을 추론하지 않는다.
<a id="io-schema"></a>
<a id="io-schema--mitc4-eigen-authoritative-hdf5-schema"></a>
## MITC4 eigen authoritative HDF5 schema
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md#io)
- 수학: [E1~E8](formulation.md#formulation-eigen), [V1~V6](formulation.md#formulation-verification)
- Numerical authority: [C1~C6](numerical-review.md#numerical-review-controls)
<a id="io-schema--o1-container-version과-공통-규칙"></a>
### O1. Container, version과 공통 규칙
공식 결과는 input lexical sibling `<stem>_results.h5`다. 기존 linear schema0와 nonlinear
schema1은 각각의 [현행 static 계약](../shell-surface-pressure-load/io.md#71-version-and-filename-decision)을
유지한다. Eigen은 기존 shell model container에 새 procedure를 추가하며 discriminant는
`(schema_version=0, feature_id=mitc4-shell-feast-eigen, analysis_procedure=linear-frequency,
eigen_schema_version=1)`이다. `eigen_schema_version`은 새 procedure 전용 revision이다.
Static reader가 schema_version만 보고 eigen을 static으로 해석해서는 안 된다.
기존 static 파일에 새 eigen mandatory fields를 요구하거나 재작성/migration하지 않는다.
앞으로 unknown additive optional field는 무시할 수 있지만 known field의 type/의미 변경,
unknown procedure 또는 eigen_schema_version은 reader의 명시적 unsupported schema 실패다.
Float는 `H5T_IEEE_F64LE`, unsigned/signed integer는 명시된 `H5T_STD_U{8,64}LE`/
`H5T_STD_I64LE`, string은 variable-length UTF-8이다. Compound field의 byte offset/padding은
private이며 field name/type/array extent가 authoritative다. Shape의 `nn,ne,nmat`는 model
node/element/material 수, `N`은 입력 요청, `c`는 최종 solve의 전체 검증 column 수,
`Lcalls`는 모든 actual FEAST calls 수다. 모든 shape/capacity는 checked integer다.
새 numeric dataset의 required attrs는 `schema_version=0`, `eigen_schema_version=1`,
`component_names`, `component_unit_dimensions`, `coordinate_system`, `location`이다.
Compound에서 component attrs는 수치 quantity fields만 table의 명시 순서로 나열하고
identity/flag/counter는 schema 정의를 따른다. 새 modal result에는 추가로
`step_name=Step-1`, `source_step_name=<raw source>`, `domain=mode`를 기록한다.
Tokenized dimension은 아래 `mass`, `length`, `time`를 사용하며 SI label을 붙이지 않는다.
모든 mandatory physical/검증 real 값은 finite다. Optional backend diagnostic의
unavailable는 O4의 명시적 validity flag만 사용한다. NaN payload를 공개하지 않는다.
<a id="io-schema--o2-metadata-모델과-source-요청"></a>
### O2. Metadata, 모델과 source 요청
`/metadata`의 아래 attributes는 mandatory다.
| Attribute | Type / 값 |
| --- | --- |
| `schema_version`, `eigen_schema_version` | uint64 `0`, `1` |
| `feature_id`, `analysis_procedure` | UTF-8 `mitc4-shell-feast-eigen`, `linear-frequency` |
| `solver_version` | 실제 실행 binary의 기존 version string |
| `source_input_identity` | 기존 `path=<absolute lexical generic path>;content_identity=fnv1a64:<16 lower hex>`; parser가 실제 읽은 원본 bytes 기준 |
| `unit_system_label` | `user-consistent-unspecified` |
| `coordinate_convention` | `global-cartesian; shell-local=initial-reference; positive-thickness=+zeta` |
| `internal_formulation` | `FESA-MITC4` |
| `integration_rule`, `mass_integration_rule` | `2x2x2-gauss; mitc4-edge-midpoint-shear`, `3x3x3-gauss` |
| `stabilization_rule` | `initial-physical-rotary-trace-mean-r2` |
| `step_name`, `source_step_name`, `frame_indexing` | `Step-1`, raw input name(현재 Step-2), `mode-rank-one-based` |
| `mass_variant`, `mass_origin`, `normalization` | `derived-lumped`, `consistent-moment-row-sum`, `mass` |
| `eigensolver_backend`, `eigensolver_routine` | `MKL FEAST`, `dfeast_scsrgv` |
| `backend_problem` | `scaled-whitened-lumped-with-identity-mass` |
| `numerical_contract` | `mitc4-shell-feast-eigen:r2` |
Source identity는 [현재 writer primitive](../../src/fesa/io/hdf5/hdf5_primitives.cpp)의 byte
identity와 동일하다. SHA-256 reference audit와 FNV source identity는 다른 목적이다.
Filename만으로 동일 input이라고 간주하지 않는다. Comparator는 실제 지정 input bytes의
content identity와 lexical input path를 metadata에 대조한다.
| Dataset | Shape/type와 fields | Identity·단위·ordering |
| --- | --- | --- |
| `/model/nodes` | `[nn]` 기존 compound: `internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3]` | Internal ID 0..nn-1, 기존 instance expansion/declaration order; coordinates length, global-cartesian |
| `/model/elements` | `[ne]` 기존 shell compound: `internal_element_id:u64,instance_name:utf8,source_label:utf8,source_element_type:utf8,internal_formulation:utf8,node_internal_ids:u64[4],shell_section_internal_id:u64,material_internal_id:u64` | Internal ID order; source S4/S4R 구별; formulation FESA-MITC4 |
| `/model/shell/materials` | `[nmat]` 기존 compound: `internal_material_id:u64,name:utf8,E:f64,nu:f64` | Declaration order; E force/length^2, nu1. 기존 field에 rho를 끼워 넣지 않음 |
| `/model/shell/sections` | 기존 compound: `internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64` | Declaration order, thickness length, centered-single-layer |
| `/model/shell/nodal_director`, `/model/shell/nodal_frame` | `[nn,3]`, `[nn,3,3]` f64 | 기존 source node rows; D components, frame axes A/B/D×global X/Y/Z, dimension1 |
| `/model/nodal_constraint_mask` | `[nn,6]` u8 | Existing DOF order UX,UY,UZ,URX,URY,URZ; free0/constrained1 |
| `/model/prescribed_displacement` | `[nn,6]` f64 | 같은 DOF order, 모든 값 exact0; units length×3,radian×3 |
| `/model/shell/densities` | `[density_count]` 새 compound: `material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64` | Material ID ascending, rho mass/length^3, location model-material; declared density별 한 row, 활성 material 모두 존재 |
| `/model/eigen/source_records` | `[record_count]` compound: `ordinal:u64,source_line:u64,keyword:utf8,physical_text:utf8` | 아래 source provenance 대상의 실제 physical line 순서, ordinal0부터 |
| `/diagnostics` | `[diagnostic_count]` 기존 compound: `severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8` | 기존 SortDiagnostics 순서. 성공 파일에는 warning만 존재 |
공통 model dataset의 기존 attrs는 [linear model schema](../linear-static-mitc4-shell/io.md)와
[현재 writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)를 따른다. Eigen-specific attrs는
새 dataset에만 필수이며 기존 static dataset type/attrs를 바꾸지 않는다.
기존 model-only midsurface_locations/section_positions를 공유 writer가 추가 저장해도 허용하나
eigen result/acceptance quantity는 아니며 eigen의 mandatory replay dataset이 아니다.
`source_records` 대상은 STEP, FREQUENCY(그 count data 포함), DENSITY(data 포함), I5
no-op keyword와 그 parameter-continuation physical lines다. Comments는 포함하지 않는다.
`keyword`는 canonical parent keyword이고 `physical_text`는 CR/LF를 제거한 원문이다.
Frequency 선언 유무·blank slot 수·raw values를 여기서 보존한다. 물리 domain의 기준은
validated semantic fields이며 output consumer가 raw text를 다시 실행하지 않는다.
`/steps/Step-1` group attrs는 아래와 같다. Canonical group명과 source name을 구분한다.
| Attribute | Type / 의미 |
| --- | --- |
| `source_step_name`, `source_step_name_canonical` | utf8 raw name / ASCII uppercase key |
| `step_source_line`, `frequency_source_line`, `frequency_data_line` | u64 실제 source1-based line |
| `source_nlgeom`, `source_perturbation_present` | u8 effective NO=0 / explicit flag 유무0 또는1 |
| `source_eigensolver`, `source_sim`, `source_acoustic_coupling`, `source_normalization` | utf8 effective `LANCZOS,YES,ON,MASS`; explicit/omitted는 source_records에서 구분 |
| `requested_mode_count`, `returned_mode_count` | u64 N,N; table row수로 입력 N을 덮어쓰지 않음 |
| `full_dof_count`, `free_dof_count`, `mass_null_dimension`, `finite_dimension` | u64 6nn,nf,nz,n, nf=n+nz |
| `validated_eigenpair_count` | u64 c, N<=c<=n; publicly returned mode 수와 구별 |
<a id="io-schema--o3-고유치와-modal-vectors"></a>
### O3. 고유치와 modal vectors
Path prefix는 `/steps/Step-1/eigen`이다. `modes`만 공개 eigenvalue row authority다.
| Relative dataset | Shape/type/fields | 의미·attrs |
| --- | --- | --- |
| `modes` | `[N]` compound `mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64` | Row k는 mode_id=k+1; quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame |
| `frequencies` | `[Nv]` compound `mode_id:u64,frequency:f64` | 정확히 lambda>=0인 modes의 ID subset, mode ID ascending. quantity=cycle-frequency, component_names=Freq, dimension=time^-1, scalar/modal-frame; mandatory dataset이며 Nv=0도 유효 |
| `vectors` | `[N,nn,6]` f64 | mode axis는 modes와 동일, node axis는 model/nodes, component_names=UX,UY,UZ,URX,URY,URZ; global-cartesian, location=nodal-modal-vector |
`vectors.component_unit_dimensions`는 `mass^-1/2` 세 개와 `mass^-1/2*length^-1` 세 개다.
추가 attrs `normalization=mass`, `amplitude_unit_dimension=mass^1/2*length`,
`mass_variant=derived-lumped`, `interpretation=normalized-mode-not-response-displacement`를 둔다.
각 node의 세 회전 성분은 initial global infinitesimal rotation coordinates다. Constrained
component는 exact0이며 source node label을 internal/equation index로 바꾸지 않는다.
기존 `/nodal/displacement`, reaction, stress, nonlinear accepted_frames를 modal 결과로 생성하지 않는다.
Full matrices/consistent matrix/modal stress를 영속 mandatory output으로 추가하지 않는다.
Raw lambda의 오름차순 stable paired sort와 exact tie의 original FEAST column 순서를 따른다.
Sign은 [C4](numerical-review.md#numerical-review-controls--c4-repeated-subspace와-결정론)대로 largest absolute
scaled global component(translation/ell,rotation)의 양수, tie는 source DOF 순서다.
여기서 source DOF 순서는 model/nodes의 stable row order×정해진 component order다.
Cluster는 전체 c sorted columns에서 C4의 connected rule로 1부터 매기고 첫 N개에 같은 ID를
투영한다. Cluster ID는 진단용이며 값을 평균하거나 결과 multiplicity를 줄이지 않는다.
`operator_scale=s`는 O4에 저장한다. `mu=lambda/s`에서 `mu<-1e-9`는 성공 파일을 만들 수
없는 negative spectrum failure다. `abs(mu)<=1e-9`이면 classification=0(`near-zero`),
그 외는 classification=1(`positive`)이다. Raw lambda와 부호를 그대로 기록하며 ±boundary는
near-zero다. Frequency는 classification이 아닌 raw lambda 부호로 결정한다:
lambda>0이면 sqrt(lambda)/(2pi), lambda==0이면 exact0, lambda<0이면 row가 없다.
따라서 small positive near-zero에도 real frequency가 있고 small negative에는 없다.
Negative row의 부재 이유는 `frequencies@unavailable_rule=negative-raw-eigenvalue`로 명시한다.
Frequency overflow/양수의 underflow-to-zero도 파생 결과 실패로 처리한다. Mandatory lambda
및 mu→lambda conversion은 C3의 finite/underflow 조건을 그대로 따른다.
<a id="io-schema--o4-backend와-검증-evidence"></a>
### O4. Backend와 검증 evidence
Prefix `/steps/Step-1/eigen/verification`의 attrs:
| Attribute | Type / 의미 |
| --- | --- |
| `characteristic_length`, `operator_scale` | positive finite f64 ell[length], s[time^-2] |
| `eta_gram`, `max_eta_orth` | finite f64, 전체 c의 V3 Gram와 pairwise 최대 metric; c=1이면 max_eta_orth=0 |
| `eta_mz`, `eta_kz`, `eta_pz`, `null_checks_applicable` | f64×3 및 u8; nz=0이면 applicable0와 storage값0, N/A이지 수행 통과로 보고하지 않음 |
| `validation_scope`, `numerical_contract` | utf8 `all-computed-c-columns`, `mitc4-shell-feast-eigen:r2` |
| Dataset | Fields / shape | 의미 |
| --- | --- | --- |
| `verification/nodal_reduction` | `[nn]` compound `free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64` | Source node row 대응; E2 analytic counts. Nonempty positive block에 rcond_available1, C2 cutoff 통과; 빈 block은0/0 storage. nf/nz/n과 합 일치 |
| `verification/eigenpair_checks` | `[c]` compound `sorted_rank:u64,solver_column:u64,eigenvalue:f64,modal_mass:f64,rayleigh_quotient:f64,eta_r:f64,eta_w:f64,rho_b:f64,eta_norm:f64,eta_energy:f64,backend_res_available:u8,backend_res:f64` | sorted_rank1..c, solver_column은 원 FEAST column0-based unique; 실제 ML의 V3/V4/C3 metrics. 첫 N ranks의 lambda는 modes와 exact equal |
Nodal reduction의 quantity component는 `rcond_inf`, dimension1, coordinates=scalar,
location=nodal-mass-reduction이다. Eigenpair checks의 component_names는 표의 f64 fields
순서이고 dimensions는 eigenvalue와 rayleigh_quotient만 time^-2, 나머지는1이다.
Coordinates=scalar, location=eigenpair-verification이며 mandatory finite 검증량과
optional backend_res의 validity를 구분한다.
`eigenpair_checks`는 내부 count/검증 evidence다. c>N 진단행은 추가 공개 modal frame이
아니며 comparator는 여기서 Value를 추출하지 않는다. c개 vector 전부는 검사 동안 유지하고
accepted state에는 공개 N개 vector와 전체 c의 check evidence를 보존한다. 전체 c Gram의
runtime/독립 검증은 C17/18 evidence로 확인하며 N개 persistent vectors만으로 full-c Gram를
재검산했다고 주장하지 않는다. N개 원 residual/normalization은 model 데이터에서 K/ML를
독립 재구성하여 재현할 수 있다. Consistent/lumped 독립 oracle는 NR cases의 내부 테스트다.
Backend `res`가 0-eigenvalue의 상대분모 때문에 unavailable인 경우만
backend_res_available0, backend_res storage0을 사용하고 dataset attr
`unavailable_reason=zero-eigenvalue-relative-residual`를 둔다. Available 값은 finite이고,
nonzero eigenvalue의 nonfinite backend diagnostic은 failure다. Storage0을 residual evidence0으로
해석하지 않는다. mandatory eta_*는 모든 경우 자체 zero branch와 함께 finite다.
Prefix `/steps/Step-1/eigen/backend` attrs는 `runtime_version:utf8`(실제 MKL query),
`integer_abi:utf8`(`LP64|ILP64` 실제 linked ABI), `thread_count:u64=1`,
`seed:u64=0x4D495443344D4645`, `count_calls:u64`, `solve_calls:u64`,
`final_count:u64=c`, `final_solve_ordinal:u64`, `selected_ranks:utf8=1..N`,
`enclosure_lower:f64`, `enclosure_upper:f64`, `solve_lower:f64`, `solve_upper:f64`다.
Bounds는 모두 dimensionless B-space이며 physical frequency bound가 아니다.
| Relative dataset | Shape / fields | 의미 |
| --- | --- | --- |
| `calls` | `[Lcalls]` compound `ordinal:u64,kind:utf8,purpose:utf8,lower:f64,upper:f64,allocated_m0:u64,info:i64,count_available:u8,count:u64,loop_available:u8,loop:u64,epsout_available:u8,epsout:f64` | ordinal0-based 실제 call 순서; kind=count/solve, strict bounds, 실제 allocated capacity. Count의 overwritten m0와 solve의 m을 count로 구분 저장 |
| `fpm` | `[Lcalls,128]` i64 | 각 call 직전 feastinit 이후의 exact parameter snapshot; vendor type을 public core에 노출하지 않음 |
`purpose`는 `total-enclosure`, `upper-prefix`, `lower-prefix`, `endpoint-guard`,
`final-prefix`, `final-interval`, `solve` 중 하나이며 실제 C5 단계에 대응한다.
Calls의 component_names는 `lower,upper,epsout`, dimensions는 `1,1,1`,
coordinates=scalar, location=backend-call이다. Fpm은 component_names=fpm,
dimension1, coordinates=none, location=backend-parameter이며 128개 C-index 순서다.
Calls의 unavailable output은 flag0+storage0이고 원인을 info로 해석한다. Undefined vendor
output을 읽거나 garbage를 저장하지 않는다. `info=0`이면 count_available1; 성공 solve는
loop/epsout도 available1이고 epsout finite. 내부 허용 재시도의 실패 call도 삭제하지 않는다.
최종 성공과 C5 guard/prefix/total count 관계는 chronological calls/bounds로 재구성 가능해야 한다.
Allocated_m0와 input N은 독립이다. Effective fpm와 seed/budget은 C5/C6와 일치해야 한다.
Count-only res/epsout을 fabricated physical result로 사용하지 않는다.
<a id="io-schema--o5-self-check와-compatibility-tests"></a>
### O5. Self-check와 compatibility tests
Writer는 candidate를 flush/close한 뒤 read-only reopen하여 type/field/shape/required attrs,
finite required values, enum/validity domains 및 다음 관계를 확인하고 검사용 handle도 닫는다.
1. Source identity·input semantic snapshot이 writer 입력과 일치한다. Node/element/material IDs,
connectivity/section/material/density links가 unique/in-range이고 모든 활성 material rho>0이다.
2. Source step은 한 개이고 canonical Step-1과 raw name의 관계가 유일하다. Input N,
requested N, returned N, modes/vector row수가 같다. mode IDs는 정확히1..N이다.
3. Modes가 raw 오름차순이며 classification/cluster는 C3/C4 규칙과 맞는다. Frequencies의
ID set은 lambda>=0 set과 exact equal이며 각 값은 candidate 파생값과 같고 finite다.
4. Vectors는 finite, source constraint component exact0, scalar/vector pair는 candidate와
일치한다. Selected vectors의 ML normalization/원 residual은 serializer 전 C3 gate에서
검증되었고 해당 metrics 및 read-back values를 대조한다. Serializer 자기복사를 독립 physics로 부르지 않는다.
5. `nf=n+nz`, node별 counts 합, N<=c<=n, 전체 c check rows와 solver-column uniqueness,
첫 N lambda exact equality, modal_mass>0, 모든 적용 C2/C3 metric 한계가 맞는다.
6. Calls/fpm row수·ordinals·strict endpoints·finite available diagnostics, fpm controls,
counts/budgets(<=512 count, <=3 solve), final solve info0/returned m=c와 selected1..N이 맞는다.
증거 없는 성공 bool 하나로 대체하지 않는다.
7. `/diagnostics`는 기존 compound `severity,code,file,line,keyword,entity_identity,message`를
유지하며 source order warnings를 저장한다. 성공 파일에 fatal error diagnostic은 없다.
이 mandatory inventory는 reader version dispatch, round-trip, 누락/extra mode/duplicate ID,
nonfinite/wrong dimension/type/mass/backend/source, close/reopen/self-check failure tests의 기준이다.
Optional unknown dataset의 존재를 extra-mode로 오인하지 않는다. Static 파일은 기존 schema
inventory로 계속 검증하고, eigen reader는 static 또는 unknown eigen revision을 명시적으로 거부한다.
<a id="io-mapping"></a>
<a id="io-mapping--mitc4-eigen-책임실패비교-대응"></a>
## MITC4 eigen 책임·실패·비교 대응
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [io.md](io.md#io)
- 입력 원본: [io-input.md](io.md#io-input); 영속 schema 원본: [io-schema.md](io.md#io-schema)
<a id="io-mapping--m1-input에서-equationresult까지"></a>
### M1. Input에서 equation/result까지
아래는 implementation-neutral 책임 계약이며 정확한 C++ 타입/파일 분해는 Planning 소유다.
현행 [Domain](../../include/fesa/model/domain.h),
[model records](../../include/fesa/model/model_types.h),
[syntax records](../../include/fesa/io/abaqus/input_syntax.h),
[AnalysisModel](../../include/fesa/analysis/analysis_model.h)의 수명·의존성을 따른다.
| 경계 | 소유·전달할 최소 의미 | 금지되는 의미 혼합 |
| --- | --- | --- |
| Input adapter | 원본 path/content identity, keyword/parameter/data raw text와 line; validated density/step/options/count, unresolved targets | TXT row수로 N 생성, source enum으로 actual backend 변경 |
| Domain | Topology/source instance/labels, E/nu, section/t, optional material rho, initial director/frame, 유일 frequency 정의와 resolved homogeneous BC, warnings/provenance | Mutable mode/equation/vendor handle 소유 |
| Frequency definition | Raw/canonical source step, source option presence/effective values, count data N, source locations, procedure=linear-frequency | Static increment/time/frame state를 frequency count에 재사용 |
| AnalysisModel | Domain lifetime 아래 활성 shells/materials/sections/BC/frequency 정의의 const non-owning view | Domain copy 또는 새로운 geometry/material ownership |
| DofManager | Source node×UX/UY/UZ/URX/URY/URZ, full/free/constrained injection과 stable equation indices, scatter/sparse pattern | Element/Node 내부에 equation ID 저장 |
| Element/assembly | M1~M10 consistent/moments snapshot→nodal lumped blocks, r2 K contribution, source ordered reduction. 같은 source scatter와 실제 BC | Global scalar row lumping, artificial drilling mass, source S4R의 별도 kernel |
| Eigen procedure | Candidate workspace/state, [E1~E8](formulation.md#formulation-eigen) 순서, analytic rank/positive/null projection, whitening, actual FEAST, all-c validation, N개 global 복원/결과와 commit | 기존 LinearStaticAnalysis::Run에 eigen lifecycle 누적, pretrained/preloaded state, static reaction/modal stress 복구 |
| Private backend | C5/C6 controls, checked CSR/index conversion, vendor resources/thread guard, actual values/vectors/count/status와 call history | MKL_INT/HDF5/Win32 types 또는 vendor headers를 public solver core에 노출 |
| Result/Output adapter | Validated source/global modal pair와 O1~O5 serialization/self-check/replacement | Near-zero clamp, physical 수치 또는 identity 재계산으로 실패 은폐 |
Density/property lookup은 element마다 확정된 material identity를 사용한다. Consistent 원본을
lumped 저장으로 덮어쓰지 않고 element-wise snapshot+moments로 검사 가능하게 한다.
Full dense global MC나 일반 dense Schur는 필수가 아니다. 실제 global BC를 먼저 적용하고
director null은 [E2](formulation.md#formulation-eigen--e2-nullpositive-basis를-node마다-결정)의 exact intersection으로만
결정한다. Tiny positive mass는 정식화/NR conditioning 실패이며 input 지원에서 제거하지 않는다.
Source `(instance_name, numeric label)`과 raw label spelling은 전체 경로에서 보존한다.
Internal row order는 기존 identity-instance expansion/declaration order이며 DOF order는 고정이다.
Renumbering은 geometry/connectivity/BC를 같이 대응하여 검사한다. 숫자가 우연히 같은
source label/internal ID/equation ID를 비교키로 대체하지 않는다. 새로운 source order의 결과를
행 위치끼리 비교하거나 repeated eigenspace의 특정 vector 방향을 동일하다고 요구하지 않는다.
Accepted eigen state는 input/source step identity, N개의 paired raw scalar/global vector,
source mapping 및 전체 c의 validation/call evidence만 소유한다. Domain·AnalysisModel·DOF
정의와 수명 관계를 복사로 숨기지 않는다. Persistent N vectors로 같은 입력의 K/ML를
재조립해 constraint/normalization/원 residual을 다시 검사할 수 있어 REQ-018을 충족한다.
반복군의 개별 벡터 비유일성과 외부 mode-shape 비교 제외는 유지한다.
<a id="io-mapping--m2-backend와-failure-lifecycle"></a>
### M2. Backend와 failure lifecycle
FEAST fpm/interval/seed/thread/storage와 내부 수치 한계의 유일 원본은
[NR C1~C6](numerical-review.md#numerical-review-controls)다. I/O나 CLI에서 parameter override를 만들지 않는다.
Source N, reduced finite dimension n, prefix count, allocated m0, returned m, validated c,
public N을 각각 유지한다. 전체 c eigenpairs의 full original free residual/ML Gram/energy 및
endpoint/count consistency 뒤 첫 N개만 선택한다. Wrong mass·count·residual을 tolerance나
다른 solver로 우회하지 않는다.
| Failure | Code / exit5 | 보존할 context |
| --- | --- | --- |
| Checked CSR/index/capacity 산술 실패 | `eigen-index-overflow` 또는 `invalid-eigen-csr` | n/nnz/N/m0, 실패한 bound와 stage |
| Allocation 실패 | `eigen-allocation-failed` | allocation 역할·checked requested bytes; N 축소 없음 |
| FEAST non-success / forbidden retry | `eigen-feast-failed` | raw info, count/solve kind, interval/m0, C5 허용 재시도 여부 |
| Count/returned m/monotonicity·endpoint mismatch | `eigen-count-inconsistent` 또는 `eigen-endpoint-separation` | actual count history와 마지막 certified bracket |
| 유한 budget 소진 | `eigen-search-budget-exhausted` | count/solve attempts·마지막 valid bracket; optimization fallback 가능 여부는 C5 그대로 |
| Significant negative spectrum | `negative-eigenvalue-spectrum` | raw lambda/mu/s, mode rank, C3 threshold |
| Nonfinite/underflow conversion 또는 invalid frequency | `invalid-eigenvalue-result` | raw scalar·stage·source step |
| Raw pair/Gram/원 free residual/energy 검증 실패 | `eigenpair-validation-failed` | metric name, observed value, C3 limit, solver column/rank; failed raw values를 accepted result에 넣지 않음 |
위 code는 기존 FailureCategory::kSolver로 전달하며 새로운 exit category를 추가하지 않는다.
Model/preflight 오류는 [I6](io.md#io-input--i6-fail-closed-validation과-diagnostics)를 따른다.
Eigen backend failure의 returned Status는 실패까지의 call history를 message에 round-trip
decimal/ordinal 순으로 포함한다. 한 leading fatal diagnostic에 history를 부속하고 성공 count
call에 fictitious error severity를 붙이지 않는다. CLI는 기존 ordered stderr diagnostic 경로로
반환하며 caller는 Status에서 evidence를 읽을 수 있다. Allocation failure 시 추가 문자열
allocation을 보장할 수 없는 한계는 기존 best-effort stderr 범위를 따른다.
Public CLI는 기존 `fesa.exe <model.inp>`뿐이다. Output override 부재, `.inp` lexical
stem/대소문자/여러 dot/path 규칙, same-derived-pair nonblocking exclusive lock와 usage2는
[공통 lifecycle §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을 유지한다.
1. CLI usage validation→lexical output pair→exclusive ownership 뒤 `<stem>_log.txt`를
open/truncate한다. Non-Newton eigen은 log에 Newton iteration/FEAST 행을 만들지 않는다.
정상 log는 기존 계약대로 zero-byte다. Log open/close failure는 output exit6다.
2. Input/model/eigen solve와 all-c validation은 candidate에 수행한다. Existing accepted
state와 final HDF5는 건드리지 않는다. Controlled failure는 기존 state와 final hash를 보존한다.
3. Successful candidate를 준비하고 log close 성공을 확인한다. 같은 directory에 exclusive-create
private HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다.
4. Final replacement가 성공한 뒤 **이미 준비된 state의 no-fail swap**을 수행한다.
Swap에 allocation/validation/fallible callback을 남겨 두지 않는다. 순서는 [E8](formulation.md#formulation-eigen--e8-mode-identity-normalization과-상태)다.
5. Write/flush/close/reopen/self-check/replace 실패는 exit6이며 이전 final/state를 보존한다.
Failed candidate는 authoritative가 아니다. 정리는 best effort이고 다른 run의 파일을 지우지 않는다.
Current log는 rollback하지 않는다. 잠금 실패는 log/final도 변경하지 않는다.
과거 final이 없으면 controlled failure 후 final도 생성하지 않는다. Directory collision,
nonregular destination, lock/replacement refusal는 성공으로 처리하지 않는다. Process crash나
power-loss 전체 원자성을 약속하지 않는다. Reference artifact는 읽기 전용이며 solver의
새 HDF5/log는 별도 generated output이다. Reference 원본을 덮어쓸 output path는 없다.
<a id="io-mapping--m3-원본-txt-grammar와-deterministic-value-projection"></a>
### M3. 원본 TXT grammar와 deterministic Value projection
Case `shellNL-eigen-meshfine`의 input/TXT 경로·hash와 logical quantity/family 원본은
[reference-model](reference-model.md)이다. TMP/CSV 변환·filename alias·추가 provenance 파일을
reference readiness 조건으로 만들지 않는다. TXT에는 source step이 없으므로 **지정 input의
유일한 source frequency step Step-2**를 연결한다. ODB storage frame index는 추정하지 않는다.
각 LF/CRLF logical line에서 공백-only 행만 생략한다. 모든 다른 행은 아래 full-match다.
`ws`는 ASCII space/tab 0개 이상, `ws1`은 1개 이상이며 literal의 대소문자는 정확하다.
```text
number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?
id := [0-9]+ # positive checked decimal integer
row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number
ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws
```
Header/footer, BOM, comment, 잘못된 Value/Freq label·추가 token·malformed number는 schema
failure다. `Value`는 finite binary64로 full conversion하고 overflow/underflow parsing error를
거부한다. NaN/Inf spelling은 grammar부터 실패한다. `Freq`는 숫자 token 구조만 검사하고
수치 변환/물리 일치/오차 비교에 사용하지 않는다. 반올림된 Freq로 Value를 재계산하지 않는다.
같은 숫자의 다른 mode ID는 정상이며 같은 numeric ID의 재등장은 duplicate다.
다음 순서를 tolerance 전에 완료한다.
1. 지정 input/TXT와 O1 eigen HDF5의 존재·source_input_identity·procedure/schema/unit/mass/
actual backend를 검사한다. `mass_variant=derived-lumped`, `mass_origin=consistent-moment-row-sum`,
normalization mass 및 runtime FEAST metadata가 필수다. 다른 mass의 좋은 오차를 선택하지 않는다.
2. Input의 유일 source step/N=10을 직접 확인하고 HDF5 source name/요청수/공개수에 대응한다.
TXT row count에서 N을 추정하거나 HDF5 내부 c를 공개 모드 수로 사용하지 않는다.
3. TXT 모든 nonempty row를 먼저 parse하면서 duplicate를 검사한다. Dictionary overwrite
또는 malformed-row skip은 금지다. Required identity는 양쪽 모두 정확히 mode1..10이다.
4. HDF5 `modes`의 field/type/shape/단위/순서와 모든 eigenvalue의 finiteness를 확인한다.
Wrong quantity/mass/schema·missing/extra/duplicate/nonfinite를 먼저 실패시킨다.
5. 유일 source key로 join한 뒤 mode ID ascending으로 projection한다. TXT 행 재배열은
허용하지만 HDF5 sort contract 위반은 reader가 재정렬하여 숨기지 않는다.
Projection row는
`(case_id,source_step_name,mode_id,component=Value,reference_value,fesa_value)`다.
FESA value는 `/steps/Step-1/eigen/modes.eigenvalue`만 사용한다. Diagnostic all-c table,
frequencies/vectors 또는 static fields를 fallback으로 읽지 않는다. 현재 component는 scalar
eigenvalue=`omega^2`, `time^-2`, coordinates=`scalar`, impact=`blocking`이다.
<a id="io-mapping--m4-판정보고와-기존-static의-역할"></a>
### M4. 판정·보고와 기존 static의 역할
Family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue,dimension=time^-2,
coordinates=scalar,impact=blocking)`다. **10개의 singleton family**에
[common-reference-tolerance](../TOLERANCE.md)를 그대로 적용한다. 각 family의
`S=max|r|`, `B=0.01S`, near-zero inclusive row branch 또는 5% relative row branch와
1% relative RMS를 모두 계산한다. 현재 양수 singleton은 실효 mode별1%다.
S=0이면 exact-zero FESA만 성공이며 불일치는 `zero-reference-scale-nonzero-error`다.
Source modal frame이 다르면 한 table에 저장되어도 family를 합치지 않는다.
Comparator report는 input/reference/result identity와 freshness evidence, prechecks,
family/source key/component/count/S, raw r/f/error, 적용 branch·row verdict, RMS/verdict,
blocking failure와 전체 verdict를 mode order로 남긴다. Undefined zero-scale metric은 named
state로 표현하고 NaN/Inf나 absolute floor를 넣지 않는다. CSV view가 필요하면 이 projection을
HDF5에서 추출한 보조 artifact라고 표시하며 공식 output/원본 reference를 대체하지 않는다.
기존 static의 r2 재검증은 [Requirement portfolio](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity),
[NR C7](numerical-review.md#numerical-review-controls--c7-승인된-정적-회귀-기준), [C26](numerical-review.md#numerical-review-cases)을 따른다.
기존 linear source node/static frame와 nonlinear factor-one accepted-state identity를 유지한다.
U1/U2/U3 length/global blocking, UR1/UR2/UR3 rotation warning-only는 기존 common families다.
Nonlinear RF1/RF2/RF3·physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를
유지하는 review-only다. RM3/stress와 eigen vector는 새 external gate가 아니다.
Internal force/moment equilibrium은 별도의 blocking physical evidence다.
`shellnl-meshfine-02-s4-final`의 별도 post-closure 역할도 유지한다.
과거 cache/static 수치를 새 binary의 fresh solve로 표시해서는 안 된다.
<a id="io-mapping--m5-구현test-obligations와-requirement-연결"></a>
### M5. 구현·test obligations와 requirement 연결
아래 표의 `nn` 등 fixture 수를 제외한 threshold는 [NR cases/controls](numerical-review.md#numerical-review-cases)의
원본을 사용한다. Parser/mapper/schema/comparator의 실제 tests는 Planning/Implementation 소유다.
| Obligation ID | 필수 positive/negative 검증 | NR cases |
| --- | --- | --- |
| IO-T01 | 원본 unchanged input의 729 nodes/676 S4, source Step-2/N10, rho2700/t0.5, source options/no-op warnings와 실제 FEAST 선택. S4R source-only 변경도 같은 semantic physical path | MFE-C23 |
| IO-T02 | 두 material·두께의 element-section-density 연결, missing/duplicate/unresolved/0/negative/NaN/Inf/temperature/dependencies/extra row·field, section/geometry/27-point invalid 거부; static density 부재 허용 | MFE-C06, MFE-C07, MFE-C23, MFE-C26 |
| IO-T03 | N의 blank/0/negative/fraction/overflow, fields2~7에 nonempty0, eighth empty field, duplicate parameter, unsupported enums/procedure/preload/load/damping/acoustic/mixed/非영 BC 거부 | MFE-C07, MFE-C13, MFE-C23 |
| IO-T04 | Source labels/instance/set renumbering·중복/모호함, partial rotations/fullfree/fullclamp/drill-only/fully constrained source mask 복원; tiny nonzero director rank 보존·conditioning 실패, n0/N>n 명시 실패 | MFE-C06, MFE-C13, MFE-C14, MFE-C24 |
| IO-T05 | O1~O5 schema round-trip, input byte identity, N/c/source step/rank/units/actual backend/mass pairing, N vectors의 원 residual·normalization 재현. Near-zero positive/negative/exact0/±threshold 및 lambda conversion 경계 | MFE-C16, MFE-C19, MFE-C24 |
| IO-T06 | Invalid index/CSR/SPD/parameter/capacity/count/endpoint/NaN/Gram/residual/budget; actual FEAST known zero/repeated/cluster cases의 all-c history와 returned-N 분리. Output diagnostic unavailable와 raw λ 보존 | MFE-C17, MFE-C18, MFE-C19, MFE-C21, MFE-C22 |
| IO-T07 | 이전 accepted state/final hash를 준비하고 solve/validation/log/lock/write/flush/close/reopen/self-check/replace 실패를 각각 주입. 처음 실행의 실패에서 final 미생성. 성공 final 후 no-fail state swap | MFE-C24 |
| IO-T08 | TXT reorder/equal Value distinct modes 허용. Missing/extra/duplicate/nonfinite/malformed/wrong field/step/quantity/units/mass/backend/schema 실패를 tolerance 전에 확인. Freq 변화가 Value 판정을 바꾸지 않음 | MFE-C25 |
| IO-T09 | 공통 policy의 inclusive 1% RMS·5% row 경계와 양옆, generic near-zero \|r\|=B 경계·zero-scale 양성/음성. Singleton이므로5% row pass라도1% RMS fail임을 확인 | MFE-C25 |
| IO-T10 | Density 없는 기존 linear/nonlinear input·model/static output reader 불변, r2 scale 영향 portfolio를 fresh binary로 재검증. Mode-shape reference 미요구 | MFE-C26, MFE-C27 |
| IO-T11 | 세 반복의 exact sparse/row/diagnostic order 및 scalar/projector C4 기준. RED→observed failure→GREEN→focused/full MSVC x64 Debug 검증·새 warning 없음·fresh reference identity/hash | MFE-C27 |
Coverage ID 접두사는 모두 `FEM-REQ-MITC4-EIGEN-`다. 아래 표는 requirement 원문을 대체하지
않고 I/O의 기여와 다른 owner evidence를 구분한다.
| Requirement suffix | I/O 연결·verification obligation |
| --- | --- |
| 001 | I2/I4/M1; IO-T01/T03 |
| 002 | I2/O2 source type와 r2 stabilization identity; IO-T01/T10; physical kernel C01/C08/C12는 해당 owner |
| 003 | I3/O2 densities; IO-T02 |
| 004 | I2/I6/M1; IO-T02; geometry oracle C01/C02는 NR 원본 |
| 005 | M1 consistent snapshot 의미, O2 mass_origin; C01~03 구현 evidence |
| 006 | M1/O4 node rank와 restored vector; IO-T04; inertia/null C01/C03/C11 |
| 007 | M1 source/DOF/reduction ordering; IO-T04/T11 |
| 008 | M1/O4 analytic counts/conditioning, M2; IO-T04/T05; C15 spectrum oracle |
| 009 | I4/O2 N·n·c/O3 rank; IO-T03/T04/T06 |
| 010 | O3 stable paired sort/cluster identity, M3 join; IO-T05/T08/T11 |
| 011 | I4/O2/M2 actual mass/backend discriminant; IO-T01/T05/T06 |
| 012 | I6/M2/O4 validity and bounded failure; IO-T06/T07 |
| 013 | O3 vectors/O4 all-c metrics; IO-T05/T06; C11/C16~18 independent evidence |
| 014 | M1 units/source transformation/O3 replay; IO-T04/T05; C01~05/C08/C11/C20 physics |
| 015 | I4/I5/O2 source_records; IO-T01/T03 |
| 016 | I2~I6/M2; IO-T02/T03/T06 |
| 017 | O1~O5/M3 authoritative additive schema; IO-T05/T08 |
| 018 | M1/O3 persistent N vectors/source replay; IO-T04/T05; external shapes 제외 |
| 019 | M2 candidate/commit/log lifecycle; IO-T07 |
| 020 | M3/M4 Value-only + 별도 static policy; IO-T08/T10 |
| 021 | O5/M3 full prechecks; IO-T08 |
| 022 | M4 공통 family/policy/report; IO-T09 |
| 023 | IO-T11; 실행 계획/RED/GREEN/full 증거는 Planning/Implementation 소유 |
| 024 | I3/M4 existing static compatibility/portfolio; IO-T10/T11 |
| 025 | M5 coverage + 동일 r2 handoff; Physics/Release closure 소유권 유지 |
| 026 | M1 consistent→lumped/O2 mass_origin; C01~05 independent mass evidence |
| 027 | O2 stabilization_rule/M4 static 역할; IO-T10; C08~12/C26 물리 검증 |
<a id="io-mapping--정적-감사-evidence"></a>
### 정적 감사 evidence
실제 조사 명령은 `Get-Content`, `rg --files`, scoped `rg -n`, `web.open`이었다.
입력 keyword inventory와 TXT 10개 행을 읽었고 numerical quantity/formulation 계산을
재실행하지 않았다. 한 번의 `rg docs/shell-surface-pressure/io*.md`는 잘못된 directory/glob로
exit1이었고 `rg --files docs`로 실제 `docs/shell-surface-pressure-load/io.md`를 확인해
읽기 전용 대조를 완료했다(exit0). 이 검색 오류는 feature numerical failure가 아니다.
최종 감사 `python -B -` here-script는 exit0으로 owned4 metadata/66개 relative links/
requirement suffix1..27, reference10 rows/full grammar/finite Value/ID1..10 및 두 원본 SHA-256
일치를 확인했다. `git diff --check -- docs/mitc4-shell-feast-eigen/io.md
docs/mitc4-shell-feast-eigen/io-input.md docs/mitc4-shell-feast-eigen/io-schema.md
docs/mitc4-shell-feast-eigen/io-mapping.md`도 exit0이었다. 아직 untracked인 owned 문서는
별도 Python whitespace/Markdown table 검사로 확인하며 diff만으로 내용 검증했다고 하지 않는다.
실제 final audit 결과와 owned hashes는 I/O handoff에 보고한다.
이는 문서·원본 inventory 검증이며 parser/comparator 구현 test 또는 실제 수치 비교가 아니다.
CMake/CTest/Harness/FEAST/외부 solver는 이 문서 단계에서 실행하지 않는다.
@@ -1,853 +0,0 @@
# 이전 MFE 검산·반례·수치 기준
독립 rational 검산·NR-MFE-001 반례와 당시 판정을 보존한다. 과거 수치 기준을 새 baseline에 자동 적용하지 않는다.
<a id="numerical-review"></a>
<a id="numerical-review--mitc4-질량feast-독립-수치-검토"></a>
## MITC4 질량·FEAST 독립 수치 검토
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 요청 outcome: `pass`
- Next owner: `io-definition-agent`
- Failure classification / blocker: `null`
- 검토일: `2026-09-06`
- 의미: 수학·numerical controls·logical reference readiness의 I/O 인계 요청. Workflow 전이는 Coordinator 소유다.
필수 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[requirements](requirements.md#requirements), [requirements evidence](requirements.md#requirements-evidence),
[research](research.md#research), [research evidence](research.md#research-evidence),
[formulation](formulation.md#formulation)과 연결된 mass/eigen/verification/stabilization 상세 문서다.
[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md),
[공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md),
[agent 계약](../SOLVER_AGENT_DESIGN.md), [문서 관리](../FEATURE_DOCUMENTATION.md)를 적용했다.
<a id="numerical-review--blocking-finding"></a>
### Blocking finding
현재 unresolved blocking finding은 없다. **NR-MFE-001의 r1 실패는 보존하고 r2 수학 계약에서
해소되었음을 독립 확인했다.** 사용자 승인 MFE-ADR-007에 따라 초기 physical rotary trace
평균을 사용하는 [S1~S8](formulation.md#formulation-stabilization)을 검토했다. Positive inventory,
기저·좌표 공변성, partial-BC numerical contribution, linear massless decoupling 및
nonlinear frozen objective potential의 경계가 일관된다.
NR는 기존 R block 값을 기대값 생성에 재사용하지 않고 planar membrane/curvature/MITC
shear work를 직접 적분했다. 동일 물리 URZ-only BC의 Z축 45° 회전 전후
`lambda=23.04222222222223`, 단위 tangent moment의 `thetaZ=0.7233098659465717`로 같다.
Complete K/ML/response/reaction covariance error는 각각
`7.90e-17 / 4.66e-17 / 0 / 1.15e-16`이다.
[원래 실패·r2 독립 재계산과 실제 명령](numerical-review.md#numerical-review-evidence)을 보존한다.
Actual C++/FEAST 실행을 대신한 판정은 아니다.
<a id="numerical-review--고정한-수치검증-계약"></a>
### 고정한 수치·검증 계약
- [Controls C1~C7](numerical-review.md#numerical-review-controls)에 V1~V6의 단위·scale·zero branch와
matrix/mass/null/conditioning/full residual/Gram/energy/rigid/density/coordinate 기준을
고정했다. Physical rank는 analytic BC/director intersection으로만 정하고 tiny positive
mass는 삭제하지 않는다. Frobenius residual 외 operator-scale residual도 필수다.
- FEAST parameter·seed·QR·thread·representation 경계, endpoint guard와
전체 `512` count calls/`3` solve attempts 상한을 같은 상세 문서에 고정했다.
Enclosure/empty-prefix/count/solve-count/Gram/독립 residual을 결합하며 count만으로
무조건 lowest-N completeness를 주장하지 않는다. 요청 N은 항상 `.inp` authority다.
- [필수 cases와 27개 requirement coverage](numerical-review.md#numerical-review-cases)는 독립 mass oracle,
lumping refinement, partial BC/near-null/반례 해소, actual FEAST known spectra,
negative/zero/repeated/cluster/endpoint/capacity/failure, I/O/state 및 기존 static 회귀를
포함한다. 정확한 tests/owned paths/TDD commands는 Planning에 인계한다.
- [Reference-model](reference-model.md)은 원본 input/TXT·모든 10개 Value·singleton
modal-frame family·공통 RMS에 의한 실효 mode별1%와 identity 사전검사를 유지한다.
새 eigen Value-only와 승인된 기존 static U/UR·reaction 회귀의 역할을 분리한다.
Final persistent dataset/schema는 I/O 소유다.
r1의 degree `(4,4,4)` rational mass oracle, 3-point 오차 `1.11e-16`,
positive central inertia·centroid equality, Intel count/trace 및 reference identity 근거는
r2 식의 변경 영향을 확인해 재사용했다. 같은 실험을 새로 실행했다고 보고하지 않는다.
Reference 두 SHA-256은 r2에서도 일치한다. 원본·upstream·source/test/build/phase/Hook/Git를
수정하지 않았고 다른 owner 변경을 보존했다.
<a id="numerical-review--handoff와-잔여-위험"></a>
### Handoff와 잔여 위험
I/O는 고정된 quantity·source/mode/frame·backend/mass·failure 의미와 numerical controls를
minimum syntax 및 additive persistent schema에 연결한다. Planning/Implementation은
case matrix의 관찰된 RED, 전체 configured MSVC x64 Debug suite, actual FEAST runtime,
새 binary의 fresh eigen/reference 및 영향받는 static 회귀 evidence를 생성해야 한다.
이후 Physics/Release가 같은 r2 evidence를 독립 평가한다.
이번 단계의 수학 계산과 문서 정적 검증은 실제 `python -B -`/`git diff --check` exit `0`으로
확인했고 상세 결과는 [evidence](numerical-review.md#numerical-review-evidence)에 있다.
CMake/CTest·Harness·외부 solver·FEAST runtime·FESA reference comparison은 이 stage에서
미실행이다. Ill-conditioned thin/near-aligned mass의 명시적 실패, sampling 밖 geometry
injectivity, FEAST floating-point count/cluster 한계 및 shifted fill/peak memory는
기록된 적용 한계다. 이 한계를 숨기는 cutoff·fallback·tolerance 완화는 허용하지 않는다.
<a id="numerical-review-evidence"></a>
<a id="numerical-review-evidence--mitc4-독립-수치-검토-evidence"></a>
## MITC4 독립 수치 검토 evidence
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 검토일 / web access date: `2026-09-06`
<a id="numerical-review-evidence--nr-mfe-001-직접-계산-반례"></a>
### NR-MFE-001 직접 계산 반례
이 절은 **r1의 실제 실패 evidence**이며 값·계산을 보존한다. r2의 독립 해소 판정은
아래 [r2 공변성 검산](numerical-review.md#numerical-review)에 있다. 기존 실패를 통과로 소급 변경하지 않는다.
관련 원문은 [requirements](requirements.md#requirements)의 `002`(기존 kernel 유지),
`008`(선택 질량의 유한 spectrum 보존), `014`(eigen 해석의 coordinate-invariance
evidence)와 [V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식)다.
실제 [kernel](../../src/fesa/elements/mitc4_shell.cpp)의
`PhysicalTransformation20`(line 488), `DrillingTransformation4`(505),
`Stiffness`의 minimum tangent diagonal(633~653)을 읽기 전용으로 대조했다.
다음은 production 함수를 재호출한 expected value가 아니라 평판 다항식의 직접 적분이다.
Tangent axes `a=(0,1,0)`, `b=(-4/5,0,3/5)`, normal `d=(3/5,0,4/5)`를 둔다.
Node 순서는 `X1=-2a-b`, `X2=2a-b`, `X3=2a+b`, `X4=-2a+b`다.
`a×b=d`, 면적 8, 두께 1이고 constant director·positive Jacobian의 직사각형이다.
단일 element의 geometry-derived director와도 같다. `E=12, nu=0, rho=1`로 둔다.
모든 DOF를 고정하되 node1의 global `URZ` 하나만 free로 한다.
직사각형 `Lx=4,Ly=2`에서 `integral Nx² dA=1/6`,
`integral Ny² dA=2/3`, `|integral Nx Ny dA|=1/4`이다.
`D=Et³/[12(1-nu²)]=1`, `G=6`이며 MITC tying으로 각 nodal rotary
shear square integral은 `A/12`다. 따라서 각 node의 tangent rotary physical block은
\[
R=\begin{bmatrix}49/12&\pm1/8\\\pm1/8&23/6\end{bmatrix},
\quad j=\rho t^3A/48=1/6,\quad k_d=10^{-3}(23/6).
\]
Off-diagonal 부호는 corner의 `Nx Ny` 부호에 따라 달라지고 두 부호 모두 존재한다.
Global `eZ`의 tangent 성분은 `(0,3/5)`이고 drilling 성분은 `4/5`다.
Free mass는 `j(1-dZ²)=0.06>0`이므로 E2는 이 DOF를 삭제하지 않는다.
이 1차원 constrained pencil의 정확한 유한 eigenvalue는
\[
\lambda=\frac{(9/25)(23/6)+(16/25)k_d}{(9/25)(1/6)}
=23+(32/3)k_d.
\]
이제 전체 geometry를 global Z축으로 45° 회전한다. Free axis `eZ`와 모든 나머지
fixed subspace는 그대로이므로 동일 물리 BC가 계속 지원 component BC로 표현된다.
새 director는 `(3/(5 sqrt2),3/(5 sqrt2),4/5)`다. Least-aligned global-axis 규칙의
새 tangent와 회전 전 tangent 사이의 cosine/sine은 `-5/sqrt41,-4/sqrt41`이다.
모든 corner의 두 tangent diagonal 중 최소는 `937/246`으로 달라진다.
Physical `eZ^T Kphys eZ`와 질량은 불변이지만 `kd'=10^-3(937/246)`다.
| 값 | 회전 전 | 회전 후 |
| --- | ---: | ---: |
| `kd` | `0.0038333333333333336` | `0.003808943089430893` |
| `lambda` | `23.04088888888889` | `23.040628726287263` |
상대 차이는 `1.1291343961675893e-5`다. Tangent tie가 반대 axis를 선택해도
모든 corner/두 tangent diagonal의 minimum은 같다. 좌표변환으로 constraints를 바꾼
오류, input explicit director/MPC 기능, mass cutoff 또는 FEAST 오차를 이용한 반례가 아니다.
크기가 외부 tolerance보다 작다는 사실은 내부 coordinate-invariance 항등식의 근거가 아니다.
실행 명령은 아래 read-only here-script, `python -B -`, exit `0`이었다.
```powershell
@'
from math import sqrt
from fractions import Fraction as F
def dot(a,b): return sum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def rot(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
d=(.6,0,.8); a=(0.,1.,0.); b=cross(d,a)
Raa=F(49,12); Rbb=F(23,6); Rab=F(1,8); j=F(1,6)
k0=.001*min(Raa,Rbb)
dp=rot(d); ap0=(1-dp[0]**2,-dp[0]*dp[1],-dp[0]*dp[2])
ap=tuple(v/sqrt(dot(ap0,ap0)) for v in ap0)
u=dot(ap,rot(a)); v=dot(ap,rot(b))
diags=[float(Raa)*u*u+float(Rbb)*v*v+2*c*u*v for c in [-float(Rab),float(Rab)]]
diags += [float(Raa)*v*v+float(Rbb)*u*u-2*c*u*v for c in [-float(Rab),float(Rab)]]
k1=.001*min(diags)
l0=float(Rbb/j)+k0*.64/(float(j)*.36)
l1=float(Rbb/j)+k1*.64/(float(j)*.36)
print(float(k0),k1,l0,l1,abs(l1-l0)/l0)
assert abs(l1-l0)>1e-6
'@ | python -B -
```
이 계산은 기존 C++ kernel 실행 evidence가 아니다. 기존 승인 수식과 source의 계수
규칙이 갖는 mathematical counterexample이다. Runtime 회귀 test는 이후 Planning 소유다.
<a id="numerical-review-evidence--비충돌-수학-검토"></a>
### 비충돌 수학 검토
아래 표는 r1의 검토 기록이다. Mass·geometry·unit·BC·whitening·FEAST의 비충돌 항목은
r2 영향 확인 후 재사용한다. E3의 scalar는 r2 S1로 바뀌며 positivity/decoupling의 재검토와
V5의 complete K/partial-BC 해소는 아래 별도로 기록한다.
| 대상 | 독립 검토 결과와 한계 |
| --- | --- |
| M1/M2 | `S=-[d]x`이므로 `S theta=theta×d`; global DOF `[u,theta]`와 20↔24 transformation의 부호가 일치한다. Shear factor는 mass에 들어가지 않는다. |
| M3~M5 | `C0/C1/C2` 차원은 `M/ML/ML²`; symmetric cross block은 transpose 관계다. Trilinear map의 J degree≤(2,2,2), integrand≤(4,4,4)이므로 3×3×3의 degree5 정확성이 충분하다. |
| Consistent positivity | Positive weights/J에서 quadratic form=0이면 모든 27점에서 Hq=0. Hq는 각 자연좌표 degree≤1이므로 다항식 자체가 0이다. z=0에서 bilinear 독립성으로 모든 ui=0, z 계수에서 `Si theta_i=0`. Null은 정확히 네 drilling이며 physical20은 PD다. |
| M6~M8 | Scalar moment row-sum→nodal block은 partition of unity와 일치한다. Thickness points가 서로 달라 strict Cauchy–Schwarz이고 central inertia>0, rank5다. Tiny nonzero director component를 0으로 만드는 근거는 없다. |
| M9/M10 | Jensen 차이의 1/2 double sum과 kinetic-energy의 추가 1/2를 구분한 식이 맞다. Total mass·spatial first moment·allocated thickness moments는 보존하지만 일반 orbital inertia나 consistent spectrum은 보존하지 않는다. |
| Geometry | 기존 `EvaluateGeometry`는 실제 J>0와 finite reciprocal/frame을 검사한다. 추가 27점에도 같은 predicate를 적용하면 그 점의 부적합을 거부한다. Stiffness 8점과 validation을 바꾸지 않는다. 기존 8점만 통과한 input의 mass failure는 감추지 않으며 전역 injectivity/warp 허용 확대를 주장하지 않는다. |
| E1/E2 | Length congruence의 단위는 맞다. 실제 global free space와 director null의 교집합으로 null dimension을 정하는 조건은 정확하다. Partial BC의 full-rank local mass는 허용되며 near-null은 conditioning failure와 구분해야 한다. |
| E3/E4 | 공통 director와 element별 positive nodal scalar kd로 `KZ=Z diag(kappa)`, `Kpz=0`, `Kzz>0`이 성립한다. Partial BC에 남는 kd를 제거하면 원 pencil을 바꾼다. 일반 Schur 예제의 5/2 대 단순 삭제의 3은 옳고 general dense fallback은 필요하지 않다. |
| E5/E8 | `Mp=LL^T`, `A=L^-1 Kp L^-T`, `phi=DCP L^-T x`는 exact congruence다. Identity B의 FEAST도 actual lumped 문제다. Mass normalization 단위, constrained exact zero 및 candidate commit 의미가 맞다. |
| V1~V4 | 원 assembled free `Kf y-lambda Mf y`를 복원 후 검산해야 null 복원 오류를 잡는다. Mixed-unit norm을 직접 섞지 않고 zero denominator branch를 정의한 식은 일관된다. Gram/energy/residual은 lowest-N completeness를 대신하지 않는다. |
| Rigid/density | 기존 tangent-projected rigid field는 continuum interpolation의 rigid motion을 재현한다. Massless drilling과 6 physical rigid modes는 다르다. Density scaling과 repeated-group projector 정의는 일관된다. Eigen coordinate suite의 적용 범위는 NR-MFE-001 해결 전 확정하지 않는다. |
<a id="numerical-review-evidence--독립-mass-oracle"></a>
### 독립 mass oracle
`rho=3,t=1/2`에서 아래 kernel-level geometry/director fixture를 사용했다.
이는 현재 input의 explicit normal 기능을 추가하는 제안이 아니다. Unit rational directors와
warped coordinates를 이용한 독립 moment 적분 사례다. 전체 patch input 생성이나 기존
geometry validator 실행을 대신하지 않는다.
```text
X = [(-1,-1,1/10), (1,-1,-1/10), (1,1,1/5), (-1,1,-1/10)]
d = [(0,0,1), (3/5,0,4/5), (2/3,1/3,2/3), (0,3/5,4/5)]
```
`fractions.Fraction`으로 coefficient dictionary `(xi power,eta power,zeta power)`를
만들고 M1의 trilinear map을 미분·determinant 전개했다. Monomial integral은 홀수 차수면
0, 모든 차수가 짝수면 `8/[(p+1)(q+1)(r+1)]`다. Production shape/J/mass 함수를
호출하지 않았다. 이 exact rational 결과를 별도의 3-point 및 2-point Gauss 평가와 대조했다.
실제 read-only here-script `python -B -`, exit `0`, wall time 약 `0.52 s`였다.
| 관찰 | 결과 |
| --- | --- |
| 실제 maximum integrand degree | `(4,4,4)` |
| 27점 J 범위 | `[0.12859919221615254, 0.27013414111718076]` |
| 3-point 최대 scalar entry absolute error | `1.1102230246251565e-16` |
| 2-point 최대 scalar entry absolute error | `0.0006018518518518257` |
| `C0_11, C1_11, C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` |
| `sum mi, sum hi, sum ji` | `7743/1600`, `739/12000`, `517/5120` |
| First moment, two independent rational expressions exactly equal | `(-79747/360000, -685951/2880000, 49651/320000)` |
| Minimum nodal `ji-hi²/mi` | `0.022318161338791092 > 0` |
Independent row-sum oracle는 다음과 같으며 C1의 강제 zero나 flat rotary 비례식을 잡는다.
```text
m = [298/225, 1759/1440, 6211/5760, 2333/1920]
h = [3191/192000, 1061/72000, 337/24000, 9323/576000]
j = [5969/216000, 8807/345600, 155527/6912000, 779/30720]
```
현재 수치값은 정식화의 독립 계산 evidence다. C++ test 통과, reference spectrum 통과 또는
양의 J가 전체 volume에서 보장된다는 실행 결과로 바꾸지 않는다.
<a id="numerical-review-evidence--feast-독립-source-대조"></a>
### FEAST 독립 source 대조
Intel C 2026.0 URL edition의 [parameter 표](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)를
2026-09-06 재확인했다. `fpm[49]=1`은 CSR interval의 total count를 `m0`로 반환하고 flag를
reset한다. Stochastic estimate라는 설명은 없다. 다른 standalone FEAST의 옵션 번호나
확률적 count 설명을 이 API에 대입하지 않는다. 값의 conditioning-independent 정확성은
문서가 보장하지 않으므로 이것만으로 implementation completeness를 승인하지 않는다.
[API의 epsout 정의](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html)는
trace 변화량을 endpoint absolute maximum으로 나눈다. 따라서 strict nonzero-width
finite interval이면 zero eigenvalue만 있다는 이유로 trace 분모가 0이 되지 않는다.
Size1, N=n, B=0 문제는 실제 backend test가 여전히 필요하다.
Count scratch와 solve m0를 분리한 E7은 output overwrite와 용량을 혼동하지 않는다.
[Output status 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html)는
endpoint 근접 count failure와 넓은 구간 내 작은 cluster를 놓칠 수 있는 경우를 명시한다.
E6의 enclosure total n, monotone prefix/empty-prefix, safe bracket, multiplicity capacity,
returned count/Gram/full residual을 결합하는 방향은 이 한계를 숨기지 않는다.
Known-spectrum 검증 없는 `info=0` 또는 count만으로 lowest-N를 판정해서는 안 된다.
이 대조는 runtime 통과나 후속 numerical-control 값의 승인이 아니다.
<a id="numerical-review-evidence--재검토-범위"></a>
### 재검토 범위
이 절은 r1의 조기 반환 당시 미완료 목록이다. r2에서는 아래 항목을
[controls C1~C7](numerical-review.md#numerical-review-controls)와
[27개 case·requirement matrix](numerical-review.md#numerical-review-cases)로 고정했다.
이력 목록을 삭제하지 않으며 현재 미완료 수치 계약으로 해석하지 않는다.
- V1~V4의 symmetry/oracle/moment/centroid/Jensen/null/KZ/MZ/PZ/Cholesky/constraint/
full residual/whitened residual/normalization/Gram/energy의 threshold와 zero branch.
- Positive block reciprocal-condition limit, thickness central-inertia cancellation,
tiny nonzero director의 analytic rank 유지와 명시적 ill-conditioning failure.
- Operator-scale near-zero/negative/cluster classification, raw-value 보존과 endpoint ULP
margin, contour/precision/refinement, finite count/search/endpoint/solve-retry budget.
- Deterministic initial integer generator/seed/QR sign·rank 규칙, thread/runtime boundary,
n*m0/nnz/index overflow 및 count scratch/shifted factorization memory 검사.
- 필수 포트폴리오: affine M10와 위 curved moment, Jensen·rigid·density·source identity,
비축정렬/부분 BC/near-null/null dimension, 일반 Schur의 오삭제 반례,
실제 FEAST의 size1/N=n/zero/negative/repeated group>N/tight cluster/endpoint/
insufficient subspace/count mismatch/Gram rank/overflow/allocation failure.
- 요구사항 정합 후 coordinate-invariance coverage와 NR-MFE-001 사례의 정확한 판정 역할.
기존 K 수정, partial BC exclusion 또는 tolerance 완화로 임의 해결하지 않는다.
<a id="numerical-review-evidence--실행-evidence"></a>
### 실행 evidence
다음 read-only 조사 명령은 exit `0`이었다. 원본 reference를 쓰거나 실행하지 않았다.
```powershell
Get-Content .codex/skills/fem-numerical-review/SKILL.md
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness|EvaluateGeometry' src/fesa/elements/mitc4_shell.cpp
rg -n 'CreateShell|nodal_frames|directors' src/fesa/elements/element_factory.cpp src/fesa/model/shell_geometry.cpp
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 90
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
```
`python -B -` read-only inventory script도 exit `0`: `pathlib`와 keyword별 state로
nodes/elements/Set-2를 세고, 모든 nonempty TXT row에 fullmatch regex
`Frame:\s*Mode\s+(\d+):\s*Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)\s*\(cycles/time\)`를
적용했다. `1..10` identity, finite positive Value, 104 unique boundary labels,
유일한 source step 및 input frequency data를 검사했다.
결과는 [reference-model](reference-model.md)의 inventory/hash와 같다.
필수 project/feature/skill reference 문서는 `Get-Content`와 scoped `rg`로 읽었다.
Web `open/find`로 위 공식 Intel 3개 page의 parameter/status/epsout을 확인했다.
Configured vault는 이번 자료의 readiness 조건이 아니므로 추가 조회를 요구하지 않았다.
External solver, production implementation, CMake/CTest, Harness, FEAST runtime 및
FESA-vs-reference 수치 비교는 단계 범위 밖이며 미실행이다.
Owner 경계 밖 파일·Hook state·reference artifact를 수정하거나 stage/commit하지 않았다.
Owned 3개 문서를 read-only `python -B -`로 metadata·상대 링크·trailing whitespace·
final newline·display-math delimiter 검사했다. Exit `0`, documents `3`, local links `35`,
issues `0`이다. 문서에 보존한 반례 코드를 추출해 같은 Python으로 재실행했고 exit `0`,
위 kd/lambda/relative difference가 재현되었다. `git diff --check` exit `0`; 타 owner의
`coordination.md` LF/CRLF warning만 출력되었다. 신규 owned 문서의 whitespace는 위 별도
검사로 확인했다. `git status --short`에서 owned 신규 3개와 Coordinator 변경을 구분했다.
<a id="numerical-review-evidence--r2-독립-공변성-검산"></a>
### r2 독립 공변성 검산
새 [S1~S8](formulation.md#formulation-stabilization)는 초기 physical rotary block의 trace를
사용하므로 각 node의 orthogonal tangent 기저 변화와 SO(3) 회전에 불변이다.
Trace 평균은 PSD inventory에 zero가 있어도 같은 여덟 항을 포함하고, 기존 양의 inventory
전제에서 strictly positive다. Positive kd와 공통 director로 E3의 Kzz>0/Kpz=0을 유지한다.
Partial BC의 numerical contribution을 보존하므로 개선된 원 pencil의 reduction이다.
Nonlinear에서는 초기 scalar의 Dkd=D²kd=0이므로 기존 objective gamma의 first/second
variations에 같은 상수를 곱한다. Positive potential가 모든 상태의 Hessian SPD를 뜻하지
않으며 corotation coupling을 linear Td와 동일시하지 않는다. 기존 accepted branch·moment
work·state lifecycle과 [현재 nonlinear NR](../nonlinear-static-newton-raphson/numerical-review.md)을
대조했고 scale 개선 밖 physics 변경을 발견하지 않았다.
NR는 S7의 R block을 입력으로 재사용하지 않고, rectangle의 membrane/curvature/MITC
edge shear work를 직접 적분하여 **global 24×24 physical K를 독립 구성**했다.
기존 반례와 동일한 geometry에서 director 기반 tangent를 새로 생성해 trace scale을 계산하고
complete K/ML를 만들었다. 회전 뒤에도 새 geometry axes로 처음부터 적분했다.
정적 load는 d에 수직인 (5/3)b이고, 모든 full reaction을 Kq-F로 재계산했다.
실제 read-only command는 아래와 같으며 exit `0`, 약 `0.34 s`였다.
Production C++ 함수, vendor solver, reference 수치를 호출하지 않았다.
```powershell
@'
from math import sqrt, fsum
from fractions import Fraction as F
def dot(a,b): return fsum(x*y for x,y in zip(a,b))
def cross(a,b): return (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0])
def norm(v): return sqrt(dot(v,v))
def Rz(v): return ((v[0]-v[1])/sqrt(2),(v[0]+v[1])/sqrt(2),v[2])
def tangent(d):
k=min(range(3),key=lambda k:(abs(d[k]),k))
a=tuple((1. if j==k else 0.)-d[k]*d[j] for j in range(3))
a=tuple(v/norm(a) for v in a)
return a,cross(d,a)
def action(K,v): return [dot(row,v) for row in K]
def rotate_vector(v): return [x for off in range(0,len(v),3) for x in Rz(v[off:off+3])]
def rotate_matrix(K):
cols=[rotate_vector(col) for col in zip(*K)]
left=[list(row) for row in zip(*cols)]
return [rotate_vector(row) for row in left]
def error(a,b): return norm([x-y for x,y in zip(a,b)])/(norm(a)+norm(b))
def matrix_error(A,B): return error(sum(A,[]),sum(B,[]))
def matrices(ex,ey,d):
# Independent planar polynomial work: membrane, curvature and MITC edge shear.
signs=[(-1,-1),(1,-1),(1,1),(-1,1)]
K=[[0.]*24 for _ in range(24)]
for xi in [-1/sqrt(3),1/sqrt(3)]:
for eta in [-1/sqrt(3),1/sqrt(3)]:
fields=[]
for sx,sy in signs:
Nx=sx*(1+sy*eta)/8.; Ny=sy*(1+sx*xi)/4.
tx=(1+sy*eta)/4.; ty=(1+sx*xi)/4.
for c in range(3): fields.append(([Nx*ex[c],Ny*ey[c],Ny*ex[c]+Nx*ey[c]],[0,0,0],[Nx*d[c],Ny*d[c]]))
for c in range(3): fields.append(([0,0,0],[Nx*ey[c],-Ny*ex[c],Ny*ey[c]-Nx*ex[c]],[tx*ey[c],-ty*ex[c]]))
for i,(mi,bi,si) in enumerate(fields):
for j,(mj,bj,sj) in enumerate(fields):
K[i][j]+=2*(12*mi[0]*mj[0]+12*mi[1]*mj[1]+6*mi[2]*mj[2]+bi[0]*bj[0]+bi[1]*bj[1]+.5*bi[2]*bj[2]+5*dot(si,sj))
ta,tb=tangent(d); diagonals=[]
for i in range(4):
for t in [ta,tb]:
v=[0.]*24;v[6*i+3:6*i+6]=t
diagonals.append(dot(v,action(K,v)))
kd=fsum(diagonals)/8000.
M=[[0.]*24 for _ in range(24)]
for i in range(4):
for a in range(3):
M[6*i+a][6*i+a]=2.
for b in range(3):
K[6*i+3+a][6*i+3+b]+=kd*d[a]*d[b]
M[6*i+3+a][6*i+3+b]=((1. if a==b else 0.)-d[a]*d[b])/6.
return K,M,kd,diagonals
ex=(0.,1.,0.);ey=(-.8,0.,.6);d=(.6,0.,.8)
K,M,kd,diags=matrices(ex,ey,d)
Kr,Mr,kdr,diagsr=matrices(Rz(ex),Rz(ey),Rz(d))
load=[0.]*24; load[3:6]=[5*v/3 for v in ey]; loadr=rotate_vector(load)
q=[0.]*24;qr=[0.]*24;q[5]=load[5]/K[5][5];qr[5]=loadr[5]/Kr[5][5]
reaction=[x-y for x,y in zip(action(K,q),load)]; rr=[x-y for x,y in zip(action(Kr,qr),loadr)]
print('independent rotary diagonals=',diags)
print('kd=',kd,kdr,'expected=',float(F(19,4800)))
print('Kff/Mff/lambda/thetaZ=',K[5][5],M[5][5],K[5][5]/M[5][5],q[5])
print('rotated Kff/Mff/lambda/thetaZ=',Kr[5][5],Mr[5][5],Kr[5][5]/Mr[5][5],qr[5])
print('complete K/M/response/reaction covariance errors=',matrix_error(Kr,rotate_matrix(K)),matrix_error(Mr,rotate_matrix(M)),error(qr,rotate_vector(q)),error(rr,rotate_vector(reaction)))
print('load drill projection/free residual=',dot(d,load[3:6]),reaction[5],rr[5])
assert abs(K[5][5]/M[5][5]-float(F(10369,450)))<1e-12
assert matrix_error(Kr,rotate_matrix(K))<1e-12
assert matrix_error(Mr,rotate_matrix(M))<1e-12
assert error(rr,rotate_vector(reaction))<1e-12
'@ | python -B -
```
| 관찰 | 결과 |
| --- | --- |
| 독립 physical rotary diagonals | 각 corner 약 49/12,23/6 |
| kd before/after | 0.003958333333333333 / 0.003958333333333332 |
| Kff, Mff | 1.3825333333333332, 0.05999999999999998 |
| lambda before/after | 둘 다 23.04222222222223 |
| thetaZ per unit moment before/after | 둘 다 0.7233098659465717 |
| Complete K covariance ratio | 7.895168813539929e-17 |
| ML covariance ratio | 4.6611822355981756e-17 |
| Static response covariance ratio | 0 |
| Full reaction covariance ratio | 1.1535337419041683e-16 |
| d dot load / both free residuals | 1.1102230246251565e-16 / 0,0 |
따라서 NR-MFE-001은 **r2 수학 계약에서 해소**되었다. C2/C3/C7 기준을 만족하는
독립 계산 evidence이고 실제 C++/FEAST/기존 정적 회귀의 통과 판정은 아니다.
<a id="numerical-review-evidence--r2-보존변경-audit와-근거"></a>
### r2 보존·변경 audit와 근거
`git diff c8876da --`로 r1 checkpoint와 r2 requirements/research/formulation을 대조했다.
M1/M2/M5~M10, E6~E8, V1~V4의 식은 유지되고 변경은 scale·그 적용 대상·coordinate
coverage와 정적 회귀다. r1 rational mass oracle와 API count/trace·reference identity는
수식 영향이 없어 재계산 없이 재사용한다. Reference 두 SHA-256도 현재 원본에서 재확인했다.
AGENTS, agent/documentation 계약, NR skill 및 TOLERANCE의 같은 checkpoint 대비 diff는 없다.
기존 linear/nonlinear numerical-review/reference-model, r2 requirements 27개와
Research R07을 읽었고, 필요한 current nonlinear tangent test의 perturbation schedule을
확인했다. 최초 검색의 존재하지 않는 `numerical-methods.md` 및
`tests/fesa/elements/nonlinear_mitc4_shell_test.cpp`는 경로 오류였다.
`rg --files`로 실제 `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`를
확인하고 scoped `rg`를 exit `0`으로 재실행했다. 이를 test 실행 실패 또는 성공으로
취급하지 않는다. Source/test 파일은 변경하지 않았다.
새로 확인한 vendor 사실은 thread-local 설정/복원뿐이며
[Intel 2026.0 공식 문서](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)를
2026-09-06 `search_query/open/find`로 확인했다. FEAST count/trace/API는 r1의 primary
근거를 재사용했다. 수치 기준의 선택·단위·근거·zero branch는
[controls](numerical-review.md#numerical-review-controls), 요구별 falsifiable coverage는
[cases](numerical-review.md#numerical-review-cases)에 있고 변경한 외부 tolerance는 없다.
<a id="numerical-review-evidence--r2-최종-정적-검증"></a>
### r2 최종 정적 검증
2026-09-06 workspace root에서 PowerShell here-string을 `python -B -`에 전달한
read-only audit의 실제 exit는 `0`이다. `pathlib`의 UTF-8 읽기, Markdown 상대 링크의
`urllib.parse.unquote`, requirement/case ID의 정규식 집합 대조, `hashlib.sha256`,
위 r2 재현 코드의 `subprocess.run([sys.executable,'-B','-'], ...)`를 사용했다.
문서 owner/revision·마지막 newline·trailing whitespace·표 내부 code span의 pipe escape도
함께 검사했다. 실제 stdout은 다음과 같다.
```text
AUDIT documents=5 local_links=64 requirements=27 cases=27 static_artifacts=8 all_pass
```
문서에서 추출한 공변성 재현 코드의 별도 process exit도 `0`이며 위 표의 모든 수치를
재현했다. 지정 input/TXT의 SHA-256은 reference-model의 두 값과 일치했다.
초기 audit의 exit `1`은 Python 기본 cp949 decode와 링크의 `%20`을 실제 경로로
해석하지 않은 audit-script 문제였다. 명시적 UTF-8과 URL decoding으로 수정해 재실행했으며
제품·reference·수치 기준을 변경하지 않았다.
`git diff --check` exit `0`을 확인했다. 소유 변경은 이 evidence와 numerical-review,
reference-model, controls, cases의 Markdown 5개이며 `coordination.md`의 동시 변경은
Coordinator 소유다. 본 단계에서 C++ build/test, FEAST runtime, 외부 solver 실행,
새 reference comparison은 수행하지 않았다. 이 필수 실행은 case matrix에 따라
Implementation이 새 binary와 r2 계약으로 증명해야 한다.
<a id="numerical-review-controls"></a>
<a id="numerical-review-controls--mitc4-eigen-내부-수치-기준"></a>
## MITC4 eigen 내부 수치 기준
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 적용: IEEE binary64, MSVC x64 Debug, 실제 oneMKL FEAST adapter 및 같은 산술의 내부 검증.
[V1~V6](formulation.md#formulation-verification), [E1~E8](formulation.md#formulation-eigen),
[S1~S8](formulation.md#formulation-stabilization)의 식을 사용한다. 아래 값은 구현 전에 고정한 내부
수치 계약이며 reference fitting 값이 아니다. [외부 판정](reference-model.md)의 공통
tolerance, 기존 nonlinear Newton 종료 기준과 별개다. 실패 결과를 보고 완화하지 않는다.
<a id="numerical-review-controls--c1-scale-공통-zero-branch와-근거"></a>
### C1. Scale, 공통 zero branch와 근거
`ell`, `D`, `Khat/Mhat`, `Kf/Mf`, `A`, `s`, `B=A/s`는 E1/E6대로 사용한다.
같은 비교의 두 행렬에는 같은 ell을 적용한다. Matrix norms는 Frobenius,
vector norms는 Euclidean이며 별도 inf 표기만 infinity norm이다. Mixed force/moment 또는
translation/rotation 원값을 직접 더하지 않는다. Scaled sum-of-squares와 stable ordered sum을
쓰고 finite-first로 검사한다. 모든 ratio는 분모가 양수일 때 계산한다.
`numerator=denominator=0`은 metric 0, `denominator=0,numerator!=0`은 named failure다.
Zero eigenvector, nonpositive modal mass 및 invalid scale은 이 zero-pass의 대상이 아니다.
어떤 branch에도 `max(1,physical_scale)`, mass/eigenvalue floor나 clamp를 추가하지 않는다.
공통 기본값은 `tau_alg=1e-12`, `tau_modal=1e-10`이다. 기존
[linear NR-D02](../linear-static-mitc4-shell/numerical-review.md)의 algebraic/rigid 기준을
유지하며 mass polynomial과 trace의 같은 단위 항등식에도 적용한다.
Unit roundoff `u=2^-53`에서 `gamma_k=ku/(1-ku)`이다. 4096개의 단순 연산을 가정한
`gamma_4096≈4.55e-13`에 비해 `1e-12`는 작은 dense block·27점 적분의 정상 산술 오차를
구분할 여유가 있다. 이는 모든 geometry의 forward-error theorem이 아니다.
Rank·conditioning·원 residual·독립 oracle를 따로 요구한다. 현재 rational oracle 및
r2 covariance 오차는 이 기준보다 충분히 작지만 기준을 그 결과에 맞춰 고른 것은 아니다.
`tau_modal`은 `1e-12` 내부 FEAST stopping보다 100배 큰 후검증 한계다.
외부 1% 판정을 내부 residual 허용값으로 쓰지 않는다. 같은 계산의 재실행 구조/row/
diagnostic 순서는 exact이고, eigenvector의 repeated-basis 비유일성은 C4를 따른다.
<a id="numerical-review-controls--c2-matrix-mass-stabilization와-reduction"></a>
### C2. Matrix, mass, stabilization와 reduction
| ID | Metric / exact predicate | 한계·zero 처리 |
| --- | --- | --- |
| C2-01 | V1 `eta_sym(Q)`; mass·physical K·linear complete K·whitened A | `<=1e-12`; Q=0이면 C1. 대칭 copy 자체만 독립 evidence로 사용하지 않음 |
| C2-02 | V1 `\|\|R-S\|\|F/(\|\|R\|\|F+\|\|S\|\|F)`; congruence, moment→matrix, 직접 적분, Cholesky reconstruction | `<=1e-12`; 단위·같은 scale 필수 |
| C2-03 | Scalar moment entry oracle: `\|Ck_ij-Ck*_ij\|/[m_e(t/2)^k]` | k=0,1,2 각각 `<=1e-12`; positive `m_e=integral rho dV`. Exact C1=0도 이 차원 일치 scale로 검사 |
| C2-04 | Mass total `\|m-m*\|/(\|m\|+\|m*\|)`; uniform translation energy | `<=1e-12`; 각 방향을 따로 검사, trace(Muu)를 총질량으로 쓰지 않음 |
| C2-05 | Shifted spatial first moment difference divided by `m_e ell` | `<=1e-12`; 한 source node를 공통 Xref로 사용. `hi di` 포함 |
| C2-06 | M9 difference vs independent pairwise integral / `(q^T ML q+q^T MC q)` | absolute mismatch `<=1e-12`; raw Delta/scale `>=-1e-12`. Zero motion/drill-only는 C1. Negative roundoff를 값을 0으로 바꾸는 데 사용하지 않음 |
| C2-07 | V2 mass-null action, MZ, KZ | 각각 `<=1e-12`; nz=0은 N/A. 정확한 analytic null만 대상 |
| C2-08 | `\|\|P^T Z\|\|F`, `\|\|[P Z]^T[P Z]-I\|\|F/sqrt(nf)` | `<=1e-12`; 각 node basis의 해당 norm도 `<=1e-12` |
| C2-09 | `mi>0,ji>0,ji-hi²/mi>0`; consistent physical20 및 모든 nonempty Mp nodal block Cholesky | strict, finite. Zero/negative pivot·variance는 실패. Consistent rank20/lumped rank5는 analytic expected rank로 검증 |
| C2-10 | `\|(ji-hi²/mi)-integral rho Ni(z-hi/mi)²dV\|/(ji+hi²/mi)` | `<=1e-12`; `vi/ell²`, `\|hi\|/sqrt(mi ji)`도 기록하며 별도 rank cutoff로 쓰지 않음 |
| C2-11 | S2 여덟 초기 rotation diagonals | 모두 finite `>=0`, 하나 이상 `>0`; zero 포함 분모8. `kd>0` finite. Negative를 허용오차로 0 처리하지 않음 |
| C2-12 | `\|kd'-kd\|/(\|kd'\|+\|kd\|)` 및 직접 trace oracle | `<=1e-12`; global 회전/독립 tangent 재생성 후 계산. Trial별 frozen kd는 exact unchanged |
| C2-13 | E3 `Kzz=diag(kappa_i)`, `kappa_i=sum incident kd,e` | 각 kappa finite `>0`, expected diagonal relation C2-02; Kpz 검사와 원 free residual을 함께 요구 |
| C2-14 | Scaled constrained component norm V3 | `0` exact; 복원한 source constrained entries도 exact zero |
Positive/null dimension은 **E2의 constrained director component exact-zero 교집합**으로만
정한다. Constrained director의 tiny nonzero 성분을 축정렬이라고 반올림하지 않는다.
각 nonempty dimension≤6 scaled nodal Mp에
`rcond_inf = 1/(||Mp||inf ||Mp^-1||inf) >= 2^-32 = 2.3283064365386963e-10`
을 요구한다. 작은 block의 Cholesky triangular solves로 inverse action norm을 구하며
global inverse는 만들지 않는다. Product overflow를 피하는 동치 ratio로 계산한다.
이 조건은 physical rank 변경이 아니라 binary64 whitening의 numerical admissibility다.
64 연산의 `gamma_64/rcond`를 약 `3.06e-5` 이하로 제한하는 최소 guard이며
모든 eigenvalue의 상대 정확도를 보장하지 않는다. Cholesky reconstruction과 full modal
residual을 통과해야 한다. 한계 미만·unresolvable estimate는 conditioning failure이고
좌표 삭제, 더 큰 mass, 다른 solver로 우회하지 않는다. 빈 nodal block은 skip하지만
global n=0 또는 요청 N>n은 명시적 failure다.
<a id="numerical-review-controls--c3-eigenpair-및-물리-내부-판정"></a>
### C3. Eigenpair 및 물리 내부 판정
계산된 c개 **전체** eigenpair를 검사한 뒤 첫 N개만 공개한다. V3/V4의 actual M은 ML다.
| ID | Metric | 한계 |
| --- | --- | --- |
| C3-01 | V1 full original free residual `eta_r`; V3 whitened `eta_w` | 각각 `<=1e-10` |
| C3-02 | 추가 operator-scale residual `rho_B=\|\|Bx-mu x\|\|2/\|\|x\|\|2` | `<=1e-10`; dimensionless. Frobenius norm의 크기로 오류가 희석되는 것을 방지 |
| C3-03 | V3 `eta_norm,i`, pairwise `eta_orth,ij`, `eta_G` | 각각 `<=1e-10`; positive mass를 먼저 확인. Gram full rank는 이 bound와 독립 column 수로 확인 |
| C3-04 | V4 energy/Rayleigh consistency `eta_energy,i` | `<=1e-10`; zero lambda도 C1/V4 분모 사용 |
| C3-05 | V5 rigid K action | 각 6개 field `<=1e-10`; physical rigid mass Gram는 Cholesky 성공, vector 수6. Drill과 혼동하지 않음 |
| C3-06 | `\|c_rho lambda_i'-lambda_i\|/s` 또는 coordinate `\|lambda_i'-lambda_i\|/s` | `<=1e-10`; repeated group 내부 pairing은 C4. 동일 물리 BC·loads 사용 |
| C3-07 | Exact known-spectrum test eigenvalue error / known s | `<=1e-10`이고, 알려진 인접 distinct gap이 있으면 absolute error도 `<=gap/8` |
| C3-08 | Simple/반복군 C4 projector error V5 | `<=1e-6`; 테스트의 해당 군과 나머지 spectrum 사이 known gap은 `>=1e-3 s`로 선택 |
C3-02는 symmetric B에서 computed mu가 실제 spectrum으로부터 residue norm 이내에
있다는 직접 spectral-decomposition bound를 사용한다. 가장 낮은 mode인지, 올바른
multiplicity인지는 증명하지 않으므로 C5 count/endpoint evidence가 별도로 필수다.
FEAST의 `res`는 backend diagnostic이고 C3의 독립 residual을 대신하지 않는다.
Zero eigenvalue에서 backend relative-residual의 분모가 0이면 해당 diagnostic은 unavailable로
기록하고 이유를 남긴다. Raw e/x, 자체 metric 및 최종 scalar 결과는 finite여야 한다.
Undefined backend diagnostic을 physical residual=0으로 바꾸거나 mandatory finite 결과에
NaN을 저장하지 않는다. Trace `epsout`은 strict interval에서 finite여야 한다.
Raw `mu=lambda/s`에서 `tau_zero=1e-9`, `tau_cluster=1e-8`로 고정한다.
`mu<-tau_zero`는 유의한 negative spectrum으로 procedure failure,
`|mu|<=tau_zero`는 near-zero classification, 그 외 양수는 positive다.
Boundary equality는 near-zero에 포함한다. Returned lambda는 부호와 raw 수치를 보존한다.
양수에서만 frequency를 파생하고 exact zero는 f=0, 작은 음수에서는 실수 frequency를
만들지 않는다. C3-02보다 10배 큰 near-zero band와 100배 큰 cluster band는 수치 분류용이다.
양의 작은 mode를 제거하거나 N을 세는 방식에 쓰지 않는다. s/λ의 nonfinite 또는
nonzero mu의 λ 환산 underflow-to-zero는 실패하고 physical scale을 1로 바꾸지 않는다.
<a id="numerical-review-controls--c4-repeated-subspace와-결정론"></a>
### C4. Repeated subspace와 결정론
Raw lambda 오름차순의 stable sort, exact equal tie는 original solver column 순서다.
인접 `|lambda_i-lambda_(i-1)|/s<=1e-8`의 connected group은 diagnostic cluster일 뿐,
distinct 값을 merge/평균하거나 vector를 섞을 권한이 아니다. 알려진 exact repeated 군의
density/rotation tests에서 V5의 mass-whitened projector norm을 사용한다.
Known gap≥1e-3 s와 C3-02이면 first-order invariant-subspace sensitivity는 약1e-7
수준이므로 C3-08의 1e-6은 방향 비유일성을 허용하면서 잘못된 공간을 검출한다.
이 조건 밖 실제 cluster는 raw eigenpair·Gram/residual을 계속 검사하고 특정 개별 vector
방향의 정확도를 새로 약속하지 않는다. Mode shape 외부 comparison은 없다.
Source DOF 순서로 largest absolute scaled global component를 찾고 sign을 양수로
정한다. 동률은 첫 source DOF다. Zero vector는 실패다. 동일 binary/runtime/thread/입력의
세 반복에서는 sparse structure·COO reduction·row/diagnostic identity가 exact 동일해야 한다.
Scalar 재현 오차는 C3-06, repeated vector는 C4를 적용한다. CPU/runtime를 바꾼 bitwise
eigenvalue/vector equality를 요구하지 않는다.
<a id="numerical-review-controls--c5-feast-controls와-bounded-interval-정책"></a>
### C5. FEAST controls와 bounded interval 정책
Actual call은 `dfeast_scsrgv`, `(B,I)`, `uplo='U'`, sorted duplicate-free 1-based CSR다.
각 call은 `feastinit`하고 아래 C-index fpm을 설정한다. 명시하지 않은 값은 해당 설치의
초기값을 유지·기록한다. Private backend를 넘어 vendor type을 노출하지 않는다.
| fpm | 값 | 근거·역할 |
| --- | ---: | --- |
| `[0]` | 0 | Status를 deterministic diagnostic으로 수집 |
| `[1]` | 16 | 공식 허용 contour 값; 기본8보다 적분 resolution에 여유, 모든 attempt 고정 |
| `[2]` | 12 | `1e-12` double stopping; 독립 C3 residual 필수 |
| `[3]` | 20 | 유한 refinement 한계; 미수렴 성공 금지 |
| `[4]` | 1 | 아래 고정 initial subspace 사용 |
| `[5]` | 1 | Endpoint-scaled trace stopping; zero mode에서 C3-02로 독립 검증 |
| `[13]` | 0 | Eigenpairs가 아닌 subspace-only 결과 금지 |
| `[26]`, `[27]` | 1, 1 | CSR validity와 second-matrix SPD check |
| `[49]` | count 1, solve 0 | Total interval count와 실제 eigenpair solve 분리 |
| `[63]` | 0 | 초기 PARDISO 정책 사용; 임의 iparm tuning 금지 |
근거는 [Intel parameter table](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html)과
[E7의 API/status 출처](formulation.md#formulation-eigen--e7-feast-경계와-deterministic-실행)다.
Count는 documented total이며 stochastic estimate로 부르지 않는다. 공식 count/status의
floating-point 한계가 있으므로 아래 redundant evidence와 실제 known spectra가 필수다.
Gershgorin 각 off-diagonal absolute sum은 매 덧셈 뒤 `nextafter(+infinity)`로 outward
누적한다. `Bii-ri`/`Bii+ri`도 각각 바깥으로 한 ULP 이동한다. Overflow는 실패다.
`beta=||B||inf`를 같은 outward 방식으로 구한다. Nonzero B에서는 beta>0;
정확한 B=0은 E6의 algorithmic enclosure `[-1,1]`에 대응하여 beta=1로 둔다.
이는 physical mass/λ floor가 아니다. `ulp(v)`는 v의 두 finite adjacent spacing 중 큰 값이며
`delta(v)=1e-8 beta + 64 ulp(v)`
로 정의한다. 초기 endpoints는 `a0=nextafter(gL-16delta(gL),-infinity)`,
`b0=nextafter(gU+16delta(gU),+infinity)`다. Finite strict enclosure와 total count=n을
확인한 뒤 E6의 upper-prefix search와 empty-prefix lower 축소를 한다.
Interior endpoint v를 bracket에 반영하려면 `(a0,v-delta(v))`, `(a0,v)`,
`(a0,v+delta(v))`의 count가 모두 `info=0`이고 같아야 한다. 이 guard count는 eigenvalue
근처의 endpoint를 피하는 추가 evidence다. Guard가 enclosure 밖이면 그 부분은 알려진
outside bound를 이용하며 실제 interval이 strict하지 않으면 평가하지 않는다.
Zero count는 성공 count=0일 때만 믿고 `info=1`을 empty proof로 바꾸지 않는다.
이미 알려진 prefix count와 monotonicity가 맞지 않으면 전체 실패다.
| 제어 | 유한 값 / 정확한 처리 |
| --- | --- |
| Total count API calls | 전체 analysis 최대512. 성공·실패·guard·최종확인·retry 모두 포함 |
| Search optimization | Upper/lower 각각 최대32 midpoint 단계; optimization count calls 최대384로 남은128 예약 |
| Endpoint collision | 같은 midpoint에서 offsets `0,+1,-1,+2,-2,+4,-4` times delta, 이 순서 최대7후보. 현재 bracket 내부 후보만 사용 |
| Search 종료 | E6의 count target `N<=c<=min(n,2N+8)` 또는 폭 `<=8delta(mid)`/새 representable midpoint 없음/위 budget. 마지막 certified c>=N bracket 사용 |
| 최종 확인 | Enclosure 안의 a에 prefix0, b에 prefix c>=N, 두 endpoint guard, actual `(a,b)` count=c. 불일치/예약 budget 부족이면 실패 |
| Initial solve capacity | E6 그대로 `m0=min(n,max(c+8,ceil(3c/2)))`; c=n이면 n |
| Actual solve calls | 최초 포함 최대3; 각 call loops≤20, control/seed 동일 |
| 허용 solver retry | info1/2/3, count/returned-m mismatch 또는 endpoint separation failure만. 저장된 더 넓은 certified bracket으로 확대·재count, `m0=min(n,max(new formula,2*previous m0))` |
| Retry bracket 순서 | Upper search에 저장된 현재 b보다 큰 성공 b를 오름차순으로 선택, lower는 이전의 더 작은 certified prefix0 또는 a0; 최종 fallback은 원 enclosure |
| 금지 retry | Nonfinite eigenpair, wrong Gram/residual, negative spectrum, invalid/SPD/index/allocation/inner-solver 오류는 즉시 실패. Seed·mass·solver·threshold 변경 금지 |
새 유효 bracket이 없으면 같은 실패 call을 무조건 반복하지 않는다. Optimization 한계에서는
이미 certified enclosure를 사용할 수 있지만 실제 solve·최종 count가 실패하면 부분 결과를
공개하지 않는다. Returned m=c, interval 내부와 `mu-a>=delta(a)`, `b-mu>=delta(b)`,
모든 c columns C3 통과를 확인한다. N번째가 cluster 내부여도 전체 c를 검사하고 출력은 N개다.
Bounds·prefix/guard/status/count/m0/m/loop/epsout·chosen ranks 및 모든 실패를 보존한다.
후속 tolerance 완화나 reference Value를 bounds 설정에 사용하는 것은 금지한다.
<a id="numerical-review-controls--c6-initial-subspace-thread와-storage"></a>
### C6. Initial subspace, thread와 storage
Count scratch는 E7의 conservative n×n, identity initial x다. 실제 solve에서 m0=n도
identity다. m0<n이면 uint64 recurrence를 column-major로 한 entry마다 한 번 실행한다.
Seed `0x4D495443344D4645`, `z <- 6364136223846793005*z+1442695040888963407 mod 2^64`,
`x=2*(double(z>>11)*2^-53)-1`이다. Overflow wrap은 이 generator에만 의도적이며
size/index 산술에는 허용하지 않는다. Seed를 바꾸며 성공을 찾지 않는다.
Column ascending의 nonpivoted Householder QR를 사용한다. Scaled norm, `sign(0)=+1`,
`v1=x1+sign(x1)||x||`로 cancellation을 피하고 최종 R diagonal이 양수인 Q를 선택한다.
Original column norm에 대한 `|Rjj|/||input_col_j||2<=1e-12` 또는 zero는 initial-space
rank failure다. Post-QR `||Q^TQ-I||F/sqrt(m0)<=1e-12`를 요구한다. 이것은 모든
eigenspace overlap의 보장이 아니며 C5 count와 C3 Gram/residual이 계속 필요하다.
Backend call 동안 oneMKL thread-local count=1을 설정하고 모든 exit에서 이전 값을 복원한다.
[공식 mkl_set_num_threads_local](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/mkl-set-num-threads-local.html)의
반환 previous setting을 사용한다. 전역 설정을 바꾸거나 vendor workspace를 동시 공유하지
않는다. 설치 runtime/ABI/유효 thread count·seed·controls를 기록한다. Element contribution
병렬 생성은 허용하되 stable reduction 순서는 유지한다.
Mode cap을 임의의 상수로 만들지 않는다. 정량 representation 경계는
`1<=N<=n<=MKL_INT_MAX`, `nnz+1<=MKL_INT_MAX`, 모든 row/column in-range,
`n+1`, `6*nodes`, `n*m0`, `n*n`, 각 `count*sizeof(T)`가 internal index 및
`min(SIZE_MAX,PTRDIFF_MAX)` 안에 있고 해당 container max_size를 넘지 않는 것이다.
곱/합은 overflow 전에 검사하며 double의 정수 근삿값으로 capacity를 계산하지 않는다.
Conservative double n×n scratch는 Win64에서 표현상 n≤`1073741823`이고 실제 사용 가능
메모리 한계는 훨씬 작다. Allocation/factorization 실패는 명시적으로 종료하며 N을 줄이지 않는다.
Reference n=3125의 count x만 `78,125,000` bytes다. 이를 전체 peak memory라고 부르지 않고
CSR, FEAST reduced storage 및 complex shifted sparse fill을 따로 기록한다.
<a id="numerical-review-controls--c7-승인된-정적-회귀-기준"></a>
### C7. 승인된 정적 회귀 기준
새 scale을 적용하되 기존 [linear NR](../linear-static-mitc4-shell/numerical-review.md)의
symmetry/frame/energy `1e-12`, rigid/full residual/global equilibrium `1e-10`을 유지한다.
NR-MFE-001 static response는 C2 congruence `1e-12`와 complete full residual `1e-10`이다.
Static moment admissibility는 기존 `|d·m|/||m||<=1e-12`, zero moment는 별도 branch다.
기존 [nonlinear NR §6](../nonlinear-static-newton-raphson/numerical-review.md)는 그대로다:
rotation/frame 및 no-applied-moment tangent symmetry `1e-12`, directional tangent error
`1e-6`(zero analytical direction `1e-10`), finite-rigid objectivity `1e-10`, factor-one
global force/moment balance 각 `1e-8`. 기존 finite-difference schedule
`[1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7]` 및 interior index3 기준을 유지한다.
근거는 [등록된 tangent test](../../tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp)와
기존 승인 numerical contract다. 새 scale의 Dkd=D²kd=0 및 gamma derivative를 검산한다.
Nonlinear Hessian 전체의 SPD 또는 linear Tdrill과의 entry equality를 추가하지 않는다.
NSNR-069/070의 네 채널·typed zero-scale·100 iteration·no cutback/retry 종료 정책도
기존 계약을 보존한다. 새 eigen C1 zero branch로 해당 승인 typed absolute branch를 덮어쓰지 않는다.
<a id="numerical-review-cases"></a>
<a id="numerical-review-cases--mitc4-eigen-필수-verification-portfolio"></a>
## MITC4 eigen 필수 verification portfolio
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [numerical-review.md](numerical-review.md#numerical-review)
- 수치 기준: [controls C1~C7](numerical-review.md#numerical-review-controls)
아래는 Planning이 RED→observed failure→GREEN→focused/full VERIFY에 연결할 **필수
logical cases**다. C++ test 이름·파일과 final schema는 각 owner가 정한다. 새로운 reference
생성/수정 없이 synthetic test inputs는 tests의 승인 소유 경로에 둔다. Expected value를
production mass/reduction/FEAST 함수의 재호출로 만들지 않는다. 이 문서는 실행 결과가 아니다.
<a id="numerical-review-cases--p1-mass좌표조립"></a>
### P1. Mass·좌표·조립
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C01 | Affine rectangle `4×2`, rho=3, t=1/2, parallel unit director. M10: C0=`(rho t A/36)*[4,2,1,2;...]`, C1=0, C2=t²C0/12, node m=3, h=0, j=1/16. Full24와 physical20·각 translation energy·tangent inertia/drill null을 검사. rho×4, t×2의 C0/C2 scaling도 검사 | C2 모든 관련 scalar/matrix/rank 기준 |
| MFE-C02 | [r1 rational warped/director-varying fixture](numerical-review.md#numerical-review-evidence--독립-mass-oracle)의 X,d,rho,t와 exact coefficient/row/first-moment oracle. Independent coefficient integration 또는 별도 고차 direct integration을 사용. C1을 강제0, 2-point mass, flat C2 비례식 mutation은 실패해야 함. 같은 shape/J production 호출만으로 oracle 구성 금지 | C2-02~10; 기존 geometry predicate를 먼저 적용. Custom-director kernel fixture를 input explicit normals 지원으로 확대하지 않음 |
| MFE-C03 | Consistent/moment snapshot을 유지하고 row-sum→lumped 연결 검사. C1/C2의 controlled symmetric perturbation이 원 mass와 derived block에 모두 반영됨. Independent nodal `integral rho Ni Gi^T Gi` 및 고정 velocities의 pairwise Jensen work와 비교. Uniform translation, drill-only, nonuniform translation, tangent rotation을 각각 검사 | C2-02~10; nonnegative kinetic energy, zero branch 및 총질량·centroid 보존 |
| MFE-C04 | Square `[-1,1]^2`, rho=t=1, uniform m×m grid m=1,2,4, velocity `(x,0,0)`, theta=0. Direct polynomial gives `q^T MC q=4/3`, `q^T(ML-MC)q=8/(3m²)`. Independent constant velocity의 두 energy는 모두 총질량4 | Exact sequence에 C2-03/04/06. 이는 이 smooth field의 lumping error 검산이며 일반 spectrum 수렴 차수 약속 아님 |
| MFE-C05 | C01/C02의 global proper rotation과 origin translation. Q는 rational proper rotation `[[0,-1,0],[3/5,0,-4/5],[4/5,0,3/5]]`, shift=(7,-3,5). Geometry/director/frame/mass를 새로 계산. Scalar full-row lumping이 실패하는 d=(1,1,1)/sqrt3도 사용 | 두 mass congruence와 kinetic work C2-02; moment는 common Xref, drilling null 보존 |
| MFE-C06 | 공유 node·서로 다른 rho/thickness section의 shell patch. Element 순서와 source labels가 다른 입력의 대응 결과, sequential/병렬 contribution 및 stable reduction을 검사. 실제 constraints와 source indices를 독립 expected map으로 대조 | Exact structure/order/identity, C2 matrix equality. Input permutation 자체와 fixed source-order determinism을 구분 |
| MFE-C07 | rho=0/negative/NaN/Inf/missing/duplicate/unresolved/dependent, invalid t/material, inverted/degenerate/기존 미지원 geometry 및 27점 중 invalid evaluation을 각각 거부. Density가 없는 기존 static case는 허용 | Semantic/geometry/model failure, 상태·output 미반영. Mass zero 우회 금지 |
<a id="numerical-review-cases--p2-stabilizationpartial-bc정적-영향"></a>
### P2. Stabilization·partial BC·정적 영향
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C08 | [NR-MFE-001 원 rectangle](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례)와 Z45° 회전. S1을 새 frame에서 계산. Expected kd=19/4800, Mff=3/50, Kff=10369/7500, lambda=10369/450. 모든 DOF fixed, node1 URZ만 free. Old min rule은 이 case를 실패시켜야 함 | Complete K·두 mass·kd congruence C2, exact eigenvalue C3-07, 원 free residual. Full-free/clamp 대체 금지 |
| MFE-C09 | C08에 admissible moment `m=(5/3)M0 b`, M0=1, b=(-4/5,0,3/5). 각 geometry에서 load도 변환. Expected thetaZ=7500/10369. 원 full `Kq-F`의 모든 reaction 성분을 회전해 비교 | C7 static response/full residual/reaction covariance, physical moment projection<=1e-12 |
| MFE-C10 | Eight diagonal inventory `[0,0,2,4,0,6,0,4]`이면 kref=2,kd=.002. All-zero, 한 negative, NaN/Inf는 failure. DBL_MAX 근방 양성 inventory는 scaled mean이 가능한 경우 finite; subnormal kd underflow는 failure. Independent node별 tangent changes O angles=(0,pi/6,pi/4,pi/3)에서도 trace 동일 | C2-11/12; 분모8 고정, clamp/positive-only mean/min 금지 |
| MFE-C11 | Free affine element와 smooth patch의 세 rigid translation·세 tangent-projected rigid rotation. Pure drill은 별도 4개. Physical K20 rank14, consistent physical mass rank20, complete K24 rank18/nullity6; positive-space dimension20. Full massless reduction 후 six near-zero physical modes가 남음 | C2/C3 analytic rank·rigid K action·mass Gram; drill에 관성을 주거나 physical zero mode 삭제 금지 |
| MFE-C12 | 기존 nonlinear fixture에서 초기 scale=S1, trial/commit/rollback에 exact unchanged. 기존 objective gamma potential의 first/second directional variations, finite rigid motion, linear physical limit, physical recovery 제외와 reaction conversion | [기존 nonlinear 계약](../nonlinear-static-newton-raphson/numerical-review.md) 및 C7. Trial scale 재선정·nonlinear Hessian SPD·linear Td entry equality를 요구하지 않음 |
<a id="numerical-review-cases--p3-실제-bcmass-whiteningfeast"></a>
### P3. 실제 BC·mass whitening·FEAST
| Case ID | 입력·독립 oracle·필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C13 | Nodal M6 h=0,m=j=1의 manufactured block. d=(0,0,1), d=(3/5,0,4/5), d=(1,1,1)/sqrt3에 full free, URX fixed, URZ only free, all rotations fixed, drill-only free, fully constrained 조합. 조합은 Cartesian product가 아니라 지원되는 global component BC로 표현 가능한 경우만 적용하며, drill-only free는 d=(0,0,1)에서 URZ만 free이고 나머지5 DOF constrained인 경우로 한정한다(MPC 없음). Expected null은 constrained director 성분의 exact-zero 교집합. Mixed nodes에는 local finite rank0가 있어도 다른 finite node 보존 | E2 analytic dimension, C2-07~14, recovered source mask. Global n=0 또는 N>n은 failure |
| MFE-C14 | `d=(2p/(1+p²),0,(1-p²)/(1+p²))`, p=1/2000와1e-8. m=j=1,h=0; URX만 fixed, 세 translation과 URY/URZ free. 첫 case positive rank5와 conditioning pass; 두 번째는 여전히 analytic rank5이나 conditioning/Cholesky failure. p=0은 정확한 null1 | C2 rcond cutoff의 양옆 및 exact equality branch. Tiny positive mass를 rank4로 바꾸는 구현은 실패 |
| MFE-C15 | 독립 singular pencil K=[[6,2],[2,4]], M=diag(2,0)에서 finite lambda=5/2,z=-p/2. 단순 삭제의3은 오답. Production shell projection path에 nonzero Kpz 또는 nonpositive Kzz 주입 시 실패. 일반 dense Schur 기능을 구현할 필요 없음 | Original residual oracle와 E3 admissibility rejection, 임의 fallback 금지 |
| MFE-C16 | SPD nodal whitening `M=[[2,1],[1,2]]`, `K=[[6,4],[4,6]]`의 eigenvalues 2,10/3. Dense inverse 없이 congruence·복원·original-M normalization. 같은 eigenvectors에 틀린 lambda·mass variant·null coordinate/constraint를 각각 주입 | C2/C3, injected wrong pairing/mass/full residual이 실패해야 함 |
| MFE-C17 | Actual FEAST diagonal known spectra: n1 λ=2,N1; `[0,0,0,2,5,9]`에 N1/4/6; `[1,2,4,8]` N1/2/4; n4 all-zero N1/4. 요청 N은 별도 input count이고 count output과 분리 | C3/C5, lowest N/multiplicity/zero/N=n, count/guard/solve history; mock만으로 대체 금지 |
| MFE-C18 | Actual FEAST n64 spectrum: 앞40개 λ=1, 나머지 λ=2..25, N1 및N41. n4 tight spectrum `[1,1+2^-28,1+2^-27,8]`, N2. B=Q diag(lambda) Q^T의 dense-pattern test도 추가; Q는 고정 Givens(pi/6,pi/4) 곱 | C3-07/08, repeated group>N에서 c/m0가 N보다 커짐, 전체 c Gram, partial cluster merge 금지 |
| MFE-C19 | Actual backend에 `[ -2,0,3 ]`, `[ -1e-12,0,1 ]`. Backend raw negative 보존; procedure는 첫 spectrum의 유의한 음수 실패, near-zero negative는 classification·frequency-validity/raw 보존. Exact `±tau_zero*s` 및 그 양옆은 arithmetic/injection 경계 test | C3 분류와 실패 보존. 부적합 물리 K를 accepted shell이라고 주장하지 않음 |
| MFE-C20 | Density×4에서 두 M×4, λ/4, normalized vector amplitude 1/2; C08과 simple/repeated known-spectrum fixture 사용. 길이×1024, rho/1024³,E/1024,t×1024의 일관 단위 변환에서도 λ 불변 | C2/C3/C4; baseline s·same physical BC, 단위 mixing/floor 검출 |
| MFE-C21 | Endpoint=eigenvalue collision, prefix0 반환, nonmonotone count, total!=n, m!=c, info1/2/3/4/-1..-5/200..202·invalid fpm, missing/duplicate/nonfinite CSR, B-not-SPD를 각각 주입. QR rank/Gram failure·insufficient capacity·nonfinite pair·wrong residual도 주입 | C5의 정확한 retry 대상·budget/최종 failure. Error를 empty interval 또는 부분 성공으로 바꾸지 않음 |
| MFE-C22 | 실제 operator에 near endpoint/repeated cluster의 C5 history 검증과 adapter-mock count-call512/solve-call3 최대 경계, budget 직전 certified bracket fallback. Index/nnz+1/n²/n*m0 overflow 및 allocation 실패 injection | 정수 exact checks, 유한 종료, controlled failure. 큰 메모리를 실제 할당해 실패시킬 필요 없음 |
MFE-C17/18 actual FEAST case에서 bounds를 expected eigenvalues로 설정하지 않는다.
Production E6/C5 search를 실행하고 independent diagonal spectrum의 prefix count와
postsolve 결과로 history를 검증한다. Synthetic rotated pencil은 sparse CSR에 전 dense
pattern을 저장할 수 있지만 다른 eigensolver로 expected values를 계산하지 않는다.
False count/solve success가 lowest-N를 검증하지 못하는 mock도 포함해 missing low eigenpair를
Gram/residual만으로 성공시키는 경로를 잡는다.
<a id="numerical-review-cases--p4-ioreference운영-closure"></a>
### P4. I/O·reference·운영 closure
| Case ID | 필수 관찰 | 판정 |
| --- | --- | --- |
| MFE-C23 | 원본 input의 density/section mapping·S4/S4R common physical path·Step-2/N10·blank bounds·Lanczos/SIM/acoustic-free no-op·mass normalization. Unsupported fields, prior step/preload, nonzero BC, damping/acoustic/mixed elements는 fail-closed | I/O가 fixed syntax allowlist·진단으로 구체화. Source count와 actual FEAST count/backend 구분 |
| MFE-C24 | Source renumbering과 output self-check; logical mode/source identity·lambda dimension·actual mass/backend·candidate를 HDF5에서 복원. 기존 final hash/accepted state를 준비하고 solve/validation/write/close/replace failure 주입 | 정확한 schema는 I/O 소유. 모든 failure에서 계약 범위의 이전 state/final 보존, log는 별도 lifecycle |
| MFE-C25 | [새 eigen reference](reference-model.md) 10개 Value, 10 singleton families, comparator prechecks/1% RMS·5% row·near-zero·zero-scale inclusive 경계. Equal values의 distinct IDs와 reordered TXT는 허용, missing/extra/duplicate/NaN/Inf/wrong quantity/mass/schema는 실패 | 공통 policy 그대로, 모든 Value blocking. Actual FESA fresh binary 결과로 실행 |
| MFE-C26 | 아래 기존 linear/nonlinear static portfolio·configured 전체 regression suite·새 warning 없음. Density 없는 기존 static, source mapping·partial-BC response·Newton objective/tangent·평형·reaction·energy·rollback | C7와 기존 reference identity/policy. Old kd 수치 equality는 대체하되 다른 기준 유지 |
| MFE-C27 | RED가 변경 동작 때문에 실패했는지 확인, GREEN/focused/full MSVC x64 Debug CMake/CTest 실제 exit, actual FEAST/backend identity, fresh reference timestamps/hashes. 세 반복 구조/order/diagnostic 및 scalar 재현성 | C4, 전27개 requirement evidence 및 동일 r2 Physics/Release closure. 누락·실패·stale를 통과 처리 금지 |
기존 정적 포트폴리오의 원본 목록은
[Requirement evidence](requirements.md#requirements-evidence--필수-회귀-포트폴리오와-identity)와
[현재 nonlinear reference-model](../nonlinear-static-newton-raphson/reference-model.md)이다.
`shell`/`shellNL`/`shellNL-meshfine`의 해당 `.inp`와 같은 폴더의 원본
`<stem> displacements.csv`, nonlinear의 required review-only reactions를 그대로 사용한다.
Linear `shell-s4`와 `shell-s4-linear-limit`는 같은 input의 서로 다른 검토 역할이며
같은 fresh solve를 재사용할 수 있어도 각 identity/회귀 증거를 생략하지 않는다.
U1/U2/U3는 global length blocking, UR1/UR2/UR3는 fixed-initial global rotation-vector
warning-only이며 같은 step/accepted state·case·dimension·coordinates·impact별 공통 family다.
Nonlinear RF1/RF2/RF3와 physical spatial RM1/RM2는 기존 source-key·finite·inventory 및
error/RMS report를 유지하는 review-only다. RM3/stress는 기존 numerical gate에 넣지 않는다.
Factor-one 내부 force/moment equilibrium은 별도 blocking이고 C7를 따른다.
`shellnl-meshfine-02-s4-final`의 post-closure 역할은 그대로 유지하며 등록 suite의 해당
실행·영향 evidence를 기록한다. 과거 세 case의 closure로 소급 합치지 않는다.
Root가 관찰한 중단 baseline/단독 재현/나머지 pressure tests는 새 binary 전체 suite의
성공 evidence가 아니다. Reference 테스트의 HDF5 cache가 이전 library보다 새롭다는
이유로 옛 solve를 재사용하지 않았는지 확인하고, r2 영향을 받는 final comparison은 새 binary의
fresh solve evidence로 남긴다. Reference input/results를 수정하거나 Hook state를 조작하지 않는다.
<a id="numerical-review-cases--requirement-coverage"></a>
### Requirement coverage
아래 전 행의 접두사는 `FEM-REQ-MITC4-EIGEN-`이고 모두 `must`다.
Mapping은 acceptance intent를 복제하지 않으며 [requirements](requirements.md#requirements)가 원본이다.
| Requirement suffix | 필수 cases |
| --- | --- |
| 001 | MFE-C23, MFE-C25 |
| 002 | MFE-C01, MFE-C08, MFE-C12, MFE-C23, MFE-C26 |
| 003 | MFE-C06, MFE-C07, MFE-C23 |
| 004 | MFE-C01, MFE-C02, MFE-C07 |
| 005 | MFE-C01, MFE-C02, MFE-C03 |
| 006 | MFE-C01, MFE-C03, MFE-C11, MFE-C13 |
| 007 | MFE-C06, MFE-C13, MFE-C27 |
| 008 | MFE-C08, MFE-C13, MFE-C14, MFE-C15, MFE-C16 |
| 009 | MFE-C13, MFE-C17, MFE-C18, MFE-C19, MFE-C22, MFE-C23 |
| 010 | MFE-C17, MFE-C18, MFE-C25, MFE-C27 |
| 011 | MFE-C03, MFE-C16, MFE-C17, MFE-C23, MFE-C25 |
| 012 | MFE-C14, MFE-C19, MFE-C21, MFE-C22, MFE-C24 |
| 013 | MFE-C11, MFE-C16, MFE-C17, MFE-C18, MFE-C21 |
| 014 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05, MFE-C08, MFE-C11, MFE-C20 |
| 015 | MFE-C23, MFE-C25 |
| 016 | MFE-C07, MFE-C21, MFE-C23 |
| 017 | MFE-C24, MFE-C25 |
| 018 | MFE-C06, MFE-C13, MFE-C16, MFE-C24, MFE-C25 |
| 019 | MFE-C21, MFE-C22, MFE-C24 |
| 020 | MFE-C25, MFE-C26 |
| 021 | MFE-C25 |
| 022 | MFE-C25 |
| 023 | MFE-C27 |
| 024 | MFE-C09, MFE-C12, MFE-C26, MFE-C27 |
| 025 | MFE-C27 |
| 026 | MFE-C01, MFE-C02, MFE-C03, MFE-C04, MFE-C05 |
| 027 | MFE-C08, MFE-C09, MFE-C10, MFE-C11, MFE-C12, MFE-C26 |
@@ -1,127 +0,0 @@
# MITC4 FEAST 고유치 reference-model 계약
- Feature ID: `mitc4-shell-feast-eigen`
- Owner: `numerical-review-agent`
- Input contract revision: `r2`
- 검토일: `2026-09-06`
- Artifact·logical comparison readiness: 필요한 입력과 비교값 확인 완료.
- Numerical comparison result: 미실행.
- Stage의 I/O handoff 요청은 [numerical-review](numerical-review.md#numerical-review)의 `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#requirements),
공통 판정은 [TOLERANCE](../TOLERANCE.md)의 `common-reference-tolerance`,
effective date `2026-08-18`, ADR-022를 따른다.
## Case와 원본 artifact
| Role | 지정 경로 | SHA-256 |
| --- | --- | --- |
| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` |
| 외부 reference | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` |
Case identity는 `shellNL-eigen-meshfine`다. 원형상 `729` nodes, `676` S4 elements,
면적 `100`, `t=0.5`, `rho=2700`, `E=2.1e11`, `nu=0.3`인 평판의 외곽 `104`개
절점이 DOF 1~6 모두 고정된다. Interior nodes `625`, 예상 `nf=3750`, `nz=625`,
finite dimension `3125`다. 이 수는 구현의 실제 rank/count 검증을 대신하지 않는다.
유일한 source step은 `Step-2`, 무응력·무하중·무감쇠이며 preload가 없다.
Requested `N=10`의 권위는 `.inp *FREQUENCY` data다. TXT의 행수에서 N을 얻지 않는다.
목적은 동일 입력을 사용하는 derived lumped-mass FEAST 결과의 첫 10개 고유치를 외부
수치값에 대조하는 것이다. Original TXT를 직접 읽으며 CSV 변환, rename, metadata,
provenance, version file 또는 mode-shape reference를 새 readiness 조건으로 추가하지 않는다.
## Quantity와 deterministic identity
| 항목 | Logical 계약 |
| --- | --- |
| Quantity / component | `eigenvalue` / `Value`, `lambda=omega²` |
| 차원 / 좌표계 | `T^-2` / coordinate-invariant scalar 의미; SI 자동 추론 없음 |
| Source row identity | `(case, source step name, modal frame mode id, component)` |
| 현재 expected identity | `case=shellNL-eigen-meshfine`, `step=Step-2`, `mode=1..10`, `component=Value` |
| FESA 대응 | 같은 source step의 검증된 오름차순 eigenvalue rank `1..N`; source mode identity로 대응 |
| Actual analysis mass | Consistent에서 유도한 lumped; backend `MKL FEAST` |
| 판정 영향 | 모든 10개 mode `blocking`; warning-only quantity 없음 |
TXT의 `Frame: Mode i`는 mode-domain frame identity를 준다. TXT에 step 이름이 없는 것은
지정 input에 frequency step이 정확히 하나인 사실로 결정적으로 해소한다. 이 예외를 다중
step이나 step이 모호한 artifact에 일반화하지 않는다. Modal frame id와 임의의 ODB
storage frame index를 같은 정수라고 추정하지 않는다.
공개 의미의 근거는 [연구 S10/S11](research.md#research-evidence--source-inventory)이다.
물리 eigenvalue가 같아도 다른 mode identity는 보존한다. 현재 표시값의 `(2,3)`,
`(7,8)`, `(9,10)` 쌍을 평균·merge하지 않는다. 같은 표시값만으로 exact degeneracy를
추정하거나 mode vector로 행을 재배치하지 않는다. FESA 값 자체를 재정렬해 가까운 TXT
값에 임의 matching하지 않고, 승인된 solver rank와 source mode를 연결한다.
공식 FESA 결과는 input의 lexical sibling `shellNL-eigen-meshfine_results.h5`다.
실제 dataset path, field type, persistent vector 및 comparison-view layout은 I/O owner가
정한다. 이 문서는 HDF5 schema를 대신 선택하지 않는다.
## Tolerance 전 사전검사
1. 지정 두 artifact와 FESA 공식 결과가 존재하며 같은 input/case/source step이다.
FESA 결과의 quantity·unit dimension·backend·actual mass가 위 계약과 맞아야 한다.
2. TXT의 모든 비어 있지 않은 행이 명시적인 `Frame: Mode <id>: Value = <number>`와
기존 `Freq = <number> (cycles/time)` 표기에 맞아야 한다. Malformed 행을 건너뛰지
않는다. Freq는 구조 식별에만 쓰고 Value를 재계산하거나 tolerance 대상으로 쓰지 않는다.
3. Required row identity set이 양쪽 모두 정확히 `1..10`이다. Missing/extra/duplicate,
잘못된 mode label·step·component·quantity/schema는 실패다. 입력 N과 따로 검사한다.
4. 모든 required `Value`가 finite여야 한다. `NaN/Inf`를 누락처럼 무시하거나 0으로
바꾸지 않는다. Required FESA dataset/component 누락도 먼저 실패한다.
5. 유일 identity로 대응한 뒤 increasing mode 순서로 검사·보고한다. TXT 행 순서 변경은
결과를 바꾸지 않으며 duplicate 검사 전에 dictionary overwrite하지 않는다.
## Comparison family와 고정 판정
Family identity는 `(case=shellNL-eigen-meshfine, step=Step-2,
modal-frame=mode i, quantity=eigenvalue, units=T^-2, coordinates=scalar,
impact=blocking)`이며 `i=1..10`이다. **10개의 singleton family**이고 각 component는
`Value` 하나다. 서로 다른 source modal frame을 저장 table이 같다는 이유로 합치지 않는다.
각 family에 공통 정책을 그대로 적용한다. `S=max|r|`, `B=0.01S`,
`e=|f-r|`; `|r|<=B`이면 `e<=B`, 그 외에는 `e/|r|<=0.05`다.
Family relative RMS도 반드시 계산하여 `sqrt(mean(e²))/S<=0.01`을 함께 요구한다.
모든 경계는 inclusive다. 현재 각 reference가 양수인 singleton이므로 RMS는
`e/|r|`이고 **모든 mode의 실효 상대 한계는 1%**다. 이것은 NR가 새로 고른 tighter
tolerance가 아니라 공통 same-frame family와 RMS 규칙의 직접 결과다.
`S=0`이면 대응 FESA도 정확히 0인 경우만 통과한다. 그렇지 않으면
`zero-reference-scale-nonzero-error`를 기록한다. Arbitrary absolute floor,
`max(1,S)`, frequency로 대체한 오차, engineering zero clamp는 허용하지 않는다.
Freq·mode shape·stress·reaction·다른 mass variant를 별도 외부 판정에 추가하지 않는다.
보고서는 input/reference/result identity, prechecks, 각 family/component/row count/S,
원본 r/f/e, 적용 row branch·판정, RMS·판정, blocking failure 및 전체 verdict를 남긴다.
Internal FEAST count/잔차와 외부 singleton reference 판정은 별도 evidence다.
## 검증 coverage와 제한
Comparator의 필수 음성/경계 사례는 missing/extra/duplicate/nonfinite/malformed row,
wrong step/quantity/mass, 행 순서 변경, 같은 Value의 서로 다른 mode,
정확한 1% RMS 경계·그 초과·5% row 경계, zero-scale 양성·음성이다.
Generic policy 테스트에는 near-zero `|r|=B`와 그 양옆도 포함한다.
이 reference singleton의 양수 데이터에 실제 near-zero row가 있다고 주장하지 않는다.
실제 read-only `Get-Content`, `Get-FileHash`, `python -B -` inventory/identity script는
exit `0`: `729/676/104/625` nodes/elements/boundary/interior, 단일 `Step-2`, input N=10,
유일 finite positive Values `10`, 위 두 hash 일치를 확인했다.
명령·검토 evidence는 [수치 상세](numerical-review.md#numerical-review-evidence--실행-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.md#requirements-evidence--필수-회귀-포트폴리오와-identity),
[C26](numerical-review.md#numerical-review-cases) 및
[C7](numerical-review.md#numerical-review-controls--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다.
@@ -1,445 +0,0 @@
# 이전 MFE 요구사항과 결정 근거
MFE 요구사항 ID·승인 근거는 이전 baseline의 이력이다. 현재 MFE2 요구와의 대응을 구분한다.
<a id="requirements"></a>
<a id="requirements--mitc4-shell-mass-matrix와-feast-고유치해석-요구사항"></a>
## MITC4 Shell Mass Matrix와 FEAST 고유치해석 요구사항
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 검토 상태: 사용자 승인 stabilization 개선·정적/eigen 재검증 범위를 반영한 baseline gate 검토 요청.
- 요청 outcome: `pass`; workflow 전이와 최종 gate 판정은 Coordinator 소유.
지역 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)이다.
[프로젝트 지침](../../AGENTS.md), [제품 요구사항](../PRD.md),
[ARCHITECTURE](../ARCHITECTURE.md), [공통 ADR](../ADR.md),
[TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md),
[문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용한다.
Reference 관찰, 원문 경로·hash, 중요한 결정의 대안과 명령 evidence는
[requirements-evidence.md](requirements.md#requirements-evidence)에 둔다.
<a id="requirements--핵심-결과와-범위"></a>
### 핵심 결과와 범위
지정된 reference는 이름에 `shellNL`이 있지만 선행 정적 해석 없이 원형상에서 수행하는
단일 무감쇠 선형 고유진동 해석이다. `Step-2`에서 10개 모드를 요청하고 모든 외곽 절점의
DOF 1~6을 고정한다. 기존 TXT에는 고유치 `Value`와 주파수 `Freq`가 분리되어 있으며
Mode 1~10을 일대일 식별할 수 있다. 파일 형식 때문에 CSV를 새로 만들지 않는다.
사용자 후속 요구로 consistent mass를 먼저 계산하고 이를 이용하여 lumped mass를 계산한 뒤
FEAST 고유치해석에 lumped mass를 사용한다. 이 계산 흐름과 reference baseline이 확정되었다.
나머지는 명시된 사용자 요구, 실제 reference와 기존 승인된 shell 계약에서 도출한다.
- 원형상·무응력 상태의 단일 `*FREQUENCY` procedure, homogeneous essential constraints,
실수 무감쇠 고유치와 이에 대응하는 내부 modal vectors.
- 기존 MITC4의 막·굽힘·횡전단, 단일층 균질 등방성 탄성, centered constant-thickness
section, geometry-derived director, source `S4`/`S4R`와 전역 6 DOF 의미를 재사용한다.
- Numerical drilling stabilization은 사용자 승인에 따라 좌표 공변적으로 개선한다.
영향받는 기존 선형·비선형 정적해석과 새 eigen 해석을 재검증하며 물리 kernel의 변경으로 확대하지 않는다.
- 활성 재료마다 양의 유한한 일정 체적 밀도를 해석 모델에 연결한다. 질량은 병진과
director 접평면의 두 물리 회전 관성을 나타내며 drilling을 물리 관성으로 승격하지 않는다.
- Consistent mass와 그 행렬에서 유도한 lumped mass를 모두 계산·검증한다. Lumping 방식과
좌표/회전 block 처리는 Research/Formulation이 정의하며 두 spectrum의 동일성을 요구하지 않는다.
- FEAST, modal residual·mass normalization·orthogonality와 외부 고유치 비교는 동일한
derived lumped mass를 기준으로 한다. Consistent는 계산 원본과 내부 질량 검증에 유지한다.
- Mode count를 지정하는 최소 입력 subset과 MKL FEAST 실행을 end-to-end로 연결한다.
Reference의 blank frequency bounds·shift·Lanczos control fields를 그대로 처리한다.
- 공식 HDF5에 식별 가능한 고유치 결과를 기록하고 내부 modal correctness 증거를 남긴다.
외부 acceptance는 지정 reference의 고유치만 사용한다.
제외: prestress/선행 nonlinear state 전달, 다중 step, initial stress, geometric stiffness의
새 의미, 재료비선형, 감쇠·복소 고유치, 좌굴, 강제진동·시간적분, acoustic coupling,
혼합 beam/solid/shell 모델, concentrated/nonstructural mass, composite/offset/variable
thickness, 기존 미지원 shell geometry, residual modes 및 modal stress/reaction recovery.
사용자가 지정하지 않은 Lanczos/AMS 대체 backend, reference 생성·수정·복원과 외부 배포도 제외한다.
별도 frequency interval/shift 사용자 기능은 현재 최소 subset에 포함하지 않는다.
<a id="requirements--의미단위소유권"></a>
### 의미·단위·소유권
| 항목 | 요구되는 의미와 경계 |
| --- | --- |
| 질량 입력 | `rho`: mass/length³; `t`: length. 단위계는 사용자 일관 단위이며 SI 추론·자동 변환 없음 |
| 질량/관성 | 병진 질량 차원 mass, 회전 관성 mass·length²; 혼합 DOF block의 차원은 Formulation이 명시 |
| 고유치 | `lambda = omega²`, 차원 1/time²; 좌표계에 불변인 scalar, cycle frequency와 별개 |
| 주파수 | `f = sqrt(lambda)/(2*pi)`, cycles/time; 양의 고유치에서 의미 확인용 파생량이며 외부 비교 대체량 아님 |
| 모드 | Scalar mode identity와 global DOF/modal vector identity 분리; 진폭은 응답변위가 아닌 normalization convention |
| 모델과 equation | Domain은 density·section·step 정의, AnalysisModel은 non-owning view, DofManager는 DOF·equation·pattern 소유 |
| procedure/backend | Eigen procedure는 자체 state·solve·검증·commit 소유; FEAST vendor 타입과 자원은 private adapter 소유 |
| 결과 | Results는 물리량·identity, I/O Definition은 additive HDF5 schema·modal evidence projection과 진단 소유 |
요구사항은 stiffness/질량 조립식, massless drilling 처리식, FEAST 탐색 구간·subspace 및
solver parameter를 선결정하지 않는다. 특히 기존 선형 정적 `Run()`에 eigen 분기를 누적하거나
정적 reaction 의미를 modal 결과로 재사용해서는 안 된다.
<a id="requirements--requirement-verification-matrix"></a>
### Requirement Verification Matrix
모든 행은 `must`이고 acceptance는 해당 행의 요구와 검증 조건을 모두 만족하는 것이다.
출처 `U`는 [Feature PRD](PRD.md)의 사용자 요구, `R`은 [관찰 evidence](requirements.md#requirements-evidence),
`P`는 위 공통 기준, `L`은 [기존 MITC4 요구사항](../linear-static-mitc4-shell/requirements.md)과
[정식화](../linear-static-mitc4-shell/formulation.md), `N`은
[기존 nonlinear I/O](../nonlinear-static-newton-raphson/io.md)의 공통 경로·failure 계약을 뜻한다.
`NR`은 Numerical Review를 뜻하며 numerical threshold/metric/family 결정은 NR 소유이다.
아래에서 “승인 기준”은 구현 전에 해당 owner가 명시해 gate를 통과해야 하며 실행 결과로 조정하지 않는다.
| Requirement ID | Shall statement | 측정 가능한 acceptance / verification method | 출처·후속 owner |
| --- | --- | --- | --- |
| FEM-REQ-MITC4-EIGEN-001 | 솔버는 선행 상태 없는 원형상 무응력 모델의 단일 무감쇠 선형 고유진동 procedure를 실행해야 한다. | 지정 reference가 한 frequency step으로 선택되고 static/nonlinear preload 경로를 호출하지 않음; procedure 통합 테스트 | U, R, P; Formulation, I/O |
| FEM-REQ-MITC4-EIGEN-002 | `S4`와 `S4R`는 기존 FESA MITC4 물리 kernel·director·전역 6 DOF 의미를 유지하고 numerical stabilization만 Requirement 027에 따라 개선해야 한다. | Physical contribution·mapping·recovery 의미 보존, source type만 다른 모델은 같은 mass·개선된 stiffness/eigen 경로와 별도 source metadata; 개선 전 전체 K의 수치 동일성을 요구하지 않음 | U r2, L; Formulation, I/O |
| FEM-REQ-MITC4-EIGEN-003 | 모든 활성 shell의 밀도는 해당 section이 참조하는 material에서 하나의 finite `rho > 0`로 결정되어야 한다. | 여러 material의 올바른 연결 및 missing/duplicate/unresolved/nonpositive/nonfinite/dependent density 거부; semantic 양성·음성 테스트 | U, R, P; I/O |
| FEM-REQ-MITC4-EIGEN-004 | 질량 계산은 기존 shell의 유효한 geometry·director와 양의 centered constant thickness를 사용해야 한다. | 기존 geometry/material/section 검증 재사용과 서로 다른 두께·밀도 연결 테스트; 부적합 요소를 질량 zero로 우회하지 않음 | L, P; Formulation, I/O |
| FEM-REQ-MITC4-EIGEN-005 | 솔버는 MITC4 보간에 일관된 consistent mass를 계산하고 derived lumped mass 계산의 원본으로 제공해야 한다. | 독립 consistent mass/kinetic-energy oracle와 일치하고 같은 geometry/material/section의 consistent 결과가 Requirement 026의 입력임을 확인; 원본을 lumping으로 덮어쓰지 않음 | U r1, P; Research, Formulation, NR |
| FEM-REQ-MITC4-EIGEN-006 | 질량은 3개 병진 및 2개 director-tangent 회전의 물리 관성을 포함하고 numerical drilling에 물리 관성을 부여하지 않아야 한다. | Rigid translation의 총질량, 회전 관성·kinetic energy, director-parallel null action을 독립 검사; NR의 scale-aware 기준 | L, P; Research, Formulation, NR |
| FEM-REQ-MITC4-EIGEN-007 | 질량·강성은 동일한 physical DOF와 constraint 의미로 결정적으로 조립되어야 한다. | Scatter/source order, 대칭 구조, sequential/병렬 reduction 및 constrained motion 검증; 행렬 및 재실행 테스트 | P, L; Formulation, Planning |
| FEM-REQ-MITC4-EIGEN-008 | Massless numerical 좌표 처리는 개선된 stabilization과 lumped mass에 실제 global BC를 적용한 원 pencil의 유한 spectrum을 보존하며 FEAST admissibility를 만족해야 한다. | 지원 partial BC를 포함해 축소 전후 spectrum·constraint·원 free DOF residual 검증; 개선 전 K와의 spectrum 동일성 또는 consistent→lumped 동일성을 요구하지 않음. 인공 mass·임의 cutoff·clamp 금지 | U r2, P, L; Research, Formulation, NR |
| FEM-REQ-MITC4-EIGEN-009 | Mode-count 요청은 물리 spectrum의 낮은 순서에서 지정 개수의 고유쌍을 계산해야 한다. | Reference는 10개; 작은 독립 spectrum에서 첫 N개·multiplicity·zero rigid-mode case·요청수 초과/빈 물리계의 명시적 실패 확인. 부적합 음수 spectrum을 양수화하지 않음 | U, R; Formulation, NR, I/O |
| FEM-REQ-MITC4-EIGEN-010 | 고유치 결과는 오름차순의 고유한 mode identity를 가지고 반복 고유값의 multiplicity를 보존해야 한다. | Repeated/clustered spectrum에서 row 수·순위·identity 및 재현성 확인; 같은 eigenvalue 값은 duplicate identity 오류가 아님 | R, P; NR, I/O |
| FEM-REQ-MITC4-EIGEN-011 | 실제 고유치 계산은 consistent mass에서 유도한 lumped mass를 MKL FEAST에 사용해야 한다. | Consistent→lumped→FEAST 연결과 real adapter의 질량 입력·backend identity 확인; source Lanczos가 backend를 변경하지 않고 consistent나 다른 질량으로 reference에 맞추지 않음 | U r1; Research, Formulation, Planning |
| FEM-REQ-MITC4-EIGEN-012 | FEAST 실패·미수렴·불충분 모드·비유한 eigenpair를 성공 결과로 반영해서는 안 된다. | 각 failure injection에서 안정된 diagnostic과 불완전 result 미공개 확인; bounded termination 테스트 | P; Formulation, I/O, Planning |
| FEM-REQ-MITC4-EIGEN-013 | 성공 eigenpair는 FEAST에서 사용한 동일 lumped mass로 modal residual·mass normalization·orthogonality 검증을 통과해야 한다. | 내부 modal vectors로 독립 residual/Gram 검사를 수행하고 잘못된 mass variant·eigenvector·mode pairing을 검출; NR가 threshold·scale 고정 | U r1, P, R; Formulation, NR, Physics |
| FEM-REQ-MITC4-EIGEN-014 | 두 질량과 개선된 stabilized eigen 해석은 symmetry, kinetic-energy, coordinate invariance, rigid-body 및 density scaling 검증을 통과해야 한다. | 독립 mass oracle·invariants 및 동일 물리 BC를 보존하는 지원 partial-rotation 사례에서 재계산한 complete K와 eigen spectrum의 좌표 검증 필수. NR-MFE-001 반례를 필수 통과 사례로 포함하며 full-free/full-clamp만으로 대체하지 않음; density scaling 및 각 mass 고유 energy oracle 유지; NR가 기준 고정 | U r2, P, L; Research, Formulation, NR, Physics |
| FEM-REQ-MITC4-EIGEN-015 | 지정 `.inp`의 `*FREQUENCY` 요청과 부수 옵션은 보존된 입력에서 명시적으로 mapping되어야 한다. | 원본 파일 변경 없이 실행; requested count와 mass normalization 유지; Lanczos/SIM 옵션의 FESA 처리 및 acoustic-free 모델에서 `ACOUSTIC COUPLING=ON`의 무해성/진단을 I/O에 명시 | U, R, P; Research, I/O |
| FEM-REQ-MITC4-EIGEN-016 | 승인 subset 밖의 모델·절차·옵션은 의미를 삭제하거나 근사해 실행하지 않고 진단해야 한다. | Exclusion inventory의 양성/음성 테스트; acoustic 요소, preload, damping, 비영 prescribed base state, 미지원 frequency fields 등의 silent no-op 없음 | P, R; I/O, Planning |
| FEM-REQ-MITC4-EIGEN-017 | 공식 HDF5는 source step·mode identity와 고유치의 물리량·단위·실제 backend·사용 질량 variant를 식별할 수 있어야 한다. | 입력 sibling `<stem>_results.h5`에서 10개 reference 대응 고유치와 선택 질량을 복원; additive schema/self-check 테스트. Mode-vector 영속 projection 필요성·layout은 I/O 소유 | U, P, N; I/O |
| FEM-REQ-MITC4-EIGEN-018 | 내부 modal vectors는 global physical DOF·source identity와 연결되고 외부 mode-shape acceptance로 사용되지 않아야 한다. | Constraint 복원·source renumbering·mass normalization과 내부 verification evidence 재현; 비교기가 vector reference 파일을 요구하지 않음 | U, P; Formulation, NR, I/O |
| FEM-REQ-MITC4-EIGEN-019 | State와 final HDF5는 검증된 candidate만 반영하고 제어된 실패에서 기존 유효 결과를 보존해야 한다. | Solve·validation·writer/finalization 실패 후 이전 state/final hash 보존; live log는 기존 `<stem>_log.txt` 독립 lifecycle 유지 | P, N; Formulation, I/O, Planning |
| FEM-REQ-MITC4-EIGEN-020 | 새 eigen 외부 검증은 지정 원본 TXT의 `Value`만 derived lumped mass로 계산한 FESA HDF5 고유치와 비교해야 한다. | 같은 지정 `.inp`·TXT, Mode 1~10 포함; mass variant 사후 선택 금지. Eigen `Freq`·변위·회전·stress·reaction·mode shape 외부 gate를 추가하지 않음. 승인된 기존 static 회귀는 별도 Requirement 024의 기존 계약 사용 | U r1/r2, R; NR, I/O |
| FEM-REQ-MITC4-EIGEN-021 | 비교기는 required identity의 missing/extra/duplicate/nonfinite와 quantity/schema 오류를 tolerance 전에 거부해야 한다. | 행 재정렬은 같은 mapping, mode label 중복·누락·추가·비유한 `Value`는 실패; 같은 값의 다른 mode는 허용; comparator 음성 테스트 | P, R; NR, I/O, Planning |
| FEM-REQ-MITC4-EIGEN-022 | 외부 고유치 acceptance는 공통 `docs/TOLERANCE.md`의 scale·row·RMS·zero-scale 정책을 적용해야 한다. | NR가 mode/frame identity·family·blocking 분류를 고정하고 승인된 모든 고유치 비교 통과; frequency로 대체하거나 tolerance를 조정하지 않음 | U, P; NR, I/O |
| FEM-REQ-MITC4-EIGEN-023 | 새로운 동작은 관찰된 RED 이후 구현하고 MSVC x64 Debug CMake/CTest에서 검증해야 한다. | 대응 C++ tests, RED/GREEN/focused/full evidence, 새 warning 없음, 실제 FEAST runtime/reference evidence. 사용자 지정 `FESA_GTEST_SOURCE_DIR=C:\git\googletest`를 검증 환경에 사용 | U r1, P; Planning, Implementation |
| FEM-REQ-MITC4-EIGEN-024 | 기존 선형·비선형 정적해석은 승인된 stabilization 개선 외의 입력·출력·물리 의미를 보존하고 영향받는 correctness·reference 회귀를 통과해야 한다. | 상세 evidence의 필수 static portfolio와 기존 comparison identity·판정 정책을 유지해 새 evidence 생성; tangent/선형극한/평형·reaction/energy/state 검증. 개선 전 결과의 bitwise equality를 요구하지 않고 density 없는 기존 정적 모델도 유지 | U r2, P, L, N; Formulation, NR, Planning, Implementation, Physics |
| FEM-REQ-MITC4-EIGEN-025 | 완료 판정은 동일 revision의 implementation·독립 physics·release evidence를 요구해야 한다. | Requirement 전 행에 evidence 연결, 필수 미실행/실패/stale 항목 0, 내부 readiness와 외부 release 권한 구분 | U, P; Coordinator, Physics, Release |
| FEM-REQ-MITC4-EIGEN-026 | 솔버는 계산된 consistent mass에서 lumped mass를 유도하고 승인된 질량·관성 보존 계약을 검증해야 한다. | 유도 관계·독립 lumping oracle·총 병진 질량 보존, 차원/대칭성/물리 kinetic-energy 비음성, 물리 회전 관성과 drilling nullspace 의미 검사. Lumping 수식·좌표 block 처리·정확한 관성 불변식과 threshold는 Formulation/NR가 고정 | U r1, P, L; Research, Formulation, NR |
| FEM-REQ-MITC4-EIGEN-027 | 개선된 numerical drilling stabilization은 같은 물리 모델의 좌표·접평면 기저 선택에 공변적이고 기존 비물리 역할을 유지해야 한다. | 독립 재계산한 stabilization/complete K의 congruence, finite·대칭·양의 numerical stabilization, 물리 rigid modes 보존, physical recovery 제외 및 결정론 검증. Partial BC의 NR-MFE-001과 대응 정적 response를 필수 통과시키며 기존 static의 동일 scale 사용 경로도 정합 검증; 수식·threshold는 Formulation/NR 소유 | U r2, L; Research, Formulation, NR, Planning, Physics |
<a id="requirements--r2의-기존-계약-대체-범위"></a>
### r2의 기존 계약 대체 범위
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)의 승인으로
기존 `FESA-REQ-LSMITC4-034`의 basis-dependent `min(R+)` scale 선정과 `056` 중 그
옛 공식 자체를 검증하도록 한 부분을 본 feature의 `027` 및 후속 개선 수식으로 대체한다.
같은 scale을 사용하는 [nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)도
그 scale 선정 부분의 영향 대상이다. Nonlinear objective drilling 좌표·potential의 의미,
초기 reference에서 scale을 고정하는 lifecycle 및 일관 residual/Hessian 계약은 유지한다.
물리 strain/material/section/director, 양의 비물리 stabilization, physical recovery 제외,
기존 지원 BC·source identity·output 의미는 대체하지 않는다. 기존 feature 문서는 읽기 전용
이력으로 보존하며 상세 대체 수식과 검증 trace를 이 feature의 후속 owner가 작성한다.
필수 static 회귀의 기존 case·identity·policy는
[requirements evidence의 r2 재검증 범위](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)를 따른다.
새 eigen reference의 Value-only를 기존 정적 reference 요구의 삭제로 해석하거나,
정적 U/UR 회귀를 eigen mode-shape 비교로 확대하지 않는다.
<a id="requirements--결정과-handoff"></a>
### 결정과 handoff
`MFE-OQ-001`은 사용자 후속 결정으로 해결되었다. Consistent를 계산하고 이로부터 lumped를
계산하므로 두 계산은 모두 필수다. 기존 양자택일 요구는 대체되었다.
`MFE-OQ-002`도 사용자 명시 결정으로 해결되었다. **Consistent→lumped→FEAST** 흐름을
사용하며 external eigenvalue baseline과 내부 residual·normalization·orthogonality는
동일 lumped mass에 대응한다. [사용자 결정 근거](requirements.md#requirements-evidence--중요한-결정)를 따른다.
질량·backend·mode count 선택은 해결되었으며 다시 질문하지 않는다.
`MFE-OQ-003`은 사용자 명시 승인으로 해결되었다. 좌표 공변적인 stabilization 개선과
영향받는 기존 정적/eigen 재검증을 r2에 포함하며 partial BC 지원·invariance acceptance를
축소하지 않는다. [기존 반례·판단 이력과 승인 delta](requirements.md#requirements-evidence--nr-mfe-001-requirements-intent-검토)를
보존한다. 현재 요구사항의 중요한 미결정은 없고 NR 반례의 실제 해소·새 수치 통과는 아직 미검증이다.
Research/Formulation은 consistent→lumped 유도 및 각 관성 불변식, lumped 질량과 massless drilling, supported global
constraints의 양립, 실제 FEAST admissibility와 낮은 모드 추출의 완전성을 다룬다.
Stabilization의 좌표 공변성과 static scale 사용 경로를 정합시키고 개선된 pencil에서 기존
massless reduction 증명이 유지되는지 재검토한다. 이전 decoupling 증명을 그대로 승인으로 재사용하지 않는다.
NR는 independent physics portfolio와 모든 수치 기준, TXT readiness, mode/frame/family mapping을
확정한다. 특히 각 mode가 별도 Abaqus frame인 사실을 공통 family 규칙과 함께 검토한다.
I/O는 필요한 최소 syntax, no-op/diagnostic, source/result identity와 additive output을 정의한다.
기존 영속 계약의 비호환 변경이나 새로운 물리 근사가 필요한 경우만 다시 critical로 반환한다.
사용자는 작업 중 Git 커밋을 승인했다. Root가 사용자 수정 `AGENTS.md`와 완료 문서 checkpoint를,
Harness Executor가 기존 계약에 따라 구현·phase 커밋을 소유하며 이 specialist는 커밋하지 않는다.
이번 산출물은 문서 요구사항과 read-only evidence 조사이다. 구현·CMake·CTest·Harness·외부
solver·수치 reference comparison은 수행하지 않았으며 통과로 보고하지 않는다.
<a id="requirements-evidence"></a>
<a id="requirements-evidence--mitc4-eigen-요구사항의-관찰-evidence와-결정"></a>
## MITC4 eigen 요구사항의 관찰 evidence와 결정
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [requirements.md](requirements.md#requirements)
- 관찰일: `2026-09-06`
<a id="requirements-evidence--원본-reference-관찰"></a>
### 원본 reference 관찰
| Artifact | 실제 경로 | SHA-256 |
| --- | --- | --- |
| Input | [shellNL-eigen-meshfine.inp](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp) | `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339` |
| Eigenvalues | [shellNL-eigen-meshfine eigenvalues.txt](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt) | `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b` |
| 관찰 항목 | 파일에서 읽은 사실 |
| --- | --- |
| 모델 | `Part-1`, identity instance `Part-1-1`; 729 nodes, 676 `S4` elements |
| 좌표 | x/y 각각 `[-5,5]`, 모든 z=`0`; 26×26 element mesh의 사각 평판 |
| Section | line 1421 `*Shell Section, elset=Set-1, material=Material-1`; data `0.5, 5`; offset/composite 없음 |
| Material | lines 1455~1459: `Material-1`, `*Density`=`2700.`, `*Elastic`=`2.1e+11, 0.3` |
| Constraint | lines 1464~1470: `Set-2`의 DOF 1~6, 값 생략으로 homogeneous constraint |
| Procedure | lines 1475~1477: 유일한 `*Step, name=Step-2, nlgeom=NO, perturbation`; `*Frequency, eigensolver=Lanczos, sim, acoustic coupling=on, normalization=mass`; `10, , , , ,` |
| 선행 이력 | 이전 Step/Static/Initial Conditions/load 없음; 이름 `shellNL`이나 `Step-2`로 preload를 추론하지 않음 |
| 부수 요청 | `*Restart, write, frequency=0`, field/Node PRESELECT, history/Energy ALL. 모델은 acoustic element/coupling constraint를 포함하지 않음 |
| TXT | 10개 row; 각 row에 `Frame: Mode <id>: Value = <lambda> Freq = <f> (cycles/time)` |
| Identity | mode IDs는 정확히 1~10, 유일하며 누락 없음; 모든 Value/Freq finite·positive |
| 반복값 | modes `(2,3)`, `(7,8)`, `(9,10)`의 표시 Value가 각각 같음; mode identity 중복과 구분 필요 |
관찰 Value 목록은 다음과 같다. 원본 표시 정밀도를 확장·보정하지 않는다.
| Mode | Value |
| --- | ---: |
| 1 | 2.19507E+05 |
| 2 | 8.85523E+05 |
| 3 | 8.85523E+05 |
| 4 | 1.85534E+06 |
| 5 | 2.74023E+06 |
| 6 | 2.77515E+06 |
| 7 | 4.14941E+06 |
| 8 | 4.14941E+06 |
| 9 | 6.73379E+06 |
| 10 | 6.73379E+06 |
관찰값으로 `sqrt(Value)/(2*pi)`와 표시 `Freq`를 계산상 대조한 최대 상대차는
`1.6946487122851045e-05`이다. 이것은 quantity 식별을 돕는 교차 확인이며 FESA comparison이나
새 허용오차 판정이 아니다. `Value`는 `omega²`, `Freq`는 cycles/time이라는 공개 정의와
일관된다. 단위계는 원문에 지정되지 않았고 수치만 보고 SI라고 단정하지 않는다.
TXT에는 step 이름이 별도로 없지만 입력은 정확히 한 개 frequency step이며 mode identity와
Value가 완전하다. 따라서 지정 input의 유일한 `Step-2`에 결합하는 deterministic projection은
가능하다. 최종 readiness와 frame/family mapping은 NR·I/O가 소유한다. CSV가 없다는 이유로
reference를 변환하거나 새 metadata/provenance를 요구할 근거는 없다. 사용자 지정 경로를
우선하는 feature-specific artifact 선택이며 공통 reference 문서나 다른 feature 계약은 바꾸지 않는다.
<a id="requirements-evidence--중요한-결정"></a>
### 중요한 결정
<a id="requirements-evidence--mfe-oq-001--두-질량-계산-관계-해결"></a>
#### MFE-OQ-001 — 두 질량 계산 관계: 해결
사용자는 `2026-09-06` 후속 답변에서 “mass matrix는 consistent mass를 계산하고 이를
이용해서 lumped mass를 계산합니다.”라고 명시했다. Consistent 원본 계산과 derived lumped
계산이 모두 필수이며 이전 둘 중 하나의 계산만 선택하는 초안은 대체되었다.
관련 결정은 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화), 요구사항은
`FEM-REQ-MITC4-EIGEN-005`, `026`이다. Lumping 알고리즘은 사용자 지정이 없으므로
Research/Formulation이 질량 보존·물리 회전 관성·좌표 변환·drilling 경계를 명시하고 NR가 검토한다.
모든 속도장의 kinetic energy나 두 spectrum의 exact equality를 보존 조건으로 추가하지 않는다.
<a id="requirements-evidence--mfe-oq-002--feast와-reference-baseline의-질량-해결"></a>
#### MFE-OQ-002 — FEAST와 reference baseline의 질량: 해결
- 상태: **사용자 명시 결정으로 해결**.
- 관련 요구사항: `FEM-REQ-MITC4-EIGEN-008`, `011`, `013`, `017`, `020`.
NR가 검증; Requirement Agent가 본 r1 baseline에 반영.
사용자는 추가 답변에서 “고유치 해석에서는 lumped mass를 사용합니다. 따라서 고유치 해석을
할 때 consistent mass -> lumped mass -> 고유치 해석 입니다”라고 명시했다.
따라서 FEAST와 authoritative reference baseline은 derived lumped mass를 사용하며
동일 lumped mass로 residual·mass normalization·orthogonality를 검증한다.
Consistent는 유도 원본과 내부 mass/energy 검증에 유지한다. Consistent eigen 해석,
두 variant의 외부 비교 및 runtime 질량 선택 API는 현재 요구가 아니다.
이 결정은 수치 tolerance 통과나 정확도 우위의 evidence를 대신하지 않는다.
Drilling은 기존 승인 shell 계약에서 비물리 안정화 좌표이다. 인공 drilling inertia를
추가하거나 두 물리 회전 관성을 생략하는 대안을 새 사용자 옵션으로 발명하지 않는다.
Massless drilling을 그대로 generalized FEAST에 넣을 수 있다는 가정도 하지 않는다.
FEAST의 SPD 조건과 shell 질량 nullspace의 양립은 Research/Formulation이 물리 spectrum과
constraints를 보존하는 방식으로 해결해야 한다. 이 문서는 elimination/projection/condensation
식을 승인하지 않으며, 새로운 물리 근사가 필수라는 evidence가 생기면 해당 owner가 반환한다.
<a id="requirements-evidence--nr-mfe-001-requirements-intent-검토"></a>
### NR-MFE-001 requirements intent 검토
이 절의 반례와 승인 전 판단은 **r1 이력**이다. 사용자 승인으로 개선 범위를 확정한 현재
r2 계약은 아래 [r2 승인 범위와 정적 재검증](requirements.md#requirements)을 따른다.
- Input contract revision: `r1` 유지. 이번 bounded 검토는 기존 `002/008/014`의 정합만 다룬다.
- 발견 근거: [Numerical Review](numerical-review.md#numerical-review--blocking-finding),
[NR 소유 직접 계산 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례),
[Formulation V5](formulation.md#formulation-verification--v5-rigid-mode-coordinate-및-density-불변식).
- 결과: `needs-user-decision`. Requirement owner가 새 수식을 유도하거나 NR 계산을 재실행하지 않았다.
NR는 유효한 단일 평판의 한 절점 `URZ`만 free인 모델에서 global Z축 45° 회전이
동일 물리 component BC를 유지함을 확인했다. 기존 `kd` 규칙으로 고유치가
`23.04088888888889`에서 `23.040628726287263`으로 달라지고 상대 차이가
`1.1291343961675893e-5`다. 이는 NR의 독립 계산 evidence이며 새로운 mass/reduction의
확인된 결함이나 이번 Requirement Agent의 runtime 검증 결과가 아니다.
`014`의 원래 문구는 coordinate-invariance evidence를 필수로 두고 acceptance에
독립 invariant suite 통과를 요구한다. 유한한 test portfolio를 NR에 위임한 것은 모든
가능한 모델의 exact equality를 증명하라는 뜻은 아니지만, 알려진 지원 모델의 반례를
검증 범위 밖으로 재분류할 권한도 아니다. Full-free/full-clamp 사례로만 범위를 고정한 V5는
이 반례를 해소하지 못하므로 기존 의도의 단순 clarification으로 통과시킬 수 없다.
`002`의 물리 kernel 재사용 문구 하나만 보면 numerical stabilization 수정까지 직접
명시하지 않지만, 문서가 함께 재사용하는 [기존 shell 요구사항](../linear-static-mitc4-shell/requirements.md)의
`FESA-REQ-LSMITC4-034/056`은 고정 `kd` 규칙을 정한다. `008`은 실제 제약을 적용한
원래 pencil의 유한 spectrum 보존을 요구하므로 massless 처리에서 남는 stabilization을
제거해 이 반례를 없애는 해석도 허용하지 않는다. 고정된 tensor의 기저 변환과 geometry를
회전시켜 `kd`를 다시 계산하는 서로 다른 연산을 같은 검증으로 취급해서는 안 된다.
<a id="requirements-evidence--mfe-oq-003--r1에서-검토한-대안과-영향"></a>
#### MFE-OQ-003 — r1에서 검토한 대안과 영향
| 대안 | 정확한 영향과 승인 뒤 필요한 작업 |
| --- | --- |
| 기존 stabilization 유지 및 한계 수용 | Partial rotation BC 지원과 원래 pencil을 유지한다. 해당 BC에서 stabilization이 유한 공간에 남는 경우의 일반 eigen 좌표 불변성을 현재 feature acceptance에서 보장하지 않도록 `014` 적용 범위를 명시적으로 변경한다. 두 질량·physical stiffness의 좌표 검증, 모든 지원 BC의 원래 pencil 보존·modal residual 등은 계속 필수이며 NR 반례를 알려진 한계로 보존한다. 이는 acceptance 변경이고 아직 승인되지 않았다 |
| 좌표 공변적인 stabilization 개선 — 권고 | 동일 물리 모델의 좌표축 선택에 따른 고유치 변화를 해결하는 강성 개선을 작업 범위에 추가한다. 기존 fixed `kd`와 충돌하는 계약의 owner·승인 경계를 정하고 Research/Formulation/NR를 재검토한다. 영향받는 기존 정적 결과와 새 eigen 결과를 재검증한다. 특정 대체 계수나 수식은 이 요구사항 검토에서 선택하지 않는다 |
권고 이유는 좌표 선택만으로 같은 물리 모델의 고유치가 달라지는 알려진 결함을 유지하지
않기 위해서다. 대가는 기존 stiffness 계약의 영향 조사와 정식화·회귀 검증 범위 증가다.
반례의 수치가 작다는 이유로 외부 reference tolerance를 적용하거나 일반 오차 상한으로
사용하지 않는다. 이 한 건 외에 질량 흐름·FEAST 사용 질량·입력 N을 재질문하지 않는다.
두 대안은 같은 반례를 acceptance에서 다르게 처리하며, 기술 evidence만으로 사용자가
어느 변경 범위를 승인했는지 결정할 수 없다. 승인 전 `002/008/014` 원문, 기존 stiffness,
partial BC 지원, NR 판정 영향, 모든 tolerance·reference·schema를 변경하지 않았다.
Coordinator가 결정과 revision을 관리하고 영향받은 owner에게 후속 작업을 할당한다.
이 작업은 implementation correction이 아니며 correction budget을 사용하지 않는다.
<a id="requirements-evidence--r2-승인-범위와-정적-재검증"></a>
### r2 승인 범위와 정적 재검증
사용자 답변 “네 개선과 영향받는 기존 정적해석과 고유치해석의 재검증까지 범위에
포함해주세요.”로 `MFE-OQ-003`의 개선안이 승인되었다.
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)이
승인·revision 근거이며, 한계 수용/acceptance 축소안은 선택되지 않았다.
변경 intent는 `002` 물리 kernel 보존과 numerical stabilization 개선 분리,
`008` 개선된 constrained pencil의 유한 spectrum 보존,
`014` 지원 partial BC를 포함하는 필수 invariant 통과,
`024` 영향받은 정적 correctness/reference 재검증, 신규 `027` 좌표 공변적인 stabilization이다.
`020`은 eigen Value-only와 기존 static 회귀의 서로 다른 비교량을 명확히 구분한다.
기존 고정 scale과 직접 충돌하는 부분만 대체하며 수식·수치 기준·schema를 이 문서에서 정하지 않는다.
기존 [linear shell 요구사항](../linear-static-mitc4-shell/requirements.md)의
`034` scale 선정과 `056`의 해당 공식 검증을 대체하고, 나머지 physical/nonphysical 경계를
유지한다. [Nonlinear formulation §10.3](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential)도
같은 initial physical tangent diagonal minimum을 사용하므로 영향받는 기존 static 경로다.
새 scale과 기존 nonlinear objective potential·일관 tangent·초기 고정 lifecycle의 정합을
Formulation/NR가 확인해야 한다. 이 발견은 nonlinear material/procedure 범위 확대가 아니다.
<a id="requirements-evidence--필수-회귀-포트폴리오와-identity"></a>
#### 필수 회귀 포트폴리오와 identity
| 구분 | 필수 재검증과 기존 evidence 계약 |
| --- | --- |
| Element 및 linear static correctness | 기존 [build-test](../linear-static-mitc4-shell/verification.md#build-test)와 [physics](../linear-static-mitc4-shell/verification.md#physics-evaluation)의 kernel/patch/rigid-mode/physical recovery·정적 partition/full residual·reaction·energy·source mapping을 재검증한다. 추가로 NR-MFE-001의 동일 물리 partial BC에서 complete K와 대응 정적 response를 좌표 변환해 검증한다. Loads/BC를 함께 물리적으로 변환하고 지원되지 않는 MPC 입력을 만들지 않는다 |
| 기존 linear S4 external regression | [reference-model](../linear-static-mitc4-shell/reference-model.md), [comparison의 common-policy 재검증](../linear-static-mitc4-shell/verification.md#reference-comparison--2026-08-18-common-policy-revalidation), 현행 [nonlinear I/O의 공통 경로·linear control](../nonlinear-static-newton-raphson/io.md)을 적용한다. 원본 `reference/shell/shell.inp` + `reference/shell/shell displacements.csv`; stable source instance/node/component 및 해당 static step/frame. U1/U2/U3 blocking, UR1/UR2/UR3 warning-only를 유지한다 |
| 기존 nonlinear correctness | [FESA-REQ-NSNR-030](../nonlinear-static-newton-raphson/requirements.md), [formulation](../nonlinear-static-newton-raphson/formulation.md), [physics](../nonlinear-static-newton-raphson/verification.md#physics-evaluation)의 선형극한·tangent consistency·objectivity·factor-one 전역 force/moment balance·free residual·commit/rollback을 새 scale로 재검증한다. 기존 Newton/convergence·하중·reaction 의미는 유지한다 |
| 기존 nonlinear external regression | [현행 reference-model](../nonlinear-static-newton-raphson/reference-model.md)과 [기존 comparison](../nonlinear-static-newton-raphson/verification.md#reference-comparison)의 closure case `shellnl-s4-final`, `shellnl-meshfine-s4-final`, `shell-s4-linear-limit`를 재검증한다. 각각 `reference/shellNL/shellNL.inp`, `reference/shellNL-meshfine/shellNL-meshfine.inp`, 위 linear input 및 같은 폴더의 기존 `<stem> displacements.csv`를 사용한다. Nonlinear은 source instance/node/component와 factor-one accepted state, linear은 자기 static state identity를 유지한다 |
| 새 eigen 검증 | 개선된 K와 derived lumped M에서 `008/013/014/027` 내부 검증 및 NR-MFE-001 해소를 필수 확인한다. 기존 지정 eigen input/TXT의 모든 요청 mode Value만 비교하며 static U/UR 데이터를 eigen reference로 사용하지 않는다 |
Nonlinear 외부 회귀도 U blocking/UR warning-only이고, 기존 coarse/fine의
`shellNL reactions.csv`·`shellNL-meshfine reactions.csv`에서 local RF1/RF2/RF3와
physical spatial RM1/RM2는 source-key/finite/inventory/error 보고를 유지하는 review-only다.
RM3와 stress를 새 numerical gate로 추가하지 않는다. Internal equilibrium acceptance와
local distribution 검토를 구분한다. 모든 외부 수치 판정은 `docs/TOLERANCE.md`를 그대로 사용한다.
현행 nonlinear reference-model에는 `shellnl-meshfine-02-s4-final`도 별도 post-closure
verification으로 기록되어 있다. 이를 과거 세 case closure의 통과 evidence로 소급하지
않는다. 기존 등록 회귀 suite에서의 실행·영향은 Planning이 기록하고 별도 case의 기존
판정 역할을 유지한다. 과거 HDF5 schema/파일명/고정 absolute tolerance의 이력보다 현행
공통 output 경로와 `TOLERANCE.md`, 각 feature의 최신 identity 계약이 우선한다.
개선 전 숫자와의 bitwise equality는 요구하지 않는다. 위 approved physics·reference
기준과 개선된 formulation을 기대값으로 검증하며 오래된 실패를 baseline으로 재생성하여
정당화하지 않는다. 원본 reference와 과거 보고서는 보존하고 새 r2 실행 evidence를 기록한다.
전체 configured MSVC/x64/Debug suite, 새 warning 없음, TDD와 failure preservation도 필수다.
현재 중요한 미결정은 없으며 연구·정식화·NR·구현의 후속 gate는 아직 통과하지 않았다.
<a id="requirements-evidence--질문-없이-정리한-사항"></a>
### 질문 없이 정리한 사항
- 무하중 원형상·비감쇠 해석은 실제 단일 `*FREQUENCY`와 선행 이력 부재로 결정한다.
- `.inp`의 Lanczos는 source solver 옵션이다. 사용자가 FESA backend를 FEAST로 명시했으므로
source option을 유지해 읽되 실제 backend를 명시하는 mapping이 가능하다. Abaqus Lanczos
동작과의 동등성을 주장하지 않는다. Exact allowlist와 진단은 I/O 소유이다.
- `SIM`은 source architecture 옵션이고 acoustic-free 모델의 `ACOUSTIC COUPLING=ON`은
실제 acoustic 모델 지원 요청이 아니다. 무해한 조합만 근거와 warning 정책으로 허용한다.
- `NORMALIZATION=MASS`의 내부 modal 의미를 유지한다. 외부 mode shape 비교는 추가하지 않는다.
- TXT의 명시적인 `Value`를 직접 읽고 원본을 보존한다. Matching/family는 tolerance 전에
고정하며 repeated eigenvalue와 duplicate mode ID를 구분한다.
- 기존 HDF5 의미를 보존하는 eigen quantity 추가는 신규 기능에 필요한 I/O 정의이다.
비호환 변경이 없는 한 schema 검토를 별도 사용자 승인 질문으로 만들지 않는다.
<a id="requirements-evidence--공개-근거"></a>
### 공개 근거
다음은 `2026-09-06`에 확인한 1차 문서이다. 공식 syntax와 backend admissibility 확인에만
사용하며 Abaqus 내부 정식화의 추정 근거로 쓰지 않는다.
1. [Abaqus 2025 — Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm):
`Eigenvalue Extraction`, `Initial Conditions`, `Loads`, `Output` 절. 무감쇠 eigenproblem의
`omega²`, 원형상/선행 기하비선형 상태의 구분, 각 모드 출력 의미 확인.
2. [Abaqus 2025 — *FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm):
`Optional parameters`와 Lanczos data line 절. 요청수 10, blank bounds, source algorithm,
SIM/acoustic 옵션의 의미와 mass normalization 확인.
3. [Intel oneMKL 2026.0 — Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html):
real symmetric generalized 문제는 `B` SPD를 요구한다. 이 조건 때문에 massless drilling을
아무 처리 없이 FEAST에 전달해서는 안 된다.
4. [Intel oneMKL 2026.0 — ?feast_scsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html):
지정 구간의 eigenpairs, subspace capacity, 결과 count와 status 의미 확인. 구간 선택·확장과
설치된 MKL 버전 검증은 후속 owner가 정의한다.
<a id="requirements-evidence--실행-evidence와-미실행"></a>
### 실행 evidence와 미실행
r0 원본 관찰과 hash는 그대로 유지했다. 아래는 당시 실행한 read-only 조사이며 이번 r1에서
reference 재조사나 변환을 수행하지 않았다. 해당 shell 명령은 exit code `0`이었다.
```powershell
Get-Content -Raw '.codex/skills/fem-requirements-baseline/SKILL.md'
Get-Content -Raw 'docs/SOLVER_AGENT_DESIGN.md'
Get-Content -Raw 'docs/FEATURE_DOCUMENTATION.md'
rg -n -i '^\*(?!\*)|density|frequency|static|step|boundary|shell section' --pcre2 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp'
Get-Content -Tail 75 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp'
Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
rg -n 'FEAST|feast|MassMatrix|Density|density|Frequency|Eigenvalue|eigenvalue' include src -g '*.[ch]*'
git status --short
```
추가 read-only `python -B -` here-script는 `pathlib`로 두 파일을 읽고 keyword별 node/element
count, 좌표 범위, regex `Mode\s+(\d+):\s+Value\s*=\s*(\S+)\s+Freq\s*=\s*(\S+)`로
mode/Value/Freq를 추출하여 finite·identity·주파수 교차 확인과 SHA-256을 계산했다.
Exit code `0`, 729 nodes / 676 elements / 10 modes였고 위 표·hash와 일치했다.
파일을 생성하거나 reference 내용을 쓰지 않았다. Source 검색에서 물리 mass/density/eigen
구현을 발견하지 못했고 nonlinear local energy 변수 `density`만 검색되었다. 이는 scoped 검색
관찰이며 제품 미지원의 최종 코드 감사는 아니다.
공통/feature/기존 MITC4·nonlinear 승인 계약을 read-only로 조사했다. 기존 보고서의 완료
표시는 이번 feature 실행 증거로 재사용하지 않는다. C++ build/test, Harness, 외부 solver와
FESA reference comparison은 요구사항 단계의 범위가 아니므로 미실행이다.
r1에서는 관리문서·owned reports·공통 agent 계약을 `Get-Content`로 읽고 사용자 수정
`AGENTS.md`의 GoogleTest 경로를 `rg -n 'GTEST|git|GoogleTest' 'AGENTS.md'`로 확인했다.
명령은 exit code `0`이었다. 실제 GoogleTest dependency 설정/build 확인은 Root·Planning
소유이며 이 문서 갱신에서 새로 실행하지 않았다. 두 사용자 결정으로 `MFE-OQ-001`과
`MFE-OQ-002`를 해결했으며 기존 25개 requirement ID를 보존하고 derived lumped 요구
`026`을 추가했다. 당시 질량 선택의 미결정은 모두 해소되었다. 이후 NR-MFE-001로 발견된
현재 acceptance 결정은 위 별도 절에서 관리하며 상세 lumping 수식·수치 기준은 후속 owner 소유이다.
NR-MFE-001 bounded 검토에서는 `Get-Content`로 현재 Feature 관리문서·owned 보고서·NR
main/evidence·reference-model·formulation-verification을 읽고, scoped `rg`로
`002/008/014`와 기존 `FESA-REQ-LSMITC4-034/038/051/056`을 대조했다. Exit code `0`.
원본 reference 재조사, NR 반례 재계산, 새로운 외부 조사와 수식 유도는 수행하지 않았다.
r2에서는 현재 관리문서와 위 기존 static reports/requirements/formulation을 `Get-Content`와
scoped `rg`로 읽었다. Exit code `0`. 기존 nonlinear §10.3의 동일 scale 사용과 현행
reference-model의 closure/별도 post-closure case 구분을 확인했다. 실제 reference 파일을
재조회하거나 과거 수치·hash를 새로 계산하지 않았다. NR 반례/positive evidence도 재실행하지
않았다. 변경은 owned 두 문서뿐이고 실제 C++/FEAST/build/test/reference 회귀는 미실행이다.
변경한 경로는 기본 보고서와 이 상세 보고서 두 개뿐이며 관리문서, source, tests, phase,
공통 정책과 reference artifact는 편집하지 않았다. 정적 링크·필수 metadata·ID/matrix 검사를
완료한 명령과 결과는 Requirement Agent 반환 evidence로 함께 보고한다.
-558
View File
@@ -1,558 +0,0 @@
# 이전 MFE 연구와 출처
현재 채택 여부는 [eigen2의 연구·정식화](../mitc4-shell-feast-eigen2/README.md)를 따른다.
<a id="research"></a>
<a id="research--mitc4-질량과-feast-고유치해석-연구"></a>
## MITC4 질량과 FEAST 고유치해석 연구
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 조사일 / web access date: `2026-09-06`
- 요청 outcome: `pass`; 다음 owner: `formulation-agent`. 최종 gate와 전이는 Coordinator 소유이다.
입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md),
[requirements r2](requirements.md#requirements), [reference 관찰·승인 delta](requirements.md#requirements-evidence)이다.
[프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), [공통 ADR](../ADR.md),
[TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md),
[문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용한다.
Source inventory, locator, API evidence, 유도 후보와 검증 한계는
[research-evidence.md](research.md#research-evidence)에 둔다.
<a id="research--핵심-결과"></a>
### 핵심 결과
1. 원 MITC4의 director 운동학에서 kinetic energy를 적분하면 병진 및 두 접평면 회전의
consistent mass를 구성할 수 있다. 원 논문은 consistent mass를 사용한 주파수 예제도
포함한다. Drilling은 이 보간의 nullspace다. 평판의 `rho*t`, `rho*t^3/12` 분리는
좋은 독립 oracle지만, 곡면의 thickness-dependent Jacobian까지 대체하는 일반식은 아니다.
근거: 상세 문서 `S01`, `R01`.
2. Consistent에서 얻은 물리 질량 moment를 node block으로 lumping하는 방향은
nonnegative partition of unity와 tensor 변환으로 설명할 수 있다. 전역 scalar
row-sum 또는 절댓값 row-sum을 회전 block에 그대로 적용하면 좌표 불변성과 drilling
nullspace를 잃을 수 있다. Lumping이 consistent의 모든 kinetic energy 또는 spectrum을
보존한다는 주장은 하지 않는다. 근거: `S02`, `R02`의 사실/유도 구분.
3. Homogeneous global constraint를 적용한 실제 질량의 positive/null space에서 massless
좌표를 처리해야 한다. Massless block의 강성이 가역이면 Schur complement는 선택된
lumped 질량의 유한 spectrum을 정확히 보존한다. `UR3`를 무조건 삭제하거나 인공
drilling mass를 더할 근거는 없다. 기존 공통 nodal director와 안정화 구조로 decoupling을
증명하면 일반적인 dense condensation을 피할 여지가 있다. 근거: `S03`, `R03`.
4. 설치된 oneMKL header에서 `feastinit`, `dfeast_scsrgv`를 확인했다. 공식 generalized
FEAST는 mass SPD를 요구하고 CSR interval count `fpm[49]`를 제공한다. 이 기능과
사전 spectral bound를 이용하면 bounded interval 정책의 completeness evidence를
구성할 수 있다. `info=0`만으로 최저 요청 모드가 모두 있다는 결론은 부족하다.
근거: `S04`~`S08`, `R04`.
5. Reference의 Lanczos/SIM은 source 옵션이고 FESA backend는 승인된 FEAST이다.
Acoustic-free 모델에서만 `ACOUSTIC COUPLING=ON`을 무해하게 대응할 근거가 있다.
`NORMALIZATION=MASS`는 실제 사용된 lumped 질량에서 유지한다. TXT의 각 mode는
modal frame identity에 대응하므로 family는 공통 same-frame 규칙과 함께 확정해야 한다.
근거: `S09`~`S11`, `R05`.
6. `NR-MFE-001`의 기존 대각 최솟값 규칙은 r2 승인 범위에서 대체한다. 물리 접평면
회전 block의 trace 또는 고유값으로 만든 scalar는 직교 기저 변화에 불변인 후보다.
초기 reference에서만 계수를 계산·고정하고 기존 drilling map/potential을 유지하면
nonlinear 미분 구조와 linear massless decoupling을 보존할 조건을 명시할 수 있다.
최종 계수식 채택과 반례 해소 판정은 후속 owner 소유다. 근거: `S12`, `S13`, `P03`,
[r2 delta와 후보](research.md#research-evidence--r07--r2-stabilization-근거와-영향).
사용자 후속 확정대로 요청 mode 개수의 authority는 `.inp`의 `*FREQUENCY` data다.
현재 값은 10이며 reference row 수나 FEAST 내부 count로 요청수를 추론하지 않는다.
<a id="research--requirement-coverage"></a>
### Requirement coverage
ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사를 가진다. 연구 외 행도 owner를 명시해 누락과
완료를 구분한다. 아래 표는 requirements matrix를 대체하지 않는다.
| IDs | 필요한 근거와 적용 범위 | 후속 owner |
| --- | --- | --- |
| `001`, `015`, `016` | `S09`, `S10`, `R05`: 무감쇠 원형상 procedure와 관찰 가능한 옵션; fail-closed exact allowlist | Formulation, I/O |
| `002`, `004` | `S01`, `P01`, `R01/R07`: 기존 물리 kernel/director/geometry/5-to-6 DOF 보존; numerical scale만 개선 | Formulation |
| `003` | `S01`, `R01`: 질량의 양의 density 의존성; syntax·material 연결은 I/O 검증 대상 | I/O |
| `005`, `006`, `026` | `S01`, `S02`, `R01`, `R02`: consistent→lumped 유도 후보, 물리 rotary inertia, drilling nullspace | Formulation, NR |
| `007`, `008` | `S03`, `P01`, `R03/R07`: 개선된 constrained pencil의 유한 spectrum 보존 조건; 결정적 조립은 프로젝트 계약 | Formulation, Planning |
| `009`, `010`, `011`, `012` | `S04`~`S08`, `R04`: 실제 FEAST·count·capacity·정수/storage·failure·반복/영 모드 완전성 | Formulation, NR, Planning |
| `013`, `014`, `018` | `S01`, `S03`, `S08`, `R06/R07`: 같은 lumped M의 residual/Gram·불변식·독립 oracle; NR 반례의 complete K/eigen 검증 필수 | Formulation, NR, Physics |
| `017`, `019` | `S10`, `S11`, `P01`: quantity/source identity 및 candidate 보존. 영속 schema는 연구에서 정의하지 않음 | I/O |
| `020`, `021`, `022` | `S10`, `S11`, `P02`, `R05`: Value-only, mode/frame, multiplicity; 정책 변경 없음 | NR, I/O |
| `023`, `024`, `025` | `P01`~`P03`, `R07`: TDD·MSVC·기존 linear/nonlinear 정적 회귀·closure는 후속 실행 evidence | Planning, Implementation, Physics, Release |
| `027` | `S12`, `S13`, `P03`, `R07`: basis-invariant scalar 후보, 초기 고정 scale·objective potential 및 positive/null 역할 보존 조건 | Formulation, NR |
<a id="research--handoff와-제한"></a>
### Handoff와 제한
`MFE-OQ-003`의 개선안 승인으로 기존 계약 충돌의 범위 선택은 해결되었다. 새 중요한
사용자 미결정은 발견하지 않았다. 승인된
**consistent → lumped → FEAST**는 고정이며 질량 방식 재선택이나 tolerance 변경을 제안하지 않는다.
다음 항목은 연구 누락이 아니라 해당 stage에서 확정할 계약이다.
- Formulation: `R01`~`R03`의 질량 적분·좌표 block lumping·보존 범위·constraint/nullspace
축소와 복원, `R04`의 finite interval/count/termination policy 및 `R07`의 개선 scale·
linear/nonlinear 적용 경계·positive inventory를 수식으로 확정한다.
- NR: 적분 정확도·rank/작은 차원·mass SPD·scaled modal residual/Gram 및
`R06/R07` portfolio의 기준, reference mode/frame/family와 blocking 판정을 확정한다.
Partial BC의 NR 반례를 full-free/full-clamp 검증으로 대체하지 않는다.
- I/O: 원본 `.inp` 옵션의 최소 mapping·진단, density와 결과 schema·source identity를 확정한다.
- Planning/Implementation: FEAST count·zero/cluster·small-N 실제 runtime와 integer/storage
변환을 검증한다. Header의 존재는 runtime 통과 evidence가 아니다.
이번 r2에서는 연구 문서 두 개만 갱신했다. 기존 `S01`~`S11` 근거와 reference hash는
영향 검토 후 r1 조사 이력으로 보존했으며 원본 reference를 다시 읽거나 수치 재실행하지 않았다.
새 primary 근거 두 그룹과 기존 static 계약 근거를 추가했다. 명령과 결과는 상세 문서 끝에 있다.
C++ build/test, Harness, 외부 solver와 FESA reference 수치 비교는 stage 범위 밖이므로
미실행이며 통과로 보고하지 않는다.
<a id="research-evidence"></a>
<a id="research-evidence--mitc4-질량feast-근거와-downstream-검증-후보"></a>
## MITC4 질량·FEAST 근거와 downstream 검증 후보
- Feature ID: `mitc4-shell-feast-eigen`
- Input contract revision: `r2`
- 기본 보고서: [research.md](research.md#research)
- Web access date: `2026-09-06`
`Fact`는 출처에서 확인한 내용, `Derivation/Inference`는 그 근거를 승인된 FESA에 적용한
연구 판단, `Candidate`는 Formulation/NR가 확정할 항목이다. 이 문서는 최종 수식·API·schema·
tolerance나 benchmark acceptance를 승인하지 않는다.
<a id="research-evidence--source-inventory"></a>
### Source inventory
모든 외부 source는 원 논문 또는 공식 문서다. `P`는 프로젝트 계약이며 독립 검증 근거가 아니다.
공식 Abaqus 자료는 공개 입력·출력 의미만 설명한다.
| ID | Source identity / stable locator | 신뢰도·적용·한계 |
| --- | --- | --- |
| S01 | Dvorkin & Bathe, *A Continuum Mechanics Based Four-Node Shell Element for General Non-linear Analysis*, Engineering Computations 1 (1984), 77–88, DOI `10.1108/eb023562`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), Eq.(1),(2), Eq.(25) 직후 및 Fig.7/Tables 3–4; [local transcription](../reference-papers/MITC4/AContinuumMechanicsBasedFourNodeShell/AContinuumMechanicsBasedFourNodeShell_001.md) | 1차 운동학·5 DOF·consistent-mass vibration 예제. Local OCR의 도표값은 검증 없이 acceptance 값으로 채택하지 않음. 비선형·가변두께 범위를 새로 허용하지 않음 |
| S02 | Voet, Sande & Buffa, *A mathematical theory for mass lumping and its generalization with applications to isogeometric analysis*, CMAME 410 (2023), 116033, DOI `10.1016/j.cma.2023.116033`; [author preprint v2](https://arxiv.org/html/2212.03614v2), §1, Definition 3.7, Remark 3.8, Lemma 3.19, §3.3 | 원 연구의 row-sum·positivity·Loewner 근거. 일반 scalar algebra를 회전 tensor에 그대로 옮기는 것은 입증되지 않음 |
| S03 | Bathe & Wilson, *Solution methods for eigenvalue problems in structural mechanics*, IJNME 6 (1973), 213–226, DOI `10.1002/nme.1620060207`; [author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/Solution_Methods_for_Eigenvalue_Problems_in_Structural_Mechanics.pdf), `STATIC CONDENSATION`, Eqs.(9)–(13); [publisher record](https://onlinelibrary.wiley.com/doi/pdf/10.1002/nme.1620060207) | 원 연구의 massless elimination과 fill/storage 한계. 임의 massive DOF를 제거하는 근사 Guyan reduction의 정확성을 주장하지 않음 |
| S04 | Intel oneMKL C Developer Reference, 2026.0 URL edition, page date `2026-04-28`, [Extended Eigensolver Functionality](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-functionality.html), `generalized` 및 sparse interface 설명 | 공식 admissibility·PARDISO 사용. 설치 runtime와 같은 version string이라는 가정 없음 |
| S05 | 같은 edition, [?feast_scsrgv/?feast_hcsrgv](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/feast-scsrgv-feast-hcsrgv.html), `Syntax`, `Input/Output Parameters`; [Matrix Storage](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/matrix-storage.html) | 공식 signature·storage·capacity·결과 의미. `emin≤emax` 본문은 S07의 strict validation과 함께 읽음 |
| S06 | 같은 edition, [Extended Eigensolver Input Parameters](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-input-parameters.html), C-indexed `fpm` 표 | 공식 count/check/iteration 옵션. Standalone FEAST 다른 버전의 fpm 번호를 대입하지 않음 |
| S07 | 같은 edition, [Extended Eigensolver Output Details](https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2026-0/extended-eigensolver-output-details.html), return-code 표와 `info=1` 주의 | 공식 오류·구간 폭·endpoint 위험. Warning은 Feature 성공으로 자동 승격하지 않음 |
| S08 | E. Polizzi, *Density-Matrix-Based Algorithm for Solving Eigenvalue Problems*, Physical Review B 79 (2009), 115112, DOI `10.1103/PhysRevB.79.115112`; [author preprint](https://arxiv.org/pdf/0901.2665), §II.A Eqs.(6)–(9), §II.B | 원 FEAST의 contour/Rayleigh–Ritz와 B-orthonormality. MKL 옵션·상태 정의는 S05–S07 우선 |
| S09 | Abaqus 2025 [*FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm), `Optional parameters`, Lanczos data line | 공식 count·bounds·SIM·normalization·acoustic semantics. FESA가 source Lanczos를 구현한다는 근거가 아님 |
| S10 | Abaqus 2025 [Natural Frequency Extraction](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-freqextraction.htm), `Eigenvalue Extraction`, `Normalization`, `Initial Conditions`, `Output` | 공식 `omega²`·generalized mass·base state. Abaqus 내부 질량 정식화에 대한 추론 금지 |
| S11 | Abaqus 2025 [OdbFrame object](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKERRefMap/simaker-c-odbframepyc.htm), modal constructor와 members; [Mode Domain Output](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEOUTRefMap/simaout-c-dboutput-frequency.htm), `Controlling Output Frequency in a Mode Domain Analysis` | 공식 mode/frame 의미. TXT에 없는 step을 임의 생성하는 권한이 아님 |
| S12 | LAPACK 3.12.1, [DLAEV2 original source/documentation](https://www.netlib.org/lapack/explore-html/d4/d5a/dlaev2_8f_source.html), source lines 31–39 (`Purpose`), 102–113 (`Further Details`); authors Univ. Tennessee / UC Berkeley / Colorado Denver / NAG | 공식 2×2 대칭 eigendecomposition과 작은 고유값의 determinant cancellation 한계. FESA scale 선정 규칙이나 새 vendor 호출 의무를 제공하지 않음 |
| S13 | Müller & Bischoff, *A Consistent Finite Element Formulation of the Geometrically Non-linear Reissner-Mindlin Shell Model*, ACME 29 (2022), 3387–3434, [updated original article](https://link.springer.com/article/10.1007/s11831-021-09702-7), Abstract, §2, §§6.1–6.2; corrections [April 2022](https://link.springer.com/article/10.1007/s11831-022-09725-8), [November 2022](https://link.springer.com/article/10.1007/s11831-022-09832-6) | 자체 shell 정식화의 potential 선형화·objectivity 근거만 사용. Review로 분류된 논문의 자체 유도 부분이며 문헌 요약을 1차 근거로 대용하지 않음. FESA의 MITC4·drilling 수식과 동일하지 않음 |
| P01 | [기존 MITC4 formulation](../linear-static-mitc4-shell/formulation.md), §§5,8,9,12,17; [실제 kernel](../../src/fesa/elements/mitc4_shell.cpp), `PhysicalTransformation20`, `DrillingTransformation4`, `EvaluateStiffness`, `GeometryAt`; [ARCHITECTURE](../ARCHITECTURE.md) | 현재 FESA 기하·부호·소유권 계약; 옛 scale 공식은 r2 대체 대상. Legacy research의 오래된 tolerance/승인 절차는 이번 계약에 재사용하지 않음 |
| P02 | [requirements r2](requirements.md#requirements), [원본 reference evidence·승인 delta](requirements.md#requirements-evidence), [공통 TOLERANCE](../TOLERANCE.md), [ADR](ADR.md) | 승인된 사용자 흐름과 acceptance boundary. 수치 통과 자체의 evidence가 아님 |
| P03 | [기존 nonlinear formulation §§10.2–10.4](../nonlinear-static-newton-raphson/formulation.md#103-fixed-scale-and-potential), [기존 linear requirements 034/056](../linear-static-mitc4-shell/requirements.md), [NR-MFE-001 반례](numerical-review.md#numerical-review-evidence--nr-mfe-001-직접-계산-반례), [r2 static 회귀 계약](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증) | 기존 initial-fixed scale·objective potential·미분 및 r2 대체/회귀 경계. NR 반례를 재실행한 evidence로 주장하지 않음 |
Hinton–Rock–Zienkiewicz (1976), DOI `10.1002/eqe.4290040305`의
[publisher abstract](https://onlinelibrary.wiley.com/doi/10.1002/eqe.4290040305)는 확인했으나
본문을 확보하지 않아 HRZ의 shell-specific 수식을 근거로 채택하지 않았다.
NASA SP-160은 optional plate benchmark 탐색에서 발견했으나 이번 포트폴리오는 S01 및
직접 검산 가능한 oracle로 충분하므로 필수 artifact나 새 acceptance 요구로 추가하지 않았다.
Configured FEM vault는 이번 요청의 지정 evidence source가 아니며, 기존 wiki/연구 요약은
탐색에만 참고하고 핵심 주장을 위 1차 source에 연결했다.
<a id="research-evidence--r01--consistent-physical-mass와-적분"></a>
### R01 — Consistent physical mass와 적분
**Fact, S01/P01:** 기존 보간은 `u = sum Ni(ui + z*(theta_i cross d_i))`,
`z=t*zeta/2`이며 director-parallel rotation은 입자 속도에 기여하지 않는다.
원 논문의 elastic example은 surface `2×2`, thickness 2-point Gauss 및 consistent-mass
주파수 분석을 사용한다. 이는 임의 geometry의 mass 적분이 정확하다는 증명은 아니다.
**Derivation:** `T=1/2 integral rho*|u_dot|² dV`에서 `M_C=integral rho*H^T H dV`가
따른다. Geometry는 기존 `X=sum Ni(Xi+z*di)`와 같은 `J=det(dX/dnatural)`를 사용한다.
양의 quadrature weight·density·유효 J에서는 대칭 PSD와 drilling null action이 직접 따른다.
MITC의 assumed shear는 strain 보간이므로 velocity 보간을 바꾸거나 shear factor `5/6`를
물리 질량에 곱하는 이유가 되지 않는다.
**평판 oracle:** 평행 director·centered flat section이면 병진 scalar block은
`rho*t*integral Ni*Nj dA`, rotary block은 `rho*t³/12*integral Ni*Nj dA`와 tangent
변환의 곱이며 translation–rotation coupling은 0이다. 축정렬 직사각형 면적 A에서는
scalar consistent block이 `rho*t*A/36`에 다음 행렬을 곱한 것과 같다.
```text
4 2 1 2
2 4 2 1
1 2 4 2
2 1 2 4
```
Rotary oracle의 scalar 배율은 위 병진 배율의 `t²/12`다. 이는 bilinear 형상함수의 직접
다항식 적분 결과이며 구현 함수를 다시 호출하는 테스트와 구분한다.
**Candidate/한계:** 곡면에서는 J가 zeta에 의존하여 odd thickness moment와
translation–rotation coupling이 남을 수 있다. Centered section만으로 이를 0으로 두지 않는다.
현재 trilinear geometry의 J 및 H 다항식 차수를 확인해 충분한 적분을 선택할 수 있다.
보수적인 tensor-product 3-point 후보는 각 좌표의 degree≤4 mass integrand를 적분하지만,
정확한 차수·기하 검증 위치·채택 quadrature는 Formulation/NR가 증명한다. 기존 stiffness
quadrature나 기존 geometry 허용 범위를 연구 단계에서 변경하지 않는다.
<a id="research-evidence--r02--consistent에서-유도하는-좌표-일관적-lumping"></a>
### R02 — Consistent에서 유도하는 좌표 일관적 lumping
**Fact, S02:** Row-sum, nodal quadrature, diagonal scaling은 일반적으로 서로 다른 근사다.
Nonnegative partition of unity는 scalar row-sum의 positivity를 설명한다. 논문의
absolute-row-sum operator는 일반 행렬의 positivity를 확보하지만 물리 total mass나
회전 nullspace를 보존하는 shell-specific theorem은 아니다.
**Derivation — 피해야 할 적용:** global rotary tensor는 `I-di*di^T`와 다른 director
사이의 cross block을 포함한다. Scalar `diag(M*ones)`는 좌표 회전과 commute하지 않는다.
예를 들어 단위 director `d=(1,1,1)/sqrt(3)`의 `P=I-dd^T`는 `P*ones=0`이지만
rank는 2다. Row-sum은 두 물리 관성을 모두 없애며 absolute row-sum은 drilling에
관성을 더한다. 혼합 translation/rotation 행의 무차별 합은 단위도 섞는다.
**Candidate — scalar moment를 통한 node block:** Consistent의 구성 moment
`Ck_ij=integral rho*Ni*Nj*z^k dV`, `k=0,1,2`를 식별하고 해당 물리 scalar moment에서
row-sum한 뒤 각 node의 director tangent tensor로 재구성하는 방법을 검토할 수 있다.
이는 consistent 결과와의 유도 관계를 증명해야 하며, 별도 unrelated diagonal을 생성하는
우회 경로로 쓰지 않는다. Full consistent block에서 moment를 추출하거나 계산 중 동일
moment를 보존하는 구체적 방식은 Formulation 소유다.
`sum Nj=1` 때문에 이 후보는 node별 `integral rho*Ni*Gi(z)^T Gi(z) dV` 형태로
설명된다. 여기서 `Gi(z)`는 그 node의 병진과 director 변화로 particle velocity를 만드는
map이다. 따라서 양의 measure에서 physical block PSD, director nullspace, tensor
congruence와 총 병진 질량 보존을 독립적으로 검산할 수 있다. Flat case에서는
`m_i=sum_j C0_ij`, 두 tangent inertia `m_i*t²/12`, drilling 0으로 단순화된다.
**한계:** 곡면의 nodal rotational frames를 component별로 직접 더하지 않는다.
Node block은 global 좌표에서 diagonal일 필요가 없다. Translation–rotation moment를
보존하면 6×6 block에 coupling이 있을 수 있다. 이 후보의 positivity와 각 inertia/centroid
보존 관계는 Formulation에서 완성하고 NR가 독립 검토해야 한다. Uniform translation
energy는 보존하지만 일반 회전의 orbital inertia 및 모든 속도장의 consistent energy는
보존한다고 가정하지 않는다. 물리 node velocity의 convexity로 설명 가능한 에너지 차이와
refinement 거동을 검증 후보로 삼을 수 있으며, Abaqus 내부 lumping 동일성을 주장하지 않는다.
<a id="research-evidence--r03--massless-좌표-제약과-유한-spectrum"></a>
### R03 — Massless 좌표, 제약과 유한 spectrum
**Fact, S03:** Massless 좌표를 분리하여 mass가 `diag(Mp,0)`, `Mp` SPD이고 대응
강성 `Kzz`가 가역이면 `Kr=Kpp-Kpz*Kzz^-1*Kzp`와 `Mp`의 문제로 축소하며,
massless 성분은 `z=-Kzz^-1*Kzp*p`로 복원한다. 이 경우 정적 제거는 massless row의
정확한 식이다. 축소 stiffness는 일반적으로 dense가 될 수 있다.
**Inference, P01에 적용:** 먼저 원래 global homogeneous BC의 free injection C로
`Kf=C^T K C`, `Mf=C^T M_L C`를 만들고, 그 공간에서 positive/null basis를 정의한다.
Director가 global axis와 기울어져 있으면 `UR3=drill`은 성립하지 않는다. 일부 global
회전을 고정한 node에서는 원래 drill 방향 전체가 free space에 들어가지 않을 수 있으므로
실제 `Mf`가 full rank가 될 수 있다. 이때 물리 질량이 있는 자유도를 제거해서는 안 된다.
P01의 공통 nodal director와 `Kphys=Tphys^T K20 Tphys`,
`Kdrill=Td^T kd I Td` 때문에 massless 방향의 decoupling을 algebraically 증명할
가능성이 있다. 증명된 경우 node별 작은 basis로 projection하여 sparsity를 유지할 수 있다.
단순히 coupling을 작다고 버리는 것은 그 증명이 아니다. Partial global constraints로
finite space에 남는 stabilization contribution도 보존한다. r2의 massless 처리는
**개선된 constrained stabilized K와 선택된 lumped M의 finite spectrum**에 대한 동등성이다.
Unstabilized 다른 shell formulation이나 consistent spectrum과의 동등성이 아니다.
**Candidate 검증:** 비축정렬 director, partially constrained rotation, constraint-free
shell의 6 physical rigid motions, `Kpz!=0`인 작은 manufactured pencil로 축소/복원과
full free residual을 확인한다. Physical rigid rotation의 nodal UR은 기존 계약의 tangent
projection을 사용한다. Null block이 비가역인 경우 generic inverse/pseudoinverse로
우회하지 않는다. 공통 K/M nullspace는 regular finite-spectrum 문제와 구분해 진단한다.
물리 rank 0, request>rank, nullspace가 없는 경우를 각각 정의한다.
일반 dense basis/Schur를 채택하면 `O(n²)` storage와 factorization fill을 평가해야 한다.
Reference의 25×25 interior nodes는 flat full clamp에서 free DOF 3750,
massive physical dimension 3125로 예상되며, 3125² double 한 행렬만 약 78.1 MB다.
이는 topology에 따른 계산 추정이고 실제 rank/runtime 측정이 아니다. FEAST workspace와
complex shifted factorization을 더해야 하므로 한 행렬 크기로 memory feasibility를 주장하지 않는다.
<a id="research-evidence--r04--onemkl-feast-api와-completeness-근거"></a>
### R04 — oneMKL FEAST API와 completeness 근거
**설치 관찰:** `mkl/2026.1/include/mkl_solvers_ee.h` lines 33,87에 `feastinit`,
`dfeast_scsrgv`가 있다. `mkl_version.h`는 major `2026`, minor `0`, update `1`,
build date `20260612`, `INTEL_MKL_VERSION=20260100`이다. Directory `2026.1`과
header version 표기를 임의로 통일하지 않는다. 실제 linked runtime는 Implementation이 기록한다.
`mkl_types.h`의 `MKL_INT`는 LP64에서 `int`, `MKL_ILP64`에서 64-bit다. N, nnz+1,
row/column index와 N×m0 allocation을 checked conversion해야 하며 vendor type은 adapter 내부다.
**Fact, S04/S05:** Real symmetric generalized `A*x=lambda*B*x`에서 B는 SPD여야 한다.
`dfeast_scsrgv`는 A/B 각각 values·row pointer·column index를 받으며 같은 storage family를
사용한다. `uplo=U/L/F`, `n>0`, `0<m0<=n`, `m0>=interval multiplicity count`다.
`fpm`은 128개 `MKL_INT`; `e/res`는 m0, eigenvectors는 N×m0의 column storage로
준비하고 첫 m columns만 소비한다. Documented CSR은 row pointer terminal `nnz+1`인
1-based convention으로 대응한다. A/B sparsity pattern은 같을 필요가 없다. 내부 0-based
CSR을 인덱스 변환 없이 넘기지 않는다. `epsout`은 trace 변화량이고 개별 residual을 대신하지 않는다.
**Fact, S06 — C index 표:**
| Parameter | 문서 의미 / 연구 적용 |
| --- | --- |
| `feastinit(fpm)` | 호출 전 초기화; 다른 FEAST 배포판의 설정 배열을 복사하지 않음 |
| `fpm[1]` | contour points; 허용된 값만 사용 |
| `fpm[2]`, `[3]` | double precision stopping exponent, refinement loop bound; 값은 NR/계약에서 고정 |
| `fpm[4]` | 0=generated initial subspace, 1=user subspace; 재현성과 projection rank 검증 필요 |
| `fpm[5]` | 0=residual stopping, 1=trace stopping; zero mode는 독립 scale-aware residual 필수 |
| `fpm[13]` | 1은 한 contour의 subspace만 반환; 완료 eigenpairs로 소비하지 않음 |
| `fpm[26]`, `[27]` | CSR validity, B SPD check 옵션 |
| `fpm[49]` | CSR interval eigenvalue count를 m0에 반환하고 flag를 0으로 재설정; count와 solve는 구분 |
| `fpm[63]` 및 `[64..127]` | PARDISO user iparm 적용 여부 및 매핑; 후반부는 output도 되므로 call 간 변경 고려 |
**Fact, S07:** `info=0` successful; `1` empty interval/검색 실패 가능,
`2` nonconvergence, `3` insufficient subspace, `4` subspace-only이다.
`-1/-2` allocation/inner solver, `-3/-4` reduced solver/B-not-SPD,
`-5` count failure(구간 끝이 eigenvalue 또는 근접할 수 있음), `200/201/202`는
interval/subspace/N 오류다. `100+i`는 `fpm[i-1]` 오류다.
S05 본문은 `emin<=emax`로 쓰지만 명시적인 `200` 검증은 `emin>=emax`를 거부하므로
실제 계약은 strict `emin<emax`로 설정할 수 있다. 이것은 사용자 physics 결정이 아니다.
매우 넓은 구간 안의 작은 cluster를 놓칠 수 있다는 공식 주의가 있으므로 빈 반환을 곧
없는 spectrum으로 단정하지 않는다.
**Candidate bounded policy rationale:** SPD reduction/whitening 뒤 차원이 일관된 spectral
bound(예: 대칭 표준 문제의 Gershgorin bound)를 유도하면 전체 spectrum 밖의 유한 하한과
상한을 얻을 수 있다. Reference 값이나 hardcoded frequency로 구간을 정하지 않는다.
Zero를 포함하는 하한을 두고 interval count를 통해 낮은 순서의 requested N을 덮는 상한을
찾되, endpoint collision·overflow·count/solve mismatch와 시도 수를 제한한다. Count가
cluster 전체를 포함하면 m0가 requested N보다 커질 수 있으며 반드시 multiplicity를
수용한다. Sort 후 필요한 첫 N을 출력하더라도 원래 계산 multiplicity와 pairing을 유지한다.
`m0=N`이 충분하다는 가정, 매번 상한만 무한히 늘리는 정책, count 성공을 eigenpair 성공으로
취급하는 정책은 근거가 없다. Final bounds·성장/축소·cluster tie·subspace/seed·실패 정책은
Formulation/NR 소유이고 small N 및 N=physical rank도 FEAST 실제 runtime로 검증한다.
Intel S06은 `fpm[49]` 결과를 total number로 기술하며 stochastic estimate라고 설명하지
않는다. 그렇더라도 이 문서만으로 floating-point inertia/count의 모든 조건에서의 정확성이나
전체 algorithm의 completeness를 증명했다고 주장하지 않는다. S07의 endpoint/count 실패와
작은 독립 spectrum 검증을 유지한다. 다른 standalone FEAST 버전의 stochastic-count
옵션과 혼동하지 않는다. 요청 N의 외부 authority는 사용자 확정대로 `.inp` data이며
내부 count는 interval/subspace를 정하는 evidence다. TXT 행수나 count로 N을 바꾸거나
새 사용자 interval/count API를 만들지 않는다.
**Fact, S08 / 적용:** FEAST의 Rayleigh–Ritz 식은 B-orthonormal reduced vectors에서
`X^T B X=I`를 준다. 내부 벡터는 같은 lumped M으로 검증한다. Repeated eigenspace의
개별 방향과 sign은 유일하지 않으므로 vector component exact equality를 acceptance로
추가하지 않는다. Count/completeness와 residual/Gram은 서로 대체하지 않는다.
<a id="research-evidence--r05--reference의-관찰-가능한-의미와-family"></a>
### R05 — Reference의 관찰 가능한 의미와 family
**Fact, S09/S10:** `*FREQUENCY`의 첫 값은 requested count다. Lanczos data line의
blank min/max는 별도 bound를 지정하지 않으며, 뒤 shift와 block controls의 공란을 0 입력으로
오인하지 않는다. `SIM`은 source architecture 설정이고 `NORMALIZATION=MASS`는
generalized mass 1이다. Acoustic coupling ON은 acoustic/structural coupled model에
작용한다. 적용 대상 acoustic 요소·ASI·coupling이 없는 현재 input의 옵션은 무해하게
mapping할 근거가 있으며, 실제 acoustic 모델은 승인 subset 밖이다.
**Inference/P02:** 알고리즘 지정의 FESA 해석은 source Lanczos 보존 + actual backend
FEAST이다. SIM을 FESA backend 기능으로 주장하지 않고 명시된 무해한 조합만 I/O가
진단 정책으로 고정한다. 원본의 output/restart 요청을 읽을 때에도 새 modal stress/reaction
지원으로 확대하지 않는다. 실제 prior step, preload, damping, nonzero prescribed state를
삭제하여 현재 subset처럼 실행하는 근거는 없다.
**Fact/관찰:** S10은 `lambda=omega²`와 cycles/time frequency를 구분한다. S11은
modal frame의 mode member와 mode-domain output을 정의한다. 원본 TXT는 `Frame: Mode`
1~10과 Value를 포함하고 input에는 단일 `Step-2`만 있다. 따라서 unique step + source
mode mapping이 가능하며 Freq 반올림으로 Value를 다시 계산하지 않는다.
**NR handoff:** 공통 TOLERANCE는 같은 step/frame만 family로 묶는다. 원본에 각각의 modal
frame이 있는 점을 유지하여 mode별 scalar family를 정의하는 방향을 검토한다. 단일 HDF5
table에 저장했다는 이유로 다른 source mode/frame을 하나의 family로 모으지 않는다.
Singleton family에서는 공통 RMS 규칙도 그대로 적용하며 scalar라는 이유로 생략하지 않는다.
최종 family 이름·identity·blocking 및 exact mapping은 NR/I/O가 고정한다.
Repeated Value는 서로 다른 mode identity로 보존하며 source missing/extra/duplicate/nonfinite
검사 후 공통 정책을 적용한다. Displayed repeated 값으로 실제 exact degeneracy를 단정하거나
mode shape matching으로 외부 acceptance를 넓히지 않는다.
<a id="research-evidence--r06--독립-verification-portfolio-후보"></a>
### R06 — 독립 verification portfolio 후보
각 case의 구체적 구성·수치 기준은 NR가 정한다. 새 eigen external reference는 지정 Value
10개뿐이며, r2에 승인된 기존 static 회귀는 R07과 Requirement 024의 기존 계약을 따른다.
| Candidate | 잡아내는 오류 / 독립 기대값 | 한계 |
| --- | --- | --- |
| 직사각형 single-element mass | R01 polynomial oracle, 3 translations total `rho*A*t`, 2 rotary inertia, null drilling | 곡면 적분·semantic 연결은 검증하지 않음 |
| 곡면/왜곡 요소의 independent velocity integration | 직접 particle kinetic energy와 consistent quadratic form, R02 derived relation/양의 node block | 동일 production H/J 코드를 재호출하는 oracle는 독립성이 부족 |
| Rigid/coordinate tests | 기존 tangent rigid motion의 zero stiffness; geometry/director와 개선 scale을 독립 재계산한 complete K·두 질량의 congruence 및 eigenvalue invariant | NR-MFE-001의 같은 물리 partial BC 필수; old kd를 고정한 단순 tensor 변환이나 full-free/full-clamp만으로 대체하지 않음. 일반 MPC는 추가하지 않음 |
| Density scaling | 두 mass가 density 배율 c에 비례, 선택된 eigenvalues가 1/c, mass-normalized vector magnitude가 1/sqrt(c) | 다른 density field의 material mapping은 별도 양성/음성 test |
| 작은 manufactured singular pencil | R03 식을 손으로 계산하여 exact finite eigenvalues·복원 residual, partial global constraint와 rank case | Element/mass 조립 correctness는 별도 검증 |
| 작은 diagonal/rotated SPD pencil | FEAST N=1/2, repeated/clustered/zero/negative case, request=rank, count/m0/interval edge 및 실패 진단 | 직접 hand matrix는 전체 procedure/reference를 대신하지 않음 |
| Modal residual / Gram / energy | Free-space `Kphi-lambda*M_L*phi`, `Phi^T*M_L*Phi=I`, `phi^T*K*phi=lambda`와 constraint 복원 | 작은 residual만으로 최저 모드 completeness를 보장하지 못함 |
| Simply-supported plate analytical limit | S01 Fig.7/Table4의 plate frequency 사례 또는 `lambda=(D/(rho*t))*((m*pi/a)^2+(n*pi/b)^2)^2`의 thin-plate Navier limit | 마지막 식은 직접 thin-plate PDE로 유도·검산할 후보; rotary/shear를 포함한 유한 두께 shell의 exact oracle로 쓰지 않음 |
| 지정 clamped plate reference | 원본 `.inp`와 TXT Value의 순서·multiplicity·family 비교; square-symmetry cluster 진단 | 비교만으로 mass·mode shape·drilling·내부 알고리즘의 correctness를 주장하지 못함 |
Modal physics는 무하중 정적 `Kphi=0`나 정적 reaction balance를 모든 eigenvector에
요구하지 않는다. Inertia와 elastic restoring force의 균형인 free residual을 검사한다.
Dimensional translation/rotation 차이는 Formulation의 congruent scaling으로 처리하고
zero mode의 residual denominator와 rank threshold는 NR가 정한다. 두께 변경에서는
membrane, bending, shear, rotary inertia가 서로 다르게 변하므로 density처럼 모든 mode에
단일 thickness power law를 강제하지 않는다.
<a id="research-evidence--r07--r2-stabilization-근거와-영향"></a>
### R07 — r2 stabilization 근거와 영향
<a id="research-evidence--입력-delta와-보존-근거"></a>
#### 입력 delta와 보존 근거
`FEM-REQ-MITC4-EIGEN-002/008/014/024/027` 및
[MFE-ADR-007](ADR.md#mfe-adr-007--기존-stabilization과-좌표-불변성-acceptance-정합)을 적용한다.
기존 `min(R+)`의 기저 의존성은 P03의 NR 반례로 확인되었다. 그 반례와 r1의 mass oracle를
재계산하지 않는다. 사용자 승인은 개선 범위를 확정하며 특정 새 수식이나 NR 통과를 뜻하지 않는다.
| 기존 근거 | r2 영향 판단 |
| --- | --- |
| S01/S02, R01/R02 mass·moment·quadrature | Numerical K scale과 독립이다. 기존 primary 근거·한계 및 [mass 계약](formulation.md#formulation-mass)을 보존한다 |
| S03, R03 및 [eigen E2–E4](formulation.md#formulation-eigen) | Schur 원리는 그대로다. Decoupling의 적용 대상은 개선된 K이며 아래 positive/director 구조를 Formulation이 재확인해야 한다 |
| S04–S08, R04 FEAST/정수/count | Backend·lumped M·입력 N 요구가 바뀌지 않아 근거를 보존한다. 설치/runtime를 새로 검증한 것은 아니다 |
| S09–S11, R05 reference 의미 | 새 eigen Value-only·원본 identity·공통 tolerance가 불변이다. 기존 artifact/hash는 r1 관찰 이력으로 보존한다 |
| R06 및 [기존 V5](formulation.md#formulation-verification) | Complete K 재계산과 지원 partial BC 반례 통과가 필수다. r1의 제한된 eigen 좌표 검증 설명을 r2 acceptance로 사용하지 않는다 |
| P01/P03 static | 옛 scale 선정식만 대체하며 initial-fixed lifecycle·objective potential·physical recovery 제외와 기존 회귀 계약은 유지한다 |
<a id="research-evidence--공변적인-secondary-scale-후보"></a>
#### 공변적인 secondary scale 후보
**Fact, S12:** 대칭 2×2 행렬은 직교 회전으로 대각화할 수 있다. LAPACK 원 source는
그 변환과 반환 고유값을 명시하고, 작은 고유값 계산에서 determinant 상쇄로 상대 정확도를
잃을 수 있음을 경고한다. 이를 새 shell scale의 최종 선정 근거와 혼동하지 않는다.
**Derivation — 기저 변화:** 초기 physical `K20^0`에서 node i의 두 회전 성분에 해당하는
2×2 principal block을 `R_i`, 해당 성분을 global tangent rotation으로 보내는 orthonormal
map을 `U_i`라 하자. 전역 rigid coordinate rotation `G`와 접평면 기저 변경 `O_i`에서
`U_i'=G U_i O_i`, `R_i'=O_i^T R_i O_i`이면
`U_i' R_i' U_i'^T=G(U_i R_i U_i^T)G^T`다.
따라서 `tr(R_i')=tr(R_i)`와 `det(R_i'-lambda I)=det(R_i-lambda I)`가 직접 따른다.
개별 대각값은 이 항등식의 scalar invariant가 아니다. 서로 다른 node의 기저 변경도
block별로 독립 허용된다. 실제 physical kernel이 이 변환 법칙을 만족하는지는 후속 검증 대상이다.
**Candidate — trace 기반, 우선 검토 권고:** `tau_i=tr(R_i)/2`에서 하나의 positive element
scale을 만들 수 있다. `mean_i(tau_i)=sum_i tr(R_i)/8`은 기존 여덟 physical rotation
성분의 평균이며, physical K가 PSD이고 회전 강성이 적어도 하나 존재하면 양수다.
또 다른 후보는 positive nodal `tau_i`의 최솟값으로 기존 최소값 집계를 유지하는 것이다.
두 후보 모두 좌표/기저 불변이며 force·length 차원을 갖는다. 초기 K의 물리적인 PSD 및
zero/nonfinite inventory 처리는 명시적으로 확인해야 하며 양의 trace만으로 PSD를 판정하지 않는다.
최솟값 후보의 zero-block 처리 또는 전 node positivity가 필요하면 기존 유효 geometry와의
관계를 증명해야 한다. 암묵적인 새 geometry 제외·epsilon floor로 보완하지 않는다.
**Candidate — 최소 spectral 값:** `lambda_min(R_i)`도 기저 불변이고 작은 회전 강성 방향을
반영한다. 그러나 positive 여부·zero block 처리와 작은 eigenvalue의 상쇄/conditioning
문제가 추가된다. 단순 `(trace-sqrt(discriminant))/2` 구현의 안정성을 가정하지 않는다.
Trace 후보에는 이 spectral subtraction이 없으므로 bounded scale 개선의 첫 검토 방향으로
권고한다. 이 비교는 runtime 성능 측정 또는 수식 채택 판정이 아니다.
어느 후보든 기존 차원 없는 `10^-3` 계수와 `K_d=k_d I4`의 numerical 역할을 유지하는
최소 변경을 검토할 수 있다. Reference 오차를 보고 scale/계수를 조정하거나 coefficient sweep,
물리 drilling 관성·strain·새 입력 설정을 추가할 근거는 없다. 정확한 aggregation, finite/positive
검사 및 scale 공식 채택은 Formulation 소유이고 numerical 기준은 NR 소유다.
<a id="research-evidence--linear-null과-nonlinear-lifecycle의-다른-적용-조건"></a>
#### Linear null과 nonlinear lifecycle의 다른 적용 조건
**Derivation/조건, P01/P03와 S03:** Linear/eigen에서는 기존 `T_p`, `T_d`와
`K_drill=T_d^T k_d I4 T_d`를 그대로 두고, 모든 element의 새 `k_d`가 finite positive이면
실제로 free space에 남는 director null `Z`에 대해
`K_f Z=Z diag(sum_{e incident i} k_d,e)` 구조를 유지할 수 있다.
Physical K가 director 방향을 소거하고 공통 nodal director를 사용한다는 전제가 필요하다.
이 조건에서 `Kzz>0`, `Kpz=0`이므로 기존 analytic projection의 정확성 근거가 유지된다.
이는 [E3](formulation.md#formulation-eigen)의 적용 조건 재확인이지 새 수식/실제 조립의 검증 완료가 아니다.
Null이 없는 partial BC에는 개선 stabilization이 남으며 이를 삭제해서는 안 된다.
새 K와 옛 K 사이의 partial-BC spectrum 동일성은 요구하지 않는다.
**Fact, S13:** 논문의 자체 shell 정식화는 director manifold에 맞는 potential의 일관
선형화와 objective interpolation을 함께 다룬다. 이것은 FESA의 drilling potential를
제공하지 않는다. April correction은 proofing 오류, November correction은 Eq.(5.26)의
LaTeX rendering 오류를 알리며 현재 원문이 교정되었다고 명시한다. 그 식을 이 후보에
복사하거나 FESA의 기존 운동학을 해당 논문의 보간으로 교체하지 않는다.
**Derivation/조건, P03:** 기존 nonlinear `Pi_d=k_d*gamma^T gamma/2`에서 새 scale을
초기 reference physical K로 계산한 뒤 모든 increment/iteration에서 불변으로 유지하면
`Dk_d=D²k_d=0`이다. 따라서 기존 exact residual/Hessian은 동일한 `gamma`, `Dgamma`,
`D²gamma`에 새 scalar를 곱하는 구조를 유지한다. 기저 불변 reference scale과 objective
gamma를 함께 유지하면 같은 물리 상태의 좌표 변경에 따른 potential 불변성도 보존할 조건이 된다.
Trial tangent에서 scale을 다시 선정하면 추가 미분항과 min의 비매끄러움이 생길 수 있어 이
initial-fixed 계약을 대체할 수 없다. Scale이 같다는 이유로 nonlinear의 corotation coupling을
linear의 단순 director projection과 동일하게 만들지 않는다.
**Limit:** 양의 `k_d`는 numerical potential의 비음성과 pure-drill 양의 작용을 뜻한다.
변형된 nonlinear Hessian에는 `sum gamma_i D²gamma_i`가 있어 모든 상태의 SPD를 뜻하지
않는다. Linear E3 decoupling 증명을 nonlinear Hessian이나 prestressed eigenproblem에
일괄 적용하지 않는다. 새 feature의 eigen 상태는 승인된 원형상·무응력 상태다.
<a id="research-evidence--verification-연결과-남는-owner-작업"></a>
#### Verification 연결과 남는 owner 작업
NR-MFE-001의 동일 물리 partial BC에서 새 scale과 complete K를 독립 재계산하고,
대응 eigen spectrum 및 정적 response의 좌표 검증을 수행해야 한다. 옛 계수를 외부에서
고정한 tensor 변환만 비교하면 원래 결함을 검출하지 못한다. 동일 물리 BC/loads의 변환과
허용된 입력 범위는 유지한다. 추가 새 reference 모델을 요구하지 않는다.
기존 static 회귀의 원본 경로·quantity·identity·policy는 P03의
[Requirement evidence portfolio](requirements.md#requirements-evidence--r2-승인-범위와-정적-재검증)에
한 곳에서 유지한다. Linear `shell` 및 nonlinear `shellNL`/`shellNL-meshfine`와 linear-limit
case, 내부 tangent·선형극한·objectivity·평형·reaction·energy·rollback 검증을 새 scale로
실행해야 한다. 기존 U blocking/UR warning-only와 nonlinear reaction review-only를
eigen Value-only 요구로 삭제하지 않는다. 오래된 통과 보고서는 새 실행 evidence가 아니다.
남는 작업은 Formulation의 단일 후보 채택·positivity/변환 증명·적용 경계, NR의 독립
반례 해소·conditioning·metric·필수 case와 수치 기준, Implementation/Physics의 실제
정적/eigen 재검증이다. R07에서 새 authoritative conflict나 사용자 재결정 필요는 발견하지 않았다.
<a id="research-evidence--실행-evidence와-미실행"></a>
### 실행 evidence와 미실행
<a id="research-evidence--r1-조사-이력"></a>
#### r1 조사 이력
Read-only `Get-Content`, scoped `rg`, `Get-FileHash`로 필수 공통/Feature/기존 MITC4
문서, 실제 kernel과 원본 두 reference 파일을 읽었다. 해당 읽기·hash 명령은 exit `0`이다.
아래는 핵심 재현 진입점이다.
```powershell
Get-Content -Raw '.codex/skills/fem-research-evidence/SKILL.md'
Get-Content -Raw 'docs/mitc4-shell-feast-eigen/requirements.md'
rg -n 'PhysicalTransformation20|DrillingTransformation4|drilling_stiffness' 'src/fesa/elements/mitc4_shell.cpp'
Get-Content 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp' -Tail 52
Get-Content -Raw 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
Get-FileHash 'reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp','reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine eigenvalues.txt'
```
SHA-256은 input `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`,
TXT `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`로 P02와 같다.
설치 include에서 `rg`로 위 R04의 declarations/version/type을 확인했다. 별도
`rg -n 'MKL_INTERFACE|MKL_ILP64|lp64' cmake CMakeLists.txt`는 no-match exit `1`이며
linked ABI를 판정한 것이 아니다. Numpy/pypdf/fitz 탐색은 exit `0`, 모두 미설치였고
설치·수치 실험·외부 solver를 수행하지 않았다.
Web `search_query/open/find`로 S01–S11을 조사했다. S03 PDF는 초기 검색·열기에서
`STATIC CONDENSATION`과 Eqs.(9)–(13) 텍스트를 얻었으나 후속 부분 열기는 timeout이
발생했다. S01의 수식은 보존된 원문 transcription과 현재 승인 계약도 대조했다.
S02 author HTML, S04–S07 Intel 본문, S08 author PDF, S09–S11 공식 문서는 접근했다.
NASA PDF/일부 publisher/feastinit 개별 URL 접근 실패를 필수 근거로 사용하지 않았다.
한 차례 tool orchestration의 quote syntax 오류는 도구 실행 전 실패했으며 수정 후 검색을
수행했다. 이런 접근 실패를 구현 또는 reference comparison 성공으로 기록하지 않는다.
Owned 두 문서의 metadata/상대 링크/requirement coverage를 read-only Python here-script
(`python -B -`, `pathlib`, `re`, `urllib.parse.unquote`)로 검사했다. Exit `0`,
documents `2`, local links `21`, requirement coverage `26`, issues `0`이다.
`git diff --check`는 exit `0`이며 다른 owner의 관리문서 LF/CRLF 경고가 출력되었다.
신규 untracked 연구 문서는 별도 Python 정적 검사로 trailing whitespace·final newline·상대
링크를 확인했다. Exit `0`, files `2`, local links `21`, issues `0`이다. `git status --short`에서
연구 두 파일과 Coordinator 관리문서 변경을 구분했으며 관련 없는 파일을 수정하거나 stage하지 않았다.
CMake/CTest, Harness, FEAST runtime와 numerical reference comparison은 이
연구 단계의 범위가 아니므로 미실행이다. Source/tests/build/phase/upstream/tolerance/reference는
편집하지 않았으며 다른 owner의 변경을 되돌리지 않았다.
<a id="research-evidence--r2-bounded-조사와-정적-확인"></a>
#### r2 bounded 조사와 정적 확인
관리문서·requirements r2·기존 research 및 NR/Formulation/static 계약을 `Get-Content`와
scoped `rg`로 읽었다. 정상 조회는 exit `0`이다. 초기 `rg`의 literal `research*.md` 경로는
Windows 경로 오류였고 `rg ... docs/nonlinear-static-newton-raphson -g 'research*.md'`로
수정하여 exit `0`으로 재조회했다. 최초 patch는 context 불일치로 적용되지 않았으며 실제
문맥을 확인한 뒤 owned 두 파일에만 적용했다. Source·test·build·phase·Hook·reference와
upstream 문서는 수정하지 않았고 Git mutation은 수행하지 않았다.
Web `search_query/open/find`에서 S12 공식 source와 S13 교정된 원문 및 두 correction을
열었다. 새로 인용한 primary 사실은 그 본문에서 확인했으며 검색 요약이나 타 solver의
비공개 동작을 근거로 사용하지 않았다. S01–S11 전체를 재조사하지 않았다.
Read-only `python -B -` here-script로 두 문서의 owner/Feature/r2 metadata, final newline,
trailing whitespace, 상대 링크 실재 및 requirements matrix ID와 coverage 표의 set equality를
검사했다. Exit `0`, documents `2`, local links `32`, required/covered IDs `27`, issues `0`이다.
별도 `python -B -`에서 `subprocess.run(['git','show','HEAD:'+path],check=True)`로 기존
연구 상세를 읽고 정규식으로 R01/R02/R04/R05 절 및 S01–S11 inventory 행을 비교했다.
Exit `0`, 모든 보존 구간이 동일했다. 이는 문서 보존 확인이며 수치 검증이 아니다.
`git diff --check`는 exit `0`; LF/CRLF 정보성 경고만 있었다. `git diff`/`git status --short`로
owned 두 파일과 Coordinator의 coordination 변경을 구분했으며 타 owner 변경을 보존했다.
r2에서 reference 파일·hash 재조사, NR 반례·mass oracle 재계산, CMake/CTest, Harness,
FEAST runtime 및 정적/eigen reference comparison은 수행하지 않았다. 원본/reference 및
기존 보고서의 성공 기록을 r2의 실행 성공으로 재분류하지 않는다. 최종 파일 hash는 반환
envelope에 제공하며 본 문서 안에 자기 hash를 기록하지 않는다.