modify docu and reference
This commit is contained in:
@@ -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.
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user