# MITC4 선형 정적 Shell 검증과 한계 본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은 통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git `858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다. 아래 날짜·revision·명령·수치는 당시 실제 실행 기록이다. 문서 정리에서 solver를 다시 실행하지 않았다. 현재 계약은 [요구사항](requirements.md), [정식화](formulation.md), [I/O](io.md), [공통 tolerance](../TOLERANCE.md)를 따른다. [과거 release 판정](release.md)의 재검증 경계도 유지한다. ## Linear Static MITC4 Shell Build/Test Report ### Metadata - feature_id: `linear-static-mitc4-shell` - source_commit: `820ba30c717b3d0e113775608e20dfd5fbc05d53` - source_implementation_report: `N/A`; Harness completion evidence is recorded in `phases/linear-static-mitc4-shell/index.json` - source_implementation_plan: `docs/linear-static-mitc4-shell/README.md` - status: `pass-for-reference-verification` - date: `2026-08-13` ### Verdict The formal build/test gate passes. A fresh Visual Studio 18 2026/MSVC x64 Debug configuration, clean full rebuild, three implementation-plan-focused CTest runs, nonzero JSON discovery, full CTest regression, and the required Harness Python self-test all completed successfully. - clean full rebuild: exit `0`; compiler/linker warning scan `0`; error scan `0` - focused kernel/model/assembly/recovery regex: `87/87` passed - focused linear-static lifecycle regex: `10/10` passed - focused MITC4 reference-test regex: `8/8` passed - CTest discovery: `144` tests, including `32` names containing `Mitc4` - full CTest after clean rebuild: `144/144` passed - Harness Python self-test: `7/7` passed - failed tests: `0` - required S4 reference hash mismatches or Git changes: `0` This verdict authorizes handoff to Reference Verification only. It does not approve reference tolerance results, physics sanity, or release readiness. ### Execution Environment - os: `Microsoft Windows 11 Home 10.0.26200 build 26200` - branch: `feat-linear-static-mitc4-shell` - source_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` - generator: `Visual Studio 18 2026` - MSBuild: `18.8.2+ce25c0108` - compiler: `MSVC 19.51.36252.0` - compiler_architecture: `x64` - Windows SDK: `10.0.26100.0` - language/config: `C++17 / Debug` - CMake: `4.4.0` - build_dir: `.harness/build` - harness_config: absent - project_selection: auto CMake from root `CMakeLists.txt` - command_discovery_path: default CMake/MSVC x64 Debug with implementation-plan generator and dependency paths - resolved dependencies: GoogleTest `C:/git/googletest`; oneMKL `2026.1.0`; oneTBB package path `2023.1`; HDF5 package path `2.1.1` The generated compiler metadata at `.harness/build/CMakeFiles/4.4.0/CMakeCXXCompiler.cmake` independently confirms `CMAKE_CXX_COMPILER_ID=MSVC` and version `19.51.36252.0`. ### Command Log Summary All durations below are wall-clock durations measured for the command. The initial green chain was retained as corroborating evidence; the later clean-rebuild chain is the canonical acceptance evidence. | order | command | exit_code | duration | relevant stdout/stderr tail | | ---: | --- | ---: | ---: | --- | | 1 | `git status --short --branch; git rev-parse HEAD` | 0 | `0.8 s` | Clean `feat-linear-static-mitc4-shell`; HEAD matched `820ba30...`. | | 2 | Required dependency `Test-Path` precheck from the implementation plan | 0 | `0.215 s` | All four GoogleTest/MKL/TBB/HDF5 paths returned `True`. | | 3 | `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"` | 0 | `8.684 s` | MSVC `19.51.36252.0`, MKL `2026.1.0`; `Configuring done`, `Generating done`. The failed pthread probes were normal CMake feature probes; `Found Threads: TRUE`. | | 4 | `cmake --build .harness/build --config Debug` | 0 | `4.382 s` | Initial incremental build produced `fesa.exe` and all three test executables; warning/error scan `0/0`. | | 5 | `ctest --test-dir .harness/build -C Debug -R "DomainModel|InpDomainMapping|Mitc4Geometry|Mitc4Shell|DofManager|EssentialConstraints|SparseAssembly|LoadAssembly|ResultRecovery|Hdf5ResultsWriter" --output-on-failure` | 0 | `5.743 s` | `100% tests passed out of 87`; failed `0`. | | 6 | `ctest --test-dir .harness/build -C Debug -R "LinearStaticCli|Mitc4ShellCli" --output-on-failure` | 0 | `1.442 s` | `100% tests passed out of 10`; failed `0`. | | 7 | `ctest --test-dir .harness/build -C Debug -R "Mitc4ReferenceComparison|Mitc4S4Reference" --output-on-failure` | 0 | `1.377 s` | `100% tests passed out of 8`; failed `0`. | | 8 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | `0.208 s` | Discovered `144` tests; `32` test names contained `Mitc4`. | | 9 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | `9.789 s` | Initial full regression: `144/144` passed; failed `0`. | | 10 | First environment/reference audit helper | 1 | `0.9 s` | Non-gating report-generation error: it hardcoded nonexistent CMake internal directory `CMakeFiles/4.3.0`; both S4 hashes had already matched before the helper stopped. No build or test failed. | | 11 | Corrected dynamic environment/reference audit helper | 0 | `0.583 s` | Located `CMakeFiles/4.4.0/CMakeCXXCompiler.cmake`; confirmed MSVC/version, both S4 hashes, no S4 diff, and clean worktree. | | 12 | `cmake --build .harness/build --config Debug --target clean` | 0 | `1.251 s` | Generated Visual Studio clean target completed. | | 13 | `cmake --build .harness/build --config Debug` | 0 | `94.616 s` | Canonical clean rebuild compiled/linked the solver, CLI, and all test executables; `89` output lines, warning scan `0`, error scan `0`. | | 14 | `cmake --build .harness/build --config Debug --target fesa_unit_tests` | 0 | `1.943 s` | `fesa_solver`, GoogleTest, and `fesa_unit_tests.exe` confirmed. | | 15 | Focused kernel/model/assembly/recovery regex from order 5 | 0 | `4.863 s` | Canonical focused run: `87/87` passed; failed `0`. | | 16 | `cmake --build .harness/build --config Debug --target fesa_integration_tests` | 0 | `1.712 s` | `fesa_solver`, GoogleTest, and `fesa_integration_tests.exe` confirmed. | | 17 | Focused lifecycle regex from order 6 | 0 | `1.531 s` | Canonical focused run: `10/10` passed; failed `0`. | | 18 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | 0 | `1.769 s` | `fesa_solver`, GoogleTest, and `fesa_reference_tests.exe` confirmed. | | 19 | Focused reference regex from order 7 | 0 | `1.511 s` | Canonical focused run: `8/8` passed; failed `0`; S4 end-to-end tests were included. | | 20 | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | 0 | `0.080 s` | Canonical discovery: `144` total, `32` MITC4-named; unit/integration/reference labels `121/10/13`. | | 21 | `ctest --test-dir .harness/build -C Debug --output-on-failure` | 0 | `9.669 s` | Canonical full regression: `100% tests passed out of 144`; failed `0`; CTest real time `9.62 s`. | | 22 | Full `reference/` Git scope and worktree audit | 0 | `0.362 s` | `reference_diff_count=0`, `reference_status_count=0`; branch and HEAD unchanged. | | 23 | `git merge-base dev HEAD` plus changed-file scope audit | 0 | `0.321 s` | Merge base `a058ef7...`; detected `scripts/execute.py`, so Harness Python self-test was required. | | 24 | `uv run --with pytest python -m pytest -v -rs` | 0 | `4.651 s` | Python `3.11.15`, pytest `9.1.1`; `7 passed in 0.11s`; failed `0`. | ### Validation Results | validation_stage | result | evidence | | --- | --- | --- | | clean baseline | pass | Branch and HEAD matched the requested baseline; worktree was clean before report creation. | | dependency precheck | pass | All four implementation-plan dependency paths existed. | | fresh configure | pass | VS18/x64 configure exit `0`; compiler metadata is MSVC x64. | | clean full build | pass | Exit `0`; solver, CLI, unit, integration, and reference targets compiled/linked. | | compiler warning policy | pass | Clean rebuild emitted zero warning lines and zero compiler/linker error lines; product CMake uses warnings-as-errors. | | feature-specific tests | pass | Approved focused regexes passed `87/87`, `10/10`, and `8/8`. | | CTest discovery | pass | Nonzero inventory: `144` tests, including `32` MITC4-named tests. | | full CTest | pass | `144/144` passed after the clean rebuild. | | Harness self-test | pass | Required because `scripts/execute.py` differs from the `dev` merge base; `7/7` passed. | | reference immutability | pass | Required S4 SHA-256 values match; entire `reference/` tree has no Git diff or status entry. | ### CTest Inventory | inventory | count | | --- | ---: | | all discovered tests | 144 | | unit label | 121 | | integration label | 10 | | reference label | 13 | | test names containing `Mitc4` | 32 | | failed tests | 0 | The `32` MITC4-named tests comprise `30` tests in `Mitc4*` suites plus `DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity` and `InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity`. The broader focused regex also exercises shared Domain, DOF, constraints, assembly, recovery, and HDF5 seams. CTest currently applies the target-wide legacy label `linear-static-3d-euler-beam` to all `144` tests and has no separate MITC4 label. The approved implementation plan explicitly permits exact suite regex filtering, which was used here, so this labeling limitation is nonblocking. ### Warning and Failure Audit - Clean rebuild warning lines: `0`. - Clean rebuild compiler/linker error lines: `0`. - Focused CTest failures: `0`. - Full CTest failures: `0`. - Harness Python failures: `0`. - Configure probes for POSIX pthread symbols reported expected negative probe results on MSVC before CMake resolved `Threads: TRUE`; this is not a configure warning or failure. - One report-generation helper failed because it assumed a CMake internal versioned directory. The corrected dynamic lookup passed. This incident did not affect configure, compile, link, test, reference artifacts, or the gate verdict. ### Reference Read-Only Audit | exact approved path | observed SHA-256 | expected match | | --- | --- | --- | | `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | yes | | `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | yes | The post-test audit found zero changed paths anywhere under `reference/`. No Abaqus or other reference solver was run. ### Failure Classification - classification: `N/A` - primary_failure: `N/A` - first_failed_build_or_test_command: `N/A` - failed_target_or_test: `N/A` - correction_handoff: `N/A` - non_gating_incident: report-only environment metadata lookup used the wrong CMake internal directory and was rerun successfully; no product correction is required ### Failed Test Inventory None. All focused, full CTest, and Harness Python tests passed. ### Handoff Recommendation | target_agent | reason | required_input | | --- | --- | --- | | Reference Verification Agent | Build/test status is `pass-for-reference-verification`. | This report, source HEAD `820ba30...`, `.harness/build/tests/Debug/fesa_reference_tests.exe`, and the unchanged declared S4 input/CSV pair. | The focused reference CTest generated/used build-local comparison evidence, but the Build/Test Executor does not interpret that evidence as the formal reference tolerance verdict. Reference Verification must independently inspect and report it. ### Open Issues - None blocking Reference Verification. - The target-wide legacy CTest label prevents a precise MITC4 label count; exact implementation-plan suite regexes provide the approved focused test entry point. ## Linear Static MITC4 Shell Reference Verification Report ### Metadata - feature_id: `linear-static-mitc4-shell` - model_id: `shell-s4` - source_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` - source_build_test_report: `docs/linear-static-mitc4-shell/verification.md` - source_reference_models: `docs/linear-static-mitc4-shell/reference-model.md` - source_io_definition: `docs/linear-static-mitc4-shell/io.md` - source_requirements: `docs/linear-static-mitc4-shell/requirements.md` - historical_status: `pass-for-physics-evaluation` - current_status: `pass-for-physics-evaluation` - superseded_on: `2026-08-18` - revalidated_on: `2026-08-18` - date: `2026-08-13` The fixed-absolute-tolerance evidence below is preserved as a historical record. ADR-022 supersedes that decision with the common family-scale row/RMS policy. The following revalidation is the current reference-gate evidence. ### 2026-08-18 Common-policy Revalidation `cmake --build .harness/build --config Debug` passed, followed by `ctest --test-dir .harness/build -C Debug --output-on-failure`: 214/214 tests passed. The S4 reference test generated `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` from the declared read-only input/CSV pair. - exact canonical rows: 294 - blocking translation family: 147 rows, all row/RMS gates passed - warning-only rotation family: 147 rows, all row/RMS gates passed; warnings 0 - identity/schema/nonfinite failures: 0 - overall verdict: `passed=true` | family | rows | scale | near-zero rows | max absolute error | scale-relative RMS | | --- | ---: | ---: | ---: | ---: | ---: | | translation `U1/U2/U3` | 147 | `2.37408203e-5` | 122 | `1.903785349151439e-7` | `1.0332756650397166e-3` | | rotation `UR1/UR2/UR3` | 147 | `7.60725743e-6` | 107 | `6.882854962740428e-8` | `2.9771372973060382e-3` | All values above come from the generated JSON ledger. The historical report body starts below and must not be read as the current identity/tolerance evidence. The prerequisite build/test report has status `pass-for-reference-verification`. This report verifies only the approved full-integration S4 displacement case. It does not compare S4R artifacts, claim Abaqus formulation equivalence, approve physics sanity, or approve release readiness. ### Verdict The reference-comparison gate passes. The fresh FESA result has an exact 294-row identity match to the read-only Abaqus displacement CSV. All 147 blocking `U1/U2/U3` rows satisfy the fixed absolute tolerance `1.0e-5`. All 147 warning-only `UR1/UR2/UR3` rows also satisfy `1.0e-5`, so no rotational warning was emitted. - declared cases compared: `1/1` - blocking rows passed: `147/147` - blocking failures: `0` - warning-only rows compared: `147/147` - warning-only exceedances and warnings: `0/0` - missing / extra / duplicate / nonfinite rows: `0 / 0 / 0 / 0` - largest blocking normalized error: `0.0190378534915144` - comparison verdict: `passed=true` ### Artifact Inventory | item | exact path | status | direct evidence | | --- | --- | --- | --- | | declared S4 input | `reference/shell/shell.inp` | present, unchanged | 4,770 bytes; SHA-256 `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | | required displacement CSV | `reference/shell/shell displacements.csv` | present, unchanged | 5,592 bytes; SHA-256 `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B`; 49 wide rows and six finite components per row | | authoritative solver output | `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | present, valid | 95,024 bytes after a fresh verification run; observed raw SHA-256 `E88E5E5E1F83AB95CAE545AD1F28F896D3FCB82F3EA2B8006A3A703FED07A5CB` (non-decision inventory only) | | deterministic comparison ledger | `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | present, valid | 94,349 bytes; SHA-256 `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6`; `passed=true` | | S4R reference artifacts | `reference/shellR/` | not consumed | Excluded from the approved acceptance comparison. | | reaction and stress CSVs | other files under `reference/shell/` | not consumed | Optional inspection evidence only; not an equality gate. | | FESA-derived CSV | N/A | not generated | HDF5 was compared directly to the Abaqus CSV. | The input and required CSV had identical SHA-256 values and identical UTC modification times (`2026-08-11T11:44:40.9520527Z`) before and after the fresh comparison runs. `git diff --name-only -- reference` and `git status --short -- reference` each returned zero paths. The HDF5 hash above inventories one fresh generation, not a stable content identity. Raw HDF5 bytes changed across regenerations while the projected values and deterministic JSON ledger remained identical; concurrent executions of the same ignored build-local route may replace the file again. This report does not claim byte-identical HDF5 container output. #### Authoritative HDF5 projection audit The comparator and a read-only HDF5 2.1.1 inspection established: - `/metadata`: schema version `0`, feature `linear-static-mitc4-shell`, solver version `0.1.0`, `Step-1`, frame `0`, internal formulation `FESA-MITC4`, and integration rule `2x2x2-gauss; mitc4-edge-midpoint-shear`; - source input identity: `path=C:/Users/baram/orca/workspaces/FESADev/MITC4/reference/shell/shell.inp;content_identity=fnv1a64:cf0795df753d377e`; - `/model/nodes`: 49 compound rows with ordered fields `internal_node_id`, `instance_name`, `source_label`, and `coordinates`; - `/model/elements`: 36 compound rows, source element type `S4`, and internal formulation `FESA-MITC4`; - `/steps/Step-1/frames/0/nodal/displacement`: float64 shape `[49,6]`, global nodal components `[UX,UY,UZ,URX,URY,URZ]`, mapped to `[U1,U2,U3,UR1,UR2,UR3]`; - all projected source identities and displacement values are unique and finite. ### Comparison Contract - case identity: `shell-s4` - authoritative FESA dataset: `/steps/Step-1/frames/0/nodal/displacement` - HDF5 node identity source: `/model/nodes.instance_name` and `/model/nodes.source_label` - normalized key: `(case_id, instance_name, source_node_label, component)` - observed instance: `Part-1-1` - observed source nodes: 49 unique labels - CSV projection: trimmed `Part Instance Name`, `Node Label`, `U-U1`, `U-U2`, `U-U3`, `UR-UR1`, `UR-UR2`, and `UR-UR3` - stable component order: `[U1,U2,U3,UR1,UR2,UR3]` - blocking inventory: `U1/U2/U3` - warning-only inventory: `UR1/UR2/UR3` - row precheck: exact key set, unique rows, finite HDF5/reference values, and exact required HDF5 schema before tolerance evaluation - tolerance source: requirements `FESA-REQ-LSMITC4-058` through `064`, the I/O definition Section 7, and the approved reference-model contract Section 5 - row tolerance: `abs(fesa-reference) <= 1.0e-5` - tolerance-normalized error: `absolute_error / 1.0e-5` - `reference_scale`: diagnostic only; it does not alter the tolerance or verdict - zero policy: no clamp, substitution, omission, averaging, or row-order matching Independent ledger reconstruction found 294 projected CSV keys, 294 comparison keys, zero duplicate keys, and exact set equality. All 294 serialized row tolerances equal `1.0e-5`. The complete per-row decisions remain in the identified deterministic `comparison.json`. ### Execution Evidence The existing FESA S4 reference route was used; Abaqus and other reference solvers were not executed. The first run regenerated the evidence after its test-owned output directory cleanup. Further exact reruns confirmed the ledger bytes and the final verification assertions. | order | exact command | exit code | result | | ---: | --- | ---: | --- | | 1 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | `0` | Reference test executable built; duration `1.830 s`. | | 2 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Fresh S4 E2E tests `2/2` passed; duration `0.760 s`. | | 3 | PowerShell CSV/JSON identity and metric audit | `0` | 294 exact keys; missing/extra/duplicate/nonfinite/nonfixed-tolerance counts all zero. | | 4 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Repeat S4 E2E tests `2/2` passed; duration `0.911 s`; JSON hash unchanged. | | 5 | `h5dump.exe -A -g '/metadata' ` with HDF5 and Intel oneAPI 2026.1 runtime directories prepended to `PATH` | `0` | Required metadata values inspected read-only. | | 6 | `h5dump.exe -H -d '/model/nodes' ` | `0` | Compound schema and shape `[49]` inspected. | | 7 | `h5dump.exe -H -d '/model/elements' ` | `0` | Compound schema and shape `[36]` inspected. | | 8 | `h5dump.exe -H -d '/steps/Step-1/frames/0/nodal/displacement' ` | `0` | Float64 displacement schema and shape `[49,6]` inspected. | | 9 | Final `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` plus report/metric assertion script | `0` | S4 E2E tests `2/2`; `verification=PASS`; final generated artifacts retained. | | 10 | `git diff --check` | `0` | Report patch has no whitespace errors. | | 11 | target-only Git scope and reference no-change audit | `0` | Only this owned report and the pre-existing untracked build/test report are visible; reference scope remains clean. | An initial optional `h5dump` probe without the Intel runtime directory exited `-1073741515` because `libmmd.dll` was not on that process's `PATH`. The same read-only inspection passed after adding the installed oneAPI runtime path. This was an inspection-environment incident, not a solver, schema, comparison, or reference-artifact failure. The repeated JSON ledger was byte-identical: - size: `94,349` bytes - SHA-256 before and after repeat: `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6` - row decisions: `294` - component metrics: `6` - node vector metrics: `49` - warnings: `0` - verdict: `passed=true` ### Quantity Results `max_rel` is calculated only for nonzero Abaqus values and is diagnostic. Tiny reference residues make it ill-conditioned; the acceptance decision uses only the fixed absolute tolerance and its fixed-tolerance-normalized error. | quantity | components | behavior | compared | missing | extra | duplicate | nonfinite | max abs | max rel | max normalized | RMS | L2 norm | worst ID/component by abs error | result | | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | | displacement | `U1/U2/U3` | blocking | 147 | 0 | 0 | 0 | 0 | `1.90378534915144e-7` | `1.0` | `0.0190378534915144` | `2.45308118840709e-8` | `2.97420287738877e-7` | `Part-1-1`, node 2, `U3` | pass | | rotation | `UR1/UR2/UR3` | warning-only | 147 | 0 | 0 | 0 | 0 | `6.88285496274043e-8` | `35.7165926082675` | `0.00688285496274043` | `2.26478498250615e-8` | `2.74590586054375e-7` | `Part-1-1`, node 44, `UR1` | pass, no warning | The translational maximum relative error `1.0` occurs on near-zero reference residue, including node 1 `U3=-1.17769804e-32`. The rotational maximum relative error `35.7165926082675` occurs at node 2 `UR2`, where the reference is `1.3860685e-22` and the absolute error is only `4.95056439416524e-21`. Neither value was clamped or omitted, and neither relative diagnostic controls the verdict. #### Component metrics Each component contains 49 matched rows. `reference_scale` is retained only as diagnostic information. `L2 norm` is the comparator's component `vector_norm_error`, and `worst_row` is the zero-based index in the JSON ledger. | component | behavior | reference scale | tolerance | max abs | max rel | max normalized | RMS | L2 norm | worst row | worst identity | result | | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | | `U1` | blocking | `3.11730945e-23` | `1.0e-5` | `3.11730945e-23` | `1.0` | `3.11730945e-18` | `1.13587076092006e-23` | `7.95109532644045e-23` | 66 | node 12 / `U1` | pass | | `U2` | blocking | `3.11730945e-23` | `1.0e-5` | `3.11730945e-23` | `1.0` | `3.11730945e-18` | `1.13587076092006e-23` | `7.95109532644045e-23` | 61 | node 11 / `U2` | pass | | `U3` | blocking | `2.37408203e-5` | `1.0e-5` | `1.90378534915144e-7` | `1.0` | `0.0190378534915144` | `4.24886125341252e-8` | `2.97420287738877e-7` | 8 | node 2 / `U3` | pass | | `UR1` | warning-only | `7.60725743e-6` | `1.0e-5` | `6.88285496274043e-8` | `11.9344619221920` | `0.00688285496274043` | `2.77378379212910e-8` | `1.94164865449037e-7` | 261 | node 44 / `UR1` | pass, no warning | | `UR2` | warning-only | `7.60725743e-6` | `1.0e-5` | `6.88285496273990e-8` | `35.7165926082675` | `0.00688285496273990` | `2.77378379212909e-8` | `1.94164865449036e-7` | 202 | node 34 / `UR2` | pass, no warning | | `UR3` | warning-only | `5.27113701e-25` | `1.0e-5` | `5.27113701e-25` | `1.0` | `5.27113701e-20` | `2.12986098533393e-25` | `1.49090268973375e-24` | 203 | node 34 / `UR3` | pass, no warning | #### Worst rows and node-vector metrics - global worst and worst blocking row: `shell-s4`, `Part-1-1`, node 2, `U3`; FESA `-2.35504417650849e-5`, Abaqus `-2.37408203e-5`, absolute error `1.90378534915144e-7`, tolerance `1.0e-5`, normalized error `0.0190378534915144`, within tolerance; - worst warning-only row: `shell-s4`, `Part-1-1`, node 44, `UR1`; FESA `1.39850632037260e-6`, Abaqus `1.46733487e-6`, absolute error `6.88285496274043e-8`, normalized error `0.00688285496274043`, within tolerance; - maximum per-node displacement-vector error: `1.90378534915144e-7` at `Part-1-1`, node 2; - maximum per-node rotation-vector error: `7.21144690026432e-8` at `Part-1-1`, node 39. ### Failure Classification - classification: `N/A` - primary_failure: `N/A` - evidence: declared artifacts exist; the authoritative HDF5 projection passed schema and identity checks; 294/294 exact row keys are unique and finite; 147/147 blocking rows pass; zero rotational exceedances or warnings occurred - correction_handoff: `N/A` The optional first `h5dump` runtime-path incident is classified as a resolved inspection-environment incident and does not affect this gate. ### Handoff Recommendation | target_agent | reason | required input | | --- | --- | --- | | Physics Evaluation Agent | All declared blocking reference rows passed the exact approved tolerance, and the warning-only inventory has no exceedance. | This report, `.harness/build/reference/mitc4-shell-s4-comparison/results.h5`, and its deterministic `comparison.json`. | The handoff status is `pass-for-physics-evaluation` only. Physics Evaluation remains responsible for equilibrium, reaction sign, displacement direction, symmetry, physical energy, result signs, and model-coverage adequacy. ### Open Issues - None blocking Physics Evaluation. - Nonblocking audit note: raw HDF5 container hashes differed across fresh regenerations, while the authoritative projected rows and serialized comparison ledger were stable and the JSON was byte-identical. No HDF5 byte-determinism claim is made by this report. ## Linear Static MITC4 Shell Physics Evaluation Report ### Metadata - feature_id: `linear-static-mitc4-shell` - model_id: `shell-s4` - evaluated_head: `820ba30c717b3d0e113775608e20dfd5fbc05d53` - source_build_test_report: `docs/linear-static-mitc4-shell/verification.md` - source_reference_verification_report: `docs/linear-static-mitc4-shell/verification.md` - source_reference_model: `docs/linear-static-mitc4-shell/reference-model.md` - source_requirement: `docs/linear-static-mitc4-shell/requirements.md` - source_formulation: `docs/linear-static-mitc4-shell/formulation.md` - source_numerical_review: `docs/linear-static-mitc4-shell/numerical-review.md` - source_io_definition: `docs/linear-static-mitc4-shell/io.md` - status: `pass-for-release-agent` - date: `2026-08-13` This verdict means that the documented physical checks pass and the Release Agent may audit release readiness. It does not approve release readiness, re-approve the reference comparison, or change its tolerance decision. ### Input Evidence The prerequisite reference-verification report has status `pass-for-physics-evaluation`. The existing S4 reference-test route was rebuilt and executed to regenerate fresh FESA evidence. Abaqus and other reference solvers were not executed. | evidence | exact path or identity | status | notes | | --- | --- | --- | --- | | build/test report | `docs/linear-static-mitc4-shell/verification.md` | `pass-for-reference-verification` | Clean MSVC x64 Debug build, focused `87/87`, lifecycle `10/10`, reference `8/8`, and full `144/144` CTest passed. | | reference verification | `docs/linear-static-mitc4-shell/verification.md` | `pass-for-physics-evaluation` | Required prerequisite satisfied; 147/147 blocking U rows passed and no UR warning was emitted. | | solver HDF5 | `.harness/build/reference/mitc4-shell-s4-comparison/results.h5` | present and readable | Freshly generated, 95,024 bytes; observed raw SHA-256 `E102D80E82BA133EBDF1C5532F3A0A4FE9984AB6CC36D00264399F7308D9230F` (inventory only). | | comparison ledger | `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json` | present and passing | 94,349 bytes; SHA-256 `8E8DEA51B6F7C663BACC41FDA6103A4596DB26E02F1EAD6069D458F51E0102E6`; `passed=true`. | | declared S4 input | `reference/shell/shell.inp` | present, unchanged, read-only | SHA-256 `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF`. | | declared displacement CSV | `reference/shell/shell displacements.csv` | present, unchanged, read-only | SHA-256 `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B`. | | optional Abaqus reaction/stress CSVs | `reference/shell/shell reactions.csv`, `reference/shell/shell stresses.csv` | not used as equality gates | Their presence did not expand the approved U-only blocking boundary. | | solver CSV views | N/A | not generated | HDF5 was inspected directly. | | fresh S4 route | `.harness/build`, MSVC x64 Debug | pass | `Mitc4S4Reference.*` passed `2/2`. | The HDF5 contains 49 nodes, 36 source-`S4` elements, internal formulation `FESA-MITC4`, and the required full `2 x 2 x 2` result inventory. All inspected numeric model and result values were finite. The diagnostics dataset contains four approved warning rows for ignored `PREPRINT`, `RESTART`, and `OUTPUT` keywords and no error diagnostic. Raw HDF5 bytes are not a physics decision identity and may change across valid regenerations. The projected values and deterministic comparison ledger are the relevant evidence. #### Documented model expectation The reference input is a flat `10 x 10`, thickness `0.5`, homogeneous isotropic square plate with `E=2.1e11` and `nu=0.3`. Its 24 perimeter nodes are fully clamped in all six global DOFs, and center node 2 at the global origin carries one `F3=-100000` concentrated force. The geometry, boundary, material, and load are symmetric about both global `x=0` and `y=0` planes. The documented physical expectations are therefore: - total constrained reaction force opposes the applied `-Z` force; - total force and moment about the global origin balance within the approved normalized `1e-10` limit; - perimeter displacements are zero and the interior deflects in `-Z`, with the largest magnitude at the center; - the displacement and rotation field obeys the polar/axial-vector reflection parity about both symmetry planes; - a linear, flat transverse plate response has no membrane strain/resultant or middle-surface in-plane stress, while bottom and top in-plane stresses reverse; - stored physical strain energy is finite, strictly positive, and consistent with the recovered generalized fields and `0.5 F^T d`; - free residual, finite results, rank/rigid-mode evidence, and the approved one-case coverage show no rigid-body or unsupported-mode symptom. ### Physics Checks | check | documented expectation | observed evidence | verdict | classification | | --- | --- | --- | --- | --- | | global equilibrium | Applied plus constrained reaction force/moment about origin; normalized metrics `<=1e-10` | force residual `[0,0,-1.12049747258425e-9]`; moment residual `[6.45741238258779e-10,-2.63753463514149e-10,0]`; normalized force/moment `1.12049747258425e-14` / `2.35981341581908e-15` | pass | N/A | | reaction consistency | Perimeter-only reactions from full residual oppose `F3=-100000`; constrained motion is zero | summed constrained force `[0,0,99999.9999999989]`; constrained displacement exactly zero | pass | N/A | | displacement direction | Interior bends in `-Z`; center is maximum; no in-plane or drilling leakage | center `U3=-2.35504417650849e-5`; all 25 free-node U3 values nonpositive; `U1/U2/UR3` exactly zero | pass | N/A | | symmetry | Correct polar/axial reflection parity about `x=0` and `y=0` | max absolute reflection mismatch `4.27126230127111e-20` / `2.29087480670778e-20` | pass | N/A | | element force balance | No documented direct element-end-action output exists for shell GP resultants | Global assembled residual/equilibrium passed; direct element-end-action balance is skipped rather than inferred from mismatched locations | skipped | N/A | | recovered resultant consistency | `N=A*epsilon0`, `M=D*kappa`, `Q=As*gamma0` at each of 144 GP rows | absolute L2 residual `9.9301874551584e-12`; normalized L2 `5.56240926027087e-17` | pass | N/A | | stress/location/sign sanity | Local `[S11,S22,S12]` at bottom/middle/top; middle zero and faces reverse for this linear flat bending field | absolute L2 constitutive residual `1.29488994752188e-9`; normalized `3.05323934859307e-16`; middle stress exactly zero; face reversal exact | pass | N/A | | rigid body/nonfinite | Complete constraints, finite solution, acceptable residual, no abnormal uncontrolled mode | zero nonfinite values; `FREE_RESIDUAL_NORMALIZED=1.07747756058988e-14`; rank/rigid-mode tests passed upstream | pass | N/A | | physical energy | Positive and consistent physical-only energy; no drilling-energy gate | `1.17752208825422`; independently recovered value identical to relative `1.88569375589575e-16`; `0.5F^Td=1.17752208825424` | pass | N/A | | model coverage | Approved sole S4 case plus declared invariant/patch/common-path portfolio | S4 case covers end-to-end symmetric plate response; focused build/test portfolio passed; expanded models are explicitly nonblocking | pass | N/A | #### 1. Global force and moment equilibrium The reaction dataset is the assembled full residual `K*d-F`. Applying the constraint mask gives ```text sum constrained RF = [0, 0, 99999.9999999989] sum applied F = [0, 0, -100000] force residual = [0, 0, -1.12049747258425e-9] ``` The load acts at the global origin and therefore contributes no origin moment. The constrained force and moment rows give ```text moment residual = [ 6.45741238258779e-10, -2.63753463514149e-10, 0 ] ``` These independently reconstructed values match the stored HDF5 equilibrium vector exactly. The serialized normalized metrics are: | metric | value | threshold | result | | --- | ---: | ---: | --- | | `FREE_RESIDUAL_NORMALIZED` | `1.07747756058988e-14` | `1.0e-10` | pass | | `FORCE_BALANCE_NORMALIZED` | `1.12049747258425e-14` | `1.0e-10` | pass | | `MOMENT_BALANCE_NORMALIZED` | `2.35981341581908e-15` | `1.0e-10` | pass | #### 2. Reaction consistency and constrained/free meaning The 24 perimeter nodes provide 144 constrained DOFs; the remaining 150 DOFs are free. The HDF5 constraint mask agrees with the input set exactly, all prescribed values are zero, and the maximum constrained displacement is exactly zero. The total positive `RF3=99999.9999999989` opposes the center `F3=-100000`. The nearly zero total `RF1/RF2` and origin `RM1/RM2/RM3` are required by the centered load and double symmetry. The largest raw free residual component is `7.62156560085714e-10`; because translational and rotational entries have different dimensions, the decision uses the documented normalized metric rather than this raw maximum. The normalized free residual passes by more than three orders of magnitude. #### 3. Displacement direction and deformation mode Center node 2 has ```text [U1,U2,U3,UR1,UR2,UR3] = [0, 0, -2.35504417650849e-5, 0, 0, 0] ``` Every free-node `U3` is nonpositive, the center is the maximum-magnitude translation, and every clamped boundary displacement is zero. Across the complete model, maximum absolute `U1`, `U2`, and `UR3` are exactly zero. Maximum absolute `UR1` and `UR2` are `7.55060026636931e-6` and `7.55060026636933e-6`, respectively. This is the expected symmetric plate-bending mode under a negative transverse center load, with no in-plane or drilling deformation leakage. #### 4. Reflection symmetry and expected zeros For reflection through `x=0`, polar displacement components transform as `[-U1,+U2,+U3]`, while the axial rotation vector transforms as `[+UR1,-UR2,-UR3]`. Reflection through `y=0` similarly uses `[+U1,-U2,+U3,-UR1,+UR2,-UR3]`. All 294 scalar nodal component comparisons per reflection were paired by source coordinates. The maximum absolute mismatch was `4.27126230127111e-20` for the `x` reflection and `2.29087480670778e-20` for the `y` reflection. The equality evidence is numerical roundoff, not a new acceptance tolerance. #### 5. Shell generalized resultants and physical work signs At every one of 36 elements times four midsurface Gauss locations, an independent constitutive reconstruction applied the documented centered-section identities: ```text N = A * epsilon0 M = D * kappa Q = As * gamma0 ``` The complete 1,152-component resultant comparison has absolute L2 residual `9.9301874551584e-12` and normalized L2 residual `5.56240926027087e-17`. All membrane strains and `N` resultants are exactly zero, as required for this linear flat plate bending response. The generalized work density `generalized_strain dot section_resultant` is strictly positive at all 144 locations: minimum `4.46321446508071e-4`, maximum `1.27059464107458e-1`, negative count `0`. This supports the physical sign and component-order interpretation. The shell contract does not expose element-end nodal actions and explicitly forbids averaging mismatched result locations. Consequently a separate GP-to-element-end force-balance assertion is not documented and is marked `skipped`; the assembled global residual and equilibrium checks provide the required force-balance evidence. #### 6. Stress component, location, and sign sanity HDF5 stores local in-plane `[S11,S22,S12]` directly at each GP and ordered section positions `BOTTOM(-1), MIDDLE(0), TOP(+1)`. Independent reconstruction used `Cps*(epsilon0+z*kappa)` at all 432 section locations. The absolute L2 residual is `1.29488994752188e-9`, or normalized `3.05323934859307e-16`, against a maximum absolute stored stress of `313250.779137971`. All middle-surface in-plane stresses are exactly zero. For every component and GP, bottom and top stresses are equal in magnitude and opposite in sign. This is the documented curvature/stress-location convention for a centered homogeneous section. No `S33`, `S13`, `S23`, nodal stress, or Abaqus stress equality was inferred. #### 7. Physical energy, residual, and rigid-body symptoms The stored `PHYSICAL_STRAIN_ENERGY` is finite and positive: ```text HDF5 physical energy = 1.17752208825422 independent GP generalized energy = 1.17752208825422 0.5 * F^T * d = 1.17752208825424 ``` The HDF5-versus-recovered normalized difference is `1.88569375589575e-16`; the final fresh HDF5-versus-external-work normalized difference is `9.14561471609432e-15`. The HDF5 value excludes numerical drilling stabilization, as required. No drilling-energy ratio, calibration, or warning criterion was introduced. The solution is finite, the full perimeter support is enforced, the expected deformation mode is smooth and symmetric, all three normalized verification metrics pass `1e-10`, and the build/test evidence passes six-rigid-mode, stabilized-rank, non-rigid positive-energy, and pure-drill separation tests. No rigid-body, singular, nonfinite, or abnormal-mode symptom is present. #### 8. Approved model coverage The sole approved reference model provides end-to-end evidence for the full-integration `S4 -> FESA-MITC4` path, a nonzero transverse bending response, fully constrained reaction recovery, global force/moment balance, two-axis symmetry, physical energy, and shell result recovery. The prerequisite focused `87/87` build/test portfolio supplies the documented complementary element evidence: membrane, bending, transverse-shear and twist patch fields; six physical rigid modes; expected physical/stabilized rank; frame and energy invariance; fixed numerical drilling and physical-recovery separation; and S4/S4R common-kernel/source-metadata behavior. The reference verification supplies the approved external displacement comparison. This is the complete approved coverage for the feature. Pinched-cylinder, hemisphere, Scordelis-Lo, locking/convergence sequences, drilling calibration, expanded distorted/curved portfolios, and `NR-O01` through `NR-O04` are explicitly nonblocking or out of scope and were not invented as new physics gates. ### Execution Evidence | order | exact command or read-only operation | exit code | result | | ---: | --- | ---: | --- | | 1 | `cmake --build .harness/build --config Debug --target fesa_reference_tests` | `0` | Existing S4 reference route rebuilt. | | 2 | `ctest --test-dir .harness/build -C Debug -R '^Mitc4S4Reference\.' --output-on-failure` | `0` | Fresh S4 tests `2/2` passed; FESA HDF5 and ledger regenerated. | | 3 | `h5dump.exe -n .harness/build/reference/mitc4-shell-s4-comparison/results.h5` with HDF5/oneAPI runtime on `PATH` | `0` | Required HDF5 inventory inspected read-only. | | 4 | `h5dump.exe -y -w 0 -m '%.17g' -d .harness/build/reference/mitc4-shell-s4-comparison/results.h5` for model nodes/elements/mask/prescribed values, nodal U/R, shell frames/strain/resultant/stress, energy/equilibrium/metrics/diagnostics | `0` | High-precision read-only numerical audit supplied all reported values. | | 5 | PowerShell independent input/mask, reaction/equilibrium, reflection, constitutive recovery, stress-location, energy, finite, and diagnostics audit over the `h5dump` values | `0` | All documented physics assertions passed. | | 6 | `cmake --build .harness/build --config Debug --target fesa_unit_tests fesa_reference_tests`, then `ctest --test-dir .harness/build -C Debug -R 'Mitc4Shell(Kernel|Patch|Drilling|PhysicalRecovery)|ResultRecovery\..*Shell|Mitc4S4Reference' --output-on-failure` | `0` | Final focused verification passed `17/17`; the regenerated ledger retained `passed=true`, 294 rows, and zero warnings. | Three intermediate audit-helper incidents were diagnostic-only and did not alter the product or verdict: a compound-record regular expression initially omitted the last node, a PowerShell array-expression initially bound subtraction to an array, and a final optional `h5ls` operand-order probe exited `1`. The root causes were confirmed as audit-command/parser usage, while successful high-precision HDF5 inspection established 49/49 nodes and the complete evidence above. They are not solver, HDF5-schema, reference, or physics failures. ### Failure Classification - classification: `N/A` - primary_failure: `N/A` - evidence: all documented force/moment equilibrium, reaction, displacement, symmetry, recovery, stress-location, physical-energy, residual, finite-result, rigid-mode and approved coverage checks passed - correction_handoff: `N/A` - non_gating_incident: resolved read-only audit helper parsing/usage errors only ### Evaluation Verdict - verdict: `pass-for-release-agent` - reason: the prerequisite reference status is valid and fresh FESA S4 evidence satisfies every documented physical expectation under its approved threshold; no implementation, formulation, I/O, model-coverage, nonfinite, rigid-body, or environment failure remains - release_approval: `not granted by this report` - reference_reapproval: `not performed by this report` ### Handoff Recommendation | target_agent | reason | required_input | | --- | --- | --- | | Release Agent | All documented MITC4 physics checks passed. | This report, the build/test and reference-verification reports, the fresh build-local HDF5/comparison evidence, and the nonblocking limitations below. | ### Open Issues - Nonblocking coverage limitation: the approved external reference inventory is one flat, symmetric, fully clamped S4 plate. The approved analytical/unit portfolio supplies membrane, shear, twist, rigid-mode, rank, drilling-separation and S4R common-path evidence. No broader Abaqus or benchmark portfolio is claimed. - Known original-MITC4 limitations remain: transverse-shear locking is mitigated by the tying field, but distorted-curved membrane locking and broader thin/thick mesh convergence are not characterized by this release gate. - Source `S4R` maps to the same full-integration FESA kernel and is not compared to the optional Abaqus S4R artifacts. This is an approved boundary, not missing physics evidence. - The fixed numerical drilling stiffness is not a physical stress/resultant/energy channel. No drilling calibration, coefficient sweep, energy-ratio gate, or director-parallel moment support is claimed. - Geometrically nonlinear execution remains outside the current feature even though future-only residual/tangent equations are documented. No nonlinear release claim is made. - No open issue blocks Release Agent review.