64 lines
2.2 KiB
Markdown
64 lines
2.2 KiB
Markdown
# Step 1: Reference CSV Adapters
|
|
|
|
## 읽어야 할 파일
|
|
|
|
- `/AGENTS.md`
|
|
- `/docs/PRD.md`
|
|
- `/docs/ARCHITECTURE.md`
|
|
- `/docs/ADR.md`
|
|
- `/docs/superpowers/specs/2026-07-29-abaqus-assembly-reference-design.md`
|
|
- `/include/fesa/validation/comparison.hpp`
|
|
- `/reference/cantilever beam/cantilever beam displacements.csv`
|
|
- `/reference/cantilever beam/cantilever beam reactions.csv`
|
|
|
|
## 작업
|
|
|
|
네 물리량의 명시적 CSV schema를 읽어 canonical reference row로 변환한다.
|
|
|
|
```cpp
|
|
struct ReferenceRow final {
|
|
ReferenceQuantity quantity;
|
|
ResultPosition position;
|
|
std::vector<double> values;
|
|
};
|
|
struct ReferenceCsvReadResult final {
|
|
std::vector<ReferenceRow> rows;
|
|
std::vector<Diagnostic> diagnostics;
|
|
};
|
|
[[nodiscard]] ReferenceCsvReadResult read_reference_csv(
|
|
ReferenceQuantity,
|
|
const std::filesystem::path&,
|
|
std::string_view single_instance_name);
|
|
```
|
|
|
|
- displacement/reaction은 제공된 whitespace 포함 Abaqus header를 읽는다.
|
|
- internal force schema:
|
|
`Part Instance Name, Element Label, Node Label, SF-SF1..SF-SF3,
|
|
SM-SM1..SM-SM3`
|
|
- stress schema:
|
|
`Part Instance Name, Element Label, Node Label, Sxx`
|
|
- 단일 Instance에서는 Instance 열 생략을 허용하고 request 이름으로 보완한다.
|
|
- `tests/fixtures/reference`에 synthetic internalforce/stress CSV를 먼저 만들고,
|
|
6개 내력 component와 centroid stress row를 실패 테스트로 고정한다.
|
|
|
|
## Acceptance Criteria
|
|
|
|
```powershell
|
|
cmake --build --preset windows-debug
|
|
ctest --preset windows-debug -R "ReferenceCsv|InternalForceCsv|StressCsv" --output-on-failure
|
|
ctest --preset windows-debug --output-on-failure
|
|
```
|
|
|
|
## 검증 절차
|
|
|
|
1. four-schema parser test 실패를 확인한다.
|
|
2. header/value trim과 선택적 UTF-8 BOM만 허용한다.
|
|
3. missing column, duplicate row, invalid number를 진단한다.
|
|
4. 전체 테스트와 index를 갱신한다.
|
|
|
|
## 금지사항
|
|
|
|
- metadata.json을 요구하지 마라. 이유: 승인된 reference 계약과 다르다.
|
|
- unknown column으로 필수 column 누락을 숨기지 마라. 이유: 잘못된 비교를 만든다.
|
|
- 내력/응력 파일이 없다는 이유로 adapter 구현을 생략하지 마라. 이유: 필수 루틴이다.
|