modify docu and reference

This commit is contained in:
KOKO\Mimi
2026-08-28 00:32:30 +09:00
parent 41816c8aef
commit ca06b4b551
37 changed files with 30338 additions and 590 deletions
@@ -3,16 +3,16 @@
## 1. Metadata and Feature Scope
- feature_id: `nonlinear-static-newton-raphson`
- workflow_state: `needs-formulation`
- workflow_state: `needs-implementation`
- owner_agent: `coordinator-agent`
- request_date: `2026-08-18`
- last_updated: `2026-08-23` (Stage 2 사용자 명시 승인; Stage 3 Formulation Agent dispatch 준비)
- last_updated: `2026-08-24` (Harness attempt 1 timed out before Step 0 evidence; Step 0 retry dispatch package ready)
- process_classification: `architectural`
- requested_capability: Newton–Raphson 방법을 사용하는 새 nonlinear static analysis procedure
- proposed_scope_boundary: 첫 release는 initial configuration 기준 Total Lagrangian, materially linear + geometrically nonlinear MITC4로 제한한다. 요구조건 인터뷰와 8단계 evidence gate를 먼저 완료하며, 승인 전에는 상세 수치·I/O·구현 범위를 확정하거나 기존 linear-static lifecycle을 변경하지 않는다.
- naming_note: 사용자 표현 `Newton-Rhapson`은 표준 명칭 `Newton–Raphson`으로 정규화했다.
- current_goal: 승인된 `requirements.md`와 사용자 승인된 `research.md`를 입력으로 Stage 3의 구현 가능한 `formulation.md` 계약을 Formulation Agent에게서 확보하고 독립 evidence audit을 수행한다.
- constraints: 승인된 physics/scope/tolerance/authoritative output/public compatibility를 보존한다. Stage 3는 O-ROT/O-MAP/O-DRILL/O-MOM/O-BC를 구현 가능한 수학 계약으로 해소하되 HDF5/I/O schema, reference artifact, C++/tests/CMake, phase/Harness 또는 Stage 4 판단으로 확장하지 않는다. Abaqus/Midas 내부 동등성을 주장하지 않는다.
- current_goal: Retry the user-authorized no-push Harness execution of materialized phase `nonlinear-static-newton-raphson`; Step 0 `cli-output-lease-and-derived-names` remains the only current Step after attempt 1 failed before Step evidence.
- constraints: 승인된 Stage 1-5 hashes, physics/scope/tolerance/authoritative output/public compatibility, `rho_M <= 1e-12`, fixed-global source identity, no drilling load channel과 Stage 6 materialization evidence를 보존한다. Retry `python scripts/execute.py nonlinear-static-newton-raphson` without `--push`; do not run `--push`, force-push, or use `danger-full-access`. Attempt 1 failure is classified as `harness-uncaught-step-codex-timeout-no-retry` attempt 1; if the same classification reaches attempt 2, stop automatic rework and route to `needs-user-decision` or `blocked`. `scripts/execute.py` owns branch, pending-Step selection, retry, timestamps, commits, advancement and top-level phase status. Each Implementation Agent session owns only the Executor-selected current `stepN.md` and must perform `RED -> observed failure -> minimal GREEN -> VERIFY`, updating only that Step status plus summary/error/blocked payload. Do not advance Physics/Release until `implementation-report.md`, `build-test.md`, `reference-comparison.md` and passing implementation evidence exist. Stress CSVs are optional inspection/order evidence only with no comparison projection; `RM3` is excluded; shellNL `U` is blocking, `UR` warning-only, constrained `RF` families and physical spatial `RM1/RM2` are blocking; exact source-ID prechecks and `docs/TOLERANCE.md` are preserved. Reference input/CSV 생성·수정·rename·정규화와 Abaqus/Nastran/reference solver 실행을 금지한다.
- repository_audit: 기존 worktree에는 `.codex/agents/*.toml`과 `AGENTS.md`의 사용자 변경이 있으며 이를 보존한다.
## 2. Eight-Stage Worklist
@@ -21,10 +21,10 @@
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1. Requirements | `requirement-agent` | `passed` | `docs/nonlinear-static-newton-raphson/requirements.md` | `<=400` lines, 24 canonical shall requirements, exact 24-row Matrix, approved semantic loss 0, Stage-1 user question 0 | Approved compact content 395 lines; approval metadata 2 lines, current 397; 24↔24 exact ID sets, duplicate/missing/orphan 0, OQ/questions/trivia/placeholders 0; core semantics and NSNR-083 public precedence retained; forbidden changes 0; user explicitly approved on 2026-08-23. | 없음 | 40 |
| 2. Research | `research-agent` | `passed` | `docs/nonlinear-static-newton-raphson/research.md` | 필요한 이론·benchmark·source reliability·applicability limit가 충분함 | Owner/Coordinator pass와 2026-08-23 사용자 명시 승인; 10 required sections, S1–S17, 12 benchmark candidates, 11 research-relevant requirement IDs, 14 unique open issues; nonlinear stored reference gap explicit; SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; forbidden changes 0. | 없음 | 1 |
| 3. Formulation | `formulation-agent` | `in-progress` | `docs/nonlinear-static-newton-raphson/formulation.md` | strong/weak form, kinematics, tangent/residual, integration, state/recovery가 구현 가능한 계약이며 O-ROT/O-MAP/O-DRILL/O-MOM/O-BC가 승인 scope 안에서 해소됨 | Stage 3 bounded dispatch 준비; approved requirements SHA-256 `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`, approved research SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`. | Formulation Agent 반환 evidence 대기 | 1 |
| 4. Numerical/reference review | `numerical-review-agent` | `pending` | `docs/nonlinear-static-newton-raphson/numerical-review.md`; `docs/nonlinear-static-newton-raphson/reference-model.md` | 두 문서가 함께 `pass-for-io-definition`이며 수치 안정성과 exact reference contract가 준비됨 | 없음 | Stage 3 사용자 승인 필요 | 0 |
| 5. I/O definition | `io-definition-agent` | `pending` | `docs/nonlinear-static-newton-raphson/io.md` | Abaqus subset, semantic mapping, HDF5 schema, diagnostics, CSV projection이 승인됨 | 없음 | Stage 4 사용자 승인 필요 | 0 |
| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `pending` | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `docs/nonlinear-static-newton-raphson/implementation-report.md`; `docs/nonlinear-static-newton-raphson/build-test.md`; `docs/nonlinear-static-newton-raphson/reference-comparison.md` | 상세 인터뷰와 계획 승인 후 TDD, MSVC/x64/Debug CMake/CTest, blocking reference comparison이 통과함 | 없음 | Stage 5 사용자 승인과 implementation-planning interview 필요 | 0 |
| 3. Formulation | `formulation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/formulation.md` | strong/weak form, kinematics, tangent/residual, integration, state/recovery가 구현 가능한 계약이며 O-ROT/O-MAP/O-DRILL/O-MOM/O-BC가 승인 scope 안에서 해소됨 | Rework attempt 2 owner/Coordinator pass와 사용자 명시 승인: reaction force/generalized moment/spatial moment symbols와 dimensions가 rotation matrix `R_I`와 분리됨; immutable fixed-global source, `rho_M <= 1e-12` admissibility, exact projected physical-work covector, `DP`/`DJ_l`/map-Hessian residual-tangent identity가 §§4.4/5/11.2–11.3/13.1/13.4/17에서 일치함; 18 sections와 7 closures 보존; SHA-256 `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`. | 없음 | 2 |
| 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/nonlinear-static-newton-raphson/numerical-review.md`; `docs/nonlinear-static-newton-raphson/reference-model.md` | 두 문서가 함께 `pass-for-io-definition`이며 수치 안정성과 exact reference contract가 준비됨 | Corrected owner return, Coordinator audit pass and user explicit approval: status `pass-for-io-definition`; approved formulation hash matched; shellNL/shell artifacts inspected read-only with row counts `49/49/288`, duplicate required wide keys 0 and nonfinite required values 0; stress CSVs are optional read-only inspection/order evidence only; `RM3` excluded; required external comparison uses displacement, reaction force and physical spatial `RM1/RM2`; exact prechecks and `docs/TOLERANCE.md` policy retained. Current hashes: numerical-review `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`, reference-model `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`. | 없음 | 2 |
| 5. I/O definition | `io-definition-agent` | `passed` | `docs/nonlinear-static-newton-raphson/io.md` | Abaqus subset, semantic mapping, HDF5 schema, diagnostics, CSV projection이 승인됨 | Bounded rework owner status `ready-for-coordinator-review`, SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`; Coordinator audit passed and user explicitly approved the same hash. REWORK-002 defects are corrected: every argv token containing literal `--output` fails pre-input/pre-log/pre-output with one `cli-usage` diagnostic; `nsnr-log-v1` uses UTF-8 no BOM/LF/TAB fixed fields with four-channel gates, typed thresholds, branch identity, early-failure `not-evaluated(reason)`, round-trip numerics and escaping; log open/write/flush/close is fail-closed with zero-byte non-Newton success logs; exact `VARIABLE=PRESELECT` output requests are ignored-with-warning; lexical path/stem derivation, single-writer/candidate collision rules, HDF5 schema v1, reference projection, stress/RM3 exclusions and `docs/TOLERANCE.md` policy are preserved. | 없음 | 2 |
| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `in-progress` | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `docs/nonlinear-static-newton-raphson/implementation-report.md`; `docs/nonlinear-static-newton-raphson/build-test.md`; `docs/nonlinear-static-newton-raphson/reference-comparison.md` | 상세 인터뷰와 계획 승인 후 TDD, MSVC/x64/Debug CMake/CTest, blocking reference comparison이 통과함 | User explicitly requested `Harness/Implementation` execution on `2026-08-24`. Attempt 1 of no-push `python scripts/execute.py nonlinear-static-newton-raphson` failed before Step 0 edits/evidence: `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`, `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`, no `step0-output.json` was produced and Executor did not enter `MAX_RETRIES`. Root evidence also reports workspace-write smoke pass `HARNESS_SMOKE_OK` in `20.4s`, MSVC baseline build pass and CTest `214/214`; the Python baseline `xhigh` vs `extra high` failure is pre-existing/unrelated. This is normalized as `harness-uncaught-step-codex-timeout-no-retry` attempt 1 and routes back to Implementation/Harness retry, not Correction Agent. | 없음; same-class attempt 1 is below stop limit | 4 |
| 7. Physics evaluation | `physics-evaluation-agent` | `pending` | `docs/nonlinear-static-newton-raphson/physics-evaluation.md` | equilibrium, reaction, direction, path/history, energy, symmetry, model coverage가 `pass-for-release-agent`임 | 없음 | Stage 6 passing evidence 필요 | 0 |
| 8. Release readiness | `release-agent` | `pending` | `docs/nonlinear-static-newton-raphson/release.md` | `ready-for-release` recommendation과 acceptance traceability가 완전함 | 없음 | Stage 7 passing evidence 필요 | 0 |
@@ -33,33 +33,47 @@
### Active Dispatch Package
- feature_id: `nonlinear-static-newton-raphson`
- current_dispatch: `stage-3-formulation-attempt-1`
- target_sub_agent: `formulation-agent`
- current_dispatch: `stage-6-harness-implementation-execution-step0-retry-1`
- target_sub_agent: `implementation-agent` via `scripts/execute.py nonlinear-static-newton-raphson`
- required_inputs:
- `docs/nonlinear-static-newton-raphson/requirements.md` (`approved`; user approval date `2026-08-23`; SHA-256 `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`).
- `docs/nonlinear-static-newton-raphson/research.md` (`passed`; user explicitly approved Stage 2 on `2026-08-23`; SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`).
- `AGENTS.md`, `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md`, `docs/TOLERANCE.md`, `docs/SOLVER_AGENT_DESIGN.md`.
- `docs/linear-static-mitc4-shell/formulation.md`의 approved linear 계약과 §15 gap inventory. §15는 nonlinear 해답으로 복사하지 않는다.
- expected_outputs: `docs/nonlinear-static-newton-raphson/formulation.md`
- acceptance_gate: Formulation Agent가 `fesa-formulation-spec`을 사용하여 strong/weak form, fixed-initial-reference TL kinematics, finite committed/trial triad와 objective update, exact `24 global -> 20 physical + 4 drill` residual/tangent 및 map Hessian, objective numerical drilling potential/Hessian, fixed-global dead force/moment work, prescribed finite-rotation BC path, integration, state/commit/rollback, recovery와 verification identities를 구현 가능하게 정의한다. O-ROT/O-MAP/O-DRILL/O-MOM/O-BC는 unresolved placeholder 없이 승인 범위 안에서 해소되고, requirement traceability와 explicit assumptions/limits가 있다.
- stop_condition: `formulation.md`와 output paths/status/evidence summary/blockers만 Coordinator에 반환한다. Peer/Stage 4를 dispatch하거나 C++/tests/CMake/I/O schema/reference artifact/tolerance/phases/Harness를 생성·변경·실행하지 않는다. 승인된 scope/physics/tolerance/authoritative output/public compatibility를 변경할 필요가 있으면 문서에 임의 반영하지 말고 blocker로 반환한다.
- missing_evidence: Formulation Agent 소유 `formulation.md`, self-audit, O-ROT/O-MAP/O-DRILL/O-MOM/O-BC closure map과 acceptance-gate evidence.
- User explicit execution request on `2026-08-24`: `Harness/Implementation를 실행해주세요.`
- Attempt 1 failure evidence: no-push Harness command `python scripts/execute.py nonlinear-static-newton-raphson`; `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`; `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`; no Step 0 source/test edits, no `step0-output.json`, no `MAX_RETRIES` handling.
- Root execution context evidence: workspace-write Codex smoke passed with `HARNESS_SMOKE_OK` in `20.4s`; MSVC baseline build passed; baseline CTest passed `214/214`; Python baseline has pre-existing unrelated HEAD `41816c8` contract failure `xhigh` actual vs `extra high` expected.
- `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, `.agents/skills/harness/SKILL.md`, `.codex/hooks.json`
- `docs/nonlinear-static-newton-raphson/implementation-plan.md` SHA-256 `BF4FC7A5CFDEEC19D62A36E1DF7CC34C0B9F614FA0A0FD8D0A321ADC73E69580`
- `phases/index.json` SHA-256 `F8BE89D579C303410BD1D2CD17AF33FCAD72BF68D9E10C3F644A39D1AA7331FB`
- `phases/nonlinear-static-newton-raphson/index.json` SHA-256 `439B67E1DED442D828EB5C31DAB35D28F32DBA6F66537512CAFFB5616956C137`
- Executor-selected initial current Step: `phases/nonlinear-static-newton-raphson/step0.md`, Step 0 `cli-output-lease-and-derived-names`, status `pending`
- Approved Stage 1-5 hashes: requirements `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`; research `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; formulation `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`; numerical-review `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`; reference-model `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`; io `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`.
- Preserved materialization evidence: exactly one pending phase entry, 13/13 pending steps, no executor metadata, no evidence docs yet.
- expected_outputs:
- Retry Harness execution command: `python scripts/execute.py nonlinear-static-newton-raphson`
- No `--push`.
- Executor-managed phase/step status, timestamps, commits and advancement.
- Implementation Agent per selected Step: RED evidence, observed failure, minimal GREEN changes, focused/full VERIFY and Step status payload.
- If all Steps complete, Stage 6 evidence docs: `docs/nonlinear-static-newton-raphson/implementation-report.md`, `docs/nonlinear-static-newton-raphson/build-test.md`, `docs/nonlinear-static-newton-raphson/reference-comparison.md`.
- acceptance_gate: Stage 6 can pass only after the materialized phase completes and Coordinator audits implementation-report, build-test, reference-comparison, full MSVC x64 Debug build/CTest, blocking reference comparison and no forbidden reference/upstream/tolerance mutation. Attempt 1 is a clear first `harness` failure, so the next bounded dispatch remains Implementation/Harness retry.
- stop_condition: Run only the no-push Harness executor for this phase. Do not dispatch Correction Agent for this first clear harness failure. If `harness-uncaught-step-codex-timeout-no-retry` recurs and reaches attempt 2, stop automatic rework and set workflow to `needs-user-decision` or `blocked`. Do not dispatch Physics Evaluation or Release. Do not run Abaqus/Nastran/reference solvers or generate/modify reference CSVs. Do not manually bypass Executor ownership of branch, pending selection, retry, timestamps, commits or advancement.
- missing_evidence: Successful Step 0 Harness/Implementation return with RED/observed failure/minimal GREEN/VERIFY evidence and Executor-managed Step status, or a new classified failure return from `scripts/execute.py nonlinear-static-newton-raphson`.
### Latest Sub-Agent Return
- target_sub_agent: `research-agent`
- output_paths: `docs/nonlinear-static-newton-raphson/research.md`
- status: `passed` (owner); `needs-rework` (user review gate)
- target_sub_agent: `implementation-agent` via Harness Executor
- output_paths:
- 없음: attempt 1 failed before Step evidence; `step0-output.json`, `implementation-report.md`, `build-test.md`, and `reference-comparison.md` were not produced.
- status: `failed-before-step-evidence` (Harness uncaught timeout); Coordinator classification `needs-implementation-retry`
- evidence_summary:
- 17 external sources cover original MITC4/TL theory, finite rotation, objective/consistent linearization, Full Newton, V&V/MMS and nonlinear shell benchmarks.
- B-01–B-06 invariant/software checks, B-07F/B-07M large-rotation cantilevers, public NAFEMS 3DNLG-1/9 candidates, locking characterization and shell-MMS gap are separated by applicability.
- `reference/shell/` and `reference/shellR/` are explicitly retained as `nlgeom=NO` linear evidence; exact stored nonlinear input/CSV remains an honest Numerical Review gap.
- Objective 24-DOF mapping/drilling, nodal-moment work, prescribed finite-rotation path, invariant tolerances and fixed-step benchmark traversability are routed downstream without inventing contracts.
- Root reported no-push execution attempt 1 on an isolated branch/worktree: `python scripts/execute.py nonlinear-static-newton-raphson`.
- During Step 0 dispatch, `codex exec --json --sandbox workspace-write ...` remained active without source/test edits and timed out at `1800.7s`.
- `scripts/execute.py::_invoke_codex` raised uncaught `subprocess.TimeoutExpired`, so Executor did not produce `step0-output.json`, did not enter `MAX_RETRIES`, and Step 0 remains pending with no implementation evidence.
- Workspace-write smoke passed with `HARNESS_SMOKE_OK` in `20.4s`; root therefore classified sandbox helper/auth as functional and `danger-full-access` as unjustified.
- MSVC baseline build passed and CTest passed `214/214`; Python baseline has a pre-existing unrelated contract failure in HEAD `41816c8` (`xhigh` actual vs `extra high` expected).
- Coordinator records normalized failure classification `harness-uncaught-step-codex-timeout-no-retry`: attempt 1. Because this is the first clear harness failure, the next bounded dispatch remains `implementation-agent` via no-push Harness retry; `correction-agent` is not selected.
- blockers:
- User Stage-2 review/approval only.
- self_audit_findings: Coordinator independently confirmed 10 required sections, exact S1–S17 inventory, 12 benchmark sections with artifact/gap/target/cannot-verify/limits/review questions, 11 research-relevant requirement IDs, 14 unique open issues, all local evidence paths present and nonlinear reference artifact hits 0. SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`.
- return_contract_check: output path, owner status, source/benchmark coverage, downstream gaps, blockers and ownership confirmation present.
- acceptance_evidence_check: all owner and Coordinator Research evidence gates pass; Stage 2 remains `needs-rework` solely for explicit user approval.
- 없음.
- self_audit_findings: Coordinator recorded root execution evidence only, verified the local phase index still lists Step 0 as `pending`, did not run Harness/build/tests, and changed only `coordination.md`.
- return_contract_check: status, evidence summary, blockers, failed-output absence and retry dispatch decision are present.
- acceptance_evidence_check: Stage 6 remains `in-progress`; no Stage 6 pass evidence exists.
### Compact Migration Evidence
@@ -145,15 +159,38 @@
| 2026-08-23 | Research Agent return and Coordinator audit | `needs-rework` | `research.md` owner pass; Coordinator verified 10 sections, S1–S17, 12 complete benchmark candidates, 11 requirement IDs, 14 unique open issues, local evidence existence, nonlinear stored reference hits 0 and forbidden changes 0 | `needs-user-decision` | Present Stage-2 artifact for explicit user approval |
| 2026-08-23 | Research explicit user approval | `passed` | User explicitly approved `research.md`; Research Agent and Coordinator evidence already passed; approved artifact SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` | `needs-formulation` | Dispatch Formulation Agent for bounded Stage 3 evidence |
| 2026-08-23 | Formulation dispatch attempt 1 | `in-progress` | Approved Stage-1/2 baselines and project contracts audited; bounded package requires O-ROT/O-MAP/O-DRILL/O-MOM/O-BC closure without downstream contract changes | `needs-formulation` | Await Formulation Agent return and independently audit Stage-3 evidence |
| 2026-08-23 | Formulation Agent return and Coordinator audit | `needs-rework` | `formulation.md` owner pass/`ready-for-numerical-review`; Coordinator verified 18 required sections, exact 7/7 formulation closure IDs, complete 24-coordinate residual/tangent term inventory, state/integration/recovery/verification/traceability sections, balanced math/fence structure, upstream hash preservation and forbidden changes 0; output SHA-256 `516EB692619C6AAB1AD09061A671697BB7C1B821B0B60BC5A2831CA5D09E131D` | `needs-user-decision` | Present Stage-3 artifact for explicit user approval; do not dispatch Stage 4 |
| 2026-08-23 | Formulation independent consistency review | `needs-rework` | §13.4 uses rotation matrix symbol `R_I` as reaction force, creating dimensional collision; §§4.4/5/11.2 mix tolerance-based source-moment admissibility with exact tangency/projection work statements. Both are bounded formulation-document defects and first normalized attempts. | `needs-formulation` | Same Formulation Agent targeted rework attempt 2; preserve scope/threshold/public meaning |
| 2026-08-23 | Formulation bounded rework attempt 2 return and Coordinator audit | `needs-rework` | Owner pass; reaction force/generalized moment/spatial moment 기호·단위가 rotation matrix `R_I`와 분리되고 force/moment balance가 corrected. Immutable fixed-global source, unchanged `rho_M <= 1e-12`, exact projected work covector, removed director component/no drill channel, `DP`/`DJ_l`/map-Hessian을 포함한 chart/global residual-tangent identity가 일치함. 18 sections/7 closures, upstream hashes와 forbidden-change boundary 보존; SHA-256 `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`. | `needs-user-decision` | Present corrected Stage-3 artifact for explicit user approval; do not dispatch Stage 4 |
| 2026-08-23 | Formulation explicit user approval | `passed` | Task payload states the user explicitly approved `docs/nonlinear-static-newton-raphson/formulation.md`; approved SHA-256 `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0` retained. | `needs-numerical-review` | Dispatch `numerical-review-agent` only |
| 2026-08-23 | Numerical/reference dispatch attempt 1 | `blocked` | Coordinator prepared bounded Stage 4 package, but no collaboration `spawn_agent` tool is exposed in this agent environment; `tool_search` found no dispatch tool; `codex exec` fallback was interrupted, is not a visible child-agent dispatch, and produced no Stage 4 outputs. | `blocked` | Expose/route the valid `numerical-review-agent` collaboration dispatch, then rerun Stage 4 owner task |
| 2026-08-23 | Numerical/reference owner return | `needs-rework` | Root-dispatched `numerical-review-agent` returned both outputs with owner status `pass-for-io-definition`, shellNL/shell read-only inventory, row prechecks and blockers none. Coordinator/root audit found a blocking cross-report contradiction on stress CSV and `RM3` comparison disposition, so acceptance evidence is not coherent. | `needs-numerical-review` | Same `numerical-review-agent` bounded reconciliation; do not dispatch I/O |
| 2026-08-23 | Numerical/reference corrected return | `passed` | Corrected current reports have owner status `pass-for-io-definition`; stress CSVs are optional read-only inspection/order evidence only, `RM3` is excluded, and required external comparison is displacement, reaction force and physical spatial `RM1/RM2`. Coordinator verified required sections, exact paths, no concrete HDF5 dataset paths and no forbidden file-change scope. | `needs-user-decision` | Present Stage 4 artifacts for explicit user approval; do not dispatch I/O |
| 2026-08-23 | Numerical/reference explicit user approval | `passed` | User explicitly approved Stage 4 documents and requested next gate; approved hashes retained for requirements, research, formulation, numerical-review and reference-model. | `needs-io-definition` | Prepare bounded `io-definition-agent` dispatch package |
| 2026-08-23 | I/O Definition dispatch package | `in-progress` | Coordinator prepared Stage 5 package requiring `fesa-io-contract`, exact Stage 1-4 inputs, corrected reference disposition, authoritative `results.h5`, and only `docs/nonlinear-static-newton-raphson/io.md` output. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; await owner return |
| 2026-08-23 | I/O Definition owner return and Coordinator audit | `needs-rework` | Owner returned `io.md` status `ready-for-coordinator-review`, SHA-256 `75D702301D6285F151D913DCD0351F4AD302C4C24A004DD5841A576592D675FC`, blockers none. Coordinator confirmed blocking defects in `--output` substring rejection, Newton iteration log schema, `VARIABLE=PRESELECT` ignored output request acceptance and repository-wide non-Newton log lifecycle. | `needs-io-definition` | Same `io-definition-agent` bounded correction; do not start Implementation Planning |
| 2026-08-23 | I/O Definition bounded rework return and Coordinator audit | `passed` | Owner returned corrected `io.md` status `ready-for-coordinator-review`, SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`, blockers none. Coordinator verified REWORK-002 closure, DECISION-028/029/030 output lifecycle/path/log evidence, HDF5/reference/tolerance preservation and no stale narrow `--output` rule. | `needs-user-decision` | Present Stage 5 artifact for explicit user approval; do not start Implementation Planning |
| 2026-08-23 | I/O Definition explicit user approval | `passed` | User explicitly approved `docs/nonlinear-static-newton-raphson/io.md` SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` and requested the next Implementation Planning gate. | `needs-implementation-plan` | Prepare bounded `implementation-planning-agent` draft package only |
| 2026-08-23 | Implementation Planning draft dispatch package | `in-progress` | Coordinator prepared Stage 6 planning package requiring `fesa-cpp-msvc-tdd` and project-local `harness`, approved Stage 1-5 hashes, exact reference/tolerance disposition and draft-only stop condition. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await draft/interview return |
| 2026-08-23 | Implementation Planning draft owner return and Coordinator audit | `passed` | Owner returned draft status `draft-ready-for-user-review`, slug `nonlinear-static-newton-raphson`, Steps `0..12`, no files changed, no interview issue/blocker. Coordinator verified requirements/category mapping, TDD/Harness step shape, prepared-analysis orchestration boundary, exact reference/tolerance preservation and no forbidden execution or file creation. | `needs-user-decision` | Present Stage 6 draft for explicit user approval or bounded rework request; do not materialize files yet |
| 2026-08-24 | Implementation Planning draft explicit user approval | `passed` | User explicitly approved the 13-Step draft and requested `implementation-plan.md` plus pending Harness phase file creation. | `needs-implementation-plan` | Prepare bounded materialization package for `implementation-planning-agent` only |
| 2026-08-24 | Implementation Planning materialization dispatch package | `in-progress` | Coordinator authorized only `implementation-plan.md`, append pending phase entry, create phase index and `step0.md`..`step12.md` pending with no executor timestamps; source/tests/CMake/upstream/reference/tolerance/evidence docs and Harness/build/test execution remain forbidden. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await materialization return |
| 2026-08-24 | Implementation Planning materialization owner return and Coordinator audit | `passed` | `implementation-plan.md`, `phases/index.json`, phase index and `step0.md`..`step12.md` are materialized after user approval. Coordinator/root audit passed phase uniqueness, 13/13 pending steps without executor metadata, 151 root assertions, reference hashes/row counts and no unauthorized evidence docs/execution/source/test/CMake/reference edits. | `ready-for-implementation` | Await separate explicit Harness/implementation execution request; do not run Executor automatically |
| 2026-08-24 | Harness/Implementation execution authorization and dispatch package | `in-progress` | User explicitly requested Harness/Implementation execution. Coordinator verified materialized phase still has Step 0 `cli-output-lease-and-derived-names` as the first pending Step, preserved Stage 1-5 hashes and materialization evidence, and prepared no-push `scripts/execute.py nonlinear-static-newton-raphson` dispatch. | `needs-implementation` | Run no-push Harness executor; await Implementation/Harness return before any physics/release transition |
| 2026-08-24 | Harness/Implementation execution attempt 1 | `needs-rework` | No-push Harness attempt failed before Step 0 evidence: `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`; `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`; no source/test edits, `step0-output.json`, `MAX_RETRIES`, or Step evidence. Workspace-write smoke passed, MSVC baseline build passed and CTest passed `214/214`; Python baseline failure is pre-existing/unrelated. Normalized classification `harness-uncaught-step-codex-timeout-no-retry` attempt 1. | `needs-implementation` | Retry Step 0 through no-push `scripts/execute.py nonlinear-static-newton-raphson`; if the same classification reaches attempt 2, stop automatic rework and route to `needs-user-decision` or `blocked` |
- current_dispatch: `stage-3-formulation-attempt-1`
- current_workflow_state: `needs-formulation`
- next_gate_requires_user_approval: `false` (owner evidence audit 선행)
- current_dispatch: `stage-6-harness-implementation-execution-step0-retry-1`
- current_workflow_state: `needs-implementation`
- next_gate_requires_user_approval: `false` (Harness/Implementation execution owner evidence 선행)
## 5. Risk, Blocker, and User-Decision Register
| id | type | description | owner | status |
| --- | --- | --- | --- | --- |
| BLOCKER-001 | dispatch | Stage 4 requires a valid `numerical-review-agent` child dispatch. Root supplied the valid profile dispatch and owner return, so this runtime-tooling blocker no longer blocks the gate. | `coordinator-agent` / runtime tooling | closed |
| REWORK-001 | report-contract | Stage 4 returned evidence had a cross-report contradiction on stress CSV and `RM3` comparison disposition. Corrected reports now consistently treat stress CSVs as optional read-only inspection/order evidence only and exclude `RM3` from comparison. | `numerical-review-agent` | closed |
| REWORK-002 | io-contract | Stage 5 `io.md` bounded correction completed: public CLI `--output` substring rejection, Newton iteration log schema, exact `VARIABLE=PRESELECT` ignored-with-warning handling, repository-wide non-Newton log lifecycle, DECISION-028/029/030 path/log lifecycle and collision semantics are now recorded in `io.md`. | `io-definition-agent` | closed |
| REWORK-003 | harness | Stage 6 Harness attempt 1 failed before Step 0 evidence because `_invoke_codex` did not catch `subprocess.TimeoutExpired` after `1800.7s`; no retry loop, `step0-output.json`, source/test edit, or implementation evidence was produced. Workspace-write smoke passed and `danger-full-access` is not justified. First same-class attempt routes back to no-push Implementation/Harness retry. | `implementation-agent` via Harness Executor | open |
| RISK-001 | architecture | 기존 `LinearStaticAnalysis` private lifecycle은 단일 factorization/substitution과 final frame만 소유하므로 nonlinear increment/iteration/state commit을 삽입하면 ADR 경계를 위반한다. | `coordinator-agent` routing | open |
| RISK-002 | scope | `Newton–Raphson`은 solution algorithm이고 geometric/material/contact nonlinearity 범위를 단독으로 결정하지 않는다. | `requirement-agent` | mitigated by DECISION-001 |
| RISK-003 | contract | 현재 `Element`는 displacement-dependent residual/consistent tangent/trial state 계약이 없고 `AnalysisState`는 nonlinear history를 소유하지 않는다. | downstream formulation/architecture gates | open |
@@ -193,10 +230,14 @@
| DECISION-032 | user process decision | `requirements.md`를 핵심 Stage-1 계약으로 압축하고 OQ chronology, diagnostic/path/concurrency trivia와 반복 handoff를 제거한다. Minor details는 downstream specialist convention/evidence로 정하며 approved scope/physics/tolerance/public compatibility를 바꿀 때만 사용자 결정을 다시 요청한다. | user via Coordinator | closed |
| DECISION-033 | design approval | Target 363 lines, 24 canonical requirements와 24-row Matrix, approved semantic-loss 0의 compact rewrite design. | user via Coordinator | closed |
| DECISION-034 | user process decision | Requirement Agent는 approved physics/scope/tolerance/authoritative-output/public compatibility를 바꾸는 essential decision만 사용자에게 묻고, specialist detail은 owning downstream stage가 repository evidence와 conventional FEM practice로 정한다. Equivalence claim은 금지한다. | user via Coordinator; `.codex/agents/requirement-agent.toml` | closed |
| DECISION-035 | user approval | User explicitly approved Stage 5 `docs/nonlinear-static-newton-raphson/io.md` SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` and requested Implementation Planning. | user via Coordinator | closed |
| DECISION-036 | user approval | User explicitly approved the Stage 6 Implementation Planning 13-Step draft on `2026-08-24` and authorized creation of `implementation-plan.md` plus pending Harness phase files. | user via Coordinator | closed |
| DECISION-037 | user approval | User explicitly requested no-push Harness/Implementation execution for materialized phase `nonlinear-static-newton-raphson` on `2026-08-24`. | user via Coordinator | closed |
| USER-DECISION-001 | user decision | Stage 6 Implementation Planning draft Steps `0..12` were approved on `2026-08-24`; materialization is authorized for `implementation-planning-agent`. | user via Coordinator | closed |
## 6. Rework-Loop Control and Stop Condition
- normalized_failure_attempts: `requirements-next-question-routing-mismatch`: 1; `requirements-output-failure-atomicity-scope-ambiguity`: 1; `requirements-compact-public-contract-omission`: 1
- normalized_failure_attempts: `requirements-next-question-routing-mismatch`: 1; `requirements-output-failure-atomicity-scope-ambiguity`: 1; `requirements-compact-public-contract-omission`: 1; `formulation-equilibrium-reaction-symbol-collision`: 1; `formulation-moment-admissibility-work-inconsistency`: 1; `numerical-review-cross-report-disposition-contradiction`: 1; `io-contract-public-cli-log-output-request-gap`: 1; `harness-uncaught-step-codex-timeout-no-retry`: 1
- automatic_rework_limit: 동일 normalized failure classification `2`회
- correction_agent_policy: 명확한 implementation failure는 먼저 `implementation-agent`에 반환하고, 반복되거나 원인이 불명확할 때만 `correction-agent`를 dispatch한다.
- stop_condition: 동일 classification이 두 번이면 자동 rework를 중단하고 workflow를 `needs-user-decision` 또는 `blocked`로 전환한다.
@@ -214,6 +255,6 @@
- CMake: 변경 없음
- reference_artifacts: 생성·수정·rename 없음
- tolerance_policies: 변경 없음
- phase_files: 생성 없음
- Harness: 실행하지 않음
- feature_documents: `coordination.md`, `requirements.md`, `research.md`만 생성됨
- phase_files: user-approved planning owner가 `phases/index.json` pending entry와 `phases/nonlinear-static-newton-raphson/index.json`, `step0.md`..`step12.md`를 materialize함; Coordinator는 수정하지 않았고 Step 0은 implementation evidence 없이 pending으로 남아 있음
- Harness: Root-reported attempt 1 evidence만 기록함; Coordinator는 실행하지 않았고 no-push `scripts/execute.py nonlinear-static-newton-raphson` retry dispatch package만 기록함
- feature_documents: 이번 coordinator update에서는 `coordination.md`만 갱신함; `implementation-plan.md`는 user-approved planning owner가 materialize했고 `implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 생성되지 않음
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,252 @@
# Nonlinear Static Newton-Raphson Implementation Plan
> For Harness workers: this plan is an approved Stage 6 planning artifact. It authorizes planning files only. It does not authorize `scripts/execute.py`, C++ implementation, build, CTest, reference solver execution, or evidence-document creation.
**Goal:** `nonlinear-static-newton-raphson` 기능을 C++17/MSVC/CMake/CTest TDD 순서로 구현하고, 승인된 nonlinear MITC4 Newton-Raphson 절차, HDF5 schema v1, log lifecycle, shellNL/shell reference comparison을 검증한다.
**Architecture:** App layer가 argv 검증, lexical output path derivation, move-only `OutputWriteLease`, log open/close와 final HDF5 writer 호출 순서를 소유한다. 입력 parse/map은 정확히 한 번 수행하고, `StepDefinition::ProcedureKind()`로 linear와 nonlinear procedure executor를 분리한다. `LinearStaticAnalysis`의 기존 private lifecycle에는 nonlinear 조건문을 넣지 않고, 기존 linear numerical/HDF5 의미는 repository-wide output name/log lifecycle 변경만 제외하고 보존한다.
**Tech Stack:** C++17, MSVC on Windows, CMake, CTest, GoogleTest, Intel oneAPI MKL/TBB, HDF5, Abaqus `.inp` approved subset, Python 3 Harness scripts.
**Spec:** `docs/nonlinear-static-newton-raphson/{requirements,research,formulation,numerical-review,reference-model,io}.md`
## Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| status | `approved-planning-files-materialized` |
| owner_agent | `implementation-planning-agent` |
| date | `2026-08-24` |
| approval | User approved the final 13-Step draft on `2026-08-24`; Coordinator recorded `DECISION-036`. |
| source_requirement | `docs/nonlinear-static-newton-raphson/requirements.md` |
| source_research | `docs/nonlinear-static-newton-raphson/research.md` |
| source_formulation | `docs/nonlinear-static-newton-raphson/formulation.md` |
| source_numerical_review | `docs/nonlinear-static-newton-raphson/numerical-review.md` |
| source_reference_models | `docs/nonlinear-static-newton-raphson/reference-model.md` |
| source_io_definition | `docs/nonlinear-static-newton-raphson/io.md` |
## Approved Upstream Hashes
| document | SHA-256 |
| --- | --- |
| `requirements.md` | `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2` |
| `research.md` | `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` |
| `formulation.md` | `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0` |
| `numerical-review.md` | `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01` |
| `reference-model.md` | `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3` |
| `io.md` | `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` |
## Readiness Check
- Upstream document status: Stage 1 requirements approved, Stage 2 research passed, Stage 3 formulation ready for numerical review and approved downstream, Stage 4 numerical/reference review passed for I/O definition, Stage 5 I/O definition approved.
- Missing decisions: none.
- Missing required comparison files: none for declared blocking/reference families.
- Planning can proceed: yes.
- `.harness/config.json`: absent during planning inspection. Each Step must recheck at execution time and use it first if it appears.
## Global Constraints
- Use `RED -> observed failure -> minimal GREEN -> focused VERIFY -> full CTest` in every implementation Step.
- C++ production edits require related C++ tests in the same Step.
- Do not edit requirements, research, formulation, numerical review, reference-model, I/O, tolerance, or reference artifacts.
- Do not run Abaqus, Nastran, or any reference solver.
- Do not create `implementation-report.md`, `build-test.md`, or `reference-comparison.md` before Step 12 produces actual command evidence.
- Do not run Harness from this planning approval. `scripts/execute.py` requires a separate explicit request.
- Implementation and Harness execution remain unauthorized by this materialized plan until the user separately requests Executor execution.
- Preserve source label/instance identity, deterministic row order, deterministic diagnostics, finite checks, and docs/TOLERANCE.md exactly.
- Preserve `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. For shellNL, preserve constrained `RF1/RF2`, `RF3`, physical spatial `RM1/RM2` blocking, and exclude `RM3` plus stress from numeric comparison.
## Repository Seam Map
| area | current seam | implementation direction |
| --- | --- | --- |
| CLI/app | `src/fesa/app/fesa_application.cpp` currently accepts `[--output <results.h5>]` and constructs `LinearStaticAnalysis`. | Add output path derivation and `OutputWriteLease`, reject any argv token containing `--output`, own log/HDF5 lifecycle. |
| Analysis request | `include/fesa/analysis/analysis.h` contains `input_path` and `output_path`. | Add `log_path`; Step 10 introduces prepared analysis flow for single parse/map and delayed HDF5 finalization. |
| Linear lifecycle | `LinearStaticAnalysis::Run()` currently parses/maps and writes HDF5 inside `RecoverAndWrite()`. | Refactor into `PrepareAnalysisInput`, `LinearStaticProcedureExecutor`, and final writer call after log close; keep linear numerical behavior. |
| Domain | `StaticStepDefinition` in `include/fesa/model/model_types.h`; `StepDefinition` in `include/fesa/model/domain.h`. | Store procedure identity, `NLGEOM`, raw four `*STATIC` values and provenance. Do not store derived factor sequence or PRESELECT state. |
| Parser mapping | `src/fesa/io/abaqus/domain_mapping_context.cpp`, `step_definition_mapper.cpp`. | Accept nonlinear static subset, warning no-op PRESELECT, reject unsupported procedure fail-closed. |
| MITC4 | `include/fesa/elements/mitc4_shell.h`, `src/fesa/elements/mitc4_shell.cpp` are linear small-rotation. | Add separate nonlinear MITC4 files with `Create(...)` from four nodes, four initial frames, `ShellSection`, and `LinearElasticMaterial`; element kernels compute internal residual/tangent/recovery only. |
| Loads/control | Current loads are assembled for linear static RHS. | Step 5 owns global-once fixed CLOAD external vector `f_ext` and exact external load tangent `K_ext`, including projected moment `J_l`/map-Hessian terms, with no incident-element multiplication. Step 5 also owns exact convergence constants: relative `1.0e-2`, zero-scale `1.0e-3` with channel-specific units. Step 10 forms `r = f_int - f_ext` and `K_T = K_int - K_ext`. |
| Source identity | `SourceEntityId { instance_name, source_label, source_label_text }` and `EntityIndex` exist in `include/fesa/core/source_identity.h`; nodes are stored in stable Domain order. | Step 8 baseline uses both `EntityIndex` and full `SourceEntityId`, requires one node baseline per Domain node in stable internal order, rejects label-only or mismatched identities, and preserves identity into HDF5/reference mapping. |
| Solver | `MklPardisoSolver` uses SPD `mtype=2` and upper-triangle copy. | Preserve unchanged; add `TangentSolver` and MKL unsymmetric full CSR `mtype=11`. |
| Results writer | `ResultsWriter` is the backend-neutral linear writer; `Hdf5ResultsWriter` writes schema-v0 single-frame linear output. | Add `NonlinearResultsWriter` backend-neutral boundary and `NonlinearHdf5ResultsWriter` schema-v1 implementation with delayed finalization after log close. |
| Tests | `fesa_unit_tests`, `fesa_integration_tests`, `fesa_reference_tests` use executable-wide labels. | Add focused test sources and use `ctest -R` regex; do not globally relabel existing tests as nonlinear. |
## Work Breakdown
| Step | name | dependency | primary responsibility |
| ---: | --- | --- | --- |
| 0 | `cli-output-lease-and-derived-names` | none | CLI output derivation, `--output` substring rejection, RAII output lease, app-owned log/HDF5 lifecycle entry. |
| 1 | `nonlinear-static-domain-contract` | 0 | Domain/parser semantic contract for `NLGEOM=YES`, raw `*STATIC`, PRESELECT warning no-op. |
| 2 | `finite-rotation-state` | 1 | SO(3) finite rotation state, left Jacobian, branch/invariant validation. |
| 3 | `nonlinear-mitc4-kinematics-and-recovery` | 1,2 | TL MITC4 nonlinear kinematics and recovery rows. |
| 4 | `nonlinear-mitc4-residual-and-tangent` | 2,3 | Same-trial internal residual and internal consistent tangent with recovery. |
| 5 | `load-boundary-path-and-convergence-gates` | 1-4 | Fixed factor path, proportional load/BC path, global-once fixed-load `f_ext`/`K_ext` with approved subtraction signs, `rho_M`, typed four-channel convergence with constants owned by evaluator. |
| 6 | `backend-neutral-tangent-solver` | 4 | Separate nonsymmetric tangent solver boundary and MKL adapter. |
| 7 | `newton-iteration-log-writer` | 0,5 | Exact 39-field Newton text log writer. |
| 8 | `nonlinear-state-commit-rollback` | 3-7 | Factor-zero baseline construction with `EntityIndex` plus `SourceEntityId`, trial/committed nonlinear state, accepted frames, rollback/preservation. |
| 9 | `nonlinear-hdf5-schema-v1-writer` | 8 | Nonlinear HDF5 schema v1 writer using `std::vector<Diagnostic>`. |
| 10 | `prepared-analysis-flow-and-full-procedure` | 0-9 | Single parse/map prepared analysis flow, separate linear/nonlinear executors, delayed writer finalization. |
| 11 | `reference-comparison-gate` | 0-10 | shellNL nonlinear and shell linear real-input reference comparison. |
| 12 | `execution-closure-and-evidence-docs` | 0-11 | Fresh MSVC evidence, deterministic repeat/reference audit, actual-output evidence docs. |
## TDD Test Plan
| test id family | RED assertion scope | Step |
| --- | --- | --- |
| `NSNR-CLI-*` | `--output` substring first-token rejection, lexical result/log names, no-output-change proof, lease lifetime. | 0 |
| `NSNR-IO-*` | `NLGEOM=YES`, raw `*STATIC`, `NLGEOM=NO` regression, PRESELECT warning no-op, unsupported procedure diagnostics. | 1 |
| `NSNR-ROT-*` | finite rotation invariants, `J_l`, branch margin, director update. | 2 |
| `NSNR-ELEM-KIN-*` | nonlinear MITC4 creation inputs, TL shell kinematics, fixed-size four-GP recovery rows, degeneracy fail-closed, linear limit. | 3 |
| `NSNR-ELEM-TAN-*` | same-trial internal residual/tangent, directional derivative, objectivity, symmetry only for internal/no-external cases. | 4 |
| `NSNR-CTRL-*` | load factor path, absolute boundary path, global-once fixed loads and load tangent, moment admissibility, typed four convergence gates with `relative`/`zero-scale` branches and non-injectable exact thresholds/units. | 5 |
| `NSNR-SOLVER-*` | nonsymmetric tangent solve, 0x0, nonfinite/failure translation, SPD solver unchanged. | 6 |
| `NSNR-LOG-*` | serializer-owned 39-field UTF-8/LF/TAB Newton log from explicit stage/failure/channel records and fail-closed write/flush/close. | 7 |
| `NSNR-STATE-*` | factor-zero baseline creation with stable node order and full source identity, trial/committed separation, accepted frame order, full schema-v1 state inventory, finite atomic commit, rollback. | 8 |
| `NSNR-HDF5-*` | `NonlinearResultsWriter` boundary, schema v1 metadata/model/frame datasets, factor-zero metadata, atomic finalization. | 9 |
| `NSNR-PROC-*` | full procedure orchestration, single parse/map, log close before HDF5, deterministic repeat. | 10 |
| `NSNR-REF-*` | original artifact snapshot, temp input copy run, HDF5-to-original-CSV identity mapping, tolerance, classification, report data. | 11 |
| `NSNR-EVID-*` | fresh evidence docs and diff/hash/warning audits from actual command outputs. | 12 |
## CMake And CTest Plan
- Add C++ sources to `src/fesa/CMakeLists.txt` under existing `fesa_solver`.
- Add unit tests to `fesa_unit_tests`, integration tests to `fesa_integration_tests`, reference tests to `fesa_reference_tests`.
- Preserve current executable-wide labels. Use focused regex such as `ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure`.
- If scoped per-test labels are introduced, the Step that introduces the mechanism must test it and avoid changing labels for unrelated discovered tests.
- Configure/build/test commands:
```powershell
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=$gtestSource" `
"-DMKL_DIR=$mklDir" `
"-DTBB_DIR=$tbbDir" `
"-DHDF5_DIR=$hdf5Dir"
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
```
## Data Flow Contract
1. CLI receives `fesa.exe <model.inp>`.
2. App scans all argv tokens left-to-right. The first token containing case-sensitive substring `--output` fails with one `cli-usage` diagnostic before path resolution, parse/map, analysis, lease, log, or HDF5.
3. App derives `<stem>_results.h5` and `<stem>_log.txt` beside the lexically normalized user-addressed `.inp`.
4. App acquires move-only `OutputWriteLease` and retains it until all log and HDF5 work ends.
5. App opens/truncates the log, then `PrepareAnalysisInput(input_path)` parses/maps once into `Domain`.
6. Procedure executor receives injected `ParallelFor` plus `LinearSolver` or `TangentSolver` and computes a fully validated linear or nonlinear state without opening HDF5. Nonlinear assembly forms `r = f_int - f_ext` and `K_T = K_int - K_ext` from Step 4 internal quantities and Step 5 global-once external quantities. Nonlinear state construction preserves each node's stable `EntityIndex` and full `SourceEntityId`; source label alone is never a row identity.
7. App closes the log successfully before invoking injected `ResultsWriter` or `NonlinearResultsWriter`.
8. HDF5 is the authoritative solver output. CSV views are comparison/debug artifacts only.
## Reference Inventory
| path | role | rows | SHA-256 |
| --- | --- | ---: | --- |
| `reference/shellNL/shellNL.inp` | nonlinear input | input | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| `reference/shellNL/shellNL displacements.csv` | required displacement CSV | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | required reaction CSV | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | nonblocking inventory artifact | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shell/shell.inp` | linear input | input | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| `reference/shell/shell displacements.csv` | required displacement CSV | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| `reference/shell/shell reactions.csv` | nonblocking inventory artifact | 49 | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` |
| `reference/shell/shell stresses.csv` | nonblocking inventory artifact | 288 | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` |
Blocking and warning families:
| family | components | rows | disposition |
| --- | --- | ---: | --- |
| `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking |
| `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only |
| `nonlinear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking |
| `nonlinear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only |
| `nonlinear.reaction_inplane_force` | `RF1,RF2`, constrained nodes | 48 | blocking |
| `nonlinear.reaction_transverse_force` | `RF3`, constrained nodes | 24 | blocking |
| `nonlinear.reaction_physical_moment` | `RM1,RM2`, constrained nodes | 48 | blocking |
Constrained node labels for shellNL reactions: `1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33`.
Exact shellNL `Frame`: `Increment 10: Step Time = 1.000`.
Step 11 must not run original reference input paths directly. It snapshots exact original artifact inventory, copies input bytes unchanged into a unique build-local temp case directory, runs `FesaApplication` on the copied `.inp`, consumes copied-sibling `_results.h5` and `_log.txt`, compares generated HDF5 to original read-only CSVs, and then verifies original reference directory inventory, bytes, timestamps, and hashes are unchanged. HDF5 source path identity matches the copied user-addressed input; source content identity matches the approved input hash.
## Acceptance Traceability Matrix
| requirement | Steps | test ids |
| --- | --- | --- |
| `FESA-REQ-NSNR-001` | 1,10 | `NSNR-IO-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-003` | 1,3,4,10 | `NSNR-IO-*`, `NSNR-ELEM-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-041` | 1,3,10 | `NSNR-IO-*`, `NSNR-ELEM-KIN-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-074` | 2,8,10 | `NSNR-ROT-*`, `NSNR-STATE-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-006` | 4,6,10 | `NSNR-ELEM-TAN-*`, `NSNR-SOLVER-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-007` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-069` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-070` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-008` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-014` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-046` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-048` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-018` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-063` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-016` | 1,5 | `NSNR-IO-*`, `NSNR-CTRL-*` |
| `FESA-REQ-NSNR-011` | 8,9,10 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-019` | 4,8,10 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-020` | 1 | `NSNR-IO-*` |
| `FESA-REQ-NSNR-021` | 8,9,10 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-024` | 7,10 | `NSNR-LOG-*`, `NSNR-PROC-*` |
| `FESA-REQ-NSNR-083` | 0,10,12 | `NSNR-CLI-*`, `NSNR-PROC-*`, `NSNR-EVID-*` |
| `FESA-REQ-NSNR-026` | 8,10,11,12 | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-*`, `NSNR-EVID-*` |
| `FESA-REQ-NSNR-030` | 2,3,4,5,6,7,8,9,10,11 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-REF-*` |
| `FESA-REQ-NSNR-034` | 11 | `NSNR-REF-*` |
## Numerical Review Coverage
| category | Steps |
| --- | --- |
| linear-limit reduction | 3,4,10,11 |
| rotation invariants and branch margin | 2,8,10 |
| tangent directional derivative schedule | 4 |
| no-moment tangent symmetry | 4 |
| finite rigid objectivity | 3,4 |
| patch/sign recovery | 3,4 |
| load/boundary path and `rho_M` | 5,10 |
| Newton factor/iteration lifecycle | 5,7,10 |
| four convergence gates | 5,7,10 |
| commit/rollback/determinism | 8,10,11,12 |
## Validation Commands
Each Step must:
1. Recheck `.harness/config.json`. If present, use the configured Harness build/test commands.
2. If absent, use:
```powershell
cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 `
"-DFESA_GTEST_SOURCE_DIR=$gtestSource" `
"-DMKL_DIR=$mklDir" `
"-DTBB_DIR=$tbbDir" `
"-DHDF5_DIR=$hdf5Dir"
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 CTest commands are written explicitly in each `stepN.md`.
Harness Python validation is not in scope unless a Step changes Harness Python behavior, hook behavior, or agent configuration.
## Risks And Downstream Handoff
- Main implementation risk: current `LinearStaticAnalysis` owns parse/map and HDF5 write internally. Step 10 must refactor through prepared analysis flow so log close precedes HDF5 finalization for both linear and nonlinear runs.
- Main numerical risk: nonlinear MITC4 tangent and finite rotation derivatives must pass internal derivative/objectivity tests before reference comparison can be meaningful.
- Main backend risk: nonlinear tangent can be nonsymmetric. Preserve SPD `MklPardisoSolver` unchanged and add separate `TangentSolver`.
- Handoff to Implementation Agent through Coordinator: execute Steps 0..12 in order, one current Step at a time, with RED observed failure evidence before GREEN implementation, then focused/full CTest. Final reference gate is Step 11; evidence-document closure is Step 12.
## Open Issues
None.
## Plan Approval Boundary
The user-approved plan and pending phase files do not authorize Harness execution. `scripts/execute.py nonlinear-static-newton-raphson` requires a separate explicit user request.
+808
View File
@@ -0,0 +1,808 @@
# Nonlinear Static Newton-Raphson I/O Definition
## 1. Metadata
- feature_id: `nonlinear-static-newton-raphson`
- source_requirement: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirement_sha256: `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_research_sha256: `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`
- source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md`
- source_formulation_sha256: `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`
- source_numerical_review: `docs/nonlinear-static-newton-raphson/numerical-review.md`
- source_numerical_review_sha256: `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`
- source_reference_model: `docs/nonlinear-static-newton-raphson/reference-model.md`
- source_reference_model_sha256: `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`
- repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/PRD.md`,
`docs/ARCHITECTURE.md`, `docs/ADR.md`, `docs/TOLERANCE.md`
- status: `ready-for-coordinator-review`
- owner_agent: `io-definition-agent`
- date: `2026-08-23`
- authoritative_output: input sibling `<stem>_results.h5`
- diagnostic_log: input sibling `<stem>_log.txt`
- hdf5_schema_version: `1`
이 문서는 승인된 Stage 5 I/O 계약만 정의한다. Parser, writer, comparison tool의
C++ API나 파일 소유권은 정의하지 않는다. FESA는 Abaqus와 독립적인 solver이며,
아래 `.inp` subset과 reference CSV mapping은 Abaqus full compatibility, Abaqus
`S4/S4R` 내부 알고리즘, 적분, stabilization, 상태 갱신 또는 output recovery
동등성을 주장하지 않는다.
FEM wiki 근거는 `Abaqus Input File Syntax`,
`Abaqus Output Database and Results Files`,
`Abaqus General and Linear Perturbation Steps`,
`Abaqus Initial and Boundary Conditions`,
`Abaqus Loads and Predefined Fields`,
`Abaqus Beam and Shell Section Definitions`를 사용했다. 이 근거는 keyword/data/comment
line, model/history data, output request, step/load/boundary/section 용어를 정렬하기
위한 보조 근거이며, 승인된 FESA 요구조건과 정식화가 우선한다.
## 2. Abaqus Input Scope
- input_format: Abaqus input file (`.inp`)
- supported Abaqus documentation source/version: 프로젝트 연구 bundle 및 local FEM
wiki에 보존된 Abaqus 2024 input syntax/output vocabulary. 저장된 nonlinear reference
input은 Abaqus/CAE Learning Edition 2024 생성물이다.
- supported_analysis: no-prior-history baseline에서 시작하는 정확히 하나의 source
`*STEP, NLGEOM=YES`와 하나의 nonlinear `*STATIC` procedure.
- internal_element_formulation: source `S4`와 `S4R` 모두 materially linear,
geometrically nonlinear Total Lagrangian `FESA-MITC4`에 매핑한다.
- ordinary_unit_system: 사용자가 일관되게 선택한 미지정 단위계. FESA는 단위 추론이나
변환을 수행하지 않는다.
- compatibility_disclaimer: 이 문서가 명시한 keyword 위치, parameter, data-line arity,
validation rule, output mapping만 지원 범위다.
`supported`는 syntax가 parsing되고 feature semantic model에 매핑된다는 뜻이다.
`unsupported`는 명확한 diagnostic으로 거부한다. `ignored-with-warning`은 syntax와
소속 data line을 소비하고 warning을 남기지만 Domain, AnalysisModel, nonlinear
procedure, mandatory HDF5 output 또는 reference comparison 의미를 바꾸지 않는다.
`requires-user-decision` 항목은 없다.
| keyword | policy | allowed location | required parameters and data grammar | semantic mapping | unsupported behavior |
| --- | --- | --- | --- | --- | --- |
| `*HEADING` | supported | optional top-level first keyword | parameter 없음; 다음 keyword 전까지 text row 0개 이상 | raw heading을 source metadata로 보존 | parameter, nested location, 두 번째 heading은 input error |
| `*INCLUDE` | unsupported | anywhere | 허용 data/parameter grammar 없음 | file traversal 또는 include expansion 없음 | `unsupported-keyword`; 참조 파일을 열지 않음 |
| `*PART` / `*END PART` | supported | top-level model block | `NAME=<part-name>` 필수; `*END PART` data 없음 | part-local node, element, set, shell section scope | unclosed, nested, duplicate, data-bearing close는 input error |
| `*NODE` | supported | part scope | 각 row `node_label,x,y,z`; parameter 없음 | 양의 source node label과 finite global Cartesian coordinate | arity 오류, duplicate label, nonfinite value, dangling later reference는 input/model error |
| `*NSET` | supported | part 또는 assembly scope | `NSET=<name>` 필수; optional `GENERATE`; assembly scope는 `INSTANCE=<name>` 필수; explicit labels 또는 `first,last,increment` | deterministic node-set membership | mixed-instance set, invalid generate row, duplicate set name, empty set, dangling member는 input error |
| `*ELEMENT` | supported | part scope | `TYPE=S4` 또는 `TYPE=S4R`; 각 row `element_label,n1,n2,n3,n4` | four-node source shell connectivity; source type 보존; internal type `FESA-MITC4` | 다른 element type은 `unsupported-element-formulation`; repeated node, arity 오류, dangling node, mixed element model은 error |
| `*ELSET` | supported | part 또는 assembly scope | `ELSET=<name>` 필수; optional `GENERATE`; assembly scope는 `INSTANCE=<name>` 필수; `*NSET`과 같은 row rule | deterministic element-set membership | mixed-instance set, invalid generate row, duplicate set name, empty set, dangling member는 input error |
| `*MATERIAL` | supported | top-level model data | `NAME=<material-name>` 필수; data 없음 | 정확히 하나의 supported isotropic `*ELASTIC` 소유 | duplicate material, missing/duplicate elasticity, 다른 material behavior는 input error |
| `*ELASTIC` | supported | current `*MATERIAL` scope | 정확히 한 row `E,nu`; parameter 없음 | homogeneous isotropic linear elasticity; `G=E/(2(1+nu))` 파생 | extra field/row, dependency/temperature data, nonfinite value, `E<=0`, `nu<=-1`, `nu>=0.5`는 error |
| `*SHELL SECTION` | supported | part scope | `ELSET=<name>`와 `MATERIAL=<name>` 필수; 정확히 한 row `thickness[,integration_points]` | centered homogeneous single-layer shell section | composite/layer data, offset, orientation, controls, variable thickness, missing reference, conflicting assignment, nonpositive thickness는 error |
| `*ASSEMBLY` / `*END ASSEMBLY` | supported | 정확히 하나의 top-level assembly | `NAME=<assembly-name>` 필수; `*END ASSEMBLY` data 없음 | identity-instance scope와 assembly-level set scope | nested/duplicate assembly, instance transform data, unmatched close는 input error |
| `*INSTANCE` / `*END INSTANCE` | supported | assembly scope | `NAME=<instance-name>`, `PART=<part-name>` 필수; transform data 없음 | named identity copy; 같은 part의 multiple identity instances 허용 | duplicate/dangling instance 또는 translation/rotation data는 unsupported input |
| `*BOUNDARY` | supported | top-level model data 또는 sole step의 `*STATIC` 뒤 | parameter 없음; 각 row `target,first_dof,last_dof[,value]`; omitted value는 exact zero | common load-factor path의 factor-one absolute global DOF target; DOF `1..6` | amplitude, local coordinate system, invalid range/arity, unresolved target, nonfinite value, conflicting expanded value는 error |
| `*CLOAD` | supported | sole step의 `*STATIC` 뒤 | parameter 없음; 각 row `target,dof,magnitude`; DOF `1..6` | load factor로만 scale되는 fixed-global dead nodal force/moment source | amplitude/follower/local load, invalid arity/DOF, unresolved target, nonfinite magnitude, drilling-direction aggregate moment는 error |
| `*DLOAD` | unsupported | anywhere | 허용 data/parameter grammar 없음 | distributed/body/pressure/edge/follower load object를 만들지 않음 | load-like usage는 `unsupported-distributed-load`; 그 외는 `unsupported-keyword` |
| `*STEP` / `*END STEP` | supported for nonlinear selector | 정확히 하나의 top-level history block | optional `NAME`; `NLGEOM=YES` 필수; `*END STEP` data 없음 | canonical nonlinear step identity `Step-1` | zero/multiple/mixed/unclosed/nested step 또는 non-`YES` nonlinear selector는 nonlinear increment 전 실패 |
| `*STATIC` | supported nonlinear procedure | sole step의 첫 procedure keyword | 정확히 한 row `initial_increment,time_period,minimum_increment,maximum_increment`; 네 값 모두 finite positive; `time_period`는 endpoint `1.0` identity | 첫 값은 fixed increment `h`; 세 번째/네 번째 값은 unused compatibility source; factors는 one 미만 ordinal multiple 뒤 exact factor one | missing/extra rows/fields, nonpositive/nonfinite field, endpoint가 `1.0`이 아니면 `invalid-nonlinear-static-data` |
| `*OUTPUT` | ignored-with-warning | sole step의 `*STATIC` 뒤 | 정확히 `FIELD, VARIABLE=PRESELECT` 또는 `HISTORY, VARIABLE=PRESELECT`; `FIELD`/`HISTORY`는 value 없는 flag이고 둘 중 하나만 필요; `VARIABLE`은 정확히 한 번 필요; duplicate, both flags, missing `VARIABLE`, 다른 value, extra parameter는 input error | stored reference의 `*Output, field, variable=PRESELECT`와 `*Output, history, variable=PRESELECT`를 warning no-op으로 수용; FESA mandatory output을 select/suppress할 수 없음 | output request는 FESA output을 바꾸지 않음; malformed parameter set은 `invalid-keyword-parameter` |
| `*NODE OUTPUT` | ignored-with-warning | active allowlisted `*OUTPUT` scope | parameter와 다음 keyword 전 variable data를 소비 | legacy nodal request `U`, `RF` 등을 수용 | HDF5 selection, history output, empty synthetic dataset을 만들지 않음 |
| `*ELEMENT OUTPUT` | ignored-with-warning | active allowlisted `*OUTPUT` scope | parameter와 다음 keyword 전 variable data를 소비 | legacy element request `S` 등을 수용 | extrapolated stress, averaging, comparison projection을 만들지 않음 |
| `*PREPRINT` | ignored-with-warning | top-level | parameter를 보존 후 무시; data 불필요 | generator control syntax 수용 | semantic object 없음 |
| `*RESTART` | ignored-with-warning | sole step | parameter를 보존 후 무시; restart state/data 없음 | legacy restart request syntax 수용 | restart write/read/continue 없음 |
| `*CONTACT OUTPUT` | ignored-with-warning | active allowlisted `*OUTPUT` scope | parameter와 다음 keyword 전 data를 소비 | legacy contact-output request syntax만 수용 | contact model/output 없음 |
`*ORIENTATION`, `*TRANSFORM`, amplitudes, follower loads, pressure, gravity, body
force, edge load, `*DLOAD`, composite shell definitions, shell section offsets,
material nonlinearity, density, temperature dependency, contact, MPC, penalty, multiple
steps, restarts, submodels, transforms, nested assemblies와 위 표에 없는 모든
model-affecting keyword는 fail-closed unsupported input이다. 저장 또는 future linear
shell input의 `NLGEOM=NO`는 `docs/linear-static-mitc4-shell/io.md`가 계속 관할한다.
이 feature bundle에서 해당 linear case는 `shell-s4-linear-limit` regression reference일
뿐 nonlinear response evidence가 아니다.
## 3. Syntax Policy
- Keyword line은 optional leading whitespace 뒤 `*`로 시작한다. Comment line은 `**`로
시작하며 semantic effect가 없다.
- Keyword name, parameter name, supported enumerated value, named-reference lookup은
ASCII case-insensitive다. Raw source spelling은 diagnostic/report display용으로
보존한다.
- Data line과 keyword parameter field는 comma-separated다. 주변 whitespace는 parsing
전에 trim한다. 필수 field가 비어 있거나, 허용되지 않은 trailing field가 있거나,
numeric token이 malformed이면 input error다.
- 승인된 empty data-field 의미는 `*BOUNDARY` 네 번째 value 생략뿐이며 exact zero로
매핑한다. `*SHELL SECTION`의 optional second field는 생략 가능하고, 존재하면 positive
base-10 integer여야 한다.
- Continuation line, physical-line continuation, multiline name, quoted case-sensitive
name, parameter substitution, include file은 unsupported다. 각 logical keyword/data row는
한 physical line에 완결되어야 한다.
- 이 feature는 public numeric Abaqus line-length compatibility limit를 정의하지 않는다.
승인 input은 single-line ASCII record이며, 읽을 수 없는 physical line은 implicit
continuation 없이 parsing 실패다.
- Keyword, parameter, set/material/part/instance name, numeric label의 input text는
ASCII로 취급한다. HDF5 string output은 UTF-8이지만 non-ASCII source label/name은
이 feature 계약 밖이다.
- Node label, element label, explicit set member는 positive base-10 integer다. Source
label은 text와 numeric identity로 보존한다. Stable internal index는 diagnostic 또는
comparison row에서 source identity를 대체할 수 없다.
- 모든 real-valued input은 finite `double`로 parse되어야 한다. `NaN`, `Inf`, overflow,
nonfinite underflow, locale-dependent numeric format은 reject한다.
- Model data와 history data는 개념적으로 분리한다. Mesh, set, material, section,
coordinate, initial shell frame은 model data다. Step, procedure, boundary, load,
output request는 history data다.
- 어떤 keyword에도 속하지 않는 standalone data 또는 active keyword block 밖의 data는
input error다. Output-request variable data는 allowlisted output keyword에 종속될 때만
no-op으로 소비한다.
- 모든 parsed keyword, parameter, data row, semantic entity는 normalized file path,
1-based line, raw keyword spelling, source identity까지 추적 가능해야 한다.
## 4. Model Data Mapping
### 4.1 Stable Source Identity and Ordering
Identity-instance expansion 뒤 source node와 source element의 stable identity는 다음과
같다.
```text
SourceEntityId { instance_name, source_label }
```
Name lookup은 case-insensitive지만 raw spelling은 보존한다. Stable internal ID는 input
part declaration order, instance declaration order, part-local entity declaration order로
부여한다. Hash iteration, thread scheduling, set spelling, CSV row order는 source identity,
internal row order, diagnostic order 또는 result row order를 바꾸면 안 된다.
### 4.2 Nodes, Elements and Sets
- `*NODE`는 finite global Cartesian initial midsurface coordinate `[X,Y,Z]`로 매핑하며
unit dimension은 `length`다.
- `*ELEMENT, TYPE=S4/S4R`는 ordered four-node shell connectivity `[1,2,3,4]`로 매핑한다.
Natural corner 순서는 `(-1,-1)`, `(+1,-1)`, `(+1,+1)`, `(-1,+1)`이며 connectivity를
조용히 reverse하지 않는다.
- Source type `S4` 또는 `S4R`는 metadata로 보존한다. 두 type 모두 같은 internal
`FESA-MITC4` formulation, `2 x 2 x 2` integration, nonlinear state path를 선택한다.
Source `S4R`는 reduced integration, hourglass control 또는 Abaqus `S4R` internal
behavior를 활성화하지 않는다.
- `*NSET`과 `*ELSET`은 explicit row order를 보존한다. `GENERATE`는 inclusive
`first,last,increment` 순서로 expand한다. Assembly-scope set은 하나의 `INSTANCE`만
참조할 수 있고 mixed instance는 허용하지 않는다.
- Set membership은 Domain commit 전에 source identity로 resolve한다. 같은 scope의
duplicate set definition, dangling member, invalid generate range는 analysis 전 실패한다.
### 4.3 Material, Section, Coordinates and Units
- `*MATERIAL`과 `*ELASTIC`은 finite `E>0`, `-1<nu<0.5`를 갖는 homogeneous isotropic
materially linear material 하나로 매핑한다.
- `*SHELL SECTION`은 하나의 element set을 resolved material과 positive finite
`thickness>0`를 갖는 centered homogeneous shell layer로 매핑한다. Optional source
integration-point 값은 syntax compatibility로만 보존하며 quadrature, recovery, output,
reference comparison에 영향을 주지 않는다.
- Initial nodal director와 right-handed triad는 instance expansion 뒤 승인된 linear MITC4
deterministic incident-element rule로 파생한다. 이 값들은 model data이며 모든 increment의
fixed initial reference를 정의한다.
- 필수 geometry check는 finite coordinate, valid four-node topology, 모든 Gauss/tying/
center/recovery location의 positive reference Jacobian, non-opposed incident normals,
valid reciprocal bases, valid initial frames를 포함한다.
- `.inp` 단위는 user-consistent unspecified다. HDF5는 `length`, `force`, `force*length`,
`force/length`, `force/length^2`, `1` 같은 unit dimension string만 기록하고 SI를 쓰거나
추론하지 않는다.
## 5. History Data Mapping
### 5.1 Step and Procedure
Nonlinear procedure는 정확히 하나의 source step이 `*STEP, NLGEOM=YES`를 포함하고 그
안에 정확히 하나의 supported `*STATIC` data row가 있을 때만 선택한다. Semantic step
name은 canonical `Step-1`이다. Raw source step name은 provenance로만 보존한다.
Nonlinear `*STATIC` data row의 의미는 다음과 같다.
- `initial_increment`는 fixed positive load-factor increment `h`다.
- `time_period`는 endpoint `1.0`과 정확히 같은 identity여야 한다.
- `minimum_increment`와 `maximum_increment`는 positive finite source value여야 하지만
cutback, growth, retry, stopping, convergence, output cadence에는 사용하지 않는다.
- Intended factor identity는 `1.0`보다 작은 ordinal `j*h` 값들을 만든 뒤, 마지막에 exact
assigned factor `1.0` 하나를 붙여 만든다. Cumulative `lambda += h`, tolerance-based
duplicate endpoint detection, growth, cutback, retry는 금지한다.
- `reference/shellNL/shellNL.inp`의 성공 run에서 expected intended/accepted factor sequence는
`0.1,0.2,...,1.0`이다.
Factor zero는 no-prior-history step-start committed baseline이다. Accepted frame은 committed
increment와 일대일 대응해야 하므로 factor zero는 accepted HDF5 frame이 아니다. Factor zero는
다음 metadata/model dataset으로만 projection한다.
- `factor_zero_is_frame=0`
- `factor_zero_load_factor=0.0`
- `/model/prescribed_displacement_start`와 initial state의 step-start displacement 및
rotation-vector component
- `/model/shell/nodal_frame`과 `/model/shell/nodal_director`의 step-start triad/director
- zero scaled `*CLOAD` contribution과 step-start boundary value
### 5.2 Boundary Conditions
`*BOUNDARY` target resolution은 direct node label 또는 node set을 허용한다. Expanded row는
stable source-node identity와 DOF order `1..6`를 사용한다.
| DOF | component | unit dimension | nonlinear path meaning |
| ---: | --- | --- | --- |
| 1 | `UX` / CSV `U1` | length | factor-one absolute global displacement target |
| 2 | `UY` / CSV `U2` | length | factor-one absolute global displacement target |
| 3 | `UZ` / CSV `U3` | length | factor-one absolute global displacement target |
| 4 | `URX` / CSV `UR1` | dimensionless rotation | factor-one absolute fixed-initial global rotation-vector target |
| 5 | `URY` / CSV `UR2` | dimensionless rotation | factor-one absolute fixed-initial global rotation-vector target |
| 6 | `URZ` / CSV `UR3` | dimensionless rotation | factor-one absolute fixed-initial global rotation-vector target |
Step 앞 row와 sole step 내부 row는 모두 같은 semantic step의 factor-one target으로 매핑한다.
Cross-step propagation은 없다. Load factor `lambda`에서 current constrained value는
`q_start + lambda * (q_target - q_start)`다. Current release에는 prior history가 없으므로
ordinary start value는 승인된 start-state dataset에 명시된 값을 제외하고 zero다.
Constrained Newton correction component는 exact zero다.
### 5.3 Concentrated Loads
`*CLOAD` target resolution은 boundary와 같다. 같은 node/DOF로 resolve되는 여러 row는 source
order로 factor-one global load coefficient에 누적한다. Factor `lambda`에서 magnitude는
`lambda`만 곱한다.
| DOF | source component | unit dimension | nonlinear meaning |
| ---: | --- | --- | --- |
| 1 | `F1` | force | fixed-global dead nodal force |
| 2 | `F2` | force | fixed-global dead nodal force |
| 3 | `F3` | force | fixed-global dead nodal force |
| 4 | `M1` | force*length | fixed-global source nodal moment admitted only through physical director-tangent work |
| 5 | `M2` | force*length | fixed-global source nodal moment admitted only through physical director-tangent work |
| 6 | `M3` | force*length | fixed-global source nodal moment admitted only through physical director-tangent work |
Nonzero aggregated nodal moment `M_src`마다 preprocessing과 모든 entered trial state에서
`abs(dot(d,M_src))/norm(M_src) <= 1e-12`를 denominator clamping 없이 만족해야 한다.
실패하면 `unsupported-drilling-load`다. Source moment vector는 fixed global coordinate에
남으며 FESA는 rejected moment component를 회전, 축소, 변형하거나 numerical drilling channel로
보내지 않는다.
### 5.4 Output Requests
Abaqus output request keyword는 `ignored-with-warning` compatibility syntax로만 수용한다.
이 keyword들은 history output을 켜지 않고, frame cadence를 제어하지 않으며, mandatory FESA
HDF5 dataset을 select, suppress, rename할 수 없다. Trial Newton state는 HDF5 field/history
output이 아니다. Per-iteration evidence는 `<stem>_log.txt`에 diagnostic text로만 기록한다.
## 6. Internal Model Contract
이 section은 semantic field를 정의하며 C++ API를 정의하지 않는다.
- Node record: stable internal node ID, `SourceEntityId`, finite global coordinate,
initial director, initial right-handed triad, source location.
- Element record: stable internal element ID, `SourceEntityId`, preserved source type
`S4` 또는 `S4R`, internal formulation `FESA-MITC4`, ordered four-node connectivity,
resolved section/material identity, source location.
- Set record: case-insensitive set name, source scope, optional source instance,
deterministic expanded source members, stable internal member IDs.
- Material record: case-insensitive material name, finite `E`, finite `nu`, derived `G`,
source location, homogeneous isotropic materially linear identity.
- Section record: source `ELSET`, resolved material, positive thickness, optional ignored
source integration-point field, centered single-layer identity.
- Boundary record: source target, expanded node identities, DOF range, finite factor-one
absolute target values, step-start values, source location, conflict status.
- Load record: source target, expanded node identities, DOF, finite factor-one source
magnitude, deterministic aggregate value, dead fixed-global load identity.
- Step record: raw source name, canonical `Step-1`, `NLGEOM=YES` nonlinear procedure
identity, fixed increment `h`, endpoint `1.0`, unused third/fourth `*STATIC` values,
intended factor sequence, output-request no-op inventory.
- State contract: committed state와 trial state는 alias될 수 없다. 완전하게 수렴한
candidate만 displacement, rotation vector, `Q`, director, load factor, frame identity,
internal/external force, residual/reaction, physical recovery row를 commit한다. Failed
trial, nonconvergence, nonfinite data, solve failure, recovery failure 또는 output failure는
prior committed state와 prior authoritative final result를 보존한다.
- Output request record: keyword, parameter, variable row, source location은 warning
diagnostic용으로만 보존한다. Solver 또는 HDF5 selection effect는 없다.
Source identity와 internal index identity는 diagnostics, HDF5 row order, reference
comparison 전체에서 구분해야 한다. CSV의 element-label order는 solver identity가 아니며
`(instance, source_label)` key를 대체하지 않는다.
## 7. Output HDF5 Schema
### 7.1 Public Output Names, Log and Lifecycle
승인된 public CLI shape는 다음 하나뿐이다.
```powershell
fesa.exe <model.inp>
```
CLI는 input path 해석보다 먼저 argv token을 왼쪽에서 오른쪽으로 scan한다. 어떤 token이든
case-sensitive exact literal substring `--output`을 포함하면, `--output`, `--output=...`,
`--output-path`, prefix/suffix form을 모두 포함해 usage failure다. 이 failure는 input path
resolution, parsing, Analysis construction, derived-result path ownership, HDF5 candidate,
log creation/truncation, output finalization 전 exit code `2`로 끝난다. Stderr에는 ordered
diagnostic 하나만 쓴다.
```text
severity=error code=cli-usage argument_index=<uint64> argument=<escaped argv token> message=literal --output is not supported
```
여러 token이 `--output`을 포함해도 첫 matching token만 보고 위 diagnostic 하나만 낸다.
Literal `--output`에 대한 compatibility alias나 deprecation window는 없다. `--output`을
포함하지 않는 다른 unknown option은 별도 `unrecognized-option` usage diagnostic을 유지할 수
있다.
Input/output lexical identity는 다음 순서로 정의한다.
1. 단일 input path token이 relative path이면 invocation CWD를 lexical base로 붙인다.
2. `.`와 `..` component만 lexically normalize한다. Symlink, junction, short-name,
case-preserving target path는 resolve하지 않는다.
3. Normalized user-addressed final filename의 마지막 extension이 case-insensitive `.inp`가
아니면 input usage failure다.
4. `<stem>`은 마지막 extension 하나만 제거한 basename이다. 앞선 dot과 basename case는
보존한다. 예: `Beam.Model.INP` -> `Beam.Model_results.h5`,
`Beam.Model_log.txt`.
5. Derived outputs는 normalized user-addressed input path의 sibling이다.
- result final: `<input-directory>/<stem>_results.h5`
- log final/live file: `<input-directory>/<stem>_log.txt`
File-vs-directory collision과 same-derived-pair concurrency는 output ownership 문제다.
`<stem>_log.txt`가 directory 또는 truncate 불가능한 non-regular path이면 log create/open/
truncate failure다. `<stem>_results.h5`가 directory이면 HDF5 output collision으로 fail-closed
한다. 같은 derived pair를 목표로 하는 concurrent invocation은 same-directory
implementation-private lock을 nonblocking exclusive ownership으로 먼저 획득해야 한다. Lock
획득 실패 또는 lock path의 directory collision은 exit code `6`의 output-busy failure이며
best-effort fatal stderr diagnostic 하나를 시도하고 log/HDF5를 변경하지 않는다. Lock holder
하나만 log truncate, HDF5 candidate, final replace를 시도한다. Candidate filename은
public contract가 아니지만 반드시 same-directory,
implementation-private, exclusive-create collision-safe여야 하며 실패한 candidate는
authoritative output이 아니다.
HDF5 result lifecycle과 log lifecycle은 의도적으로 비대칭이다.
- `<stem>_log.txt`는 CLI usage validation, lexical output derivation, single-writer lock
획득 뒤 replace/truncate된다. Create/open/truncate failure는 Analysis 전 exit code `6`으로
abort하며, best-effort fatal stderr diagnostic 하나를 시도한다.
- Log write/flush failure는 즉시 abort한다. Solver는 retry, fallback, continue 또는 result
commit을 하지 않는다. Prior authoritative HDF5는 보존하고, 이미 flush된 live-log prefix는
rollback하지 않는다. Failed write 뒤 남은 partial trailing line은 authoritative iteration
record가 아니며 tooling은 LF-terminated complete record만 parsing한다.
- Log close는 successful analysis/recovery 뒤, 그리고 HDF5 candidate open/write/final replace
전 수행한다. Close failure는 result commit을 block하고 exit code `6`으로 끝낸다.
- `<stem>_results.h5`는 sibling candidate가 완전히 write, flush, close, reopen, schema-check된
뒤 atomic move/replace에 성공한 경우에만 authoritative다.
- HDF5 failure는 exit code `6`을 반환하고 가능한 경우 prior valid final을 보존하며 current-run
log를 rollback하지 않는다. HDF5 failure는 log close 성공 뒤 발생하므로 current log는 닫힌
current-run audit으로 남는다.
Newton iteration log는 UTF-8 no BOM, LF-terminated text file이다. Header, trailer, BOM, CRLF는
없다. Entered Newton iteration마다 physical line 하나만 기록하고, 각 line은 fixed field order의
TAB-separated `label=value` record다. Per-iteration stderr duplication은 정확히 0개다. 각
iteration record는 다음 iteration 진입 전 또는 return 전 flush되어야 한다.
Non-Newton procedure 또는 Newton iteration에 진입하기 전 끝난 controlled failure는 iteration
record를 fabricate하지 않는다. 같은 open/truncate/failure lifecycle을 적용하되 successful
non-Newton run의 `<stem>_log.txt` content는 zero-byte empty file이다. Pre-Newton controlled
failure도 entered iteration이 없으면 iteration record가 없는 log file만 남긴다.
고정 field order는 다음과 같다.
| order | label | value contract |
| ---: | --- | --- |
| 1 | `record` | literal `newton-iteration` |
| 2 | `schema` | literal `nsnr-log-v1` |
| 3 | `increment` | entered increment identity, `uint64` |
| 4 | `target_factor` | finite round-trip numeric load factor |
| 5 | `iteration` | entered Newton iteration identity `1..100` |
| 6 | `last_completed_stage` | enum stage completed before outcome; `none` allowed |
| 7 | `failing_stage` | `none` for completed gate records, otherwise failing stage enum |
| 8 | `residual_force_channel` | literal `residual_force` or `not-evaluated(reason)` |
| 9 | `residual_force_numerator_norm` | `||r_f^u||_inf` or `not-evaluated(reason)` |
| 10 | `residual_force_denominator_scale` | `max(||f_int,f^u||_inf,||f_ext,f^u||_inf)` or `not-evaluated(reason)` |
| 11 | `residual_force_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` |
| 12 | `residual_force_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` |
| 13 | `residual_force_threshold_unit` | `1`, `force`, or `not-evaluated(reason)` |
| 14 | `residual_force_pass` | `0`, `1`, or `not-evaluated(reason)` |
| 15 | `residual_moment_channel` | literal `residual_moment` or `not-evaluated(reason)` |
| 16 | `residual_moment_numerator_norm` | `||r_f^phi||_inf` or `not-evaluated(reason)` |
| 17 | `residual_moment_denominator_scale` | `max(||f_int,f^phi||_inf,||f_ext,f^phi||_inf)` or `not-evaluated(reason)` |
| 18 | `residual_moment_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` |
| 19 | `residual_moment_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` |
| 20 | `residual_moment_threshold_unit` | `1`, `force*length`, or `not-evaluated(reason)` |
| 21 | `residual_moment_pass` | `0`, `1`, or `not-evaluated(reason)` |
| 22 | `correction_translation_channel` | literal `correction_translation` or `not-evaluated(reason)` |
| 23 | `correction_translation_numerator_norm` | `||Delta u_f||_inf` fresh correction or `not-evaluated(reason)` |
| 24 | `correction_translation_denominator_scale` | `||Delta u_inc,f||_inf` from current trial relative to step start or `not-evaluated(reason)` |
| 25 | `correction_translation_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` |
| 26 | `correction_translation_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` |
| 27 | `correction_translation_threshold_unit` | `1`, `length`, or `not-evaluated(reason)` |
| 28 | `correction_translation_pass` | `0`, `1`, or `not-evaluated(reason)` |
| 29 | `correction_rotation_channel` | literal `correction_rotation` or `not-evaluated(reason)` |
| 30 | `correction_rotation_numerator_norm` | `||Delta phi_f||_inf` fresh correction or `not-evaluated(reason)` |
| 31 | `correction_rotation_denominator_scale` | `||Delta phi_inc,f||_inf` from current trial relative to step start or `not-evaluated(reason)` |
| 32 | `correction_rotation_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` |
| 33 | `correction_rotation_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` |
| 34 | `correction_rotation_threshold_unit` | `1`, `1`, or `not-evaluated(reason)` |
| 35 | `correction_rotation_pass` | `0`, `1`, or `not-evaluated(reason)` |
| 36 | `combined_pass` | logical AND of four pass fields, or `not-evaluated(reason)` |
| 37 | `transition` | `accept`, `update`, `fail`, or `not-evaluated(reason)` |
| 38 | `outcome` | `accepted`, `continue`, `nonconverged`, or `failed` |
| 39 | `diagnostic_code` | `none` or approved diagnostic code |
Completed gate record는 `failing_stage=none`이고 네 channel의 identity, numerator/norm,
denominator/scale, branch, typed threshold, pass를 모두 finite 또는 enum value로 노출한다.
Denominator가 exact zero이면 branch는 `zero-scale`이고 typed threshold는 residual force
`1e-3 force`, residual moment `1e-3 force*length`, correction translation `1e-3 length`,
correction rotation `1e-3 dimensionless`다. Denominator가 nonzero이면 branch는 `relative`이고
threshold는 dimensionless `1e-2`다. Empty free channel은 numerator와 denominator가 exact zero인
`zero-scale` branch로 평가한다.
Early failure record는 entered iteration 하나에 대응한다. 이미 계산된 earlier fields는 실제
finite value를 기록하고, 실패 stage 뒤의 모든 later field는 `not-evaluated(reason)`을 기록한다.
Not-evaluated field에 zero, pass `0`, pass `1`, fabricated denominator 또는 fabricated
threshold를 쓰면 안 된다. `last_completed_stage`와 `failing_stage`는 stage enum을 사용하며
recommended enum은 `iteration-entered`, `trial-state`, `load-boundary`, `residual`,
`tangent`, `factorization`, `correction`, `convergence-gates`, `update`, `recovery`,
`commit`, `log-write`, `log-flush`, `none`이다.
Numeric value는 locale-independent C-locale decimal point를 사용하고 finite IEEE-754 `double`
round-trip이 가능해야 한다. `NaN`, `Inf`, localized comma, thousands separator, raw whitespace는
금지한다. String value는 raw TAB/LF/CR/control byte/backslash를 포함할 수 없으며 `\\`, `\t`,
`\n`, `\r`, `\0`, `\xHH` escape를 사용한다. Record order는 increment, target factor,
iteration 순서로 deterministic해야 한다.
Schema version `1`의 모든 mandatory HDF5 dataset은 contiguous, uncompressed dataset이다.
Chunking, compression filter, extendible dataset, trial-history group은 이 release 계약에 없다.
### 7.2 Metadata and Common Dataset Attribute Rules
`results.h5` schema가 authoritative solver output이다. 실제 final filename은 Section 7.1의
`<stem>_results.h5`다. 모든 string은 UTF-8이다. 모든 physical real dataset은 IEEE-754
float64를 사용한다. Stable ID는 별도 명시가 없으면 unsigned 64-bit integer다.
`/metadata` group의 required attributes는 다음과 같다.
| attribute | required value or meaning |
| --- | --- |
| `schema_version` | `1` |
| `feature_id` | `nonlinear-static-newton-raphson` |
| `solver_version` | executing solver version string |
| `source_input_identity` | lexical normalized user-addressed input path and content identity string; symlink/junction target resolution 없음 |
| `unit_system_label` | `user-consistent-unspecified` |
| `coordinate_convention` | `global-cartesian; shell-local=fixed-initial-reference; positive-thickness=+zeta` |
| `analysis_procedure` | `nonlinear-static-full-newton` |
| `internal_formulation` | `FESA-MITC4-total-lagrangian` |
| `integration_rule` | `2x2x2-gauss; mitc4-edge-midpoint-shear` |
| `step_name` | `Step-1` |
| `frame_indexing` | `accepted-increment-order-zero-based` |
| `factor_zero_is_frame` | `0` |
| `factor_zero_load_factor` | `0.0` |
모든 numeric model/result dataset은 다음 required attributes를 가진다.
- `schema_version=1`
- `component_names`
- `component_unit_dimensions`
- `coordinate_system`
- `location`
Accepted-frame result dataset은 추가로 다음 attributes를 가진다.
- `step_name=Step-1`
- `frame_index=<uint64>`
- `increment_index=<uint64>`
- `load_factor=<float64>`
- `is_factor_one=<0|1>`
### 7.3 Model Datasets
| dataset path | shape and dtype | row identity / fields | required attributes and ordering |
| --- | --- | --- | --- |
| `/model/nodes` | `[node_count]` compound | `internal_node_id:uint64`, `instance_name:utf8`, `source_label:utf8`, `coordinates:float64[3]` | internal ID ascending; `coordinate_system=global-cartesian`, `component_unit_dimensions=length,length,length`, `location=nodal-reference` |
| `/model/elements` | `[element_count]` compound | `internal_element_id:uint64`, `instance_name:utf8`, `source_label:utf8`, `source_element_type:utf8`, `internal_formulation:utf8`, `node_internal_ids:uint64[4]`, `shell_section_internal_id:uint64`, `material_internal_id:uint64` | internal element ID ascending; `formulation=FESA-MITC4-total-lagrangian` |
| `/model/shell/materials` | `[material_count]` compound | `internal_material_id:uint64`, `name:utf8`, `E:float64`, `nu:float64` | declaration order; `component_unit_dimensions=force/length^2,1`, `location=model-material` |
| `/model/shell/sections` | `[section_count]` compound | `internal_section_id:uint64`, `source_file:utf8`, `source_line:uint64`, `source_elset:utf8`, `material_internal_id:uint64`, `thickness:float64` | declaration order; `component_unit_dimensions=length`, `location=model-shell-section`, `layering=centered-single-layer` |
| `/model/shell/nodal_director` | `[node_count,3]` float64 | `/model/nodes` row; `[D1,D2,D3]` | initial director; `coordinate_system=global-cartesian`, `location=nodal-initial-director`, units `1,1,1` |
| `/model/shell/nodal_frame` | `[node_count,3,3]` float64 | `/model/nodes` row; axis row `[A,B,D]`, global component column `[X,Y,Z]` | initial right-handed triad; `coordinate_system=global-cartesian`, `location=nodal-initial-frame`, units `1,1,1` |
| `/model/nodal_constraint_mask` | `[node_count,6]` uint8 | `/model/nodes` row; DOF `[UX,UY,UZ,URX,URY,URZ]` | `0=free`, `1=constrained`; constrained reaction comparison identity의 authority |
| `/model/prescribed_displacement_start` | `[node_count,6]` float64 | same row/DOF order | factor-zero start values; units `[length x3,1 x3]`, `load_factor=0.0` |
| `/model/prescribed_displacement_target` | `[node_count,6]` float64 | same row/DOF order | factor-one absolute target values; units `[length x3,1 x3]`, `load_factor=1.0` |
| `/model/shell/midsurface_locations` | `[4,2]` float64 | location rows `GP1..GP4`; columns `[XI,ETA]` | `coordinate_system=shell-natural`; `(-g,-g),(+g,-g),(+g,+g),(-g,+g)`, `g=1/sqrt(3)` |
| `/model/shell/section_positions` | `[3]` float64 | rows `[BOTTOM,MIDDLE,TOP]`; values `[-1,0,+1]` | `coordinate_system=shell-natural`; physical `z=t*zeta/2`; Abaqus section-point identity가 아님 |
### 7.4 Accepted Frame Table
Successful nonlinear run 뒤 `/steps/Step-1/accepted_frames`는 mandatory다.
| path | shape and dtype | fields | required meaning |
| --- | --- | --- | --- |
| `/steps/Step-1/accepted_frames` | `[frame_count]` compound | `frame_index:uint64`, `increment_index:uint64`, `load_factor:float64`, `iteration_count:uint64`, `is_factor_one:uint8` | committed increment마다 한 row; `frame_index`는 `<frame>` group name과 같음; load factor는 strictly increasing; 마지막 row는 `load_factor=1.0`, `is_factor_one=1` |
`frame_count`는 committed increment 수이며 successful run에서는 하나 이상이다. Factor-one
row는 정확히 하나다. Factor zero는 이 dataset에 row를 갖지 않고 `/frames/0` 특별 의미도
갖지 않는다.
### 7.5 Accepted Frame Result Datasets
`/steps/Step-1/accepted_frames.frame_index = <frame>`마다 아래 dataset들이
`/steps/Step-1/frames/<frame>/` 아래 mandatory다.
| quantity | exact dataset path | shape | row identity and component order | units / coordinates / location |
| --- | --- | --- | --- | --- |
| committed displacement and rotation vector | `/steps/Step-1/frames/<frame>/nodal/displacement` | `[node_count,6]` float64 | `/model/nodes` row; `[UX,UY,UZ,URX,URY,URZ]` | `[length,length,length,1,1,1]`; global Cartesian translations and fixed-initial global rotation-vector components; nodal |
| committed triad | `/steps/Step-1/frames/<frame>/nodal/triad` | `[node_count,3,3]` float64 | node row; axis row `[A,B,D]`, global component column `[X,Y,Z]` | dimensionless; global Cartesian; committed `Q`; director는 row `D` |
| committed director | `/steps/Step-1/frames/<frame>/nodal/director` | `[node_count,3]` float64 | node row; `[D1,D2,D3]` | dimensionless; global Cartesian; triad axis `D`와 같아야 함 |
| generalized internal force | `/steps/Step-1/frames/<frame>/nodal/generalized_internal_force` | `[node_count,6]` float64 | node row; `[FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3]` | `[force x3,force*length x3]`; work-conjugate to `[u,phi]`; nodal |
| generalized external force | `/steps/Step-1/frames/<frame>/nodal/generalized_external_force` | `[node_count,6]` float64 | node row; `[FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3]` | `[force x3,force*length x3]`; work-conjugate to `[u,phi]`; approved physical moment projection 후 fixed-global dead loads; nodal |
| generalized residual | `/steps/Step-1/frames/<frame>/nodal/generalized_residual` | `[node_count,6]` float64 | node row; `[RU1,RU2,RU3,RPHI1,RPHI2,RPHI3]` | `[force x3,force*length x3]`; nonlinear solution coordinate의 full assembled `f_int-f_ext`; nodal |
| reaction / physical residual projection | `/steps/Step-1/frames/<frame>/nodal/reaction` | `[node_count,6]` float64 | node row; `[RF1,RF2,RF3,RM1,RM2,RM3]` | `[force x3,force*length x3]`; global; constrained entry는 physical reaction, free entry는 same-state equilibrium evidence; rotational columns는 `J_l(phi)^(-T)` spatial moment conversion |
| shell local frame | `/steps/Step-1/frames/<frame>/element/shell/local_frame` | `[element_count,4,3,3]` float64 | element row, midsurface location row `GP1..GP4`, axis row `[E1,E2,E3]`, global component column `[X,Y,Z]` | dimensionless; physical recovery용 fixed-initial shell local frame; rotating Abaqus output frame이 아님 |
| generalized strain | `/steps/Step-1/frames/<frame>/element/shell/generalized_strain` | `[element_count,4,8]` float64 | element row, `GP1..GP4`; `[E11,E22,G12,K11,K22,K12,G13,G23]` | `[1,1,1,1/length,1/length,1/length,1,1]`; fixed-reference shell local; midsurface |
| section resultant | `/steps/Step-1/frames/<frame>/element/shell/section_resultant` | `[element_count,4,8]` float64 | element row, `GP1..GP4`; `[N11,N22,N12,M11,M22,M12,Q13,Q23]` | `[force/length x3,force x3,force/length x2]`; fixed-reference shell local; midsurface |
| in-plane stress | `/steps/Step-1/frames/<frame>/element/shell/stress` | `[element_count,4,3,3]` float64 | element row, `GP1..GP4`, section position `[BOTTOM,MIDDLE,TOP]`, component `[S11,S22,S12]` | `force/length^2`; fixed-reference shell local; direct bottom/middle/top evaluation |
| physical strain energy | `/steps/Step-1/frames/<frame>/global/energy` | `[1]` float64 | `[PHYSICAL_STRAIN_ENERGY]` | `force*length`; deterministic element reduction; numerical drilling stabilization 제외 |
| global equilibrium | `/steps/Step-1/frames/<frame>/global/equilibrium` | `[6]` float64 | `[FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3]` | `[force x3,force*length x3]`; global Cartesian; moment about global origin `[0,0,0]`, current force arms와 spatial physical nodal moments 사용 |
Trial Newton state, iteration history, line search, cutback attempt, damping, automatic
stabilization, numerical drilling stress, drilling energy ratio, `S33`, `S13`, `S23`,
nodal stress extrapolation, element-corner stress, averaged stress, Abaqus integration-point
number에 대한 HDF5 dataset은 만들지 않는다.
### 7.6 Diagnostics Dataset
`/diagnostics`는 mandatory이며 row가 0개일 수 있다.
| path | shape and dtype | fields | required meaning |
| --- | --- | --- | --- |
| `/diagnostics` | `[diagnostic_count]` compound | `severity:utf8`, `code:utf8`, `file:utf8`, `line:uint64`, `keyword:utf8`, `entity_identity:utf8`, `message:utf8` | CLI/input/model/solver/output deterministic diagnostics; ignored keyword warning도 success file에 보존 |
Diagnostic order는 source file declaration order, 1-based line, stable entity identity,
diagnostic code, discovery order를 순서대로 사용한다. Source가 없는 CLI/solver/output
diagnostic은 explicit empty source field를 사용한다.
### 7.7 Output Failure and Atomic Finalization
Writer는 log close 성공 뒤에만 final file과 같은 directory에 implementation-private temporary
HDF5 candidate를 만든다. Candidate는 metadata, model datasets, accepted-frame table, 모든
accepted-frame dataset, diagnostics를 모두 쓰고, shape, attribute, finite value, source
identity, row order를 검증한다. Checked HDF5 close와 read-only reopen/self-check가 성공한
뒤에만 final `<stem>_results.h5`를 replace/create한다. 실패한 candidate는 제거하거나
non-authoritative implementation-private artifact로만 남긴다. Controlled failure는 incomplete
final result를 노출하면 안 된다. HDF5 failure는 이미 닫힌 current-run log를 rollback하지 않는다.
## 8. FESA HDF5 to Reference CSV Comparison Mapping
Comparison tooling은 FESA `results.h5` schema와 exact read-only Abaqus CSV artifact만 읽는다.
CSV는 FESA output이 아니다. HDF5에서 추출한 deterministic CSV view는 debugging/reporting
보조물로만 둘 수 있다.
### 8.1 Declared Cases and Artifacts
| case id | role | exact path | comparison disposition |
| --- | --- | --- | --- |
| `shellnl-s4-final` | nonlinear input | `reference/shellNL/shellNL.inp` | required source input |
| `shellnl-s4-final` | displacement CSV | `reference/shellNL/shellNL displacements.csv` | required comparison |
| `shellnl-s4-final` | reaction CSV | `reference/shellNL/shellNL reactions.csv` | constrained nodes/components only required comparison |
| `shellnl-s4-final` | stress CSV | `reference/shellNL/shellNL stresses.csv` | optional read-only inspection/order evidence only |
| `shell-s4-linear-limit` | linear control input | `reference/shell/shell.inp` | existing linear MITC4 contract의 required regression input |
| `shell-s4-linear-limit` | displacement CSV | `reference/shell/shell displacements.csv` | required regression comparison |
| `shell-s4-linear-limit` | reaction CSV | `reference/shell/shell reactions.csv` | optional read-only inspection only |
| `shell-s4-linear-limit` | stress CSV | `reference/shell/shell stresses.csv` | optional read-only inspection/order evidence only |
Reference artifact file은 workflow에서 rename, rewrite, normalize, zero-clamp, repair,
regenerate하지 않는다.
### 8.2 Accepted-State and Frame Mapping
- `shellnl-s4-final`은 accepted factor-one HDF5 frame만 비교한다. 해당 frame은
`/steps/Step-1/accepted_frames`에서 `is_factor_one=1`이고 `load_factor=1.0`인 unique row다.
그 `frame_index`가 `/steps/Step-1/frames/<frame>`를 선택한다.
- Required `shellNL` CSV row는 exact `Frame` value
`Increment 10: Step Time = 1.000`만 가져야 하며, 이는 accepted factor-one state로
논리 매핑한다. Required row에 다른 `Frame` 값이 있으면 schema mismatch다.
- `shell-s4-linear-limit` CSV에는 `Frame` column이 없으며
`docs/linear-static-mitc4-shell/io.md`의 existing linear MITC4 final frame
`/steps/Step-1/frames/0`에 매핑한다.
- Trial Newton state, iteration log line, optional stress inventory row는 reference row가
아니다.
### 8.3 Nodal Displacement Projection
Required logical key는 다음과 같다.
```text
(case_id, accepted_state, canonical_instance_name, source_node_label, component)
```
두 case 모두 instance `PART-1-1`에서 node label `1..49`가 정확히 한 번씩 필요하다.
Instance matching은 case-insensitive로 수행하되 report에는 raw spelling을 보존한다.
| CSV column | comparison component | nonlinear HDF5 source | linear regression HDF5 source |
| --- | --- | --- | --- |
| `U-U1` | `U1` | `nodal/displacement` column `UX` | `nodal/displacement` column `UX` |
| `U-U2` | `U2` | `nodal/displacement` column `UY` | `nodal/displacement` column `UY` |
| `U-U3` | `U3` | `nodal/displacement` column `UZ` | `nodal/displacement` column `UZ` |
| `UR-UR1` | `UR1` | `nodal/displacement` column `URX` | `nodal/displacement` column `URX` |
| `UR-UR2` | `UR2` | `nodal/displacement` column `URY` | `nodal/displacement` column `URY` |
| `UR-UR3` | `UR3` | `nodal/displacement` column `URZ` | `nodal/displacement` column `URZ` |
`U1/U2/U3`는 blocking이다. `UR1/UR2/UR3`는 두 case 모두 warning-only다. UR warning
exceedance는 blocking verdict를 바꾸지 않는다.
### 8.4 Nonlinear Constrained Reaction Projection
Reaction comparison은 `shellnl-s4-final`에만 적용하며 input boundary mask의 constrained node
중 아래 24개 node에만 적용한다.
```text
1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33
```
승인 input에서 이 24개 node는 여섯 global DOF가 모두 constrained다. Comparator는 required
HDF5 reaction row eligibility를 CSV zero value가 아니라 `/model/nodal_constraint_mask`와
source node identity에서 도출한다.
| CSV columns | logical family | HDF5 source | disposition |
| --- | --- | --- | --- |
| `RF-RF1`, `RF-RF2` | `nonlinear.reaction_inplane_force` | factor-one `/nodal/reaction` columns `RF1,RF2` | blocking |
| `RF-RF3` | `nonlinear.reaction_transverse_force` | factor-one `/nodal/reaction` column `RF3` | blocking |
| `RM-RM1`, `RM-RM2` | `nonlinear.reaction_physical_moment` | factor-one `/nodal/reaction` columns `RM1,RM2`; `J_l(phi)^(-T)` 변환 뒤 spatial physical moment | blocking |
| `RM-RM3` | excluded | comparison projection 없음 | blocking 및 warning-only family에서 제외 |
Raw generalized rotation-coordinate residual column은 Abaqus `RM` CSV column과 직접 비교하지
않는다.
### 8.5 Comparison Families
External tolerance source는 정확히 `docs/TOLERANCE.md`다. 별도 absolute floor, `max(1,S)`
clamp, row averaging, source-order matching, component calibration, zero clamp는 허용하지
않는다.
| family id | case | components | required row count | units / coordinates | disposition |
| --- | --- | --- | ---: | --- | --- |
| `linear.translation` | `shell-s4-linear-limit` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking regression |
| `linear.rotation` | `shell-s4-linear-limit` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.translation` | `shellnl-s4-final` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking |
| `nonlinear.rotation` | `shellnl-s4-final` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.reaction_inplane_force` | `shellnl-s4-final` | `RF1,RF2` on constrained nodes | 48 | force / fixed-initial global plane | blocking |
| `nonlinear.reaction_transverse_force` | `shellnl-s4-final` | `RF3` on constrained nodes | 24 | force / fixed-initial global transverse | blocking |
| `nonlinear.reaction_physical_moment` | `shellnl-s4-final` | `RM1,RM2` on constrained nodes | 48 | force*length / global spatial | blocking |
Reference-model read-only scale audit value는 다음과 같다.
| family id | `S=max(abs(reference))` | `0.01*S` |
| --- | ---: | ---: |
| `linear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `linear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `nonlinear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.reaction_inplane_force` | `1.91663182` | `1.91663182e-2` |
| `nonlinear.reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` |
| `nonlinear.reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` |
### 8.6 Row Prechecks
아래 조건 중 하나라도 거짓이면 comparator는 tolerance 계산 전에 실패한다.
1. Exact declared input path와 required CSV path가 존재하고 readable이다.
2. Reference CSV header는 surrounding whitespace trim 뒤 필요한 column을 가진다.
3. `shellnl-s4-final` required row는 exact approved `Frame` value만 포함한다.
4. HDF5 metadata, model rows, accepted-frame table, factor-one frame, required result dataset이
문서화된 shape, component name, finite value를 가진다.
5. Wide CSV row는 이 문서의 component mapping으로 component row로 expand한다.
6. Required source wide key와 expanded component key는 unique하다. Duplicate reference 또는
HDF5 key는 실패다.
7. 각 declared family에서 FESA와 reference projected key set은 정확히 같아야 한다. Missing row와
extra row는 모두 실패다.
8. 모든 required numeric value는 finite다. Nonfinite HDF5 또는 CSV value는 tolerance 전 실패다.
9. `shellNL` reaction row는 constrained mask와 exact 24-node list에서 선택한다. Free-node CSV
row는 inventory only이며 zero reaction target으로 해석하지 않는다.
10. Required row를 omit, synthesize, average, substitute identity로 sort, normalize, zero-clamp,
repair하지 않는다.
### 8.7 Stress CSV Disposition
Optional stress CSV identity는 다음과 같다.
```text
(case_id, accepted_state, instance, element_label,
element_corner_node_label, section_surface, component)
```
현재 stress CSV는 element-corner node row와 `SPOS/SNEG` section surface에서 `S-S11`,
`S-S22`, `S-S33`, `S-S12`를 포함하며, 저장된 ascending element-label block `1..36` 순서를
갖는다. FESA HDF5는 `GP1..GP4`와 `BOTTOM/MIDDLE/TOP`에서 direct `[S11,S22,S12]`만 emit한다.
따라서 두 case의 stress CSV는 optional read-only inspection 및 order evidence only다. HDF5
comparison projection, `S33` synthesis, nodal extrapolation, corner averaging, Gauss-to-corner
matching, element-label-order identity는 없다.
## 9. Validation Rules
| validation area | required pass condition | failure class |
| --- | --- | --- |
| CLI usage | input path 정확히 하나; 어떤 argv token에도 exact literal substring `--output` 없음; matching 시 path resolution/parsing/Analysis/log/HDF5 전 `cli-usage` stderr diagnostic 정확히 1개 | usage, exit `2` |
| keyword inventory | keyword가 supported, explicit diagnostic의 unsupported, 또는 exact ignored-with-warning allowlist 중 하나 | input, exit `3` |
| syntax | ASCII keyword/data grammar, comma fields, finite numeric tokens, continuation/include 없음 | input, exit `3` |
| nesting/cardinality | part/assembly/instance/step이 닫힘; nonlinear procedure는 정확히 하나의 `NLGEOM=YES` step | input, exit `3` |
| source identity | scope 내 duplicate name/label 없음; 모든 reference resolved; instance identity unique | input, exit `3` |
| set expansion | explicit/generated set이 deterministic expand되고 하나의 supported scope/instance에 머묾 | input, exit `3` |
| shell element | only `S4/S4R`; 네 개의 distinct resolved nodes; mixed element model 없음; source type metadata 보존 | input/model, exit `3` 또는 `4` |
| material and section | single isotropic elastic material, centered homogeneous positive-thickness shell section, element마다 정확히 하나의 assignment | input/model, exit `3` 또는 `4` |
| geometry and coordinates | finite global coordinates, positive reference/current validity checks, required location마다 valid directors/triads/branches | model 또는 solver trial failure, exit `4` 또는 `5` |
| boundary | DOF `1..6`, resolved finite targets, factor-one absolute meaning, conflicting expanded value 없음 | input, exit `3` |
| load | resolved finite `CLOAD`, stable aggregation, fixed-global dead path, unsupported `DLOAD`/follower/distributed load 없음 | input/model, exit `3` 또는 `4` |
| aggregate moment | exact-zero case 또는 preprocessing 및 모든 entered trial에서 `rho_M<=1e-12` | model/solver, exit `4` 또는 `5` |
| nonlinear static data | 네 positive finite values, endpoint `1.0`, fixed increment sequence with final exact factor one | input, exit `3` |
| Newton iteration | iteration identity `1..100`; iteration `100` acceptance 가능; iteration `101` 없음; line search/cutback/retry/fallback 없음 | solver, exit `5` |
| convergence channels | residual force, residual moment, correction translation, correction rotation이 모두 inclusive `<=` rule 또는 typed zero-scale threshold 통과 | solver, exit `5` |
| nonfinite data | required residual, tangent, correction, state, load, recovery, output value가 acceptance 전 finite | solver/output, exit `5` 또는 `6` |
| commit/rollback | complete converged candidate만 commit; failure는 prior committed state와 prior authoritative final HDF5 보존 | solver/output, exit `5` 또는 `6` |
| HDF5 schema | exact paths, shapes, attributes, schema version, row identities, finite values, accepted-frame table, diagnostics; final replace는 log close success 뒤에만 허용 | output, exit `6` |
| log | UTF-8 no BOM, LF, TAB-separated fixed `label=value` schema; entered Newton iteration마다 record 하나; no per-iteration stderr duplication; no-Newton procedure는 zero-byte empty log; open/write/flush/close fail-closed | output, exit `6` |
| reference rows | exact required artifacts, headers, row keys, component keys, finite values, factor-one frame mapping | reference precheck |
| tolerance | exact `docs/TOLERANCE.md` family-scale row/RMS policy; blocking/warning disposition 보존 | reference verification |
Downstream test가 다뤄야 하는 approved diagnostic code는 다음을 포함한다.
| code | class | meaning |
| --- | --- | --- |
| `cli-usage` | usage/2 | argv token이 exact literal substring `--output`을 포함하며 pre-input/pre-log/pre-output failure 하나를 stderr에 기록 |
| `unrecognized-option` | usage/2 | `--output` substring을 포함하지 않는 다른 unsupported option |
| `malformed-keyword` | input/3 | keyword 또는 parameter grammar invalid |
| `invalid-keyword-location` | input/3 | keyword가 approved scope 밖에 위치 |
| `invalid-keyword-parameter` | input/3 | parameter missing, duplicate, empty 또는 subset 밖 |
| `unsupported-keyword` | input/3 | `*INCLUDE` 포함 approved subset 밖 keyword |
| `unsupported-distributed-load` | input/3 | `*DLOAD`, pressure, gravity, body, edge, follower load 요청 |
| `duplicate-entity` | input/3 | source identity가 scope 안에서 duplicate |
| `unresolved-reference` | input/3 | connectivity, set, instance, section, material, load, boundary target dangling |
| `unsupported-element-formulation` | input/3 | shell feature에서 source element type이 `S4` 또는 `S4R`가 아님 |
| `unsupported-mixed-element-model` | input/3 | shell과 non-shell product semantics 혼합 |
| `invalid-shell-connectivity` | input/3 | shell connectivity arity, duplicate node 또는 resolved node identity invalid |
| `unsupported-shell-section-option` | input/3 | composite/layer/offset/orientation/variable-thickness section 의미 등장 |
| `invalid-shell-material` | model/4 | material value가 finite `E,nu` bound 위반 |
| `invalid-shell-thickness` | model/4 | shell thickness nonfinite 또는 nonpositive |
| `invalid-shell-geometry` | model/4 | shell geometry, reference Jacobian 또는 topology invalid |
| `opposed-incident-normal` | model/4 | averaging 전 incident normal pair가 nonpositive |
| `invalid-shell-director` | model/4 | nodal/interpolated director, triad 또는 branch validity 실패 |
| `invalid-shell-jacobian` | model/4 | required Gauss/tying/center/recovery point의 basis/Jacobian invalid |
| `unsupported-drilling-load` | model/4 또는 solver/5 | aggregate nodal moment가 current-director admissibility 위반 |
| `invalid-nonlinear-static-data` | input/3 | `*STATIC` row arity, finite/positive check 또는 endpoint-one identity 실패 |
| `unsupported-analysis-procedure` | input/3 | supported nonlinear static source step으로 매핑되지 않음 |
| `nonfinite-newton-data` | solver/5 | required residual, tangent, correction 또는 trial state nonfinite |
| `tangent-factorization-failed` | solver/5 | entered iteration의 fresh tangent factorization 실패 |
| `correction-solve-failed` | solver/5 | fresh Newton correction solve 실패 |
| `nonlinear-nonconvergence` | solver/5 | iteration `100` 완료 후 네 convergence channel이 모두 통과하지 않음 |
| `invalid-accepted-state` | solver/5 | converged candidate recovery/state identity가 commit 전 실패 |
| `log-output-failure` | output/6 | required live log create/open/truncate, write, flush 또는 close 실패 |
| `output-busy` | output/6 | same derived pair single-writer lock을 획득하지 못했거나 lock path collision 발생 |
| `hdf5-output-failure` | output/6 | candidate HDF5 write, schema validation 또는 atomic finalization 실패 |
## 10. Open Issues and Downstream Handoff
Open issues blocking Implementation Planning: 없음.
Downstream handoff to Implementation Planning Agent through Coordinator:
- Public CLI/output naming migration을 보존한다: `fesa.exe <model.inp>`,
lexical sibling `<stem>_results.h5`, `<stem>_log.txt`, 그리고 exact literal substring
`--output`을 포함하는 모든 argv token의 pre-input/pre-log/pre-output exit `2`와 정확히
하나의 `cli-usage` stderr diagnostic.
- Supported/unsupported/ignored keyword row와 nonlinear `*STATIC` rule을 parser
acceptance/rejection test로 변환한다.
- Stored reference grammar인 `*Output, field, variable=PRESELECT`와
`*Output, history, variable=PRESELECT`를 duplicate/extra parameter 없이
`ignored-with-warning`으로 수용하고, output request가 FESA output을 바꾸지 못함을 test한다.
- `NLGEOM=YES`가 nonlinear procedure를 선택하고 `shell` `NLGEOM=NO` case가 기존 linear
MITC4 contract의 regression으로 남는지 test한다.
- HDF5 schema version `1`을 위 accepted-frame schema 그대로 구현한다. Factor-zero non-frame
handling, unique factor-one frame selection, triad/director projection, no
compression/chunking, no trial-state HDF5 history를 포함한다.
- 비대칭 lifecycle을 보존한다. Log는 usage validation, lexical path derivation, single-writer
lock 뒤 live current-run audit이고, log create/open/truncate는 Analysis 전 abort, write/flush는
즉시 abort, close failure는 HDF5 commit을 block한다. HDF5 final은 log close와 candidate
self-check 성공 뒤에만 replace하며 failure는 prior valid final과 current log를 손상하지 않는다.
- Newton log parser/schema test는 UTF-8 no BOM, LF, physical TAB-separated fixed
`label=value` field order, finite round-trip numerics, escaping, completed-gate four-channel
metrics, early-failure `not-evaluated(reason)`, no-Newton zero-byte log, zero per-iteration
stderr duplication, flush-before-next/return을 포함한다.
- Exact CSV paths, trimmed headers, exact `shellNL` `Frame` value, source node/component
identity, constrained reaction mask, missing/extra/duplicate rows, nonfinite values를
tolerance 전에 precheck한다.
- Declared family에는 `docs/TOLERANCE.md`만 적용한다. `U`는 blocking, `UR`은 warning-only,
`RF1/RF2`, `RF3`, physical spatial `RM1/RM2`는 blocking으로 유지하고 `RM3`와 모든 stress
CSV value는 제외한다.
- Optional stress CSV는 read-only inventory/order evidence only로 유지한다. Nodal stress
extrapolation, corner averaging, `S33` synthesis, element-label-order matching을 추가하지
않는다.
- Final HDF5 projection, parser diagnostics, schema tests, reference comparison tests,
log lifecycle tests는 Coordinator를 통해 전달한다. 이 문서만으로 parser, C++ API,
reference artifact, comparison-result, physics, release 변경을 승인하지 않는다.
@@ -0,0 +1,188 @@
# Nonlinear Static Newton-Raphson 수치 검토
## 1. Metadata and source formulation
- feature_id: `nonlinear-static-newton-raphson`
- source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md`
- source_formulation_status: `ready-for-numerical-review`
- source_formulation_sha256: `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`
- source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirements_sha256: `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_research_sha256: `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`
- repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/TOLERANCE.md`
- related_linear_contracts: `docs/linear-static-mitc4-shell/numerical-review.md`,
`docs/linear-static-mitc4-shell/reference-model.md`
- status: `pass-for-io-definition`
- owner_agent: `numerical-review-agent`
- date: `2026-08-23`
이 검토는 정식화를 수학 및 수치 알고리즘 계약으로만 검토했다. C++ API, HDF5 schema,
implementation plan, reference solver 실행, reference artifact 생성/수정은 수행하지 않았다.
## 2. Review Verdict
- verdict: `pass-for-io-definition`
- reason: 승인 정식화는 fixed-initial-reference Total Lagrangian MITC4, finite rotation
state, nonlinear `24 -> 20` map, objective drilling, fixed-global load work,
same-trial residual/tangent, Full Newton convergence, recovery와 state commit/rollback
의미를 구현 가능한 수치 계약으로 닫고 있다. 차원, 부호, DOF 순서, 적분, reaction
의미 또는 reference identity와 충돌하는 blocking defect는 확인되지 않았다.
- reference readiness: `reference/shellNL` 및 `reference/shell`의 선언 파일과 CSV는
읽을 수 있고 row identity/precheck/tolerance 계약을 정의할 수 있다.
- boundary: 이 verdict는 I/O Definition 진입 허가이며 implementation, reference comparison
pass, physics evaluation 또는 release readiness 승인이 아니다.
`reference/shellNL`은 `nlgeom=YES`와 factor-one final frame을 갖는 저장 reference로 사용할 수
있지만, 주요 `U3`와 stress 값은 선형 `reference/shell`과 거의 같다. 관찰된 nonlinear 신호는
주로 약한 in-plane coupling이다(`RF1/RF2` 최대 약 `1.9166`, `U1/U2` 최대 약
`1.29e-11`). 따라서 이 CSV 세트만으로 finite-rotation objectivity, exact tangent,
rollback 또는 큰 변위 benchmark를 통과했다고 판단하지 않는다. 해당 항목은 아래의
blocking internal tests로 분리한다.
## 3. Critical Findings
### Confirmed defects
없음. Formulation Agent 또는 Research Agent로 즉시 되돌릴 confirmed numerical defect는 없다.
### Numerical risks requiring downstream evidence
- `shellNL`의 stored reference는 geometric nonlinearity가 켜진 최종 상태 비교에는 충분하지만
response amplitude가 작아 finite-rotation/tangent/objectivity 검증을 대신하지 못한다.
- Abaqus stress CSV는 `(instance, element label, element-corner node label,
section point, component)` identity로 완전하지만 FESA의 approved Gauss-location direct
bottom/middle/top recovery와 location이 다르다. Current stored order는 element label
`1..36` ascending block이며 이를 바꾸지 않는다. Nodal extrapolation/averaging을 만들지
않고 stress CSV는 comparison family에서 제외한다.
- External `UR` comparison은 기존 MITC4 정책에 따라 `warning-only`다. Rotation/director
correctness는 `Q`, `d`, branch, objectivity invariant tests에서 blocking으로 확인해야 한다.
### Open questions
현재 I/O Definition 진입을 막는 open question은 없다. Large-response public benchmark,
MMS, broader locking/distortion characterization은 유용하지만 승인된 Stage 4 pass 조건은 아니다.
## 4. Numerical Risk Assessment
| risk label | assessment | required control / downstream evidence |
| --- | --- | --- |
| `rigid_body_modes` | 물리/internal/drill energy가 finite rigid motion에서 objective해야 하며 pure drill만 regularized 되어야 한다. | finite rigid translation/rotation superposition에서 strain, stress, physical energy, drill gamma, residual을 blocking invariant로 확인한다. |
| `patch_test` | Green-Lagrange direct strain과 MITC tied shear가 같은 trial geometry와 같은 first/second variation을 써야 한다. | membrane, bending, twist, transverse-shear patch를 linear limit와 finite valid trial perturbation에서 각각 확인한다. |
| `symmetry` | applied nodal moment가 없으면 physical/drill tangent는 exact arithmetic에서 symmetric이다. Fixed-spatial moment work tangent는 일반적으로 nonsymmetric이다. | no-moment case만 scaled symmetry check 대상으로 두고, moment case를 임의 symmetrization하지 않는다. |
| `positive_definiteness` | nonlinear tangent는 load state, compression, near-buckling에서 indefinite일 수 있다. Positive definiteness는 일반 gate가 아니다. | stress-free constrained linear limit의 nonsingular solve와 singular negative case를 분리하고, factorization failure를 숨기지 않는다. |
| `hourglass` | S4/S4R 모두 `2 x 2 x 2` full integration이므로 one-point reduced hourglass path는 승인 범위 밖이다. | source type으로 reduced/selective integration 또는 hourglass stabilization을 선택하지 않는 unit/integration test가 필요하다. |
| `shear_locking` | MITC shear tying은 transverse-shear locking을 완화하지만 모든 thin-shell mesh에서 locking-free를 보장하지 않는다. | patch/reference evidence를 blocking으로 두고 broader thin/thick convergence는 nonblocking characterization으로 둔다. |
| `volumetric_locking` | approved plane-stress shell, St. Venant-Kirchhoff-type material restriction에서는 `N/A`다. | 3-D incompressible material 또는 `nu >= 0.5` 의미로 확장하지 않는다. |
| `membrane_locking` | original-style MITC4는 curved/distorted nonlinear meshes에서 membrane locking 위험이 남는다. | known limitation으로 기록한다. MITC4+ 성능 또는 Abaqus S4/S4R internal equivalence를 주장하지 않는다. |
| `distortion` | positive Jacobian이라도 severe distortion/warpage는 conditioning과 stress accuracy를 악화할 수 있다. | 모든 Gauss/tying/center/recovery location의 finite, positive predicate를 fail-closed로 적용한다. 추가 quality cutoff는 요구하지 않는다. |
| `singular_jacobian` | `J0 <= 0`, `j <= 0`, invalid reciprocal basis, invalid polar stretch는 residual/tangent를 무효화한다. | failed location을 omit/average/clamp/repair하지 않고 model/trial failure로 처리한다. |
| `conditioning` | thin shells, small fixed drill scale, near-mechanism constraints는 Kff conditioning을 악화시킬 수 있다. | scaled matrix diagnostics만 사용하고 solver regularization/fallback으로 singularity를 숨기지 않는다. |
| `convergence` | Full Newton은 same-trial consistent tangent에 의존한다. No line search/cutback이므로 difficult step은 deterministic nonconvergence가 될 수 있다. | NSNR-069/070 four-channel gates, iteration `1..100`, nonfinite rejection, no hidden retry를 integration tests로 고정한다. |
## 5. Consistency Checks
| check | result | evidence |
| --- | --- | --- |
| units and dimensions | `pass` | Translation/force, rotation/moment, stress/resultant dimensions are separated. Convergence channels keep force, force-length, length and dimensionless rotation separate. |
| signs and residual convention | `pass` | Global residual is `f_int - f_ext`; constrained full residual is reaction and free residual is equilibrium evidence. Fixed-global dead force has no configuration derivative. |
| DOF ordering and free/constrained assumptions | `pass` | Per-node global order is `[UX, UY, UZ, URX, URY, URZ]`; Newton solve uses stable free coordinates with `Delta q_c = 0`. Valid `0 x 0` free system is trivial success. |
| coordinate transforms | `pass` | `Q=Exp(phi^)Q0`, left-spatial update, `J_l` variation, physical swing map and spatial reaction moment conversion are explicitly defined. |
| kinematic operator / B matrix | `pass` | Green-Lagrange strain, MITC shear projection and both first/second variations use the same trial identity. |
| constitutive contract | `pass` | Constant symmetric `C5` maps engineering Green-Lagrange strain to second Piola-Kirchhoff stress; no material history is introduced. |
| Jacobian rules | `pass` | Fixed reference `J0` is integration measure; current `j` and `det F_c` are validity checks. Failed locations are not skipped. |
| integration policy | `pass` | S4 and S4R share four midsurface Gauss points times two thickness points; reduced/selective integration is prohibited. |
| residual/tangent consistency | `pass` | Complete tangent includes material, geometric, map-Hessian, objective drill Hessian and fixed-spatial moment work derivative terms. |
| tangent symmetry expectation | `pass` | Symmetric only for conservative no-applied-moment case; generally nonsymmetric moment tangent must remain unsymmetrized. |
| output locations | `pass-with-handoff` | Nodal U/UR/RF/RM and shell stress/resultant logical quantities are defined; exact HDF5 projection remains I/O-owned. Current nodal SPOS/SNEG stress CSV는 Gauss direct recovery와 일대일 대응하지 않으므로 external numerical comparison은 N/A다. |
## 6. Verification Readiness
### Blocking internal numerical tests
Implementation Planning shall carry these as feature-required tests before any reference-comparison success claim:
Mixed translation/rotation 검사는 fixed-reference characteristic length
`L=max(||X_I-X_J||)`와 node block `Dq=diag(L I3,I3)`를 사용한다. Tangent test direction은
`||p_hat||inf=1`, perturbation은 `q +/- h Dq p_hat`으로 두고
`h={1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7}` 전부를 검사한다. Roundoff plateau 전
최소 두 interval에서 centered-difference observed order `>=1.5`이고 한 interior point가
scaled error `<=1e-6`여야 한다. Single-`h` 우연 통과는 허용하지 않는다.
1. Linear limit: at stress-free `q=0`, nonlinear element residual/tangent/recovery reduce to approved linear MITC4 signs, `2 x 2 x 2` integration and physical/drill split.
2. Rotation state invariants: every committed/trial `Q` satisfies `||Q^T Q-I||_F <= 1e-12`,
`|det(Q)-1| <= 1e-12`, and `d=Q e3`. Global/swing/twist `pi` branch angular margin은
`sqrt(epsilon_double)`, 약 `1.4901161193847656e-8` rad보다 커야 한다.
3. Tangent directional derivative: compare `Dq^T K_T Dq p_hat` with the central
residual derivative under the schedule above in separated force and moment channels.
Zero analytical directions require exact-zero construction and scaled absolute error
`<=1e-10`; nonfinite metric은 허용하지 않는다.
4. No-moment tangent symmetry: after work-conjugate congruence `Dq^T K_T Dq`, no-applied-moment
tangent scaled Frobenius symmetry error `<=1e-12`; applied fixed-spatial moment cases are checked for
exact derivative consistency, not symmetry.
5. Finite rigid objectivity: superposed finite rigid motion leaves physical strain/stress,
physical energy, drill gamma/energy and internal residual at scaled `<=1e-10` levels.
6. Patch/sign recovery: membrane, bending, twist and transverse shear patch states preserve
component order and bottom/top stress signs.
Analytical strain/resultant/stress error is relative `<=1e-9`.
7. Load and boundary path: fixed-global force/moment source identity, `rho_M <= 1e-12`
rejection/projection, absolute factor-one boundary path and zero constrained Newton
correction are tested independently.
8. Newton lifecycle: factor identities use ordinal `j*h` values strictly below one,
followed by one exact assigned `1.0`; cumulative `lambda += h`와 tolerance-based duplicate
endpoint는 금지한다. For `shellNL` the expected intended factors are `0.1, 0.2, ...,
1.0`. Iterations are `1..100`, pass at `100` is allowed, iteration `101` is forbidden.
9. Convergence gates: NSNR-069/070 four-channel inclusive `<=` rules, typed zero-scale
`1e-3` thresholds and nonfinite rejection are tested without adding energy or line-search gates.
10. Commit/rollback and determinism: failed trial, recovery, solve or output does not mutate
the prior committed state or prior authoritative final result; row/diagnostic order is stable.
### Downstream reference comparisons
The required stored-reference cases and logical quantities are defined in
`docs/nonlinear-static-newton-raphson/reference-model.md`.
- `shellnl-s4-final` is the primary nonlinear external reference at accepted factor one.
- `shell-s4-linear-limit` is the read-only linear-limit/reference-identity regression for the
same S4 mesh. Current stress element-label ordering is inventoried without becoming a
comparison quantity.
External comparison uses only accepted-state quantities and `docs/TOLERANCE.md`. Missing,
extra, duplicate or nonfinite required rows fail before tolerance. The comparison result itself
is Implementation Agent ownership.
## 7. Required Revisions
### Formulation Agent
None before I/O Definition. The current formulation is numerically sufficient for the I/O
contract. Current source element/node SPOS/SNEG stress CSV에 맞추기 위한 extrapolation,
averaging 또는 새 recovery 의미는 추가하지 않는다.
### Research Agent
None before I/O Definition. Public large-response benchmarks and shell MMS remain useful future
evidence, but the current Stage 4 gate does not require another research pass.
### I/O Definition Agent
Define parser/semantic/HDF5/log projection for the logical quantities and row identities in
`reference-model.md`. Preserve the split between blocking internal nonlinear tests and external
stored reference comparison; do not claim Abaqus internal equivalence.
## 8. Downstream Handoff
For I/O Definition Agent through Coordinator:
- Use accepted factor-one frames only for external reference comparison; trial Newton states are
not reference quantities.
- Preserve required source identity: case, accepted state, instance, node label and component.
Stress artifact의 element/node/section identity와 stored element-label order는 read-only
inventory로 보존하되 FESA comparison row로 합성하지 않는다.
- Keep `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. For `shellNL`, compare
constrained `RF1/RF2`, `RF3`, and spatial physical `RM1/RM2` in the separate blocking
families from `reference-model.md`. `RM3`와 stress는 comparison에서 제외한다.
- Apply `docs/TOLERANCE.md` exactly; do not add an independent absolute floor, row averaging,
source-order matching, or calibration gate.
- Treat `shellNL` as weak but valid nonlinear final-state reference evidence; require the
blocking internal tests above for tangent/objectivity/rollback/finite-rotation correctness.
@@ -0,0 +1,237 @@
# Nonlinear Static Newton-Raphson Reference Model
## 1. Metadata
- feature_id: `nonlinear-static-newton-raphson`
- source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md`
- source_numerical_review: `docs/nonlinear-static-newton-raphson/numerical-review.md`
- status: `pass-for-io-definition`
- owner_agent: `numerical-review-agent`
- date: `2026-08-23`
- artifact_policy: `read-only-existing-files`
- tolerance_policy: `docs/TOLERANCE.md`
이 문서는 logical reference quantity, source identity, component matching, row precheck와
blocking/warning 분류만 정의한다. 최종 HDF5 dataset projection은 I/O Definition Agent 소유다.
## 2. Reference Acceptance Scope
Required scope는 두 stored case다.
- `shellnl-s4-final`: `nlgeom=YES` nonlinear static S4 final accepted state를 비교하는
primary external reference case.
- `shell-s4-linear-limit`: 같은 S4 mesh의 `nlgeom=NO` read-only linear-limit/reference-identity
regression case. 이 case는 nonlinear response evidence가 아니며, 현재 stress CSV의 element-label
ordering을 row-order matching으로 사용하지 않는다.
`shellNL`은 final-state reference comparison에는 충분하지만 weak nonlinear response다. Dominant
`U3`/stress 값이 linear case와 거의 같으므로 finite-rotation objectivity, consistent tangent,
commit/rollback과 convergence lifecycle은 `numerical-review.md`의 blocking internal tests로 검증한다.
## 3. Reference Case Inventory with exact input and required CSV paths
| case id | artifact role | required comparison artifact | exact path | observed status |
| --- | --- | --- | --- | --- |
| `shellnl-s4-final` | nonlinear input | yes | `reference/shellNL/shellNL.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=YES` |
| `shellnl-s4-final` | displacement reference | yes | `reference/shellNL/shellNL displacements.csv` | 49 finite unique node rows; one factor-one Frame |
| `shellnl-s4-final` | reaction reference | yes | `reference/shellNL/shellNL reactions.csv` | 49 finite unique node rows; one factor-one Frame |
| `shellnl-s4-final` | stress review evidence | no | `reference/shellNL/shellNL stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks |
| `shell-s4-linear-limit` | linear control input | yes | `reference/shell/shell.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=NO` |
| `shell-s4-linear-limit` | displacement reference | yes | `reference/shell/shell displacements.csv` | 49 finite unique node rows; no `Frame` column |
| `shell-s4-linear-limit` | reaction review evidence | no | `reference/shell/shell reactions.csv` | 49 finite unique node rows |
| `shell-s4-linear-limit` | stress review evidence | no | `reference/shell/shell stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks |
`required comparison artifact=no`인 파일도 이번 review에서 읽기 가능성, row identity,
finite values와 current ordering을 확인했다. 그러나 해당 파일은 missing-required-artifact
판정이나 tolerance family를 만들지 않는다.
두 `.inp`는 같은 node/element/connectivity, material/section, instance, boundary와 center-node
`CLOAD`를 사용한다. Text 차이는 heading identity, `NLGEOM=NO -> YES`, 그리고 `*STATIC`
data `1.,1.,1e-05,1. -> 0.1,1.,0.001,0.1`이다. 따라서 `shellNL`은 실제 nonlinear
selector와 승인된 fixed increment `0.1`을 갖지만, 두 deck 차이를 오직 `NLGEOM` 하나의
isolated effect라고 표현하지 않는다.
Read-only SHA-256 observations:
| path | SHA-256 |
| --- | --- |
| `reference/shellNL/shellNL.inp` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| `reference/shellNL/shellNL displacements.csv` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| `reference/shell/shell reactions.csv` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` |
| `reference/shell/shell stresses.csv` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` |
## 4. Source Identity and Component Contract
### 4.1 Accepted-state identity
- Abaqus identifiers are case-insensitive semantic identities. Input spelling
`Part-1-1` and CSV spelling `PART-1-1` match as one instance while original text is
retained in artifacts and reports; no file or row is rewritten.
- `shellnl-s4-final` rows require exact CSV `Frame` value
`Increment 10: Step Time = 1.000`, mapped logically to the accepted factor-one state.
- `shell-s4-linear-limit` rows have no `Frame` column and map to the single final static state.
- Row order is never a matching identity. It may only be used for deterministic reporting after
source keys are matched.
### 4.2 Nodal displacement contract
Required mapping is `U-U1/U-U2/U-U3 -> U1/U2/U3` and
`UR-UR1/UR-UR2/UR-UR3 -> UR1/UR2/UR3`. U is global length; UR is the
dimensionless fixed-initial global rotation-vector output. Logical key is
```text
(case_id, accepted_state, canonical_instance_name, source_node_label, component)
```
Both cases require source node labels `1..49` exactly once. U components form one
blocking translation family and UR components form one warning-only rotation family,
preserving the project MITC4 classification.
### 4.3 Nonlinear reaction contract
Reaction comparison applies only to `shellnl-s4-final` and only to the input boundary
`Set-2` nodes:
```text
1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33
```
All six global components are constrained at these 24 nodes. Other CSV node rows remain
part of file/schema/finite inventory but are not numerical reaction rows: FESA free entries
are equilibrium residual evidence, not Abaqus free-node zero reactions.
| CSV components | logical quantity | FESA meaning | disposition |
| --- | --- | --- | --- |
| `RF-RF1`, `RF-RF2` | fixed-initial shell-plane reaction force | constrained translational full residual, global force | blocking family |
| `RF-RF3` | fixed-initial transverse reaction force | constrained translational full residual, global force | blocking family |
| `RM-RM1`, `RM-RM2` | tangent-plane spatial reaction moment | `J_l(phi)^(-T)` conversion of the constrained generalized reaction, global force-length | blocking family |
| `RM-RM3` | director/drilling-axis reaction review value | stabilization-dependent; no physical external equivalence target | excluded |
In-plane and transverse force are distinct model-fixed logical projections and therefore
use distinct families. Raw generalized rotation-coordinate residual is not matched directly
to the CSV `RM` value.
### 4.4 Stress review identity and comparison exclusion
Stress rows have read-only identity
```text
(case_id, accepted_state, instance, element label,
element-corner node label, SPOS/SNEG section surface, component)
```
Every current element has its four connectivity nodes and one `SPOS` plus one `SNEG`
row per node. The files are ordered in contiguous ascending element-label blocks `1..36`;
this exact artifact order is retained and no node/surface secondary reorder is applied.
The identity is nevertheless not the approved FESA recovery location: FESA emits direct
`[S11,S22,S12]` at four midsurface Gauss locations and bottom/middle/top positions, without
nodal extrapolation or averaging, and does not emit `S33`. Consequently no stress column
forms a blocking or warning-only comparison family. Stress files remain optional read-only
review evidence only.
### 4.5 Comparison families
| family id | components and source set | row count | units / coordinates | disposition |
| --- | --- | ---: | --- | --- |
| `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking regression |
| `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking |
| `nonlinear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.reaction_inplane_force` | `RF1,RF2`, 24 constrained nodes | 48 | force / fixed-initial global plane | blocking |
| `nonlinear.reaction_transverse_force` | `RF3`, 24 constrained nodes | 24 | force / fixed-initial global transverse | blocking |
| `nonlinear.reaction_physical_moment` | `RM1,RM2`, 24 constrained nodes | 48 | force-length / global spatial | blocking |
## 5. Row Prechecks
Before tolerance, the comparator shall fail the affected comparison if any required condition
below is false.
1. Exact declared input path and every `required comparison artifact=yes` CSV path for the
case exist and are readable.
2. Required headers are present after trimming surrounding whitespace from header names.
3. `shellnl-s4-final` contains only the exact required `Frame` value for required rows.
4. Wide CSV rows expand to component rows using the component contract in Section 4.
5. Required source row keys are unique. Duplicate wide keys or duplicate expanded component keys fail.
6. Displacement projection requires all 49 source nodes and declared components. Nonlinear
reaction projection derives the exact 24-node/component set from the input constraint mask;
it does not infer reaction identity from CSV zero values.
7. FESA and reference required projected row-key sets are exactly equal: missing and extra rows
both fail.
8. Every required numeric value is finite. Nonfinite required FESA or CSV value fails before tolerance.
9. Optional stress inventory uses `(instance, element label, node label, section point)` and verifies
the current ascending element-label blocks, connectivity nodes and SPOS/SNEG pair. This inspection
does not create a stress equality gate.
10. Required rows are not omitted, synthesized, normalized, averaged, sorted into a different identity,
zero-clamped, or repaired.
Observed read-only inventory used for this contract:
| CSV | observed wide key columns | duplicate wide keys | nonfinite observed values | observed element labels |
| --- | --- | ---: | ---: | --- |
| `reference/shellNL/shellNL displacements.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shellNL/shellNL reactions.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shellNL/shellNL stresses.csv` | `Frame`, `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` |
| `reference/shell/shell displacements.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shell/shell reactions.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shell/shell stresses.csv` | `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` |
## 6. Tolerance and Blocking/Warning Policy
Use exactly `docs/TOLERANCE.md` for every external reference family. This report does not invent
or calibrate tolerance values.
For each comparison family:
- `S = max(abs(reference_value_i))`, using reference values only.
- near-zero band is `0.01*S`.
- if `abs(reference_value_i) <= 0.01*S`, row passes iff `abs(fesa-reference) <= 0.01*S`.
- otherwise row passes iff relative error `<= 0.05`.
- family relative RMS is `RMS(error)/S <= 0.01`.
- no independent absolute-error floor, `max(1, S)` clamp, row omission, averaging, or zero clamp is allowed.
- if `S = 0`, the family passes only when all FESA values are exactly zero; otherwise report
`zero-reference-scale-nonzero-error`.
Families are separated by the exact case/logical quantities in Section 4.5. Current
reference-only scales provide a reproducible reader/comparator audit:
| family | `S` | `B=0.01*S` |
| --- | ---: | ---: |
| `linear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `linear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `nonlinear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.reaction_inplane_force` | `1.91663182` | `1.91663182e-2` |
| `nonlinear.reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` |
| `nonlinear.reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` |
Any `blocking` family row or RMS failure fails the reference comparison for the feature.
`warning-only` failures produce deterministic warning evidence but do not change the blocking
verdict. `RM3` and stress artifacts create neither a blocking nor warning-only tolerance family.
## 7. Open Issues and I/O Handoff
Open issues blocking I/O Definition: 없음.
I/O Definition Agent handoff:
- Project only the comparison quantities in Sections 4.2, 4.3 and 4.5 to authoritative FESA
result datasets without changing source identity or final comparison disposition.
- Preserve `Frame` handling for `shellnl-s4-final` as accepted factor-one state identity; do not expose
trial Newton history as reference rows.
- Derive constrained reaction identity from the input mask. Compare `RM1/RM2` with the global
spatial physical reaction moment, not the raw generalized rotation-coordinate covector.
- Preserve approved Gauss direct stress recovery. Do not create element-corner stress,
extrapolation, averaging or a stress CSV projection for the current optional SPOS/SNEG artifacts.
- Keep `RM3`, `S-S33`, `S-S11`, `S-S22` and `S-S12` out of current comparison families.
- Use the common tolerance policy exactly as written above and in `docs/TOLERANCE.md`.
Reference artifact status: complete for I/O Definition. No declared required input or required
comparison CSV is missing or unreadable. Optional stress CSVs are present and readable as inventory
evidence only. No reference artifact was generated, renamed, repaired, normalized, or modified.