diff --git a/docs/mitc4-shell-feast-eigen/ADR.md b/docs/mitc4-shell-feast-eigen/ADR.md new file mode 100644 index 0000000..d2eca44 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/ADR.md @@ -0,0 +1,46 @@ +# MITC4 Shell Mass Matrix와 FEAST 고유치해석 결정 기록 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `coordinator-agent` +- Input contract revision: `r1` + +기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), +[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md). +문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)에 있다. + +## 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-evidence.md#중요한-결정). +- 영향: 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-evidence.md#중요한-결정)의 `MFE-OQ-002`를 해소한다. +- 경계: 두 mass variant 외부 비교 또는 사용자 선택 API를 추가 요구하지 않는다. Lumping 수식은 Research/Formulation이 계약과 evidence로 구체화한다. diff --git a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md new file mode 100644 index 0000000..ce4c4ec --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md @@ -0,0 +1,39 @@ +# MITC4 Shell Mass Matrix와 FEAST 고유치해석 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `coordinator-agent` +- Input contract revision: `r1` (requirements baseline) +- 목적: MITC4 shell의 질량행렬과 MKL FEAST 고유치해석을 입력부터 HDF5 결과와 독립 검증까지 연결한다. +- 현재 workflow 상태 원본: [coordination.md](coordination.md) + +## 기준과 지역 지침 + +[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), +[ARCHITECTURE](../ARCHITECTURE.md), [SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), +[FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md), [TOLERANCE](../TOLERANCE.md)를 읽기 전용으로 적용한다. + +사용자는 requirements부터 release-readiness까지 9개 stage의 문서·계획·구현·local 검증을 요청했다. +중요한 physics, scope, acceptance, 비호환 public contract 결정만 사용자에게 묶어서 요청한다. +일반 문서나 stage handoff의 반복 승인은 요구하지 않는다. +Reference는 `reference/shellNL-eigen-meshfine`의 기존 경로와 내용을 그대로 사용한다. +외부 reference 비교량은 고유치만이며 mode shape를 외부 acceptance로 추가하지 않는다. +내부 수학적·물리적 검증은 별도 evidence로 요구한다. 사용자 후속 요구는 consistent mass 계산 후 이를 이용한 lumped mass 계산이다. +Actual FEAST mass는 사용자 명시 승인에 따라 derived lumped mass이다. `consistent -> lumped -> FEAST` 순서와 lumped 기준 modal 검증을 유지하고 상세 lumping 수식은 owner가 evidence와 함께 정의한다. + +Specialist는 하나의 assigned stage만 수행하고 peer dispatch, workflow 전이 또는 자기 최종 승인을 하지 않는다. +각 dispatch와 Harness step은 이 폴더와 [이 문서](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md)를 필수 입력으로 명시한다. +기본 보고서는 간결하게 작성하고 긴 상세 계약은 같은 Feature 폴더에 상대 링크로 분리한다. +Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실행 및 push/tag/publish/deploy/package는 범위 밖이다. + +## 문서 목록 + +| 경로 | Owner | Revision | 검토 상태 | +| --- | --- | --- | --- | +| [FEATURED_AGENTS.md](FEATURED_AGENTS.md) | coordinator-agent | r1 | 후속 요구 반영 | +| [PRD.md](PRD.md) | coordinator-agent | r1 | 사용자 요구 요약 | +| [ADR.md](ADR.md) | coordinator-agent | r1 | 후속 결정 기록 | +| [coordination.md](coordination.md) | coordinator-agent | r1 | workflow 상태 원본 | +| [requirements.md](requirements.md) | requirement-agent | r1 | Coordinator gate pass; 26개 must 요구사항 | +| [requirements-evidence.md](requirements-evidence.md) | requirement-agent | r1 | 원본 관찰·결정·정적 evidence audit 완료 | + +아직 작성되지 않은 specialist 보고서는 목록에 승인 산출물로 등록하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/PRD.md b/docs/mitc4-shell-feast-eigen/PRD.md new file mode 100644 index 0000000..1c1669d --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/PRD.md @@ -0,0 +1,42 @@ +# MITC4 Shell Mass Matrix와 FEAST 고유치해석 PRD + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `coordinator-agent` +- Input contract revision: `r1` +- 검토 상태: requirements r1의 26개 must 요구사항 및 사용자 최종 결정 audit 완료; requirements gate pass. + +기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md). +지역 지침과 문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)를 따른다. + +## 사용자 요구 + +1. MITC4 Shell 요소의 Mass Matrix를 구현한다. +2. 고유치해석 procedure를 구현하며 고유치 계산 backend는 Intel MKL FEAST로 한다. +3. `reference/shellNL-eigen-meshfine`에 있는 모델과 결과를 검증 기준으로 사용한다. +4. 외부 reference 검증은 고유치만 비교한다. +5. Coordinator 주도 requirements부터 release-readiness까지 9개 stage를 수행하며 중요한 사안만 인터뷰·검토를 요청한다. +6. Consistent mass를 먼저 계산하고 이를 이용하여 lumped mass를 계산하며, 고유치해석에는 lumped mass를 사용한다. +7. `FESA_GTEST_SOURCE_DIR=C:\git\googletest`를 사용하고 작업 중 완료된 변경을 Git에 커밋한다. + +## 범위와 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#requirement-verification-matrix)가 소유한다. + +| Requirement IDs (`FEM-REQ-MITC4-EIGEN-`) | Acceptance 요약 및 원본 계약 | +| --- | --- | +| `001`~`004` | [원형상 procedure, 기존 shell mapping, material density와 section 연결](requirements.md#requirement-verification-matrix) | +| `005`~`008` | [질량 이산화 선택, 물리 관성, 조립, massless 좌표 admissibility](requirements.md#requirement-verification-matrix) | +| `009`~`014` | [낮은 모드, multiplicity, FEAST, 실패 처리, 내부 eigenpair 및 physics evidence](requirements.md#requirement-verification-matrix) | +| `015`~`019` | [입력 subset, 진단, HDF5, source/modal identity 및 candidate 보존](requirements.md#requirement-verification-matrix) | +| `020`~`022` | [고유치-only 외부 비교, identity 사전검사 및 common tolerance](requirements.md#requirement-verification-matrix) | +| `023`~`025` | [TDD·MSVC 검증, 기존 정적 회귀 및 동일 revision의 독립 closure](requirements.md#requirement-verification-matrix) | +| `026` | [Consistent에서 lumped 유도 및 질량·관성 불변식](requirements.md#requirement-verification-matrix) | + +Reference는 선행 preload 없는 단일 frequency step의 10모드이며 상세 관찰과 단위 의미는 +[requirements evidence](requirements-evidence.md#원본-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가 정의한다. diff --git a/docs/mitc4-shell-feast-eigen/coordination.md b/docs/mitc4-shell-feast-eigen/coordination.md new file mode 100644 index 0000000..076f965 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/coordination.md @@ -0,0 +1,105 @@ +# MITC4 Shell Mass Matrix와 FEAST 고유치해석 coordination + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `coordinator-agent` +- Contract revision: `r1` (사용자 최종 질량 요구를 반영한 requirements baseline) +- Stage: `research` +- Outcome: `pass` (requirements gate) +- Next owner: `research-agent` +- Attempt: `0` +- Completion: 미완료 +- Failure classification / retry key: `null` +- Escalation class / blocker: `null` + +기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md), +[SOLVER_AGENT_DESIGN](../SOLVER_AGENT_DESIGN.md), [FEATURE_DOCUMENTATION](../FEATURE_DOCUMENTATION.md). +문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 범위는 [PRD.md](PRD.md), 결정은 [ADR.md](ADR.md)를 따른다. + +## Gate evidence + +| Gate | Evidence | Coordinator 판정 | +| --- | --- | --- | +| intake | 사용자 요청, 공통 운영 계약 및 관리문서 4개 생성 | pass | +| requirements r0 초안 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md) | needs-user-decision; 질량 선택 미승인으로 baseline pass 보류 | +| requirements r1 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md), MFE-ADR-002/004 사용자 명시 결정 | pass; 26개 must와 owner/revision/hash 검증, 미결정 0 | + +공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다. +확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다. +Root의 시작 Git 조사에서 worktree clean을 확인했다. 구현·build/test·외부 reference comparison은 아직 실행하지 않았다. +관리문서 상대 링크 검사 결과는 `4`문서, 끊긴 local link `0`, exit code `0`이며 `git diff --check`도 exit code `0`이다. + +## 현재 bounded dispatch + +Requirement owner의 최종 r1 `pass` 반환을 Coordinator가 감사하여 requirements gate를 통과시키고 research로 전이한다. +현재 SHA-256은 `requirements.md`: `1ebe65f231e49ffc15a9a1985dcdbbb7e6fc47b9e1ddb5a76f2c2489e5982690`, +`requirements-evidence.md`: `2241ef8dacc7e07d40c731667e202bd9c104ae43b1a5f6eab4530a6831fea918`이다. +Coordinator 정적 audit은 Feature 6문서, 끊긴 local link 0, must rows/unique IDs `26/26`, exit code `0`; `git diff --check` exit code `0`이다. +Research owner는 승인된 consistent→lumped→FEAST, 물리 관성·massless drilling·제약·최저 모드 완전성 및 독립 verification의 primary-source evidence를 수집한다. +연구 계약은 다음 stage의 수식을 대신 승인하지 않는다. Reference 비교량, tolerance 및 사용자 mass 선택은 변경하지 않는다. + +### Requirements 이력 + +2026-09-06 사용자 후속 답변을 수신했다. Consistent mass를 계산하고 이를 이용한 lumped mass도 계산한다는 요구로 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)를 갱신했다. +`r1` 입력을 Requirement owner에게 반환하여 양자택일 초안과 matrix를 수정하고 actual FEAST mass/lumping 의미의 중요 미결정 여부를 확인한다. +Requirement owner는 두 mass의 계산 관계만으로 FEAST의 실제 `M`이 유일하게 결정되지 않는다고 판단했다. +[MFE-ADR-004](ADR.md#mfe-adr-004--feast에-사용하는-질량행렬)에 derived lumped 사용 권고와 consistent 사용 대안, spectrum·residual 영향 및 질문을 기록하고 Root에 전달했다. +Detailed lumping 수식은 Research/Formulation이 담당하며 현재 질문은 FEAST 사용 질량 한 건이다. +같은 날 사용자 명시 답변으로 `consistent mass -> lumped mass -> 고유치 해석` 순서와 FEAST의 lumped mass 사용이 확정되었다. +`MFE-OQ-001`과 `MFE-OQ-002`는 해소되었으며 Requirement owner에게 r1 baseline 확정과 pass 검토 요청을 전달했다. +FEAST 및 내부 modal residual/normalization/orthogonality는 사용된 lumped `M`을 기준으로 한다. 같은 선택에 대한 재질문은 하지 않는다. +아래 r0 기록은 이력이며 현재 승인을 뜻하지 않는다. r0 requirements 결정 항목은 stale이고 후속 stage 산출물은 아직 없다. + +Requirement Agent는 r0 입력에서 요구사항과 검증 matrix, reference 관찰 사실 및 중요한 미결정 사항을 작성한다. +질량 정식화나 reference 해석 의미를 승인으로 추정하지 않으며 질문이 필요하면 선택지·영향·권고를 하나로 묶어 Coordinator에게 반환한다. +일반 문서·계획·local 실행은 사용자 요청으로 승인되었으며 반복적인 stage 승인을 추가하지 않는다. + +Requirement owner의 중간 조사에서 단일 `Step-2`의 `nlgeom=NO, perturbation`, `*Frequency` 요청 `10`모드, +선행 정적 step·하중·preload 없음이 확인되었다. 이 관찰은 무하중 원형상 procedure 의미를 뒷받침하며 최종 requirements 보고서에서 추적한다. +`Value`와 `Freq(cycles/time)`가 별도로 있는 원본 txt는 Mode `1..10`을 포함한다. 수치 비교는 아직 수행하지 않았다. + +Requirement owner는 `consistent mass`와 `nodal lumped mass`가 유한 mesh의 고유치·운동에너지 의미를 달리하는 critical 선택임을 반환했다. +[MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)의 권고/대안/영향을 Root에 전달하여 사용자에게 하나의 질문으로 요청한다. +Requirements 기본·상세 보고서 2개의 owner `requirement-agent`, input revision `r0`를 확인했다. +Coordinator 정적 audit: 전체 Feature `6`문서, 끊긴 local link `0`, must matrix `25`행 및 고유 ID `25`, exit code `0`. +원본 reference 2개 SHA-256이 specialist 기록과 일치했다. Requirements 초안은 질량 선택 대기를 명시하며 연구 이후 gate의 빈 보고서는 없다. +기본 보고서 SHA-256: `8d5fbcb8ba2c2bd25d736418450b1b69e7aba7a84c8370d6e2a89e4e259daa66`. +상세 보고서 SHA-256: `85ee91dd745f74cc65ef8e660227465a8fa5ad302e639a51464d0ba31f449d22`. +결정에 의존하는 baseline pass 및 다음 stage는 보류한다. 응답 수신 뒤 Requirement owner가 승인 선택을 반영하고 Coordinator가 revision과 gate를 다시 감사한다. + +## 후속 실행 준비 관찰 + +후속 사용자 지정 `FESA_GTEST_SOURCE_DIR=C:\git\googletest`에 대해 Root가 `CMakeLists.txt` 존재를 확인했다. +Root는 다른 dependency·Harness 환경을 별도로 조사하며 완료 문서 checkpoint와 사용자 수정 `AGENTS.md` 커밋을 담당한다. +실제 implementation 실행 전 환경 준비와 configure/build/test 성공이 필요하며 아래 과거 Stop failure를 소급 변경하지 않는다. +사용자 수정 `AGENTS.md`의 경로 예시 한 줄은 Root가 `fab168b` (`docs: document local GoogleTest source path`)로 커밋했다. +Root read-only 환경 조사에서 다음 설치 경로를 확인했다. 이 목록은 설치 존재 evidence이며 configure/build/test 성공은 아니다. + +| 항목 | 확인 경로 | +| --- | --- | +| GoogleTest | `C:/git/googletest` | +| MKL CMake config | `C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl` | +| TBB CMake config | `C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb` | +| HDF5 CMake config | `C:/Program Files/HDF_Group/HDF5/2.1.1/cmake` | +| Ninja executable | `C:/Program Files/Microsoft Visual Studio/18/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe` | + +VS `18/Community` DevShell script/dll이 존재하며 Ninja는 현재 PATH에 없다. Planning/Executor는 각 실행 subprocess의 MSVC x64 Developer 환경과 dependency 환경을 명시해야 한다. +Root는 global environment, Hook state/code를 변경하지 않았다. + +현재 `.harness/config.json`은 없고 preset과 `.harness/config.example.json`은 있다. +Planning은 자동 감지 결과와 승인 MSVC preset을 대조하여 실행명령 및 Hook backend를 명시해야 한다. +`scripts/execute.py`의 preflight는 selected phase 제어 파일 외의 dirty 경로를 거부한다. +따라서 구현 실행 전에 Feature 문서 baseline과 Executor의 path-scoped Git 처리 경계를 Planning에서 구체화한다. +이 관찰은 환경 실패 판정이나 별도 사용자 승인 요청이 아니다. + +Root가 전달한 자동 Stop hook configure 실패는 별도의 실제 환경 evidence로 보존한다. +실행 명령은 `C:/Program Files/CMake/bin/cmake.exe -S C:/Users/baram/orca/workspaces/FESADev/Eigen -B C:/Users/baram/orca/workspaces/FESADev/Eigen/.harness/build -A x64`, exit code `1`이며 +`cmake/FesaDependencies.cmake:9`에서 `FESA_GTEST_SOURCE_DIR` 미설정을 보고했다. +Root의 read-only 원인 조사에서 현재 process의 `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`가 모두 미설정이고, +자동 감지는 `Visual Studio 18` generator를 사용하며 local config가 없어 승인 Ninja/MSVC preset과 맞지 않음이 확인되었다. +수동 Hook·CMake·CTest 재실행, config 변경 또는 Hook state 조작은 하지 않았다. +현재 requirements gate의 critical 질량 선택과 별개로 Implementation Planning에서 dependency 경로·설정된 backend를 준비하고 검증해야 한다. +이 실패를 build/test 통과로 보고하거나 현 단계의 미실행 검증을 대체하는 증거로 사용하지 않는다. + +## Retry 기록 + +Correction 및 implementation rerun 사용 이력 없음. Transport attempt와 별도로 관리한다. diff --git a/docs/mitc4-shell-feast-eigen/requirements-evidence.md b/docs/mitc4-shell-feast-eigen/requirements-evidence.md new file mode 100644 index 0000000..8650544 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/requirements-evidence.md @@ -0,0 +1,159 @@ +# MITC4 eigen 요구사항의 관찰 evidence와 결정 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `requirement-agent` +- Input contract revision: `r1` +- 기본 보고서: [requirements.md](requirements.md) +- 관찰일: `2026-09-06` + +## 원본 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 : Value = Freq = (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 계약은 바꾸지 않는다. + +## 중요한 결정 + +### 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를 보존 조건으로 추가하지 않는다. + +### MFE-OQ-002 — FEAST와 reference baseline의 질량: 해결 + +- 상태: **사용자 명시 결정으로 해결**. +- 관련 요구사항: `FEM-REQ-MITC4-EIGEN-008`, `011`, `013`, `017`, `020`. +- Owner: user가 사용 질량을 결정; Research/Formulation이 근거와 수식, + 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가 반환한다. + +## 질문 없이 정리한 사항 + +- 무하중 원형상·비감쇠 해석은 실제 단일 `*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 검토를 별도 사용자 승인 질문으로 만들지 않는다. + +## 공개 근거 + +다음은 `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가 정의한다. + +## 실행 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`을 추가했다. 중요한 미결정은 없고 상세 lumping 수식·수치 기준은 후속 owner 소유이다. + +변경한 경로는 기본 보고서와 이 상세 보고서 두 개뿐이며 관리문서, source, tests, phase, +공통 정책과 reference artifact는 편집하지 않았다. 정적 링크·필수 metadata·ID/matrix 검사를 +완료한 명령과 결과는 Requirement Agent 반환 evidence로 함께 보고한다. diff --git a/docs/mitc4-shell-feast-eigen/requirements.md b/docs/mitc4-shell-feast-eigen/requirements.md new file mode 100644 index 0000000..c228162 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/requirements.md @@ -0,0 +1,126 @@ +# MITC4 Shell Mass Matrix와 FEAST 고유치해석 요구사항 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `requirement-agent` +- Input contract revision: `r1` +- 검토 상태: consistent→lumped→FEAST 사용자 확정 요구 반영; requirements 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-evidence.md)에 둔다. + +## 핵심 결과와 범위 + +지정된 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 의미를 재사용한다. +- 활성 재료마다 양의 유한한 일정 체적 밀도를 해석 모델에 연결한다. 질량은 병진과 + 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에 포함하지 않는다. + +## 의미·단위·소유권 + +| 항목 | 요구되는 의미와 경계 | +| --- | --- | +| 질량 입력 | `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 결과로 재사용해서는 안 된다. + +## Requirement Verification Matrix + +모든 행은 `must`이고 acceptance는 해당 행의 요구와 검증 조건을 모두 만족하는 것이다. +출처 `U`는 [Feature PRD](PRD.md)의 사용자 요구, `R`은 [관찰 evidence](requirements-evidence.md), +`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 의미를 유지해야 한다. | 동일 모델의 source type만 변경한 경우 같은 질량·고유치 경로와 별도 source metadata; mapping/kernel 테스트 | 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 좌표 처리는 FEAST의 admissible matrix 조건을 만족시키면서 선택된 질량의 유한 물리 spectrum을 보존해야 한다. | Formulation의 좌표 처리 전후 spectrum·경계조건 보존과 admissibility 검사 통과; consistent→lumped의 spectrum 동일성을 뜻하지 않음. 임의 mass floor, diagonal epsilon, eigenvalue clamp 금지 | P, L, R; 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 | 두 질량 계산과 선택된 질량의 eigen 해석은 symmetry, kinetic-energy, coordinate invariance, rigid-body 및 density scaling evidence를 제공해야 한다. | 각 질량의 독립 oracle·invariant suite와 작은 analytical/manufactured case 통과; 선택된 spectrum의 density scaling 검사. Lumping이 모든 속도장의 consistent energy를 그대로 보존한다고 가정하지 않음; NR가 기준 확정 | U r1, 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 `_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는 기존 `_log.txt` 독립 lifecycle 유지 | P, N; Formulation, I/O, Planning | +| FEM-REQ-MITC4-EIGEN-020 | 외부 검증은 지정 원본 TXT의 `Value` 고유치만 derived lumped mass로 계산한 FESA HDF5 고유치와 비교해야 한다. | 같은 지정 `.inp`, 기존 TXT 경로 그대로 사용; Mode 1~10 포함. 두 질량 중 결과가 가까운 쪽을 사후 선택하지 않음. `Freq`, 변위·회전·stress·reaction·mode shape를 추가 외부 gate로 사용하지 않음 | U r1, 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 | 기존 선형·비선형 정적 procedure의 입력·출력·수치 계약을 보존해야 한다. | 승인된 회귀 suite와 영향받은 reference 검증; 기존 model에 density가 없다고 정적 해석을 새로 거부하지 않음 | P, L, N; Planning, Implementation | +| 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 | + +## 결정과 handoff + +`MFE-OQ-001`은 사용자 후속 결정으로 해결되었다. Consistent를 계산하고 이로부터 lumped를 +계산하므로 두 계산은 모두 필수다. 기존 양자택일 요구는 대체되었다. +`MFE-OQ-002`도 사용자 명시 결정으로 해결되었다. **Consistent→lumped→FEAST** 흐름을 +사용하며 external eigenvalue baseline과 내부 residual·normalization·orthogonality는 +동일 lumped mass에 대응한다. [사용자 결정 근거](requirements-evidence.md#중요한-결정)를 따른다. +현재 requirements의 중요한 미결정은 없다. + +Research/Formulation은 consistent→lumped 유도 및 각 관성 불변식, lumped 질량과 massless drilling, supported global +constraints의 양립, 실제 FEAST admissibility와 낮은 모드 추출의 완전성을 다룬다. +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은 수행하지 않았으며 통과로 보고하지 않는다.