diff --git a/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md b/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md new file mode 100644 index 0000000..c6bb413 --- /dev/null +++ b/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md @@ -0,0 +1,921 @@ +# Linear Static MITC4 Shell Implementation Plan + +> **For agentic implementation workers:** 이 문서는 사용자 승인 전 `draft`다. 승인 후 +> Implementation Planning Agent가 같은 내용으로 Harness phase planning files만 +> materialize한다. Implementation Agent는 승인된 phase의 pending Step을 +> `docs/HARNESS.md`와 `docs/HARNESS_WORKFLOW.md`에 따라 하나씩 실행해야 하며, +> Harness hook/runner lifecycle을 우회해서는 안 된다. + +## 1. Metadata + +- feature_id: `linear-static-mitc4-shell` +- document_type: `implementation-plan` +- status: `ready-for-implementation` +- approval_state: `harness-step-draft-approved-2026-08-12` +- owner_agent: `implementation-planning-agent` +- date: `2026-08-12` +- source_requirement: `docs/requirements/linear-static-mitc4-shell.md` +- source_research: `docs/research/linear-static-mitc4-shell-research.md` +- source_formulation: `docs/formulations/mitc4-shell-formulation.md` +- source_numerical_review: + `docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- source_io_definition: + `docs/io-definitions/linear-static-mitc4-shell-io.md` +- source_reference_models: + `docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- target_platform: `Windows x64 / MSVC / C++17` +- build_system: `CMake + CTest` +- execution_infrastructure: `Python Harness` +- current_numerical_verdict: `pass-for-implementation-planning` +- harness_task_name_candidate: `linear-static-mitc4-shell` +- implementation_authorized: `true-user-requested-2026-08-12` +- harness_execution_authorized: `true-user-requested-2026-08-12` +- phase_files_authorized: `true-user-approved-2026-08-12` + +### Goal + +승인된 Abaqus `.inp` subset의 `S4` 및 `S4R` source element를 하나의 FESA +`FESA-MITC4` 선형 정적 shell formulation으로 해석하고, 물리적으로 분리된 fixed +drilling stabilization, deterministic sparse assembly, mandatory HDF5 shell results, +두 declared displacement reference case를 end-to-end로 연결한다. + +### Architecture + +기존 B33 경로를 파괴하거나 speculative common element hierarchy를 만들지 않는다. +Domain에 shell semantic records를 추가하고, 별도 concrete `Mitc4Shell` kernel과 +shell-specific recovery를 만든다. 기존 `Analysis` lifecycle, six-DOF nodal +load/constraint, sparse COO reduction, `LinearSolver`, generic `ResultsWriter` 경계, +HDF5 temporary/self-check/atomic replacement는 재사용한다. + +### Tech Stack + +- C++17, MSVC `/W4 /WX` +- CMake 3.25+, Visual Studio 18 2026 generator, x64 Debug +- GoogleTest/CTest +- Intel oneAPI MKL and TBB +- HDF5 schema version 0 +- Python 3 Harness runner and repository hooks + +### Global Constraints + +1. 모든 production behavior는 같은 Step 안에서 `RED -> observed failure -> + minimal GREEN -> focused VERIFY -> full VERIFY`를 닫는다. +2. production C++ 파일 변경은 관련 C++ test와 함께 수행한다. +3. public solver headers에 MKL, TBB, HDF5, Win32/vendor type을 노출하지 않는다. +4. Node/Element에 equation ID를 저장하지 않고 `DofManager`만 numbering, scatter, + constrained/free mapping 및 sparse pattern을 소유한다. +5. `S4`와 `S4R`은 같은 FESA numerical path를 사용하며 source metadata만 다르다. +6. physical 20-DOF kernel과 four numerical drilling coordinates를 recovery/output에서 + 분리한다. +7. reference files를 생성, 수정, rename, repair, normalize하지 않으며 Abaqus를 + 실행하지 않는다. +8. future geometrically nonlinear residual/tangent, distributed loads, mixed beam-shell + models, reduced integration/hourglass, drilling calibration/energy output, + `NR-O03`/`NR-O04`는 구현 범위 밖이다. +9. 이 `draft`의 승인은 phase planning files 작성만 허용한다. Harness 실행은 별도의 + 명시적 사용자 요청이 있어야 한다. + +## 2. Readiness Check + +| gate | evidence | status | planning consequence | +| --- | --- | --- | --- | +| Requirements | `docs/requirements/linear-static-mitc4-shell.md`, 001-072 approved | pass | 모든 must를 task/test에 추적 | +| Research | `docs/research/linear-static-mitc4-shell-research.md` | pass | source-backed MITC4 tying/director/drilling 경계 유지 | +| Formulation | `docs/formulations/mitc4-shell-formulation.md`, `approved-for-implementation-planning` | pass | linear sections만 구현; Section 15 future nonlinear 제외 | +| Numerical Review | `docs/numerical-reviews/linear-static-mitc4-shell-review.md` | pass | critical blocker 없음; planning authorized | +| I/O | `docs/io-definitions/linear-static-mitc4-shell-io.md`, `approved-for-implementation-planning` | pass | keyword, diagnostic, HDF5 schema를 그대로 구현 | +| Reference Model | `docs/reference-models/linear-static-mitc4-shell-reference-models.md` | pass | 두 input/CSV pair만 read-only 사용 | +| Repository seams | parser/model, element/analysis, result/reference 영역 read-only 조사 | pass | candidate files와 current signatures 확인 | +| Toolchain paths | GoogleTest/MKL/TBB/HDF5 config directories 존재 | pass | Section 10의 exact configure command 사용 가능 | + +Toolchain path evidence was resolved in this workspace on `2026-08-12`with +`Test-Path -LiteralPath`returning `True`for all four literal directories used in +Sections 10 and 12. They are environment-resolved paths, not placeholders. Each Step +copies the fail-fast path precheck before CMake so a changed machine configuration +stops before RED/GREEN evidence is recorded. + +Declared read-only reference inventory: + +| case | source | displacement CSV | SHA-256 | +| --- | --- | --- | --- | +| S4 | `reference/shell/shell.inp` | `reference/shell/shell displacements.csv` | input `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF`; CSV `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | +| S4R | `reference/shellR/shellR.inp` | `reference/shellR/shellR displacements.csv` | input `1325940FB42B78961CF25E84379BF2693846FAD22473E7688AC5456B37B18CB4`; CSV `8887ACC5ED007CB97583A9FDC1150B48B9297E269A5BA8EBA6C1A5F6306E98CB` | + +README, `metadata.json`, Abaqus provenance/version, canonical naming 및 추가 portfolio는 +readiness gate가 아니다. 현재 열린 product/numerical 결정은 없다. 남은 승인 항목은 +Section 12의 multi-Step Harness draft뿐이다. + +## 3. Implementation Scope + +### Included behavior + +- exactly one `*STEP, *STATIC`, small displacement/small rotation +- four-node `S4`/`S4R` parsing and one internal `FESA-MITC4` identity +- stable source instance/label/type and four-node source ordering +- homogeneous isotropic `E,nu` and centered single-layer constant `t` +- deterministic positive-thickness nodal directors and right-handed frames +- six global nodal DOFs; 24-entry shell scatter +- physical membrane, bending, transverse shear with MITC edge-midpoint tying +- common `2x2x2` Gauss integration for S4 and S4R +- fixed `k_d=10^-3 min(R+)` drilling stabilization from the eight physical + tangent-rotation diagonals only +- nodal BC and global CLOAD; aggregate director-parallel moment rejection +- deterministic global stiffness, constrained partition, factorize-before-load, + effective RHS, solve, full residual/reaction +- physical-only shell recovery, energy/equilibrium/verification metrics +- exact mandatory HDF5 model/result schema and failure-atomic finalization +- direct HDF5-to-Abaqus-displacement comparison: U blocking, UR warning-only + +### Non-goals + +- Abaqus `S4`/`S4R` algorithm equivalence +- B31 mapping, mixed B33/MITC4 model execution or common public element hierarchy +- `*DLOAD`, pressure, gravity, body/edge/follower load +- composite, offsets, variable thickness, explicit normal/orientation +- reduced integration, hourglass control, MITC4+ +- nonlinear state, finite director update, nonlinear residual/tangent execution +- drilling physical strain/load/result/stress/energy, coefficient sweep or calibration +- `NR-O03` smooth-angle and `NR-O04` warp/distortion threshold sweeps +- extra shell benchmarks as a completion gate +- Abaqus execution or reference artifact mutation + +## 4. Work Breakdown + +Tasks are ordered by implementation dependency. Harness executes Steps 0-13 in strict +order even when the minimal dependency set below is smaller. + +| task | depends on | +| --- | --- | +| TASK-00 | none | +| TASK-01 | TASK-00 | +| TASK-02 | TASK-01 | +| TASK-03 | TASK-02 | +| TASK-04 | TASK-03 | +| TASK-05 | TASK-04 | +| TASK-06 | TASK-00; executed after TASK-05 | +| TASK-07 | TASK-04, TASK-06 | +| TASK-08 | TASK-02, TASK-07 | +| TASK-09 | TASK-05, TASK-08 | +| TASK-10 | TASK-05, TASK-09 | +| TASK-11 | TASK-09, TASK-10 | +| TASK-12 | TASK-01, TASK-07, TASK-08, TASK-10, TASK-11 | +| TASK-13 | TASK-11, TASK-12 | +| TASK-14 | TASK-13 | +| TASK-15 | TASK-13 | +| TASK-16 | TASK-00 through TASK-15 | + +### TASK-00: `shell-semantic-model` + +- Own only model semantic records and immutable Domain access. +- Candidate additions: `Mitc4ShellDefinition`, `ShellSection`, source type enum/value, + internal formulation identity, four-node indices, material/section indices, node + director/frame storage. +- Preserve current B33 records and stable source/internal identity; reject mixed models + at mapping rather than designing a heterogeneous solver hierarchy. +- Tests: `MITC4-MODEL-001`, `MITC4-MODEL-002`. + +### TASK-01: `shell-domain-mapping` + +- Extend `AbaqusDomainMapper::map(const ParsedInput&)`; keep `AbaqusInputReader` + syntax-only. +- Accept exact S4/S4R and single-layer SHELL SECTION grammar, resolve ELSET/material, + identity wrappers and six-DOF BC/CLOAD. +- Fail closed with exact I/O diagnostic classes for connectivity, assignment, + unsupported option/procedure/mixed model/distributed load. +- Tests: `MITC4-MAP-001` through `MITC4-MAP-004`. + +### TASK-02: `shell-director-geometry` + +- Add deterministic geometry preprocessing after instance expansion: element normal + candidates, area-weighted nodal director, pairwise orientation validation and nodal + frame tie-break. +- Validate center, eight stiffness points, four tying points and committed recovery + points for finite bases, nonzero surface measure and positive finite Jacobian. +- Do not introduce calibrated angle, warp or distortion thresholds. +- Tests: `MITC4-GEO-001` through `MITC4-GEO-004`. + +### TASK-03: `mitc4-kinematics-constitutive` + +- Create concrete candidate `Mitc4Shell` without a public base hierarchy. +- Implement shape identities, local frames, `T_p`/`T_d` channel maps, direct + membrane/bending terms, all four covariant MITC tying samples/interpolation, + engineering-shear factors, `C_ps/C_5/A/D/A_s` and fixed point order. +- Keep all intermediate physical coordinates at 20 DOFs. +- Tests: `MITC4-KIN-001` through `MITC4-KIN-005`. + +### TASK-04: `mitc4-stiffness-drilling` + +- Form physical `K20` with common `2x2x2` integration and embed by congruence. +- Build `R+` only from the eight physical tangent-rotation diagonals, use exact + `k_d=10^-3 min(R+)` and `T_d^T(k_d I4)T_d`; fail empty/nonfinite `R+`. +- Tests: `MITC4-KERNEL-001` through `MITC4-KERNEL-006`. + +### TASK-05: `mitc4-physical-recovery` + +- Add only the element-kernel physical recovery seam for generalized strain/resultant, + bottom/middle/top stress and physical element energy. +- Prove pure numerical drill action contributes zero to every physical recovery value. +- Tests: `MITC4-KERNEL-007`, `MITC4-PHYSREC-001`. + +### TASK-06: `shell-dof-scatter` + +- Retain six per-node full DOFs and add typed 24-entry shell scatter/pattern access; + preserve existing 12-entry B33 behavior. +- Preserve stable full/free/constrained numbering and all-constrained `0x0 Kff`. +- Tests: `MITC4-DOF-001` through `MITC4-DOF-003`. + +### TASK-07: `shell-sparse-assembly` + +- Dispatch shell topology to `Mitc4Shell::globalStiffness()`. +- Emit 576 element-local COO entries with stable `elementOrder`/`localOrder` into + worker-owned buffers; preserve canonical fixed reduction and diagonal slots. +- Tests: `MITC4-ASM-001` through `MITC4-ASM-003`. + +### TASK-08: `shell-load-validation` + +- Reuse global six-DOF `LoadAssembler` and existing constraint partition. +- Aggregate CLOAD deterministically before testing exact-zero or + `rho_M=abs(dot(d,M))/norm(M)<=1e-12`; rejected moments never reach stabilization. +- Preserve force/moment units and factorization-before-load lifecycle. +- Tests: `MITC4-LOAD-001` through `MITC4-LOAD-004`. + +### TASK-09: `shell-analysis-state` + +- Add shell result rows to `AnalysisState` and `result_records.hpp`: four fixed + midsurface locations, local frames, eight generalized strains/resultants, + bottom/middle/top stress, physical energy, equilibrium and verification metrics. +- Preserve stable row order and expose candidate-owned containers only; perform no + element calculation in this task. +- Tests: `MITC4-STATE-001` through `MITC4-STATE-003`. + +### TASK-10: `shell-result-recovery` + +- Recover full residual `K*d-F` for nodal reaction/equilibrium evidence but call the + kernel physical-only recovery for shell quantities. +- Validate candidates fully before committing state; keep stable row order. +- Tests: `MITC4-REC-001` through `MITC4-REC-005`. + +### TASK-11: `shell-hdf5-output` + +- Extend `Hdf5ResultsWriter` behind the unchanged generic `ResultsWriter::write` + boundary. +- Add exact schema paths/shapes/component attributes from the I/O contract without + changing B33 dataset meaning. +- Reuse temporary write, finite/schema self-check, close/reopen and atomic replace. +- Tests: `MITC4-H5-001` through `MITC4-H5-004`. + +### TASK-12: `shell-linear-static-flow` + +- Route a shell Domain through the existing eight-hook `Analysis::run()` lifecycle. +- Preserve assemble/partition, factorize, load/effective RHS, substitute, + reconstruct, full residual/recover, atomic write order and single factorization. +- Validate nonzero prescribed values, singular support and valid all-constrained solve. +- Tests: `MITC4-FLOW-001` through `MITC4-FLOW-004`. + +### TASK-13: `shell-reference-comparison` + +- Add a test-only MITC4 comparator rather than widening beam-specific assumptions. +- Consume exactly one declared input and displacement CSV per case; map instance, + source node and six displacement components directly to HDF5. +- Precheck header/row set/duplicates/nonfinite/schema/identity before numeric work. +- Apply `1e-9+1e-6*reference_scale_c`; U blocks, UR only emits deterministic warning; + record all required metrics and worst row. +- Tests: `MITC4-REF-001` through `MITC4-REF-006`. + +### TASK-14: `shell-s4-end-to-end` + +- This is declared-case sub-work owned by TASK-13/Step 13's test-only reference module, + not an independent production-module Step. +- Run the declared S4 deck through CLI, authoritative HDF5, schema checks and + read-only comparator. +- Assert source type `S4`, internal `FESA-MITC4` and U pass/UR report behavior. +- Tests: `MITC4-E2E-S4-001`, `MITC4-E2E-S4-002`. + +### TASK-15: `shell-s4r-end-to-end` + +- This is declared-case sub-work owned by TASK-13/Step 13's test-only reference module, + not an independent production-module Step. +- Run the declared S4R deck through the identical numerical route. +- Assert only source metadata differs from an otherwise identical S4 semantic fixture; + no reduced integration/hourglass branch exists. +- Tests: `MITC4-E2E-S4R-001`, `MITC4-E2E-S4R-002`. + +### TASK-16: `mitc4-full-verification` + +- Run MSVC x64 Debug full build, CTest discovery, focused feature suites and full CTest. +- Audit warnings, deterministic repeat evidence, required HDF5 inventory, reference + immutability and git diff scope. +- Produce only downstream implementation evidence; do not claim reference verification, + physics sanity or release readiness. +- Tests/audits: `MITC4-VERIFY-001` through `MITC4-VERIFY-004`. + +## 5. TDD Test Plan + +| test id | initial RED assertion | minimal GREEN behavior | focused verification | +| --- | --- | --- | --- | +| MITC4-MODEL-001 | four-node S4/S4R records/director/source identity do not exist | immutable shell records preserve source and internal identity | `DomainModel.*` | +| MITC4-MODEL-002 | shell section/material/thickness ownership unavailable | one resolved centered homogeneous assignment per element | `DomainModel.*` | +| MITC4-MAP-001 | valid S4/S4R and SHELL SECTION reject | both source types map to FESA-MITC4 | `InpDomainMapping.*` | +| MITC4-MAP-002 | duplicate/unresolved/conflicting section cases lack exact errors | exact assignment/material validation | `InpDomainMapping.*` | +| MITC4-MAP-003 | excluded shell options/mixed models may be ignored | exact fail-closed diagnostics | `InpDomainMapping.*` | +| MITC4-MAP-004 | second/nonstatic/NLGEOM/DLOAD cases lack shell boundary tests | exact procedure/load rejection; no-op output unchanged | `InpDomainMapping.*` | +| MITC4-GEO-001 | planar/rotated/warped directors unavailable | deterministic unit director and right-handed frame | `Mitc4Geometry.*` | +| MITC4-GEO-002 | incident orientation/tie-break is untested | stable area-weighted result across repeated order | `Mitc4Geometry.*` | +| MITC4-GEO-003 | duplicate/bow-tie/zero/reversed/nonfinite geometry may pass | exact geometry failures | `Mitc4Geometry.*` | +| MITC4-GEO-004 | required-point Jacobian inventory absent | every required point finite and positive | `Mitc4Geometry.*` | +| MITC4-KIN-001 | shape/derivative identities unavailable | partition/unity/derivative identities | `Mitc4ShellKinematics.*` | +| MITC4-KIN-002 | frame/T transforms unavailable | orthonormal/right-handed frames and channel selection | `Mitc4ShellKinematics.*` | +| MITC4-KIN-003 | tying values/weights unavailable | four hand-computed covariant tying values | `Mitc4ShellKinematics.*` | +| MITC4-KIN-004 | constitutive/section matrices unavailable | exact coefficients, symmetry, positivity, unit rescaling | `Mitc4ShellConstitutive.*` | +| MITC4-KIN-005 | quadrature order not fixed | exact common 2x2x2 points/weights | `Mitc4ShellKinematics.*` | +| MITC4-KERNEL-001 | no 24x24 shell stiffness | finite symmetric 24x24 stiffness | `Mitc4ShellKernel.*` | +| MITC4-KERNEL-002 | energy congruence unavailable | 20/24 virtual work and energy equal within 1e-12 | `Mitc4ShellKernel.*` | +| MITC4-KERNEL-003 | rigid/rank checks fail | six physical rigid modes, physical rank 14, stabilized rank 18 | `Mitc4ShellKernel.*` | +| MITC4-KERNEL-004 | deformation energy/patch fields unavailable | positive membrane/bending/shear/twist modes | `Mitc4ShellPatch.*` | +| MITC4-KERNEL-005 | R+ membership/coefficient not implemented | exact rotational-only min and 1e-3 factor | `Mitc4ShellDrilling.*` | +| MITC4-KERNEL-006 | empty R+ and pure drill behavior unspecified | deterministic failure; pure drill stabilized | `Mitc4ShellDrilling.*` | +| MITC4-KERNEL-007 | drilling contaminates recovery/energy | physical recovery/energy exact zero for pure drill | `Mitc4ShellDrilling.*` | +| MITC4-PHYSREC-001 | kernel recovery contract is not independently callable | exact physical strain/resultant/stress/energy for hand field | `Mitc4ShellPhysicalRecovery.*` | +| MITC4-DOF-001 | shell scatter fixed at 12 | stable 24-entry scatter in node/component order | `DofManager.*` | +| MITC4-DOF-002 | shell pattern unavailable | sorted unique pattern with all diagonals | `DofManager.*` | +| MITC4-DOF-003 | constraint roundtrip lacks shell-sized system | no/mixed/all constraints and nonzero values roundtrip | `DofManager.*; EssentialConstraints.*` | +| MITC4-ASM-001 | assembler rejects four-node element | 576 stable local contributions assemble | `SparseAssembly.*` | +| MITC4-ASM-002 | thread/repetition may reorder | serial/TBB/repeated CSR bytes and values match | `SparseAssembly.*` | +| MITC4-ASM-003 | S4/S4R could branch numerically | identical semantic fixtures produce identical K | `SparseAssembly.*` | +| MITC4-LOAD-001 | shell force/moment fixture unavailable | six global components aggregate stably | `LoadAssembly.*` | +| MITC4-LOAD-002 | director-parallel exact-zero branch untested | zero aggregate moment accepted | `LoadAssembly.*` | +| MITC4-LOAD-003 | rho boundary/rejection untested | <=1e-12 accepted; >1e-12 exact diagnostic | `LoadAssembly.*` | +| MITC4-LOAD-004 | rejected moment might enter drill channel | failure occurs before RHS/substitution | `LoadAssembly.*` | +| MITC4-STATE-001 | AnalysisState has no shell row containers | exact shell row/component/location types are owned | `AnalysisState.*` | +| MITC4-STATE-002 | physical energy/equilibrium/metrics are absent | finite candidate global evidence is stored | `AnalysisState.*` | +| MITC4-STATE-003 | shell candidate rollback is unavailable | invalid candidate leaves prior state unchanged | `AnalysisState.*` | +| MITC4-REC-001 | shell row types absent | four ordered location/frame/strain/resultant rows | `ResultRecovery.*` | +| MITC4-REC-002 | bottom/middle/top stress absent | direct S11/S22/S12 recovery in fixed order | `ResultRecovery.*` | +| MITC4-REC-003 | energy may include drilling | physical strain energy excludes stabilization | `ResultRecovery.*` | +| MITC4-REC-004 | reaction/equilibrium semantics may diverge | full residual, force/moment balance, normalized metrics | `ResultRecovery.*` | +| MITC4-REC-005 | invalid partial rows may commit | nonfinite/inventory failure preserves old state | `ResultRecovery.*` | +| MITC4-H5-001 | shell metadata/model schema missing | exact metadata, elements, director/frame, material/section | `Hdf5ResultsWriter.*` | +| MITC4-H5-002 | mandatory shell result paths missing | exact displacement/reaction/frame/strain/resultant/stress/global rows | `Hdf5ResultsWriter.*` | +| MITC4-H5-003 | output request could filter or drilling paths appear | inventory unconditional; forbidden paths absent | `Hdf5ResultsWriter.*` | +| MITC4-H5-004 | invalid shell candidate may replace final file | self-check failure preserves prior final | `Hdf5ResultsWriter.*` | +| MITC4-FLOW-001 | shell cannot traverse Analysis lifecycle | exact hook order and one factorization | `LinearStaticCli.*` | +| MITC4-FLOW-002 | prescribed shell RHS/reconstruction absent | Ff-Kfc*dc and full displacement correct | `LinearStaticCli.*` | +| MITC4-FLOW-003 | singular/all-constrained behavior unproven | singular fails; 0x0 Kff succeeds | `LinearStaticCli.*` | +| MITC4-FLOW-004 | failed output may commit state | candidate state/output commits only after validation | `LinearStaticCli.*` | +| MITC4-REF-001 | six-column CSV header unsupported | exact MITC4 header maps instance/node/U/UR | `Mitc4ReferenceComparison.*` | +| MITC4-REF-002 | invalid row inventory may be ignored | missing/extra/duplicate/nonfinite/schema mismatch fails first | `Mitc4ReferenceComparison.*` | +| MITC4-REF-003 | tolerance could clamp/row-normalize | exact component group scale and mixed tolerance | `Mitc4ReferenceComparison.*` | +| MITC4-REF-004 | UR may block verdict | U blocks; UR only warns | `Mitc4ReferenceComparison.*` | +| MITC4-REF-005 | report metrics/order incomplete | row decisions, max, normalized, RMS, vector, worst row deterministic | `Mitc4ReferenceComparison.*` | +| MITC4-REF-006 | comparator may require administrative files | only declared input/CSV/HDF5 required | `Mitc4ReferenceComparison.*` | +| MITC4-E2E-S4-001 | S4 deck cannot produce valid shell HDF5 | CLI succeeds with exact S4 metadata/schema | `Mitc4S4Reference.*` | +| MITC4-E2E-S4-002 | S4 U comparison unavailable | all U rows pass; UR fully reported | `Mitc4S4Reference.*` | +| MITC4-E2E-S4R-001 | S4R deck selects no/other path | same FESA-MITC4 integration rule | `Mitc4S4RReference.*` | +| MITC4-E2E-S4R-002 | S4R U comparison unavailable | all U rows pass; UR fully reported | `Mitc4S4RReference.*` | +| MITC4-VERIFY-001 | feature tests not discoverable | all planned suites discovered/labeled | CTest JSON inventory | +| MITC4-VERIFY-002 | warnings/regressions unknown | MSVC Debug full build passes /W4 /WX | full build | +| MITC4-VERIFY-003 | nondeterminism unknown | repeated focused/full tests pass | full CTest | +| MITC4-VERIFY-004 | artifact governance unknown | reference hashes/path and git diff unchanged | read-only audit | + +Numerical thresholds are fixed: frame/symmetry/transformation-energy `<=1e-12`; +rigid action, linear residual and global equilibrium `<=1e-10`. Patch tests compare +against independently hand-computed analytical fields and signs, not the production +routine itself. + +## 6. CMake/CTest Plan + +### Existing topology to preserve + +- production library: `fesa_solver` +- CLI: `fesa_cli` +- unit: `fesa_unit_tests` +- integration: `fesa_integration_tests` +- reference: `fesa_reference_tests` +- aggregate: `fesa_tests` + +No new executable target is required. New kernel/test/comparator source files are +explicitly registered in existing source lists. Add `linear-static-mitc4-shell` as an +additive CTest label without removing the B33 label. Because +`gtest_discover_tests()` currently applies target-wide labels, focused Step +verification uses exact suite regexes; label-based MITC4 filtering is enabled only +if per-test labeling can be added without relabeling unrelated B33 tests. + +Candidate registrations: + +- `src/fesa/CMakeLists.txt`: candidate `model/shell_geometry.cpp`, + `elements/mitc4_shell.cpp` and any separate shell recovery implementation. +- `tests/CMakeLists.txt`: candidate `shell_geometry_test.cpp`, + `mitc4_shell_test.cpp`, optional focused shell recovery/HDF5 tests, and MITC4 + reference comparator/test sources. +- Preserve existing runtime staging for MKL/TBB/HDF5 on all three test executables. + +CTest discovery must show every suite named in Section 5 before implementation is +considered verified. + +## 7. Candidate Files and Ownership + +All signatures in this section are candidates for the Implementation Agent to confirm +against the approved contracts during the owning Step; they are not new approved APIs. + +| owner/module | candidate files | candidate interface/direction | +| --- | --- | --- | +| model | `include/fesa/model/model_types.hpp`, `include/fesa/model/domain.hpp`, `src/fesa/model/domain.cpp` | separate shell records/accessors; no equation IDs | +| shell semantic geometry | candidate new `include/fesa/model/shell_geometry.hpp`, `src/fesa/model/shell_geometry.cpp` | director/frame and required-point geometry validation without parser/kernel dependency | +| Abaqus semantic map | `include/fesa/io/abaqus/domain_mapper.hpp`, `src/fesa/io/abaqus/domain_mapper.cpp` | keep `map(const ParsedInput&) -> Result` | +| analysis view | `include/fesa/analysis/analysis_model.hpp`, `src/fesa/analysis/analysis_model.cpp` | non-owning active shell view only if record representation requires | +| shell kernel | new `include/fesa/elements/mitc4_shell.hpp`, `src/fesa/elements/mitc4_shell.cpp` | concrete create/stiffness/physical-recover API | +| DOF | `include/fesa/fem/dof_manager.hpp`, `src/fesa/fem/dof_manager.cpp` | typed `array` shell scatter beside B33 scatter | +| sparse assembly | `src/fesa/assembly/sparse_assembler.cpp` | topology dispatch; unchanged public assemble signature | +| load | `src/fesa/assembly/load_assembler.cpp` only if aggregate director projection cannot live in semantic validation | reuse full six-DOF assembly | +| state/results | `include/fesa/analysis/analysis_state.hpp`, `src/fesa/analysis/analysis_state.cpp`, `include/fesa/results/result_records.hpp` | additive shell rows/global metrics | +| recovery | `include/fesa/results/result_recovery.hpp`, `src/fesa/results/result_recovery.cpp` or new shell-specific cpp | candidate-then-commit; physical/drill split | +| HDF5 | `src/fesa/io/hdf5/hdf5_results_writer.cpp` | generic public writer unchanged | +| lifecycle | `src/fesa/analysis/linear_static_analysis.cpp` | preserve existing hook order | +| app | `tests/integration/app/fesa_application_test.cpp`; production app only if feature dispatch needs it | CLI syntax unchanged | +| reference tests | new `tests/reference/mitc4_reference_comparison.hpp/.cpp` and tests | test-only direct HDF5/CSV comparator | +| build graph | `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt` | explicit additive source/test registration | + +Candidate kernel seam: + +```cpp +class Mitc4Shell { +public: + static Result create( + std::array nodes, + std::array initialDirectors, + const ShellSection& section, + const LinearElasticMaterial& material); + + [[nodiscard]] Matrix physicalLocalStiffness20() const; + [[nodiscard]] Matrix globalStiffness24() const; + [[nodiscard]] Result recoverPhysical( + const Vector& globalElementDisplacement24) const; +}; +``` + +This candidate explicitly avoids returning drill energy/results and avoids a common +public `Element` hierarchy. Exact value/reference ownership and math types are decided +inside TASK-03 after compiling the first RED test. + +## 8. Data Flow Contract + +```text +.inp bytes + -> AbaqusInputReader (syntax/source locations only) + -> AbaqusDomainMapper (approved semantics, S4/S4R provenance, section/material) + -> geometry/director preprocessing + -> immutable Domain + -> non-owning AnalysisModel + -> DofManager (6 DOF/node, 24-entry shell scatter, free/constrained maps) + -> Mitc4Shell physical K20 + fixed drill embedding -> global K24 + -> worker-local COO -> stable SparseMatrix reduction + -> Kff/Kfc/Kcf/Kcc partition -> Kff factorize + -> aggregate CLOAD/director check -> Ff-Kfc*dc + -> substitute -> full displacement + -> full residual K*d-F + -> physical-only shell recovery + global evidence + -> validated candidate AnalysisState + -> temporary results.h5 -> schema self-check -> atomic finalization + +authoritative results.h5 + -> test-only MITC4 HDF5 projection + -> exact source instance/node/component row-set precheck + -> read-only declared Abaqus displacement CSV + -> U blocking / UR warning-only deterministic report +``` + +Invariants: + +- Domain outlives AnalysisModel; no Domain copying. +- Source labels/instances/types never become equation indices. +- `S4`/`S4R` source type is metadata; both call the same kernel/quadrature. +- full residual uses stabilized global K; shell strain/resultant/stress/physical energy + use physical recovery only. +- HDF5 `nodal/reaction` is full residual; constraint mask decides reaction versus free + residual evidence. +- result rows use fixed GP1..GP4 and BOTTOM/MIDDLE/TOP identity; no averaging or Abaqus + integration-point relabeling. +- state/output mutation occurs only after complete validation. + +## 9. Acceptance Traceability Matrix + +The inclusive ranges below cover every must requirement `001` through `072` exactly +once without gap or overlapping requirement range. + +| requirement range | owning tasks | test/evidence id | reference model id | acceptance | +| --- | --- | --- | --- | --- | +| 001 | TASK-01, TASK-12 | MAP-004, FLOW-001 | N/A | one static step only; deterministic rejection otherwise | +| 002-004 | TASK-00, TASK-01, TASK-11, TASK-14, TASK-15 | MODEL-001, MAP-001, H5-001, both E2E suites | `shell-s4`, `shell-s4r` | S4/S4R one kernel; distinct stable source identity | +| 005 | TASK-00, TASK-06, TASK-11 | MODEL-001, DOF-001/003, H5-001/002 | N/A | exact six-component order; no distributed equation ownership | +| 006-010 | TASK-00, TASK-01 | MODEL-002, MAP-002/003 | N/A | finite E,nu,t; one assignment; unsupported meanings fail | +| 011-016 | TASK-02, TASK-03 | GEO-001..004, KIN-002 | N/A | deterministic unit directors; exact geometry predicates | +| 017-020 | TASK-01, TASK-08 | MAP-004, LOAD-001..004 | N/A | six-DOF BC/CLOAD; drilling/distributed load fails | +| 021-023 | TASK-01 | MAP-001..004 and existing no-op regression | N/A | approved parser subset/identity wrappers/no-op policy | +| 024-030 | TASK-00, TASK-06, TASK-07, TASK-09, TASK-10, TASK-12, TASK-16 | MODEL, DOF, ASM, STATE, REC, FLOW, VERIFY suites | N/A | ownership, deterministic assembly, lifecycle, residual reaction | +| 031-038 | TASK-03, TASK-04, TASK-05, TASK-07, TASK-10 | KIN, KERNEL, PHYSREC, ASM-003, REC-003 | N/A | physical 5-DOF embedding, exact drilling, same quadrature, invariants | +| 039-048 | TASK-09, TASK-10, TASK-11, TASK-12 | STATE-001..003, REC-001..005, H5-001..004, FLOW-004 | N/A | mandatory finite schema/results and atomic commit | +| 049 | TASK-00 through TASK-16 | every production Task records RED/failure/GREEN/focused/full VERIFY; VERIFY-001..003 | `shell-s4`, `shell-s4r` where reference-dependent | TDD evidence, related C++ tests, MSVC Debug no-warning build and full CTest | +| 050 | TASK-02 through TASK-05, TASK-07 | GEO-001/002, KIN-001/002, KERNEL-001..004, ASM-002 | N/A | frames, Jacobian, symmetry, transformation, six modes, positivity and repeatability | +| 051 | TASK-02 through TASK-05, TASK-10, TASK-12 | GEO-001, KERNEL-001..003, REC-004, FLOW-002 | N/A | exact normalized 1e-12 and 1e-10 algebraic thresholds | +| 052 | TASK-03 through TASK-05, TASK-10 | KIN-003/004, KERNEL-004, PHYSREC-001, REC-001/002 | N/A | independent membrane, bending, shear, twist fields and recovery signs/order | +| 053 | TASK-04, TASK-05, TASK-14, TASK-15 | KERNEL-001..007, PHYSREC-001, both declared E2E suites | `shell-s4`, `shell-s4r` | formulation invariants/patches and both reference cases pass | +| 054 | TASK-02 | GEO-001..004 | N/A | exact valid/rejected geometry inventory; no NR-O03/O04 | +| 055 | TASK-16 | VERIFY scope audit | N/A | extra benchmark portfolio is explicitly nonblocking and absent from completion gate | +| 056 | TASK-04, TASK-05, TASK-07, TASK-10 | KERNEL-005..007, PHYSREC-001, ASM-001/002, REC-003 | N/A | exact fixed drilling, deterministic rank/action and physical-output exclusion | +| 057 | TASK-10, TASK-12, downstream Physics Evaluation | REC-002..004, FLOW-002, later physics report | `shell-s4`, `shell-s4r` | implementation exposes equilibrium/sign/energy evidence; physical plausibility verdict is downstream | +| 058-060 | TASK-13, TASK-14, TASK-15 | REF-003, both E2E comparison tests | `shell-s4`, `shell-s4r` | exact U mixed tolerance without clamp | +| 061-062 | TASK-13, TASK-14, TASK-15 | REF-004/005, both E2E tests | `shell-s4`, `shell-s4r` | UR same tolerance, deterministic warning only | +| 063-064 | TASK-13 | REF-001/002/005 | `shell-s4`, `shell-s4r` | schema/row failure before numeric comparison; full metrics | +| 065-068 | TASK-13, TASK-14, TASK-15 | REF-001/002/006, both case prechecks | `shell-s4`, `shell-s4r` | exact four read-only paths; unique finite mapped rows | +| 069-071 | TASK-14, TASK-15 | both E2E suites | `shell-s4`, `shell-s4r` | declared S4/S4R; U blocks and UR warns; no other equality gate | +| 072 | TASK-13 through TASK-16 | REF-006, VERIFY-004 and git/hash audit | `shell-s4`, `shell-s4r` | no reference solver run or artifact mutation | + +## 10. Validation Commands + +These commands are the environment-resolved Windows x64 Debug baseline. Planning does +not execute build/tests. Each approved Harness Step first runs this literal path +precheck and then repeats the relevant build/test subset after its RED and GREEN +changes. + +```powershell +$requiredBuildPaths = @( + "C:/git/googletest", + "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl", + "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb", + "C:/Program Files/HDF_Group/HDF5/2.1.1/cmake" +) +foreach ($requiredBuildPath in $requiredBuildPaths) { + if (-not (Test-Path -LiteralPath $requiredBuildPath)) { + throw "Required configured build path is absent: $requiredBuildPath" + } +} + +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 +``` + +Focused commands: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "DomainModel|InpDomainMapping|Mitc4Geometry|Mitc4Shell|DofManager|EssentialConstraints|SparseAssembly|LoadAssembly|ResultRecovery|Hdf5ResultsWriter" --output-on-failure + +cmake --build .harness/build --config Debug --target fesa_integration_tests +ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure + +cmake --build .harness/build --config Debug --target fesa_reference_tests +ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure +``` + +Planning-document verification: + +```powershell +git diff --check -- docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md +git status --short +git diff --name-only +``` + +Reference immutability audit is read-only and fails on any mismatch: + +```powershell +$expectedReferenceHashes = [ordered]@{ + "reference/shell/shell.inp" = "4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF" + "reference/shell/shell displacements.csv" = "C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B" + "reference/shellR/shellR.inp" = "1325940FB42B78961CF25E84379BF2693846FAD22473E7688AC5456B37B18CB4" + "reference/shellR/shellR displacements.csv" = "8887ACC5ED007CB97583A9FDC1150B48B9297E269A5BA8EBA6C1A5F6306E98CB" +} +foreach ($referencePath in $expectedReferenceHashes.Keys) { + $actualHash = (Get-FileHash -Algorithm SHA256 -LiteralPath $referencePath).Hash + if ($actualHash -ne $expectedReferenceHashes[$referencePath]) { + throw "Reference artifact changed: $referencePath" + } +} +``` + +Do not invoke `scripts/hooks/*.py` manually. Harness runner installs/uses the configured +PreToolUse and Stop hooks automatically. Do not invoke `scripts/execute.py` until the +user separately authorizes execution. + +## 11. Risks and Downstream Handoff + +| risk | controlling plan decision | stop condition | +| --- | --- | --- | +| beam-only ModelDefinition leaks through every layer | add shell semantic records first; preserve B33 access | stop if a Step requires unapproved mixed-model hierarchy | +| fixed 12-DOF scatter breaks B33 | typed beam/shell scatter paths and B33 regressions | stop on any B33 focused/full regression | +| drilling contaminates physical output | separate physical recovery from stabilized full K | stop if pure-drill recovery/energy is nonzero | +| director/frame sign nondeterminism | source-order, area-weight and tie-break tests | stop on repeat/order/thread difference | +| S4R accidentally selects reduced integration | one internal formulation and ASM/E2E equality tests | stop if source type reaches quadrature dispatch | +| full residual confused with element resultants | keep reaction from Kd-F, physical recovery separately | stop if reaction is reconstructed from shell resultants | +| writer expansion changes B33 schema | additive shell branches plus full B33 CTest | stop on B33 schema regression | +| comparator inherits B33 four-file/Frame assumptions | dedicated test-only MITC4 comparator | stop if administrative files become required | +| reference artifacts staged by Harness | clean isolated worktree, hash/diff audit | stop immediately on any reference path change | +| future nonlinear equations enter production | scope and code review prohibition | stop if nonlinear state/tangent is allocated or called | + +### Implementation Agent + +- Read the approved implementation plan, `docs/HARNESS.md` and + `docs/HARNESS_WORKFLOW.md` before every Step. +- Execute only the Harness-selected pending Step and use the repository hooks/scripts + through the documented runner lifecycle. +- Never choose the next Step, edit executor-owned timestamps/statuses, batch multiple + Steps, or implement outside the Step's file ownership. +- Record the RED command and observed failure before GREEN. + +### Build/Test Executor Agent + +- Use Section 10 exact CMake/MSVC/CTest baseline after implementation Steps finish. +- Report new warnings, discovery gaps and exact failing test names without changing + upstream contracts. + +### Correction Agent + +- Apply only minimal failure-driven corrections inside approved file ownership. +- Do not reinterpret MITC4 mathematics, I/O schema or tolerance. + +### Reference Verification Agent + +- Consume authoritative HDF5 and declared read-only CSV directly. +- Create the separate reference-verification report; only U affects pass/fail and every + UR warning remains visible. + +### Physics Evaluation and Release Agents + +- Physics evaluates equilibrium, directions, symmetry, energy and result signs after + reference verification. +- Release readiness remains blocked until implementation, build/test, reference and + physics gates all provide evidence. + +## 12. Harness Step Draft + +This approved draft is materialized under `phases/linear-static-mitc4-shell/`. +Every Step is zero-based, kebab-case and closes RED/GREEN/VERIFY before the +Executor advances it. TASK-14/TASK-15 are declared-case sub-work inside Step 13's +single test-only reference module; TASK-16 is downstream Build/Test Executor evidence, +not an Implementation Agent phase Step. During materialization, the exact required-reading +paths, configure block, focused command and full VERIFY block shown here are copied +verbatim into every `stepN.md`; a materialized Step never refers back to this draft or +to an external conversation. + +Every materialized Step copies this mandatory reading inventory before its +Step-specific paths: + +- `AGENTS.md` +- `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md` +- `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md` +- this approved implementation plan and all source contracts listed in Metadata +- `.codex/hooks.json` +- `phases/index.json`, `phases/linear-static-mitc4-shell/index.json` and its own + `phases/linear-static-mitc4-shell/stepN.md` +- every path created/modified by prerequisite Steps and their step output/status + +If any mandatory or Step-specific path is missing or contradicts the approved plan, +the Implementation Agent records `blocked` for the Executor-selected current Step and +stops; it does not invent the missing contract. + +Step-specific path ledger copied into the corresponding materialized Step: + +| Step | exact source/prerequisite paths | +| ---: | --- | +| 0 | `include/fesa/model/model_types.hpp`; `include/fesa/model/domain.hpp`; `src/fesa/model/domain.cpp`; `tests/unit/model/model_types_test.cpp`; `tests/unit/model/domain_test.cpp` | +| 1 | Step 0 paths; `include/fesa/io/abaqus/domain_mapper.hpp`; `src/fesa/io/abaqus/domain_mapper.cpp`; `tests/unit/io/abaqus/domain_mapper_test.cpp` | +| 2 | Step 0-1 paths; candidate new `include/fesa/model/shell_geometry.hpp`; `src/fesa/model/shell_geometry.cpp`; `tests/unit/model/shell_geometry_test.cpp`; `src/fesa/CMakeLists.txt`; `tests/CMakeLists.txt` | +| 3 | Step 2 paths; candidate new `include/fesa/elements/mitc4_shell.hpp`; `src/fesa/elements/mitc4_shell.cpp`; `tests/unit/elements/mitc4_shell_test.cpp`; `src/fesa/CMakeLists.txt`; `tests/CMakeLists.txt` | +| 4 | Step 3 MITC4 kernel/header/test paths | +| 5 | Step 3-4 MITC4 kernel/header/test paths | +| 6 | Step 0 paths; `include/fesa/fem/dof_manager.hpp`; `src/fesa/fem/dof_manager.cpp`; `tests/unit/fem/dof_manager_test.cpp`; `tests/unit/constraints/essential_constraints_test.cpp` | +| 7 | Steps 4/6 paths; `include/fesa/assembly/sparse_assembler.hpp`; `src/fesa/assembly/sparse_assembler.cpp`; `tests/unit/assembly/sparse_assembler_test.cpp` | +| 8 | Steps 2/7 paths; `include/fesa/assembly/load_assembler.hpp`; `src/fesa/assembly/load_assembler.cpp`; `tests/unit/assembly/load_assembler_test.cpp` | +| 9 | Step 5 paths; `include/fesa/results/result_records.hpp`; `include/fesa/analysis/analysis_state.hpp`; `src/fesa/analysis/analysis_state.cpp`; `tests/unit/results/result_records_test.cpp` | +| 10 | Steps 5/9 paths; `include/fesa/results/result_recovery.hpp`; `src/fesa/results/result_recovery.cpp`; `tests/unit/results/result_recovery_test.cpp` | +| 11 | Steps 9/10 paths; `include/fesa/io/hdf5/hdf5_results_writer.hpp`; `src/fesa/io/hdf5/hdf5_results_writer.cpp`; `tests/unit/io/hdf5/hdf5_results_writer_test.cpp` | +| 12 | Steps 7-11 paths; `include/fesa/analysis/linear_static_analysis.hpp`; `src/fesa/analysis/linear_static_analysis.cpp`; `tests/integration/analysis/linear_static_analysis_test.cpp`; `tests/integration/app/fesa_application_test.cpp` | +| 13 | Steps 11/12 paths; candidate new `tests/reference/mitc4_reference_comparison.hpp`, `tests/reference/mitc4_reference_comparison.cpp`, `tests/reference/mitc4_reference_comparison_test.cpp`, `tests/reference/mitc4_reference_cases_test.cpp`; `tests/CMakeLists.txt`; the four exact read-only reference paths in Section 2 | + +The configure command copied before each Step's RED build is: + +```powershell +$requiredBuildPaths = @( + "C:/git/googletest", + "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl", + "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb", + "C:/Program Files/HDF_Group/HDF5/2.1.1/cmake" +) +foreach ($requiredBuildPath in $requiredBuildPaths) { + if (-not (Test-Path -LiteralPath $requiredBuildPath)) { + throw "Required configured build path is absent: $requiredBuildPath" + } +} + +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" +``` + +The full VERIFY block copied at the end of every Step is: + +```powershell +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 +``` + +### Step 0 — `shell-semantic-model` + +- Required reading: requirements 002-016/024, I/O Sections 3/5, architecture model + ownership, current `model_types.hpp`/`domain.*` and their tests. +- Prerequisite: approved plan only; no production dependency on a prior Step. +- RED: add MODEL-001/002 tests and CMake registration if needed; run: + `cmake --build .harness/build --config Debug --target fesa_unit_tests` then + `ctest --test-dir .harness/build -C Debug -R "DomainModel" --output-on-failure`. + Record the missing shell type/accessor failure. Unexpected pass is a stop. +- GREEN: minimally add shell semantic records/Domain const access; no parser/kernel. +- VERIFY: rerun the focused commands and common full VERIFY. +- Prohibitions: no equation IDs, element hierarchy, mixed-model execution, parser edits. + +### Step 1 — `shell-domain-mapping` + +- Required reading: Step 0 outputs, requirements 001-010/017-023, I/O Sections 1-3/8-9, + current `domain_mapper.*` and parser/model tests. +- Prerequisite: Step 0 `completed`. +- RED: add MAP-001..004; build `fesa_unit_tests` and run + `ctest --test-dir .harness/build -C Debug -R "InpDomainMapping" --output-on-failure`. + Record valid S4/S4R rejection and exact negative diagnostic failures. +- GREEN: minimally extend semantic mapping; keep `input_reader` syntax-only. +- VERIFY: focused parser/model tests, then common full VERIFY. +- Prohibitions: no element math, no silent unsupported keyword, no reference edits. + +### Step 2 — `shell-director-geometry` + +- Required reading: requirements 011-016, formulation Sections 4/9/17, Numerical Review + 5.2/5.5/6.1, I/O 3.3/9, completed semantic model/mapping. +- Prerequisite: Step 1 `completed`. +- RED: add GEO-001..004; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "Mitc4Geometry" --output-on-failure`. +- GREEN: implement deterministic director/frame and exact geometry inventory validation. +- VERIFY: focused geometry/mapping tests, then common full VERIFY. +- Prohibitions: no calibrated angle/warp/distortion threshold; no NR-O03/O04. + +### Step 3 — `mitc4-kinematics-constitutive` + +- Required reading: formulation Sections 3-11/17, Numerical Review 5.1-5.6/6.1, + current math adapters and Euler kernel style. +- Prerequisite: Step 2 `completed`. +- RED: add KIN-001..005 in new `mitc4_shell_test.cpp`, register it, build unit target, + run `ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKinematics|Mitc4ShellConstitutive" --output-on-failure`. +- GREEN: minimally add concrete shell kernel kinematics/constitutive seams; no global + assembly or drilling. +- VERIFY: focused kernel tests, then common full VERIFY. +- Prohibitions: no public base hierarchy, no S4R branch, no nonlinear tangent code. + +### Step 4 — `mitc4-stiffness-drilling` + +- Required reading: formulation Sections 10-14/17, requirements 031-038/050-056, + Numerical Review 5.7/6.1-6.2, completed Step 3 kernel. +- Prerequisite: Step 3 `completed`. +- RED: add KERNEL-001..006; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKernel|Mitc4ShellPatch|Mitc4ShellDrilling" --output-on-failure`. +- GREEN: implement K20, 20-to-24 congruence and exact fixed drilling only. +- VERIFY: focused kernel suite, then common full VERIFY. +- Prohibitions: translations in R+, coefficient sweep, recovery/result output, future nonlinear. + +### Step 5 — `mitc4-physical-recovery` + +- Required reading: formulation Sections 14/16, requirements 035/042-046/052/056, + I/O result component/location order, completed Step 4 kernel. +- Prerequisite: Step 4 `completed`. +- RED: add KERNEL-007 and PHYSREC-001; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "Mitc4ShellDrilling|Mitc4ShellPhysicalRecovery" --output-on-failure`. +- GREEN: minimally add kernel-local physical recovery and physical energy API only. +- VERIFY: focused physical recovery/drilling tests, then common full VERIFY. +- Prohibitions: no AnalysisState/global result rows, no drilling contribution or HDF5. + +### Step 6 — `shell-dof-scatter` + +- Required reading: requirements 005/025, architecture DofManager ownership, current + `dof_manager.*` and constraint tests, completed shell model. +- Prerequisite: Step 5 `completed`. +- RED: add DOF-001..003; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "DofManager|EssentialConstraints" --output-on-failure`. +- GREEN: minimally add typed 24-entry scatter/pattern while preserving 12-entry B33. +- VERIFY: focused DOF/constraint tests, then common full VERIFY. +- Prohibitions: no equation IDs in model, no constraint/load ownership move. + +### Step 7 — `shell-sparse-assembly` + +- Required reading: requirements 027/030/037, architecture deterministic COO rule, + current `sparse_assembler.cpp`/`sparse_matrix.cpp` tests, completed kernel/scatter. +- Prerequisite: Step 6 `completed`. +- RED: add ASM-001..003; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "SparseAssembly" --output-on-failure`. +- GREEN: minimally dispatch shell and emit stable 576-entry local buffers. +- VERIFY: focused assembly tests, then common full VERIFY. +- Prohibitions: no worker global CSR mutation, unordered reduction or S4R integration branch. + +### Step 8 — `shell-load-validation` + +- Required reading: requirements 017-020/028, formulation 8/13, I/O 4.2-4.3, + current `load_assembler.*` and constraint lifecycle. +- Prerequisite: Step 7 `completed`. +- RED: add LOAD-001..004; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "LoadAssembly|EssentialConstraints" --output-on-failure`. +- GREEN: minimally add aggregate nodal moment/director validation and reuse full DOF load. +- VERIFY: focused load/constraint tests, then common full VERIFY. +- Prohibitions: no distributed/equivalent/follower load; no drill load channel. + +### Step 9 — `shell-analysis-state` + +- Required reading: requirements 026/041-046/048, I/O 6.3-6.5, + current `analysis_state.*`/`result_records.hpp` and completed physical recovery types. +- Prerequisite: Step 8 `completed`. +- RED: add STATE-001..003; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "AnalysisState" --output-on-failure`. +- GREEN: minimally add candidate-owned shell row/global evidence containers and + validation/commit mechanics. +- VERIFY: focused AnalysisState tests, then common full VERIFY. +- Prohibitions: no element calculation, ResultRecovery orchestration or HDF5 writing. + +### Step 10 — `shell-result-recovery` + +- Required reading: requirements 029/035/041-046/048, formulation 14/16, I/O 6.3-6.5, + current `result_recovery.*` and completed Steps 5/9. +- Prerequisite: Step 9 `completed`. +- RED: add REC-001..005; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "ResultRecovery" --output-on-failure`. +- GREEN: minimally orchestrate full-residual evidence and physical shell recovery into + a fully validated candidate, then commit it. +- VERIFY: focused recovery tests, then common full VERIFY. +- Prohibitions: no new result record type, location averaging, drill recovery or writer edit. + +### Step 11 — `shell-hdf5-output` + +- Required reading: requirements 039-048, I/O Section 6 exact schema, ADR atomic output, + current HDF5 writer/self-check tests, completed recovery records. +- Prerequisite: Step 10 `completed`. +- RED: add H5-001..004; build unit target and run + `ctest --test-dir .harness/build -C Debug -R "Hdf5ResultsWriter" --output-on-failure`. +- GREEN: add exact additive shell schema behind unchanged ResultsWriter boundary. +- VERIFY: focused HDF5 tests, then common full VERIFY. +- Prohibitions: no B33 schema reinterpretation, CSV solver output, partial final file. + +### Step 12 — `shell-linear-static-flow` + +- Required reading: requirements 024-030, architecture eight-hook lifecycle, I/O CLI + contract, current `linear_static_analysis.*`/application integration tests. +- Prerequisite: Step 11 `completed`. +- RED: add FLOW-001..004; build integration target and run + `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure`. +- GREEN: minimally route shell through existing lifecycle; preserve one factorization. +- VERIFY: focused integration tests, then common full VERIFY. +- Prohibitions: no analysis lifecycle reorder, no 0x0 singular conversion, no early state commit. + +### Step 13 — `shell-reference-comparison` + +- Required reading: requirements 058-072, I/O Section 7, Reference Model contract, + both declared S4/S4R paths and hashes, and current B33 comparator only as reusable + identity/report precedent. +- Scope ownership: this one test-only reference module owns TASK-13 comparator behavior + plus TASK-14/TASK-15 declared-case tests; it owns no solver production module. +- Prerequisite: Step 12 `completed` and valid MITC4 HDF5 fixture. +- RED: add REF-001..006 plus E2E-S4-001/002 and E2E-S4R-001/002 before the comparator + implementation; build the reference target and run + `ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure`. + Record the missing comparator/declared-case failure. +- GREEN: minimally add test-only comparator for exact shell CSV/HDF5 contract. +- If a declared case exposes a production defect outside this reference-test module, + stop the Step and route a focused correction to the owning prior module; do not patch + unrelated production layers inside this Step. +- VERIFY: focused comparator and both declared-case tests, then common full VERIFY. +- Prohibitions: no reference artifact writes/Abaqus run, no metadata/README gate, no UR blocking. + +After explicit approval, planning may create only: + +- `phases/index.json` with task status `pending` and no creation timestamp; +- `phases/linear-static-mitc4-shell/index.json` with Steps 0-13 initially `pending` and + no executor-owned timestamps; +- `phases/linear-static-mitc4-shell/stepN.md` containing the approved self-contained + directions. + +Approval does not authorize `python scripts/execute.py linear-static-mitc4-shell` or +`--push`. + +## 13. Open Issues + +| id | item | blocking now | resolution owner | +| --- | --- | --- | --- | +| OI-001 | Section 12 multi-Step Harness draft was explicitly approved on 2026-08-12 and materialized. | resolved | user | +| OI-002 | Candidate shell semantic representation and exact C++ value/reference types are not public API decisions. | no | owning RED test in Steps 0/3 | +| OI-003 | Per-test MITC4 CTest label can be added without relabeling B33 tests인지 확인한다. Exact suite regex remains sufficient. | no | Step 0 and downstream TASK-14 CMake verification | + +No mathematical, I/O, reference-inventory or tolerance decision remains open for +implementation planning. The user separately authorized implementation and Harness +execution on 2026-08-12; the Executor still owns branch, Step selection, timestamps, +commits and advancement. diff --git a/docs/numerical-reviews/linear-static-mitc4-shell-review.md b/docs/numerical-reviews/linear-static-mitc4-shell-review.md index 0c40068..3e249cd 100644 --- a/docs/numerical-reviews/linear-static-mitc4-shell-review.md +++ b/docs/numerical-reviews/linear-static-mitc4-shell-review.md @@ -1,6 +1,6 @@ # Linear Static MITC4 Shell Numerical Review -## Metadata +## 1. Metadata - feature_id: `linear-static-mitc4-shell` - source_formulation: `docs/formulations/mitc4-shell-formulation.md` @@ -8,339 +8,357 @@ - source_research: `docs/research/linear-static-mitc4-shell-research.md` - source_io_definition: `docs/io-definitions/linear-static-mitc4-shell-io.md` - source_reference_inventory: `docs/reference-models/linear-static-mitc4-shell-reference-models.md` -- repository_policy: `AGENTS.md`, `docs/ADR.md`, `docs/ARCHITECTURE.md`, - `docs/SOLVER_AGENT_DESIGN.md` -- reviewed_revisions: `73df844`, `22a3238` +- repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, + `docs/numerical-reviews/README.md` +- reviewed_head: `a058ef7` +- prior_pass_commit: `60b42f4` (`context-only; verdict not inherited`) - status: `pass-for-implementation-planning` - owner_agent: `numerical-review-agent` - date: `2026-08-12` - implementation_planning_authorized: `true` - implementation_complete: `false` +- build_test_complete: `false` - reference_comparison_complete: `false` +- physics_evaluation_complete: `false` +- release_ready: `false` -## Review Verdict +이번 재검토는 현재 HEAD의 요구조건, 연구, 정식화, I/O 및 reference-case 계약을 +처음부터 상호 대조했다. 기존 review의 판정과 artifact 관찰 결과는 결론의 전제로 +사용하지 않았고, 이전 finding은 현 문서의 수식으로 다시 검산한 뒤 disposition만 +기록했다. 원 MITC4 local paper는 tying 위치와 covariant shear 보간을 확인하는 데 +read-only로 사용했다. + +이 단계에서는 Abaqus, Harness, C++ build/test, FESA 실행 및 reference comparison을 +수행하지 않았다. Reference artifact를 생성, 수정, 복원 또는 정규화하지 않았다. + +## 2. Review Verdict - verdict: `pass-for-implementation-planning` -- reason: The current linear-static formulation closes the physical 20-DOF MITC4 - kernel, its global 24-DOF embedding, fixed drilling regularization, Jacobian and - quadrature rules, residual/stiffness equations, recovery signs, and verification - invariants without a mathematical inconsistency in the approved feature scope. - critical_blockers: `none` -- remaining_formulation_revisions: `none for the current linear-static scope` -- downstream_boundary: Implementation Planning may begin. This verdict does not - claim implementation, build/test, reference-comparison, physics-sanity, or release - completion. +- confirmed_defects: `none in the approved current linear-static scope` +- open_blocking_questions: `none` +- reason: 현재 정식화는 24 global DOF와 20 physical DOF의 관계, MITC4 shear + tying, plane-stress section law, 공통 `2 x 2 x 2` quadrature, residual/stiffness, + 고정 drilling 안정화, 물리 recovery 및 검증 불변식을 구현계획으로 옮길 수 있을 + 만큼 명시한다. 요구조건, I/O 및 reference 계약과 모순되는 차원, 부호, 위치 또는 + pass/fail 의미도 발견되지 않았다. +- downstream_boundary: 이 판정은 Implementation Planning 진입만 허용한다. 구현, + MSVC build/CTest, reference comparison, physics sanity 또는 release를 승인하지 않는다. -The future geometrically nonlinear material in Formulation Section 15 remains -explicitly non-executable. Its unresolved global finite-rotation map and objective -drilling potential do not block the current linear-static implementation plan. +정식화 Section 15의 geometrically nonlinear residual/tangent는 future-only다. 완전한 +`Phi: R24 -> R20`, map Hessian, objective drilling potential 및 finite-rotation load work가 +미정인 사실은 미래 nonlinear 구현을 막지만 현재 linear-static 판정은 막지 않는다. -## Critical Findings +## 3. Critical Findings -No confirmed mathematical defect remains in the approved linear-static formulation. -The previous review's `needs-reference-model` verdict is not a valid current -formulation verdict: the current numerical-review gate is based on numerical and -formulation consistency, while downstream artifact administration and comparison -execution are separate gates. +### 3.1 Confirmed defects -### 1. Previous finding disposition +현재 승인된 선형 정적 범위에서 구현계획 전에 Formulation 또는 Research로 돌려보낼 +confirmed mathematical defect는 없다. -| previous item | current disposition | evidence and strict consequence | +`K20`의 exact-arithmetic 대칭/positive-semidefinite 구조와 20-to-24 congruence는 +일관된다. 다만 실제 구현의 rank, rigid action, patch field와 reference error는 문서 +검토만으로 통과했다고 볼 수 없으며 Section 6의 downstream test evidence가 필요하다. + +### 3.2 Previous finding disposition + +| previous item | rerun disposition | current independent basis | | --- | --- | --- | -| `NR-C01` Jacobian/geometry inventory | resolved | Formulation Sections 9.2-9.3 enumerate center, stiffness, tying, and recovery locations and require finite bases, nonzero area, and `J>0`; Requirements 014/016 intentionally define no calibrated smooth-angle, distortion, or warp threshold. | -| `NR-C02` drilling normalization | resolved | Formulation Section 12.2 and Requirements 033-036 now define one exact dimensional rule using only positive physical tangent-rotation diagonals. No calibration decision remains. | -| `NR-C03` mixed-DOF algebraic scaling | resolved | Formulation Sections 12.3 and 12.5 define physical length scaling separately from the physical/drilling stiffness split and provide normalized rank, symmetry, and rigid-action evidence. | -| `NR-C04` 20/24-DOF weak-form mismatch | resolved | Formulation Sections 5.2-5.3 and 7.1-7.2 place physical, drilling, and external work in the common global 24-DOF test space using the required transpose maps. | -| `NR-C05` nonlinear global tangent closure | resolved for current scope | Formulation Section 15 now labels the nonlinear equations non-executable and identifies the missing nonlinear `Phi` map, map Hessian, and objective drilling potential. Those items block only a future nonlinear feature. | -| `NR-D01` drilling-direction nodal moment | retained/resolved | The exact-zero branch and `rho_M=|d dot M|/||M|| <= 1e-12` rule are consistent in Formulation Section 6.2 and I/O Section 4.3. | -| `NR-D02` normalized algebraic checks | retained/resolved | Formulation Section 17.1 defines scale-aware symmetry, rigid-action, frame, transformation-energy, residual, and equilibrium checks without a denominator clamp. | -| `NR-O01` drilling coefficient/plateau | resolved by approved fixed rule | `k_d=10^-3 min(R+)` replaces the former coefficient-family/sweep question. A sweep, plateau, response sensitivity, or condition-number calibration is not an acceptance gate. | -| `NR-O02` drilling-energy warning | removed from approved scope | Drilling is an internal numerical potential only. No drilling-energy ratio, warning threshold, or drilling-specific output is required. | -| `NR-O03` smooth-director angle | removed from approved scope | Requirements 014/054 and Formulation Sections 4.2 and 9.3 use exact orientation/finite/nonzero predicates and explicitly remove `NR-O03`. It is not an open numerical decision. | -| `NR-O04` distortion/warp calibration | removed from approved scope | Requirements 016/054 and Formulation Sections 9.2-9.3 require exact finite/positive validity checks and explicitly remove `NR-O04`. It is not an open numerical decision. | -| `NR-O05` U/UR tolerance | resolved | Requirements 058-062, Formulation Section 17.5, I/O Section 7.6, and Reference Case Section 5 all use the exact approved B33 component-scale formula. | +| `NR-C01` Jacobian/geometry inventory | `resolved` | Formulation 9.2-9.3은 center, eight stiffness points, four tying points 및 committed recovery points를 공통 fail-closed inventory로 두고 finite bases, nonzero surface measure와 `J>0`를 요구한다. 승인 범위는 calibrated distortion/warp cutoff를 요구하지 않는다. | +| `NR-C02` drilling normalization | `resolved` | Formulation 12.2는 `R+`를 오직 8 physical tangent-rotation diagonals의 finite positive 값으로 제한하므로 모든 후보의 단위가 `force*length`로 같다. | +| `NR-C03` mixed-DOF spectrum scaling | `resolved` | Formulation 12.5의 `(L_e I3,I2)` 및 `(L_e I3,I3)` congruence는 rank/condition evidence에서 translation/rotation 단위 혼합을 제거한다. Raw mixed-unit spectrum은 금지된다. | +| `NR-C04` 20/24 weak-form mismatch | `resolved` | Formulation 5.2-5.3과 7.1-7.2는 physical, drilling, external work를 모두 `V24`에서 `T_p^T`와 `T_d^T`로 결합한다. | +| `NR-C05` nonlinear 20-to-24 closure | `resolved for current scope` | Section 15는 physical chart tangent와 conditional global pullback을 분리하고 map-curvature 항을 보존하며, 미정인 global map/objective drill을 future-only blocker로 명시한다. | +| `NR-D01` drilling-direction moment | `retained and consistent` | Exact-zero moment는 별도 처리하고 nonzero moment에 `rho_M=abs(d dot M)/norm(M)<=1e-12`를 적용한다. Numerical drilling은 거부된 moment를 운반하지 않는다. | +| `NR-D02` normalized algebraic checks | `retained and consistent` | `1e-12` symmetry/frame/energy와 `1e-10` rigid/residual/equilibrium 기준은 scaled matrices와 unclamped denominators에 적용된다. | +| `NR-O01` coefficient sweep/plateau | `closed by product decision` | `k_d=1e-3 min(R+)`가 고정 계약이다. Sweep, plateau 및 coefficient optimality는 구현 gate가 아니다. | +| `NR-O02` drilling-energy ratio | `removed from scope` | Drilling energy는 내부 quadratic identity일 뿐 physical energy나 mandatory output이 아니며 ratio/warning threshold도 요구하지 않는다. | +| `NR-O03` smooth-director calibration | `removed from scope` | Pairwise positive incident-normal orientation, finite/nonzero averaging 및 duplicate-node fold modeling이 승인된 exact predicate다. 별도 angle calibration은 gate가 아니다. | +| `NR-O04` distortion/warp calibration | `removed from scope` | Basic topology, finite/nonzero surface measure 및 required-point `J>0`가 승인된 predicate다. Quality sweep이나 cutoff는 gate가 아니다. | +| `NR-O05` U/UR tolerance | `resolved` | 모든 관련 문서가 `1e-9+1e-6*reference_scale_c`, U blocking, UR warning-only를 동일하게 정의한다. | -### 2. Required policy classifications +이전의 `needs-reference-model` 판정에 포함됐던 canonical naming, README, +`metadata.json`, provenance, expanded portfolio 및 아직 없는 comparison result는 현재 +프로젝트 정책상 formulation verdict의 blocker가 아니다. 현 Reference Model 문서는 +정확한 기존 input/displacement path와 row/tolerance 계약을 제공한다. -#### 2.1 Fixed drilling rule — resolved and implementation-ready +### 3.3 Open questions -Let `R+` contain only the finite, strictly positive diagonal entries of the physical -local stiffness `K20` associated with the eight director-tangent rotational DOFs. -The formulation fixes +- current_linear_scope: `none blocking` +- future_geometric_nonlinearity: finite global rotation coordinate, `Phi`와 그 1/2차 + 미분, chart recentering, objective drilling, nodal-moment work 및 nonlinear output/state + 계약이 미정이다. 이는 별도 future formulation/review가 소유한다. +- optional_characterization: near-singular positive-J geometry의 conditioning과 original + MITC4의 distorted-curved membrane locking을 더 넓게 정량화할 수 있으나 현재 승인된 + planning/completion gate는 아니다. +- downstream_results: implementation rank/patch evidence와 S4/S4R comparison 결과는 + 아직 없으며 해당 후속 Agent가 판정한다. 부재 자체는 pre-implementation review의 + 결함이 아니다. -```text -k_ref = min(R+) -k_d = 1e-3 * k_ref -K_drill_local = k_d * I4 -K_drill_24 = T_d^T * K_drill_local * T_d -``` +## 4. Numerical Risk Assessment -All entries in `R+` have rotational-stiffness dimension `force*length`; translations, -off-diagonals, nonpositive values, and nonfinite values are excluded. Therefore -`k_d` has the correct dimension, `K_drill_24` is symmetric positive on the four pure -drilling coordinates, and the physical and drilling channels are algebraically -separate. An empty `R+` is a deterministic numerical-validation failure. This is a -complete algorithm contract, not a calibration placeholder. - -The deterministic nodal frames fix the local-coordinate representation, and -Formulation Section 5.3 supplies the virtual-work/energy congruence used by the -coordinate-transformation check. No unselected drilling coefficient or family -remains for Implementation Planning. - -#### 2.2 No drilling outputs — resolved and consistent - -Formulation Sections 7.2, 12.3, 12.5, 14, and 17.4 keep drilling out of physical -strain, resultant, stress, and reported physical shell energy. The internal identity -`E_drill = 0.5 gamma^T K_drill_local gamma` is permissible verification algebra; it -does not create an external result quantity. Requirements 035/036/046 and I/O -Sections 6.1/6.4/6.5 consistently require no drilling coefficient, stiffness, ratio, -or energy dataset. There is no output-contract defect. - -#### 2.3 Exact B33 U/UR tolerance — resolved - -For each case and component `c`, using only finite Abaqus rows, - -```text -reference_scale_c = max(abs(reference_value_i)) -tolerance_c = 1e-9 + 1e-6 * reference_scale_c -``` - -The `1e-9` floor is in the model's user-consistent length unit for `U1/U2/U3` and is -dimensionless for `UR1/UR2/UR3`. No row is zero-clamped and no row-specific relative -denominator replaces the component scale. `U1/U2/U3` exceedance is blocking at the -later Reference Verification gate; `UR1/UR2/UR3` uses the same formula but is -warning-only. The formula is exact and needs no MITC4-specific calibration. - -#### 2.4 Removed and administrative items — nonblocking - -`NR-O03`, `NR-O04`, drilling sweeps, drilling-energy criteria, and expanded flat, -thin/thick, distorted, warped, curved-shell, or mesh-convergence portfolios are not -part of the approved implementation-planning gate. They may remain future research -or release evidence but shall not be reintroduced as missing numerical evidence. - -Canonical reference naming, a bundle README, `metadata.json`, provenance, an Abaqus -version, duplicated units/coordinates/model/step/frame descriptions, or a schema -version are administrative information and cannot block this formulation verdict. -The absence of optional `metadata.json` is therefore not a defect. If such a file is -added later, it remains read-only context and cannot override the approved exact -paths, row mapping, or tolerance. - -## Numerical Risk Assessment - -| risk | current assessment | required in-scope control | +| risk label | assessment | required in-scope control | | --- | --- | --- | -| Transverse-shear locking | controlled for the original MITC4 scope, not claimed eliminated for every mesh | Use the exact edge-midpoint covariant shear projection of Sections 10.2-10.4 and pass transverse-shear patch/reference checks. | -| Curved/distorted-mesh membrane locking | known limitation of the original MITC4 family | Preserve the documented limitation. An expanded convergence portfolio is nonblocking and does not authorize MITC4+. | -| Volumetric locking | not applicable to the approved plane-stress shell contract | Do not reinterpret `C5` as a full 3D nearly incompressible material law. | -| Hourglass modes | no reduced-integration/hourglass path is approved | Both source `S4` and `S4R` use the same full `2x2x2` FESA integration and MITC tying path. | -| Degenerate, inverted, or self-intersecting geometry | fail-closed contract is present | Enforce distinct connectivity, non-self-intersection, finite nonzero surface measure, finite reciprocal bases, and `J>0` at every required location. | -| Near-singular but still positive geometry | conditioning may degrade because no calibrated quality threshold is in scope | Preserve finite checks and deterministic solver failure diagnostics; do not invent `NR-O04` thresholds. | -| Opposed or invalid nodal directors | would corrupt frames, signs, and tying | Reject nonfinite/zero candidates, nonpositive incident-normal agreement, and nonfinite/zero averages; use duplicate source nodes for folds. | -| Drilling singularity | four nonphysical modes would remain without regularization | Apply the exact fixed `R+` rule and verify stabilized nullity six. | -| Drilling contamination of physics | possible if drill enters the physical operator or recovery | Keep `T_p` and `T_d` separate and verify pure drill has zero physical strain/resultant/stress and no physical energy contribution. | -| Rigid-mode test contamination | a full spatial rotation vector can contain director-parallel rotation | Construct physical rigid rotation with `u_I=omega x X_I`, `delta d_I=omega x d_I`, and `gamma_I=0` as specified in Section 8.3. | -| Wrong shear component/factor | would cause patch failure or incorrect shear energy | Keep the `xi-zeta`/`eta-zeta` tying pairs and engineering factor `gamma_ij=2 epsilon_ij` explicit. | -| Recovery sign/location drift | could hide a correct stiffness behind wrong outputs | Reuse stiffness frames, tying, material, and thickness quadrature; preserve four Gauss identities and bottom/middle/top positions without averaging. | -| Future nonlinear misuse | current Section 15 does not define a complete global nonlinear element | Keep it non-executable until a separate approved nonlinear formulation closes `Phi`, map curvature, objective drill, load work, and state. | +| `rigid_body_modes` | Physical `K20`은 six rigid modes와 expected rank 14를 가져야 한다. 24-DOF embedding은 네 drill null coordinates를 더하고 fixed drill block 뒤 expected rank 18/nullity 6이다. | 세 translation과 세 rotation을 명시적으로 구성한다. Rotation mode는 `u_I=omega x X_I`, `theta_I=omega-(omega dot d_I)d_I`, `gamma_I=0`를 사용한다. | +| `patch_test` | Bilinear membrane/bending field와 MITC tied shear는 required patch states를 표현할 계약을 갖는다. | `E11/E22/G12`, `K11/K22/K12`, `G13/G23`를 독립 시험하고 signs/component order/resultants/stress를 함께 확인한다. | +| `symmetry` | `B^T C B`, `T_p^T K20 T_p`, `T_d^T(k_d I)T_d`는 exact arithmetic에서 symmetric이다. | Scaled Frobenius check `<=1e-12`; deterministic assembly가 대칭을 깨지 않는지 확인한다. | +| `positive_definiteness` | Free element는 six-mode semidefinite이고, 충분히 구속된 nonsingular `Kff`는 positive definite가 기대된다. Geometry 또는 supports가 부적절하면 singularity가 정당하다. | Scaled spectrum/rank, non-rigid positive physical energy, constrained solve 및 singular negative cases를 분리한다. | +| `hourglass` | `1 x 1` reduced integration을 쓰지 않으므로 Abaqus-style hourglass path는 `N/A`다. | Full `2 x 2` midsurface rank test는 유지한다. S4R source label로 reduced rule을 선택하지 않는다. | +| `shear_locking` | Edge-midpoint MITC projection이 transverse-shear locking을 다루지만 모든 mesh/thickness에서 완전 제거를 주장할 수 없다. | Required shear/bending patch와 declared references를 통과한다. Broader thin/thick convergence는 nonblocking characterization이다. | +| `membrane_locking` | Original MITC4는 membrane strain을 수정하지 않아 distorted curved meshes에서 알려진 locking 위험이 남는다. | Known limitation을 유지하고 MITC4+ 성능을 주장하지 않는다. Expanded curved/distorted portfolio는 optional이다. | +| `volumetric_locking` | 승인된 homogeneous plane-stress shell에는 `N/A`다. | `C5`를 3D nearly-incompressible law로 확장하지 않는다. | +| `distortion` | 양의 `J`를 유지하는 심한 distortion/warpage는 정확도와 rank/conditioning을 악화할 수 있다. | 모든 required location의 exact predicates와 rank/finite-result checks를 시행한다. 승인되지 않은 quality cutoff를 추가하지 않는다. | +| `singular_jacobian` | Nonfinite/nonpositive `J`, zero surface measure, invalid reciprocal basis는 mapping을 무효화한다. | Center, stiffness, tying 및 recovery inventory 전체를 omission/clamp 없이 fail closed한다. | +| `conditioning` | Thin shells, near-degenerate positive-J geometry 및 작은 fixed drill scale에서 `Kff` conditioning이 나빠질 수 있다. | Spectrum/condition evidence는 오직 length-scaled matrix를 사용한다. Threshold calibration은 gate가 아니지만 factorization failure는 결정적으로 진단한다. | +| `convergence` | Current solve는 direct linear solve라 Newton convergence는 `N/A`; spatial convergence와 locking trend는 모델 의존이다. | Free residual/global equilibrium `<=1e-10`과 declared reference cases를 확인한다. Broader mesh sequences는 optional이다. | +| `drilling_contamination` | Numerical drill이 physical strain/recovery에 들어가면 비물리 결과가 생긴다. | `T_p`/`T_d`를 분리하고 pure drill에서 physical strain/resultant/stress/energy가 zero임을 시험한다. Full residual은 의도대로 stabilized system 전체를 포함한다. | +| `future_nonlinear_misuse` | Section 15만으로 global nonlinear element를 만들면 nonobjective drill 또는 inconsistent tangent가 된다. | Current plan에서 완전히 제외하고 별도 승인 전 실행하지 않는다. | -## Consistency Checks +## 5. Consistency Checks -### 1. DOF order, director sign, and coordinate transforms — pass +### 5.1 Units, dimensions, DOF order, and constrained/free system — `pass` -- Global order is exactly `[UX,UY,UZ,URX,URY,URZ]` per node. -- `R_I=[a_I b_I d_I]` is right-handed and orthonormal, with - `[alpha,beta,gamma]^T=R_I^T theta_I^g`. -- The director variation `delta d_I=beta_I a_I-alpha_I b_I` has the correct sign for - `theta_I x d_I`. -- `T_p` is `20x24`; `T_d` is `4x24`. The physical operator receives only `q20`, and - the drilling potential receives only `gamma`. -- The transpose maps in Formulation Sections 5.3 and 7.2 preserve virtual work and - energy in the common 24-DOF space. +- Per-node global order is exactly `[UX,UY,UZ,URX,URY,URZ]`; element order is 24 + global coordinates and 20 physical coordinates + `[uX,uY,uZ,alpha,beta]` per node plus four separately selected `gamma` coordinates. +- `T_p` is `20 x 24`, `T_d` is `4 x 24`, `K20` is `20 x 20`, and both global + stiffness contributions are `24 x 24`. +- Translation-translation, translation-rotation, and rotation-rotation stiffness + blocks have units `force/length`, `force`, and `force*length`; `R+` therefore + excludes every translational diagonal. +- The constrained/free equation is `Kff*df=Ff-Kfc*dc`. Stiffness partition and + factorization precede load assembly, and an all-constrained valid `0 x 0 Kff` is + not reclassified as singular. +- `r=K*d-F` fixes the internal-minus-external sign. Constrained entries are the + required reaction rows and free entries remain residual evidence. -### 2. Shape functions, geometry, and B operator — pass +### 5.2 Local/global transforms, congruence, and energy — `pass` -- The bilinear shape functions satisfy partition of unity, nodal interpolation, and - derivative-sum identities. -- The degenerated geometry uses a dimensionless unit director and separate thickness - factor `t*zeta/2`, avoiding thickness double-counting. -- The direct covariant strain column is the symmetric gradient written in covariant - bases. The two transverse covariant shear components alone are replaced by the - canonical MITC4 edge-midpoint interpolation. -- Reconstructing with reciprocal bases before local projection preserves the tensor - meaning. Engineering shear factors are applied once in the local five-component - vector. -- The same projected `B_bar` is used in strain, residual, stiffness, and recovery; - no direct/tied shear mismatch remains. +- `(a_I,b_I,d_I)` and `(e1,e2,e3)` are deterministic right-handed orthonormal frames. + The least-aligned-axis nodal rule avoids a fixed-axis parallel singularity. +- `[alpha,beta,gamma]^T=R_I^T theta_I^g` gives + `delta d=beta*a-alpha*b=theta x d` with the required sign. +- `q20=T_p qg` and `gamma=T_d qg` preserve virtual work. Congruence gives + `Kphys24=T_p^T K20 T_p` and `Kdrill24=T_d^T(k_d I4)T_d`; the corresponding local and + global quadratic energies are identical. +- A physical rigid rotation uses only the tangent projection of `omega`, so `gamma=0` + and drilling does not destroy the six physical rigid modes. -### 3. Constitutive matrix and dimensional consistency — pass +### 5.3 Kinematic operators and MITC tying — `pass` -- For finite `E>0` and `-10` and + `-1 GREEN -> VERIFY`: -### Required patch and sign tests +1. Shape identities; nodal/integration frame orthonormality, handedness and axis + tie-break determinism. +2. `T_p`/`T_d` dimensions, orthogonal channel selection, virtual-work equality and + nonzero transformation-energy equality. +3. Hand-calculated direct membrane/bending columns, all four covariant tying values, + interpolation weights and engineering-shear factors. +4. `Cps/C5/A/D/As` coefficients, symmetry, positive definiteness, dimensions and + force/length unit-rescaling invariance. +5. Common `2 x 2 x 2` point/weight order and an independent analytical or + higher-order flat-element stiffness/recovery cross-check. +6. Required-location geometry validation: valid planar/rotated/warped cases and + duplicate, bow-tie/self-intersecting, zero-area, reversed, nonfinite, + nonpositive-J and opposed-normal negative cases. +7. Scaled symmetry `<=1e-12`, physical rigid action `<=1e-10`, expected physical + rank 14, stabilized rank 18/nullity six, and positive non-rigid physical energy. +8. Exact `R+` membership, exclusion of translations, fixed coefficient, empty-`R+` + failure, pure drill action and zero physical recovery/energy. +9. Stable COO/reduction, source/result/diagnostic order and thread-count + repeatability. +10. `Kff/Kfc` effective RHS, nonzero prescribed values, full-residual reaction, + singular-support negative case, and valid all-constrained `0 x 0 Kff` case. +11. Exact-zero and accepted/rejected `rho_M` moment projections, including proof + that rejected drilling moments never reach stabilization. +12. Mandatory HDF5 locations/components/units, physical-only energy, nonfinite + recovery failure and atomic finalization. -- constant membrane strain/stress and `N` sign; -- pure bending about both local axes, curvature/moment order, and bottom/top stress sign; -- constant transverse shear and `Q13/Q23` order; -- pure twist and `K12/M12` convention; -- zero physical recovery from a pure drilling vector. +### 6.2 Required patch and sign tests -### Declared reference readiness +- independent constant `E11`, `E22`, and `G12` membrane fields with `N` and + middle-stress signs; +- pure `K11` and `K22` bending with `M` order and bottom/top stress reversal; +- pure `K12` twist with `M12` sign; +- constant `G13` and `G23` transverse shear with `Q13/Q23` order; +- six physical rigid states and four pure drilling states; +- source-type-only S4/S4R variants producing identical FESA numeric rows and + different preserved source metadata. -The lightweight inventory identifies these read-only required pairs: +### 6.3 Reference and physics handoff readiness -- `reference/shell/shell.inp` and - `reference/shell/shell displacements.csv` for source `S4`; -- `reference/shellR/shellR.inp` and - `reference/shellR/shellR displacements.csv` for source `S4R`. +The declared read-only pairs are: -Read-only inspection confirmed that all four declared files exist, their SHA-256 -values match the Reference Case inventory, and each required displacement CSV has -49 data rows. This is inventory evidence only. No FESA output exists yet in this -review, and no reference-comparison pass/fail decision was made. +- `reference/shell/shell.inp` with + `reference/shell/shell displacements.csv` for S4; +- `reference/shellR/shellR.inp` with + `reference/shellR/shellR displacements.csv` for S4R. -The later comparator must require exact normalized source-row/component sets, -finite/unique values, U blocking, UR warning-only, and the approved mixed tolerance. -The two Abaqus cases are not expected to equal one another, while identical supported -FESA models labeled S4 or S4R must take the same internal numerical path. +The Reference Model and I/O documents define deterministic HDF5-to-CSV identity, +precheck and tolerance sufficiently for later comparison. This review did not assert +that `results.h5` exists or that any row passes. Reference Verification owns numeric +U/UR outcome; Physics Evaluation owns force/moment balance, displacement direction, +symmetry, result signs, recovered-resultant consistency and physical plausibility. -### Nonblocking evidence +### 6.4 Missing evidence classification -The following cannot change this formulation verdict: +- blocking_for_current_formulation: `none` +- required_after_implementation: invariant, patch, MSVC build/CTest, declared + reference comparison and physics evidence above +- nonblocking_optional: drilling coefficient sweep/energy ratio, `NR-O03`, `NR-O04`, + canonical naming, README/metadata/provenance, expanded benchmark portfolio and + broader mesh convergence studies +- future_only: nonlinear directional-derivative/objectivity/Newton evidence after + its missing formulation decisions are separately approved -- absent README, `metadata.json`, provenance, canonical name, schema-version record, - or duplicated bundle descriptions; -- no coefficient sweep, drilling-energy ratio, smooth-angle calibration, or - distortion/warp threshold sweep; -- no expanded flat/thin/thick/distorted/warped/curved/convergence benchmark portfolio; -- no implementation result, build/test result, Abaqus run, or completed comparison - at this pre-implementation gate. - -## Required Revisions +## 7. Required Revisions ### Formulation Agent - None for the approved current linear-static implementation scope. -- Keep Formulation Section 15 non-executable until a separately approved nonlinear - feature closes its global coordinate map, consistent tangent, objective drilling, - and load-work decisions. +- Do not promote Section 15 to executable status until a separate formulation closes + the nonlinear global coordinate map, objective drilling and load-work contracts. ### Research Agent - None before current Implementation Planning. -- Broader original-MITC4 locking and convergence studies remain optional future - characterization and must not silently widen the implementation gate. - -### Reference Model Agent - -- None for this formulation verdict. Preserve the four declared artifacts read-only. -- Optional administrative metadata, if later added by an authorized phase, does not - replace the approved exact paths, matching, and tolerance contract. - -## Downstream Handoff - -### Implementation Planning Agent - -Implementation Planning is authorized. The plan shall: - -- cover the deterministic director/frame preprocessing, `24 -> 20 + 4` transforms, - covariant MITC tying, full `2x2x2` integration, fixed drilling split, and recovery; -- trace every approved must-requirement to TDD tests, including the invariant, patch, - fixed-drilling, failure, schema, row-matching, and U/UR decision behaviors above; -- preserve one internal `FESA-MITC4` numerical path for source S4 and S4R while keeping - source metadata distinct; -- keep drilling out of physical recovery and HDF5 results; -- exclude future nonlinear execution, calibration sweeps, removed `NR-O03/NR-O04`, - expanded portfolios, and administrative reference requirements. - -This handoff authorizes planning only. It does not authorize Harness execution, -production-code changes, reference-artifact mutation, or a claim of implementation -completion. +- Optional locking/convergence characterization must remain clearly outside the + approved implementation gate and must not imply MITC4+ or Abaqus equivalence. ### I/O Definition Agent -The current I/O contract is numerically consistent with the formulation. Planning -shall preserve its exact source identity, load projection, output units/locations, -physical-energy meaning, reference row mapping, and U/UR decision rule. +- None for the current numerical verdict. Preserve exact physical/full-residual + distinction, source identity, locations, units and U-versus-UR decision rule. -### Reference Verification and Physics Evaluation Agents +### Reference Model Agent -These remain downstream of implementation and build/test. Reference Verification -will decide U/UR comparison outcomes; Physics Evaluation will independently assess -equilibrium, signs, symmetry, and physical plausibility. Neither result is asserted -by this review. +- None for the current numerical verdict. Preserve the four declared files read-only + and do not add administrative or portfolio gates. -## Review Evidence +## 8. Downstream Handoff -This review used the repository policy/design files, the approved requirements, -research, formulation, I/O definition and reference-case inventory listed in -Metadata, plus read-only inspection of the four declared artifacts. Local FEM wiki -material cross-checked MITC4 kinematics, edge-midpoint assumed shear and known locking -risks; the approved repository documents remain the feature source of truth. +### Implementation Planning Agent + +Implementation Planning is authorized and shall: + +- trace the required tests in Section 6 to the approved requirement IDs before + production work; +- keep `24 global -> 20 physical + 4 drilling` transforms, covariant MITC tying, + common `2 x 2 x 2` integration, fixed drilling and physical recovery as explicit + independent test seams; +- preserve stiffness assembly/partition/factorization-before-load, stable reduction, + full-residual reaction and failure-atomic HDF5 lifecycle; +- keep future nonlinear execution, coefficient calibration, drilling output, + `NR-O03/NR-O04`, reference-artifact mutation and Abaqus-equivalence claims outside + the plan. + +This handoff authorizes planning only. It does not authorize Harness execution, +production implementation, reference artifact changes, or completion claims. + +### Reference Verification Agent + +- Compare authoritative FESA HDF5 rows directly with the matching declared Abaqus + displacement CSV after exact row-set precheck. +- Let only U1/U2/U3 affect pass/fail; report every UR1/UR2/UR3 warning without + changing the verdict. + +### Physics Evaluation Agent + +- After reference verification, independently evaluate force and global moment + balance, free residual, reaction sign, displacement direction, symmetry, positive + physical energy and consistency of local resultants/stresses. + +### Coordinator and Release Agents + +- Record the Numerical Review gate as passed for planning at HEAD `a058ef7`. +- Do not infer implementation or release completion. Build/test, reference, + physics-sanity and release-readiness gates remain pending. diff --git a/phases/index.json b/phases/index.json index 6b4570a..172d8a0 100644 --- a/phases/index.json +++ b/phases/index.json @@ -3,6 +3,10 @@ { "dir": "linear-static-3d-euler-beam", "status": "pending" + }, + { + "dir": "linear-static-mitc4-shell", + "status": "pending" } ] } diff --git a/phases/linear-static-mitc4-shell/index.json b/phases/linear-static-mitc4-shell/index.json new file mode 100644 index 0000000..57800f0 --- /dev/null +++ b/phases/linear-static-mitc4-shell/index.json @@ -0,0 +1,76 @@ +{ + "project": "FESA Structural Solver", + "phase": "linear-static-mitc4-shell", + "steps": [ + { + "step": 0, + "name": "shell-semantic-model", + "status": "pending" + }, + { + "step": 1, + "name": "shell-domain-mapping", + "status": "pending" + }, + { + "step": 2, + "name": "shell-director-geometry", + "status": "pending" + }, + { + "step": 3, + "name": "mitc4-kinematics-constitutive", + "status": "pending" + }, + { + "step": 4, + "name": "mitc4-stiffness-drilling", + "status": "pending" + }, + { + "step": 5, + "name": "mitc4-physical-recovery", + "status": "pending" + }, + { + "step": 6, + "name": "shell-dof-scatter", + "status": "pending" + }, + { + "step": 7, + "name": "shell-sparse-assembly", + "status": "pending" + }, + { + "step": 8, + "name": "shell-load-validation", + "status": "pending" + }, + { + "step": 9, + "name": "shell-analysis-state", + "status": "pending" + }, + { + "step": 10, + "name": "shell-result-recovery", + "status": "pending" + }, + { + "step": 11, + "name": "shell-hdf5-output", + "status": "pending" + }, + { + "step": 12, + "name": "shell-linear-static-flow", + "status": "pending" + }, + { + "step": 13, + "name": "shell-reference-comparison", + "status": "pending" + } + ] +} diff --git a/phases/linear-static-mitc4-shell/step0.md b/phases/linear-static-mitc4-shell/step0.md new file mode 100644 index 0000000..c3cf46a --- /dev/null +++ b/phases/linear-static-mitc4-shell/step0.md @@ -0,0 +1,106 @@ +# Step 0: Shell Semantic Model + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` +- 이 Step만 `RED -> observed failure -> minimal GREEN -> focused/full VERIFY`로 수행한다. + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md` +- `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md` +- `/docs/PRD.md` +- `/docs/ARCHITECTURE.md` +- `/docs/ADR.md` +- `/docs/HARNESS.md` +- `/docs/HARNESS_WORKFLOW.md` +- `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- `/phases/index.json` +- `/phases/linear-static-mitc4-shell/index.json` +- `/phases/linear-static-mitc4-shell/step0.md` +- `/include/fesa/model/model_types.hpp` +- `/include/fesa/model/domain.hpp` +- `/src/fesa/model/domain.cpp` +- `/tests/unit/model/model_types_test.cpp` +- `/tests/unit/model/domain_test.cpp` + +필수 파일이 없거나 승인 계약과 충돌하면 현재 Step을 `blocked`로 기록하고 중단한다. + +## 작업 + +Requirements 002-016, 024의 semantic ownership만 구현한다. + +1. 먼저 `MITC4-MODEL-001`과 `MITC4-MODEL-002`를 기존 model tests에 추가한다. +2. Tests는 four-node connectivity, stable `SourceEntityId`, source type `S4|S4R`와 + internal `FESA-MITC4` identity 분리, finite positive thickness와 material/section + indices, optional initial nodal director/frame storage, declaration order를 검증한다. +3. Production은 `model_types.hpp`와 필요한 `Domain` const accessor에만 최소 추가한다. + Candidate records are `ShellSourceElementType`, `ShellSection`, + `Mitc4ShellDefinition` and a shell-only node director/frame record. +4. 기존 `EulerBeam3DDefinition`, `GeneralBeamSection`, B33 accessors를 보존한다. +5. Node/Element에 equation id를 넣지 않는다. Director는 dimensionless unit vector이고 + thickness와 별도다. + +## Acceptance Criteria + +먼저 다음 configure를 실행한다. + +```powershell +$requiredBuildPaths = @( + "C:/git/googletest", + "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl", + "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb", + "C:/Program Files/HDF_Group/HDF5/2.1.1/cmake" +) +foreach ($requiredBuildPath in $requiredBuildPaths) { + if (-not (Test-Path -LiteralPath $requiredBuildPath)) { throw "Missing $requiredBuildPath" } +} +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" +``` + +RED test를 작성한 뒤 아래 build/test가 missing shell semantic behavior 때문에 실패함을 +기록한다. Compile failure면 그 expected failure를 기록하고 CTest는 GREEN 뒤 실행한다. + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "DomainModel" --output-on-failure +``` + +GREEN 뒤 focused와 full VERIFY: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "DomainModel" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +- RED command와 예상 failure, GREEN/focused/full 결과를 다음 Step summary에 남긴다. +- 성공 시 현재 Step만 `completed`와 한 줄 `summary`로 갱신한다. +- 3회 후 실패면 `error`/`error_message`, 사용자 결정이 필요하면 + `blocked`/`blocked_reason`을 기록한다. +- timestamp, retry, commit, 다음 Step 선택은 Executor 소유다. + +## 금지사항 + +- Parser, element kernel, DOF, assembly를 수정하지 마라. 이유: Step 0은 model layer만 소유한다. +- 공통 public Element hierarchy를 만들지 마라. 이유: 승인된 아키텍처 범위가 아니다. +- 기존 B33 record를 제거하거나 의미를 바꾸지 마라. 이유: V0 회귀를 막는다. +- 직접 commit하거나 hook script를 수동 실행하지 마라. 이유: Executor/hook 소유권이다. +- `reference/` 파일을 수정하거나 Abaqus를 실행하지 마라. diff --git a/phases/linear-static-mitc4-shell/step1.md b/phases/linear-static-mitc4-shell/step1.md new file mode 100644 index 0000000..fd855fc --- /dev/null +++ b/phases/linear-static-mitc4-shell/step1.md @@ -0,0 +1,78 @@ +# Step 1: Shell Domain Mapping + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 001-010, 017-023 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 1-5, 8-9 +- `/phases/index.json`, task index, `/phases/linear-static-mitc4-shell/step1.md` +- Step 0에서 수정한 model/Domain paths와 Step 0 summary +- `/include/fesa/io/abaqus/domain_mapper.hpp` +- `/src/fesa/io/abaqus/domain_mapper.cpp` +- `/tests/unit/io/abaqus/domain_mapper_test.cpp` +- `/include/fesa/io/abaqus/input_syntax.hpp`와 `input_reader.hpp`는 경계 확인용으로만 읽는다. + +## 작업 + +1. `MITC4-MAP-001..004`를 먼저 작성한다. +2. `AbaqusDomainMapper::map(const ParsedInput&) -> Result` signature를 유지하고 + exact `TYPE=S4|S4R` four-node connectivity와 single-row centered + `*SHELL SECTION, MATERIAL=...`를 semantic model로 mapping한다. +3. ELSET/material을 element마다 exactly once resolve하고 source type과 + `FESA-MITC4` identity를 분리한다. +4. identity PART/ASSEMBLY/INSTANCE 및 multiple identity instances의 stable mapping을 + 유지한다. Mixed beam-shell은 `unsupported-mixed-element-model`로 거부한다. +5. Invalid connectivity/section/material/unsupported option/second or nonlinear step/ + DLOAD를 I/O 계약의 exact diagnostic class로 fail closed 한다. +6. Existing six-DOF BOUNDARY/CLOAD grammar와 output-request no-op behavior를 재사용한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "InpDomainMapping" --output-on-failure +``` + +Valid S4/S4R mapping 또는 negative diagnostic assertion의 expected RED를 기록한 뒤 +minimal GREEN만 작성한다. GREEN 뒤: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "InpSyntax|InpDomainMapping|DomainModel" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED/focused/full evidence를 기록하고 현재 Step만 `completed`/`summary` 또는 +`error`/`error_message`, `blocked`/`blocked_reason`으로 갱신한다. Timestamp, +commit, advancement는 Executor 소유다. + +## 금지사항 + +- `AbaqusInputReader`에 semantic policy를 넣지 마라. +- Element math, geometry calibration, equation numbering을 구현하지 마라. +- Unsupported 의미를 무시하거나 S4R reduced integration을 암시하지 마라. +- Reference artifact, tolerance, upstream 문서를 수정하지 마라. +- 직접 commit/hook 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step10.md b/phases/linear-static-mitc4-shell/step10.md new file mode 100644 index 0000000..31ef007 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step10.md @@ -0,0 +1,69 @@ +# Step 10: Shell Result Recovery + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 029/035/041-046/048/057 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` Sections 14, 16 +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 6.3-6.5 +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step10.md`, completed Steps 5/9 paths and summaries +- `/include/fesa/results/result_recovery.hpp` +- `/src/fesa/results/result_recovery.cpp` +- `/tests/unit/results/result_recovery_test.cpp` + +## 작업 + +1. `MITC4-REC-001..005`를 먼저 작성한다. +2. Existing full `K*d-F` residual을 nodal reaction/free residual evidence로 유지한다. +3. Shell element displacement는 24-entry scatter로 추출하고 Step 5 + physical-only recovery를 호출해 stable source-element/GP/section order로 candidate를 채운다. +4. Deterministic element reduction으로 physical energy를 합산한다. Applied CLOAD와 + constrained reaction으로 global origin about force/moment balance와 normalized + metrics를 계산한다. +5. 모든 row/component/location/finite validation 뒤 AnalysisState에 원자적으로 commit한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "ResultRecovery" --output-on-failure +``` + +Beam-only recovery/absent shell rows의 expected RED 후 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "ResultRecovery|AnalysisState|Mitc4ShellPhysicalRecovery" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED와 focused/full result evidence를 기록하고 current Step만 갱신한다. + +## 금지사항 + +- Result record type 또는 HDF5 schema를 이 Step에서 새로 만들지 마라. +- Location averaging, Abaqus point relabeling, drilling recovery/energy를 추가하지 마라. +- Reaction을 shell resultants의 별도 합으로 정의하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step11.md b/phases/linear-static-mitc4-shell/step11.md new file mode 100644 index 0000000..1922d9e --- /dev/null +++ b/phases/linear-static-mitc4-shell/step11.md @@ -0,0 +1,72 @@ +# Step 11: Shell HDF5 Output + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 039-048 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Section 6 exact schema +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step11.md`, completed Steps 9/10 paths and summaries +- `/include/fesa/results/results_writer.hpp` +- `/include/fesa/io/hdf5/hdf5_results_writer.hpp` +- `/src/fesa/io/hdf5/hdf5_results_writer.cpp` +- `/tests/unit/io/hdf5/hdf5_results_writer_test.cpp` + +## 작업 + +1. `MITC4-H5-001..004`를 먼저 작성한다. +2. Generic `ResultsWriter::write(path,Domain,AnalysisState,diagnostics)` 경계를 유지한다. +3. I/O contract exact metadata, four-node element identity, director/frame, + materials/sections, masks/prescribed values, fixed locations와 all mandatory shell + result/global datasets를 schema v0에 additive하게 기록한다. +4. Exact shapes/dtypes/component attributes/unit dimensions/coordinate/location/step/frame + identity와 finite/order를 self-check한다. +5. Output request와 무관하게 mandatory inventory를 기록하고 drilling paths/S33/S13/S23를 + 만들지 않는다. +6. Existing same-directory temp, flush/close, read-only reopen/self-check, atomic replace를 재사용한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "Hdf5ResultsWriter" --output-on-failure +``` + +Missing shell schema/atomic validation RED 후 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "Hdf5ResultsWriter|ResultRecovery|AnalysisState" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED/schema/focused/full evidence를 기록하고 current Step 상태 payload만 갱신한다. + +## 금지사항 + +- B33 dataset 의미를 migrate/reinterpret하지 마라. +- CSV를 solver output으로 만들거나 partial final HDF5를 남기지 마라. +- Drilling/calibration output을 추가하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step12.md b/phases/linear-static-mitc4-shell/step12.md new file mode 100644 index 0000000..123651f --- /dev/null +++ b/phases/linear-static-mitc4-shell/step12.md @@ -0,0 +1,72 @@ +# Step 12: Shell Linear Static Flow + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 024-030/051/057 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` CLI/diagnostic contract +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step12.md`, completed Steps 7-11 paths and summaries +- `/include/fesa/analysis/linear_static_analysis.hpp` +- `/src/fesa/analysis/linear_static_analysis.cpp` +- `/tests/integration/analysis/linear_static_analysis_test.cpp` +- `/tests/integration/app/fesa_application_test.cpp` +- `/include/fesa/app/fesa_application.hpp`와 implementation은 dispatch 확인용 + +## 작업 + +1. `MITC4-FLOW-001..004` integration tests를 먼저 작성한다. +2. Shell Domain을 existing eight-hook `Analysis::run()` lifecycle에 연결한다. +3. Stiffness assemble/partition, `Kff` factorize, load/effective RHS, substitute, + full displacement reconstruct, full residual/physical recovery, validated state/output + commit 순서를 유지하고 factorization은 exactly once다. +4. Nonzero prescribed displacement의 `Ff-Kfc*dc`, singular support failure, + all-constrained `0x0 Kff` success를 검증한다. +5. CLI syntax와 exit 0/2/3/4/5/6 semantics를 유지하며 shell input도 같은 + `fesa.exe --output ` route를 사용한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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_integration_tests +ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure +``` + +Shell pipeline RED를 확인하고 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_integration_tests +ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED/lifecycle/focused/full evidence를 기록하고 current Step 상태 payload만 갱신한다. + +## 금지사항 + +- Analysis lifecycle을 재정렬하거나 0x0 Kff를 singular로 바꾸지 마라. +- Nonlinear procedure, distributed load, mixed beam-shell execution을 추가하지 마라. +- Candidate validation 전 state/output을 commit하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step13.md b/phases/linear-static-mitc4-shell/step13.md new file mode 100644 index 0000000..5473642 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step13.md @@ -0,0 +1,107 @@ +# Step 13: Shell Reference Comparison + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` +- 이 Step은 test-only reference module을 소유하며 solver production module을 소유하지 않는다. + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 053/058-072 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Section 7 +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step13.md`, completed Steps 11/12 paths and summaries +- `/tests/reference/reference_comparison.hpp`와 cpp/test는 B33 identity/report precedent +- Candidate new `/tests/reference/mitc4_reference_comparison.hpp` +- Candidate new `/tests/reference/mitc4_reference_comparison.cpp` +- Candidate new `/tests/reference/mitc4_reference_comparison_test.cpp` +- Candidate new `/tests/reference/mitc4_reference_cases_test.cpp` +- `/tests/CMakeLists.txt` +- Read-only: + `/reference/shell/shell.inp`, + `/reference/shell/shell displacements.csv`, + `/reference/shellR/shellR.inp`, + `/reference/shellR/shellR displacements.csv` + +## 작업 + +1. `MITC4-REF-001..006`, `MITC4-E2E-S4-001/002`, + `MITC4-E2E-S4R-001/002`를 comparator 구현 전에 작성한다. +2. Test-only comparator는 각 case의 exact input/displacement CSV와 FESA HDF5만 요구한다. + `Part Instance Name`와 `Node Label`을 HDF5 node identity에 match하고 CSV + `U-U1..U-U3, UR-UR1..UR-UR3`를 displacement columns 0..5에 match한다. +3. Header/schema/row set/missing/extra/duplicate/nonfinite/source identity를 numeric + comparison 전에 fail한다. +4. Component group의 finite Abaqus scale로 + `tol_c=1e-9+1e-6*reference_scale_c`를 clamp/row denominator 없이 적용한다. + U1/U2/U3만 blocking이고 UR1/UR2/UR3 exceedance는 deterministic warning-only다. +5. 모든 row decision, max absolute, normalized, RMS, vector norm, worst source row/component를 + deterministic report/JSON에 남긴다. +6. S4/S4R HDF5가 source type만 보존하고 동일 `FESA-MITC4` integration rule을 기록하는지 + 검증한다. +7. Declared case가 solver production defect를 드러내면 current Step을 중단하고 + Correction/Coordinator에 owning prior module로 handoff한다. 이 Step에서 그 production + file을 수정하지 않는다. + +## Acceptance Criteria + +먼저 exact expected hashes를 검증한다. + +```powershell +$expectedReferenceHashes=[ordered]@{ + "reference/shell/shell.inp"="4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF" + "reference/shell/shell displacements.csv"="C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B" + "reference/shellR/shellR.inp"="1325940FB42B78961CF25E84379BF2693846FAD22473E7688AC5456B37B18CB4" + "reference/shellR/shellR displacements.csv"="8887ACC5ED007CB97583A9FDC1150B48B9297E269A5BA8EBA6C1A5F6306E98CB" +} +foreach($p in $expectedReferenceHashes.Keys){ + if((Get-FileHash -Algorithm SHA256 -LiteralPath $p).Hash -ne $expectedReferenceHashes[$p]){ + throw "Reference artifact changed: $p" + } +} +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure +``` + +Missing comparator/case RED를 확인하고 test-only minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_reference_tests +ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference|Mitc4S4RReference" --output-on-failure +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 +foreach($p in $expectedReferenceHashes.Keys){ + if((Get-FileHash -Algorithm SHA256 -LiteralPath $p).Hash -ne $expectedReferenceHashes[$p]){ + throw "Reference artifact changed: $p" + } +} +git diff --check +``` + +## 검증 및 상태 갱신 + +RED/comparator/E2E/full/hash evidence를 기록하고 current Step 상태 payload만 갱신한다. + +## 금지사항 + +- Abaqus/reference solver를 실행하거나 reference 파일을 생성·수정·rename·repair하지 마라. +- README, metadata.json, provenance, Abaqus version을 gate로 만들지 마라. +- UR warning을 blocking으로 바꾸거나 tolerance를 calibration/clamp하지 마라. +- Reaction/stress equality gate나 Abaqus formulation equivalence를 추가하지 마라. +- Solver production file을 수정하거나 직접 commit/hook 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step2.md b/phases/linear-static-mitc4-shell/step2.md new file mode 100644 index 0000000..73ef074 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step2.md @@ -0,0 +1,71 @@ +# Step 2: Shell Director Geometry + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 011-016/050/051/054 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` Sections 4, 9, 17 +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` Sections 5.2, 5.5, 6.1 +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 3.3, 8-9 +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step2.md`, Step 0-1 modified paths/summaries +- Candidate new `/include/fesa/model/shell_geometry.hpp` +- Candidate new `/src/fesa/model/shell_geometry.cpp` +- Candidate new `/tests/unit/model/shell_geometry_test.cpp` +- `/src/fesa/CMakeLists.txt`, `/tests/CMakeLists.txt` + +## 작업 + +1. `MITC4-GEO-001..004`를 먼저 작성하고 CMake에 test source를 등록한다. +2. Backend-neutral model geometry module에 element normal candidate, deterministic + area-weighted nodal director, pairwise positive orientation, right-handed nodal + tangent frame with documented axis tie-break, structured validation seam을 만든다. +3. Center, eight stiffness points, four tying points, four committed recovery points에서 + finite bases, nonzero surface measure, positive finite Jacobian을 검사한다. +4. Valid planar/rotated/warped cases와 duplicate, bow-tie, zero-area, reversed, + nonfinite, nonpositive-J, opposed-normal cases를 검증한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "Mitc4Geometry" --output-on-failure +``` + +Expected missing geometry API/behavior RED를 확인한 뒤 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "Mitc4Geometry|DomainModel|InpDomainMapping" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED/VERIFY evidence를 summary에 남기고 현재 Step 상태만 갱신한다. Executor-owned +timestamp/retry/commit/advancement를 쓰지 않는다. + +## 금지사항 + +- Calibrated smooth angle, warp/distortion threshold, NR-O03/NR-O04를 추가하지 마라. +- Parser keyword policy나 element stiffness를 구현하지 마라. +- Invalid geometry를 clamp/repair하지 마라. +- Reference/upstream 문서를 수정하거나 직접 commit/hook 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step3.md b/phases/linear-static-mitc4-shell/step3.md new file mode 100644 index 0000000..aa0a228 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step3.md @@ -0,0 +1,74 @@ +# Step 3: MITC4 Kinematics and Constitutive Law + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 031-038/050-052 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` Sections 3-11, 17 +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` Sections 5.1-5.6, 6.1-6.2 +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step3.md`, Step 2 geometry paths/summary +- `/include/fesa/elements/euler_beam_3d.hpp`와 cpp는 concrete value-kernel style 참고용 +- Candidate new `/include/fesa/elements/mitc4_shell.hpp` +- Candidate new `/src/fesa/elements/mitc4_shell.cpp` +- Candidate new `/tests/unit/elements/mitc4_shell_test.cpp` +- source/test CMakeLists + +## 작업 + +1. `MITC4-KIN-001..005` tests를 먼저 작성한다. +2. Public common Element hierarchy 없이 concrete `Mitc4Shell` value type을 만든다. +3. Candidate creation seam은 four nodes, four initial directors, `ShellSection`, + `LinearElasticMaterial`을 받아 validated `Result`을 반환한다. +4. Shape/derivative identities, local frames, `T_p`/`T_d` channel maps, direct + membrane/bending columns, four covariant MITC edge-midpoint tying samples와 + interpolation weights, engineering shear factors를 구현한다. +5. `C_ps`, `C_5`, `A`, `D`, `A_s`의 exact coefficients, dimensions, symmetry, + positive definiteness와 unit rescaling을 구현한다. +6. `2x2x2` Gauss point/weight order를 고정하고 intermediate physical matrices는 + 20 DOF contract를 유지한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "Mitc4ShellKinematics|Mitc4ShellConstitutive" --output-on-failure +``` + +Expected missing kernel/kinematics RED를 기록한 뒤 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKinematics|Mitc4ShellConstitutive|Mitc4Geometry" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +현재 Step의 RED와 focused/full evidence만 기록하고 상태 payload만 갱신한다. + +## 금지사항 + +- Global assembly, drilling stiffness, recovery/HDF5를 구현하지 마라. +- S4R source type으로 quadrature를 분기하지 마라. +- Nonlinear state/residual/tangent를 구현하지 마라. +- Vendor type을 public header에 노출하거나 직접 commit/hook 실행을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step4.md b/phases/linear-static-mitc4-shell/step4.md new file mode 100644 index 0000000..6e47317 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step4.md @@ -0,0 +1,68 @@ +# Step 4: MITC4 Stiffness and Drilling Stabilization + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 031-038/050-056 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` Sections 10-14, 17 +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` Sections 5.7, 6.1-6.2 +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step4.md`, completed Step 3 kernel/header/test and summary + +## 작업 + +1. `MITC4-KERNEL-001..006`를 production edit 전에 작성한다. +2. Common `2x2x2` integration으로 physical `K20`을 만들고 deterministic + 20-to-24 congruence로 global-coordinate `K24 physical`을 만든다. +3. `R+`는 eight physical tangent-rotation diagonal의 finite positive values만 + 사용하고 `k_ref=min(R+)`, `k_d=1e-3*k_ref`, + `K_drill=T_d^T(k_d I4)T_d`를 정확히 구현한다. +4. Empty/nonfinite `R+`는 structured deterministic failure다. +5. Scaled symmetry <=1e-12, transform energy <=1e-12, physical rigid action <=1e-10, + physical rank 14, stabilized rank 18/nullity 6, positive non-rigid energy, + membrane/bending/shear/twist patch fields를 독립 test로 검증한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "Mitc4ShellKernel|Mitc4ShellPatch|Mitc4ShellDrilling" --output-on-failure +``` + +Expected missing stiffness/drilling RED를 확인한 뒤 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "Mitc4ShellKernel|Mitc4ShellPatch|Mitc4ShellDrilling|Mitc4ShellKinematics" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED/VERIFY evidence와 exact formula를 summary에 기록하고 현재 Step 상태만 갱신한다. + +## 금지사항 + +- Translational diagonal을 `R+`에 넣지 마라. +- Coefficient sweep, calibration, drill energy/result, physical recovery를 구현하지 마라. +- S4R reduced integration/hourglass와 future nonlinear tangent를 구현하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step5.md b/phases/linear-static-mitc4-shell/step5.md new file mode 100644 index 0000000..7a3d16d --- /dev/null +++ b/phases/linear-static-mitc4-shell/step5.md @@ -0,0 +1,67 @@ +# Step 5: MITC4 Physical Recovery + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 035/042-046/052/056 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` Sections 14, 16 +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` result component/location order +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step5.md`, completed Steps 3-4 kernel/header/test and summaries + +## 작업 + +1. `MITC4-KERNEL-007`과 `MITC4-PHYSREC-001`을 먼저 작성한다. +2. `Mitc4Shell` 내부에 global element displacement 24개를 받아 physical-only + shell recovery를 반환하는 candidate seam을 최소 구현한다. +3. Fixed GP1..GP4에서 local frame, eight generalized strain/resultant를 계산하고 + BOTTOM/MIDDLE/TOP에서 direct `[S11,S22,S12]`를 계산한다. +4. Physical element strain energy만 반환하며 drilling stiffness/action은 모든 + physical recovery와 energy에서 제외한다. +5. Pure drill vector가 stabilized action은 가지지만 모든 physical recovery/energy가 + zero임을 검증한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "Mitc4ShellDrilling|Mitc4ShellPhysicalRecovery" --output-on-failure +``` + +Expected missing recovery seam/pure-drill exclusion RED 후 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "Mitc4ShellDrilling|Mitc4ShellPhysicalRecovery|Mitc4ShellPatch" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +현재 Step만 status/summary payload를 갱신하고 RED/GREEN/VERIFY를 기록한다. + +## 금지사항 + +- AnalysisState/global result rows, ResultRecovery orchestration, HDF5를 수정하지 마라. +- Drilling output/stress/resultant/energy를 추가하지 마라. +- Location averaging 또는 Abaqus integration-point identity를 만들지 마라. +- 직접 commit/hook 실행이나 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step6.md b/phases/linear-static-mitc4-shell/step6.md new file mode 100644 index 0000000..63c5542 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step6.md @@ -0,0 +1,68 @@ +# Step 6: Shell DOF Scatter + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 005/025 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step6.md`, Step 0 shell model and Step 5 summary +- `/include/fesa/fem/dof_manager.hpp`, `/src/fesa/fem/dof_manager.cpp` +- `/tests/unit/fem/dof_manager_test.cpp` +- `/tests/unit/constraints/essential_constraints_test.cpp` + +## 작업 + +1. `MITC4-DOF-001..003` tests를 먼저 작성한다. +2. 기존 node DOF order `[ux,uy,uz,urx,ury,urz]`를 유지한다. +3. B33 12-entry scatter를 보존하면서 shell four-node/source-order 24-entry typed + scatter와 sorted unique sparse pattern을 `DofManager` 단독 소유로 추가한다. +4. Free/constrained numbering과 no/mixed/all constraint, nonzero prescribed value + round trip을 shell-sized system에서 검증한다. +5. All-constrained `0x0 Kff`가 valid하도록 existing constraint behavior를 보존한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "DofManager|EssentialConstraints" --output-on-failure +``` + +Current 12-entry-only behavior의 expected RED 뒤 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "DofManager|EssentialConstraints|DomainModel" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED/VERIFY evidence를 기록하고 current Step의 Codex-owned fields만 갱신한다. + +## 금지사항 + +- Node/Element에 equation id를 저장하지 마라. +- Load/constraint ownership이나 sparse reduction을 이동하지 마라. +- 기존 B33 scatter behavior를 제거하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step7.md b/phases/linear-static-mitc4-shell/step7.md new file mode 100644 index 0000000..b201932 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step7.md @@ -0,0 +1,70 @@ +# Step 7: Shell Sparse Assembly + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 027/030/037/050/056 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step7.md`, completed Steps 4/6 paths and summaries +- `/include/fesa/assembly/sparse_assembler.hpp` +- `/src/fesa/assembly/sparse_assembler.cpp` +- `/src/fesa/math/sparse_matrix.cpp` +- `/tests/unit/assembly/sparse_assembler_test.cpp` + +## 작업 + +1. `MITC4-ASM-001..003` tests를 먼저 작성한다. +2. Shell topology를 concrete MITC4 global 24x24 stiffness에 dispatch한다. +3. Active source-element order로 worker-owned local buffers를 만들고 element당 + 576 COO entries에 stable `elementOrder`와 `localOrder`를 부여한다. +4. Existing `SparseMatrix::fromCoo` canonical reduction과 every diagonal slot을 + 보존하며 worker가 global CSR을 직접 수정하지 않게 한다. +5. Serial/TBB/repeated run CSR bytes/values를 비교하고 identical semantic S4/S4R + fixtures가 identical K를 만드는지 검증한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "SparseAssembly" --output-on-failure +``` + +Four-node/24-DOF RED를 확인하고 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "SparseAssembly|DofManager|Mitc4ShellKernel" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED와 deterministic focused/full evidence를 summary에 기록하고 current Step만 갱신한다. + +## 금지사항 + +- Worker가 global CSR을 직접 갱신하거나 unordered reduction을 사용하지 마라. +- Source type으로 quadrature/hourglass를 분기하지 마라. +- Load, solve, recovery를 구현하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step8.md b/phases/linear-static-mitc4-shell/step8.md new file mode 100644 index 0000000..babe718 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step8.md @@ -0,0 +1,69 @@ +# Step 8: Shell Load Validation + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 017-020/028 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` Sections 8, 13 +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 4.2-4.3 +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step8.md`, completed Steps 2/7 paths and summaries +- `/include/fesa/assembly/load_assembler.hpp` +- `/src/fesa/assembly/load_assembler.cpp` +- `/tests/unit/assembly/load_assembler_test.cpp` +- `/tests/unit/constraints/essential_constraints_test.cpp` + +## 작업 + +1. `MITC4-LOAD-001..004`를 먼저 작성한다. +2. Existing global six-DOF full-space CLOAD assembly와 constraint partition을 재사용한다. +3. Node별 global force/moment를 stable source order로 먼저 aggregate한다. +4. Moment가 exact zero면 별도 나눗셈 없이 accept한다. Nonzero면 approved director로 + `rho_M=abs(dot(d,M))/norm(M)`을 계산해 `rho_M<=1e-12`만 accept한다. +5. Rejected moment는 `unsupported-drilling-load`로 RHS/substitution/drill stabilization + 이전에 실패해야 한다. Existing `Ff-Kfc*dc`와 factorization-before-load를 보존한다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "LoadAssembly|EssentialConstraints" --output-on-failure +``` + +Moment projection/diagnostic RED 뒤 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "LoadAssembly|EssentialConstraints|InpDomainMapping" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +현재 Step의 RED/GREEN/VERIFY evidence와 exact threshold를 summary에 기록한다. + +## 금지사항 + +- DLOAD/equivalent/follower/distributed load를 구현하지 마라. +- Numerical drilling을 load channel로 사용하지 마라. +- Factorization/load lifecycle을 재정렬하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라. diff --git a/phases/linear-static-mitc4-shell/step9.md b/phases/linear-static-mitc4-shell/step9.md new file mode 100644 index 0000000..289f024 --- /dev/null +++ b/phases/linear-static-mitc4-shell/step9.md @@ -0,0 +1,70 @@ +# Step 9: Shell Analysis State + +## 담당 역할과 필수 스킬 + +- 담당 역할: `implementation-agent` +- 필수 스킬: `harness`, `fesa-cpp-msvc-tdd` + +## 읽어야 할 파일 + +- `/.agents/skills/harness/SKILL.md`, `/.codex/skills/fesa-cpp-msvc-tdd/SKILL.md` +- `/AGENTS.md`, `/docs/PRD.md`, `/docs/ARCHITECTURE.md`, `/docs/ADR.md` +- `/docs/HARNESS.md`, `/docs/HARNESS_WORKFLOW.md`, `/.codex/hooks.json` +- `/docs/implementation-plans/linear-static-mitc4-shell-implementation-plan.md` +- `/docs/requirements/linear-static-mitc4-shell.md` Requirements 026/041-046/048 +- `/docs/research/linear-static-mitc4-shell-research.md` +- `/docs/formulations/mitc4-shell-formulation.md` +- `/docs/numerical-reviews/linear-static-mitc4-shell-review.md` +- `/docs/io-definitions/linear-static-mitc4-shell-io.md` Sections 6.3-6.5 +- `/docs/reference-models/linear-static-mitc4-shell-reference-models.md` +- phase indexes, `step9.md`, Step 5 recovery types and Step 8 summary +- `/include/fesa/results/result_records.hpp` +- `/include/fesa/analysis/analysis_state.hpp` +- `/src/fesa/analysis/analysis_state.cpp` +- `/tests/unit/results/result_records_test.cpp` + +## 작업 + +1. `MITC4-STATE-001..003`을 먼저 작성한다. +2. Additive shell record types를 정의한다: stable element, GP1..GP4 natural location, + local 3x3 frame, eight generalized strain/resultant, three section positions의 + `[S11,S22,S12]`. +3. AnalysisState에 shell rows, physical strain energy, six equilibrium components, + three normalized verification metrics를 candidate-owned storage로 추가한다. +4. Validated candidate가 완성된 뒤에만 state로 commit하며 invalid/nonfinite/ + inventory mismatch가 기존 state를 바꾸지 않게 한다. +5. Nonlinear director history, iteration, velocity, acceleration을 할당하지 않는다. + +## Acceptance Criteria + +```powershell +$requiredBuildPaths=@("C:/git/googletest","C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl","C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb","C:/Program Files/HDF_Group/HDF5/2.1.1/cmake") +foreach($p in $requiredBuildPaths){if(-not(Test-Path -LiteralPath $p)){throw "Missing $p"}} +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 -R "AnalysisState" --output-on-failure +``` + +Missing shell state/rollback RED 뒤 minimal GREEN. 이후: + +```powershell +cmake --build .harness/build --config Debug --target fesa_unit_tests +ctest --test-dir .harness/build -C Debug -R "AnalysisState|DomainModel" --output-on-failure +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 +``` + +## 검증 및 상태 갱신 + +RED/VERIFY evidence를 기록하고 현재 Step 상태 payload만 갱신한다. + +## 금지사항 + +- Element calculation, ResultRecovery orchestration, HDF5를 구현하지 마라. +- Nonlinear/dynamic state나 drilling-specific row를 추가하지 마라. +- 직접 commit/hook 실행 또는 reference/upstream 변경을 하지 마라.