add uncommitted files
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"project": "FESA",
|
||||
"phase": "results-and-pipeline",
|
||||
"steps": [
|
||||
{
|
||||
"step": 0,
|
||||
"name": "result-database",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 1,
|
||||
"name": "minimal-hdf5-schema",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"name": "linear-static-analysis",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"name": "cli-pipeline-integration",
|
||||
"status": "pending"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
# Step 0: Result Database
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `/AGENTS.md`
|
||||
- `/docs/PRD.md`
|
||||
- `/docs/ARCHITECTURE.md`
|
||||
- `/docs/ADR.md`
|
||||
- `/include/fesa/model/domain.hpp`
|
||||
- `/include/fesa/core/diagnostic.hpp`
|
||||
|
||||
## 작업
|
||||
|
||||
HDF5와 독립적인 최소 Phase 1 result semantic model을 만든다.
|
||||
|
||||
```cpp
|
||||
struct NodalFrame final {
|
||||
std::vector<NodeId> node_ids;
|
||||
std::vector<std::array<double, 6>> displacement;
|
||||
std::vector<std::array<double, 6>> reaction;
|
||||
};
|
||||
struct ResultFrame final {
|
||||
double step_time;
|
||||
NodalFrame nodal;
|
||||
std::vector<Diagnostic> diagnostics;
|
||||
};
|
||||
struct ResultStep final {
|
||||
std::string name;
|
||||
std::vector<ResultFrame> frames;
|
||||
};
|
||||
struct ResultDatabase final {
|
||||
std::string schema_version;
|
||||
std::vector<ResultStep> steps;
|
||||
};
|
||||
```
|
||||
|
||||
- size mismatch, duplicate node, nonfinite field, duplicate step/frame을 실패 테스트로
|
||||
먼저 작성한다.
|
||||
- 이 step에는 element result를 미리 만들지 않는다.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows-debug
|
||||
ctest --preset windows-debug -R "ResultDatabase|NodalFrame" --output-on-failure
|
||||
ctest --preset windows-debug --output-on-failure
|
||||
```
|
||||
|
||||
## 검증 절차
|
||||
|
||||
1. 유효/무효 result model 테스트를 먼저 실행한다.
|
||||
2. 불변 읽기 계약에 필요한 최소 저장만 구현한다.
|
||||
3. HDF5 include가 없는지 확인한다.
|
||||
4. 전체 테스트와 index를 갱신한다.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- HDF5 handle을 result model에 넣지 마라. 이유: semantic/adaptor 경계를 깨뜨린다.
|
||||
- velocity, acceleration, temperature를 추가하지 마라. 이유: Phase 1에서 사용하지 않는다.
|
||||
- 빈 element output hierarchy를 만들지 마라. 이유: 필요한 phase에서만 실체화한다.
|
||||
@@ -0,0 +1,56 @@
|
||||
# Step 1: Minimal HDF5 Schema
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `/AGENTS.md`
|
||||
- `/docs/PRD.md`
|
||||
- `/docs/ARCHITECTURE.md`
|
||||
- `/docs/ADR.md`
|
||||
- `/include/fesa/results/result_database.hpp`
|
||||
- `/include/fesa/model/domain.hpp`
|
||||
- `/cmake/FesaDependencies.cmake`
|
||||
|
||||
## 작업
|
||||
|
||||
먼저 `docs/HDF5_SCHEMA.md`에 schema `1.0.0`의 최소 group/dataset/attribute 계약을
|
||||
작성하고 HDF5 writer/reader round trip을 구현한다.
|
||||
|
||||
```cpp
|
||||
struct Hdf5ReadResult final {
|
||||
std::optional<ResultDatabase> database;
|
||||
std::vector<Diagnostic> diagnostics;
|
||||
};
|
||||
[[nodiscard]] std::vector<Diagnostic> write_hdf5(
|
||||
const std::filesystem::path&,
|
||||
const Domain&,
|
||||
const ResultDatabase&);
|
||||
[[nodiscard]] Hdf5ReadResult read_hdf5_results(
|
||||
const std::filesystem::path&);
|
||||
```
|
||||
|
||||
- schema/version, node origin `(part,instance,local label)`, dense ID map, 좌표,
|
||||
connectivity, shear property source, nodal displacement/reaction을 round trip한다.
|
||||
- 먼저 public reader로 모든 값을 재확인하는 실패 테스트를 작성한다.
|
||||
- 모든 `hid_t`는 move-only RAII wrapper로 관리한다.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows-debug
|
||||
ctest --preset windows-debug -R "Hdf5|ResultRoundTrip" --output-on-failure
|
||||
h5ls -r .\out\build\windows-debug\Testing\Temporary\fesa-round-trip.h5
|
||||
ctest --preset windows-debug --output-on-failure
|
||||
```
|
||||
|
||||
## 검증 절차
|
||||
|
||||
1. schema 문서를 writer보다 먼저 작성한다.
|
||||
2. round-trip test 실패를 확인한 뒤 최소 adapter를 구현한다.
|
||||
3. HDF5 도구와 public reader 결과를 모두 확인한다.
|
||||
4. 전체 테스트와 index를 갱신한다.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- global HDF5 handle을 만들지 마라. 이유: 수명과 오류 경계를 훼손한다.
|
||||
- reference CSV 기능을 추가하지 마라. 이유: validation phase 책임이다.
|
||||
- schema에 빈 미래 분석 결과를 넣지 마라. 이유: 현재 계약만 저장한다.
|
||||
@@ -0,0 +1,56 @@
|
||||
# Step 2: Linear Static Analysis
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `/AGENTS.md`
|
||||
- `/docs/PRD.md`
|
||||
- `/docs/ARCHITECTURE.md`
|
||||
- `/docs/ADR.md`
|
||||
- `/include/fesa/model/domain.hpp`
|
||||
- `/include/fesa/fem/dof_manager.hpp`
|
||||
- `/include/fesa/assembly/`
|
||||
- `/include/fesa/constraints/`
|
||||
- `/include/fesa/solvers/linear/`
|
||||
- `/include/fesa/results/result_database.hpp`
|
||||
|
||||
## 작업
|
||||
|
||||
기존 production 모듈을 조율하는 `LinearStaticAnalysis` lifecycle을 구현한다.
|
||||
|
||||
```cpp
|
||||
struct AnalysisRunResult final {
|
||||
bool succeeded;
|
||||
std::optional<ResultDatabase> results;
|
||||
std::vector<Diagnostic> diagnostics;
|
||||
};
|
||||
class LinearStaticAnalysis final {
|
||||
public:
|
||||
[[nodiscard]] AnalysisRunResult run(const Domain&) const;
|
||||
};
|
||||
```
|
||||
|
||||
- parser나 HDF5를 호출하지 않고 이미 검증된 Domain을 입력받는다.
|
||||
- DofManager, pattern/assembly, BC elimination, PARDISO, full reconstruction,
|
||||
reaction recovery, nodal ResultDatabase 순서로 실행한다.
|
||||
- hand-check 가능한 한 요소 Domain으로 변위, 반력, residual을 먼저 테스트한다.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows-debug
|
||||
ctest --preset windows-debug -R "LinearStaticAnalysis|StaticEquilibrium" --output-on-failure
|
||||
ctest --preset windows-debug --output-on-failure
|
||||
```
|
||||
|
||||
## 검증 절차
|
||||
|
||||
1. analysis test가 연결 누락으로 실패하는 것을 확인한다.
|
||||
2. orchestration만 구현하고 수치 kernel을 복제하지 않는다.
|
||||
3. \(Ku-f-r\) 평형과 finite result를 검사한다.
|
||||
4. 전체 테스트와 index를 갱신한다.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- CLI option parsing을 analysis에 넣지 마라. 이유: application 경계를 깨뜨린다.
|
||||
- nonlinear loop나 여러 step을 추가하지 마라. 이유: Phase 1 범위 밖이다.
|
||||
- test-only solver 경로를 만들지 마라. 이유: production pipeline을 검증해야 한다.
|
||||
@@ -0,0 +1,60 @@
|
||||
# Step 3: CLI Pipeline Integration
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `/AGENTS.md`
|
||||
- `/docs/PRD.md`
|
||||
- `/docs/ARCHITECTURE.md`
|
||||
- `/docs/ADR.md`
|
||||
- `/include/fesa/io/abaqus/parser.hpp`
|
||||
- `/include/fesa/io/abaqus/semantic_mapper.hpp`
|
||||
- `/include/fesa/analysis/linear_static_analysis.hpp`
|
||||
- `/include/fesa/io/hdf5/writer.hpp`
|
||||
- `/src/fesa/cli/main.cpp`
|
||||
|
||||
## 작업
|
||||
|
||||
flat minimal fixture를 입력부터 HDF5까지 실행하는 public application 경로를 연결한다.
|
||||
|
||||
```cpp
|
||||
struct AnalysisRequest final {
|
||||
std::filesystem::path input_path;
|
||||
std::filesystem::path output_path;
|
||||
};
|
||||
[[nodiscard]] AnalysisRunResult run_solver(const AnalysisRequest&);
|
||||
```
|
||||
|
||||
CLI 계약:
|
||||
|
||||
```text
|
||||
fesa solve <model.inp> --output <results.h5>
|
||||
fesa --version
|
||||
```
|
||||
|
||||
- 먼저 `MinimalCantileverPipeline` 통합 테스트를 작성한다.
|
||||
- test는 `run_solver` 또는 CLI와 public HDF5 reader만 사용한다.
|
||||
- 성공 파일의 ID, finite displacement, reaction/equilibrium diagnostic과 schema path,
|
||||
실패 입력의 nonzero exit 및 source diagnostic을 검증한다.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
```powershell
|
||||
cmake --build --preset windows-debug
|
||||
ctest --preset windows-debug -R MinimalCantileverPipeline --output-on-failure
|
||||
.\out\build\windows-debug\Debug\fesa.exe solve tests\fixtures\abaqus\minimal_cantilever.inp --output out\minimal-cantilever.h5
|
||||
h5ls -r out\minimal-cantilever.h5
|
||||
ctest --preset windows-debug --output-on-failure
|
||||
```
|
||||
|
||||
## 검증 절차
|
||||
|
||||
1. end-to-end test 실패를 확인한다.
|
||||
2. parser→Domain→analysis→writer만 조율한다.
|
||||
3. command와 public reader로 산출물을 재검증한다.
|
||||
4. 이 milestone을 수치 자격 완료로 표시하지 말고 index를 갱신한다.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- hierarchical sample의 전체 keyword를 우회 처리하지 마라. 이유: 다음 input phase다.
|
||||
- fake stiffness/result를 쓰지 마라. 이유: 실제 pipeline 검증을 무효화한다.
|
||||
- CLI에 solver 내부 구현을 넣지 마라. 이유: core/library 재사용성을 훼손한다.
|
||||
Reference in New Issue
Block a user