add uncommitted files

This commit is contained in:
KOKO\Mimi
2026-07-29 23:32:26 +09:00
parent fb0f8f39a0
commit f5379472ce
80 changed files with 7461 additions and 1 deletions
@@ -0,0 +1,31 @@
{
"project": "FESA",
"phase": "abaqus-subset-completion",
"steps": [
{
"step": 0,
"name": "abaqus-input-contract",
"status": "pending"
},
{
"step": 1,
"name": "part-and-assembly-set-resolution",
"status": "pending"
},
{
"step": 2,
"name": "single-instance-semantic-validation",
"status": "pending"
},
{
"step": 3,
"name": "material-section-and-shear-defaults",
"status": "pending"
},
{
"step": 4,
"name": "step-bc-load-and-noop-directives",
"status": "pending"
}
]
}
+52
View File
@@ -0,0 +1,52 @@
# Step 0: Abaqus Input Contract
## 읽어야 할 파일
- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/superpowers/specs/2026-07-29-abaqus-assembly-reference-design.md`
- `/docs/superpowers/plans/2026-07-29-fesa-phase-1.md`
- `/include/fesa/io/abaqus/`
- `/reference/cantilever beam/cantilever beam.inp`
## 작업
production parser를 수정하기 전에 `docs/ABAQUS_INPUT_SUBSET.md`를 normative contract로
작성하고 valid/invalid fixture matrix를 등록한다.
문서에 각 keyword의 허용 scope, parameter, data line, diagnostic을 정확히 정의한다.
- `*NODE`, `*ELEMENT,TYPE=B31`
- `*PART/*END PART`, `*ASSEMBLY/*END ASSEMBLY`,
`*INSTANCE/*END INSTANCE`
- `*NSET`, `*ELSET`, `GENERATE`, nested set, `INSTANCE=`
- `*MATERIAL`, `*ELASTIC`, `*BEAM GENERAL SECTION`
- optional `*TRANSVERSE SHEAR STIFFNESS`
- `*BOUNDARY`, `*CLOAD`, `*STEP`, `*STATIC`, `*END STEP`
- no-op `*HEADING`, `*PREPRINT`, `*RESTART`, `*OUTPUT`
`tests/fixtures/abaqus/valid``invalid`에 최소 한 규칙당 fixture를 정의하고
data-driven contract test를 먼저 실패시킨다.
## Acceptance Criteria
```powershell
cmake --build --preset windows-debug
ctest --preset windows-debug -R AbaqusInputContract --output-on-failure
ctest --preset windows-debug --output-on-failure
```
## 검증 절차
1. 문서와 fixture manifest를 먼저 작성한다.
2. 아직 미구현인 계약 테스트가 실패하는 것을 확인한다.
3. 이 step에서는 parser behavior를 확장하지 않는다.
4. index summary에 계약 문서와 미통과 fixture 범위를 기록한다.
## 금지사항
- Abaqus 전체 문법 지원을 약속하지 마라. 이유: 명시된 subset만 대상이다.
- unknown keyword ignore 규칙을 만들지 마라. 이유: 조용한 모델 손실을 유발한다.
- reference 원본을 고치지 마라. 이유: golden provenance를 보존해야 한다.
+55
View File
@@ -0,0 +1,55 @@
# Step 1: Part and Assembly Set Resolution
## 읽어야 할 파일
- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/ABAQUS_INPUT_SUBSET.md`
- `/include/fesa/io/abaqus/`
- `/include/fesa/model/entity_set.hpp`
- `/tests/fixtures/abaqus/`
## 작업
Part 및 Assembly scope의 `NSET/ELSET`을 결정적으로 해석한다.
```cpp
struct ResolvedSet final {
std::string scope_name;
std::string set_name;
std::vector<std::int64_t> sorted_unique_labels;
};
struct SetResolutionResult final {
std::vector<ResolvedSet> sets;
std::vector<Diagnostic> diagnostics;
};
[[nodiscard]] SetResolutionResult resolve_sets(const ParsedDeck&);
```
- explicit member, `GENERATE`, nested reference, forward reference, duplicate member,
empty set, cycle, unknown set/entity, invalid range를 실패 테스트로 먼저 작성한다.
- Part와 Assembly의 같은 set 이름을 별도 scope로 허용한다.
- Assembly `INSTANCE=`는 활성 단일 Instance의 Part-local label만 lift한다.
## Acceptance Criteria
```powershell
cmake --build --preset windows-debug
ctest --preset windows-debug -R "SetResolution|PartSet|AssemblySet" --output-on-failure
ctest --preset windows-debug --output-on-failure
```
## 검증 절차
1. scope collision과 cycle 테스트의 실패를 확인한다.
2. graph resolution과 canonical sorted-unique 결과를 구현한다.
3. source diagnostic과 deterministic order를 assertion한다.
4. 전체 테스트와 index를 갱신한다.
## 금지사항
- Part와 Assembly set namespace를 합치지 마라. 이유: 이름 충돌 의미가 달라진다.
- cycle을 recursion overflow로 발견하지 마라. 이유: 명시적 cycle diagnostic이 필요하다.
- 여러 Instance key를 지원하지 마라. 이유: Phase 1 단일 Instance 범위다.
+56
View File
@@ -0,0 +1,56 @@
# Step 2: Single Instance Semantic Validation
## 읽어야 할 파일
- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/ABAQUS_INPUT_SUBSET.md`
- `/include/fesa/io/abaqus/parser.hpp`
- `/include/fesa/io/abaqus/semantic_mapper.hpp`
- `/include/fesa/io/abaqus/set_resolver.hpp`
## 작업
flat/hierarchical organization과 Phase 1 단일 Instance 제한을 semantic validation으로
완성한다.
```cpp
struct ActiveInputView final {
bool flat;
std::string part_name;
std::string instance_name;
std::span<const DeckRecord> part_records;
std::span<const DeckRecord> assembly_records;
};
[[nodiscard]] ActiveInputResult select_active_input(const ParsedDeck&);
```
- flat input은 Part/Assembly가 없어야 한다.
- hierarchical input은 여러 Part를 허용하지만 Assembly와 Instance는 각각 정확히
하나여야 한다.
- missing Part, transform data, instance-local node/element, mixed organization,
wrong `INSTANCE=`를 먼저 실패 테스트로 작성한다.
- unreferenced Part가 Domain entity를 만들지 않는지 검증한다.
## Acceptance Criteria
```powershell
cmake --build --preset windows-debug
ctest --preset windows-debug -R "SingleInstance|ActiveInput|SemanticScope" --output-on-failure
ctest --preset windows-debug --output-on-failure
```
## 검증 절차
1. 각 미지원 organization의 실패 테스트를 확인한다.
2. selection/validation만 구현하고 좌표 변환 코드는 만들지 않는다.
3. source location과 활성 Part 결과를 확인한다.
4. 전체 테스트와 index를 갱신한다.
## 금지사항
- transformation data를 0으로 간주해 무시하지 마라. 이유: 계약상 명시적 오류다.
- unreferenced Part를 Domain에 병합하지 마라. 이유: 사용자 요구와 다르다.
- future multi-instance abstraction을 만들지 마라. 이유: 실제 두 번째 구현이 없다.
+48
View File
@@ -0,0 +1,48 @@
# Step 3: Material, Section, and Shear Defaults
## 읽어야 할 파일
- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/ABAQUS_INPUT_SUBSET.md`
- `/include/fesa/io/abaqus/semantic_mapper.hpp`
- `/include/fesa/model/material.hpp`
- `/include/fesa/model/beam_section.hpp`
- `/include/fesa/model/domain_builder.hpp`
## 작업
전역 material과 Part-local Beam section/ELSET assignment를 complete-deck resolution으로
semantic model에 연결한다.
- `*ELASTIC`의 \(E,\nu\)에서 \(G=E/[2(1+\nu)]\)를 계산한다.
- general section의 \(A,I_y,I_{yz},I_z,J\), orientation을 읽되 \(I_{yz}=0\)만
허용한다.
- explicit transverse stiffness를 \(A_{sy},A_{sz}\)로 변환한다.
- 생략 시 \(A_{sy}=A_{sz}=5A/6\), `SCF=0`,
`ShearPropertySource::phase1_default`를 적용한다.
- nonzero `SCF`, missing/duplicate material/section assignment, invalid properties를
실패 테스트로 먼저 작성한다.
## Acceptance Criteria
```powershell
cmake --build --preset windows-debug
ctest --preset windows-debug -R "MaterialMapping|BeamSection|ShearDefault" --output-on-failure
ctest --preset windows-debug --output-on-failure
```
## 검증 절차
1. material이 Part 뒤에 정의된 forward-resolution 테스트를 먼저 실패시킨다.
2. explicit/default shear 두 경로를 최소 구현한다.
3. HDF5에 저장할 source enum까지 Domain에 보존되는지 확인한다.
4. 전체 테스트와 index를 갱신한다.
## 금지사항
- 임의 단면에 대한 Abaqus 보편 기본값이라고 문서화하지 마라. 이유: FESA Phase 1 가정이다.
- nonzero \(I_{yz}\)를 버리지 마라. 이유: 조용한 정식화 변경이다.
- orientation을 자동 생성하지 마라. 이유: mandatory 입력 계약이다.
+47
View File
@@ -0,0 +1,47 @@
# Step 4: Step, BC, Load, and No-op Directives
## 읽어야 할 파일
- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/ABAQUS_INPUT_SUBSET.md`
- `/include/fesa/io/abaqus/`
- `/reference/cantilever beam/cantilever beam.inp`
- `/include/fesa/model/step_definition.hpp`
## 작업
단일 `*STEP/*STATIC`, Assembly set 기반 `*BOUNDARY/*CLOAD`와 명시적 no-op directive
처리를 완성한다.
- `*BOUNDARY`는 DOF 1~6의 0/비영 값을 지원한다.
- `*CLOAD`는 force/moment component 1~6을 누적한다.
- 중복 동일 BC는 canonicalize하고 충돌 prescribed value는 거부한다.
- `*HEADING`, `*PREPRINT`, `*RESTART`, `*OUTPUT`과 소유 data는 명시적으로
consume하되 Domain behavior를 만들지 않는다.
- 여러 step, `nlgeom` nonzero, unsupported output/keyword option을 실패시킨다.
- 제공된 cantilever가 11 nodes, 10 elements, 6 fixed DOFs, node 11의
\(F_z=-10000\)으로 정규화되는 통합 테스트를 먼저 작성한다.
## Acceptance Criteria
```powershell
cmake --build --preset windows-debug
ctest --preset windows-debug -R "StepMapping|Boundary|Cload|SuppliedCantilever" --output-on-failure
ctest --preset windows-debug --output-on-failure
```
## 검증 절차
1. 제공 샘플을 복사/변경하지 않고 public parser로 실패를 확인한다.
2. 문서화된 keyword만 구현한다.
3. expected Domain과 source diagnostic을 확인한다.
4. 전체 테스트와 index를 갱신한다.
## 금지사항
- no-op 목록을 general ignore로 확장하지 마라. 이유: 모델 정의 손실을 숨긴다.
- 여러 step/load history를 추가하지 마라. 이유: Phase 1 범위 밖이다.
- reference input을 rewrite하지 마라. 이유: 검증 원본을 보존해야 한다.