docs: add shell pressure feature workflow
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"project": "FESA Structural Solver",
|
||||
"phase": "shell-surface-pressure-load",
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"name": "map-pressure-input-contract",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"name": "reject-invalid-pressure-input",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"name": "evaluate-shell-pressure-kernel",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"name": "integrate-linear-shell-pressure",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"name": "integrate-nonlinear-follower-pressure",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"name": "compare-pressure-reference",
|
||||
"status": "pending"
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"name": "verify-and-report-pressure-feature",
|
||||
"status": "pending"
|
||||
}
|
||||
],
|
||||
"created_at": "2026-09-01T01:29:29+0900"
|
||||
}
|
||||
@@ -0,0 +1,216 @@
|
||||
# Step 1: map-pressure-input-contract
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 valid assembly-level `*SURFACE, TYPE=ELEMENT`와 sole static Step의 `*DSLOAD P`를 immutable Domain/Step semantic objects와 non-owning `AnalysisModel` view로 mapping하는 것이다. 이 Step 안에서 `RED -> observed expected failure -> minimal GREEN -> focused VERIFY -> full/Stop VERIFY`를 끝내고 green 상태로 종료한다.
|
||||
|
||||
Implementation Agent는 Executor가 선택한 이 Step만 수행한다. 성공 시 `phases/shell-surface-pressure-load/index.json`의 Step 1 `status`와 한 줄 `summary`만, 오류/차단 시 각각 `error_message` 또는 `blocked_reason`만 기록할 수 있다. branch, retry, timestamps, commits, 다음 Step 선택, top-level phase status와 `step1-output.json`은 Harness Executor 소유다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
먼저 전부 읽는다.
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/PRD.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/research.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md`
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md`
|
||||
- `docs/shell-surface-pressure-load/reference-model.md`
|
||||
- `docs/shell-surface-pressure-load/io.md`
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- `include/fesa/io/abaqus/input_syntax.h`
|
||||
- `include/fesa/io/abaqus/input_reader.h`
|
||||
- `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- `src/fesa/io/abaqus/topology_mapper.h`
|
||||
- `src/fesa/io/abaqus/topology_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/step_definition_mapper.h`
|
||||
- `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/domain_builder.h`
|
||||
- `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
- `src/fesa/io/abaqus/domain_mapper.cpp`
|
||||
- `include/fesa/model/model_types.h`
|
||||
- `include/fesa/model/domain.h`
|
||||
- `src/fesa/model/domain.cpp`
|
||||
- `include/fesa/analysis/analysis_model.h`
|
||||
- `src/fesa/analysis/analysis_model.cpp`
|
||||
- `tests/unit/io/abaqus/input_reader_test.cpp`
|
||||
- `tests/unit/io/abaqus/input_syntax_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapper_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapping_components_test.cpp`
|
||||
- `src/fesa/CMakeLists.txt`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
이 Step에는 이전 Step 산출물이 없다. Existing parser/domain behavior를 먼저 이해하고 legacy beam/shell inputs를 보존한다.
|
||||
|
||||
## 소유 파일
|
||||
|
||||
먼저 test files를 생성/수정한 뒤 production files를 변경한다.
|
||||
|
||||
- Modify: `include/fesa/io/abaqus/input_syntax.h`
|
||||
- Modify: `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- Create: `src/fesa/io/abaqus/surface_definition_mapper.h`
|
||||
- Create: `src/fesa/io/abaqus/surface_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
- Modify: `include/fesa/model/model_types.h`
|
||||
- Modify: `include/fesa/model/domain.h`
|
||||
- Modify: `src/fesa/model/domain.cpp`
|
||||
- Modify: `include/fesa/analysis/analysis_model.h`
|
||||
- Modify: `src/fesa/analysis/analysis_model.cpp`
|
||||
- Modify/Test: `tests/unit/io/abaqus/input_reader_test.cpp`
|
||||
- Create/Test: `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`
|
||||
- Modify: `src/fesa/CMakeLists.txt`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
`domain_mapper_test.cpp`와 `domain_mapping_components_test.cpp`는 focused regression 대상으로 우선 읽는다. 이 Step의 valid mapping에 직접 필요한 assertion이 새 feature test로 표현되지 않는 경우에만 최소 수정한다.
|
||||
|
||||
## 인터페이스와 semantic contract
|
||||
|
||||
`include/fesa/model/model_types.h`에 다음 의미의 candidate value types를 구현한다. Existing style상 이름을 최소 조정해야 하면 upstream semantic fields와 아래 accessors를 빠짐없이 보존하고 summary에 조정 이유를 기록한다.
|
||||
|
||||
```cpp
|
||||
enum class ShellSurfaceSide { kSpos, kSneg };
|
||||
enum class SurfaceMemberKind { kDirect, kElset };
|
||||
|
||||
struct ElementSurfaceFacetDefinition {
|
||||
EntityIndex element_index;
|
||||
std::size_t facet_ordinal;
|
||||
std::string part_name_raw;
|
||||
std::string part_name_canonical;
|
||||
std::string instance_name_raw;
|
||||
std::string instance_name_canonical;
|
||||
std::int64_t source_element_label;
|
||||
std::string source_element_label_raw;
|
||||
std::string source_element_type;
|
||||
ShellSurfaceSide side;
|
||||
SourceLocation first_member_location;
|
||||
std::size_t first_member_ordinal;
|
||||
SurfaceMemberKind member_kind;
|
||||
std::string elset_name_raw;
|
||||
std::string elset_name_canonical;
|
||||
};
|
||||
|
||||
struct ElementSurfaceDefinition {
|
||||
std::string surface_name_raw;
|
||||
std::string surface_name_canonical;
|
||||
std::vector<ElementSurfaceFacetDefinition> facets;
|
||||
SourceLocation declaration_location;
|
||||
std::size_t declaration_ordinal;
|
||||
};
|
||||
|
||||
struct SurfacePressureLoadDefinition {
|
||||
std::string step_name_raw;
|
||||
std::string step_name_canonical;
|
||||
EntityIndex surface_index;
|
||||
std::string surface_name_raw;
|
||||
std::string surface_name_canonical;
|
||||
std::string load_type;
|
||||
double magnitude;
|
||||
std::string magnitude_raw;
|
||||
SourceLocation keyword_location;
|
||||
SourceLocation data_location;
|
||||
std::size_t data_ordinal;
|
||||
std::size_t load_ordinal;
|
||||
};
|
||||
```
|
||||
|
||||
Required queries:
|
||||
|
||||
```cpp
|
||||
const std::vector<ElementSurfaceDefinition>&
|
||||
Domain::ElementSurfaces() const noexcept;
|
||||
|
||||
const std::vector<SurfacePressureLoadDefinition>&
|
||||
StepDefinition::SurfacePressureLoads() const noexcept;
|
||||
|
||||
bool StepDefinition::UsesNonlinearGeometry() const noexcept;
|
||||
|
||||
const std::vector<SurfacePressureLoadDefinition>&
|
||||
AnalysisModel::ActiveSurfacePressureLoads() const noexcept;
|
||||
```
|
||||
|
||||
`ModelDefinition` owns `element_surfaces`; `StaticStepDefinition` owns `surface_pressure_loads`; committed `Domain`/`StepDefinition` remain immutable. `AnalysisModel` returns non-owning references and never copies/reorders the surface inventory; Domain must outlive it. Pressure records do not enter the existing configuration-independent nodal `Load::ComputeContributions` interface.
|
||||
|
||||
## RED
|
||||
|
||||
Write and register these tests before production implementation:
|
||||
|
||||
- `InpSyntax.AcceptsAsciiKeywordContinuationAndPreservesPhysicalSourceLines`
|
||||
- `ShellSurfacePressureInput.MapsDirectInstanceFacetsForS4AndS4rCaseInsensitively`
|
||||
- `ShellSurfacePressureInput.MapsExplicitInstanceElsetAndResultNeutralInternalParameter`
|
||||
- `ShellSurfacePressureInput.MapsMixedDirectAndElsetMembersAcrossTwoExplicitInstancesWithStableDataMemberAndElsetOrder`
|
||||
- `ShellSurfacePressureInput.PreservesSposSnegMagnitudeTextLocationsAndSourceOrder`
|
||||
- `ShellSurfacePressureDomain.OwnsCanonicalFacetsAndStepOwnedAdditivePressureRecords`
|
||||
- `ShellSurfacePressureDomain.AnalysisModelBorrowsActivePressureWithoutCopyingDomain`
|
||||
- `ShellSurfacePressureInput.AcceptsWhitespaceSignedZeroAndFiniteScientificNotation`
|
||||
|
||||
The mixed-instance fixture declares `Instance-A` and `Instance-B` in distinct declaration order, interleaves differently cased direct members and flat assembly ELSET members bound by explicit `INSTANCE=`, and uses the same numeric element label in both instances. It must compare case-insensitive resolution, raw data/member ordinals, flat ELSET provenance, canonical facet order, distinct part/instance/source label/source type/side identities and first-member provenance exactly. It must not accept implicit-instance syntax.
|
||||
|
||||
After test edits and CMake test registration, run:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
```
|
||||
|
||||
Expected RED: missing mapper/header/semantic accessors produces compile/link failure, or current unsupported `SURFACE`/`DSLOAD` behavior fails assertions. The mixed-instance fixture must fail because the two explicit instances/mixed direct+ELSET are not resolved or committed identity/provenance is absent. Record command, exit code, duration and meaningful output tail. An unrelated existing failure is `regression`; an unexpected pass is an `evidence-gap`. Stop before production changes until the expected RED is observed.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Support physical-line ASCII/256-byte policy, comma/cardinality, physical locations and keyword-parameter-only continuation exactly as `io.md` §3 defines. Do not invent inline comments or data continuation.
|
||||
- Parse assembly-only element surfaces and parameterless step-level DSLOAD. Surface parameters are exactly `TYPE=ELEMENT` and `NAME`; DSLOAD data is exactly `<surface>,P,<finite C-locale scalar>`.
|
||||
- Run `SurfaceDefinitionMapper` after topology finalization and before Step binding. Resolve direct `<instance>.<positive label>` and flat assembly ELSETs with explicit `INSTANCE=` case-insensitively.
|
||||
- One surface may mix direct/ELSET members and multiple explicit instances. Preserve raw data/member order and ELSET expansion provenance, then sort unique committed facets by `(instance declaration ordinal, numeric element label, SPOS before SNEG)`.
|
||||
- Preserve each facet's internal `element_index` plus part/instance raw+canonical identity, source label/raw token, exact `S4|S4R`, side, facet ordinal and first-member provenance.
|
||||
- Preserve each Step pressure record's step/surface raw+canonical identity, `load_type="P"`, signed magnitude/raw token, keyword/data locations, data ordinal and total Step load ordinal. Records remain distinct/additive.
|
||||
- Bind pressure surface references only after every candidate target validates. DomainBuilder commits once. Legacy `StaticStepDefinition` constructors delegate with an empty pressure vector.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
If `.harness/config.json` exists at execution time, its complete configure/build/test selection takes precedence and the exact resolved commands must be recorded. Otherwise execute:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpDomainMapping|DomainMappingComponents|InpSyntax)\."
|
||||
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
|
||||
```
|
||||
|
||||
Acceptance requires exit `0`, nonzero discovered tests, all named tests present/pass, no new MSVC `/W4 /WX` warnings, and all legacy tests green. The automatic Stop hook performs another whole-project MSVC validation; do not call hook scripts manually.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Supported: mixed direct/ELSET and multiple explicit instances in one surface. Unsupported: implicit-instance ELSET, one ELSET mixing instances, part-scope fallback.
|
||||
- Same numeric label in different instances is never merged. Source identity is not replaced by internal/equation index.
|
||||
- Parse/map failure returns no Domain and exposes no partial surface/load. Do not update AnalysisState or HDF5.
|
||||
- Evidence must record RED/GREEN/VERIFY commands, exits, durations/tails, mapped facet/load inventory, source identity/order, warnings and changed files.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-001`–`004`, `010`, `013`; `io.md` §§2–6; `formulation.md` §3.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not implement pressure force/tangent or procedure assembly. 이유: Steps 3–5 ownership이다.
|
||||
- Do not support `*DLOAD`, implicit-instance ELSET, part surface, generalized distributed loads or additional element types. 이유: approved subset 밖이다.
|
||||
- Do not change HDF5 schema, CLI output contract, upstream docs, tolerance or reference artifacts.
|
||||
- Do not run Abaqus/reference solvers, create output JSON, invoke `scripts/execute.py`, select Step 2, commit or push.
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
# Step 2: reject-invalid-pressure-input
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 Step 1의 pressure input/model mapping에 deterministic fail-closed negative semantics, duplicate rules, diagnostics and atomic commit behavior를 완결하는 것이다. 동일 Step 안에서 RED부터 full green까지 끝낸다.
|
||||
|
||||
Implementation Agent는 Executor-selected Step 2만 수행하고 task index의 Step 2 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor가 timestamps, commits, retry, advancement, top-level status와 output JSON을 소유한다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md`
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md`
|
||||
- `docs/shell-surface-pressure-load/io.md`
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- `include/fesa/core/ascii.h`
|
||||
- `include/fesa/core/diagnostic.h`
|
||||
- `include/fesa/model/source_target_resolver.h`
|
||||
- `src/fesa/model/source_target_resolver.cpp`
|
||||
- `include/fesa/io/abaqus/input_syntax.h`
|
||||
- `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- `src/fesa/io/abaqus/surface_definition_mapper.h`
|
||||
- `src/fesa/io/abaqus/surface_definition_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
- `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapper_test.cpp`
|
||||
- `tests/unit/io/abaqus/domain_mapping_components_test.cpp`
|
||||
|
||||
Read Step 1's implementation and tests closely. Its required outputs are the Domain-owned immutable surface/facet inventory, Step-owned provenance-rich pressure records, multi-explicit-instance valid support and non-owning AnalysisModel accessors. Do not replace those contracts.
|
||||
|
||||
## 소유 파일
|
||||
|
||||
- Modify/Test first: `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`
|
||||
- Modify/Test if needed: `tests/unit/io/abaqus/domain_mapper_test.cpp`
|
||||
- Modify/Test if needed: `tests/unit/io/abaqus/domain_mapping_components_test.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/input_reader.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.h`
|
||||
- Modify: `src/fesa/io/abaqus/domain_mapping_context.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/surface_definition_mapper.h`
|
||||
- Modify: `src/fesa/io/abaqus/surface_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/step_definition_mapper.cpp`
|
||||
- Modify: `src/fesa/io/abaqus/domain_builder.cpp`
|
||||
|
||||
Do not add another production type or parser framework.
|
||||
|
||||
## RED
|
||||
|
||||
Add these named tests first:
|
||||
|
||||
- `ShellSurfacePressureInput.RejectsNonAsciiOverlengthOrIllegalContinuationAtStableLocation`
|
||||
- `ShellSurfacePressureInput.RejectsUnsupportedSurfaceParametersTypesSidesAndTargetKinds`
|
||||
- `ShellSurfacePressureInput.RejectsDsloadParametersLabelsDistributionsAndCardinality`
|
||||
- `ShellSurfacePressureInput.RejectsEmptyMissingAmbiguousAndCrossScopeSurfaceTargets`
|
||||
- `ShellSurfacePressureInput.RejectsImplicitInstanceNestedCyclicAndMalformedElsets`
|
||||
- `ShellSurfacePressureInput.NormalizesExactSameSideDuplicatesWithOneStableWarning`
|
||||
- `ShellSurfacePressureInput.RejectsConflictingSidesForOneElement`
|
||||
- `ShellSurfacePressureInput.RejectsNonfiniteDExponentAndLocaleDependentMagnitudes`
|
||||
- `ShellSurfacePressureInput.PreservesAdditiveRepeatedPressureRowsWithoutDeduplication`
|
||||
- `ShellSurfacePressureDomain.MappingFailureCommitsNoPartialSemanticCandidate`
|
||||
- `ShellSurfacePressureInput.EmitsDiagnosticsInStableSourceOrderAcrossRepeatedRuns`
|
||||
|
||||
Run before production edits:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
```
|
||||
|
||||
Expected RED: the Step 1 happy-path mapper accepts at least one unsupported form, lacks complete stable diagnostics, or does not distinguish exact same-side normalization from conflicting-side failure. Record command, exit, duration and tail. Unexpected pass is an evidence gap; unrelated failure is regression and must be resolved/classified before GREEN.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Apply exact allowed parameter/label/cardinality tables from `io.md` §§2–3. Reject unsupported flags, types, labels, distributions, scopes and target kinds without reinterpretation.
|
||||
- Reject non-ASCII/control/overlength physical input, illegal continuation, malformed or nonfinite numeric tokens, `D` exponent and locale-dependent forms at the actual failing source line.
|
||||
- Reject missing, empty, ambiguous, cross-scope, implicit-instance, nested/cyclic and malformed ELSET targets. A single mixed-instance ELSET remains unsupported; multiple separately explicit-instance members in one surface remain valid from Step 1.
|
||||
- Normalize an exact same `(instance, element label, side)` duplicate to one facet and emit exactly one deterministic `duplicate-surface-member-normalized` warning after the first identity. Reject conflicting SPOS/SNEG for the same instance/element and duplicate case-insensitive surface declarations.
|
||||
- Never deduplicate identical DSLOAD rows: each remains a distinct additive `load_ordinal`.
|
||||
- Validate every raw target before semantic commit, sort diagnostics by `(file source order, line, member/load ordinal, code, entity identity)`, and return no Domain on error. Preserve full `entity_identity` fields from `io.md` §9.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
If `.harness/config.json` exists, use its resolved commands first. Otherwise run:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(ShellSurfacePressureInput|ShellSurfacePressureDomain)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(InpDomainMapping|DomainMappingComponents|InpSyntax)\."
|
||||
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
|
||||
```
|
||||
|
||||
Acceptance requires every named negative test and legacy parser/domain test green, exact diagnostic tuple `(severity,code,file,line,keyword,entity_identity,message)`, repeated-run diagnostic order exact, no partial Domain, nonzero CTest discovery, no new warning and full CTest pass. Let Stop hook run automatically.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Exact duplicate normalization and incompatible duplicate error are distinct.
|
||||
- All missing/extra/ambiguous/cyclic/cross-scope/nonfinite failures occur before tolerance/analysis/HDF5.
|
||||
- Existing inputs without pressure remain unchanged.
|
||||
- Evidence records RED and GREEN commands/exits/durations/tails, expected diagnostic codes/locations/entities, warning count and repeated diagnostic sequence.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-002`–`004`, `013`–`017`; `io.md` §§2–6, 9; `formulation.md` §11; `numerical-review.md` §6 invalid-input checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not implement the evaluator/assembler, change tolerance, rewrite artifacts or refactor the general parser. 이유: 이 Step의 negative semantic scope 밖이다.
|
||||
- Do not weaken the valid multi-explicit-instance contract from Step 1.
|
||||
- Do not modify upstream docs, HDF5 writers, source reference files or phase statuses other than Step 2's Executor-selected record.
|
||||
- Do not run Abaqus, create output JSON, invoke `scripts/execute.py`, advance Step 3, commit or push.
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
# Step 3: evaluate-shell-pressure-kernel
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 one four-node shell facet의 reference/current surface-pressure `24x1` external force와 exact `24x24` external tangent를 backend-neutral하게 계산하는 것이다. Parser, full-space assembler, analysis procedure and HDF5 integration은 범위 밖이다. Same Step에서 RED, expected failure, minimal GREEN and complete VERIFY를 수행한다.
|
||||
|
||||
Implementation Agent는 Step 3 record의 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor는 branch, retry, timestamps, commit, advancement, top-level status and output JSON을 소유한다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md` §§6, 9–10, 13–14
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §§3–6
|
||||
- `docs/shell-surface-pressure-load/io.md` §§4–6, 9
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- `include/fesa/model/model_types.h`
|
||||
- `include/fesa/model/shell_geometry.h`
|
||||
- `src/fesa/model/shell_geometry.cpp`
|
||||
- `include/fesa/elements/mitc4_shell.h`
|
||||
- `src/fesa/elements/mitc4_shell.cpp`
|
||||
- `include/fesa/elements/nonlinear_mitc4_shell.h`
|
||||
- `src/fesa/elements/nonlinear_mitc4_shell.cpp`
|
||||
- `include/fesa/math/vector3.h`
|
||||
- `include/fesa/math/matrix.h`
|
||||
- `tests/unit/elements/mitc4_shell_test.cpp`
|
||||
- `tests/unit/elements/nonlinear_mitc4_shell_test.cpp`
|
||||
- `tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp`
|
||||
- `src/fesa/CMakeLists.txt`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
Prior-Step files to read: `src/fesa/io/abaqus/surface_definition_mapper.h/.cpp`, `include/fesa/model/model_types.h`, `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp`, `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp`, `tests/unit/io/abaqus/shell_surface_pressure_domain_test.cpp`. They define immutable side/magnitude/source identity only; this Step must not revise parser semantics.
|
||||
|
||||
## 소유 파일과 인터페이스
|
||||
|
||||
- Create test first: `tests/unit/loads/shell_surface_pressure_test.cpp`
|
||||
- Create: `include/fesa/loads/shell_surface_pressure.h`
|
||||
- Create: `src/fesa/loads/shell_surface_pressure.cpp`
|
||||
- Modify: `src/fesa/CMakeLists.txt`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
Implement this semantic interface:
|
||||
|
||||
```cpp
|
||||
enum class SurfacePressureConfiguration { kReference, kCurrent };
|
||||
|
||||
struct ShellSurfacePressureInput {
|
||||
std::array<Vector3, 4> reference_coordinates;
|
||||
std::array<Vector3, 4> translational_displacements;
|
||||
ShellSurfaceSide side;
|
||||
double pressure_magnitude;
|
||||
double load_factor;
|
||||
SurfacePressureConfiguration configuration;
|
||||
SourceLocation location;
|
||||
std::string entity_identity;
|
||||
};
|
||||
|
||||
struct ShellSurfacePressureContribution {
|
||||
std::array<double, 24> force;
|
||||
std::array<double, 24 * 24> external_tangent;
|
||||
};
|
||||
|
||||
Result<ShellSurfacePressureContribution> EvaluateShellSurfacePressure(
|
||||
const ShellSurfacePressureInput& input);
|
||||
```
|
||||
|
||||
The tangent is fixed-node/source-order row-major. Translation DOFs occupy local components 0–2 per node; all rotation force entries and all tangent rows/columns touching components 3–5 are exact zero. No MKL, TBB, HDF5, parser or procedure type may cross this public solver-core boundary.
|
||||
|
||||
## RED
|
||||
|
||||
Write and register these tests before the new production header/source:
|
||||
|
||||
- `ShellSurfacePressureKernel.PartitionsUnityAndIntegratesPlanarResultantAndMoment`
|
||||
- `ShellSurfacePressureKernel.ReversesExactlyForSposSnegAndNegativeMagnitude`
|
||||
- `ShellSurfacePressureKernel.UsesReferenceGeometryWithExactZeroLinearTangent`
|
||||
- `ShellSurfacePressureKernel.UsesCurrentAreaAndNormalForFollowerForce`
|
||||
- `ShellSurfacePressureKernel.HasExactZeroRotationalForceRowsAndTangentBlocks`
|
||||
- `ShellSurfacePressureKernel.IsTranslationAndRigidRotationObjective`
|
||||
- `ShellSurfacePressureKernel.IsCovariantUnderCyclicNodeRelabeling`
|
||||
- `ShellSurfacePressureKernel.MatchesCenteredFiniteDifferenceForForceAndResidualSigns`
|
||||
- `ShellSurfacePressureKernel.PreservesGenerallyNonsymmetricFollowerTangent`
|
||||
- `ShellSurfacePressureKernel.RejectsNonfiniteCollapsedFoldedAndInvertedGeometryAtEveryRequiredPoint`
|
||||
- `ShellSurfacePressureKernel.ValidatesGeometryEvenForZeroPressureOrFactor`
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureKernel\."
|
||||
```
|
||||
|
||||
Expected RED: compile/link fails because the evaluator declaration/definition is absent. If the header is staged first, physics assertions must fail until implementation exists. Record exact command, exit, duration and tail. Do not use existing MITC4 internal-force code as pressure GREEN. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Use one common `2x2` Gauss rule in fixed order `(-1/sqrt(3),-1/sqrt(3))`, `(+,-)`, `(+,+)`, `(-,+)` and bilinear four-node `N_i`/derivatives.
|
||||
- Let `s=+1` for SPOS and `s=-1` for SNEG. At each point use the approved area vector and compute `f_i = -lambda*p*s*sum(w*N_i*a)`.
|
||||
- Reference configuration ignores displacement and returns an exactly zero tangent. Current configuration uses only translations in `x=X+u`.
|
||||
- Implement the exact current follower derivative
|
||||
`K_ext,ij = lambda*p*s*sum(w*N_i*(N_j,xi*[g_eta]_x - N_j,eta*[g_xi]_x))`.
|
||||
Test both external-force derivative and residual-sign form. Never symmetrize it.
|
||||
- Validate finite input/intermediates and the approved mean/corner/Gauss chord-scaled geometry rules with the single dimensionless `tau_J=1e-12`. Validate geometry even if `p==0` or `lambda==0`.
|
||||
- Do not use `max(1,...)`, absolute floors, zero clamps, connectivity reorder or normal flips.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureKernel\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(Mitc4Shell|NonlinearMitc4Shell|NonlinearMitc4ShellTangent)\."
|
||||
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
|
||||
```
|
||||
|
||||
Acceptance:
|
||||
|
||||
- shape-function sum error `<=1e-14`;
|
||||
- normalized resultant, moment, sign, objectivity and covariance errors `<=1e-12`;
|
||||
- centered FD uses `h=1e-5` and normalized tangent error `<=1e-8`;
|
||||
- rotation blocks are bitwise/exact zero;
|
||||
- at least one approved off-diagonal antisymmetric tangent pair is nonzero;
|
||||
- every invalid geometry/nonfinite case fails without a contribution;
|
||||
- nonzero CTest inventory, full pass, no new MSVC warning.
|
||||
|
||||
The Stop hook runs automatically; do not execute hook entry points manually.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Force and tangent use identical geometry and Gauss evaluations.
|
||||
- Failure returns no contribution and does not mutate caller arrays/state.
|
||||
- Fixed loop/order yields deterministic values and diagnostics.
|
||||
- Record RED/GREEN/VERIFY commands, exits, durations/tails, normalized metrics, FD numerator/denominator/h, antisymmetric entries, exact-zero checks and diagnostic identity/location.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-005`–`009`, `016`, `020`–`021`; formulation §§6, 9–10, 13–14; numerical-review kernel/objectivity/tangent/geometry checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not alter MITC4 internal constitutive/stiffness formulation, add pressure stress recovery, configurable integration or vendor dependencies.
|
||||
- Do not implement full-space assembly or linear/nonlinear procedure changes; those belong to Steps 4–5.
|
||||
- Do not modify parser contracts, upstream docs, HDF5, tolerance or reference artifacts.
|
||||
- Do not run reference solvers, create output JSON, invoke Executor, advance Step 4, commit or push.
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
# Step 4: integrate-linear-shell-pressure
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 single responsibility는 Step 3 local evaluator를 deterministic full-space pressure assembler와 linear-static reference-configuration path에 연결하고 existing schema-0/CLI/reaction/equilibrium behavior를 검증하는 것이다. Nonlinear follower procedure는 Step 5 범위다.
|
||||
|
||||
Complete test-first RED, expected failure, minimal GREEN, focused and full VERIFY in this Step. Update only Step 4's selected status and one-line Codex-owned payload. Executor owns branch, retry, timestamps, commit, advancement, top-level phase status and output JSON.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md` §§9, 11–14
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §6
|
||||
- `docs/shell-surface-pressure-load/io.md` §§6–7, 9–10
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- Prior semantic outputs: `include/fesa/model/model_types.h`, `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp`, `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp`
|
||||
- Prior evaluator outputs: `include/fesa/loads/shell_surface_pressure.h`, `src/fesa/loads/shell_surface_pressure.cpp`, `tests/unit/loads/shell_surface_pressure_test.cpp`
|
||||
- `include/fesa/assembly/load_assembler.h`
|
||||
- `src/fesa/assembly/load_assembler.cpp`
|
||||
- `include/fesa/assembly/sparse_assembler.h`
|
||||
- `src/fesa/assembly/sparse_assembler.cpp`
|
||||
- `include/fesa/assembly/parallel_for.h`
|
||||
- `src/fesa/assembly/parallel_for.cpp`
|
||||
- `include/fesa/fem/dof_manager.h`
|
||||
- `src/fesa/fem/dof_manager.cpp`
|
||||
- `src/fesa/analysis/linear_static_procedure.cpp`
|
||||
- `include/fesa/analysis/analysis_state.h`
|
||||
- `src/fesa/analysis/analysis_state.cpp`
|
||||
- `include/fesa/results/result_recovery.h`
|
||||
- `src/fesa/results/result_recovery.cpp`
|
||||
- `src/fesa/results/global_equilibrium_recovery.h`
|
||||
- `src/fesa/results/global_equilibrium_recovery.cpp`
|
||||
- `include/fesa/io/hdf5/hdf5_results_writer.h`
|
||||
- `src/fesa/io/hdf5/hdf5_results_writer.cpp`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.h`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.cpp`
|
||||
- `src/fesa/app/fesa_application.cpp`
|
||||
- `tests/unit/assembly/load_assembler_test.cpp`
|
||||
- `tests/unit/assembly/sparse_assembler_test.cpp`
|
||||
- `tests/integration/analysis/linear_static_analysis_test.cpp`
|
||||
- `tests/integration/app/fesa_application_test.cpp`
|
||||
- `tests/unit/io/hdf5/hdf5_results_writer_test.cpp`
|
||||
- `src/fesa/CMakeLists.txt`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
## 소유 파일과 인터페이스
|
||||
|
||||
- Create test first: `tests/unit/assembly/surface_pressure_assembler_test.cpp`
|
||||
- Create test first: `tests/integration/analysis/shell_surface_pressure_linear_test.cpp`
|
||||
- Create test first: `tests/integration/app/shell_surface_pressure_application_test.cpp`
|
||||
- Create: `include/fesa/assembly/surface_pressure_assembler.h`
|
||||
- Create: `src/fesa/assembly/surface_pressure_assembler.cpp`
|
||||
- Modify: `src/fesa/analysis/linear_static_procedure.cpp`
|
||||
- Modify/Test assertions only: `tests/unit/io/hdf5/hdf5_results_writer_test.cpp`
|
||||
- Modify: `src/fesa/CMakeLists.txt`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
HDF5 production writer and `fesa_application.cpp` are expected no-change verification targets. Modify them only if a new RED test proves a direct approved-contract gap, and record that evidence and minimal reason.
|
||||
|
||||
Assembler contract:
|
||||
|
||||
```cpp
|
||||
struct SurfacePressureAssemblyCandidate {
|
||||
Vector full_external_force;
|
||||
SparseMatrix full_external_tangent;
|
||||
std::vector<Diagnostic> diagnostics;
|
||||
};
|
||||
|
||||
Result<SurfacePressureAssemblyCandidate> AssembleSurfacePressure(
|
||||
const AnalysisModel& model,
|
||||
const DofManager& dofs,
|
||||
const Vector& full_generalized_coordinates,
|
||||
double load_factor,
|
||||
SurfacePressureConfiguration configuration,
|
||||
const ParallelFor& parallel_for);
|
||||
```
|
||||
|
||||
The input vector is stable full-DOF `[u1,u2,u3,phi1,phi2,phi3]`. Produce local candidates in `(load_ordinal, facet_ordinal, instance declaration ordinal, element label, local row[,column])`, use worker-local buffers and reduce in that exact serial order. Workers never update global vector/CSR directly.
|
||||
|
||||
## RED
|
||||
|
||||
Write/register first:
|
||||
|
||||
- `SurfacePressureAssembly.AssemblesFullDofsInPressureFacetAndRecordOrder`
|
||||
- `SurfacePressureAssembly.AddsRepeatedRecordsAndAppliesUnitFactorExactlyOnce`
|
||||
- `SurfacePressureAssembly.IsBitwiseStableForSerialAndParallelLocalEvaluation`
|
||||
- `LinearShellSurfacePressure.UsesReferenceNormalAndAreaAfterPrescribedDisplacement`
|
||||
- `LinearShellSurfacePressure.AssemblesBeforeProjectionAndIncludesConstrainedReaction`
|
||||
- `LinearShellSurfacePressure.SatisfiesFreeResidualGlobalResultantAndMoment`
|
||||
- `LinearShellSurfacePressure.PreservesS4S4rMeshAndCyclicOrderInvariance`
|
||||
- `LinearShellSurfacePressure.WritesSchemaZeroWithoutPressureDataset`
|
||||
- `ShellSurfacePressureApplication.LinearFailurePreservesExistingFinalAndNoCandidate`
|
||||
- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingLinearBehavior`
|
||||
|
||||
Run before production implementation:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(SurfacePressureAssembly|LinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
```
|
||||
|
||||
Expected RED: assembler compile/link failure, or linear procedure assembles only CLOAD so pressure resultant/reaction remains zero and pressure CLI assertions fail. Record command, exit, duration and output tail. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Create evaluator inputs from immutable Domain source identity and stable DofManager scatter. Evaluate every `(load_ordinal, facet_ordinal)`, including zero pressure/factor geometry validation.
|
||||
- Keep worker-local force/tangent contributions. Validate all candidates before fixed serial reduction; no global concurrent writes.
|
||||
- In `LinearStaticProcedureExecutor`, preserve element stiffness assembly, `Kff/Kfc` partition and `Kff` factorization-before-load order.
|
||||
- Assemble existing CLOAD and reference pressure separately, checked-finite add their full-space forces, and assign `AnalysisState::ExternalForce()` exactly once before free/constrained projection.
|
||||
- Call pressure assembler with load factor exactly `1.0`, reference configuration and a full generalized-coordinate vector of the required size. Linear pressure tangent is exact zero and does not change stiffness.
|
||||
- Preserve `EffectiveFreeRhs(Ff-Kfc*dc)`, valid `0x0 Kff`, full displacement reconstruction and `K*d-F` recovery. Constrained residual is reaction; free residual is equilibrium evidence.
|
||||
- Preserve current schema version `0`, mandatory result inventory, CLI sibling naming and atomic candidate finalization. Add no surface/load/pressure dataset or metadata.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(SurfacePressureAssembly|LinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(LoadAssembly|SparseAssembly|LinearStaticCli|Mitc4ShellCli|Hdf5ResultsWriter)\."
|
||||
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
|
||||
```
|
||||
|
||||
Acceptance:
|
||||
|
||||
- normalized analytical force/moment/reaction/mesh/order errors `<=1e-12`;
|
||||
- global force and moment balance `<=1e-8` and approved existing free-residual gates;
|
||||
- serial/parallel external vectors, diagnostics and row order exact;
|
||||
- schema `0`, existing mandatory datasets only, no pressure-specific path;
|
||||
- failed pressure candidate leaves prior final bytes unchanged or no misleading final;
|
||||
- inputs without pressure retain current results;
|
||||
- nonzero CTest inventory, full pass, no new MSVC warning and runtime staging succeeds.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Full-space completion precedes projection; source/internal/equation IDs remain distinct.
|
||||
- Load factor is applied exactly once; repeated pressure records remain additive.
|
||||
- Any local/nonfinite/assembly/recovery failure returns before state/result publication.
|
||||
- Record RED/GREEN/VERIFY commands, exits, durations/tails, contribution order, external/reaction/residual/resultant values, schema inventory and final-file snapshots.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-005`–`007`, `010`–`013`, `016`–`020`; io §§6–7, 9–10; formulation §§9, 11–14; numerical-review linear/resultant/balance checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not implement nonlinear follower procedure, change the linear solver backend, HDF5 schema or output inventory.
|
||||
- Do not refactor existing load hierarchy beyond the new pressure assembler or expose MKL/TBB/HDF5 in public core.
|
||||
- Do not modify upstream docs, tolerance/reference artifacts or Abaqus files.
|
||||
- Do not run Abaqus, create output JSON, invoke Executor, advance Step 5, commit or push.
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
# Step 5: integrate-nonlinear-follower-pressure
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step의 단일 책임은 current-configuration follower pressure force와 generally nonsymmetric exact external tangent를 nonlinear full-Newton trial/commit lifecycle과 existing schema-1 output에 연결하는 것이다. Same Step에서 test-first RED, expected failure, minimal GREEN, focused/full VERIFY를 완료한다.
|
||||
|
||||
Implementation Agent는 Executor-selected Step 5만 수행하고 Step 5 `status`와 한 줄 `summary`/`error_message`/`blocked_reason`만 기록한다. Executor가 branch, retry, timestamps, commits, advancement, top-level status and output JSON을 소유한다.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/formulation.md` §§9.2–9.4, 11–14
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §6 nonlinear suite
|
||||
- `docs/shell-surface-pressure-load/io.md` §§6–7, 9–10
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- Prior outputs: `include/fesa/model/model_types.h`, `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp`, `include/fesa/analysis/analysis_model.h`, `src/fesa/analysis/analysis_model.cpp`
|
||||
- Prior evaluator/assembler: `include/fesa/loads/shell_surface_pressure.h`, `src/fesa/loads/shell_surface_pressure.cpp`, `include/fesa/assembly/surface_pressure_assembler.h`, `src/fesa/assembly/surface_pressure_assembler.cpp`, their unit tests
|
||||
- `include/fesa/analysis/nonlinear_static_control.h`
|
||||
- `src/fesa/analysis/nonlinear_static_control.cpp`
|
||||
- `include/fesa/analysis/nonlinear_static_procedure.h`
|
||||
- `src/fesa/analysis/nonlinear_static_procedure.cpp`
|
||||
- `include/fesa/analysis/nonlinear_analysis_state.h`
|
||||
- `src/fesa/analysis/nonlinear_analysis_state.cpp`
|
||||
- `include/fesa/elements/nonlinear_mitc4_shell.h`
|
||||
- `src/fesa/elements/nonlinear_mitc4_shell.cpp`
|
||||
- `include/fesa/solvers/linear/tangent_solver.h`
|
||||
- `include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h`
|
||||
- `src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp`
|
||||
- `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h`
|
||||
- `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.h`
|
||||
- `src/fesa/io/hdf5/hdf5_self_check.cpp`
|
||||
- `include/fesa/analysis/prepared_analysis.h`
|
||||
- `src/fesa/analysis/prepared_analysis.cpp`
|
||||
- `src/fesa/app/fesa_application.cpp`
|
||||
- `tests/integration/analysis/nonlinear_static_procedure_test.cpp`
|
||||
- `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp`
|
||||
- `tests/unit/solvers/linear/tangent_solver_test.cpp`
|
||||
- `tests/integration/app/shell_surface_pressure_application_test.cpp`
|
||||
- `tests/CMakeLists.txt`
|
||||
|
||||
Step 4 must already provide a validated full-space assembler and linear path. Do not change its reference-configuration semantics.
|
||||
|
||||
## 소유 파일과 procedure contract
|
||||
|
||||
- Create test first: `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp`
|
||||
- Modify test first: `tests/integration/app/shell_surface_pressure_application_test.cpp`
|
||||
- Modify test assertions: `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp`
|
||||
- Modify: `src/fesa/analysis/nonlinear_static_procedure.cpp`
|
||||
- Modify only if checked contribution composition requires a helper: `include/fesa/analysis/nonlinear_static_control.h`, `src/fesa/analysis/nonlinear_static_control.cpp`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
Existing PARDISO, HDF5 writer/self-check and application production files are expected no-change verification targets unless RED proves a direct approved-contract defect.
|
||||
|
||||
For each Newton trial, use the existing Step 4 interface:
|
||||
|
||||
```cpp
|
||||
Result<SurfacePressureAssemblyCandidate> AssembleSurfacePressure(
|
||||
const AnalysisModel& model,
|
||||
const DofManager& dofs,
|
||||
const Vector& full_generalized_coordinates,
|
||||
double load_factor,
|
||||
SurfacePressureConfiguration configuration,
|
||||
const ParallelFor& parallel_for);
|
||||
```
|
||||
|
||||
Evaluate internal and external candidates at the same trial. Compose
|
||||
`f_ext=f_fixed+f_pressure`, `K_ext=K_fixed+K_pressure`, `r=f_int-f_ext`, `K=K_int-K_ext`. Use the existing full-CSR unsymmetric `TangentSolver::FactorizeFresh`; never symmetrize pressure tangent.
|
||||
|
||||
## RED
|
||||
|
||||
Write/register first:
|
||||
|
||||
- `NonlinearShellSurfacePressure.AssemblesFollowerForceFromCurrentTrialGeometry`
|
||||
- `NonlinearShellSurfacePressure.FormsResidualAndTangentWithApprovedExternalSigns`
|
||||
- `NonlinearShellSurfacePressure.AppliesIncrementFactorExactlyOnce`
|
||||
- `NonlinearShellSurfacePressure.UsesFullUnsymmetricTangentSolverPath`
|
||||
- `NonlinearShellSurfacePressure.ConvergesOpenPatchAndPreservesAntisymmetricEvidence`
|
||||
- `NonlinearShellSurfacePressure.SatisfiesAcceptedFreeResidualAndFactorOneGlobalBalance`
|
||||
- `NonlinearShellSurfacePressure.IsObjectiveUnderRigidMotionAndTracksCurrentArea`
|
||||
- `NonlinearShellSurfacePressure.ReducesSerialAndParallelContributionsDeterministically`
|
||||
- `NonlinearShellSurfacePressure.InvalidTrialRollsBackCommittedFrameAndFinalOutput`
|
||||
- `NonlinearShellSurfacePressure.WritesSchemaOneExternalInternalResidualReactionAndEquilibrium`
|
||||
- `ShellSurfacePressureApplication.InputWithoutPressureRetainsExistingNonlinearBehavior`
|
||||
|
||||
Run before production edits:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
```
|
||||
|
||||
Expected RED: current nonlinear procedure includes fixed CLOAD only, so follower force/tangent, objectivity, sign, convergence or balance tests fail. Record command, exit, duration and tail. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- At every Newton trial call `AssembleSurfacePressure` with current full generalized coordinates, exact current increment `load_factor` and `kCurrent`.
|
||||
- Checked-finite add fixed and pressure force/tangent in stable order. Apply source pressure magnitude and load factor exactly once.
|
||||
- Keep pressure kinematics translation-only; rotation force and tangent blocks stay zero. Retain generally nonsymmetric external tangent and existing `MklPardisoTangentSolver` full CSR `mtype=11` path.
|
||||
- Form residual and tangent with approved signs in full space before constrained/free extraction. Internal/external residual and tangent must be from the same trial.
|
||||
- Complete and validate candidate kinematics, force/tangent, residual, equilibrium and convergence before `CommitAcceptedFrame`. Invalid geometry/nonfinite/factorization/solve failures must not append frames or replace final HDF5.
|
||||
- Preserve existing force/moment convergence channels and thresholds; do not add line search/arc length or alter factor sequence.
|
||||
- Preserve schema `1` and existing generalized internal/external/residual/reaction/global equilibrium datasets. Add no pressure dataset/version/metadata.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_integration_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearShellSurfacePressure|ShellSurfacePressureApplication)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearStaticProcedure|NonlinearStaticControl|TangentSolver|NonlinearHdf5ResultsWriter|NonlinearStaticReference)\."
|
||||
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
|
||||
```
|
||||
|
||||
Acceptance: local FD `<=1e-8`; objectivity/current-area normalized error `<=1e-12`; factor-one global force/moment balance `<=1e-8`; existing free force/moment residual nonzero-scale relative `<=1e-2`, zero-scale absolute `<=1e-3`; exact zero-scale rules; schema-1 unique factor-one frame projections exact; serial/parallel order exact; invalid trial rollback exact; all discovered tests pass with no warning/runtime staging failure.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Candidate-before-commit and same-trial internal/external data are mandatory.
|
||||
- Failure records deterministic last-completed Newton stage and pressure source identity but publishes no invalid state/output.
|
||||
- Record RED/GREEN/VERIFY commands, exits, durations/tails, load factor, force/tangent signs and nonsymmetry, solver spy events, iteration count, residual/balance metrics, HDF5 inventory and rollback snapshots.
|
||||
- Failure classification: `configure | compile | link | test | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-008`–`013`, `016`–`019`, `021`; io §§6–7, 9–10; formulation §§9–14; numerical-review follower/tangent/objectivity/open-patch/balance checks.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not add line search, arc length, new procedure, convergence threshold changes, PARDISO redesign or HDF5 fields.
|
||||
- Do not alter Step 3 force/tangent math or Step 4 linear path except a test-proven defect returned to the owning Step through Coordinator.
|
||||
- Do not modify upstream docs, tolerance/reference artifacts or run Abaqus.
|
||||
- Do not create output JSON, invoke Executor, advance Step 6, commit or push.
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
# Step 6: compare-pressure-reference
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
이 Step's single responsibility is to add deterministic comparison support between FESA schema-1 factor-one HDF5 and the exact stored shell-pressure displacement CSV using the unchanged common tolerance. It does not generate reference data and does not write final Gate 6 reports; Step 7 owns closure reports.
|
||||
|
||||
Complete RED, expected failure, minimal GREEN and full VERIFY here. Update only Step 6's status and one-line Codex-owned payload. Executor owns all timestamps, commits, retry/advancement, top-level status and output JSON.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `docs/TOLERANCE.md`
|
||||
- `docs/shell-surface-pressure-load/requirements.md`
|
||||
- `docs/shell-surface-pressure-load/numerical-review.md` §§6.2–6.3
|
||||
- `docs/shell-surface-pressure-load/reference-model.md`
|
||||
- `docs/shell-surface-pressure-load/io.md` §8
|
||||
- `docs/shell-surface-pressure-load/implementation-plan.md`
|
||||
- All prior implemented/test files from Steps 1–5, especially `tests/integration/analysis/shell_surface_pressure_nonlinear_test.cpp`
|
||||
- `tests/reference/reference_tolerance_policy.h`
|
||||
- `tests/reference/reference_tolerance_policy.cpp`
|
||||
- `tests/reference/reference_tolerance_policy_test.cpp`
|
||||
- `tests/reference/nonlinear_static_reference_comparison.h`
|
||||
- `tests/reference/nonlinear_static_reference_comparison.cpp`
|
||||
- `tests/reference/nonlinear_static_reference_cases_test.cpp`
|
||||
- `tests/reference/mitc4_reference_comparison.h`
|
||||
- `tests/reference/mitc4_reference_comparison.cpp`
|
||||
- `tests/reference/mitc4_reference_cases_test.cpp`
|
||||
- `tests/CMakeLists.txt`
|
||||
- Read-only exact artifacts listed below
|
||||
|
||||
## Exact read-only artifact contract
|
||||
|
||||
- Required input: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`, 56,665 bytes, SHA-256 `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`.
|
||||
- Required comparison CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv`, 111,182 bytes, SHA-256 `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`.
|
||||
- Optional review-only reaction CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv`, never verdict-changing.
|
||||
- Excluded stress CSV: `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv`, no comparison family.
|
||||
|
||||
Never rename, rewrite, normalize, repair, regenerate or reorder any artifact. Never run Abaqus or another reference solver. Run FESA only on a byte-identical copy under `.harness/build/reference/shell-surface-pressure-load/`.
|
||||
|
||||
## 소유 파일과 interface boundary
|
||||
|
||||
- Create test first: `tests/reference/shell_surface_pressure_reference_test.cpp`
|
||||
- Modify: `tests/reference/nonlinear_static_reference_comparison.h`
|
||||
- Modify: `tests/reference/nonlinear_static_reference_comparison.cpp`
|
||||
- Modify: `tests/CMakeLists.txt`
|
||||
|
||||
Preserve existing public operations and extend their per-case value contract minimally:
|
||||
|
||||
```cpp
|
||||
Result<std::vector<ArtifactSnapshot>> ArtifactCheck(
|
||||
const NonlinearReferenceCase& reference_case);
|
||||
Result<std::filesystem::path> CopyInputToExecutionDirectory(
|
||||
const NonlinearReferenceCase& reference_case);
|
||||
Result<GeneratedRunArtifacts> RunFesaApplicationOnCopiedInput(
|
||||
const NonlinearReferenceCase& reference_case,
|
||||
const std::filesystem::path& copied_input_path);
|
||||
Result<NonlinearReferenceComparisonReport> CompareHdf5ToReferenceCsv(
|
||||
const NonlinearReferenceCase& reference_case,
|
||||
const std::filesystem::path& hdf5_results_path);
|
||||
NonlinearReferenceClassification ClassifyReferenceComparison(
|
||||
const NonlinearReferenceComparisonReport& report);
|
||||
```
|
||||
|
||||
Represent required input/displacement, optional reaction and excluded stress disposition as explicit per-case value fields. Do not change `reference_tolerance_policy.*`.
|
||||
|
||||
## RED
|
||||
|
||||
Write/register first:
|
||||
|
||||
- `ShellSurfacePressureReference.AuditsExactRequiredArtifactsAndIgnoresOptionalReviewArtifacts`
|
||||
- `ShellSurfacePressureReference.SelectsUniqueSchemaOneFactorOneAcceptedFrame`
|
||||
- `ShellSurfacePressureReference.Projects729WideRowsTo2187LogicalRowsPerFamily`
|
||||
- `ShellSurfacePressureReference.MatchesByInstanceNodeLabelAndComponentNotRowOrder`
|
||||
- `ShellSurfacePressureReference.RejectsSchemaIdentityCardinalityMissingExtraDuplicateAndNonfiniteBeforeTolerance`
|
||||
- `ShellSurfacePressureReference.ClassifiesTranslationBlockingAndRotationWarningOnly`
|
||||
- `ShellSurfacePressureReference.ExcludesReactionAndStressFamiliesFromVerdict`
|
||||
- `ShellSurfacePressureReference.UsesUnchangedCommonScaleNearZeroRelativeAndRmsPolicy`
|
||||
- `ShellSurfacePressureReference.WritesDeterministicComparisonReport`
|
||||
|
||||
Run before comparator implementation:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
cmake --build .harness/build --config Debug --target fesa_reference_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
```
|
||||
|
||||
Expected RED: current nonlinear registry has no pressure case/disposition and assumes a legacy artifact portfolio, so the exact two-required-file contract, schema/frame projection or 729/2187 cardinality fails. Record command, exit, duration and tail. Unexpected pass is evidence-gap; unrelated failure is regression.
|
||||
|
||||
## Minimal GREEN
|
||||
|
||||
- Snapshot exact required artifacts before run, byte-copy only the input into the build tree, and run FESA application only.
|
||||
- Require HDF5 schema `1`, exact `Step-1`, a unique accepted frame with `load_factor==1`/`is_factor_one`, `/model/nodes`, and existing nodal displacement.
|
||||
- Join HDF5 nodes and CSV by `(instance_name="Part-1-1", source node label, component)`, never row order/internal index. Expand 729 wide rows to 2,187 `U1/U2/U3` logical rows and 2,187 `UR1/UR2/UR3` rows.
|
||||
- Reject schema/frame/identity/cardinality, missing, extra, duplicate and nonfinite rows before tolerance.
|
||||
- After prechecks only, call unchanged `EvaluateReferenceTolerance`: `S=max(abs(reference))`; near-zero band `0.01*S`; near-zero absolute row error `<=0.01*S`; otherwise relative `<=0.05`; `RMS(error)/S<=0.01`; zero-scale requires FESA exact zero.
|
||||
- Translation is blocking; rotation is warning-only. Reaction creates no numerical comparator family and is review-only; stress is excluded.
|
||||
- Produce deterministic row, family metric, warning and classification order. HDF5-derived CSV, if any, is debug-only and not official output.
|
||||
|
||||
## VERIFY and Acceptance Criteria
|
||||
|
||||
Use `.harness/config.json` first if present; otherwise:
|
||||
|
||||
```powershell
|
||||
cmake --build .harness/build --config Debug --target fesa_reference_tests
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^(NonlinearStaticReference|ReferenceTolerancePolicy|Mitc4Reference)\."
|
||||
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
|
||||
```
|
||||
|
||||
Acceptance: exact input/CSV size+hash unchanged before/after; 729 unique node keys; 2,187 rows in each U/UR family; all prechecks precede tolerance; common policy unchanged; U blocking and UR warning-only; reaction/stress dispositions exact; deterministic report; all discovered/full tests pass without new warning/runtime staging failure.
|
||||
|
||||
## 불변식, 실패 처리와 증거
|
||||
|
||||
- Artifact/precheck failure returns a failed classification without tolerance evaluation or artifact mutation.
|
||||
- Copied input/generated HDF5/log live only under build tree.
|
||||
- Record pre/post snapshots, copy/generated paths, selected frame identity, cardinalities, family scale/row/RMS/worst row, warnings, classification and RED/GREEN/VERIFY command evidence.
|
||||
- Failure classification: `configure | compile | link | test | reference-comparison | artifact | harness | environment | upstream-contract | regression | evidence-gap`.
|
||||
|
||||
Trace: `FESA-REQ-SHELL-PRESSURE-017`–`019`, `021`–`024`; io §8; reference-model §§3–8; numerical-review external acceptance.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not generate/edit/rename reference files, change tolerance, promote reaction/stress, add metadata requirements or run Abaqus.
|
||||
- Do not modify solver production unless failure is returned through Coordinator to the owning implementation Step.
|
||||
- Do not write final reports yet, create output JSON, invoke Executor, advance Step 7, commit or push.
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
# Step 7: verify-and-report-pressure-feature
|
||||
|
||||
## 실행 범위와 상태 소유권
|
||||
|
||||
This final Implementation-owned Step inspects all prior artifacts, performs fresh MSVC/CTest and exact pressure-reference gates, and completes the three Gate 6 evidence documents. Code changes are not the default scope. The required sequence is literally `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` after build/test gates.
|
||||
|
||||
Implementation Agent may update only Step 7's `status` and one-line `summary`/`error_message`/`blocked_reason`. Executor owns branch, retry, timestamps, commits, advancement, top-level phase completion and output JSON. This Step does not approve physics Gate 7 or release readiness.
|
||||
|
||||
## 읽어야 할 파일
|
||||
|
||||
- `AGENTS.md`
|
||||
- `docs/PRD.md`
|
||||
- `docs/ARCHITECTURE.md`
|
||||
- `docs/ADR.md`
|
||||
- `docs/CODINGSTYLE.md`
|
||||
- `docs/HARNESS.md`
|
||||
- `docs/HARNESS_WORKFLOW.md`
|
||||
- `.codex/hooks.json`
|
||||
- `.harness/config.json` if it exists at execution time
|
||||
- `CMakeLists.txt`, `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt`
|
||||
- Every `docs/shell-surface-pressure-load/*.md` upstream and approved plan
|
||||
- `phases/shell-surface-pressure-load/index.json`
|
||||
- All production/test files created or modified in Steps 1–6
|
||||
- `tests/reference/shell_surface_pressure_reference_test.cpp`
|
||||
- `tests/reference/nonlinear_static_reference_comparison.h/.cpp`
|
||||
- Exact read-only artifacts listed in Step 6 and `reference-model.md`
|
||||
|
||||
Read all prior Step summaries and changed files. Verify that every production change has a first-failing test record and that source/interface names remain consistent with the approved plan.
|
||||
|
||||
## 소유 파일
|
||||
|
||||
- Create/complete: `docs/shell-surface-pressure-load/implementation-report.md`
|
||||
- Create/complete: `docs/shell-surface-pressure-load/build-test.md`
|
||||
- Create/complete: `docs/shell-surface-pressure-load/reference-comparison.md`
|
||||
|
||||
Production, tests, CMake and phase files are read-only in this Step except Step 7's selected status/payload. If verification exposes an implementation defect, classify and return it to Coordinator/the owning earlier Step; do not silently repair it here.
|
||||
|
||||
## RED evidence preflight
|
||||
|
||||
First prove the three reports are absent/incomplete or contain no fresh final passing evidence. This expected evidence-state failure is Step 7 RED. Then inspect prior reports/summaries for recorded test-first RED commands and expected failures. If any source/test/CMake change lacks RED evidence, classify `evidence-gap` and stop; do not fabricate history.
|
||||
|
||||
Record the preflight result before running final gates.
|
||||
|
||||
## Fresh MSVC x64 Debug gates
|
||||
|
||||
If `.harness/config.json` exists, it takes precedence and the reports must record its exact resolved configure/build/test commands. Otherwise run exactly:
|
||||
|
||||
```powershell
|
||||
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
|
||||
"-DFESA_GTEST_SOURCE_DIR=C:/git/googletest" `
|
||||
"-DMKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl" `
|
||||
"-DTBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb" `
|
||||
"-DHDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake"
|
||||
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 -R "^(InpSyntax|ShellSurfacePressureInput|ShellSurfacePressureDomain|ShellSurfacePressureKernel|SurfacePressureAssembly|LinearShellSurfacePressure|NonlinearShellSurfacePressure|ShellSurfacePressureApplication|ShellSurfacePressureReference)\."
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure
|
||||
ctest --test-dir .harness/build -C Debug --output-on-failure -R "^ShellSurfacePressureReference\."
|
||||
```
|
||||
|
||||
Acceptance requires every exit `0`, nonzero discovered tests including every named feature suite, full CTest pass, no new `/W4 /WX` warning, correct MSVC/x64/Debug selection and successful MKL/TBB/HDF5 runtime staging. No Harness/Python files are in scope, so do not run Python tests unless separately authorized Harness/Python changes actually occurred; then record `uv run --with pytest python -m pytest -v -rs` and why.
|
||||
|
||||
## ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT
|
||||
|
||||
### ARTIFACT CHECK
|
||||
|
||||
Before running the pressure case, record path, SHA-256, bytes and timestamp for:
|
||||
|
||||
- required input `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp`: 56,665 bytes, `53718ccc9b41c23fcc1b509a51d66f1347e87aca43a74f1d6cec4d2085f4b90e`;
|
||||
- required displacement CSV: 111,182 bytes, `2fe53f98eac9f04779100721c3edf8049eb1dbfe733ebcbd819aeeed03b81198`;
|
||||
- reaction CSV as review-only inventory;
|
||||
- stress CSV as excluded inventory.
|
||||
|
||||
Confirm source history/commands do not invoke Abaqus. Copy only the exact input to `.harness/build/reference/shell-surface-pressure-load/`.
|
||||
|
||||
### COMPARE
|
||||
|
||||
Run FESA only on the copied input and locate generated schema-1 `<stem>_results.h5` and log. Use `ShellSurfacePressureReference` comparison to select exact Step-1 unique factor-one accepted frame and project `/model/nodes` plus nodal displacements by `(Part-1-1, source node label, component)`. Require 729 wide CSV rows, 2,187 U logical rows and 2,187 UR logical rows. Reject missing/extra/duplicate/nonfinite/schema/frame/identity errors before unchanged common tolerance.
|
||||
|
||||
### CLASSIFY
|
||||
|
||||
- Blocking fail: any precheck, U1/U2/U3 tolerance, required internal free-residual/global-equilibrium or artifact immutability failure.
|
||||
- Warning-only: UR1/UR2/UR3 deviations when all blocking gates pass.
|
||||
- Review-only/excluded: reaction/stress cannot change the verdict.
|
||||
- Classify failures as `implementation | test | configure | compile | link | reference-comparison | infrastructure | environment | artifact | regression | evidence-gap | upstream-contract`.
|
||||
|
||||
Any nonzero command, zero tests, new warning, runtime staging failure, artifact mutation, cardinality mismatch or U/internal blocking failure leaves Step non-completed. Retain evidence and return to Coordinator; do not adjust tolerance or artifacts.
|
||||
|
||||
### REPORT
|
||||
|
||||
Write complete Korean Markdown reports:
|
||||
|
||||
- `implementation-report.md`: metadata, task order, RED/GREEN/VERIFY evidence per Step, exact changed files/interfaces, 24-requirement coverage, implementation acceptance, limitations and handoff.
|
||||
- `build-test.md`: `owner_agent: implementation-agent`, environment/toolchain/config selection, each command, exit, duration, stdout/stderr tail, test discovery/count/results, warning/runtime inventory, failure classification, no-change assertion and open issues.
|
||||
- `reference-comparison.md`: exact artifact inventory and pre/post snapshots, generated HDF5/log, schema/frame projection, source identity/component matching, row prechecks, unchanged tolerance, per-family/per-row decisions, maximum absolute/relative applicable error, RMS and other contract-applicable metrics, U/UR disposition, internal gates, deterministic classification, no-change assertion and open issues.
|
||||
|
||||
Do not claim release readiness. A passing Gate 6 report recommends only `pass-for-physics-evaluation` through Coordinator.
|
||||
|
||||
## Final Acceptance Criteria
|
||||
|
||||
- All 24 `FESA-REQ-SHELL-PRESSURE-001`–`024` map to at least one implemented task and passing test/evidence; orphan count zero.
|
||||
- Fresh MSVC x64 Debug build, focused suite, nonzero discovery and full CTest pass with zero new warnings.
|
||||
- Exact artifacts remain byte-for-byte unchanged after FESA-only run.
|
||||
- Schema 0/1 contracts and no-pressure regressions pass; no pressure dataset/schema/version/CLI expansion.
|
||||
- Pressure reference U blocking passes, UR remains warning-only, reaction review-only, stress excluded; internal equilibrium passes.
|
||||
- Reports contain commands, exits, durations, tails and classification; no fabricated RED evidence.
|
||||
- Automatic Stop whole-project validation succeeds. Do not run hook entry points manually.
|
||||
|
||||
## 금지사항
|
||||
|
||||
- Do not fix source/tests/CMake silently, generate reference data, run Abaqus, alter tolerance, upstream docs or artifact bytes.
|
||||
- Do not approve physics/release gates, create Executor output JSON, invoke `scripts/execute.py`, update timestamps, commit or push.
|
||||
- Do not select another Step. 이유: this is the final Executor-selected implementation evidence Step only.
|
||||
|
||||
Reference in New Issue
Block a user