5.0 KiB
5.0 KiB
Step 14: Runtime Element and Factory
담당 역할과 필수 스킬
- 담당 역할:
implementation-agent - 필수 스킬:
harness,fesa-cpp-msvc-tdd - 이 Step만
RED -> observed failure -> minimal GREEN -> focused/full VERIFY로 수행한다.
읽어야 할 파일
/AGENTS.md/docs/CODINGSTYLE.md/docs/ARCHITECTURE.md/docs/ADR.md/docs/linear-static-3d-euler-beam/formulation.md/docs/linear-static-mitc4-shell/formulation.md/docs/cpp-object-oriented-modular-refactoring/implementation-plan.md- Step 12 material/property hierarchy files
- Step 13 element definition and Domain files
/include/fesa/elements/euler_beam_3d.h,/src/fesa/elements/euler_beam_3d.cpp/include/fesa/elements/mitc4_shell.h,/src/fesa/elements/mitc4_shell.cpp- element/model/result record tests
/src/fesa/CMakeLists.txt,/tests/CMakeLists.txt/phases/cpp-object-oriented-modular-refactoring/index.json/phases/cpp-object-oriented-modular-refactoring/step14.md
작업
Requirement R-ELEMENT-001의 numerical runtime boundary를 구현한다.
/tests/unit/elements/element_factory_test.cpp를 먼저 추가한다.C-ELEMENT-001covers base-pointer virtual destruction, B33 and MITC4 factory success, stable DOF layout, stiffness and recovery through base, unknown/mismatched property/material/null rejection.- Missing
element.handelement_factory.hcause RED compile failure. - Create
/include/fesa/elements/element.h,/include/fesa/elements/element_factory.h, and/src/fesa/elements/element_factory.cpp; register the source and factory test in CMake. - Candidate interfaces:
struct ElementDofLayout {
SourceEntityId source_id;
std::vector<EntityIndex> node_indices;
std::vector<DofComponent> components_per_node;
};
struct ElementStiffnessContribution {
ElementDofLayout layout;
Matrix values;
};
struct BeamElementResultRows {
std::vector<EndpointResultRow> endpoint_rows;
std::vector<GaussResultRow> gauss_rows;
std::vector<StressS11Row> stress_rows;
};
struct ShellElementResultRows {
std::vector<ShellResultRow> rows;
double physical_strain_energy;
};
using ElementResultPayload =
std::variant<BeamElementResultRows, ShellElementResultRows>;
struct ElementResultBundle {
SourceEntityId source_id;
ElementResultPayload payload;
};
class Element {
public:
virtual ~Element() = default;
virtual const ElementDofLayout& DofLayout() const noexcept = 0;
virtual Result<ElementStiffnessContribution> ComputeStiffness() const = 0;
virtual Result<ElementResultBundle> Recover(
const Vector& full_displacement) const = 0;
};
using ElementView = std::vector<std::reference_wrapper<const Element>>;
class ElementFactory {
public:
Result<std::unique_ptr<Element>> Create(
const ElementDefinition& definition,
const Domain& domain) const;
};
- The linear-static candidate owns
std::vector<std::unique_ptr<Element>>and builds anElementViewwhose lifetime is bounded by that owner. Carrier type locations may be adjusted to avoid circular public dependencies, but semantics and names must stay consistent for Steps 15–17. - Factory centralizes explicit definition/property/material kind compatibility, bounds checks, and structured diagnostic. It may use a checked kind discriminator and concrete access after validation; downstream consumers must not downcast.
- Existing B33/MITC4 numerical kernels implement
Elementwithout changing formulation or adding fields meaningless to the other element.
Acceptance Criteria
cmake --build .harness/build --config Debug --target fesa_unit_tests
ctest --test-dir .harness/build -C Debug `
-R "ElementFactory|EulerBeam3D|Mitc4Shell" --output-on-failure
rg -n "dynamic_cast" src/fesa include/fesa
& "C:/Program Files/LLVM/bin/clang-format.exe" --dry-run --Werror `
include/fesa/elements/element.h include/fesa/elements/element_factory.h `
src/fesa/elements/element_factory.cpp tests/unit/elements/element_factory_test.cpp
cmake --build .harness/build --config Debug
ctest --test-dir .harness/build -C Debug --show-only=json-v1
ctest --test-dir .harness/build -C Debug --output-on-failure
The downcast scan must show no newly scattered consumer downcasts. If the centralized factory uses a checked cast, document the preceding kind validation and keep it in the factory only.
검증 및 상태 갱신
- RED, success/rejection cases, base stiffness/recovery, downcast scan and full CTest를 summary에 기록한다.
- Formulation or result identity changes are
error. - 성공 시 현재 Step만
completed로 갱신한다. - timestamp, retry, commit, advancement는 Executor 소유다.
금지사항
- Semantic definition and runtime kernel을 one class로 합치지 마라.
- Future element registry/global static registration을 추가하지 마라.
- Giant common result record with meaningless optional fields를 만들지 마라.
- 직접 commit하거나 hook script를 수동 실행하지 마라.