docs: finalize eigen2 io contract and review evidence
This commit is contained in:
@@ -63,3 +63,12 @@
|
||||
- 결정: [내부 controls](numerical-review-controls.md)와 [27개 사례](numerical-review-cases.md)를 적용한다. 초기 enclosing count 재시도는 최초 포함 3회, 이후 lower endpoint 고정·upper search·전체 count/solve 유한 한계를 명시했다. B=0의 시작 구간은 (-1,1)로 고정했다.
|
||||
- 외부 비교: 원본 TXT의 literal modal frame과 유일한 source Step-2를 [reference-model](reference-model.md)에 대응한다. 같은 frame 규칙에 따라 10개 singleton Value blocking family를 정의하고 공통 행 5%·RMS 1% 정책을 그대로 적용한다. 이번 양수 singleton의 실효 각 Value 한계는 RMS 1%다.
|
||||
- 영향·한계: 확인된 수학 차단 이슈 없이 I/O 정의를 진행할 수 있다. 이 판정은 구현·실제 FEAST·정적 회귀·외부 비교·Physics·release 통과가 아니다. Runtime count/cluster/ABI/workspace와 메모리 검증은 후속 필수 evidence다.
|
||||
|
||||
## MFE2-ADR-008 — Eigen I/O의 additive 계약과 이번 작업 종료
|
||||
|
||||
- 상태: 요청 범위의 I/O 정의 완료 및 메인 계약 대조 완료, 2026-09-08. Owner: io-definition-agent; 기록: 메인 assistant.
|
||||
- 결정: [I/O](io.md)의 source density/Frequency/동차 BC·정확한 no-op allowlist를 사용한다. 기존 static schema0/1을 보존하고 eigen discriminator `(schema_version=0, feature_id=mitc4-shell-feast-eigen2, analysis_procedure=linear-frequency, eigen_schema_version=1)`를 추가한다.
|
||||
- Identity: storage Step-1과 source Step-2를 구분한다. 공개 N개 scalar/global normalized vectors와 전체 c개 validation evidence를 분리한다. 원본 TXT Value만 source modal frame에 직접 대응하며 외부 mode-shape gate를 추가하지 않는다.
|
||||
- 이유: 실제 parser·model·writer의 현재 경계를 보존하면서 새 procedure의 input/result 의미를 명확히 하기 위함이다. Candidate self-check·final 교체와 별도 live log lifecycle을 유지한다.
|
||||
- 승인 경계: 이미 승인된 새 eigen procedure의 상세 schema 정의이며 기존 static 호환성·물리·외부 tolerance 변경은 없다. 일반 routine 정의에 반복 사용자 승인 gate를 추가하지 않는다.
|
||||
- 종료: 요청한 네 문서 작업을 시간 제한 안에 마친다. 링크·ID·coverage·소스 대조·diff 정적 확인과 독립 수학 oracle를 evidence로 남기고, 구현·실제 solver/reference/physics 실행은 미실행으로 기록한다. 새 Feature 변경만 커밋하고 기존 사용자 변경은 보존한다.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
- Feature ID: `mitc4-shell-feast-eigen2`
|
||||
- Owner: 메인 assistant
|
||||
- Requirement baseline revision: `r1`
|
||||
- 현재 작업: requirement r1을 기준으로 research → formulation → numerical-review → io-definition을 진행한다. 구현·solver 실행 검증은 포함하지 않는다.
|
||||
- 현재 작업: requirement r1을 기준으로 research → formulation → numerical-review → io-definition 문서 작업을 완료했다. 구현·solver 실행 검증은 후속 의무다.
|
||||
- 목적: MITC4 질량행렬과 FEAST 고유진동 해석의 요구사항을 이론·수학·수치 검토·입출력 계약으로 구체화한다.
|
||||
- 현재 checklist: [PRD](PRD.md#현재-checklist).
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
- 기존 `docs/mitc4-shell-feast-eigen/`의 현재 worktree 문서는 읽기 전용 참고 자료다. 일부 r3 기록은 미커밋 상태이므로 HEAD의 내용과 동일하다고 가정하지 않는다.
|
||||
- 기존 명시 사용자 요구와 물리·검증 의도는 출처를 연결하여 정리한다. 과거 agent stage, phase 상태, 수치 검토 통과와 환경 복구 기록은 새 작업의 승인·실행 evidence가 아니다.
|
||||
- 전문 보고서의 수행·미실행은 해당 작업 시점의 기록이다. 현재 완료 상태는 PRD checklist가 소유하며 requirement-only 시점의 미실행 기록을 이후 전문 검토의 부재로 해석하지 않는다.
|
||||
- 새 요구사항은 `FEM-REQ-MITC4-EIGEN2-###` ID를 사용한다. 기존 ID는 추적용 대응 관계에만 남긴다.
|
||||
- Requirement는 관찰 가능한 동작·범위·검증 의도를 소유한다. 특정 lumping/축소 수식, FEAST parameter, HDF5 layout, 수치 threshold는 새로 결정하지 않는다.
|
||||
- `reference/temp` 예제는 원본·옛 경로·복사본·cache를 통해서도 검증에 사용하지 않는다. 제외 목록은 requirements의 원본 정의를 따른다.
|
||||
@@ -34,5 +35,6 @@
|
||||
| [research.md](research.md), [research-evidence.md](research-evidence.md) | research-agent | 일차 출처·적용 판단·검증 후보·미해결 근거 |
|
||||
| [formulation.md](formulation.md), [질량·stabilization](formulation-mass-stabilization.md), [eigen](formulation-eigen.md) | formulation-agent | 구현 가능한 수학 계약·기존 유도 채택 경계 |
|
||||
| [numerical-review.md](numerical-review.md), [evidence](numerical-review-evidence.md), [controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [reference-model](reference-model.md) | numerical-review-agent | 독립 수학 검토·실제 검산·수치 기준·검증 사례·외부 비교 의미 |
|
||||
| [io.md](io.md), [input](io-input.md), [schema](io-schema.md), [mapping](io-mapping.md) | io-definition-agent | 입력·진단·내부 소유권·영속 결과·비교 projection 계약 |
|
||||
|
||||
반환은 결과·변경 파일·정적 확인·미해결 항목으로 충분하다. Git 경로 선택·커밋과 최종 결과 확인은 메인이 수행한다.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
- Feature ID: `mitc4-shell-feast-eigen2`
|
||||
- Owner: 메인 assistant
|
||||
- Requirement baseline revision: `r1`
|
||||
- 상태: requirement baseline r1 완료. 후속 요청에 따라 research부터 io-definition까지 진행 중이며 solver 구현·실행 검증은 미실행이다.
|
||||
- 상태: requirement r1에 이어 research·formulation·독립 numerical review·io-definition 문서 작업 완료. Solver 구현·실행 검증은 미실행이다.
|
||||
|
||||
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md),
|
||||
[공통 ADR](../ADR.md#adr-028). 지역 지침은 [FEATURED_AGENTS](FEATURED_AGENTS.md),
|
||||
@@ -65,7 +65,19 @@ solver build/test·reference 비교와 release 감사는 포함하지 않는다.
|
||||
- [x] Research: [연구](research.md)와 [근거](research-evidence.md)에 일차 출처·질량/축소/stabilization 후보 및 실제 runtime 확인이 필요한 FEAST 두 항목을 기록했다.
|
||||
- [x] Formulation: [정식화](formulation.md)에 질량·공변 stabilization·constraint-first 축소·FEAST·복구 수학 계약을 작성했다. 독립 numerical review는 별도 항목이다.
|
||||
- [x] Numerical review: [독립 검토](numerical-review.md)는 `pass-for-io-definition`이다. 새 수학 oracle 2개와 27개 verification cases, 내부 controls 및 Value-only reference family를 정의했다. 실제 solver 검증은 미실행이다.
|
||||
- [ ] I/O definition: 입력·진단·결과 schema·reference mapping 계약을 정의한다.
|
||||
- [ ] 신규 문서의 링크·계약 일관성과 변경 범위를 확인하고 단계별 변경을 커밋한다.
|
||||
- [x] I/O definition: [I/O 계약](io.md)에 입력·진단·additive eigen schema·source step/mode mapping·실패 보존과 검증 의무를 정의했다.
|
||||
- [x] 신규 문서의 링크·계약 일관성, 27개 요구사항의 NR/I/O coverage와 변경 범위를 정적으로 확인하고 단계별 변경을 커밋한다.
|
||||
|
||||
이 checklist는 문서 작업 상태다. Solver 구현·실제 FEAST 실행·회귀 및 외부 reference 비교의 통과를 뜻하지 않는다.
|
||||
|
||||
## 이번 결과와 남은 실행 의무
|
||||
|
||||
Research부터 I/O까지 요청한 문서 작업과 독립 수학 검산을 30분 제한 안에 완료했다.
|
||||
19개 Feature 문서의 링크·UTF-8·diff와 27개 요구/검증 case identity·coverage를 확인했다.
|
||||
기존 Feature/phase의 사용자 변경 16개는 보존했다. Source·test·config·reference는 변경하지 않았다.
|
||||
|
||||
다음 작업의 입력은 [정식화](formulation.md), [독립 검토](numerical-review.md),
|
||||
[controls](numerical-review-controls.md), [cases](numerical-review-cases.md), [I/O](io.md)다.
|
||||
Density/Frequency semantic·mass/FEAST·eigen state/writer 구현, 실제 backend의 count/cluster/
|
||||
workspace/ABI 확인, MSVC build/test와 남는 static·eigen reference 및 물리 검증은 미실행이다.
|
||||
Pressure 제외 예제의 fresh 외부 coverage 부재도 유지한다. 이 후속 실행은 이번 작업에 포함하지 않는다.
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
# MITC4 eigen 입력·진단 계약
|
||||
|
||||
- Feature ID: `mitc4-shell-feast-eigen2`
|
||||
- Owner: `io-definition-agent`
|
||||
- Contract revision: `r1`
|
||||
- 기본 보고서: [io.md](io.md)
|
||||
|
||||
## 문법과 기존 지원 범위
|
||||
|
||||
기존 [shell 입력](../linear-static-mitc4-shell/io.md#1-abaqus-input-scope)과
|
||||
[후속 lexical 계약](../shell-surface-pressure-load/io.md)을 유지한다. 현재
|
||||
[input_reader.cpp](../../src/fesa/io/abaqus/input_reader.cpp)와
|
||||
[domain_mapping_context.cpp](../../src/fesa/io/abaqus/domain_mapping_context.cpp)를 대조했다.
|
||||
LF/CRLF, 종결자 제외 physical line 256 ASCII bytes, printable ASCII/tab, blank와 `**`
|
||||
comment, keyword parameter continuation은 기존 규칙을 따른다. Inline comment, data
|
||||
continuation, include/substitution/quoted name을 추가하지 않는다. Keyword·parameter·enum·
|
||||
name lookup은 ASCII case-insensitive이며 raw spelling/physical source line은 보존한다.
|
||||
Duplicate parameter는 같은 값이어도 실패한다. Comma split은 빈 field를 보존한다.
|
||||
|
||||
Eigen model의 순서는 `HEADING? PREPRINT? PART+ ASSEMBLY MATERIAL+ BOUNDARY* STEP EOF`다.
|
||||
Part 내부 NODE→ELEMENT→sets→SHELL SECTION, assembly의 identity INSTANCE와 explicit-instance
|
||||
sets, forward section→material lookup은 기존 shell 범위다. `S4`와 `S4R`는 source type만
|
||||
구별하고 같은 FESA MITC4 kernel에 대응한다. Node/element positive int64 source label,
|
||||
instance/name scope, element 네 distinct nodes, section 유일 할당, geometry-derived director,
|
||||
centered finite thickness>0, homogeneous isotropic `E>0,-1<nu<0.5` 검증은 기존 계약 그대로다.
|
||||
`*SHELL SECTION`의 optional positive integration-point integer는 기존 명시 예외로
|
||||
warning 없이 읽고 물리 integration을 바꾸지 않는다. 새 mass integration은 formulation 권위다.
|
||||
|
||||
Model/history의 허용 keyword는 기존 topology/material의 `HEADING,PART,END PART,NODE,
|
||||
ELEMENT,NSET,ELSET,SHELL SECTION,ASSEMBLY,END ASSEMBLY,INSTANCE,END INSTANCE,MATERIAL,
|
||||
ELASTIC,BOUNDARY`와 아래 DENSITY/STEP/FREQUENCY/no-op 목록뿐이다. Assembly ELSET의 기존
|
||||
`INTERNAL` flag도 보존한다. 기존 static의 load·output 범위를 이 eigen allowlist로 축소하지 않는다.
|
||||
|
||||
## Density
|
||||
|
||||
`*DENSITY`는 current MATERIAL 안에서 parameter 없이 최대 한 번, 정확히 한 data row를
|
||||
갖는다. `rho` 또는 `rho,`만 허용한다. 뒤의 빈 temperature slot은 constant 값이며 원본
|
||||
`2700.,`를 그대로 수용한다. Nonempty temperature, 추가 field/comma/row, `DEPENDENCIES=0`을
|
||||
포함한 모든 parameter와 distribution은 거부한다. ELASTIC과 DENSITY의 상대 순서는 자유다.
|
||||
|
||||
새 rho의 C-locale token은 아래 full-match이고 binary64 full conversion을 요구한다.
|
||||
|
||||
```text
|
||||
number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?
|
||||
```
|
||||
|
||||
Hex/D exponent/locale comma/잘못된 token은 input 오류다. NaN/Inf spelling은 아래 model
|
||||
nonfinite 진단으로 분류하며 허용 token이 아니다. Overflow/underflow conversion error,
|
||||
nonfinite, `rho<=0`는 invalid material이다. 모든 활성 `element→section→material→rho`가
|
||||
정확히 하나로 결정되어야 한다. 누락값·다른 material·global 평균으로 대체하지 않는다.
|
||||
사용하지 않은 material에 선언된 density도 문법·양성 검증한다. 필수 존재 조건은 활성 material에
|
||||
적용한다. 단위는 `mass/length^3`, 사용자 일관 단위계이며 자동 SI 추론·변환은 없다.
|
||||
|
||||
Density 허용은 새 eigen procedure에 한정한다. 기존 static 입력 지원을 확장하거나 density를
|
||||
필수화하지 않는다. Procedure 확인 전 raw material을 보존한 뒤 해당 procedure로 검증한다.
|
||||
|
||||
## Step와 Frequency
|
||||
|
||||
`*STEP`은 정확히 하나이며 optional `NAME`, `NLGEOM=NO`, value 없는 `PERTURBATION`만
|
||||
허용한다. Data는 없다. 생략 NLGEOM은 NO, 생략 NAME은 source `Step-1`이다. FREQUENCY가
|
||||
원형상 무응력 linear perturbation procedure를 결정하므로 PERTURBATION 생략도 같은 의미다.
|
||||
Raw/canonical name과 flag presence를 보존한다. Storage `Step-1`과 source `Step-2`는 별개다.
|
||||
`NLGEOM=YES`, INC, 선행/다중 step, 다른 procedure와 step description은 거부한다.
|
||||
|
||||
| FREQUENCY parameter | 허용/생략 default | FESA 의미 |
|
||||
| --- | --- | --- |
|
||||
| `EIGENSOLVER` | `LANCZOS` / LANCZOS | 실제 MKL FEAST 사용; 항상 `source-eigensolver-mapped-to-feast` warning |
|
||||
| `SIM` | flag 또는 `YES` / YES | Source option만 보존; 명시되면 `source-sim-option-not-applied` warning |
|
||||
| `ACOUSTIC COUPLING` | `ON` / ON | Structural-only 모델에서 적용 대상 없음; 명시되면 `acoustic-option-inapplicable-structural-only` warning |
|
||||
| `NORMALIZATION` | `MASS` / MASS | 실제 derived lumped mass로 normalization |
|
||||
|
||||
SIM=NO, DISPLACEMENT normalization, AMS/SUBSPACE/FEAST enum, coupling OFF/PROJECTION,
|
||||
RESIDUAL MODES, DAMPING PROJECTION, PROPERTY EVALUATION, NSET와 모든 미열거 parameter는
|
||||
실패한다. Acoustic 요소/ASI/TIE/coupling 정의가 존재하면 ON no-op을 적용하지 않고 실패한다.
|
||||
|
||||
FREQUENCY data는 한 physical row, 1~7 comma fields다. 첫 field N은 `[0-9]+`, checked
|
||||
positive int64이며 나머지 존재하는 fields는 전부 empty여야 한다. Fields 2~7은 source의
|
||||
minimum/maximum frequency, shift, block size, Lanczos step count, acoustic range factor 자리다.
|
||||
빈칸은 unspecified이며 숫자0이 아니다. Nonempty0도 실패하고 eighth empty field도 실패한다.
|
||||
원본 `10, , , , ,`는 6 fields, N=10이다. Bounds/shift/FEAST controls는 사용자 입력 기능으로
|
||||
추가하지 않는다. `N>finite_dimension`과 빈 finite system은 equation 구성 뒤 model 실패다.
|
||||
|
||||
공개 Abaqus convention의 근거는 [FREQUENCY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-frequency.htm),
|
||||
[DENSITY](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-density.htm),
|
||||
[STEP](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-step.htm)이다.
|
||||
2026-09-08 직접 확인했다. 위 allowlist와 warning은 FESA의 지원 차이이며 Abaqus algorithm·
|
||||
SIM·parser 내부 구현의 동등성을 주장하지 않는다.
|
||||
|
||||
## Homogeneous BC와 result-neutral allowlist
|
||||
|
||||
BOUNDARY는 model 또는 FREQUENCY 뒤/output 앞에 parameter 없이
|
||||
`target,first,last[,value]`로 둔다. `1<=first<=last<=6`; value 생략은 exact0, 명시 value는
|
||||
finite exact0만 허용한다. 빈 fourth field는 생략으로 보지 않는다. 기존 bare source label 또는
|
||||
unambiguous node-set resolver와 assembly INSTANCE binding을 사용한다. 새로운 dotted target,
|
||||
local/tangent BC, MPC를 추가하지 않는다. Model BC→step BC 순서의 zero constraint union이며
|
||||
같은 zero 재선언은 같은 constraint다. Nonzero를 상쇄·override해서 통과시키지 않는다.
|
||||
Global DOF는 `UX,UY,UZ,URX,URY,URZ`; partial rotation BC를 그대로 유지한다.
|
||||
|
||||
| Keyword | 정확한 조합·위치; 모두 data 없음 |
|
||||
| --- | --- |
|
||||
| PREPRINT | Optional top-level, ECHO=NO,MODEL=NO,HISTORY=NO,CONTACT=NO 네 개 |
|
||||
| RESTART | FREQUENCY/BC 뒤, WRITE flag와 FREQUENCY=0 |
|
||||
| OUTPUT | FREQUENCY/BC 뒤, FIELD 또는 HISTORY flag 하나, optional VARIABLE=PRESELECT |
|
||||
| NODE OUTPUT | 활성 OUTPUT FIELD 아래, VARIABLE=PRESELECT |
|
||||
| ENERGY OUTPUT | 활성 OUTPUT HISTORY 아래, VARIABLE=ALL |
|
||||
|
||||
Parameter 순서는 자유이며 duplicate/extra parameter는 실패한다. OUTPUT root/RESTART/END STEP은
|
||||
이전 output scope를 닫는다. 모든 허용 no-op keyword마다 `ignored-input-keyword` warning과
|
||||
`mandatory-eigen-output-unchanged` 이유를 기록한다. 선택·억제·restart state를 생성하지 않는다.
|
||||
Unknown output variable row/child, restart READ/nonzero frequency는 실패한다.
|
||||
|
||||
어떤 위치의 CLOAD/DLOAD/DSLOAD(값0 포함), initial state/stress/temperature, damping,
|
||||
amplitude, acoustic/beam/solid/mixed model, concentrated/nonstructural mass, composite/offset/
|
||||
variable thickness, contact/MPC/TIE, transform/orientation/explicit director, surface 등 의미 있는
|
||||
미지원 입력은 fail-closed다. 이름 `shellNL` 또는 `Step-2`에서 preload를 추정하지 않는다.
|
||||
|
||||
## 진단
|
||||
|
||||
기존 record `severity,code,file,line,keyword,entity_identity,message`와 CLI category를 유지한다.
|
||||
File은 absolute lexical normalized path, line은 1-based; entity에 source instance/material/
|
||||
element/node/step와 DOF 또는 field ordinal을 연결한다. Backend 오류도 Frequency 위치를 붙인다.
|
||||
Warnings는 기존 SortDiagnostics와 same-key discovery order다. Fatal은 첫 원인을 유지하고
|
||||
후속 solve/commit을 중단한다. 수치값은 round-trip decimal로 보고하며 임의 tolerance를 붙이지 않는다.
|
||||
|
||||
| 실패 | Code | Exit |
|
||||
| --- | --- | --- |
|
||||
| Lexical/arity/duplicate parameter/unresolved | 해당 기존 code: invalid-input-character, input-line-too-long, invalid-data-arity, duplicate-entity, unresolved-reference 등 | 3 |
|
||||
| Density scope/malformed data/options/duplicate | invalid-density-data / unsupported-density-option / duplicate-density | 3 |
|
||||
| Active rho missing / nonfinite·nonpositive·conversion range | missing-material-density / invalid-material-density | 4 |
|
||||
| Frequency options/count/data | unsupported-frequency-option / invalid-frequency-data | 3 |
|
||||
| Multiple/preload/other procedure | unsupported-analysis-procedure | 3 |
|
||||
| Nonzero prescribed BC | unsupported-eigen-boundary | 3 |
|
||||
| Other unsupported model semantics | unsupported-keyword / unsupported-element-formulation / unsupported-mixed-element-model | 3 |
|
||||
| Existing geometry/material/section invalid | 기존 model code; 새 mass point 오류 invalid-shell-mass-geometry | 4 |
|
||||
| Empty finite system / N>n | empty-eigenproblem / insufficient-finite-modes | 4 |
|
||||
| Mass-space/conditioning/backend/numerical failure | [mapping의 solver diagnostics](io-mapping.md#실패와-공개-lifecycle) | 5 |
|
||||
| Log/candidate/self-check/finalization | 기존 output category | 6 |
|
||||
|
||||
Usage2/success0와 stderr escaping은 기존 공통 CLI 계약이다. 지원되는 입력의 conditioning
|
||||
실패를 input subset 축소나 인공 mass/zero clamp로 우회하지 않는다.
|
||||
@@ -0,0 +1,128 @@
|
||||
# MITC4 eigen 내부 mapping·reference projection
|
||||
|
||||
- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r1`.
|
||||
- 기본 보고서: [io.md](io.md). 수학 원본: [formulation-eigen](formulation-eigen.md).
|
||||
|
||||
## 내부 소유권과 identity
|
||||
|
||||
| Owner | 필수 의미와 mapping |
|
||||
| --- | --- |
|
||||
| ParsedInput | 실제 input bytes의 기존 content identity, lexical path, keyword/parameter presence·raw 값·빈 data slot·source line |
|
||||
| Domain | 전체 geometry/source topology, section→material→constant rho, 원형상 director, homogeneous BC, sole Frequency definition; 파싱 후 가능한 불변 |
|
||||
| Frequency definition | source step raw/canonical name, step/Frequency/data 위치, requested N, 각 option의 explicit presence/effective value, no-op warning inventory; storage Step-1과 구별 |
|
||||
| AnalysisModel | Domain보다 짧은 수명의 활성 shell/material/section/BC/procedure const non-owning view |
|
||||
| DofManager | Source node×고정 6 DOF, full/free/constrained injection, stable equation IDs/scatter/sparse pattern; Node/Element에 equation ID를 저장하지 않음 |
|
||||
| Assembly/procedure | 실제 consistent moment→derived lumped→개선 K, 같은 source scatter/reduction; E1~E7의 constraint-first split·whitening·FEAST·복구·all-c validation |
|
||||
| Private backend | Vendor CSR/index/workspace/FEAST control·runtime·call evidence; MKL type/header를 public core에 노출하지 않음 |
|
||||
| Eigen state | Candidate/accepted 분리, N개의 paired raw scalar/global vectors, source mapping, c개 validation evidence; static/Newton state를 mode count로 재사용하지 않음 |
|
||||
| ResultsWriter | Validated state serialization→closed candidate self-check→final replacement; 물리값·identity 재계산/보정으로 실패를 숨기지 않음 |
|
||||
|
||||
Source `(instance_name,numeric source label)`과 raw spelling, internal model row, free equation
|
||||
index, FEAST column, sorted rank, public mode ID는 별개다. Instance expansion/declaration의 기존
|
||||
model 순서와 DOF `UX,UY,UZ,URX,URY,URZ` 순서를 유지한다. Source renumbering 비교는
|
||||
geometry/connectivity/BC 대응을 함께 사용하며 숫자가 우연히 같은 internal ID를 source key로
|
||||
대체하지 않는다. Repeated eigenvalues는 별개 rank이며 특정 vector 방향의 유일성을 요구하지 않는다.
|
||||
|
||||
Raw consistent 계산을 lumped로 덮어쓰지 않는다. Global dense mass dump는 필수 결과가 아니다.
|
||||
실제 constrained free space에서만 analytic null을 제거하며 tiny positive mass를 rank cutoff로
|
||||
삭제하지 않는다. `requested N`, finite dimension n, count의 overwritten m0, allocated m0,
|
||||
solve returned m, validated c, public N을 각기 보존한다. 모든 c를 검증한 뒤 첫 N을 공개한다.
|
||||
|
||||
## 실패와 공개 lifecycle
|
||||
|
||||
Public CLI·path·lock·log는 [현재 공통 계약 §7.1](../nonlinear-static-newton-raphson/io.md#71-public-output-names-log-and-lifecycle)을
|
||||
유지한다. `fesa.exe <model.inp>`이며 output override를 추가하지 않는다. Input lexical sibling은
|
||||
`<stem>_results.h5`와 `<stem>_log.txt`다. 마지막 `.inp` extension만 제거하고 basename case·
|
||||
앞선 dot은 보존한다. Symlink/junction을 resolve해 결과 위치를 바꾸지 않는다.
|
||||
|
||||
1. Usage 검증→derived pair의 exclusive nonblocking ownership→live log open/truncate.
|
||||
2. Parse/model/solve/all-c validation을 candidate에서 수행한다. 기존 accepted state/final은 유지한다.
|
||||
3. Candidate state를 완성하고 log close 성공을 확인한다. 같은 directory의 exclusive-create private
|
||||
HDF5 candidate를 write/flush/close/reopen/self-check하고 모든 handle을 닫는다.
|
||||
4. Final replace가 성공한 뒤 준비된 state를 no-fail swap한다. 이후 allocation/validation/callback
|
||||
failure를 남기지 않는다. 실패 candidate는 authoritative 결과가 아니다.
|
||||
|
||||
제어된 solve/validation/write/flush/close/reopen/self-check/replace 실패에서 이전 valid final과
|
||||
state를 보존한다. 이전 final이 없으면 만들지 않는다. Log는 별도 live lifecycle이며 rollback하지
|
||||
않는다. Eigen log에는 Newton iteration/FEAST trace를 새로 쓰지 않고 정상 log는 zero-byte다.
|
||||
Backend evidence는 아래 result/Status에 둔다. Lock 실패는 기존 log/final도 건드리지 않는다.
|
||||
Candidate 정리는 best effort이며 다른 run 파일을 삭제하지 않는다. Crash/power-loss 전체 원자성은
|
||||
약속하지 않는다. Reference `.inp`/TXT/CSV는 read-only이며 output으로 덮어쓰지 않는다.
|
||||
|
||||
| Solver 실패 / exit5 | Stable code·필수 context |
|
||||
| --- | --- |
|
||||
| Analytic mass space·null identity 오류 | invalid-eigen-mass-space: node/DOF/n/nz·실패 identity |
|
||||
| Positive block conditioning 실패 | eigen-mass-conditioning: node·metric·관측값·NR limit |
|
||||
| Checked index/capacity 또는 CSR | eigen-index-overflow / invalid-eigen-csr: n,nnz,N,m0와 실패 bound |
|
||||
| Workspace allocation | eigen-allocation-failed: 역할·checked byte request; N 축소 없음 |
|
||||
| Fatal FEAST status | eigen-feast-failed: raw info, call kind/ordinal, interval, allocated m0 |
|
||||
| Count/solve 수·monotonicity 불일치 | eigen-count-inconsistent: 실제 count history·certified interval |
|
||||
| Endpoint separation | eigen-endpoint-separation: raw endpoints·nearest returned value·NR limit |
|
||||
| Mandatory search budget 소진 | eigen-search-budget-exhausted: attempts·마지막 safe bracket·fallback 가능 여부 |
|
||||
| Significant negative spectrum | negative-eigenvalue-spectrum: raw lambda/mu/s·rank·NR limit |
|
||||
| Nonfinite/invalid conversion/frequency | invalid-eigenvalue-result: raw quantity·stage·source step |
|
||||
| Pair/Gram/original-free residual/energy 실패 | eigenpair-validation-failed: metric·value·limit·solver column/rank |
|
||||
|
||||
선택적 upper-prefix 최적화에서 인증되지 않은 empty/count status는 count0으로 바꾸지 않는다.
|
||||
Formulation E4와 NR가 허용한 safe bracket fallback은 실패를 은폐한 성공 count가 아니며
|
||||
actual attempted call·종료 이유를 evidence에 남긴다. Mandatory final count/solve/validation 실패는
|
||||
부분 결과로 성공하지 않는다. Count workspace의 작은/null scratch를 문헌 보장으로 가정하지 않는다.
|
||||
Failure Status는 Frequency 위치와 지금까지의 chronological call context를 포함한다.
|
||||
Undefined vendor outputs는 읽지 않고 unavailable로 표시한다. Allocation 실패의 부속 message
|
||||
생성은 기존 best-effort diagnostic 한계를 따른다.
|
||||
|
||||
## 원본 TXT grammar와 prechecks
|
||||
|
||||
Input은 `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp`, reference는 같은 폴더의
|
||||
`shellNL-eigen-meshfine eigenvalues.txt`다. 이름 변경, TXT rewrite, CSV 변환, companion
|
||||
README/metadata/version/provenance 추가를 요구하지 않는다. TXT에 step이 없으므로 지정 input의
|
||||
**유일한 frequency source step Step-2**에 대응한다. 이름에서 ODB frame index를 추정하지 않는다.
|
||||
|
||||
LF/CRLF logical line에서 space/tab-only 행은 건너뛴다. 나머지는 아래 case-sensitive full-match다.
|
||||
`ws=[ \t]*`, `ws1=[ \t]+`; id는 checked positive int64 decimal이다.
|
||||
|
||||
```text
|
||||
number := [+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?
|
||||
id := [0-9]+
|
||||
row := ws 'Frame:' ws1 'Mode' ws1 id ':' ws1 'Value' ws '=' ws number
|
||||
ws1 'Freq' ws '=' ws number ws1 '(cycles/time)' ws
|
||||
```
|
||||
|
||||
Header/footer/comment/BOM/extra token/malformed row는 schema 실패다. Value는 finite binary64
|
||||
full conversion이며 range error를 거부한다. Freq는 숫자 token 구조만 검사하며 수치 변환·
|
||||
물리 일치·오차 판정에 사용하지 않는다. Freq에서 Value를 재구성하지 않는다. 같은 numeric mode
|
||||
ID의 재등장은 duplicate이며 같은 Value의 다른 mode는 정상이다.
|
||||
|
||||
Tolerance 전에 다음을 순서대로 완료한다.
|
||||
|
||||
1. 지정 input/TXT와 HDF5 존재, eigen discriminator, source_input_identity를 현재 입력의
|
||||
lexical path와 기존 byte-content identity에 대조한다. Static output·unknown eigen schema를 거부한다.
|
||||
2. Input sole source step/N을 직접 읽어 HDF5 source step·requested/public count와 대응한다.
|
||||
N을 TXT row 수나 검증 c에서 추론하지 않는다. 현재 양쪽 required mode inventory는 1..10이다.
|
||||
3. TXT 모든 nonblank row를 parse하고 duplicate/missing/extra/nonfinite를 거부한다. Malformed-row
|
||||
skip/dictionary overwrite/값 sorting으로 source mode identity를 바꾸지 않는다.
|
||||
4. HDF5 mandatory dataset/type/shape, units·quantity·실제 backend·mass variant·normalization,
|
||||
source/model identities, modes ID 1..N, paired vector shape, raw eigenvalue finite를 검사한다.
|
||||
HDF5 순서 오류는 reader 재정렬로 숨기지 않는다. 값이 같아도 ID가 다르면 multiplicity다.
|
||||
5. `(case,source_step_name,mode_id,component=Value)`로 one-to-one join하고 mode ID 순서로 출력한다.
|
||||
TXT row reorder는 허용한다. `modes.eigenvalue`만 FESA scalar authority다. c개 검증 table,
|
||||
frequencies, vectors 또는 static fields에서 fallback하지 않는다.
|
||||
|
||||
## Family와 보고
|
||||
|
||||
[NR reference-model](reference-model.md)이 정의하는 family는 `(case,source step,modal-frame=mode_id,quantity=eigenvalue,
|
||||
dimension=time^-2,coordinates=scalar,impact=blocking)`다. Mode별 frame은 10개 singleton
|
||||
family이며 하나의 storage table이라고 서로 합치지 않는다. [공통 TOLERANCE](../TOLERANCE.md)의
|
||||
reference-only S, inclusive near-zero/relative row branch, relative RMS, zero-scale 처리를
|
||||
그대로 적용한다. 현재 양수 singleton의 실효 기준은 mode별 RMS 1%이며 5% row만으로 통과하지
|
||||
않는다. S=0은 exact-zero FESA만 성공한다. I/O는 새 tolerance를 선택하지 않는다.
|
||||
|
||||
Report는 input/reference/result identity, freshness evidence, 전체 prechecks, source key/
|
||||
component/family/count/S, raw reference/FESA/error·branch·row verdict, RMS·family verdict,
|
||||
blocking failure와 overall verdict를 mode 순서로 남긴다. Zero-scale 미정 metric은 named state로
|
||||
표시하고 NaN/Inf/floor를 넣지 않는다. 필요 시 HDF5 projection CSV는 보조 debug view일 뿐이다.
|
||||
|
||||
외부 eigen gate는 Value뿐이다. N개의 global vectors는 내부 constraint/residual/normalization
|
||||
재검증용이며 외부 shape reference는 요구하지 않는다. 기존 static 회귀는 [requirements](requirements.md)의
|
||||
retained shell/shellNL/linear-limit portfolio와 기존 source step/frame·U blocking·UR warning-only,
|
||||
nonlinear reaction review-only 의미를 유지한다. 제외 네 예제는 원본·복사·cache로도 사용하지 않는다.
|
||||
@@ -0,0 +1,182 @@
|
||||
# MITC4 eigen authoritative HDF5 schema
|
||||
|
||||
- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r1`.
|
||||
- 기본 보고서: [io.md](io.md). 수치 원본: [formulation-eigen](formulation-eigen.md),
|
||||
[NR controls](numerical-review-controls.md).
|
||||
|
||||
## Container와 compatibility
|
||||
|
||||
공식 결과는 input lexical sibling `<stem>_results.h5`다. Linear schema0와 nonlinear schema1의
|
||||
기존 dataset/type/필수성/reader 의미를 바꾸지 않는다. 새 eigen discriminator는
|
||||
`(schema_version=0,feature_id=mitc4-shell-feast-eigen2,analysis_procedure=linear-frequency,
|
||||
eigen_schema_version=1)`이다. 이는 공통 shell model container에 대한 additive procedure다.
|
||||
Reader는 schema_version만 보고 static으로 해석하지 않는다. Unknown procedure/version 또는
|
||||
eigen 필수 field 누락은 명시적 unsupported/invalid schema다. Static 파일에 새 eigen fields를
|
||||
요구하거나 migration하지 않는다. Unknown optional additive fields만 무시할 수 있다.
|
||||
|
||||
File scalar는 f64=`H5T_IEEE_F64LE`, u64/u8/i64는 해당 fixed-width little-endian integer,
|
||||
string은 variable-length UTF-8다. Compound byte padding/offset은 private이며 field name/type/
|
||||
array extent가 계약이다. 차원 product는 allocation 전에 checked integer다. 아래 nn/ne/nmat는
|
||||
model node/element/material 수, N은 input 요청, n은 finite dimension, c는 최종 전체 검증 수다.
|
||||
|
||||
## Metadata와 model
|
||||
|
||||
`/metadata` 필수 attributes:
|
||||
|
||||
| 이름 | Type / 값 |
|
||||
| --- | --- |
|
||||
| schema_version, eigen_schema_version | u64 0,1 |
|
||||
| feature_id, analysis_procedure | utf8 mitc4-shell-feast-eigen2, linear-frequency |
|
||||
| solver_version | utf8 실제 binary version |
|
||||
| source_input_identity | utf8 기존 `path=<absolute lexical generic path>;content_identity=fnv1a64:<16 lower hex>`; 실제 읽은 원본 bytes |
|
||||
| unit_system_label | utf8 user-consistent-unspecified |
|
||||
| coordinate_convention | utf8 global-cartesian; shell-local=initial-reference; positive-thickness=+zeta |
|
||||
| internal_formulation | utf8 FESA-MITC4 |
|
||||
| integration_rule, mass_integration_rule | utf8 2x2x2-gauss; mitc4-edge-midpoint-shear / 3x3x3-gauss |
|
||||
| stabilization_rule | utf8 initial-physical-rotary-trace-mean |
|
||||
| mass_variant, mass_origin, normalization | utf8 derived-lumped, consistent-moment-row-sum, mass |
|
||||
| eigensolver_backend, eigensolver_routine | utf8 MKL FEAST, dfeast_scsrgv |
|
||||
| backend_problem | utf8 scaled-whitened-lumped-with-identity-mass |
|
||||
| numerical_contract | utf8 mitc4-shell-feast-eigen2:r1 |
|
||||
|
||||
Model compounds의 기존 physical field는 수정하지 않고 아래처럼 재사용한다.
|
||||
|
||||
| Dataset | Shape / fields | 의미 |
|
||||
| --- | --- | --- |
|
||||
| /model/nodes | [nn] internal_node_id:u64,instance_name:utf8,source_label:utf8,coordinates:f64[3] | ID 0..nn-1, 기존 expansion/declaration order, global length |
|
||||
| /model/elements | [ne] 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 | ID order; S4/S4R 원형 유지; 모두 FESA-MITC4 |
|
||||
| /model/shell/materials | [nmat] internal_material_id:u64,name:utf8,E:f64,nu:f64 | 기존 declaration order; E force/length^2, nu1; rho를 compound에 삽입하지 않음 |
|
||||
| /model/shell/sections | [section_count] internal_section_id:u64,source_file:utf8,source_line:u64,source_elset:utf8,material_internal_id:u64,thickness:f64 | 기존 centered-single-layer와 thickness length |
|
||||
| /model/shell/nodal_director | [nn,3] f64 | 기존 global unit director D1,D2,D3 |
|
||||
| /model/shell/nodal_frame | [nn,3,3] f64 | 기존 A,B,D axes×global X,Y,Z, dimension1 |
|
||||
| /model/nodal_constraint_mask | [nn,6] u8 | UX,UY,UZ,URX,URY,URZ; free0/constrained1 |
|
||||
| /model/prescribed_displacement | [nn,6] f64 | 같은 component order; 전부 exact0, 기존 length/radian dimensions |
|
||||
| /model/shell/densities | [density_count] 새 compound material_internal_id:u64,rho:f64,source_file:utf8,source_line:u64 | Material ID ascending, 선언 density마다 한 row; 활성 material 전부 존재, rho>0 mass/length^3 |
|
||||
| /diagnostics | [diagnostic_count] 기존 severity:utf8,code:utf8,file:utf8,line:u64,keyword:utf8,entity_identity:utf8,message:utf8 | 기존 deterministic order, 성공 파일은 warning만 |
|
||||
|
||||
기존 model dataset attrs는 [현재 model writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp)의
|
||||
동일 field 의미를 따른다. `/model/shell/densities` attrs는 component_names=rho,
|
||||
component_unit_dimensions=mass/length^3,coordinate_system=scalar,location=model-material다.
|
||||
공유 writer의 midsurface_locations/section_positions 추가 저장은 허용하지만 eigen 필수량이 아니다.
|
||||
|
||||
`/steps/Step-1`은 storage group이며 아래 attributes가 source/procedure authority다.
|
||||
Raw name을 HDF5 path에 넣거나 Step-1에서 source name을 역추정하지 않는다.
|
||||
|
||||
| Attribute | Type / 의미 |
|
||||
| --- | --- |
|
||||
| source_step_name, source_step_name_canonical | utf8 원문/ASCII uppercase; 지정 입력 Step-2/STEP-2 |
|
||||
| step_source_line, frequency_source_line, frequency_data_line | u64 source 1-based 위치 |
|
||||
| source_nlgeom, source_perturbation_present | u8 effective0 / flag presence0 또는1 |
|
||||
| source_eigensolver, source_sim, source_acoustic_coupling, source_normalization | utf8 effective LANCZOS,YES,ON,MASS |
|
||||
| source_option_presence | u8[4] 위 네 option의 explicit presence 순서 |
|
||||
| requested_mode_count, returned_mode_count | u64 N,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 |
|
||||
| frame_indexing | utf8 mode-rank-one-based |
|
||||
|
||||
별도 raw source-record table이나 duplicate reference provenance 파일은 필수로 만들지 않는다.
|
||||
Raw keyword/data/blank fields는 Domain의 ParsedInput provenance와 source byte identity로 추적한다.
|
||||
|
||||
## 공개 modal 결과
|
||||
|
||||
Prefix `/steps/Step-1/eigen`. 새 result dataset의 공통 attrs는
|
||||
`eigen_schema_version:u64=1,source_step_name:utf8=<raw>,domain:utf8=mode`와 아래 quantity/
|
||||
component/dimension/coordinate/location이다. Numeric/physical values는 전부 finite다.
|
||||
|
||||
| Dataset | Shape/type | Quantity·identity |
|
||||
| --- | --- | --- |
|
||||
| modes | [N] compound mode_id:u64,eigenvalue:f64,classification:u8,cluster_id:u64 | 유일 Value authority; mode_id1..N 순서, quantity=eigenvalue, component_names=Value, component_unit_dimensions=time^-2, coordinate_system=scalar, location=modal-frame |
|
||||
| frequencies | [Nv] compound mode_id:u64,frequency:f64 | modes 중 raw lambda>=0의 정확한 ID subset, mode order; quantity=cycle-frequency, component_names=Freq, component_unit_dimensions=time^-1, coordinate_system=scalar, location=modal-frame |
|
||||
| vectors | [N,nn,6] f64 | Modes와 같은 mode axis, model/nodes와 같은 node axis; component_names=UX,UY,UZ,URX,URY,URZ, global-cartesian, nodal-modal-vector |
|
||||
|
||||
Vectors는 **mandatory 내부 검증 projection**이다. 병진 dimension `mass^-1/2` 세 개와
|
||||
회전 `mass^-1/2*length^-1` 세 개를 component_unit_dimensions에 기록한다.
|
||||
`normalization=mass,mass_variant=derived-lumped,interpretation=normalized-mode-not-response-displacement`
|
||||
attrs를 둔다. 회전은 initial global infinitesimal rotation이다. Constrained component는 exact0.
|
||||
Static displacement/reaction/stress/accepted_frames를 modal 결과로 생성하지 않는다.
|
||||
|
||||
[NR raw 분류](numerical-review-controls.md)대로 mu=lambda/s의 절댓값<=1e-9는
|
||||
classification0=near-zero, 나머지 허용 양수는1=positive다. mu<-1e-9는 성공 파일을 만들 수 없다.
|
||||
Raw lambda는 작은 음수도 보존하며 절댓값/zero clamp하지 않는다. Frequency는 raw lambda>0이면
|
||||
sqrt(lambda)/(2pi), exact0이면0, 음수에는 row가 없다. Mandatory frequencies dataset은 Nv=0도
|
||||
허용하며 unavailable_rule=negative-raw-eigenvalue를 기록한다. Finite/range 검사는 NR 기준이며
|
||||
양수의 frequency underflow-to-zero도 invalid-eigenvalue-result다.
|
||||
|
||||
Sort는 paired raw lambda ascending, exact tie는 원 FEAST column order다. Sign은 최대 절댓값
|
||||
scaled global component(translation/ell,rotation)를 양수로, tie는 model row×DOF 순서다.
|
||||
Cluster는 전체 c sorted pairs의 NR connected rule로 1부터 부여한 후 N개에 투영한다.
|
||||
Cluster label은 진단 identity이며 mode average/deduplicate/외부 shape 비교를 유발하지 않는다.
|
||||
|
||||
## 전체 c 검증과 실제 backend evidence
|
||||
|
||||
Prefix `/steps/Step-1/eigen/verification`. Attributes `characteristic_length:f64=ell [length]`,
|
||||
`operator_scale:f64=s [time^-2]`는 positive finite다. `validation_scope=all-computed-c-columns`,
|
||||
`eta_gram:f64,max_eta_orth:f64`는 dimension1, c=1이면 latter0이다. Null 검사는
|
||||
`null_checks_applicable:u8`와 `eta_mz,eta_kz,eta_pz:f64`로 저장한다. nz=0이면 flag0/storage0이며
|
||||
N/A이지 검증 통과 metric0이 아니다. 모든 metric 식과 limit는 NR controls와 채택 V식이다. 정규화 후 최종 phi에서
|
||||
modal_mass와 yf를 다시 계산하고 모든 저장 residual/Gram/Rayleigh/energy에 이 값을 사용한다.
|
||||
|
||||
| Dataset | Shape / fields |
|
||||
| --- | --- |
|
||||
| nodal_reduction | [nn] compound free_count:u8,null_count:u8,positive_count:u8,rcond_available:u8,rcond_inf:f64 |
|
||||
| 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 |
|
||||
|
||||
두 검증 dataset attrs는 coordinate_system=scalar이며 location은 각각 nodal-mass-reduction,
|
||||
eigenpair-verification이다. component_names는 표의 f64 fields 순서, component_unit_dimensions는
|
||||
아래 해당 field 차원 순서다. Nodal counts는 nn source row에 대응하고 합이 nf/nz/n과 일치한다. Positive block 없는 node는
|
||||
rcond_available0/storage0이다. Sorted_rank1..c, solver_column0-based unique, modes의 첫 N scalar와
|
||||
exact pairing한다. Eigenvalue/Rayleigh는 time^-2, 나머지는 dimension1이다. Backend relative res가
|
||||
zero-mode에서 정의되지 않는 경우에만 unavailable0/storage0으로 두고 의미를 명시한다.
|
||||
Nonzero mode의 nonfinite res 및 모든 mandatory independent metric nonfinite는 실패다.
|
||||
|
||||
C개 vectors는 solve/validation 동안 유지한다. Accepted state/HDF5에는 N vectors와 전체 c의
|
||||
metrics를 남긴다. N vectors로 같은 input의 K/ML를 재조립해 N개의 original-free residual/
|
||||
normalization을 재현할 수 있다. 전체 c Gram의 실제 검증 evidence는 runtime/test 결과로 남기며
|
||||
N vectors만으로 c Gram를 재계산했다고 주장하지 않는다. Full matrices의 영속 dump는 요구하지 않는다.
|
||||
|
||||
Prefix `/steps/Step-1/eigen/backend` attributes:
|
||||
`runtime_version:utf8,integer_abi:utf8=LP64|ILP64,thread_count:u64=1,seed:u64`,
|
||||
`enclosure_lower:f64,enclosure_upper:f64,solve_lower:f64,solve_upper:f64`,
|
||||
`count_calls:u64,solve_calls:u64,final_solve_ordinal:u64,final_count:u64=c`,
|
||||
`upper_search_termination:utf8`를 둔다. 마지막 값은 count-target/width-limit/no-midpoint/
|
||||
optimization-budget/collision-exhausted/optional-status 중 실제 종료 이유다.
|
||||
Bounds는 dimensionless B-space이며 사용자 frequency interval이 아니다. Seed는 NR 값이다.
|
||||
|
||||
| Dataset | Shape / fields | 의미 |
|
||||
| --- | --- | --- |
|
||||
| base_fpm | [128] i64 | feastinit 뒤 NR override한 실제 solve control snapshot; defaults 포함. Count는 동일 snapshot에서 C-index49만1, 매 call 재초기화 |
|
||||
| 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,outcome:utf8,decision_reason:utf8 | 실제 chronological 호출, ordinal0-based; kind=count/solve, purpose=total-enclosure/upper-guard/final-count/solve |
|
||||
|
||||
Count의 overwritten m0 또는 solve의 returned m을 count에 담고 allocated_m0와 구분한다.
|
||||
Outcome은 accepted/optional-abandoned/retry이며 NR의 실제 결정에 대응한다. Decision_reason은
|
||||
accepted 또는 status/count-mismatch/endpoint-separation 등의 결정 원인과 필요한 관측값을
|
||||
round-trip decimal로 남긴다. 호출 없이 budget/width로 종료한 이유는 upper_search_termination에 둔다.
|
||||
초기 enclosing 재시도에서만 a0가 확정 전 변경될 수 있고, 성공한 total enclosure 이후 하한은 고정이다. Guard 세 구간은
|
||||
각각 call row다. 실패·fallback을 삭제하지 않는다. Undefined vendor output은 flag0/storage0으로
|
||||
두고 읽지 않는다. 성공 count는 count_available1; 성공 solve는 loop/epsout available1이고 finite다.
|
||||
Calls와 final interval/rank/c를 통해 fixed a0, certified upper/full enclosure fallback, budget,
|
||||
capacity, returned count의 경로를 재구성할 수 있어야 한다. CLI live log로 이 trace를 옮기지 않는다.
|
||||
Calls의 f64 component_names는 lower,upper,epsout이고 component_unit_dimensions=1,1,1,
|
||||
coordinate_system=scalar,location=backend-call이다. Base_fpm은 component_names=fpm,
|
||||
component_unit_dimensions=1,coordinate_system=none,location=backend-parameter다.
|
||||
128개 per-call dump 대신 공통 snapshot 한 개와 kind로 실제 controls를 재현한다. 향후 call별
|
||||
control 차이를 추가하려면 이 표현과 NR 계약을 함께 재검토해야 한다.
|
||||
|
||||
## Closed candidate self-check
|
||||
|
||||
현재 [self_check](../../src/fesa/io/hdf5/hdf5_self_check.cpp)는 static schema0/1 전용이므로
|
||||
별도 eigen dispatch/check가 필요하다. Candidate를 닫고 read-only reopen하여 다음을 검증한다.
|
||||
|
||||
- Discriminator/metadata/source input bytes·step·요청수, known type/rank/shape/dimension attrs와
|
||||
model source identity uniqueness/각 reference ID range, density coverage/positivity를 candidate와 대조한다.
|
||||
- Model mask는0/1, prescribed values exact0, modes inventory 정확히1..N, 오름차순·cluster/classification,
|
||||
frequencies 정확한 subset, vectors paired axis/finite/constraint zero와 validated candidate 값을 대조한다.
|
||||
- nf=n+nz 및 nodal count 합, N<=c<=n, c rank/solver-column uniqueness, first-N scalar pairing,
|
||||
independent metrics finite/NR limits, applicable/available flags를 검사한다. N/A를 pass로 계산하지 않는다.
|
||||
- Backend routine/ABI/runtime/base controls, actual call ordering/count/bounds/capacity/status/budget와 final
|
||||
certified interval·c 및 successful all-c validation 연결을 확인한다. Static result paths가 없어야 한다.
|
||||
- Mandatory row 누락/추가/중복/nonfinite/잘못된 quantity·units·mass는 실패한다. Writer가 sorting,
|
||||
averaging, 값 수정으로 candidate mismatch를 수리하지 않는다. 모든 handle close 후에만 replace한다.
|
||||
|
||||
Self-check는 serialization과 검증된 state의 동일성을 확인한다. 독립 physics/NR 테스트를 대신하거나
|
||||
저장 metric만으로 실행되지 않은 residual/Gram 계산을 통과로 인정하지 않는다.
|
||||
@@ -0,0 +1,80 @@
|
||||
# MITC4 eigen I/O 계약
|
||||
|
||||
- Feature ID: `mitc4-shell-feast-eigen2`; Owner: `io-definition-agent`; Contract revision: `r1`.
|
||||
- 입력 baseline: [requirements r1](requirements.md), [formulation r1](formulation.md).
|
||||
- 기준: [프로젝트 지침](../../AGENTS.md), [PRD](../PRD.md), [ADR-028](../ADR.md#adr-028),
|
||||
[ARCHITECTURE](../ARCHITECTURE.md), [Feature ADR](ADR.md).
|
||||
- 상태: formulation r1과 독립 NR의 `pass-for-io-definition` 및 최종 controls/reference-model을 반영한 I/O 계약 작성 완료. 구현·실행 검증 기록이 아니다.
|
||||
|
||||
## 결정
|
||||
|
||||
원본 frequency input의 N과 source step을 보존하며 consistent에서 유도한 lumped mass와
|
||||
실제 MKL FEAST의 N개 고유쌍을 공식 HDF5로 식별한다. 기존 static schema0/1과 CLI/output
|
||||
lifecycle는 유지한다. Eigen discriminator·density·modal datasets는 additive다.
|
||||
N개의 global mass-normalized vectors는 내부 검증을 위해 필수이며 외부 shape gate는 없다.
|
||||
전체 c개의 내부 validation evidence는 공개 mode N개와 분리한다.
|
||||
|
||||
| 상세 문서 | 권위와 내용 |
|
||||
| --- | --- |
|
||||
| [io-input](io-input.md) | Supported syntax/defaults, source scope, rho/BC mapping, no-op allowlist, fail-closed diagnostics |
|
||||
| [io-schema](io-schema.md) | Authoritative HDF5 types/shapes/units, source step·mode identity, all-c evidence, self-check |
|
||||
| [io-mapping](io-mapping.md) | Domain/AnalysisModel/DOF/state ownership, candidate/failure lifecycle, TXT grammar·prechecks·Value projection |
|
||||
| [NR controls](numerical-review-controls.md), [reference-model](reference-model.md) | 내부 수치 controls와 외부 modal-frame family; I/O가 tolerance를 선택하지 않음 |
|
||||
|
||||
공개 Abaqus convention은 [입력 문서의 공식 출처](io-input.md#step와-frequency)를 직접 대조했다.
|
||||
Lanczos/SIM은 source compatibility 정보이며 실제 algorithm 동등성을 주장하지 않는다.
|
||||
ACOUSTIC COUPLING=ON은 acoustic-free 모델에서만 적용 대상 없음으로 처리한다.
|
||||
물리량은 사용자 일관 units이며 SI로 추론하지 않는다. Meaningful unsupported input은 실패한다.
|
||||
|
||||
## 현재 source와의 차이
|
||||
|
||||
2026-09-08 지정 source를 읽기 전용으로 직접 확인했다. 아래는 후속 구현 의무이며 현재
|
||||
동작이 구현되었다는 의미가 아니다. 기존 Feature 문서의 pass·workflow·trace schema는 승계하지 않았다.
|
||||
|
||||
| 실제 확인 파일 | 확인 결과와 필요한 연결 |
|
||||
| --- | --- |
|
||||
| [input_reader](../../src/fesa/io/abaqus/input_reader.cpp) | ASCII/256-byte/continuation/raw fields와 FNV byte identity 재사용; 새 lexical framework 불필요 |
|
||||
| [domain_mapping_context](../../src/fesa/io/abaqus/domain_mapping_context.cpp) | RawMaterial에 density 없음, RawStep은 static 전용, DENSITY/FREQUENCY 없음. PERTURBATION/ENERGY OUTPUT도 새 eigen subset 필요. FinalizeStep의 hardcoded Step-1 외에 raw source name·N을 보존해야 함 |
|
||||
| [material mapper](../../src/fesa/io/abaqus/material_property_mapper.cpp), [step mapper](../../src/fesa/io/abaqus/step_definition_mapper.cpp) | Context 위임 경계다. Density/property와 Frequency semantic 확정은 같은 candidate 흐름에 연결 |
|
||||
| [model writer](../../src/fesa/io/hdf5/hdf5_model_writer.cpp), [primitives](../../src/fesa/io/hdf5/hdf5_primitives.cpp) | 기존 compounds, UTF-8/fixed-width, user-consistent-unspecified, path+content identity 재사용; material compound 수정 대신 별도 densities |
|
||||
| [linear writer](../../src/fesa/io/hdf5/hdf5_results_writer.cpp), [nonlinear writer](../../src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp), [self_check](../../src/fesa/io/hdf5/hdf5_self_check.cpp) | Static0/1 전용 경로를 eigen에 재사용해 modal 값을 static frame0으로 내면 오류. Dedicated eigen serialization/self-check dispatch 필요 |
|
||||
|
||||
## 후속 검증 의무
|
||||
|
||||
Requirement prefix는 `FEM-REQ-MITC4-EIGEN2-`다. 아래 검증을 문서 작업 중 실행한 것으로
|
||||
집계하지 않는다. 수치 기준·oracle는 [NR](numerical-review.md)와 연결된 상세가 권위다.
|
||||
|
||||
| ID | 필수 관찰 | Requirement suffix |
|
||||
| --- | --- | --- |
|
||||
| IO-T01 | 원본 변경 없이 Step-2/N10/rho2700/t0.5, keyword defaults/no-op warnings·실제 FEAST; S4R source-only 변형 같은 physical path | 001–004,015–016 |
|
||||
| IO-T02 | 다중 material/section 연결; missing/duplicate/unresolved/0/negative/nonfinite/dependent rho, extra row/field, 잘못된 geometry/section 거부 | 003–004,016 |
|
||||
| IO-T03 | N blank/0/fraction/overflow, nonblank frequency slots2~7(0 포함), eighth empty slot, duplicate/unknown option, multiple/preload/acoustic/load/nonzero BC 거부 | 001,009,015–016 |
|
||||
| IO-T04 | Source label/instance/set renumbering·모호함, partial BC·fully constrained·drill-only, 실제 free injection/global 복구; rank cutoff로 tiny positive mass 삭제 금지 | 006–008,014,018 |
|
||||
| IO-T05 | Additive schema round-trip·source step·units·N/c·mass/backend identity; normalized final phi로 original residual/Gram/energy 재검증; raw negative/zero/positive와 frequency subset | 010–013,017–018 |
|
||||
| IO-T06 | 실제 FEAST known zero/repeated/cluster/n1/N=n·full capacity, optional abandoned count와 safe fallback, count/reset/budget/index/allocation/Gram/residual 실패; 최종 N과 c 구별 | 008–013,019 |
|
||||
| IO-T07 | 기존 accepted state/final 준비 후 solve/validation/log/lock/write/flush/close/reopen/self-check/replace failure injection; 기존 final 보존과 최초 실패 final 미생성 | 012,019 |
|
||||
| IO-T08 | TXT reorder·같은 Value의 다른 mode 허용; missing/extra/duplicate/nonfinite/malformed/step/quantity/unit/mass/backend/schema 오류를 tolerance 전에 거부; Freq 변화는 Value 판정 불변 | 020–021 |
|
||||
| IO-T09 | Common inclusive row/RMS 경계·양옆, near-zero와 zero-scale; singleton은 row5% pass/RMS1% fail을 구별 | 022 |
|
||||
| IO-T10 | Density 없는 static 입력과 schema0/1 유지, retained shell/shellNL/linear-limit source identity·U/UR/reaction 분류와 fresh 회귀, 제외 예제0건 | 023–025,027 |
|
||||
| IO-T11 | Consistent→lumped 원본 연결과 같은 mass의 실제 FEAST/검증; mass oracle·inertia/null·coordinate/NR-MFE-001 및 deterministic assembly/row/diagnostic | 005–008,011,013–014,023,026–027 |
|
||||
|
||||
## 최종 대조와 미실행
|
||||
|
||||
최종 NR의 B=0 enclosure, 초기 count 최대3회·전체 count512/solve3, fixed a0와
|
||||
optional upper search 종료·certified fallback, normalized final phi metrics를 대조했다.
|
||||
별도 per-call control 변경 없이 base_fpm 한 개와 count index49 override로 현재 controls를 표현한다.
|
||||
|
||||
입력 계약과 additive schema 선택은 이번 요청 안의 정의 작업이다. 기존 static public 호환성
|
||||
변경은 없다. 새 mode shape 외부 acceptance, CSV mandate, reference 보조 metadata, full matrix
|
||||
mandatory dump, lower/empty-prefix 검색 schema를 추가하지 않았다.
|
||||
|
||||
현재 source의 density/Frequency/state/writer 연결은 미구현이다. Research G01/G02의 installed
|
||||
FEAST 동작·workspace와 실제 peak memory, retained regression/새 eigen reference 및 physics
|
||||
검증은 후속 실행 의무다. Safe enclosure fallback이 runtime 확인을 대신하지 않는다.
|
||||
문서만 수정하므로 build/test/Harness/FEAST/외부 solver를 실행하지 않았다. Source/test/reference와
|
||||
제외 네 예제의 원본·복사·cache는 수정·검증에 사용하지 않았다.
|
||||
|
||||
정적 검사: owned 문서 4개의 UTF-8·Markdown fence·trailing whitespace·상대 파일 링크
|
||||
41개와 원본 TXT full grammar/finite Value/unique Mode1..10을 Python read-only 검사로 확인했다.
|
||||
경로 한정 `git diff --check`도 exit0이었다. Untracked 문서는 별도 내용 검사로 확인했으며
|
||||
diff 검사만으로 검증했다고 하지 않는다. Build/test와 수치 comparison은 미실행이다.
|
||||
@@ -15,6 +15,8 @@ free subspace를 유지한다. 아래는 [이전 독립 적분](../mitc4-shell-f
|
||||
다시 얻도록 구성한 새 실행이다. 기존 수치 출력이나 저장 K를 입력으로 쓰지 않는다.
|
||||
전역 24×24 physical K를 직접 적분하고 새 director의 least-aligned tangent를 재생성해
|
||||
여덟 rotary diagonal의 trace mean을 계산한다. 비교 대상 congruence에만 원 K를 회전한다.
|
||||
Norm에는 ell=4, D=diag(ell I3,I3)를 사용하여 matrix는 D^T A D,
|
||||
response는 D^-1 q, force/moment residual은 D^T r로 같은 단위를 만든다.
|
||||
|
||||
```python
|
||||
from math import sqrt, fsum
|
||||
@@ -166,7 +168,7 @@ print('mass_Jrange_Gauss_error_central=',min(jvals),max(jvals),maxerr,float(min(
|
||||
| `kd`, `Kff`, `Mff` | `0.003958333333333333`, `1.3825333333333332`, `0.05999999999999998` |
|
||||
| `lambda` 원/회전 | `23.04222222222223` / `23.042222222222208`; exact `10369/450 [T^-2]` |
|
||||
| 단위 moment의 `thetaZ` 원/회전 | `0.7233098659465717` / `0.7233098659465714`; exact `7500/10369` |
|
||||
| Complete `K`, `ML`, response, full reaction 공변성 ratio | `1.483e-16`, `7.915e-17`, `1.535e-16`, `1.654e-16` |
|
||||
| Complete `K`, `ML`, response, full reaction 공변성 ratio | `1.658e-16`, `7.851e-17`, `1.535e-16`, `1.706e-16` |
|
||||
| 원/회전 free residual raw | `0`, `-1.1102230246251565e-16`; 기존 scaled `1e-10` 기준 충족 |
|
||||
| Rational `C0_11,C1_11,C2_11` | `17609/28800`, `11003/1440000`, `88177/6912000` |
|
||||
| `sum m,sum h,sum j` | `7743/1600`, `739/12000`, `517/5120` |
|
||||
@@ -182,3 +184,8 @@ print('mass_Jrange_Gauss_error_central=',min(jvals),max(jvals),maxerr,float(min(
|
||||
|
||||
외부 solver, FEAST runtime, build/test, retained static fresh solve 및 HDF5–reference
|
||||
comparison은 **NOT RUN**이다. 위 항등식의 통과는 구현/reference 통과가 아니다.
|
||||
|
||||
최종 정적 Python audit는 owned Markdown 5개, 상대 파일 링크 38개, requirement 27개와
|
||||
case 27개의 유일·연속 identity, UTF-8/whitespace/final newline을 검사했고 exit `0`이었다.
|
||||
두 oracle 모두 exit `0`; 이후 norm의 length congruence 명시를 코드에 반영하고 영향받은
|
||||
첫 oracle를 재실행하여 exit `0` 및 위 최종 scaled ratio를 확인했다. 식·판정 한계는 불변이다.
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
Fresh 독립 oracle의 재현 코드와 실제 값은 [numerical-review-evidence](numerical-review-evidence.md)에 있다.
|
||||
NR-MFE-001은 `kd=19/4800`, `Mff=3/50`, `Kff=10369/7500`,
|
||||
`lambda=10369/450`, 단위 moment `thetaZ=7500/10369`을 확인했다.
|
||||
Complete K/ML/response/full reaction 공변성 ratio는 모두 `1.7e-16` 미만이다.
|
||||
Complete K/ML/response/full reaction 공변성 ratio는 모두 `1.8e-16` 미만이다.
|
||||
곡면 mass rational oracle와 27점 적분 최대 entry 차는 `2.221e-16` 미만이었다.
|
||||
|
||||
## 고정한 기준과 후속 인계
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
- Owner: `research-agent`
|
||||
- Input baseline: `requirements r1`
|
||||
- Research date: `2026-09-08`
|
||||
- Status: `evidence collected; formulation/verification pending`
|
||||
- Status: `research evidence complete`; 현재 후속 작업 상태는 [PRD](PRD.md)의 checklist를 따른다.
|
||||
|
||||
[요구사항](requirements.md)과 [요구 근거](requirements-evidence.md)에 대한 연구다.
|
||||
현재 후속 작업 권한은 메인이 전달한 최신 사용자 지시를 따르며, 요구 문서의 과거
|
||||
|
||||
Reference in New Issue
Block a user