chore: remove retired workflow and historical material

This commit is contained in:
KOKO\Mimi
2026-10-17 22:39:47 +09:00
parent 4bd19f5bf0
commit 774b80099c
768 changed files with 0 additions and 54164 deletions
-920
View File
@@ -1,920 +0,0 @@
# 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: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_research_sha256: `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570`
- source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md`
- source_formulation_sha256: `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`
- source_numerical_review: `docs/nonlinear-static-newton-raphson/numerical-review.md`
- source_numerical_review_sha256: `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C`
- source_reference_model: `docs/nonlinear-static-newton-raphson/reference-model.md`
- source_reference_model_sha256: `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`
- decision_source: `USER-DECISION-004 option 1`
- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8`
- 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-28`
- 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` | matching `||f_ext,f^u||_inf`가 exact zero이면 exact `0`; nonzero이면 `max(||f_int,f^u||_inf,||f_ext,f^u||_inf)`; 또는 `not-evaluated(reason)` |
| 11 | `residual_force_branch` | matching external scale이 nonzero이면 `relative`, exact zero이면 `zero-scale`, 또는 `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` | matching `||f_ext,f^phi||_inf`가 exact zero이면 exact `0`; nonzero이면 `max(||f_int,f^phi||_inf,||f_ext,f^phi||_inf)`; 또는 `not-evaluated(reason)` |
| 18 | `residual_moment_branch` | matching external scale이 nonzero이면 `relative`, exact zero이면 `zero-scale`, 또는 `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 |
`nsnr-log-v1`의 39개 field label, order와 TAB-separated `label=value` serialization은
변경하지 않는다. Completed gate record는 `failing_stage=none`이고 네 channel의 identity,
numerator/norm, denominator/scale, branch, typed threshold, pass를 모두 finite 또는 enum
value로 노출한다.
Residual channel은 required residual/internal/external vector와 그 infinity norm을 모두 finite로
확인한 뒤 matching external scale `S_ext^u=||f_ext,f^u||_inf` 또는
`S_ext^phi=||f_ext,f^phi||_inf` 자체로 branch를 선택한다. Matching external scale이 exact
zero이면 `residual_*_denominator_scale=0`, `residual_*_branch=zero-scale`로 직렬화하고 numerator에
typed absolute `1e-3 force` 또는 `1e-3 force*length`를 inclusive `<=`로 직접 적용한다.
이 exact `0`은 matching external selector를 직렬화하며 divisor 또는 internal-inclusive max가
아니다. Selector predicate는 `S_ext==0`이고 tolerance band, zero clamp, `max(1,...)`를 쓰지 않는다.
Internal scale 또는 residual numerator가 nonzero여도 이 branch를 `relative`로 바꾸지 않는다.
Matching external scale이 nonzero이면 `residual_*_denominator_scale`은 retained
`max(||f_int,f||_inf,||f_ext,f||_inf)`이고 `residual_*_branch=relative`이며, numerator/denominator
ratio에 dimensionless `1e-2`를 inclusive `<=`로 적용한다. 이 branch에 typed absolute gate를
OR로 추가하지 않는다.
Correction channel은 기존 계약 그대로 current-trial incremental-solution denominator가 exact
zero이면 `zero-scale`과 typed `1e-3 length` 또는 `1e-3 dimensionless`를, nonzero이면
`relative`와 dimensionless `1e-2`를 사용한다. Empty free channel은 exact-zero numerator/scale의
typed `zero-scale` branch로 평가한다. 네 channel의 pass는 `combined_pass`에서 logical AND로만
결합한다.
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 / spatial full-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; translation은 full generalized residual과 같고 rotation은 `J_l(phi)^(-T)` spatial moment conversion. Constrained reaction은 mask를 generalized residual에 먼저 적용한 뒤 변환하며 accepted free residual의 authority는 이 dataset이 아니라 `nodal/generalized_residual`이다. |
| 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 applied-plus-reaction balance error | `/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; formulation §13.4의 applied-plus-constrained-reaction balance error; moment about global origin `[0,0,0]`, current force arms와 spatial physical nodal moments 사용; `location=global-balance-error` |
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.5.1 Equilibrium Projection and Schema Compatibility
Schema version `1`과 기존 `/global/equilibrium` path/shape는 유지한다. 기존 계약이 이미
global origin `[0,0,0]`, current force arm과 spatial physical nodal moment를 지정했으므로 이
dataset의 authoritative meaning은 처음부터 formulation §13.4의 **global
applied-plus-reaction balance error**다. Raw full-residual sum, initial-coordinate arm 또는 raw
rotation-coordinate covector를 이 path에 쓰는 것은 schema-compatible implementation이 아니다.
이 의미 명확화는 path, shape 또는 component를 바꾸지 않으므로 schema version을 올리지 않는다.
같은 accepted frame의 세 equilibrium quantity는 다음처럼 서로 다른 HDF5 projection으로
재구성된다. 별도 중복 summary dataset은 만들지 않는다.
| logical quantity | authoritative HDF5 projection | coordinates / units | disposition |
| --- | --- | --- | --- |
| accepted free residual | `/model/nodal_constraint_mask==0`인 component를 `/nodal/generalized_residual`에서 선택한다. NSNR-069 scale은 같은 free component의 `/nodal/generalized_internal_force`와 `/nodal/generalized_external_force`에서 계산한다. | translation channel은 global force, rotation-coordinate channel은 generalized force-length | `blocking-internal` |
| constrained reaction resultant | `/model/nodal_constraint_mask`를 `/nodal/generalized_residual`에 먼저 적용해 constrained generalized reaction을 만들고, rotation block만 accepted `phi`의 `J_l(phi)^(-T)`로 spatial moment로 변환한다. Current position은 `/model/nodes.coordinates + /nodal/displacement[UX,UY,UZ]`다. Stable node order로 `sum(F_react)`와 `sum(x cross F_react + M_react)`를 계산한다. | global force `[3]`, global spatial force-length moment `[3]` about `[0,0,0]` | `review-only-summary` |
| applied-plus-reaction balance error | required dataset `/global/equilibrium`; applied contribution은 accepted `/nodal/generalized_external_force`의 translation block과 `J_l(phi)^(-T)`로 변환한 rotational block, reaction contribution은 바로 위 constrained projection을 사용한다. Stable node order로 formulation §13.4의 합을 계산한다. | global force `[3]`, global spatial force-length moment `[3]` about `[0,0,0]` | `blocking-internal` |
Componentwise constraint selection은 spatial moment 변환보다 먼저 수행한다. 따라서 partial
rotational constraint나 nonzero prescribed rotation에서도 constrained reaction resultant에 free
generalized residual이 섞이지 않는다. Local `/nodal/reaction` display나 full residual sum을 위 세
quantity 중 다른 하나의 substitute로 사용하지 않는다. Nonzero prescribed translation에서는
initial position이 아니라 accepted current position을 force arm으로 사용한다.
### 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-meshfine-s4-final` | primary nonlinear input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | required source input |
| `shellnl-meshfine-s4-final` | displacement CSV | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning comparison |
| `shellnl-meshfine-s4-final` | reaction CSV | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | constrained nodes/components only required review |
| `shellnl-meshfine-s4-final` | stress CSV | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional read-only inspection/order evidence only |
| `shellnl-s4-final` | companion nonlinear input | `reference/shellNL/shellNL.inp` | required source input |
| `shellnl-s4-final` | displacement CSV | `reference/shellNL/shellNL displacements.csv` | required blocking/warning comparison |
| `shellnl-s4-final` | reaction CSV | `reference/shellNL/shellNL reactions.csv` | constrained nodes/components only required review |
| `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하지 않는다. Fine과 coarse nonlinear case는 각각 자기 input/CSV에 독립적으로
비교하며 cross-mesh row mapping이나 interpolation을 만들지 않는다.
### 8.2 Accepted-State and Frame Mapping
- `shellnl-meshfine-s4-final`과 `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>`를 선택한다.
- 두 nonlinear case의 required CSV row는 exact `Frame` value
`Increment 10: Step Time = 1.000`만 가져야 하며, 이는 각 case의 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)
```
Instance `PART-1-1`에서 linear/coarse case는 node label `1..49`, fine case는 `1..729`를
각각 정확히 한 번 요구한다. Instance matching은 case-insensitive로 수행하되 report에는 raw
spelling을 보존한다. Row order는 identity가 아니다.
| CSV column | comparison component | nonlinear HDF5 source | linear regression HDF5 source |
| --- | --- | --- | --- |
| `U-U1` | `U1` | factor-one `nodal/displacement` column `UX` | final `nodal/displacement` column `UX` |
| `U-U2` | `U2` | factor-one `nodal/displacement` column `UY` | final `nodal/displacement` column `UY` |
| `U-U3` | `U3` | factor-one `nodal/displacement` column `UZ` | final `nodal/displacement` column `UZ` |
| `UR-UR1` | `UR1` | factor-one `nodal/displacement` column `URX` | final `nodal/displacement` column `URX` |
| `UR-UR2` | `UR2` | factor-one `nodal/displacement` column `URY` | final `nodal/displacement` column `URY` |
| `UR-UR3` | `UR3` | factor-one `nodal/displacement` column `URZ` | final `nodal/displacement` column `URZ` |
`U1/U2/U3`는 blocking이다. `UR1/UR2/UR3`는 모든 case에서 warning-only다. UR warning
exceedance는 blocking verdict를 바꾸지 않는다.
### 8.4 Nonlinear Local Reaction Review Projection
Reaction review row는 input boundary mask로 선택한다.
- coarse `shellnl-s4-final`: `1,3..9,14..17,22..33` — 24 nodes;
- fine `shellnl-meshfine-s4-final`: `1,3..9,34..57,82..153` — 104 nodes.
승인 input에서 위 node들은 여섯 global DOF가 모두 constrained다. Comparator는 row
eligibility를 CSV zero value나 row position이 아니라 `/model/nodal_constraint_mask`와 source
node identity에서 도출한다. Translation reaction은 factor-one
`nodal/generalized_residual`의 constrained `RU1..RU3`이고, rotational reaction은 constrained
`RPHI1..RPHI3`를 먼저 선택한 뒤 accepted `phi`의 `J_l(phi)^(-T)`로 변환한 spatial physical
moment다. Stored all-six-constrained rows에서는 factor-one `/nodal/reaction`의 대응 column과
동일해야 한다.
| CSV columns | coarse family | fine family | disposition |
| --- | --- | --- | --- |
| `RF-RF1`, `RF-RF2` | `coarse.local_reaction_inplane_force` | `fine.local_reaction_inplane_force` | `review-only` |
| `RF-RF3` | `coarse.local_reaction_transverse_force` | `fine.local_reaction_transverse_force` | `review-only` |
| `RM-RM1`, `RM-RM2` | `coarse.local_reaction_physical_moment` | `fine.local_reaction_physical_moment` | `review-only` |
| `RM-RM3` | comparison projection 없음 | comparison projection 없음 | `excluded` |
Raw generalized rotation-coordinate residual은 Abaqus `RM` CSV column과 직접 비교하지 않는다.
Review-only family도 source key, schema, inventory, finite value와 모든 row/common-policy error를
보고한다. 그 precheck 또는 numerical finding은 blocking verdict를 바꾸지 않는다.
### 8.5 Internal Factor-One Equilibrium Projection
Internal equilibrium은 Abaqus CSV comparison이 아니다. Fine primary와 coarse companion의
각 accepted factor-one HDF5 frame에서 Section 7.5.1의 projection을 사용한다.
| family id | exact HDF5 rows/components | gate |
| --- | --- | --- |
| `coarse.accepted_free_force_residual` | 75 free `RU1/RU2/RU3` rows와 같은 rows의 internal/external force | NSNR-069 force channel |
| `coarse.accepted_free_moment_residual` | 75 free `RPHI1/RPHI2/RPHI3` rows와 같은 rows의 internal/external generalized moment | NSNR-069 moment channel |
| `coarse.global_force_balance` | factor-one `/global/equilibrium` `FORCE_1..3` | normalized `<=1e-8` |
| `coarse.global_moment_balance` | factor-one `/global/equilibrium` `MOMENT_1..3` | normalized `<=1e-8` |
| `fine.accepted_free_force_residual` | 1,875 free `RU1/RU2/RU3` rows와 같은 rows의 internal/external force | NSNR-069 force channel |
| `fine.accepted_free_moment_residual` | 1,875 free `RPHI1/RPHI2/RPHI3` rows와 같은 rows의 internal/external generalized moment | NSNR-069 moment channel |
| `fine.global_force_balance` | factor-one `/global/equilibrium` `FORCE_1..3` | normalized `<=1e-8` |
| `fine.global_moment_balance` | factor-one `/global/equilibrium` `MOMENT_1..3` | normalized `<=1e-8` |
Global balance의 force scale은 applied/reaction nodal force contribution의 2-norm 합 중 큰
값, moment scale은 current-arm force moment와 spatial physical nodal moment contribution의
2-norm 합 중 큰 값이다. Force와 moment를 분리해 `norm(balance_error)/scale<=1e-8`을
적용한다. Scale이 exact zero이면 balance error도 exact zero일 때만 pass한다. Absolute floor,
`max(1,S)` 또는 zero clamp는 없다. Accepted free residual은 NSNR-069의 external-channel exact-zero/
nonzero branch를 그대로 재현한다. 이 internal gate에는 `docs/TOLERANCE.md`, Abaqus value 또는
local reaction error를 적용하지 않는다.
Constrained reaction resultant force `[3]`와 moment `[3]`는 Section 7.5.1의 distinct
`review-only-summary`로 함께 계산·보고한다. `/global/equilibrium`, constrained reaction
resultant와 accepted free residual 중 어느 하나를 다른 quantity의 대체 dataset으로 쓰지 않는다.
### 8.6 External 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 |
| `coarse.translation` | `shellnl-s4-final` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking |
| `coarse.rotation` | `shellnl-s4-final` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `coarse.local_reaction_inplane_force` | `shellnl-s4-final` | `RF1,RF2` on constrained nodes | 48 | force / global shell plane | review-only |
| `coarse.local_reaction_transverse_force` | `shellnl-s4-final` | `RF3` on constrained nodes | 24 | force / global transverse | review-only |
| `coarse.local_reaction_physical_moment` | `shellnl-s4-final` | `RM1,RM2` on constrained nodes | 48 | force*length / global spatial | review-only |
| `fine.translation` | `shellnl-meshfine-s4-final` | `U1,U2,U3` on nodes `1..729` | 2,187 | length / global | blocking |
| `fine.rotation` | `shellnl-meshfine-s4-final` | `UR1,UR2,UR3` on nodes `1..729` | 2,187 | dimensionless / fixed-initial global | warning-only |
| `fine.local_reaction_inplane_force` | `shellnl-meshfine-s4-final` | `RF1,RF2` on constrained nodes | 208 | force / global shell plane | review-only |
| `fine.local_reaction_transverse_force` | `shellnl-meshfine-s4-final` | `RF3` on constrained nodes | 104 | force / global transverse | review-only |
| `fine.local_reaction_physical_moment` | `shellnl-meshfine-s4-final` | `RM1,RM2` on constrained nodes | 208 | force*length / global spatial | review-only |
Reference-model read-only scale audit value는 다음과 같다. 이 값은 calibration 상수가 아니다.
| 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` |
| `coarse.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `coarse.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `coarse.local_reaction_inplane_force` | `1.91663182` | `1.91663182e-2` |
| `coarse.local_reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` |
| `coarse.local_reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` |
| `fine.translation` | `2.57957054e-5` | `2.57957054e-7` |
| `fine.rotation` | `6.58704994e-6` | `6.58704994e-8` |
| `fine.local_reaction_inplane_force` | `5.38827419e-1` | `5.38827419e-3` |
| `fine.local_reaction_transverse_force` | `2.78506128e3` | `2.78506128e1` |
| `fine.local_reaction_physical_moment` | `4.71557520e3` | `4.71557520e1` |
### 8.7 Row Prechecks
Tolerance 또는 internal metric 전에 다음을 검사한다.
1. 각 case의 exact declared input과 해당 disposition에 필요한 CSV가 존재하고 readable이다.
2. Reference CSV header는 surrounding whitespace trim 뒤 필요한 column을 가진다.
3. 두 nonlinear case required row는 exact approved `Frame` value만 포함한다.
4. HDF5 metadata, model rows, accepted-frame table, factor-one frame, required result dataset이
문서화된 shape, component name, attributes와 finite value를 가진다.
5. Wide CSV row는 이 문서의 component mapping으로 component row로 deterministically expand한다.
6. Source wide key와 expanded component key는 unique하다. Duplicate reference 또는 HDF5 key는
affected family를 tolerance 전에 fail한다.
7. Input node inventory와 source constraint mask로 expected key set을 만든다. CSV zero value나 row
position으로 reaction identity를 추론하지 않는다.
8. 각 declared external family에서 FESA와 reference projected key set은 exact equal해야 한다.
Missing row와 extra row를 모두 fail한다.
9. Required HDF5/CSV value, derived scale, norm과 metric은 모두 finite여야 한다.
10. Internal free residual은 exact free mask와 force/moment channel을 보존한다. Global balance는 모든
applied source와 constrained reaction을 stable source order로 정확히 한 번 사용한다.
11. Local review row를 global resultant로 collapse하거나 대체하지 않는다. Review-only precheck/error는
deterministic review failure로 기록하지만 blocking verdict를 변경하지 않는다.
12. Warning-only precheck/tolerance failure는 deterministic warning을 만들고 blocking verdict를
변경하지 않는다. Blocking precheck failure만 전체 external comparison을 fail한다.
13. Row omission/synthesis, averaging, source-order matching, clamp, normalization 또는 artifact repair를
허용하지 않는다.
### 8.8 Stress CSV Disposition
Optional stress CSV identity는 다음과 같다.
```text
(case_id, accepted_state, instance, element_label,
element_corner_node_label, section_surface, component)
```
Stored stress CSV는 element-corner node row와 `SPOS/SNEG` section surface에서 `S-S11`,
`S-S22`, `S-S33`, `S-S12`를 포함한다. `reference/shell/shell stresses.csv`는 사용자가
변경한 ascending element-label block `1..36` 순서를 갖지만 row order는 identity가 아니다.
Fine stress CSV의 element `1`, `SNEG`, `Node Label=ss` 한 행은 optional excluded artifact
finding으로만 기록한다. Artifact를 수정하지 않는다.
FESA HDF5는 `GP1..GP4`와 `BOTTOM/MIDDLE/TOP`에서 direct `[S11,S22,S12]`만 emit한다.
따라서 모든 stored stress CSV는 optional read-only inspection/order evidence only다. HDF5
numerical-comparison projection, `S33` synthesis, nodal extrapolation, corner averaging,
Gauss-to-corner matching 또는 element-label-order matching은 없다.
## 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 | finite-first 평가 뒤 residual force/moment는 matching external scale exact-zero이면 typed absolute `1e-3`, nonzero이면 retained `max(internal,external)` relative `1e-2`; correction translation/rotation은 기존 denominator branch; 네 channel 모두 inclusive `<=`이고 logical AND | 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; `/global/equilibrium`은 applied-plus-reaction balance error이고 accepted free residual/constrained reaction resultant와 분리됨; final replace는 log close success 뒤에만 허용 | output, exit `6` |
| equilibrium projection | accepted free rows는 generalized residual과 exact free mask, constrained reaction은 mask-before-spatial-conversion, global balance는 applied plus constrained reaction/current arm/origin `[0,0,0]`; factor-one global force와 moment는 각각 dimension-separated normalized `<=1e-8`; 세 quantity가 같은 accepted state를 공유하되 서로 대체되지 않음 | solver/output/reference internal gate |
| 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 | fine primary/coarse companion/linear-control exact artifacts, headers, row keys, component keys, finite values, factor-one frame mapping과 disposition별 precheck | reference precheck |
| tolerance | external family에만 exact `docs/TOLERANCE.md` row/RMS policy 적용; U blocking, UR warning-only, local RF/RM review-only 보존; internal global balance/free residual gate와 혼합 금지 | reference/internal 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를 포함한다. `/global/equilibrium` path/shape는
유지하되 authoritative meaning을 applied-plus-reaction balance error로 검증한다.
- `AUDIT-001`을 별도 test로 닫는다. Accepted free residual은 generalized residual/internal/external
force와 exact free mask, constrained reaction resultant는 mask-before-`J_l(phi)^(-T)`와 accepted
current arm, global balance는 applied plus constrained reaction을 사용한다. Nonzero prescribed
translation/rotation case에서도 initial arm, raw rotational covector 또는 raw full-residual sum을
세 quantity의 공통 substitute로 쓰지 않는다.
- 비대칭 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` 39-field order, finite round-trip numerics, escaping, completed-gate four-channel
metrics, residual matching-external-scale exact-zero/nonzero branch와 retained nonzero-scale
denominator, typed thresholds, four-channel AND, early-failure `not-evaluated(reason)`, no-Newton
zero-byte log, zero per-iteration stderr duplication, flush-before-next/return을 포함한다.
- Fine primary, coarse companion과 linear control의 exact CSV path, trimmed header, 두 nonlinear
case의 exact factor-one `Frame`, source node/component identity, constrained reaction mask,
missing/extra/duplicate row와 nonfinite value를 tolerance 전에 precheck한다. Row order를 identity로
쓰지 않는다.
- External declared family에는 `docs/TOLERANCE.md`만 적용한다. `U1/U2/U3`는 blocking,
`UR1/UR2/UR3`는 warning-only, local `RF1/RF2/RF3`와 spatial physical `RM1/RM2`는
review-only다. Local `RM3`와 모든 stress CSV value는 제외한다. Review-only row의
schema/inventory/error report를 생략하거나 blocking으로 되돌리지 않는다.
- Fine/coarse factor-one global force/moment balance는 dimension-separated normalized `<=1e-8`,
accepted free force/moment residual은 NSNR-069으로 blocking 검증한다. 이 internal gate에
Abaqus CSV나 `docs/TOLERANCE.md` scale을 사용하지 않는다. Constrained reaction resultant는
distinct review-only summary로 보고한다.
- 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 변경을 승인하지 않는다.
@@ -1,466 +0,0 @@
# MITC4 비선형 정적 해석 수정과 시행착오
아래는 당시 실패 재현·원인·수정·검증 기록이다. 임시 shell/Hook/phase 복구 명령은 현재 실행 절차가 아니다.
<a id="corrections"></a>
<a id="corrections--nonlinear-static-newton-raphson-correction-report"></a>
## Nonlinear Static Newton-Raphson Correction Report
<a id="corrections--1-metadata"></a>
### 1. Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step0-output.json`; `phases/nonlinear-static-newton-raphson/step1-output.json` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md` |
| status | `corrected-for-implementation-rerun` |
| owner_agent | `correction-agent` |
| date | `2026-08-24` |
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 생성되지 않았으므로 현재 Coordinator failure evidence와 Executor의 `step0-output.json` 및 `step1-output.json`을 source failure report로 사용했다.
Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Sections 7-9는 REWORK-004 history다. Section 10은 FileTracker diagnosis history이고 Sections 11-13은 이전 correction history다. Current correction과 status는 Section 14가 supersede한다.
<a id="corrections--2-failure-triage"></a>
### 2. Failure Triage
- classification: `harness`
- normalized classification: `harness-nested-codex-windows-shell-tool-execution-hang`
- first failed command:
```powershell
codex exec --json --model gpt-5.6-terra --config 'model_reasoning_effort="xhigh"' --sandbox workspace-write --dangerously-bypass-hook-trust --cd C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -
```
- failed target or test: nested shell smoke `cmd.exe /d /c echo CODEX_SHELL_SMOKE_OK`
- evidence tail: baseline diagnostic는 45초 안에 종료되지 않았다. JSONL에는 `item.started`, `type=command_execution`, `status=in_progress`가 기록됐지만 대응하는 completion event와 `CODEX_SHELL_SMOKE_OK` 출력이 없었다. 진단 root PID `11292`와 관찰된 descendant PID tree를 `taskkill /PID 11292 /T /F`로 종료한 뒤 `remainingPids=[]`를 확인했다.
- historical evidence: `step0-output.json`도 exit code `124`, stderr `Codex timed out after 1800 seconds.`를 기록했고 `Get-Date`, `cmd.exe /d /c echo test`, `exit 0` 등의 nested command가 `status=in_progress`에 머물렀다.
<a id="corrections--3-root-cause-summary"></a>
### 3. Root Cause Summary
실패 경계는 repaired Python Executor의 timeout/retry 처리나 FESA C++ 구현이 아니라 local `codex-cli 0.147.0`의 nested command execution runtime이다. 같은 worktree에서 direct PowerShell과 `cmd.exe`는 정상 실행되고, focused Harness Python test도 통과하며, runner-equivalent Codex baseline만 nested shell completion을 반환하지 않았다.
Local CLI help는 `--disable <FEATURE>`와 `--enable <FEATURE>`를 문서화하고, `codex features list`는 `code_mode_host`를 `stable true`, `shell_tool`을 `stable true`, `unified_exec`를 `stable false`, `hooks`를 `stable true`로 보고했다. 다음 좁은 가설을 한 변수씩 검사했다.
| variant | result | command completion evidence |
| --- | --- | --- |
| baseline | 45.318초 timeout 후 exact PID tree cleanup | `item.started/status=in_progress`; completion 및 echo output 없음 |
| `--disable code_mode_host` | exit `0`, 33.322초 | shell 미실행; stderr `code-mode host is disabled`; completion event 없음 |
| `--enable unified_exec` | 45.299초 timeout 후 exact PID tree cleanup | completion event 및 echo output 없음 |
| `--disable code_mode_host --enable unified_exec` | exit `0`, 25.922초 | shell 미실행; 동일한 fail-closed host-disabled error |
따라서 `--disable code_mode_host`는 shell execution을 복구하지 않고 tool host를 fail-closed로 제거한다. `unified_exec`도 단독 또는 조합에서 실제 shell completion을 만들지 못했다. Codex 내부 결함의 더 세부 원인은 repository evidence로 확정할 수 없으며, 안전한 documented runner flag workaround는 입증되지 않았다. 이는 implementation defect, test defect 또는 CMake registration issue가 아니라 external Codex runtime blocker다.
<a id="corrections--5-verification-evidence"></a>
### 5. Verification Evidence
| purpose | command | result |
| --- | --- | --- |
| installed CLI | `codex --version` | exit `0`; `codex-cli 0.147.0` |
| documented options | `codex exec --help`; `codex features list` | exit `0`; `--enable/--disable`, `code_mode_host`, `unified_exec`, `shell_tool`, `hooks` 확인 |
| targeted reproduction | runner-equivalent `codex exec ... --sandbox workspace-write ...` + one echo tool request | 45초 timeout; command started, completion/output 없음; exact tree cleanup 후 remaining PID 0 |
| focused Harness Python | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py` | exit `0`; 10 passed |
| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | exit `1`; 23 passed, 1 failed |
| MSVC Debug build | `cmake --build .harness/build --config Debug` | exit `0`; solver/CLI/unit/integration/reference targets built |
| CTest discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | exit `0`; 214 tests discovered |
| full CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure` | exit `0`; 214/214 passed |
`.harness/config.json`은 없었다. Existing `.harness/build/CMakeCache.txt`는 `Visual Studio 18 2026`, `x64`, approved local GoogleTest/MKL/TBB/HDF5 paths를 사용하므로 Harness auto-detected build tree를 재사용했다.
Full Python failure는 pre-existing out-of-scope contract mismatch다: `test_agent_toml_and_limited_skill_yaml_schemas_are_parseable`가 actual `xhigh`와 expected `extra high`를 비교한다. Dispatch 지시에 따라 이 test, `AGENTS.md`, agent profile을 변경하지 않았다.
Stop hook은 Harness Step 실행을 금지한 이번 correction session에서 별도 Codex Step 종료 evidence를 생성하지 않았다. Hook entry point의 수동 실행은 project contract가 금지하므로 대신 config-resolved full MSVC build와 full CTest를 직접 실행해 결과를 위에 기록했다.
<a id="corrections--9-rework-004-tdd-and-verification-evidence"></a>
### 9. REWORK-004 TDD And Verification Evidence
<a id="corrections--failure-and-minimal-correction"></a>
#### Failure and Minimal Correction
- classification: `harness`
- implementation defect: Codex `0.149.1`에서 통과한 runtime envelope의 `--disable unified_exec` option을 `scripts/execute.py`가 nested `codex exec`에 전달하지 않았다.
- RED test: `test_invoke_codex_uses_implementation_agent_command_contract`
- minimal GREEN: command vector에서 `"codex", "exec"` 바로 뒤에 `"--disable", "unified_exec"` 두 argument만 추가했다.
- preserved behavior: `workspace-write` default/validated override, `--dangerously-bypass-hook-trust`, `gpt-5.6-terra`, `model_reasoning_effort="xhigh"`, 1800-second structured timeout, no-push default, `danger-full-access` 비사용 정책은 변경하지 않았다.
<a id="corrections--red--green--verify"></a>
#### RED / GREEN / VERIFY
| stage | command | exit | duration | evidence tail |
| --- | --- | ---: | ---: | --- |
| RED | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py::test_invoke_codex_uses_implementation_agent_command_contract` | `1` | 1.2초 | `assert ('--disable', 'unified_exec') in adjacent_arguments`; 1 failed |
| GREEN | same targeted command | `0` | 1.1초 | 1 passed |
| focused VERIFY | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py` | `0` | 1.1초 | 10 passed |
| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | `1` | 1.3초 | 23 passed, 1 pre-existing failure |
| MSVC Debug build | `cmake --build .harness/build --config Debug` | `0` | 3.8초 | solver/CLI/unit/integration/reference targets built |
| CTest discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | `0` | 0.7초 | 214 tests discovered |
| full CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure` | `0` | 10.2초 | 214/214 passed |
Full Python failure는 기존 `test_agent_toml_and_limited_skill_yaml_schemas_are_parseable`의 `assert 'xhigh' == 'extra high'` 한 건이다. REWORK-004의 command-contract test를 포함한 `tests/test_execute.py`는 10/10 통과하며, dispatch 경계에 따라 pre-existing mismatch를 수정하지 않았다.
<a id="corrections--10-filetracker-workspace-write-diagnosis"></a>
### 10. FileTracker Workspace-Write Diagnosis
<a id="corrections--101-metadata"></a>
#### 10.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/README.md` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step1.md` |
| status | `blocked` |
| owner_agent | `correction-agent` |
| date | `2026-08-24` |
<a id="corrections--102-failure-triage"></a>
#### 10.2 Failure Triage
- classification: `harness`
- normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write`
- attempt: `1`
- first failed stage command:
```powershell
cmake --build .harness/build --config Debug
```
- failed target or test: Visual Studio 18 generator의 `fesa_solver.vcxproj`와 GoogleTest `gtest.vcxproj` CL task
- evidence tail: MSBuild `18.8.2`가 `Microsoft.CppCommon.targets(790,5)`에서 `MSB4018`을 냈다. Inner exception은 `System.UnauthorizedAccessException`, HRESULT `0x80070005 (E_ACCESSDENIED)`이며 stack은 `NativeMethods.GetLongFilePath` -> `FileTracker..cctor()` -> `FileTracker.FileIsExcludedFromDependencies` -> `CanonicalTrackedInputFiles.ConstructDependencyTable` -> `CL.ComputeOutOfDateSources`다.
- command-result caveat: `step1-output.json`의 item 25는 build와 CTest를 세미콜론으로 연결해 aggregate exit `0`을 기록했지만, 그 내부 `cmake --build`는 exit `1`로 실패했다. 뒤따른 stale-build CTest 성공은 Visual Studio build 성공 evidence가 아니다.
- configure boundary: 보존된 `.harness/build/CMakeCache.txt`는 `CMAKE_GENERATOR=Visual Studio 18 2026`, platform `x64`다. CMake generation 자체가 아니라 생성된 MSBuild project의 CL dependency-tracking 단계가 실패했다.
<a id="corrections--103-root-cause-summary"></a>
#### 10.3 Root Cause Summary
FESA source, Step 1 test 또는 CMake registration이 원인이 아니다. 서로 독립적인 FESA와 GoogleTest project가 동일한 `FileTracker` static initializer에서 실패하므로 project-local input보다 sandbox/environment boundary다.
Microsoft의 `FileTracker.cs`는 static initialization에서 `Path.GetTempPath()`를 구한 뒤 그 경로에 `GetShortFilePath`와 `GetLongFilePath`를 적용한다. 관찰 stack의 첫 failing native call과 정확히 일치한다. 현재 inherited `TEMP`/`TMP`는 `C:\Users\baram\AppData\Local\Temp`이고 runner는 이를 재지정하지 않는다. 따라서 Codex Windows `workspace-write` restricted token이 workspace 밖 user Temp의 long-path normalization을 거부한 것이 가장 좁은 root-cause inference다.
- boundary confidence: `high` — 두 project에서 같은 FileTracker initializer/`E_ACCESSDENIED`가 재현됨.
- exact denied-path confidence: `medium-high` — Microsoft source의 static field order와 inherited Temp가 일치하지만 failing API가 path argument를 log하지는 않음.
- implementation classification: environment-owned sandbox/MSBuild interaction; implementation defect, test defect, CMake registration issue가 아님.
검토한 primary vendor evidence:
- Microsoft MSBuild source: `https://github.com/dotnet/msbuild/blob/main/src/Utilities/TrackedDependencies/FileTracker.cs`
- Microsoft CL task documentation: `https://learn.microsoft.com/en-us/visualstudio/msbuild/cl-task?view=visualstudio`
- installed Visual Studio target: `C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\Microsoft.CppCommon.targets` lines 48-49 and 764-771
- OpenAI Codex sandbox CLI source: `https://github.com/openai/codex/blob/main/codex-rs/cli/src/lib.rs`; built-in writable profile name은 `:workspace`
<a id="corrections--105-workaround-evaluation-and-verification-evidence"></a>
#### 10.5 Workaround Evaluation And Verification Evidence
| purpose | exact command/evidence | result |
| --- | --- | --- |
| preserved failure | `cmake --build .harness/build --config Debug` in `step1-output.json` | internal build exit `1`; `FileTracker..cctor()` `E_ACCESSDENIED` in both FESA and gtest |
| supported property inspection | installed `Microsoft.CppCommon.targets`; Microsoft CL task docs | `TrackFileAccess` defaults to `true` and is passed to CL; property is vendor-defined for incremental file-access tracking |
| narrow property smoke | nested `codex exec --sandbox workspace-write ...` requesting exactly `cmake --build .harness/build --config Debug -- /p:TrackFileAccess=false` | 60-second diagnostic timeout before a command completion event; no pass/fail conclusion; exact root PID `13720` and descendants cleaned, then absent |
| direct sandbox launcher check | `codex sandbox -P :workspace -C C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson cmd.exe /d /c echo SANDBOX_OK` | 10-second timeout; no `SANDBOX_OK`; exact root PID `16708` tree cleaned, then absent |
| workspace-write alternative evidence | Visual Studio-bundled Ninja/MSVC build in `step1-output.json` | focused CTest 27/27 and full CTest 228/228 passed |
`/p:TrackFileAccess=false`는 vendor-defined 후보지만 동일 `workspace-write`에서 build completion이 관찰되지 않아 safe workaround로 채택할 수 없다. `TEMP`/`TMP`를 worktree로 재지정하는 후보도 FileTracker가 system-wide Temp를 dependency exclusion 기준으로 사용한다는 Microsoft source comment 때문에 tracking semantics 보존을 입증하지 않고 자동 적용하지 않았다.
Ninja/MSVC는 같은 sandbox에서 implementation/test 건전성을 입증하지만 Step 1 VERIFY가 명시한 `Visual Studio 18 2026` generator acceptance criterion을 대체하지 않는다. 따라서 correction-agent가 phase/upstream contract 변경 없이 자동 채택할 수 없다. `danger-full-access`는 지시대로 실행하거나 시험하지 않았다.
<a id="corrections--11-rework-006-ninjamsvc-validation-contract-correction"></a>
### 11. REWORK-006 Ninja/MSVC Validation Contract Correction
<a id="corrections--111-metadata"></a>
#### 11.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/README.md` USER-DECISION-002 option A / REWORK-006 |
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` |
| status | `corrected-for-implementation-rerun` |
| owner_agent | `correction-agent` |
| date | `2026-08-24` |
<a id="corrections--112-failure-triage"></a>
#### 11.2 Failure Triage
- classification: `harness`
- normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write`
- attempt: `2`, resolved by USER-DECISION-002 option A의 approved validation-contract change
- first failed command: `cmake --build .harness/build --config Debug`
- failed target: Visual Studio generator/MSBuild `FileTracker..cctor()`; Section 10의 `E_ACCESSDENIED`
- replacement acceptance: `workspace-write` 안에서 VsDevCmd x64를 상속한 Ninja/MSVC Debug configure/build, CTest discovery, full CTest가 모두 통과해야 한다.
<a id="corrections--113-root-cause-summary"></a>
#### 11.3 Root Cause Summary
FESA C++/test/CMake target defect가 아니라 Visual Studio generator의 MSBuild FileTracker와 `workspace-write` sandbox 사이 environment failure였다. User가 option A를 승인했으므로 tracked root `CMakePresets.json`과 existing Harness preset adapter를 사용해 동일 MSVC x64 Debug compiler를 Ninja로 구동한다. Harness Python은 이미 complete preset triplet과 parent environment copy를 지원하므로 production Python 변경은 필요하지 않았다.
<a id="corrections--115-red---green-evidence"></a>
#### 11.5 RED -> GREEN Evidence
| stage | command | result |
| --- | --- | --- |
| RED-1 | `uv run --with pytest python -m pytest -v -rs tests/test_harness_preset_contract.py` | exit `1`; `CMakePresets.json` `FileNotFoundError` |
| GREEN-1 | same focused command after preset/example/local config | exit `0`; 1 passed |
| RED-2 | `uv run --with pytest python -m pytest -q tests/test_harness_preset_contract.py` after adding generated-build ignore assertion | exit `1`; `.harness/build-ninja-msvc-debug/` rule absent |
| GREEN-2 | focused verbose command after `.gitignore` update | exit `0`; 1 passed; `git check-ignore` confirms config and build output |
Contract details:
- preset: `windows-msvc-ninja-debug`
- generator/configuration: `Ninja`, `CMAKE_BUILD_TYPE=Debug`
- binary directory: `.harness/build-ninja-msvc-debug`
- cache variables: `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR` use `$env{...}` and therefore fail closed when the parent launch envelope is incomplete.
- `.harness/config.json` is ignored and byte-identical to `.harness/config.example.json`; both SHA-256 `D07429860D472AE37D02D6CD638900FA46175085AF47F179E98601227F8D3C43` at verification.
<a id="corrections--116-verification-evidence"></a>
#### 11.6 Verification Evidence
Exact nested launch envelope:
```powershell
VsDevCmd.bat -arch=x64 -host_arch=x64
$env:FESA_GTEST_SOURCE_DIR='C:/git/googletest'
$env:MKL_DIR='C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl'
$env:TBB_DIR='C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb'
$env:HDF5_DIR='C:/Program Files/HDF_Group/HDF5/2.1.1/cmake'
codex exec --ephemeral --json --sandbox workspace-write --disable unified_exec --dangerously-bypass-hook-trust -m gpt-5.6-terra -c 'model_reasoning_effort="xhigh"' -C C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson <bounded-validation-prompt>
```
`CODEX_HOME=C:\Users\baram\.codex`를 상속하고 approved WindowsApps PATH entries를 child launch에서만 제거했다. `danger-full-access`와 sandbox bypass option은 사용하지 않았고 project hooks는 유지했다.
| verify item | exact command/evidence | result |
| --- | --- | --- |
| environment preflight | nested shell prints architecture, four variables, `cl.exe`, `ninja.exe` | exit `0`; target/host `x64`; `cl.exe` Hostx64/x64; VS-bundled Ninja; all dependency paths exist |
| configure | `cmake --preset windows-msvc-ninja-debug` | exit `0` |
| build | `cmake --build --preset windows-msvc-ninja-debug` | exit `0` |
| discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | exit `0`; 228 tests |
| full CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | exit `0`; 228/228 passed; 10.69초 |
| generated metadata | `.harness/build-ninja-msvc-debug/CMakeCache.txt`와 `CMakeCXXCompiler.cmake` | `Ninja`; `Debug`; compiler ID `MSVC`; Hostx64/x64 `cl.exe` |
| Stop | hooks-retained nested `codex exec` completion | overall exit `0`; no Stop blocking response; automatic Stop uses ignored config's same preset plan |
| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | 24 passed, 1 pre-existing out-of-scope failure: actual `xhigh` vs expected `extra high` |
첫 cold workspace run은 full CTest에서 temporary `fesa_reference_tests_NOT_BUILT`로 207/208만 통과해 blocker-clear로 사용하지 않았고 phase도 reset하지 않았다. Automatic hooks가 missing target build를 완료한 뒤 두 번째 independent nested `workspace-write` run에서 위 228/228 evidence를 확보한 다음에만 phase를 reset했다.
Reference artifact no-change evidence: `git diff --name-only -- reference`는 empty였다. `shellNL.inp`, shellNL displacement/reaction/stress CSV와 shell input/displacement/reaction/stress CSV의 SHA-256은 implementation-plan inventory와 모두 일치한다. Reference solver와 feature Harness phase는 실행하지 않았다.
<a id="corrections--12-rework-007-step-11-nonlinear-nonconvergence-contract-triage"></a>
### 12. REWORK-007 Step 11 Nonlinear Nonconvergence Contract Triage
<a id="corrections--121-metadata"></a>
#### 12.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/README.md` REWORK-007 |
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `needs-upstream-decision` |
| owner_agent | `correction-agent` |
| date | `2026-08-24` |
<a id="corrections--122-failure-triage"></a>
#### 12.2 Failure Triage
- classification: `upstream-contract`
- normalized classification: `implementation-shellnl-nonlinear-nonconvergence-no-hdf5`
- attempt: `1`
- first failed command:
```powershell
ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure
```
- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (CTest test 288)
- evidence tail: copied build-local `shellNL.inp` reaches `severity=error`, `code=nonlinear-nonconvergence` after iteration 100. `generated.HasValue()` is false because no authoritative copied-sibling `shellNL_results.h5` is committed.
- correction-agent reproduction: the exact focused test alone failed deterministically in 103.84 seconds with the same diagnostic. The original reference input was not passed to FESA.
<a id="corrections--123-root-cause-summary"></a>
#### 12.3 Root Cause Summary
This is not an implementation defect in the observed convergence calculation. The implementation in `src/fesa/analysis/nonlinear_static_procedure.cpp` supplies same-trial free rotational residual, internal moment and external moment to `EvaluateNewtonConvergence`. `src/fesa/analysis/nonlinear_static_control.cpp` then implements the approved `NSNR-069` and formulation Section 14.1 literally:
\[
D_M=\max(\|f_{int,f}^{\phi}\|_\infty,
\|f_{ext,f}^{\phi}\|_\infty),\qquad
\eta_M=\frac{\|r_f^{\phi}\|_\infty}{D_M}
\]
for every nonzero \(D_M\), with the typed absolute `1e-3 force-length` branch available only when \(D_M=0\) exactly.
The approved `reference/shellNL/shellNL.inp` contains only `Set-1, 3, -100000.` under `*CLOAD`; it applies no rotational moment component. Therefore the free rotational external vector is exactly zero and
\[
r_f^{\phi}=f_{int,f}^{\phi}-0=f_{int,f}^{\phi},
\qquad
D_M=\|f_{int,f}^{\phi}\|_\infty=\|r_f^{\phi}\|_\infty.
\]
For every nonzero rotational residual, \(\eta_M=1>10^{-2}\). The channel can pass only if floating-point assembly produces the exact zero vector, at which point and only then the exact-zero branch is selected. Thus the current approved denominator structurally prevents practical convergence for a no-applied-moment shell case even when its residual is well below the approved typed absolute threshold.
The reproduced log contains 100/100 parsed iteration records with exact printed equality between `residual_moment_numerator_norm` and `residual_moment_denominator_scale`; all 100 use `branch=relative` and `pass=0`. Representative values are:
| iteration | numerator | denominator | branch | pass |
| ---: | ---: | ---: | --- | ---: |
| 1 | `2.363968570753043e-09` | `2.363968570753043e-09` | `relative` | 0 |
| 2 | `1.4372536725204554e-06` | `1.4372536725204554e-06` | `relative` | 0 |
| 3 | `3.138301877925187e-06` | `3.138301877925187e-06` | `relative` | 0 |
| 99 | `3.8876064110127118e-06` | `3.8876064110127118e-06` | `relative` | 0 |
| 100 | `4.6441010823627948e-06` | `4.6441010823627948e-06` | `relative` | 0 |
Every listed numerator is below `1e-3 force-length`, but the approved exact-zero-denominator predicate forbids use of that absolute branch. Changing the implementation alone would contradict the approved requirement and formulation.
<a id="corrections--125-verification-evidence"></a>
#### 12.5 Verification Evidence
| purpose | exact command/evidence | result |
| --- | --- | --- |
| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `1`; 0/1 passed; test 288 failed in 103.84 s with 100-iteration `nonlinear-nonconvergence` |
| iteration-log audit | parse latest copied-run `shellNL_log.txt` fields for every iteration | 100 records; numerator equals denominator in 100/100; `relative` in 100/100; `residual_moment_pass=0` in 100/100 |
| implementation trace | `nonlinear_static_procedure.cpp` residual/internal/external channel construction plus `nonlinear_static_control.cpp` denominator evaluation | matches `NSNR-069` and formulation Section 14.1 exactly |
| input trace | `reference/shellNL/shellNL.inp` lines 149-151 | one translational direction-3 force; no applied rotational moment |
| reference preservation | pre/post SHA-256 plus `git diff -- reference` | all eight declared hashes unchanged; reference diff empty |
| full Ninja/MSVC build/CTest | not run | intentionally stopped at decisive `upstream-contract`; no implementation correction exists to verify |
| Stop | not applicable | Correction was not a Harness Step and made no production/test/CMake change |
| Harness Python pytest | not applicable | no Harness/Hook/agent-config behavior changed |
<a id="corrections--13-rework-008-nonlinear-reaction-reference-mismatch-triage"></a>
### 13. REWORK-008 Nonlinear Reaction Reference Mismatch Triage
<a id="corrections--131-metadata"></a>
#### 13.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/README.md` dispatch `REWORK-008-nonlinear-reaction-reference-mismatch` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `needs-upstream-decision` |
| owner_agent | `correction-agent` |
| date | `2026-08-25` |
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 immutable `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`, Coordinator dispatch, current implementation/CTest와 read-only result/reference audit를 source evidence로 사용했다.
<a id="corrections--132-failure-triage"></a>
#### 13.2 Failure Triage
- initial failure classification: `reference-comparison`
- final classification: `upstream-contract`
- normalized classification: `reference-blocking-model-adequacy-conflict`
- attempt: `1` for `REWORK-008`; 이전 `REWORK-007`은 별도 nonlinear convergence classification이다.
- first failed command in Step 11:
```powershell
cmake --build --preset windows-msvc-ninja-debug; ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure
```
- correction-agent reproduction:
```powershell
ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure
```
- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (fresh CTest test 293)
- evidence tail: exit `8`, 0/1 passed, 16.88 s. Row identity/schema/nonfinite prechecks passed before the common tolerance gate reported exactly three failed blocking families: in-plane RF RMS `0.11437709952897851`, transverse RF RMS `0.048448360241294064`, physical spatial RM RMS `0.02746412616679237`, each above `0.01`.
<a id="corrections--133-root-cause-summary"></a>
#### 13.3 Root Cause Summary
Observed reaction computation/storage/mapping path에는 implementation defect evidence가 없다.
1. `nonlinear_static_procedure.cpp`는 같은 accepted state에서 `residual = internal.force - external.generalized_external_force`를 만들고 `trial.reaction = trial.residual`로 저장한다. `nonlinear_analysis_state.cpp`는 모든 DOF에서 이 두 identity를 검증한다.
2. `nonlinear_hdf5_results_writer.cpp`는 translation reaction을 그대로 쓰고 rotational reaction만 승인식 `J_l(phi)^(-T)`로 physical spatial moment에 변환한다. 24 constrained nodes에서 `phi=0`이므로 이 변환은 identity다. Full-precision HDF5 audit에서 constrained translation과 generalized residual의 차이, constrained moment 변환 차이, constrained `phi`가 모두 exact `0`이었다.
3. Comparator는 `/model/nodal_constraint_mask`와 `(case, state, instance, node label, component)` exact key를 사용한다. 이번 실행이 schema/missing/extra/duplicate/nonfinite failure가 아니라 family tolerance report까지 도달했으므로 storage와 row mapping precheck도 통과했다.
4. Dominant RF3/RM1/RM2 mismatch는 nonlinear 전용 경로에서 생기지 않는다. FESA nonlinear-linear 최대 차이는 RF3 `2.9441580409184098e-06`, RM1 `1.3046948879491538e-05`, RM2 `1.2039316061418504e-05`이고, Abaqus nonlinear-linear 차이는 각각 `0`, `5.0022208599999994e-12`, `1.1141310098e-11`이다. 그럼에도 FESA linear와 Abaqus linear 사이에는 nonlinear과 동일한 local RF3/RM mismatch가 이미 존재한다. 예를 들어 node 31 RF3는 FESA `1059.5675655371299`, reference `339.61334199999999`; node 22 RM1은 FESA `-1564.1175318019484`, reference `-515.62542699999995`다.
5. 전체 constrained reaction 합은 FESA nonlinear `[7.9591888635377472e-12, 7.2906680692597092e-12, 100000.00000082512]`, Abaqus nonlinear `[4.5008441418303846e-13, -1.7997131562808022e-12, 99999.999592799955]`로 global balance와 sign이 일치한다. Stored `/global/equilibrium`도 `[-5.2007287365540833e-12, 2.1302730413008675e-11, 99999.999999999985, 1.5669833723712425e-11, 6.4043503405991029e-12, -3.0183203934097235e-11]`다.
6. RF1/RF2는 nonlinear에서 새로 생기는 weak geometric membrane reaction이지만 FESA extrema `±1.3774894254907935`와 Abaqus extrema `±1.9166318200000001`의 차이는 storage/mapping 오류가 아니다. Linear Abaqus reaction은 거의 zero이고, independent FESA MITC4와 Abaqus S4가 서로 다른 local nodal support-force redistribution을 만들 수 있다는 approved formulation/model limitation 안에 있다.
따라서 demonstrated cause는 nonlinear reaction implementation이 아니라 reference blocking quantity의 model-adequacy 전제다. Approved `reference-model.md`는 linear reaction CSV를 review-only로 두면서, 같은 local RF3/RM distribution을 nonlinear에서 blocking으로 승격한다. Project contract는 FESA MITC4의 integration/stabilization/internal behavior가 Abaqus S4와 동등하다고 주장하지 않는다. Global equilibrium은 맞지만 formulation-sensitive local nodal reaction 분포가 1% RMS를 만족해야 한다는 분석적 또는 독립 benchmark 근거는 없다. 이를 code-only로 Abaqus 값에 맞추는 것은 formulation/model adequacy 또는 reference acceptance contract 변경이며 Correction Agent 범위를 벗어난다.
<a id="corrections--135-verification-evidence"></a>
#### 13.5 Verification Evidence
Visual Studio environment는 `VsDevCmd.bat -arch=x64 -host_arch=x64`로 설정했고, `.harness/config.json`/preset가 요구한 `FESA_GTEST_SOURCE_DIR=C:/git/googletest`, `MKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl`, `TBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb`, `HDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake`를 사용했다.
| purpose | exact command/evidence | exit/result |
| --- | --- | --- |
| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `8`; 0/1 passed; only three reaction-family RMS gates failed |
| reaction dataflow audit | `nonlinear_static_procedure.cpp` residual/reaction assignment, `nonlinear_analysis_state.cpp` identities, `nonlinear_hdf5_results_writer.cpp` physical-moment projection and comparator exact-key prechecks; build-local datasets dumped with `$hdf5Bin='C:\Program Files\HDF_Group\HDF5\2.1.1\bin'; $env:PATH="$hdf5Bin;$env:PATH"; & "$hdf5Bin\h5dump.exe" -m %.17g -d <dataset> <results.h5>` | exit `0`; constrained pipeline differences and constrained rotation were exact zero |
| nonlinear/linear audit | join build-local FESA HDF5 and immutable CSV rows by exact `(instance, node label, component)` in read-only PowerShell | exit `0`; dominant mismatch is already present in both solvers' linear results and survives nonlinear unchanged |
| targeted nonlinear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-441332835013800-0/shellNL_results.h5` | SHA-256 `A82349F1AABDC2B042A7DBF643D0D917B04245B64E5D73F9507B83A2D67FDE91` |
| targeted linear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-441349319977100-1/shell_results.h5` | SHA-256 `167248AB523484FB6F515AE6A309C7380B4A1226B74BE03B207F4532C3064B66` |
| configure | `cmake --preset windows-msvc-ninja-debug` | exit `0`; 0.342 s; configure/generate complete |
| build | `cmake --build --preset windows-msvc-ninja-debug` | exit `0`; 0.116 s; `ninja: no work to do.` |
| CTest discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | exit `0`; 294 tests discovered |
| full MSVC CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | exit `8`; 293/294 passed; only test 293 failed with the same three RMS values; test 294 comparator invalid-HDF5/warning checks passed |
| source failure hash | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256` | exit `0`; `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91` |
| reference preservation | `git diff -- reference` | exit `0`; empty diff |
| repository identity | `git rev-parse HEAD` | exit `0`; `65b56b1755e4537b48b44476375b6235da732648` |
| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 production/test/CMake를 변경하지 않았다. Full preset build/CTest를 직접 실행했다. |
| Harness Python pytest | not applicable | Harness Python, Hook, agent config behavior를 변경하지 않았다. |
<a id="corrections--14-rework-009-user-local-windowsapps-powershell-launch-correction"></a>
### 14. REWORK-009 User-local WindowsApps PowerShell Launch Correction
<a id="corrections--141-metadata"></a>
#### 14.1 Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/README.md` dispatch `REWORK-009-user-windowsapps-pwsh-launch-filter-root-dispatch-required` |
| source implementation plan | `docs/nonlinear-static-newton-raphson/README.md`; `phases/nonlinear-static-newton-raphson/step11.md` |
| status | `corrected-for-implementation-rerun` |
| owner_agent | `correction-agent` |
| date | `2026-08-28` |
`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 current `step11-output.json` SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`, Coordinator dispatch, preserved attempt-1 TDD evidence와 attempt-2 Stop evidence를 source evidence로 사용했다.
<a id="corrections--142-failure-triage"></a>
#### 14.2 Failure Triage
- classification: `harness`
- normalized classification: `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied`
- attempt: `2` under `STEP11-EXECUTION-003`; attempt 1은 1,800초 timeout이고 attempt 2는 아래 shell launch failure다.
- first failed command boundary:
```powershell
codex exec --json --model gpt-5.6-terra --config 'model_reasoning_effort="xhigh"' --sandbox workspace-write --dangerously-bypass-hook-trust --cd C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson --disable unified_exec -
```
- failed target: attempt-2 nested Codex의 첫 PowerShell tool launch.
- evidence tail: nested Codex `0.150.1`이 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe`를 선택했다. `workspace-write` runner가 `CreateProcessAsUserW failed: 5 (Access denied)`로 이를 거부해 소스 확인, RED/VERIFY 명령과 Step status update가 실행되지 않았다. Codex process 자체는 `exitCode=0`이지만 blocker agent message만 반환했으므로 Step 성공 evidence가 아니다.
- state evidence: `HEAD=65b56b1755e4537b48b44476375b6235da732648`; Step 11 `pending`; Step 12 `pending`.
<a id="corrections--143-root-cause-summary"></a>
#### 14.3 Root Cause Summary
이번 실패는 solver, comparator 또는 `1e-8` gate defect가 아니라 Harness child launch environment defect다.
1. 이전 launcher filter는 `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` entry만 제거했다.
2. 따라서 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps` entry와 그 아래 `pwsh.exe` execution alias가 PATH에 남았다.
3. Nested Codex shell resolver는 남은 user-local alias를 선택했고, Windows native `workspace-write` sandbox는 그 alias의 child process 생성을 Windows error 5로 거부했다.
4. PATH에서 `\\WindowsApps(?:\\|$)`에 일치하는 모든 entry를 제거하면 현재 환경의 Program Files entry 세 개와 user-local entry 한 개가 함께 제거된다. 이때 `pwsh`는 resolve되지 않고 `powershell`은 `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`로 resolve된다.
5. Root가 같은 Codex CLI `0.150.1`, `gpt-5.6-terra`, `xhigh`, `--disable unified_exec`, `workspace-write`, `CODEX_HOME=C:\Users\baram\.codex` envelope에서 이 filter를 적용한 nested smoke는 위 Windows PowerShell을 선택해 exact `FESA_CODEX_SHELL_SMOKE_OK`를 출력하고 exit `0`으로 끝났다. Correction audit의 독립 direct smoke도 같은 executable, exact output과 exit `0`을 확인했다.
따라서 repository runner나 Step 11 implementation을 고칠 필요가 없다. Rerun launch에서 PATH predicate만 전체 WindowsApps entry를 제거하도록 바로잡으면 된다.
<a id="corrections--145-verification-evidence"></a>
#### 14.5 Verification Evidence
| purpose | exact command/evidence | exit/result |
| --- | --- | --- |
| failure artifact audit | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256`; JSON `exitCode`, `stderr`, blocker message 검사 | exit `0`; SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`; nested process path와 `CreateProcessAsUserW failed: 5` 확인 |
| filter audit | `($env:PATH -split ';') \| Where-Object { $_ -notmatch '\\WindowsApps(?:\\|$)' }`를 child-only PATH로 적용한 뒤 `Get-Command codex,pwsh,powershell` 확인 | four WindowsApps entries removed; Codex `codex-cli 0.150.1`; `pwsh=<none>`; `powershell=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` |
| independent direct smoke | filtered PATH에서 `powershell.exe -NoProfile -Command '[Console]::WriteLine($PSHOME); [Console]::WriteLine("FESA_CODEX_SHELL_SMOKE_OK")'` | exit `0`; `$PSHOME=C:\Windows\System32\WindowsPowerShell\v1.0`; exact `FESA_CODEX_SHELL_SMOKE_OK` |
| same-envelope nested Codex smoke | Coordinator/root evidence: Codex `0.150.1`, Terra/xhigh, `--disable unified_exec`, `workspace-write`, aligned `CODEX_HOME`, all-WindowsApps filter | exit `0`; selected system Windows PowerShell and printed exact `FESA_CODEX_SHELL_SMOKE_OK` |
| recovered attempt-1 RED | `ctest --preset windows-msvc-ninja-debug -R 'GlobalForceAndMoment' --output-on-failure` before comparator GREEN | exit `8`; preserved old `<=1e-10` rejected both `5e-9` and exact `1e-8` in `NSNR-REF-024` |
| recovered attempt-1 GREEN | same focused GlobalForceAndMoment CTest after comparator-only shared gate became `1e-8` | exit `0`; 2/2 passed, including inclusive boundary and exact-zero-scale tests |
| focused implementation evidence | attempt-1 focused procedure, HDF5 and global-balance runs; attempt-2 `LastTest.log` named-test audit | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024`, `NSNR-REF-025` all present as passed |
| attempt-2 Stop full CTest | `.harness/build-ninja-msvc-debug/Testing/Temporary/LastTest.log`, SHA-256 `41CA3D4E410F7BFD55E50FC7D40A79D00D26116945C468E74F0E38720E676447` | 302 `Testing` rows, 0 failure markers, final `302/302`; root/Coordinator records full `302/302` pass |
| new full build/CTest | not run | existing evidence was sufficient and dispatch prohibited unnecessary Harness/build/CTest rerun |
| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 code/test/CMake를 변경하지 않았다. |
| Harness Python pytest | not applicable | runner, Hook 또는 agent config를 변경하지 않았다. |
Attempt-1 RED/GREEN은 recovered immutable execution evidence이며 이 correction에서 재현하거나 새로 주장한 RED가 아니다. Current code를 old threshold로 되돌리지 않았고 reference artifact도 실행·수정하지 않았다.
@@ -1,261 +0,0 @@
# Nonlinear Static Newton-Raphson 수치 검토
## 1. Metadata
- 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: `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`
- source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirements_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`
- source_research: `docs/nonlinear-static-newton-raphson/research.md`
- source_research_sha256: `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570`
- repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/TOLERANCE.md`
- decision_source: `USER-DECISION-004 option 1`
- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8`
- diagnostic_evidence: `docs/nonlinear-static-newton-raphson/lessons.md` §13,
`docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md`
- status: `pass-for-io-definition`
- owner_agent: `numerical-review-agent`
- date: `2026-08-28`
- post_closure_addendum_date: `2026-08-29`
- post_closure_additive_case: `shellnl-meshfine-02-s4-final`
이 검토는 정식화를 수학·수치 알고리즘 계약으로 검토하고 기존 reference artifact를
읽기 전용으로 조사했다. C++ API, 최종 HDF5 dataset path, implementation plan 또는
reference artifact를 설계·실행·생성·수정하지 않았다.
## 2. Review Verdict
- verdict: `pass-for-io-definition`
- reason: 승인 정식화는 fixed-initial-reference Total Lagrangian MITC4, finite rotation,
nonlinear `24 -> 20` map, objective drilling, same-trial residual/tangent, reaction의
spatial-moment 변환과 current-arm global balance를 구현 가능한 수치 계약으로 정의한다.
Revised requirements와 충돌하는 formulation defect는 없다.
- reaction disposition: local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`는 exact
source-key/schema/inventory/finite/error evidence를 유지하는 `review-only`다. 이 값은
formulation-sensitive nodal redistribution이므로 blocking verdict를 결정하지 않는다.
Local `RM3`는 계속 제외한다.
- blocking equilibrium: 각 nonlinear case의 factor-one accepted state에서 `(a)` global
applied-plus-reaction force balance, `(b)` global applied-plus-reaction moment balance,
`(c)` accepted free-DOF force/moment residual evidence가 blocking이다. `(d)` constrained
reaction resultant는 별도 quantity로 보존하지만 balance error를 대신하지 않는다.
- reference readiness: `reference/shell`, `reference/shellNL`와
`reference/shellNL-meshfine`의 선언 input 및 필요한 displacement/reaction CSV가 존재하고
읽을 수 있다. Fine case는 사용자가 요청한 mesh-refined nonlinear evidence이며 coarse
case와 서로의 reference에 독립적으로 비교한다. Merge 후 추가된 read-only
`reference/shellNL-meshfine_02` bundle도 별도 verification 대상으로 inventory했다. 이
post-closure 추가는 기존 세 case의 gate, 과거 Stage 6 comparison 또는 Release verdict를
소급 변경하지 않는다.
- boundary: `pass-for-io-definition`은 I/O 계약을 다시 정의할 수 있다는 뜻이며 reference
comparison pass, implementation completion, physics 또는 release 승인이 아니다.
## 3. Critical Findings
### 3.1 Confirmed defects
Formulation Agent 또는 Research Agent로 반환할 confirmed defect는 없다. Formulation
§11.4는 constrained generalized reaction과 spatial physical moment를 구분하고, §13.4는
global origin `[0,0,0]`, current nodal position과 physical spatial moment를 사용하는
applied-plus-reaction balance를 명시한다.
### 3.2 Required downstream correction: `AUDIT-001`
Stage 5/6은 같은 accepted state에서 다음 세 quantity를 서로 바꿔 쓰지 않아야 한다.
1. **Global applied-plus-reaction balance error**: applied와 constrained reaction을 더한
force `[3]`와 moment `[3]`; blocking.
2. **Constrained reaction resultant**: constrained reaction만 합한 force `[3]`와 current-arm
moment `[3]`; distinct nonblocking reaction summary.
3. **Accepted free residual**: stable free-DOF source/component rows와 force/moment channel gate;
blocking.
현재 nonlinear implementation helper는 full residual을 합하고 initial Domain coordinates와
raw rotational generalized residual을 사용한다. 현재 `shellNL`/`shellNL-meshfine` support는
prescribed `u=phi=0`이므로 initial/current support arm과 generalized/spatial support moment가
일치하고, 이 helper는 작은 free residual을 제외하면 constrained reaction resultant에
가깝다. 그러나 applied load를 더한 balance error는 아니며 세 quantity 중 어느 것도
일반적으로 대체하지 못한다. 지원 범위의 nonzero prescribed translation/rotation에서는
반드시 current position과 `J_l(phi)^(-T)` spatial-moment conversion을 적용해야 한다.
### 3.3 Numerical risks and nonblocking artifact issue
- Fine stress CSV에는 element `1`, `SNEG`의 `Node Label=ss` 한 행이 있다. Stress는 승인된
FESA Gauss direct recovery와 위치가 다르고 수치 comparison에서 제외되므로 이 optional
inspection artifact의 malformed identity는 I/O 진입 blocker가 아니다. Artifact를 repair,
normalize 또는 rewrite하지 않는다.
- Coarse/fine Abaqus `S4`와 FESA MITC4가 동일한 local support reaction distribution을
만들어야 한다는 formulation evidence는 없다. Global balance와 free residual로 blocking
physics를 검증하고 local rows는 오차를 숨기지 않은 채 review-only로 남긴다.
- Stored cases의 response는 weak geometric-nonlinear regime다. Reference displacement pass가
tangent, objectivity, finite-rotation 또는 rollback 검증을 대신하지 않는다.
- `shellNL-meshfine_02`는 topology와 constraint inventory는 fine case와 같지만 source load가
`F1=+1e8`, `F2=+1e8`, `F3=-1e8`이다. 기존 fine case의 `F3=-1e5`와 같은 물리 case 또는
mesh-only refinement로 취급하지 않으며 각자의 reference에만 비교한다.
### 3.4 Open questions
I/O Definition 진입을 막는 open question은 없다. Public large-response benchmark, shell MMS와
broader locking/distortion portfolio는 useful future evidence지만 이번 gate의 추가 조건이 아니다.
## 4. Numerical Risk Assessment
| risk label | assessment | required control / downstream evidence |
| --- | --- | --- |
| `rigid_body_modes` | Physical/internal/drill energy는 finite rigid motion에서 objective하고 pure drill만 regularized 되어야 한다. | finite rigid superposition에서 strain, stress, physical energy, drill gamma/energy와 residual covariance를 blocking invariant로 확인한다. |
| `patch_test` | Green-Lagrange direct strain과 MITC tied shear는 같은 trial 및 first/second variation을 써야 한다. | membrane, bending, twist, transverse-shear patch와 linear limit을 확인한다. |
| `symmetry` | Applied nodal moment가 없으면 physical/drill tangent는 exact arithmetic에서 symmetric이다. Fixed-spatial moment work tangent는 일반적으로 nonsymmetric다. | no-moment case만 scaled symmetry gate를 적용하고 moment case는 derivative consistency로 검증한다. |
| `positive_definiteness` | Nonlinear tangent는 compression/near-buckling에서 indefinite일 수 있다. | positive definiteness를 global gate로 만들지 않고 singular/malformed tangent와 물리적 indefiniteness를 구분한다. |
| `hourglass` | S4/S4R 모두 `2 x 2 x 2` full integration이며 reduced/hourglass path는 범위 밖이다. | source label로 integration 또는 stabilization을 바꾸지 않는 test가 필요하다. |
| `shear_locking` | MITC shear tying은 transverse-shear locking을 완화하지만 general locking-free를 보장하지 않는다. | patch/reference evidence를 blocking으로, broader thin/thick study를 characterization으로 둔다. |
| `volumetric_locking` | approved plane-stress shell과 `nu < 0.5` 범위에서는 `N/A`다. | 3-D incompressible behavior claim으로 확장하지 않는다. |
| `membrane_locking` | original-style MITC4는 curved/distorted nonlinear mesh에서 membrane locking 위험이 남는다. | known limitation으로 보존하고 MITC4+ 또는 Abaqus 내부 성능을 상속한다고 주장하지 않는다. |
| `distortion` | positive Jacobian만으로 accuracy는 보장되지 않지만 별도 calibrated quality cutoff는 승인되지 않았다. | 모든 Gauss/tying/center/recovery location을 fail-closed 검사한다. |
| `singular_jacobian` | `J0<=0`, `j<=0`, invalid reciprocal basis/polar stretch는 residual/tangent를 무효화한다. | failed point를 omit, average, clamp 또는 repair하지 않는다. |
| `conditioning` | thin geometry, small fixed drill scale와 near mechanism은 conditioning을 악화시킨다. | scale-aware diagnostics를 쓰고 hidden regularization/fallback을 금지한다. |
| `convergence` | Full Newton은 same-trial consistent tangent에 의존하고 line search/cutback이 없다. | NSNR-069/070, four-channel AND, iteration `1..100`, finite-first와 no retry를 고정한다. |
| `reaction_distribution` | local nodal support distribution은 element formulation/mesh/stabilization에 민감하다. | exact local error report는 유지하되 global balance/free residual만 blocking한다. |
## 5. Consistency Checks
| check | result | evidence |
| --- | --- | --- |
| units and dimensions | `pass` | Translation residual/reaction은 force, rotation residual/reaction moment는 force-length다. Force와 moment family 및 norm scale을 혼합하지 않는다. |
| signs | `pass` | `r=f_int-f_ext`; constrained entry는 reaction, free entry는 equilibrium evidence다. Balance는 `applied+reaction`이고 reaction resultant는 reaction만 합한다. |
| DOF ordering | `pass` | Global node order `[UX,UY,UZ,URX,URY,URZ]`; stable free/constrained partition과 `Delta q_c=0`을 보존한다. |
| coordinates and moment conversion | `pass-with-handoff` | Global origin `[0,0,0]`, current arm `X+u`, spatial moment `J_l(phi)^(-T) r_phi`가 승인 의미다. `AUDIT-001` 구현 projection audit가 남는다. |
| kinematic operator | `pass` | Green-Lagrange strain, MITC shear projection 및 first/second variation은 same-trial identity다. |
| constitutive contract | `pass` | Constant symmetric `C5`가 fixed-reference engineering strain을 second Piola-Kirchhoff stress로 매핑하며 material history가 없다. |
| Jacobian rules | `pass` | Fixed `J0`가 integration measure, current `j`와 `det(Fc)`가 validity predicate다. |
| integration | `pass` | S4/S4R 공통 four midsurface by two thickness points; reduced/selective integration은 금지한다. |
| residual/tangent | `pass` | Material/geometric/map-Hessian/drill/moment-work derivative가 complete same-trial tangent를 이룬다. |
| recovery locations | `pass-with-handoff` | Nodal U/UR/reaction 및 Gauss direct shell recovery logical meaning은 정의되었다. Final dataset projection은 I/O-owned다. |
| reference identity | `pass` | Case/state/instance/source label/component로 match하고 row order를 identity로 쓰지 않는다. |
## 6. Verification Readiness
### 6.1 Blocking internal numerical tests
기존 승인 수치 portfolio를 유지한다.
1. Stress-free `q=0` linear MITC4 residual/tangent/recovery와 physical/drill split.
2. `||Q^TQ-I||_F<=1e-12`, `|det(Q)-1|<=1e-12`, `d=Qe3` 및 branch margin.
3. Mixed translation/rotation scaled tangent directional derivative schedule와 interior scaled
error `<=1e-6`; zero analytical direction `<=1e-10`.
4. No-applied-moment scaled tangent symmetry `<=1e-12`; applied moment는 derivative
consistency만 검사한다.
5. Finite rigid objectivity의 scaled physical strain/stress/energy/drill/residual `<=1e-10`.
6. Membrane/bending/twist/shear patch, component order와 bottom/top stress sign.
7. Fixed-global force/moment identity, `rho_M<=1e-12`, absolute prescribed path와 zero
constrained Newton correction.
8. Exact fixed-factor sequence, factor one, iterations `1..100`, pass at 100, no 101/cutback/retry.
9. NSNR-069/070의 finite-first exact-zero/nonzero branches, inclusive thresholds와 four-channel AND.
10. Trial/recovery/solve/output failure rollback과 deterministic assembly/frame/row/diagnostic order.
### 6.2 Factor-one blocking equilibrium contract
각 nonlinear case의 accepted factor-one state에 대해
\[
\mathbf a_{F,I}=\mathbf F_I^{appl},\qquad
\mathbf c_{F,I}=\mathbf F_I^{react},
\]
\[
\mathbf a_{M,I}=(\mathbf x_I-\mathbf 0)\times\mathbf F_I^{appl}
+\mathbf M_I^{appl},\qquad
\mathbf c_{M,I}=(\mathbf x_I-\mathbf 0)\times\mathbf F_I^{react}
+\mathbf M_I^{react}
\]
를 stable source-node order로 계산한다. `x=X+u`이고 applied physical moment는 formulation
§13.4의 effective physical-work moment다. Define
\[
\mathbf e_F=\sum_I(\mathbf a_{F,I}+\mathbf c_{F,I}),\quad
S_F=\max\left(\sum_I\|\mathbf a_{F,I}\|_2,
\sum_I\|\mathbf c_{F,I}\|_2\right),
\]
\[
\mathbf e_M=\sum_I(\mathbf a_{M,I}+\mathbf c_{M,I}),\quad
S_M=\max\left(\sum_I\|\mathbf a_{M,I}\|_2,
\sum_I\|\mathbf c_{M,I}\|_2\right).
\]
Force와 moment는 각각 `rho_F=||e_F||2/S_F`, `rho_M=||e_M||2/S_M`로 검사하고 둘 다
`<=1e-8`이어야 한다. 이 threshold는 승인된 nonlinear acceptance value이며,
unclamped sum-of-contribution scale과 dimension-separated form은 승인된 linear MITC4
global-equilibrium convention을 유지한다. `S=0`이면 balance도
exact zero일 때만 `0`, 아니면 fail하며 absolute floor, `max(1,S)` 또는 zero clamp를 두지 않는다.
Accepted free residual은 cross-unit combined norm을 만들지 않는다. Factor-one accepted trial의
free translation-force와 free rotation-moment rows가 각각 NSNR-069의 exact gate를 다시
재현해야 한다: matching external scale이 nonzero이면 approved infinity-norm relative gate
`<=1e-2`, exact zero이면 typed absolute `<=1e-3` force 또는 force-length다. 두 channel 모두
finite-first로 통과해야 한다.
### 6.3 Downstream reference comparisons
- `shellnl-meshfine-s4-final`: 사용자가 요청한 mesh-refined primary nonlinear case.
- `shellnl-s4-final`: coarse nonlinear companion regression.
- `shell-s4-linear-limit`: existing linear-limit/source-identity regression.
- `shellnl-meshfine-02-s4-final`: merge 후 추가된 post-closure nonlinear case. 과거 canonical
Stage 6 `reference-comparison.md`의 비교 대상이 아니며 merge된 current code로 별도 실행·비교한다.
각 case의 `U1/U2/U3`는 blocking이고 `UR1/UR2/UR3`는 warning-only다. Coarse/fine은 각자의
input/CSV와 독립 family로 비교하며 cross-mesh interpolation, row collapse 또는 observed-order
claim을 만들지 않는다. Local RF/RM family는 common external tolerance로 오차를 전부
기록하지만 review-only다. `RM3`와 stress는 수치 comparison에서 제외한다.
### 6.4 Post-closure additive case boundary
`shellnl-meshfine-02-s4-final`은 729 nodes, 676 S4 elements, `NLGEOM=YES`,
`*STATIC 0.1,1.,0.001,0.1`, all-six-DOF `Set-2` 104 constrained nodes를 가진다. Exact
factor-one displacement/reaction/stress CSV는 각각 729/729/5,408 rows이며 audited key는
unique이고 required numeric value는 finite다. U1/U2/U3 2,187 rows는 blocking,
UR1/UR2/UR3 2,187 rows는 warning-only, local RF1/RF2 208 rows, RF3 104 rows와 physical
spatial RM1/RM2 208 rows는 review-only다. RM3와 stress는 excluded다.
Internal factor-one families는 fine case와 같은 row/gate 구조를 사용한다: free force residual
1,875 rows, free moment residual 1,875 rows, global force balance 3 components와 global moment
balance 3 components다. External family는 `docs/TOLERANCE.md`, internal free residual과 global
balance는 Sections 6.2의 승인 gate를 그대로 사용한다. 이 문서 addendum은 comparison success를
판정하지 않으며 Implementation Agent가 merge된 current code의 별도 evidence를 소유한다.
## 7. Required Revisions
### Formulation Agent
없음. §11.4/§13.4의 reaction, spatial moment와 global balance 의미는 revised requirements를
충족한다.
### Research Agent
없음. Stored fine-mesh case와 internal invariant portfolio가 이번 I/O gate에 충분하다.
### I/O Definition Agent
`reference-model.md`의 logical quantities와 source identity를 최종 projection으로 연결한다.
`AUDIT-001`의 balance error, constrained reaction resultant, accepted free residual을 별도
quantity로 유지한다. Current-arm/spatial-moment semantics와 factor-one identity를 보존하고
local RF/RM review-only disposition을 blocking으로 되돌리지 않는다.
## 8. Downstream Handoff
Coordinator를 통해 I/O Definition Agent에 전달한다.
- `pass-for-io-definition`; blockers: 없음.
- External families는 `docs/TOLERANCE.md`를 그대로 사용한다. Independent absolute floor,
averaging, collapse, source-order matching, clamp 또는 calibration gate를 추가하지 않는다.
- Internal factor-one global force/moment balance는 Section 6.2의 dimension-separated normalized
`1e-8` gate, accepted free residual은 NSNR-069 force/moment gate를 사용한다.
- Fine primary와 coarse companion nonlinear cases 모두 U blocking/UR warning-only를 유지한다.
- Post-closure `shellnl-meshfine-02-s4-final`도 같은 U/UR 및 local RF/RM disposition을 사용하되,
과거 canonical comparison/Release verdict에 소급 포함하지 않고 별도 current-code verification으로
보고한다.
- Local RF1/RF2, RF3, spatial RM1/RM2는 separate review-only families이며 error/precheck를
생략하지 않는다. RM3/stress는 excluded다.
- Fine optional stress identity anomaly는 그대로 기록하고 artifact를 수정하지 않는다.
- Abaqus S4와 FESA MITC4의 formulation, integration, stabilization 또는 내부 알고리즘
동등성을 주장하지 않는다.
@@ -1,346 +0,0 @@
# Nonlinear Static Newton-Raphson Reference Model
## 1. Metadata
- feature_id: `nonlinear-static-newton-raphson`
- source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirements_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`
- 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`
- decision_source: `USER-DECISION-004 option 1`
- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8`
- status: `pass-for-io-definition`
- owner_agent: `numerical-review-agent`
- date: `2026-08-28`
- post_closure_addendum_date: `2026-08-29`
- post_closure_additive_case: `shellnl-meshfine-02-s4-final`
- artifact_policy: `read-only-existing-files`
- external_tolerance_policy: `docs/TOLERANCE.md`
이 문서는 logical quantity, source identity, component matching, row precheck와
blocking/warning-only/review-only 분류를 정의한다. 최종 HDF5 dataset projection은 I/O
Definition Agent 소유이며 이 문서에는 dataset path를 정의하지 않는다.
## 2. Reference Acceptance Scope
승인 closure 계약의 세 stored case를 유지하고 merge 후 별도 검증할 한 case를 추가한다.
- `shellnl-meshfine-s4-final`: 사용자가 추가하고 검증을 요청한 729-node/676-element
mesh-refined nonlinear primary case. External `U1/U2/U3`와 factor-one internal equilibrium은
blocking이다.
- `shellnl-s4-final`: 49-node/36-element coarse nonlinear companion regression. Fine case와
별도 reference에 대해 external `U1/U2/U3`와 factor-one internal equilibrium을 blocking으로
검증한다.
- `shell-s4-linear-limit`: 같은 coarse topology의 `NLGEOM=NO` linear-limit/source-identity
regression. Nonlinear response evidence로 부르지 않는다.
- `shellnl-meshfine-02-s4-final`: 729-node/676-element post-closure nonlinear additive case.
과거 canonical Stage 6 `reference-comparison.md`에는 포함되지 않았으며 merge된 current code로
별도 verification한다. 이 pending comparison은 기존 세 case의 승인 gate 또는 Release verdict를
소급 변경하지 않는다.
모든 selected case에서 displacement `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는
warning-only다. Coarse/fine/post-closure local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`는
common external policy로 exact error/precheck evidence를 만들되 review-only이고 전체 blocking
verdict를 바꾸지 않는다. Local `RM3`와 stress는 numerical comparison에서 제외한다.
Coarse와 fine은 각자의 input/CSV에 독립적으로 비교한다. 두 mesh 사이 node interpolation,
row pairing, averaging, collapse, observed convergence order 또는 direct coarse/fine equality
gate를 만들지 않는다. Fine case 추가는 Abaqus S4와 FESA MITC4의 element formulation,
integration, stabilization 또는 internal behavior equivalence를 의미하지 않는다.
`shellnl-meshfine-02-s4-final`도 자기 input/CSV에만 독립적으로 비교하고 기존 fine case와
cross-case equality 또는 mesh-convergence gate를 만들지 않는다.
## 3. Reference Case Inventory
### 3.1 Exact input and CSV paths
| case id | purpose | exact path | required disposition | observed status |
| --- | --- | --- | --- | --- |
| `shell-s4-linear-limit` | linear input | `reference/shell/shell.inp` | required | readable; S4, 49 nodes, 36 elements, `NLGEOM=NO` |
| `shell-s4-linear-limit` | displacement reference | `reference/shell/shell displacements.csv` | required blocking/warning | 49 unique finite rows; single final static state |
| `shell-s4-linear-limit` | reaction inventory | `reference/shell/shell reactions.csv` | inspection-only | 49 unique finite rows |
| `shell-s4-linear-limit` | stress ordering inventory | `reference/shell/shell stresses.csv` | optional inspection | 288 rows; element labels `1..36` in contiguous ascending blocks |
| `shellnl-s4-final` | coarse nonlinear input | `reference/shellNL/shellNL.inp` | required | readable; S4, 49 nodes, 36 elements, `NLGEOM=YES` |
| `shellnl-s4-final` | displacement reference | `reference/shellNL/shellNL displacements.csv` | required blocking/warning | 49 unique finite rows; exact factor-one Frame |
| `shellnl-s4-final` | local reaction reference | `reference/shellNL/shellNL reactions.csv` | required review-only | 49 unique finite inventory rows; exact factor-one Frame |
| `shellnl-s4-final` | stress inventory | `reference/shellNL/shellNL stresses.csv` | optional inspection | 288 rows; element labels `1..36` in contiguous ascending blocks |
| `shellnl-meshfine-s4-final` | fine nonlinear input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | required | readable; S4, 729 nodes, 676 elements, `NLGEOM=YES` |
| `shellnl-meshfine-s4-final` | displacement reference | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning | 729 unique finite rows; exact factor-one Frame |
| `shellnl-meshfine-s4-final` | local reaction reference | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | required review-only | 729 unique finite inventory rows; exact factor-one Frame |
| `shellnl-meshfine-s4-final` | stress inventory | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional inspection | 5,408 rows in ascending element blocks; one malformed optional node label `ss` |
| `shellnl-meshfine-02-s4-final` | post-closure nonlinear input | `reference/shellNL-meshfine_02/shellNL-meshfine_02.inp` | required for separate verification | readable; S4, 729 nodes, 676 elements, `NLGEOM=YES` |
| `shellnl-meshfine-02-s4-final` | displacement reference | `reference/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv` | required blocking/warning | 729 unique finite rows; exact factor-one Frame |
| `shellnl-meshfine-02-s4-final` | local reaction reference | `reference/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv` | required review-only | 729 unique finite inventory rows; exact factor-one Frame |
| `shellnl-meshfine-02-s4-final` | stress inventory | `reference/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv` | optional inspection | 5,408 unique finite inventory rows; excluded from numerical comparison |
`reference/shell/shell stresses.csv`는 사용자 변경 후 element label `1..36` 순서로 저장되어
있음을 확인했다. Row order는 matching identity가 아니며 deterministic inspection display에만
사용한다. Fine stress의 `Element Label=1`, `SNEG`, `Node Label=ss` 한 행은 optional excluded
artifact issue다. 이 파일을 rename, repair, normalize 또는 rewrite하지 않는다.
Coarse와 fine nonlinear input은 homogeneous isotropic material `E=2.1e11`, `nu=0.3`,
shell thickness `0.5`, center node-set load `DOF 3 = -100000`, all-six-DOF perimeter support,
`*STATIC 0.1,1.,0.001,0.1`을 사용한다. Fine case는 같은 physical setup의 refined topology다.
Post-closure `_02` input은 같은 fine topology, material, section, `Set-2` 104-node all-six-DOF
support와 `*STATIC`을 사용하지만 source load는 `F1=+1e8`, `F2=+1e8`, `F3=-1e8`이다.
따라서 기존 fine case의 `F3=-1e5`와 동일 case로 취급하지 않는다.
### 3.2 Read-only artifact hashes
| exact path | SHA-256 |
| --- | --- |
| `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| `reference/shell/shell reactions.csv` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` |
| `reference/shell/shell stresses.csv` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` |
| `reference/shellNL/shellNL.inp` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| `reference/shellNL/shellNL displacements.csv` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shellNL-meshfine/shellNL-meshfine.inp` | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` |
| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` |
| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` |
| `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` |
| `reference/shellNL-meshfine_02/shellNL-meshfine_02.inp` | `DAEC7592489837B165D55382CAEAF53E21D84D804AA38C73CBF35E5CC0BAC3E5` |
| `reference/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv` | `18EC051D265E0BD2C441FE73C08E097B83EE85BC2EB32FFBE3AF0DCB9CB89672` |
| `reference/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv` | `59348996E0CE80687C9EB2747EEABF84ACED4CE97F8A56F0FFDDBDCA404A57A3` |
| `reference/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv` | `933A72025A0E897FD65F81C913E53D1730BD551CE95CBDEA96F9F99B10BE8B18` |
Post-closure artifact byte counts는 input `56,554`, displacement `110,555`, reaction
`109,000`, stress `1,036,916`이다. Hash와 byte count는 read-only audit evidence이며 artifact를
rewrite하거나 canonical Stage 6 evidence로 소급 재분류하지 않는다.
## 4. Source Identity and Component Contract
### 4.1 Case and accepted-state identity
- Instance identity는 case-insensitive semantic match다. Artifact spelling `Part-1-1`과
`PART-1-1`은 같은 instance이지만 file text를 rewrite하지 않는다.
- 세 nonlinear case required rows의 exact CSV Frame은
`Increment 10: Step Time = 1.000`이며 accepted factor-one state에 대응한다.
- Linear case에는 `Frame` column이 없고 single final static state로 해석한다.
- Row order는 identity가 아니다. Stable key match 후 deterministic reporting order로만 정렬한다.
### 4.2 Nodal displacement and rotation
CSV `U-U1/U-U2/U-U3`는 logical `U1/U2/U3`, `UR-UR1/UR-UR2/UR-UR3`는
logical `UR1/UR2/UR3`에 대응한다. Key는
```text
(case_id, accepted_state, canonical_instance_name, source_node_label, component)
```
이다. Coarse/linear은 labels `1..49`, fine과 post-closure `_02`는 `1..729`를 각각 정확히 한 번 요구한다.
U는 global length/blocking, UR은 fixed-initial global rotation-vector/warning-only다.
### 4.3 Local reaction review contract
Reaction source rows는 input `Set-2` constraint mask로 선택한다.
- coarse: `1, 3..9, 14..17, 22..33` — 24 nodes, all six DOFs constrained.
- fine: `1, 3..9, 34..57, 82..153` — 104 nodes, all six DOFs constrained.
- post-closure `_02`: fine과 같은 exact `Set-2` inventory — 104 nodes, all six DOFs constrained.
다른 CSV node rows는 file/schema/finite inventory지만 local reaction numerical rows가 아니다.
Free FESA entries는 reaction이 아니라 accepted free residual evidence다.
| CSV components | logical quantity | matching FESA meaning | disposition |
| --- | --- | --- | --- |
| `RF-RF1`, `RF-RF2` | in-plane local reaction force | constrained translational full residual, global force | `review-only` |
| `RF-RF3` | transverse local reaction force | constrained translational full residual, global force | `review-only` |
| `RM-RM1`, `RM-RM2` | tangent-plane physical reaction moment | constrained generalized residual converted by `J_l(phi)^(-T)`, global spatial force-length | `review-only` |
| `RM-RM3` | director/drilling-axis row | no approved physical external equivalence target | `excluded` |
Raw generalized rotational residual을 CSV RM에 직접 match하지 않는다. Review-only는 row omission을
허용한다는 뜻이 아니다. Exact row precheck와 common-policy error/RMS를 모두 보고하되 그 결과가
blocking verdict를 변경하지 않는다는 뜻이다.
### 4.4 Distinct factor-one equilibrium quantities
각 nonlinear case에서 같은 accepted factor-one state를 사용한다.
| logical quantity | source identity / projection | components | disposition |
| --- | --- | --- | --- |
| accepted free residual | input mask로 결정한 stable free `(instance,node,global DOF component)` rows; force와 moment channel 분리 | free `UX/UY/UZ`; free `URX/URY/URZ` generalized covectors | `blocking-internal` |
| constrained reaction resultant | constrained source rows만 current arm과 spatial physical moment로 합산 | force `[1,2,3]`; moment `[1,2,3]` | `review-only-summary` |
| applied-plus-reaction balance error | all resolved applied sources plus constrained reactions; global origin `[0,0,0]`; `x=X+u`; physical spatial nodal moments | force `[1,2,3]`; moment `[1,2,3]` | `blocking-internal` |
Constrained reaction resultant force is `sum(F_react)`. Its moment is
`sum(x cross F_react + M_react)`. Balance error adds the corresponding applied force and
`x cross F_appl + M_appl`. Accepted free residual is neither sum. 세 quantity는 exact
source/state identity를 공유하지만 interchangeable하지 않다.
현재 stored case의 constrained prescribed `u=phi=0` 때문에 support current arm과 initial arm,
generalized moment와 spatial moment가 수치적으로 일치한다. 이는 supported general nonzero
prescribed translation/rotation에서 initial arm/raw rotational residual을 재사용할 근거가 아니다.
### 4.5 Stress inventory and exclusion
Stress inspection key는
```text
(case_id, accepted_state, instance, element label,
element-corner node label, SPOS/SNEG section surface, component)
```
이다. Stored stress는 element-corner SPOS/SNEG rows이고 FESA 승인 recovery는 midsurface Gauss
locations의 direct bottom/middle/top `[S11,S22,S12]`다. Nodal extrapolation/averaging을 만들지
않으며 `S-S11/S-S22/S-S12/S-S33` 어느 것도 external family에 포함하지 않는다.
### 4.6 External comparison families
| family id | components / source rows | rows | units / coordinates | disposition |
| --- | --- | ---: | --- | --- |
| `linear.translation` | U1/U2/U3; nodes `1..49` | 147 | length / global | `blocking` |
| `linear.rotation` | UR1/UR2/UR3; nodes `1..49` | 147 | dimensionless / fixed-initial global | `warning-only` |
| `coarse.translation` | U1/U2/U3; nodes `1..49` | 147 | length / global | `blocking` |
| `coarse.rotation` | UR1/UR2/UR3; nodes `1..49` | 147 | dimensionless / fixed-initial global | `warning-only` |
| `coarse.local_reaction_inplane_force` | RF1/RF2; 24 constrained nodes | 48 | force / global shell plane | `review-only` |
| `coarse.local_reaction_transverse_force` | RF3; 24 constrained nodes | 24 | force / global transverse | `review-only` |
| `coarse.local_reaction_physical_moment` | RM1/RM2; 24 constrained nodes | 48 | force-length / global spatial | `review-only` |
| `fine.translation` | U1/U2/U3; nodes `1..729` | 2,187 | length / global | `blocking` |
| `fine.rotation` | UR1/UR2/UR3; nodes `1..729` | 2,187 | dimensionless / fixed-initial global | `warning-only` |
| `fine.local_reaction_inplane_force` | RF1/RF2; 104 constrained nodes | 208 | force / global shell plane | `review-only` |
| `fine.local_reaction_transverse_force` | RF3; 104 constrained nodes | 104 | force / global transverse | `review-only` |
| `fine.local_reaction_physical_moment` | RM1/RM2; 104 constrained nodes | 208 | force-length / global spatial | `review-only` |
| `meshfine02.translation` | U1/U2/U3; nodes `1..729` | 2,187 | length / global | `blocking` |
| `meshfine02.rotation` | UR1/UR2/UR3; nodes `1..729` | 2,187 | dimensionless / fixed-initial global | `warning-only` |
| `meshfine02.local_reaction_inplane_force` | RF1/RF2; 104 constrained nodes | 208 | force / global shell plane | `review-only` |
| `meshfine02.local_reaction_transverse_force` | RF3; 104 constrained nodes | 104 | force / global transverse | `review-only` |
| `meshfine02.local_reaction_physical_moment` | RM1/RM2; 104 constrained nodes | 208 | force-length / global spatial | `review-only` |
### 4.7 Internal blocking verification families
| family id | exact rows/components | gate |
| --- | --- | --- |
| `coarse.accepted_free_force_residual` | 75 free translation DOFs | NSNR-069 force channel, factor one |
| `coarse.accepted_free_moment_residual` | 75 free rotation DOFs | NSNR-069 moment channel, factor one |
| `coarse.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `coarse.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `fine.accepted_free_force_residual` | 1,875 free translation DOFs | NSNR-069 force channel, factor one |
| `fine.accepted_free_moment_residual` | 1,875 free rotation DOFs | NSNR-069 moment channel, factor one |
| `fine.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `fine.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `meshfine02.accepted_free_force_residual` | 1,875 free translation DOFs | NSNR-069 force channel, factor one |
| `meshfine02.accepted_free_moment_residual` | 1,875 free rotation DOFs | NSNR-069 moment channel, factor one |
| `meshfine02.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` |
| `meshfine02.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` |
이 internal families에는 Abaqus CSV value 또는 `docs/TOLERANCE.md`를 적용하지 않는다.
Approved analytical/invariant gates이며 exact definitions는 `numerical-review.md` §6.2다.
## 5. Row Prechecks
Tolerance 또는 internal metric 전에 다음을 검사한다.
1. 각 case의 exact declared input과 해당 disposition에 필요한 CSV가 존재하고 readable하다.
2. Header는 surrounding whitespace만 trim하고 required names/components가 모두 있어야 한다.
3. Nonlinear required rows의 Frame은 exact factor-one identity여야 한다.
4. Wide CSV는 Section 4 contract로 component rows에 결정적으로 expand한다.
5. Wide key와 expanded key는 unique해야 한다. Duplicate는 affected family를 tolerance 전에 fail한다.
6. Input node inventory와 source constraint mask로 expected key set을 만든다. CSV zero values 또는
row position에서 reaction identity를 추론하지 않는다.
7. FESA와 reference projected key sets는 exact equal해야 한다. Missing과 extra rows를 모두 fail한다.
8. Required FESA/CSV/internal values와 derived scales/norms는 모두 finite여야 한다.
9. Internal free residual rows는 exact free mask와 force/moment partition을 보존한다. Global balance는
모든 applied source와 constrained reaction을 stable source order로 한 번씩만 사용한다.
10. Local review rows는 global resultant로 collapse하거나 대체하지 않는다. Review precheck failure는
deterministic review failure로 기록하지만 blocking verdict를 변경하지 않는다.
11. Warning-only precheck/tolerance failure는 deterministic warning을 만들고 blocking verdict를
변경하지 않는다. Blocking precheck failure는 전체 comparison을 fail한다.
12. Row omission/synthesis, averaging, source-order matching, clamp, normalization 또는 artifact repair를
허용하지 않는다.
Observed read-only nodal CSV audit:
| CSV | wide rows | duplicate keys | nonfinite required values | status |
| --- | ---: | ---: | ---: | --- |
| `reference/shell/shell displacements.csv` | 49 | 0 | 0 | readable |
| `reference/shellNL/shellNL displacements.csv` | 49 | 0 | 0 | readable |
| `reference/shellNL/shellNL reactions.csv` | 49 | 0 | 0 | readable |
| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 729 | 0 | 0 | readable |
| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 729 | 0 | 0 | readable |
| `reference/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv` | 729 | 0 | 0 | readable |
| `reference/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv` | 729 | 0 | 0 | readable |
| `reference/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv` | 5,408 | 0 | 0 | readable; optional excluded inventory |
## 6. Tolerance and Blocking/Warning Policy
### 6.1 External families
Section 4.6의 모든 external blocking, warning-only와 review-only error report는
`docs/TOLERANCE.md`를 그대로 사용한다.
- Reference-only `S=max(abs(reference_i))`, near-zero band `B=0.01*S`.
- `abs(reference_i)<=B`이면 `abs(fesa-reference)<=B`.
- 그 외 row는 relative error `<=0.05`.
- 모든 row와 `RMS(error)/S<=0.01`이 함께 pass해야 family가 pass한다.
- Independent absolute floor, `max(1,S)`, omission, averaging 또는 zero clamp는 없다.
- `S=0`이면 모든 FESA 값도 exact zero일 때만 pass한다.
Observed reference-only scales는 reader/family audit evidence이며 calibration 값이 아니다.
| family | rows | `S` | `B=0.01*S` |
| --- | ---: | ---: | ---: |
| `linear.translation` | 147 | `2.37408203e-5` | `2.37408203e-7` |
| `linear.rotation` | 147 | `7.60725743e-6` | `7.60725743e-8` |
| `coarse.translation` | 147 | `2.37408203e-5` | `2.37408203e-7` |
| `coarse.rotation` | 147 | `7.60725743e-6` | `7.60725743e-8` |
| `coarse.local_reaction_inplane_force` | 48 | `1.91663182` | `1.91663182e-2` |
| `coarse.local_reaction_transverse_force` | 24 | `1.17769805e4` | `1.17769805e2` |
| `coarse.local_reaction_physical_moment` | 48 | `1.95418418e4` | `1.95418418e2` |
| `fine.translation` | 2,187 | `2.57957054e-5` | `2.57957054e-7` |
| `fine.rotation` | 2,187 | `6.58704994e-6` | `6.58704994e-8` |
| `fine.local_reaction_inplane_force` | 208 | `5.38827419e-1` | `5.38827419e-3` |
| `fine.local_reaction_transverse_force` | 104 | `2.78506128e3` | `2.78506128e1` |
| `fine.local_reaction_physical_moment` | 208 | `4.71557520e3` | `4.71557520e1` |
| `meshfine02.translation` | 2,187 | `0.0257712454` | `0.000257712454` |
| `meshfine02.rotation` | 2,187 | `0.00658291345` | `0.0000658291345` |
| `meshfine02.local_reaction_inplane_force` | 208 | `3347707` | `33477.07` |
| `meshfine02.local_reaction_transverse_force` | 104 | `2802821.5` | `28028.215` |
| `meshfine02.local_reaction_physical_moment` | 208 | `4722449.5` | `47224.495` |
Blocking family의 precheck/row/RMS failure만 전체 external-reference verdict를 fail한다.
Warning-only는 warning, review-only는 deterministic review finding/error table을 남기지만
blocking verdict를 바꾸지 않는다. `RM3`와 stress는 family를 만들지 않는다.
### 6.2 Internal equilibrium families
- Accepted free force/moment residual은 factor-one accepted trial에서 NSNR-069을 그대로
재현한다. Nonzero matching external scale이면 infinity-norm relative `<=1e-2`; exact-zero
scale이면 typed absolute `<=1e-3` force 또는 force-length다.
- Global force/moment balance는 `numerical-review.md` §6.2의 sum-of-contribution scale과
dimension-separated normalized metric을 사용하며 각각 `<=1e-8`이다.
- Internal gate에 external family tolerance, absolute floor, reference-derived scale 또는 local
nodal reaction error를 섞지 않는다.
## 7. Open Issues and I/O Handoff
Open issues blocking I/O Definition: 없음.
Post-closure verification status: `shellnl-meshfine-02-s4-final`은 artifact/schema/family contract가
준비되었지만 과거 canonical Stage 6 comparison에는 포함되지 않았다. Merge된 current code의
별도 실행과 comparison evidence는 Implementation Agent 소유이며 이 inventory는 pass/fail을
선언하지 않는다. 이 pending evidence는 기존 feature closure 또는 Release verdict를 바꾸지 않는다.
I/O Definition Agent handoff through Coordinator:
- Fine primary와 coarse companion nonlinear case의 accepted factor-one identity를 보존한다.
- Post-closure `_02`는 기존 fine case와 독립 case/family로 projection하고 별도 current-code
verification에 사용한다.
- Section 4.4의 `(a)` applied-plus-reaction balance error, `(b)` constrained reaction resultant,
`(c)` accepted free residual을 separate logical quantities로 최종 projection한다.
- Global moment는 origin `[0,0,0]`, current `X+u` force arm과 spatial physical nodal moment를
사용한다. General nonzero prescribed translation/rotation에서도 initial arm/raw rotational
residual을 재사용하지 않는다.
- Local RF/RM은 exact source-key/schema/inventory/finite/error reporting이 있는 review-only다.
Local rows를 global sum으로 대체하거나 blocking으로 되돌리지 않는다.
- Approved Gauss direct stress recovery를 유지한다. Optional element-corner stress artifact에
맞춘 extrapolation/averaging 또는 stress comparison projection을 만들지 않는다.
- Common external tolerance와 exact prechecks를 변경하지 않는다.
Reference artifact status: required input/displacement/reaction artifacts are present and readable.
Optional fine stress identity issue는 transparent nonblocking inventory finding이다. 어떤 reference
artifact도 생성, rename, repair, normalize 또는 수정하지 않았다.
@@ -1,93 +0,0 @@
# Nonlinear Static Newton-Raphson Release Readiness
본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은
통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git
`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다.
## 1. Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| status | `ready-for-release` |
| owner_agent | `release-agent` |
| date | `2026-08-28` |
| authoritative requirements | `requirements.md`, SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` |
| implementation evidence | `implementation-report.md`, `build-test.md`, `reference-comparison.md` |
| physics evidence | `physics-evaluation.md`, SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538` |
| audit baseline | local/origin `feat-nonlinear-static-newton-raphson` HEAD `06861608da5ffa4c09b786c3f5052dc7c6604e1b` before the Coordinator-owned Stage 8 update |
| release meaning | FESA feature workflow closure readiness only; publish, deploy, package, tag 또는 external release 권한이 아님 |
Literal `feature_id`를 선언한 모든 source report는 `nonlinear-static-newton-raphson`과 일치한다.
`reference-comparison.md`에는 literal `feature_id` field가 없지만 exact bundle path
`docs/nonlinear-static-newton-raphson/verification.md`, title, current SHA-256와 Stage 6
handoff chain, 그리고 Physics report의 exact source hash가 같은 feature에 결정적으로 연결한다.
상충하는 feature identity는 없으므로 upstream report를 변경하지 않고 nonblocking metadata
omission으로 기록한다. `requirements.md`의 `status: draft`, `approved_by: pending user re-approval`과
`FESA-REQ-NSNR-069 status: draft`는 stale metadata다.
당시 Authoritative `coordination.md`는 그 requirements의 exact hash가 `2026-08-27` 사용자에게 명시적으로
재승인되었고 Stage 1이 `passed`임을 기록한다. 당시 Stage 4/5/6 문서도 같은 hash를 입력으로
사용하므로 실제 승인·수치 계약과의 모순은 없다.
## 6. Known Limitations
1. Coarse/fine local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`에는 six review-only
discrepancy families가 남아 있다. Exact source-key/schema/inventory/finite/error report는 유지하지만
blocking verdict는 global force/moment balance와 accepted free residual이 결정한다.
2. Local `RM3`는 approved physical external comparison target이 없어 excluded다.
3. Stored corner `SPOS/SNEG` stress와 FESA direct Gauss `BOTTOM/MIDDLE/TOP` stress는 위치·복구 identity가
다르므로 numerical comparison에서 제외된다. Fine optional stress CSV에는 element `1`, `SNEG`의
malformed `Node Label=ss` 한 행이 있으며 artifact를 repair하지 않는다.
4. `UR1/UR2/UR3` external comparison은 warning-only다. Current portfolio에서는 모두 통과했지만 향후
warning exceedance가 blocking failure로 자동 승격되지는 않는다.
5. Stored nonlinear plate responses는 weak geometric-nonlinear regime다. Finite-rotation/tangent/objectivity/
rollback은 internal invariant tests로 보강했지만 broad large-response benchmark 또는 experimental
validation claim은 하지 않는다.
6. Original-style MITC4는 curved/distorted/thin nonlinear mesh에서 membrane-locking과 conditioning
위험이 있다. MITC4+ 또는 Abaqus `S4/S4R` 성능을 상속한다고 주장하지 않는다.
7. 첫 release는 one-step, materially linear, fixed-increment Full Newton 범위다. Limit-point traversal,
material nonlinearity, follower/distributed load, adaptive increment와 broader Abaqus keyword compatibility는
지원하지 않고 fail-closed한다.
8. Rotation-vector principal chart, director/swing/twist branch와 geometry/Jacobian validity 밖의 상태는
fail-closed한다. No line search/cutback/retry이므로 difficult path의 automatic recovery를 보장하지 않는다.
9. Global force/moment `<=1e-8`은 comparator-owned internal verification gate이며 runtime user setting이나
`fesa.env` 계약이 아니다. External CSV families에는 별도로 `docs/TOLERANCE.md`만 적용한다.
10. Numerical agreement은 Abaqus formulation, integration, stabilization, state update 또는 recovery의
internal equivalence evidence가 아니다.
## 8. Release Verdict
- verdict: `ready-for-release`
- gate basis: full build/test evidence passed, reference comparison overall status is
`pass-for-physics-evaluation`, Physics status is `pass-for-release-agent`, 24/24 must requirements have
explicit acceptance/test/reference/release disposition, and no blocking evidence gap remains.
- qualification: six local RF/RM findings, stress/RM3 exclusions, warning-only UR와 model-coverage limitations are
approved and disclosed nonblocking limitations, not unresolved implementation defects.
- feature identity disposition: `reference-comparison.md`의 literal `feature_id` omission은 exact
path/title/hash/handoff binding으로 해소되고 contradictory identity가 없으므로 verdict를 낮추지 않는다.
- authority boundary: 이 verdict는 internal feature delivery closure recommendation이다. Publish, deploy,
package, tag, external release 또는 solver equivalence claim을 승인하지 않는다.
## 9. Handoff Recommendation
Coordinator Agent가 이 보고서의 exact path/hash와 `ready-for-release`를 독립 audit한 뒤 Stage 8을
`passed`로 기록하고 8-stage workflow를 closure할 것을 권고한다. Evidence gap return 또는 owning
sub-agent rework는 필요하지 않다. 사용자가 요청한 commit/push는 Coordinator/root가 Release gate
audit 후 별도로 수행해야 하며, 이 Release Agent는 commit, push, tag 또는 publish를 수행하지 않는다.
## 11. Open Issues
Blocking open issue는 없다.
| id | severity | disposition |
| --- | --- | --- |
| `RELEASE-META-001` | nonblocking documentation | `requirements.md`의 historical draft/pending metadata는 current-hash explicit user approval와 Coordinator Stage 1 pass로 해소된다. Upstream 문서는 이 gate에서 수정하지 않았다. |
| `RELEASE-META-002` | nonblocking documentation | `reference-comparison.md`에는 literal `feature_id` field가 없지만 exact bundle path/title/SHA-256/Stage 6 handoff와 Physics source hash가 feature identity를 결정적으로 고정한다. Contradictory identity는 없고 upstream report는 변경하지 않았다. |
| `RELEASE-LOCAL-001` | accepted risk | Six local RF/RM families remain review-only findings; global balance/free residual blocking evidence passed. |
| `RELEASE-STRESS-001` | accepted limitation | `RM3`와 stored stress numerical comparison은 excluded; fine optional malformed stress row는 read-only로 유지한다. |
| `RELEASE-COVERAGE-001` | known limitation | Weak nonlinear stored response와 original MITC4 curved/distorted membrane-locking risk가 broader claims를 제한한다. |
Missing required report, failed pass status, unresolved defect, missing declared comparison file 또는
contradictory acceptance evidence는 발견되지 않았다.
현재 build·reference·물리 실행 기록은 [검증 보고서](verification.md)에 통합했다. 과거 readiness와 현재 재검증 필요를 구분하며 이 정리는 새로운 release 감사가 아니다.
@@ -1,401 +0,0 @@
# Nonlinear Static Newton–Raphson 요구조건
## 1. Metadata
- feature_id: `nonlinear-static-newton-raphson`
- title: `Nonlinear Static Analysis Using Newton–Raphson`
- status: `draft`
- owner_agent: `requirement-agent`
- date: `2026-08-27`
- approved_by: pending user re-approval
- approval_date: pending
- authoritative_scope: materially linear, geometrically nonlinear `S4/S4R -> FESA-MITC4`
- independence: FESA는 독립 solver이며 Abaqus 또는 Midas의 내부 알고리즘 동등성을 주장하지 않는다.
- unit_policy: `.inp` 단위계를 추론하거나 변환하지 않고 사용자가 일관되게 제공한 단위계를 보존한다.
Parent needs: `NEED-NSNR-001` nonlinear procedure, `NEED-NSNR-002` physics/numerical correctness,
`NEED-NSNR-003` state/output integrity, `NEED-NSNR-004` independent verification.
## 2. Purpose and Expected Behavior
FESA는 하나의 지원 nonlinear static step을 scalar load factor로 증가시키며 Full Newton–Raphson으로 각 증분의 평형을 구한다. 수렴한 증분만 atomically commit하고 authoritative accepted result로 기록한다. 기존 linear-static physics와 결과 의미는 보존하되 repository-wide derived output naming은 이 기능과 함께 적용할 승인 방향이다.
## 3. In Scope
- Abaqus source `S4`, `S4R`의 FESA-MITC4 mapping과 homogeneous isotropic linear elasticity
- fixed-initial-reference Total Lagrangian geometric nonlinearity와 finite rotational state
- same-trial residual/algorithmically consistent tangent, fresh factorization/solve의 Full Newton
- fixed scalar load-factor increments, common proportional load/BC path, fixed-global dead `*CLOAD`
- factor-1 absolute prescribed `*BOUNDARY` targets와 four-value nonlinear `*STATIC`
- four-channel residual/correction convergence, maximum 100 iterations, no line search
- separate trial state, atomic commit/rollback, accepted-frame HDF5와 per-iteration text log
- deterministic assembly, iteration, frame, result, diagnostic order와 factor-one global reaction/equilibrium 및 stored-reference verification
## 4. Out Of Scope
- material nonlinearity, nonlinear material history, combined material/geometric nonlinearity
- Updated Lagrangian, corotational procedure, multiple or mixed nonlinear steps, cross-step propagation
- follower load, non-proportional path, controlled-displacement, arc-length/path-following
- modified/adaptive Newton, tangent reuse, line search, damping, automatic growth/cutback/retry
- energy/work convergence, trial-state HDF5 history, direct reference-solver execution
- Abaqus/Midas formulation, stabilization, state update 또는 결과 절차의 내부 동등성
## 5. Analysis Definition
| item | approved meaning |
| --- | --- |
| analysis | exactly one nonlinear static step from a no-prior-history baseline |
| elements | `S4`, `S4R` source types map to materially linear FESA-MITC4 |
| DOFs | global `[UX, UY, UZ, URX, URY, URZ]`; rotational correction is dimensionless |
| kinematics | Total Lagrangian relative to one fixed initial configuration |
| rotation state | committed orthonormal right-handed triad `Q`; director is its third axis; separate trial triad/director; multiplicative finite-rotation update |
| material | homogeneous isotropic linear elasticity; no nonlinear material state |
| control | one dimensionless scalar load factor with fixed increments and final shortening to factor 1 |
| Newton | same-trial residual and consistent tangent, fresh factorization and correction solve every iteration |
| convergence | translational-force residual, rotational-moment residual, translational correction, rotational correction; all four must pass with `<=` |
| loads/BCs | fixed-global dead `*CLOAD`; factor-1 absolute `*BOUNDARY` targets on one proportional path |
| state | candidate/trial remains separate; complete converged increment commits atomically |
| coordinates/units | nodal values are global unless an approved element-local quantity states otherwise; user-consistent units without inference/conversion |
Exact Total Lagrangian shell equations, strain/stress measures, rotation map details, drilling treatment and consistent derivatives belong to Research/Formulation and Numerical Review without changing this approved scope.
## 6. Input Requirements
- Nonlinear execution requires exactly one supported nonlinear static source step and one semantic step.
- Supported first-release meanings are limited to the approved MITC4 material/section, nonlinear `*STATIC`, `*CLOAD`, and `*BOUNDARY` subset.
- Nonlinear `*STATIC` has four positive finite values: first is the fixed increment, second represents endpoint 1 exactly, and third/fourth are accepted for compatibility but unused by stepping.
- Nonzero prescribed `*BOUNDARY` values are factor-1 absolute global-DOF targets; approved `*CLOAD` components are fixed-global dead forces or moments.
- Unsupported, ambiguous, missing, nonfinite, or out-of-scope meanings fail closed rather than falling back to linear or alternate nonlinear behavior.
## 7. Output Requirements
- Successfully committed increments map one-to-one to authoritative accepted HDF5 frames in load-factor order and include the factor-1 frame; trial history is not authoritative output.
- `<stem>_results.h5` is completed as a sibling candidate and replaces the final only after success; failure preserves a prior valid final.
- `<stem>_log.txt` is replaced/truncated at invocation start and remains the current-run live audit after controlled success or failure.
- Every entered Newton iteration has one deterministic diagnostic-only text summary; exact representation and low-level I/O mechanics belong to I/O Definition.
- Every analysis procedure uses input-directory `<stem>_results.h5` and `<stem>_log.txt`; every invocation containing literal `--output` treats it as unrecognized and fails with exit code 2 before input parsing, Analysis, result-candidate, log, or output creation, with no compatibility alias or deprecation window. Result and log lifecycles are independent, not a cross-file all-or-nothing commit.
- Exact HDF5 paths/shapes, factor-0 projection, triad projection, compression/chunking and path/collision conventions belong to I/O Definition.
## 8. Requirement Records
```yaml
- id: FESA-REQ-NSNR-001
statement: "The FESA solver shall execute nonlinear static analysis through a separate procedure only when exactly one supported nonlinear source step maps to exactly one semantic step from a no-prior-history baseline."
category: functional
rationale: "Procedure cardinality and lifecycle must be unambiguous."
source: user
priority: must
verification_method: test
acceptance_criteria: "One valid step selects one nonlinear procedure; zero, multiple, mixed, or ambiguous nonlinear steps fail before an attempted nonlinear increment, while unselected approved linear analysis retains its established behavior."
tolerance: "Exact source/semantic cardinality and procedure identity."
trace_to: {parent_need: "NEED-NSNR-001", downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-003
statement: "The FESA solver shall support only materially linear, geometrically nonlinear FESA-MITC4 for source types S4 and S4R in the first release."
category: physics
rationale: "The approved release is geometric-only and must not create nonlinear material state."
source: user
priority: must
verification_method: test
acceptance_criteria: "Supported S4/S4R cases use homogeneous isotropic linear elasticity and MITC4; material-nonlinear or combined-nonlinearity input fails closed."
tolerance: "Exact supported element/material inventory."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-041
statement: "The FESA solver shall use Total Lagrangian kinematics relative to one fixed initial reference configuration."
category: physics
rationale: "The formulation reference must not change across increments."
source: user
priority: must
verification_method: analysis
acceptance_criteria: "Every increment and accepted state retains the same initial-reference identity; current geometry is only a derived observable and never re-bases the formulation."
tolerance: "Reference identity exact; numerical kinematic tolerances are owned by Numerical Review."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-074
statement: "The FESA solver shall retain global DOFs [UX, UY, UZ, URX, URY, URZ], use a dimensionless incremental rotation correction, and maintain separate trial and committed finite-rotation triad/director states."
category: physics
rationale: "Large rotations require an objective state distinct from failed candidates."
source: user
priority: must
verification_method: analysis
acceptance_criteria: "Committed Q is orthonormal and right-handed, its third axis is the director, candidate updates are multiplicative, successful commit transfers the complete state, and failure preserves the prior committed state."
tolerance: "State identity exact; Q invariants use Numerical Review-approved tolerances."
trace_to: {parent_need: "NEED-NSNR-002, NEED-NSNR-003", downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-006
statement: "The FESA solver shall perform Full Newton iterations using the same current-trial residual and algorithmically consistent tangent, followed by a fresh tangent factorization and correction solve."
category: numerical
rationale: "Residual, tangent, factorization, and correction must describe one trial state."
source: user
priority: must
verification_method: test
acceptance_criteria: "Each entered iteration records one trial identity shared by residual and tangent, factorizes that tangent after evaluation, and solves its correction with that fresh factorization before convergence or update."
tolerance: "Trial/factorization identity and event order exact."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Formulation Agent", "Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-007
statement: "The FESA solver shall accept an increment only when its free-DOF equilibrium residual and same-iteration free-DOF Newton correction gates all pass."
category: numerical
rationale: "Equilibrium and update size are both required convergence evidence."
source: user
priority: must
verification_method: test
acceptance_criteria: "All four channel results are combined by logical AND; constrained DOFs are excluded from convergence and their full-equilibrium residual retains reaction meaning."
tolerance: "The four channel policies in NSNR-069 and NSNR-070 apply with inclusive <= comparisons."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-069
statement: "The FESA solver shall evaluate translational-force and rotational-moment free-residual convergence with channel-separated infinity-norm gates selected by each matching external residual-channel scale."
category: numerical
rationale: "Force and moment dimensions require separate scales."
source: user
priority: must
verification_method: test
acceptance_criteria: "For each residual channel, a nonzero matching external-channel scale retains denominator max(||internal||inf, ||external||inf), and the same-trial residual ratio passes iff <=1e-2; an exact-zero matching external-channel scale instead applies the typed absolute gate, which passes iff its numerator is <=1e-3 model-consistent force or <=1e-3 model-consistent force-length, respectively."
tolerance: "Relative 1e-2 dimensionless for nonzero matching external-channel scale; exact-zero matching external-channel absolute 1e-3 force and 1e-3 force-length."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: draft
- id: FESA-REQ-NSNR-070
statement: "The FESA solver shall evaluate translational and rotational free-correction convergence with channel-separated infinity-norm gates."
category: numerical
rationale: "Translation and rotation corrections have different dimensions."
source: user
priority: must
verification_method: test
acceptance_criteria: "For a nonzero current-trial incremental-solution denominator relative to the step-start committed state, the fresh-correction ratio passes iff <=1e-2; an exact-zero denominator instead passes iff its numerator is <=1e-3 model-consistent length or <=1e-3 dimensionless rotation, respectively."
tolerance: "Relative 1e-2 dimensionless; zero-scale absolute 1e-3 length and 1e-3 dimensionless rotation."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-008
statement: "The FESA solver shall permit entered Newton iteration identities 1 through 100 and shall reject nonfinite required iteration data."
category: numerical
rationale: "The iteration limit and finite-data boundary must be deterministic."
source: user
priority: must
verification_method: test
acceptance_criteria: "A pass at iteration 100 may commit; otherwise iteration 100 ends in nonconvergence without iteration 101, and any nonfinite required residual, tangent, correction, state, load, or recovery value fails before acceptance."
tolerance: "Iteration identities and finite predicates exact."
trace_to: {parent_need: "NEED-NSNR-002, NEED-NSNR-003", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-014
statement: "The FESA solver shall apply each successful fresh Newton correction unchanged when another iteration is required and shall use no line search, damping, solver fallback, or energy/work convergence gate."
category: constraint
rationale: "The approved first release uses direct Full Newton updates only."
source: user
priority: must
verification_method: test
acceptance_criteria: "The next candidate uses the fresh solve output without scalar or component modification; convergence depends only on NSNR-069 and NSNR-070."
tolerance: "Correction/update identity exact."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-046
statement: "The FESA solver shall advance one scalar load factor by a fixed positive increment, shortening only the final increment to reach factor one without growth, cutback, or retry."
category: numerical
rationale: "Fixed stepping provides the approved deterministic load path."
source: user
priority: must
verification_method: test
acceptance_criteria: "The intended and accepted factor sequence starts at zero, never overshoots one, ends at the discrete factor-one identity on success, and analysis failure creates no replacement attempt."
tolerance: "Factor/order identity exact; endpoint arithmetic is fixed by Numerical Review before implementation."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-048
statement: "The FESA solver shall advance every approved CLOAD and nonzero prescribed BOUNDARY target on one common proportional scalar load-factor path."
category: physics
rationale: "Loads and prescribed values must share one path identity."
source: user
priority: must
verification_method: test
acceptance_criteria: "Factor zero reproduces step-start values, intermediate states use the same factor for all approved targets, and factor one reproduces every target."
tolerance: "Load-factor and target identity exact."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-018
statement: "The FESA solver shall interpret approved CLOAD force and moment components as dead loads fixed in global directions while the common factor scales magnitude only."
category: physics
rationale: "Follower-load behavior would change equilibrium and tangent meaning."
source: user
priority: must
verification_method: test
acceptance_criteria: "Force and moment source DOF directions remain unchanged with deformation, moments retain force-length dimensions, and no follower external-load tangent is used."
tolerance: "Global component identity exact; values use the model-consistent unit system."
trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-063
statement: "The FESA solver shall interpret each approved nonzero BOUNDARY value as a factor-one absolute global-DOF target interpolated from its step-start committed value."
category: physics
rationale: "Absolute prescribed values must not be confused with correction increments."
source: user
priority: must
verification_method: test
acceptance_criteria: "The prescribed current value follows the common factor, zero start/target remains zero, the constrained correction is distinct from that value, and failed candidates do not change the step-start value."
tolerance: "Prescribed path/source identity exact; values use model-consistent displacement or rotation units."
trace_to: {parent_need: "NEED-NSNR-002, NEED-NSNR-003", downstream_agents: ["Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-016
statement: "The FESA solver shall map nonlinear STATIC four-value data with the first positive finite value as fixed increment, the second as endpoint one, and positive finite third and fourth values accepted but unused by stepping."
category: input
rationale: "The approved compatibility fields must not alter fixed stepping."
source: user
priority: must
verification_method: test
acceptance_criteria: "Valid four-value data records the first value for runtime use and identifies the third/fourth as unused; invalid arity, nonfinite/nonpositive required values, or period not representing one fails closed."
tolerance: "Parsed endpoint-one identity exact; warning representation is owned by I/O Definition."
trace_to: {parent_need: "NEED-NSNR-001", downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-011
statement: "The FESA solver shall keep trial state separate and atomically commit a complete converged displacement, rotation/director, load-factor, frame, force, and recovery state while preserving the prior committed state on failure."
category: functional
rationale: "Partial nonlinear state commits would corrupt continuation and results."
source: user
priority: must
verification_method: test
acceptance_criteria: "Successful validation commits one coherent state identity; iteration, increment, recovery, or output failure leaves the prior committed state and authoritative final result unchanged."
tolerance: "State and commit identity exact."
trace_to: {parent_need: "NEED-NSNR-003", downstream_agents: ["Formulation Agent", "Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-019
statement: "The FESA solver shall preserve stable source identity and stable assembly order and shall keep the accepted free residual, constrained reaction resultant, and global applied-plus-reaction balance error as distinct equilibrium quantities derived at the same accepted state."
category: physics
rationale: "Reaction and equilibrium evidence must remain traceable without treating physically distinct projections as interchangeable."
source: docs
priority: must
verification_method: test
acceptance_criteria: "Input instance/label/component maps deterministically through assembly, state, diagnostic, result, and comparison; accepted free entries remain free-equilibrium evidence, constrained entries form physical reactions, and the constrained-reaction resultant remains distinct from the global applied-plus-reaction balance error. Blocking factor-one equilibrium quantities are global applied-plus-reaction force [3] and moment [3] balance errors plus accepted free residual. Every global moment is about global origin [0,0,0] and uses current force arms plus spatial physical nodal moments."
tolerance: "Source/component, quantity identity, origin, and discrete order exact; equilibrium and reference values use their separately approved numerical tolerances."
trace_to: {parent_need: "NEED-NSNR-002, NEED-NSNR-004", downstream_agents: ["Formulation Agent", "Numerical Review Agent", "I/O Definition Agent"]}
status: approved
- id: FESA-REQ-NSNR-020
statement: "The FESA solver shall fail closed on every input or model meaning outside the approved element, material, load, boundary, step, and solver scope."
category: input
rationale: "Unsupported nonlinear behavior must not become a warning-only or linear fallback."
source: docs
priority: must
verification_method: test
acceptance_criteria: "A negative inventory for each unsupported class rejects the model before nonlinear state or authoritative output is committed."
tolerance: "Exact supported/unsupported inventory."
trace_to: {parent_need: "NEED-NSNR-001", downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-021
statement: "The FESA solver shall create authoritative accepted HDF5 frames one-to-one with committed increments, including factor one, using a sibling candidate that replaces the final only on success and preserves a prior valid final on failure."
category: output
rationale: "Authoritative results must contain accepted states only and remain failure-safe."
source: user
priority: must
verification_method: test
acceptance_criteria: "Committed increment and accepted-frame identities match in factor order, the successful result includes factor one, trial Newton history is absent, and controlled failure does not expose the candidate as final or damage a prior valid final."
tolerance: "Commit/frame identity exact; numerical quantities use their approved verification tolerances."
trace_to: {parent_need: "NEED-NSNR-003", downstream_agents: ["Numerical Review Agent", "I/O Definition Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-024
statement: "The FESA solver shall replace or truncate the single derived text log at invocation start, retain it as the current-run live audit on controlled success or failure, and produce one deterministic diagnostic-only summary for every entered Newton iteration."
category: output
rationale: "Iteration evidence is required without making trial states authoritative results."
source: user
priority: must
verification_method: test
acceptance_criteria: "Completed and early-failure iterations preserve their stable iteration/stage and convergence meaning in entered order; the log remains current-run diagnostic evidence and is not HDF5 trial history or reference data."
tolerance: "Summary cardinality and semantic identity exact; representation and low-level failure presentation are owned by I/O Definition."
trace_to: {parent_need: "NEED-NSNR-003", downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-083
statement: "The FESA solver shall apply repository-wide input-directory names <stem>_results.h5 and <stem>_log.txt, treat every invocation containing literal --output as unrecognized and fail it with exit code 2 before input parsing, Analysis, result-candidate, log, or output creation without a compatibility alias or deprecation window, and use independent asymmetric result/log lifecycles without cross-file all-or-nothing commit."
category: output
rationale: "Public output identity and authority must be consistent across procedures."
source: user
priority: must
verification_method: test
acceptance_criteria: "Every existing and future procedure derives the two approved names beside its input and preserves linear-static numerical/HDF5 meaning under the migration; every argument form containing literal --output fails as unrecognized with exit code 2 before input parsing, Analysis, result-candidate, log, or output creation and has no accepted alias or deprecation form; log initialization does not commit HDF5 and HDF5 failure does not roll back the live log."
tolerance: "Names, exit code, lifecycle independence, and regression identity exact; path and ownership mechanics are downstream decisions."
trace_to: {parent_need: "NEED-NSNR-003", downstream_agents: ["I/O Definition Agent", "Implementation Planning Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-026
statement: "The FESA solver shall produce deterministic increment, iteration, assembly/reduction, accepted-frame, result-row, and diagnostic ordering for the same input and approved runtime configuration."
category: constraint
rationale: "Reproducible numerical and reference evidence requires stable discrete ordering."
source: docs
priority: must
verification_method: test
acceptance_criteria: "Repeated runs and approved thread configurations preserve the same intended/attempted/accepted factor identities, Newton event sequence, sparse/reduction structure, frame order, result identities, and log order."
tolerance: "Discrete structure/order exact; floating equality policy is set by Numerical Review from repository conventions."
trace_to: {parent_need: "NEED-NSNR-003, NEED-NSNR-004", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]}
status: approved
- id: FESA-REQ-NSNR-030
statement: "The FESA solver shall pass an approved verification portfolio covering the materially linear small-displacement limit, tangent consistency, factor-one global applied-plus-reaction balance and accepted free residual, symmetry or objectivity, and commit/rollback behavior."
category: verification
rationale: "Convergence alone does not establish nonlinear solver correctness."
source: docs
priority: must
verification_method: analysis
acceptance_criteria: "Numerical Review defines blocking cases and quantities for every listed category, and implementation passes each approved analytical, invariant, physics, or comparison gate. Reaction/equilibrium acceptance separately blocks on factor-one global applied-plus-reaction force [3] and moment [3] balance errors and accepted free-DOF residual evidence; constrained-reaction resultants retain a distinct identity, and local nodal reaction distribution does not decide the blocking verdict."
tolerance: "Case-specific invariant tolerances are owned by Numerical Review; external comparisons use docs/TOLERANCE.md; existing linear-limit tolerance remains unchanged."
trace_to: {parent_need: "NEED-NSNR-004", downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]}
status: approved
- id: FESA-REQ-NSNR-034
statement: "The FESA solver shall compare only approved accepted-state quantities against stored reference artifacts using stable source/component matching, the approved blocking/warning/review disposition, and the common docs/TOLERANCE.md policy."
category: verification
rationale: "Reference acceptance must be deterministic and independent of solver execution."
source: docs
priority: must
verification_method: reference-comparison
acceptance_criteria: "Numerical Review selects the exact existing input and required CSV quantities; precheck rejects missing, extra, duplicate, or nonfinite required rows before numerical comparison, without averaging, collapse, row-order matching, zero clamp, or reference repair. U1/U2/U3 remain blocking and UR1/UR2/UR3 remain warning-only. Local nodal RF1/RF2/RF3 and physical spatial RM1/RM2 retain deterministic source-key/schema/finite/inventory/error reporting but are review-only and never change the blocking verdict; local RM3 and stress remain excluded from numerical comparison."
tolerance: "docs/TOLERANCE.md family-scale policy for external blocking, warning-only, and review-only error reporting; exact artifact roles, local review projection, family membership, and row schema are a Numerical Review-owned readiness gap."
trace_to: {parent_need: "NEED-NSNR-004", downstream_agents: ["Numerical Review Agent", "I/O Definition Agent"]}
status: approved
```
## 9. Verification Quantities
| quantity | dimension / coordinates | role |
| --- | --- | --- |
| nodal displacement and committed rotation/director state | length and dimensionless rotation; global | accepted-state kinematics and rollback |
| accepted free-DOF residual | force or force-length; global DOF | blocking accepted-state equilibrium evidence |
| local nodal `RF1/RF2/RF3`, physical spatial `RM1/RM2` | force or force-length; global | deterministic review-only/nonblocking distribution evidence; `RM3` excluded |
| constrained-reaction resultant force `[3]` and moment `[3]` | force and force-length; global; moment about `[0,0,0]` with current arms and spatial physical moments | distinct reaction summary; not interchangeable with global balance error |
| applied-plus-reaction balance error force `[3]` and moment `[3]` | force and force-length; global; same origin/arm/moment convention | blocking factor-one reaction/equilibrium evidence |
| MITC4 internal force, stress and strain | model-consistent dimensions; approved element frame/configuration | formulation, physics and reference verification |
| scalar load factor and accepted frame identity | dimensionless | path, commit and output ordering |
| four convergence channels | typed as NSNR-069/070 | internal iteration acceptance only |
| iteration summary | diagnostic identity, not a physical reference quantity | convergence/failure audit |
## 10. Tolerance Policy
- `.inp` values remain in the user's consistent unit system; FESA performs no unit inference or conversion.
- Residual ratios with nonzero matching external-channel scale and correction ratios with nonzero current-trial incremental-solution denominator are dimensionless and pass with `<=1e-2`.
- Exact-zero matching external-channel residual thresholds are `1e-3` force and `1e-3` force-length; exact-zero correction-denominator thresholds are `1e-3` length and `1e-3` dimensionless rotation. Equal literals do not merge their dimensions.
- External blocking, warning-only, and review-only error reporting use `docs/TOLERANCE.md` without changing their verdict disposition; internal invariant, tangent, endpoint-arithmetic, free-residual and global-balance tolerances are fixed by Numerical Review before implementation.
## 11. Reference Case Requirements
- Stored nonlinear candidates use exact read-only input/displacement pairs `reference/shellNL/shellNL.inp` with `reference/shellNL/shellNL displacements.csv`, and `reference/shellNL-meshfine/shellNL-meshfine.inp` with `reference/shellNL-meshfine/shellNL-meshfine displacements.csv`. Exact local-reaction review artifacts are `reference/shellNL/shellNL reactions.csv` and `reference/shellNL-meshfine/shellNL-meshfine reactions.csv`; they are not missing-required blocking artifacts. The existing linear-limit pair is `reference/shell/shell.inp` and `reference/shell/shell displacements.csv`.
- Numerical Review shall fix which exact nonlinear candidate case or cases are blocking versus diagnostic, the factor-one HDF5 projection, required source rows/components and comparison families, and the internal tolerances for global balance/free-residual gates. `U1/U2/U3` are blocking, `UR1/UR2/UR3` are warning-only, local nodal RF/RM rows are review-only, and `RM3` and stress have no numerical comparison projection.
- All selected local review rows retain deterministic identity, schema, finite-value, inventory, and error reporting even though they cannot fail the blocking verdict. A physical global resultant sum is not a substitute identity for those local rows, and no row is averaged, collapsed, omitted, zero-clamped, or repaired.
- Agents do not run Abaqus, Nastran or another reference solver and do not create, rename, repair or normalize stored reference artifacts.
## 12. Requirement Verification Matrix
| id | category | source | priority | method | compact acceptance | tolerance | downstream | status |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `NSNR-001` | functional | user | must | test | exactly one supported source/semantic nonlinear step | exact cardinality | I/O; Planning | approved |
| `NSNR-003` | physics | user | must | test | MITC4 geometric-only, linear isotropic material | exact inventory | Research; Formulation; Numerical Review | approved |
| `NSNR-041` | physics | user | must | analysis | fixed initial reference, no re-basing | identity exact | Research; Formulation; Numerical Review | approved |
| `NSNR-074` | physics | user | must | analysis | finite committed/trial triad/director state and rollback | invariant tolerance downstream | Formulation; Numerical Review | approved |
| `NSNR-006` | numerical | user | must | test | same-trial residual/tangent and fresh factorization/solve | identity/order exact | Formulation; Numerical Review; Planning | approved |
| `NSNR-007` | numerical | user | must | test | all four free-DOF gates pass; constrained residual is reaction | NSNR-069/070 | Numerical Review; Planning | approved |
| `NSNR-069` | numerical | user | must | test | force/moment residual relative gate for nonzero external scale; typed absolute gate for exact-zero external scale | `1e-2`; typed `1e-3` | Numerical Review; Planning | draft |
| `NSNR-070` | numerical | user | must | test | translation/rotation correction relative or typed zero-scale gates | `1e-2`; typed `1e-3` | Numerical Review; Planning | approved |
| `NSNR-008` | numerical | user | must | test | finite data, iterations 1..100, pass at 100 allowed | predicates/count exact | Numerical Review; Planning | approved |
| `NSNR-014` | constraint | user | must | test | unchanged full correction; no line search/fallback/energy gate | identity exact | Numerical Review; Planning | approved |
| `NSNR-046` | numerical | user | must | test | fixed increment, final shortening, no retry | factor/order exact | Numerical Review; Planning | approved |
| `NSNR-048` | physics | user | must | test | one proportional factor for all load/BC targets | identity exact | Formulation; Numerical Review | approved |
| `NSNR-018` | physics | user | must | test | fixed-global dead force/moment and no follower tangent | component exact | Formulation; Numerical Review | approved |
| `NSNR-063` | physics | user | must | test | absolute factor-one BC target and separate correction | path/source exact | Formulation; Numerical Review | approved |
| `NSNR-016` | input | user | must | test | four-value STATIC mapping and validation | endpoint exact | I/O; Planning | approved |
| `NSNR-011` | functional | user | must | test | separate trial, atomic commit, prior-state preservation | state exact | Formulation; Numerical Review; Planning | approved |
| `NSNR-019` | physics | docs | must | test | distinct free residual, constrained-reaction resultants and applied+reaction balance; current-arm/spatial-moment semantics | quantity/origin/identity/order exact | Formulation; Numerical Review; I/O | approved |
| `NSNR-020` | input | docs | must | test | unsupported meaning fails closed | inventory exact | I/O; Planning | approved |
| `NSNR-021` | output | user | must | test | accepted commit/frame bijection and failure-safe HDF5 final | identity exact | Numerical Review; I/O; Planning | approved |
| `NSNR-024` | output | user | must | test | one ordered diagnostic summary per entered iteration and persistent live log | semantic identity exact | I/O; Planning | approved |
| `NSNR-083` | output | user | must | test | repository names; every literal --output form unrecognized with pre-input/pre-Analysis/pre-output exit 2 and no alias/deprecation; asymmetric lifecycle; linear regression | public identity/precedence exact | I/O; Planning; Numerical Review | approved |
| `NSNR-026` | constraint | docs | must | test | deterministic factor/iteration/assembly/frame/result/log order | discrete order exact | Numerical Review; Planning | approved |
| `NSNR-030` | verification | docs | must | analysis | blocking small-limit/tangent/global applied+reaction balance/free-residual/physics/rollback portfolio | case-specific downstream; external policy unchanged | Research; Formulation; Numerical Review | approved |
| `NSNR-034` | verification | docs | must | reference-comparison | U blocking, UR warning-only, local RF/RM review-only, exact matching/precheck | docs/TOLERANCE.md | Numerical Review; I/O | approved |
## 13. Open Questions
없음. Specialist gaps are owned by downstream stages and are escalated only if they would change approved scope, physics, tolerance, authoritative output or public compatibility.
## 14. Downstream Handoff
- Research/Formulation: exact Total Lagrangian MITC4 equations, strain/stress measures, rotation map/side/frame, drilling and consistent derivatives; Formulation propagates NSNR-069's exact-zero matching external-channel typed absolute branch and retained nonzero external-scale relative denominator.
- Numerical Review: verify the revised NSNR-069 branch and unchanged thresholds/four-channel AND, endpoint arithmetic, tangent/objectivity/state-invariant checks, benchmark portfolio and performance adequacy. Fix exact coarse/fine reference roles, local review projection/families, and factor-one global balance/free-residual tolerances while preserving local RF/RM review-only, `RM3` exclusion, displacement/rotation disposition, exact prechecks, immutable artifacts and common external tolerance.
- I/O Definition: HDF5 schema/projection/chunking/factor-0 handling, log representation/failure presentation and path/collision conventions. Audit and keep separately identifiable `(a)` global applied-plus-reaction balance error, `(b)` constrained-reaction resultant and `(c)` accepted free residual; global moments use current positions and spatial physical nodal moments about `[0,0,0]`, including supported nonzero prescribed translation/rotation cases.
- Implementation Planning: backend adapters, output ownership primitive, candidate filename, performance targets and requirement-traced TDD plan. Stage 6 must test the three equilibrium identities separately and must not reuse one implementation dataset as another without proving its approved projection semantics.
- Coordinator: escalate only a downstream proposal that changes the approved scope, physics, convergence tolerance, authoritative-result meaning or public output contract; do not advance the workflow on this document alone.
@@ -1,602 +0,0 @@
# Nonlinear Static Newton–Raphson 연구 브리프
## 1. Metadata
- feature_id: `nonlinear-static-newton-raphson`
- source_requirement: `docs/nonlinear-static-newton-raphson/requirements.md`
- source_requirement_status: `approved`
- source_requirement_approval_date: `2026-08-23`
- status: `passed`
- owner_agent: `research-agent`
- date: `2026-08-23`
- research_scope: materially linear, geometrically nonlinear Total Lagrangian
`S4/S4R -> FESA-MITC4`, finite rotation, Full Newton, fixed proportional path,
state/output integrity, and verification evidence
- evidence_boundary: 이 문서는 정식화, 수치 허용오차, C++ API, I/O schema 또는
reference artifact를 확정하지 않는다. 외부 solver의 공개 결과는 후보 수치 evidence일
뿐 내부 알고리즘 동등성 evidence가 아니다.
이 문서의 주장은 다음 네 가지 표지를 사용한다.
- **Verified fact**: 인용한 원문·공식 문서가 직접 뒷받침한다.
- **Project decision**: 승인된 요구조건 또는 프로젝트 전역 계약이 고정한다.
- **Inference**: verified fact와 project decision에서 도출한 연구 해석이며 downstream
재검토가 필요하다.
- **Open issue**: evidence 또는 downstream 결정이 아직 없다.
## 2. Research Questions
승인된 `FESA-REQ-NSNR-003`, `FESA-REQ-NSNR-041`, `FESA-REQ-NSNR-074`,
`FESA-REQ-NSNR-006`, `FESA-REQ-NSNR-048`, `FESA-REQ-NSNR-018`,
`FESA-REQ-NSNR-063`, `FESA-REQ-NSNR-011`, `FESA-REQ-NSNR-019`,
`FESA-REQ-NSNR-030`, `FESA-REQ-NSNR-034`의 specialist gap에서 다음 질문을 도출했다.
1. 고정 초기 참조면을 쓰는 Total Lagrangian 4-node Reissner–Mindlin/MITC4 shell에서
materially linear response를 표현할 때 어떤 strain/stress/virtual-work 근거가 필요한가?
2. committed/trial triad와 director를 multiplicative finite-rotation update로 갱신할 때
orthonormality뿐 아니라 objectivity, path independence, singularity avoidance와 consistent
linearization을 어떻게 별도로 입증해야 하는가?
3. 기존 linear MITC4의 `24 global -> 20 physical + 4 numerical drill` 경계를 finite rotation에
확장할 때 global map의 1·2차 미분, rotation chart/recentering, objective drilling potential과
nodal-moment work 중 무엇이 아직 미해결인가?
4. Full Newton에서 residual, algorithmic tangent, factorization과 correction이 같은 trial
state를 가리킨다는 것을 어떤 수학적·실행 순서 evidence로 확인할 수 있는가?
5. fixed-global dead `CLOAD`와 absolute prescribed `BOUNDARY`를 하나의 scalar factor로
진행할 때 translation, finite rotation, reaction과 external work의 의미는 무엇인가?
6. original MITC4의 shear/membrane locking, distorted geometry, drilling, quadrature와
conditioning 위험을 nonlinear large-rotation 상태에서 어떻게 제한하고 특성화할 것인가?
7. small-displacement limit, tangent consistency, equilibrium/reaction, rigid-body/objectivity,
symmetry, deterministic commit/rollback을 서로 독립적으로 검증할 benchmark/patch/MES/MMS
portfolio는 무엇인가?
8. 공개 benchmark와 기존 저장 artifact 중 정확히 어떤 입력·target quantity가 현재
사용 가능하며, 무엇이 nonlinear acceptance artifact로는 아직 비어 있는가?
| research question | requirement_ids | research gap |
| --- | --- | --- |
| RQ-1 | `FESA-REQ-NSNR-003`, `FESA-REQ-NSNR-041` | TL materially-linear MITC4 theory boundary |
| RQ-2 | `FESA-REQ-NSNR-074` | multiplicative triad/director update, objectivity and derivatives |
| RQ-3 | `FESA-REQ-NSNR-003`, `FESA-REQ-NSNR-074` | nonlinear global/physical/drill map and finite nodal-moment work |
| RQ-4 | `FESA-REQ-NSNR-006` | same-trial Full Newton consistency evidence |
| RQ-5 | `FESA-REQ-NSNR-048`, `FESA-REQ-NSNR-018`, `FESA-REQ-NSNR-063` | proportional dead-load/prescribed finite path |
| RQ-6 | `FESA-REQ-NSNR-003` | locking, drilling, quadrature and conditioning limits |
| RQ-7 | `FESA-REQ-NSNR-011`, `FESA-REQ-NSNR-019`, `FESA-REQ-NSNR-030` | physics, tangent, objectivity and transactional verification portfolio |
| RQ-8 | `FESA-REQ-NSNR-034` | exact stored/public nonlinear artifact and target readiness |
## 3. Source Inventory
### 3.1 Project contracts and local evidence
Project contract는 외부 reliability tier와 혼합하지 않고 `Project`로 표시한다.
| id | source_type | title/path | reliability_tier | 사용 범위와 한계 |
| --- | --- | --- | --- | --- |
| P1 | approved requirement | `docs/nonlinear-static-newton-raphson/requirements.md` | Project | 승인 scope, load path, Newton/state/output/verification 계약. 정식 방정식·내부 tolerance·exact reference artifact는 고정하지 않음 |
| P2 | project governance | `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/PRD.md` | Project | 독립 solver 정체성, 8-stage gate, research ownership과 external-reference 경계 |
| P3 | architecture/decision | `docs/ARCHITECTURE.md`, `docs/ADR.md` (`ADR-016`, `ADR-017`, `ADR-022`) | Project | 별도 nonlinear procedure, deterministic assembly, candidate-before-commit, full residual/reaction 및 공통 comparison 정책. nonlinear shell 방정식은 없음 |
| P4 | tolerance policy | `docs/TOLERANCE.md` | Project | 저장 reference row precheck와 family-scale row/RMS gate. tangent/objectivity/orthonormality/iteration tolerance를 제공하지 않음 |
| P5 | existing linear MITC4 evidence | `docs/linear-static-mitc4-shell/{research,formulation,numerical-review,reference-model}.md` | Project | 승인된 linear MITC4 물리/적분/결과 경계와 기존 test inventory. `formulation.md` §15는 future-only gap inventory이며 nonlinear 정식화 evidence가 아님 |
| P6 | local tests/artifacts | `tests/unit/elements/mitc4_shell_test.cpp`, `tests/unit/model/shell_geometry_test.cpp`, `tests/reference/mitc4_reference_cases_test.cpp`, `tests/reference/mitc4_reference_comparison_test.cpp`, `reference/shell/`, `reference/shellR/` | Project | linear rigid/patch/geometry/reference 회귀의 exact local identity. 두 `.inp` 모두 `nlgeom=NO`; nonlinear acceptance-ready가 아님 |
### 3.2 External sources
- access_date: `2026-08-23` (`S1`–`S17` 공통)
- tier_policy: Tier 1은 공식 표준·기관·solver manual, Tier 2는 peer-reviewed 원 논문·교과서,
Tier 3는 탐색용 synthesis를 뜻한다.
| id | source_type | title | author_or_org | URL_or_DOI | reliability_tier | 제공 evidence / 접근·적용 한계 |
| --- | --- | --- | --- | --- | --- | --- |
| S1 | peer-reviewed original paper | *A Continuum Mechanics Based Four-Node Shell Element for General Non-linear Analysis* | E. N. Dvorkin, K.-J. Bathe | [MIT author PDF](https://web.mit.edu/kjb/www/Publications_Prior_to_1998/A_Continuum_Mechanics_Based_Four-Node_Shell_Element_for_General_Nonlinear_Analysis.pdf), DOI [`10.1108/eb023562`](https://doi.org/10.1108/eb023562) | Tier 2 | original four-node continuum-based shell, Total Lagrangian nonlinear equations, assumed transverse shear, examples, `2x2x2` elastic integration. 1984 five-physical-DOF update이며 FESA global 24-DOF/drill 계약은 없음; PDF는 공개 author copy이나 저작권 자료 |
| S2 | peer-reviewed original paper | *On a Stress Resultant Geometrically Exact Shell Model. Part III: Computational Aspects of the Nonlinear Theory* | J. C. Simo, D. D. Fox, M. S. Rifai | [publisher record](https://www.sciencedirect.com/science/article/pii/0045782590900943), DOI [`10.1016/0045-7825(90)90094-3`](https://doi.org/10.1016/0045-7825(90)90094-3) | Tier 2 | singularity-free exact director update, finite-deformation mixed fields, exact discrete-equilibrium linearization, nonlinear examples. stress-resultant shell model이므로 FESA 식의 직접 근거가 아니며 publisher full text 접근 제한 가능 |
| S3 | peer-reviewed original paper | *On the Choice of Finite Rotation Parameters* | A. Ibrahimbegović | [publisher record](https://www.sciencedirect.com/science/article/pii/S0045782597000595), DOI [`10.1016/S0045-7825(97)00059-5`](https://doi.org/10.1016/S0045-7825(97)00059-5) | Tier 2 | finite-rotation parametrization과 incremental rotation/Newton 구현 선택의 영향. 일반 구조 rotation 논문이며 MITC4/drilling 특화가 아님 |
| S4 | peer-reviewed original paper | *Multiplicative Updating of the Rotation Tensor in the Finite Element Analysis of Rods and Shells—A Path Independent Approach* | C. Sansour, W. Wagner | [institutional record](https://digital.library.adelaide.edu.au/items/e3451786-5c76-498e-a1cd-662e73db573f), DOI [`10.1007/s00466-002-0401-4`](https://doi.org/10.1007/s00466-002-0401-4) | Tier 2 | multiplicative update의 path-dependence 문제와 path-independent 접근. Cosserat-type rod/shell이며 FESA의 numerical drill potential을 정의하지 않음 |
| S5 | peer-reviewed open-access review/original formulation | *A Consistent Finite Element Formulation of the Geometrically Non-linear Reissner–Mindlin Shell Model* | A. Müller, M. Bischoff | [Springer open access](https://doi.org/10.1007/s11831-021-09702-7); corrections [`10.1007/s11831-022-09725-8`](https://doi.org/10.1007/s11831-022-09725-8), [`10.1007/s11831-022-09832-6`](https://doi.org/10.1007/s11831-022-09832-6) | Tier 2 | director가 사는 nonlinear manifold, objective/path-independent interpolation, potential의 correct gradient/Hessian 필요성. CC BY 4.0; projection-based higher-order formulation은 FESA MITC4와 다름 |
| S6 | peer-reviewed original paper | *The MITC4+ Shell Element in Geometric Nonlinear Analysis* | Y. Ko, P.-S. Lee, K.-J. Bathe | [MIT author PDF](https://web.mit.edu/kjb/www/Principal_Publications/The_MITC4%2B_shell_element_in_geometric_nonlinear_analysis.pdf), DOI [`10.1016/j.compstruc.2017.01.015`](https://doi.org/10.1016/j.compstruc.2017.01.015) | Tier 2 | TL/Green–Lagrange nonlinear MITC4+, quaternion triad update, `2x2x2` integration, analytical/FE benchmarks, distorted-mesh locking evidence. MITC4+는 assumed membrane field를 추가한 다른 element이며 graph-only target이 많음 |
| S7 | official solver theory manual | [Nonlinear Solution Methods in Abaqus/Standard](https://docs.software.vt.edu/abaqusv2024/English/SIMACAETHERefMap/simathe-c-nonlinearsol.htm) | Dassault Systèmes | official 2024 documentation | Tier 1 | Newton Jacobian/residual/correction의 same-state 관계, full/modified/quasi-Newton 구분, residual+correction checks. Abaqus adaptive controls와 approximations는 P1이 배제하며 내부 동등성 근거가 아님 |
| S8 | official solver benchmark | [3DNLG-1: Elastic Large Deflection Response of a Z-Shaped Cantilever Under an End Load](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEBMKRefMap/simabmk-c-3dnlg1.htm) | Dassault Systèmes / NAFEMS attribution | official 2025 documentation; NAFEMS R0024 | Tier 1 | 공개 S4/S4R input 이름, 재료/BC/load, 세 load level의 tip displacement와 moment-at-A 표. 페이지가 NAFEMS 권고 문제를 재현하지만 source independence와 FESA subset 적합성은 별도 확인 필요 |
| S9 | official solver benchmark | [3DNLG-9: Large Elastic Deflection of a Pinched Hemispherical Shell](https://docs.software.vt.edu/abaqusv2024/English/SIMACAEBMKRefMap/simabmk-c-3dnlg9.htm) | Dassault Systèmes / NAFEMS attribution | official 2024 documentation; NAFEMS R0024 | Tier 1 | 공개 S4/S4R input 이름, point-load/symmetry 조건, 세 load level의 A/B radial displacement 표. 공식 페이지가 NAFEMS 공개값이 Abaqus로 얻어졌음을 명시하므로 Abaqus와 NAFEMS 표의 비교는 독립 검증이 아님 |
| S10 | official benchmark catalog | [Geometric Non-linearity benchmark catalog](https://www.nafems.org/publications/glossaryofbenchmarks/nonlinear/geometric/), [R0029 record](https://www.nafems.org/publications/resource_center/r0029/) | NAFEMS | publication `R0029` / summary `R0024` | Tier 1 | 3D beam/shell geometric-nonlinear benchmark inventory와 목적. exact R0029 report는 유료여서 이번 연구에서 전체 원문·독립 source tables를 확인하지 못함 |
| S11 | official standard | *V&V 10-2019 (R2025), Standard for Verification and Validation in Computational Solid Mechanics* | ASME | [official record](https://www.asme.org/codes-standards/find-codes-standards/standard-for-verification-and-validation-in-computational-solid-mechanics) | Tier 1 | V&V/VVUQ 공통 framework와 용어. 유료 full standard 미열람이므로 분류 수준으로만 사용하고 세부 acceptance를 귀속하지 않음 |
| S12 | government report | *Code Verification by the Method of Manufactured Solutions* | K. Salari, P. K. Knupp, Sandia National Laboratories | [Sandia record](https://www.sandia.gov/research/publications/details/code-verification-by-the-method-of-manufactured-solutions-2000-06-01/), DOI [`10.2172/759450`](https://doi.org/10.2172/759450), `SAND2000-1444` | Tier 1 | MMS가 order-of-accuracy에 영향을 주는 coding error를 탐지할 수 있다는 방법론과 blind tests. 예제는 주로 CFD이며 shell input/target을 제공하지 않음 |
| S13 | peer-reviewed paper + reproducible artifact | *Method of Manufactured Solutions Code Verification of Elastostatic Solid Mechanics Problems in a Commercial Finite Element Solver* | K. I. Aycock, N. Rebelo, B. A. Craven | [publisher record](https://www.sciencedirect.com/science/article/pii/S0045794919301968), DOI [`10.1016/j.compstruc.2019.106175`](https://doi.org/10.1016/j.compstruc.2019.106175), artifact DOI [`10.6084/m9.figshare.7726352.v2`](https://doi.org/10.6084/m9.figshare.7726352.v2) | Tier 2 | elastostatic small/finite-strain MMS source-generation notebook와 input artifact. 3-D solid/body-source 및 다른 constitutive cases라 현재 MITC4/CLOAD/BOUNDARY subset에 직접 실행 불가 |
| S14 | official solver verification guidance | [About Element Verification](https://docs.software.vt.edu/abaqusv2024/English/SIMACAEVERRefMap/simaver-c-basicelemover.htm) | Dassault Systèmes | official 2024 documentation | Tier 1 | patch test만으로 shell을 충분히 검증할 수 없고 geometric-nonlinear element에 constant-strain/rigid-rotation checks가 필요하다는 vendor verification 관행. FESA acceptance 수치나 내부 등가성은 제공하지 않음 |
| S15 | configured FEM wiki navigation | `Nonlinear Finite Element Analysis`, `MITC4 Shell Element`, `MITC Shell Kinematics`, `Green-Lagrange Strain Linearization`, `Shell Locking Phenomenon`, `Shell Element Benchmark Testing`, `Scordelis-Lo Shell Benchmark` | MultiPhysicsVault | local `C:\git\MultiPhysicsVault\wiki\` | Tier 3 | source 탐색과 용어 연결에만 사용. 핵심 주장은 P1–P6 또는 S1–S14/S16–S17 원문으로 추적함 |
| S16 | peer-reviewed benchmark paper + institutional postprint | *Popular Benchmark Problems for Geometric Nonlinear Analysis of Shells* | K. Y. Sze, X. H. Liu, S. H. Lo | [HKU institutional record and postprint](https://hub.hku.hk/handle/10722/54269), DOI [`10.1016/j.finel.2003.11.001`](https://doi.org/10.1016/j.finel.2003.11.001) | Tier 2 | eight benchmark sets의 geometry/load와 dense tabulated load–deflection data, mesh refinement 및 equal-increment difficulty evidence. CC BY-NC-ND institutional postprint; 값은 Abaqus S4R 계산이고 vendor Updated-Lagrangian/reduced-integration/hourglass/drill 및 automatic-control 결과이므로 FESA formulation이나 독립 reference와 동일시할 수 없음 |
| S17 | official solver verification example | [Rigid Body Motion Output Variables](https://docs.software.vt.edu/abaqusv2024/English/SIMACAEVERRefMap/simaver-c-rigidbodymotoutput.htm) | Dassault Systèmes | official 2024 documentation | Tier 1 | `xrbmshel.inp`가 shell elements에 imposed 90-degree z-axis rigid rotation을 가하고 rigid-body output을 확인함. direct-integration implicit dynamics와 vendor whole-set output test라 FESA nonlinear-static strain/internal-force objectivity artifact가 아님 |
## 4. Extracted Facts and Theory Summary
### 4.1 Total Lagrangian four-node shell boundary
- **Verified fact — S1/S6:** Dvorkin–Bathe 계열의 continuum-based four-node shell은
midsurface translation과 nodal director rotation으로 shell continuum를 나타내며,
Total Lagrangian 기술에서 초기 configuration에 대한 Green–Lagrange strain 계열과 그에
work-conjugate한 stress를 사용해 internal virtual work를 구성한다. S6는 이 계열을
geometric nonlinear MITC4+로 전개하고 incremental Green–Lagrange strain을 residual/tangent
계산에 사용한다.
- **Project decision — P1:** FESA는 하나의 고정 초기 reference를 유지하고 homogeneous
isotropic materially linear law만 허용한다. 따라서 material state/history 없이 geometry와
rotation에서만 비선형성이 생겨야 한다.
- **Inference:** Formulation은 동일 trial state에서 initial-reference geometry, current
midsurface, current director/triad, strain, materially linear stress와 internal virtual work가
연결되는 한 계통을 제시해야 한다. 정확한 strain components, plane-stress reduction,
thickness assumption, stress/resultant recovery는 이 연구가 확정하지 않는다.
- **Verified fact — S1/S6:** original MITC4의 assumed covariant transverse-shear interpolation은
thin-shell shear locking을 줄이기 위한 핵심이다. S6의 nonlinear 계산은 네 node shell에
`2 x 2 x 2` Gauss integration을 사용한다.
- **Project decision — P5:** 기존 승인 linear FESA-MITC4도 source `S4/S4R` 모두 하나의
`2 x 2` midsurface × two-point-thickness 경로와 동일 MITC shear tying을 쓴다. source label은
Abaqus S4/S4R integration 선택자가 아니다.
- **Inference:** 기존 rule을 nonlinear trial geometry에 그대로 “호출”하는 것만으로 consistent
TL element가 되지 않는다. 각 quadrature/tying 위치의 reference/current frame, strain variation,
stress-resultant와 geometry/map Hessian을 재유도해야 한다. `P5` §15는 이 필요사항의 목록이지
승인된 해답이 아니다.
- **Applicability fact — S1/S6:** 이 shell family의 large displacement/rotation 사용은 thin-to-thick
Reissner–Mindlin-type kinematics와 small elastic strain 가정 안에서 해석해야 한다. materially
linear law를 큰 material strain의 물리 모델로 일반화할 evidence는 없다.
### 4.2 Finite rotations, director and objectivity
- **Verified fact — S2/S3/S5:** finite rotation은 additive Euclidean vector가 아니며,
configuration update, interpolation과 linearization은 rotation/director가 놓인 nonlinear
manifold를 반영해야 한다. S2는 magnitude와 무관한 singularity-free director update와 exact
discrete linearization을, S5는 objective/path-independent director interpolation과 correct
potential gradient/Hessian의 필요성을 제시한다.
- **Verified fact — S4:** rotation tensor를 단순히 multiplicative하게 누적한다는 사실만으로
path independence가 자동 보장되지 않는다. update의 interpolation/parameterization과 state
정의를 함께 검토해야 한다.
- **Project decision — P1:** 각 node에는 committed/trial orthonormal right-handed triad `Q`가
있고 director는 세 번째 축이다. correction은 dimensionless이며 update는 multiplicative다.
- **Inference:** 적절한 proper-orthogonal incremental rotation을 곱하면 한 번의 연산은 triad의
orthonormality와 handedness를 보존할 수 있다. 그러나 left/right multiplication, spatial/body
increment convention, exponential/quaternion map, small-angle branch, accumulated chart의
recentering과 derivative를 고정하지 않으면 residual/tangent/BC/moment가 유일해지지 않는다.
- **Open issue O-ROT-01:** Formulation이 `Q_trial` update의 multiplication side, increment frame,
retraction과 first/second directional derivative를 정해야 한다. 이것은 approved “multiplicative”
의미를 구체화하되 global DOF/public input 의미를 바꾸어서는 안 된다.
- **Open issue O-ROT-02:** nodal director/triad에서 Gauss/tying point director와 frame을 만드는
objective interpolation, normalization derivative 및 degenerate/opposed director의 fail-closed
조건이 아직 없다. S5의 특정 projection-based interpolation을 FESA가 채택한다고 추론하지 않는다.
- **Inference:** objectivity는 단지 최종 `Q^T Q=I`, `det(Q)=+1` 검사와 다르다. initial/current
geometry와 모든 triad에 같은 finite rigid motion을 superpose했을 때 physical strain/stress,
internal energy와 equilibrium law가 적절히 invariant/covariant해야 한다.
### 4.3 Global 24 DOFs, drilling and nodal moments
- **Verified fact — S1:** original continuum-based four-node shell은 node당 두 director rotation을
쓰는 five-physical-DOF element로 제시된다. director 축 주위 rotation은 original physical
shell strain이 아니다.
- **Project decision — P1/P5:** FESA public/global field는 node당 세 `UR`을 유지하고, 기존
linear element는 director-tangent physical pair와 director-parallel numerical drill coordinate를
분리한다. fixed small diagonal drill stabilization은 linear 계약에서만 승인되었다.
- **Inference:** finite rotation에서 current director에 대한 “parallel/tangent” projection 자체가
state-dependent하다. 그러므로 physical 20-coordinate residual을 global 24-coordinate correction에
옮기는 map의 첫 미분뿐 아니라 map의 변화가 만드는 second-derivative/geometric term까지
consistent tangent에 필요하다.
- **Open issue O-DRILL-01:** objective nonlinear drilling potential, rotating reference, stiffness
scale의 committed/trial 의존성, residual과 exact Hessian이 없다. linear diagonal을 current
coordinates에 그대로 더하면 large rigid rotation에 artificial energy를 만들 수 있다는 것은
**inference**이며, Formulation/Numerical Review가 potential 수준에서 판정해야 한다.
- **Verified boundary — S4/S5:** path-independent/objective shell formulations 또는 physical
Cosserat drilling rotation은 존재하지만, 그것은 FESA의 numerical drill regularization과 다른
물리 모델이다. 이를 근거로 FESA drill을 physical strain/load channel로 바꿀 수 없다.
- **Open issue O-MOM-01:** fixed-global dead nodal moment의 components는 P1이 고정하지만,
multiplicative rotation correction과 work-conjugate generalized moment, virtual work, consistent
derivative는 아직 없다. “follower-load tangent 없음”이 “rotation-map derivative도 없음”을
뜻한다고 추론해서는 안 된다.
- **Open issue O-DRILL-02:** current director와 평행한 applied moment의 거부/허용 projection이
finite state에서 어떻게 평가되는지, physical moment work와 numerical drill을 어떻게 완전히
분리하는지 downstream 계약이 필요하다.
### 4.4 Full Newton and same-trial consistent tangent
- **Verified fact — S7:** Newton linearization은 현재 iterate에서 평가한 equilibrium residual과
그 residual의 Jacobian을 같은 state에서 사용한다. full Newton은 매 iteration Jacobian을 다시
형성하고 푸는 방법이며, residual과 correction을 함께 작게 확인하는 것이 일반적이다.
- **Project decision — P1:** FESA는 residual과 algorithmically consistent tangent를 같은 trial
identity에서 평가하고, entered iteration마다 fresh factorization/solve를 하며, correction을
변경 없이 적용한다. iteration `1..100`, fixed increments, no line search/damping/cutback/retry다.
- **Inference:** “material tangent + geometric stiffness”라는 이름의 합만으로 consistency가
입증되지 않는다. 선택한 rotation retraction 아래에서 physical internal force, state-dependent
24/20 map, drilling potential, prescribed-DOF elimination과 external work를 모두 방향미분한 결과가
assembled residual의 Jacobian과 일치해야 한다.
- **Inference:** fixed-global translational dead force의 magnitude/direction은 displacement와 무관하므로
translation virtual-work 표현이 additive global translation이면 그 load contribution은 configuration
derivative를 만들지 않는다. 이 결론은 nodal moment나 prescribed finite rotation에 자동 확장되지
않는다.
- **Inference / verification consequence — S7/P1:** deterministic directional-derivative test에서 동일 trial state와 동일
rotation retraction을 사용해 `K p`를 centered residual difference와 비교해야 한다. perturbation을
한 값으로 고정해 우연한 cancellation을 통과시키지 말고 truncation/roundoff plateau를 확인하되,
perturbation grid와 tolerance는 Numerical Review가 정한다.
- **Inference / symmetry boundary — S5/P1:** materially linear conservative internal potential과 conservative numerical
drilling potential을 정확히 두 번 미분한 적절한 coordinate Hessian은 symmetry 후보가 된다.
그러나 nodal moment work, rotation coordinate choice와 constraint reduction이 미정이므로 complete
global tangent symmetry를 이 연구에서 요구사항 이상으로 확정하지 않는다.
### 4.5 Proportional loads and prescribed paths
- **Project decision — P1:** 모든 approved `CLOAD`와 nonzero `BOUNDARY`는 step-start에서 factor-one
target까지 같은 scalar factor를 쓰고, factor는 fixed positive increment와 마지막 shortening만으로
정확히 1에 도달한다. `CLOAD` force/moment는 global direction이 고정된 dead load다.
- **Project decision — P1:** prescribed value는 factor-one absolute global-DOF target이며 Newton
correction과 다르다. constrained component는 convergence norm에서 빠지지만 complete assembled
residual의 constrained entry는 reaction 의미를 가진다.
- **Open issue O-BC-01:** finite rotational `BOUNDARY` target을 `Q_start`에 상대적인 rotation vector로
해석하는지, `Q(lambda)`를 어떤 retraction/side로 구성하는지, constrained correction과 target
mismatch를 어떤 coordinate에서 계산하는지 Formulation이 정해야 한다.
- **Inference:** Cartesian nodal positions를 `X + lambda (R-I)X`로 선형 보간하는 prescribed path는
일반적으로 중간 `lambda`에서 exact rigid rotation 궤적이 아니다. 따라서 finite rigid-body
objectivity test를 단순 proportional displacement BC로 만들면 중간 상태에 strain이 생길 수 있다.
operator-level superposition test 또는 처음부터 rigidly transformed 된 두 독립 모델의 covariance
비교가 더 직접적인 후보이며, exact rigid prescribed path를 새 public 의미로 추가하면 scope change다.
- **Inference / applicability consequence — P1:** limit point, snap-through/post-buckling branch, follower pressure와
non-proportional control이 필요한 benchmark는 첫 release의 acceptance 후보가 아니다. fixed-load
increment가 Newton attraction radius 밖이면 deterministic failure가 맞으며, automatic cutback을
기대할 수 없다.
### 4.6 Locking, integration and geometry risks
- **Verified fact — S6:** original MITC4는 transverse shear를 MITC 방식으로 처리하지만 membrane
strain을 MITC4+처럼 보강하지 않는다. curved 또는 response 중 distorted mesh에서는 membrane
locking으로 load–displacement accuracy가 크게 저하될 수 있다.
- **Project decision — P5:** FESA `S4`와 `S4R`는 같은 original-style MITC4 path다. Abaqus S4/S4R의
full/reduced integration, hourglass, membrane enhancement 또는 stabilization 차이를 상속하지 않는다.
- **Inference:** `2x2x2` common rule은 S1/S6 및 linear FESA와 연결되는 강한 candidate지만,
nonlinear strain/tangent의 각 항을 어느 위치에서 적분할지는 Formulation이 source 식으로
확인해야 한다. one-point reduction/hourglass control을 source `S4R` 때문에 도입할 근거는 없다.
- **Verified risk / inference — S6/P5:** thin/slender geometry, curved/distorted quads, nearly degenerate positive Jacobian과 작은
drill scale은 locking 또는 conditioning을 악화할 수 있다. current trial geometry가 심하게
변형되어도 TL reference mapping과 current frame/director 모두 각 required Gauss/tying/recovery
위치에서 finite/valid해야 한다.
- **Inference / verification consequence — S6/P1:** regular/distorted, thickness/radius 또는 thickness/length sequence를
함께 보고, 단일 point response가 맞는 것만으로 locking-free를 주장하지 않는다. MITC4+
convergence를 original FESA-MITC4 acceptance target으로 사용하지 않는다.
### 4.7 Equilibrium, reactions and transactional state
- **Project decision — P1/P3:** full assembled equilibrium at a trial/accepted state gives free-DOF
residual and constrained reaction. stable source/component identity와 deterministic assembly/reduction
order를 보존해야 한다.
- **Inference:** accepted state 검증은 free residual norm만이 아니라 fixed-global resultant force와
moment balance를 함께 확인해야 한다. global moment balance는 한 fixed origin에 대한 nodal-force
moment, nodal couple와 reactions를 모두 포함해야 하며 exact sign/identity는 Formulation/Numerical
Review가 정한다.
- **Project decision — P1/P3:** trial state와 output candidate는 완전히 검증된 뒤 atomic commit된다.
failure는 prior committed state와 prior authoritative HDF5를 보존하고 current-run live log는 남긴다.
- **Inference / verification consequence — P1/P3:** nonconvergence, nonfinite state/recovery, factorization/solve failure와
output-finalization failure를 서로 다른 injected failure point로 시험해야 한다. 성공 increment만
frame과 일대일이어야 하며 trial rotation/director가 committed state를 alias하면 안 된다.
## 5. Candidate Benchmarks and Artifact Readiness
후보 우선순위는 `A`(required portfolio의 직접 후보), `B`(외부 solution/reference candidate),
`C`(known-limit characterization 또는 future method)이다. 아래 수치나 source table은 아직 FESA
acceptance target/tolerance로 승인된 것이 아니다.
### B-01 — Small-displacement linear limit (`A`)
- **Exact candidate artifact:** 현재 read-only `reference/shell/shell.inp`,
`reference/shell/shell displacements.csv`, `shell reactions.csv`, `shell stresses.csv`; 별도로
`reference/shellR/shellR.inp`와 대응 CSV가 존재한다. 두 input 모두 `*Step, nlgeom=NO`다.
- **Artifact gap:** 동일 source identity와 supported four-value nonlinear `STATIC`을 사용하는
approved `nlgeom=YES` input 및 nonlinear accepted-frame CSV는 없다. 기존 pair를 rename/rewrite하거나
nonlinear reference라고 재분류해서는 안 된다.
- **Target quantities:** 충분히 작은 response에서 accepted factor-one global `U`, physical rotation/director,
reaction, physical strain/stress/resultant의 linear procedure/baseline 접근; geometric part가 사라지는
tangent limit; source-row identity.
- **Cannot verify:** finite rotation, nonlinear load–displacement path, nonlinear convergence, objective
drilling, rollback 또는 Abaqus nonlinear agreement.
- **Assumptions/limits:** existing center deflection scale이 geometry에 비해 작은지는 model length와
dimensionless ratio로 다시 확인해야 한다. `shellR` artifact 존재는 FESA reduced integration 또는
nonlinear readiness 근거가 아니다.
- **Numerical Review questions:** nonlinear variant를 test-owned input으로 승인할지; 어느 linear
HDF5/CSV quantities를 baseline으로 삼을지; geometric perturbation 크기와 case-specific limit
tolerance는 무엇인지; external comparison이 아니라 cross-procedure regression으로 분류할지.
### B-02 — Element patch and constant-state continuation (`A`)
- **Exact candidate artifact/gap:** 기존 exact linear unit-test concepts는
`tests/unit/elements/mitc4_shell_test.cpp`의 membrane/bending/shear/twist/rigid tests다. finite-state
patch input/expected data artifact는 없음.
- **Target quantities:** constant membrane/bending/shear states의 nodal residual, strain/stress/resultant,
patch interface equilibrium; zero-increment state에서 linear test로의 reduction; regular/rotated/distorted
mesh에서 component/sign covariance.
- **Cannot verify:** global Newton lifecycle, full large-deflection accuracy, curved-shell membrane locking,
external reference agreement.
- **Assumptions/limits:** analytical state가 chosen nonlinear shell kinematics에 정확히 representable한지
Formulation derivation 후 확인해야 한다. all-constrained manufactured state는 solver convergence를
exercise하지 않는다.
- **Numerical Review questions:** 어떤 exact states가 admissible한지, drill coordinate를 어떻게 zero로
유지할지, element vs assembly blocking 분할과 invariant tolerance.
### B-03 — Tangent directional derivative (`A`)
- **Exact candidate artifact/gap:** external artifact 없음. Formulation이 정한 retraction을 쓰는
deterministic generated trial-state test가 필요하다.
- **Target quantities:** 여러 regular/distorted elements와 assembled patch에서 translation/rotation
direction `p`에 대한 complete residual difference와 `K_T p`; material, geometric, 24/20-map,
drilling, load-work contribution을 선택적으로 isolate한 error trend.
- **Cannot verify:** 물리 solution accuracy, mesh convergence 또는 benchmark response.
- **Assumptions/limits:** centered difference의 두 perturbed states가 같은 committed base와 load factor를
공유해야 한다. finite-difference noise 때문에 한 epsilon의 absolute comparison은 부적절하다.
- **Numerical Review questions:** perturbation schedule, norm/scaling, expected asymptotic region과 blocking
tolerance; constrained DOF와 nodal-moment case 포함 여부; complete tangent symmetry의 expected status.
### B-04 — Finite rigid superposition/objectivity and triad invariants (`A`)
- **Exact candidate artifact/gap:** S17 public Abaqus verification에는 shell rigid-body-motion input
`xrbmshel.inp`가 있으나 local stored artifact가 없고 FESA subset/목적이 일치하지 않는다.
S17은 direct-integration implicit-dynamic rigid-body output test이지 nonlinear-static physical
strain/internal-force objectivity test가 아니다.
FESA operator-level superposition case도 아직 없음.
- **Target quantities:** arbitrary proper rigid rotation과 translation을 initial/current geometry 및 nodal
triads에 superpose하기 전후 physical strain/stress/energy invariance, internal force/tangent covariance,
`Q^T Q`, `det(Q)`, director-third-axis identity; rigid state의 zero physical residual.
- **Cannot verify:** deformational accuracy, nonlinear load path, reaction sign 또는 external solver agreement.
- **Assumptions/limits:** proportional Cartesian BC는 exact rigid intermediate path가 아니므로 사용하지
않는다. numerical drill이 physical rigid motion에 energy를 만들지 않는 map이 먼저 정의되어야 한다.
- **Numerical Review questions:** state-level 또는 solved-model covariance 중 무엇을 blocking할지;
rotation magnitudes/axes, force/tangent transform와 invariant tolerances; drill residual을 physical
residual과 어떻게 분리할지.
### B-05 — Equilibrium/reaction and symmetry pair (`A`)
- **Exact candidate artifact/gap:** exact local nonlinear input/expected rows 없음. one-element/patch와
mirrored multi-element model을 새 test-owned candidate로 정의해야 한다.
- **Target quantities:** accepted free residual, constrained reaction, global resultant force/moment balance;
mirrored node/source mapping 아래 displacement, triad/director, reactions와 physical output의 parity;
deterministic row/order identity.
- **Cannot verify:** absolute large-deflection accuracy 또는 tangent consistency 단독.
- **Assumptions/limits:** mirror는 orientation/connectivity와 pseudovector moment/rotation 변환을 올바르게
다뤄야 한다. 단순 component equality가 아니라 signed mapped equality가 필요하다.
- **Numerical Review questions:** fixed balance origin, nodal couple 포함식, blocking quantities/tolerances,
mirror connectivity rule, symmetry와 objectivity 중 요구조건의 최소 blocking 조합.
### B-06 — Commit/rollback and deterministic event sequence (`A`)
- **Exact candidate artifact/gap:** external physics artifact는 필요하지 않다. repository에는 nonlinear
transactional-state failure harness가 아직 없다.
- **Target quantities:** success 시 committed state/load factor/frame의 bijection; iteration-100 pass/fail
boundary; nonconvergence, nonfinite residual/tangent/correction/recovery, factorization/solve 및 HDF5
finalization failure 후 prior displacement/triad/director/reaction/recovery/final HDF5 보존; live log의
entered-iteration cardinality; repeated/thread configurations의 stable event/order.
- **Cannot verify:** shell physical accuracy나 external reference agreement.
- **Assumptions/limits:** failure injection은 production semantics를 바꾸지 않는 test seam이어야 한다.
- **Numerical Review questions:** floating reproducibility 수준, state snapshot 비교량, output failure를
commit 전 어느 validation boundary에 둘지, incomplete current increment가 log에 남길 최소 evidence.
### B-07F — End-shear cantilever with dense tabulated path (`A/B`)
- **Exact candidate artifact:** S16 §3.1/Table 2a/Fig. 2의 public institutional postprint.
`E=1.2e6`, `nu=0`, `L=10`, `b=1`, `h=0.1`, `P0=EI/L^2=1`, `Pmax=4P0`와
`16 x 1` S4R model의 40 equal increments에서 horizontal/vertical tip deflections를
`P/Pmax=0.05..1.00`에 tabulate한다.
- **Artifact gap:** machine-readable nodes/elements, exact nodal force distribution, `.inp`와 stored
FESA/reference CSV가 없다.
- **Target quantities:** Table 2a의 signed `Utip/Wtip` path, tip force factor, root reactions,
current geometry/director와 Newton iteration identity. Point dead force라 O-MOM-01을 기다리지 않는
large-rotation global-solve 후보다.
- **Cannot verify:** curved-shell membrane locking, nodal moment work, tangent derivative, objectivity 또는
rollback 단독. S16 값은 Abaqus S4R 결과이며 독립 analytical solution이 아니다.
- **Assumptions/limits:** paper의 S4R는 FESA와 다른 Updated-Lagrangian/reduced-integration/hourglass/drill
model이다. equality는 오직 동일 physical quantity의 external numerical comparison 후보이며 internal
compatibility를 뜻하지 않는다. 논문의 default automatic NINC/NITER가 아니라 Table 2a 생성에 쓴
equal `NINC*=40` path만 first-release fixed-step 후보와 가까운 evidence다.
- **Numerical Review questions:** postprint geometry에서 exact mesh/connectivity/load distribution을
재구성해도 benchmark identity를 보존하는가; Table 2a 어느 rows/components를 blocking할지;
FESA fixed Full Newton/no-line-search에서 40 increments가 traversable한지; stored artifact provenance와
`docs/TOLERANCE.md` family를 어떻게 정할지.
### B-07M — Pure-moment cantilever to a circular arc/full circle, MES (`A/B`)
- **Exact candidate artifact:** S6 §3.1/Fig. 5–7/Eq. (27)의 `16 x 1` MITC4/MITC4+ cantilever와
analytical circular-arc solution. S16 §3.2/Table 3a/Fig. 3은 `E=1.2e6`, `nu=0`, `L=12`,
`b=1`, `h=0.1`, `Mmax=2*pi*EI/L`과 `M/Mmax=0.05..1.00`의 analytical 및 S4R tip
deflections를 tabulate한다.
- **Artifact gap:** machine-readable node/element/input, exact nodal moment distribution과 stored CSV가
없다. FESA-approved CLOAD nodal-moment work가 아직 미정이다.
- **Target quantities:** published analytical tip-displacement functions, final circular geometry/director,
load-factor path, root reactions, Newton iterations, objectivity under a superposed rigid transform.
- **Cannot verify:** point-force behavior, curved initial geometry, membrane-locking performance,
Abaqus agreement, numerical drilling accuracy.
- **Assumptions/limits:** thin strip가 beam analytical assumptions에 충분히 접근하는 mesh/thickness가
필요하고, tip moment를 node들에 배분하면 analytical end resultant와 work-equivalent해야 한다.
S16의 dense S4R columns는 analytical columns의 보조 convergence evidence이지 FESA internal-equivalence
target이 아니다. S16은 equal `NINC*=80`을 썼으며 default automatic increment counts는 FESA
fixed-step behavior의 acceptance evidence가 아니다.
- **Numerical Review questions:** finite-rotation nodal-moment work가 확정되기 전 blocking 가능한가;
exact geometry/mesh/section/load distribution과 analytical quantity projection; full-circle state를
fixed-step/no-cutback Full Newton으로 안전하게 도달시킬 increment와 tolerance.
### B-08 — NAFEMS 3DNLG-1 Z-shaped cantilever (`B`)
- **Exact public candidate artifact:** S8의 `n3g1x33x_s4.inp`와 `n3g1x33x_s4r.inp`.
페이지는 `t=1.7`, `E=2.0e5`, `nu=0.3`, built-in end, concentrated `P=4000`, `1 x 72`
S4/S4R mesh와 source tables를 명시한다. local stored artifact/CSV는 없음.
- **Target quantities:** load `104.5`, `1263.0`, `4000.0`에서 tip displacement 및 section A moment;
accepted path, root reactions, mesh/source identity.
- **Cannot verify:** curved-shell or distorted-mesh membrane locking, pure rigid objectivity, tangent derivative,
rollback. source S4 result 일치는 formulation/integration/stabilization equivalence를 뜻하지 않는다.
- **Assumptions/limits:** public input의 keyword, node/element orientation, output/moment definition을 FESA
subset과 대조해야 한다. NAFEMS original R0029의 independent-source details는 paywall gap이다.
- **Numerical Review questions:** exact public input을 그대로 지원할 수 있는지 또는 adaptation이
필요한지; moment-at-A를 FESA authoritative output에서 동일 quantity/frame으로 얻을 수 있는지;
source table 중 independent target을 식별할 수 있는지; 어떤 quantities가 blocking/warning인지.
### B-09 — NAFEMS 3DNLG-9 pinched hemisphere (`B`)
- **Exact public candidate artifact:** S9의 S4 `n3g9xe4x.inp`, S4R `n3g9xf4x.inp`.
page는 `E=6.825e7`, `nu=0.3`, symmetry constraints, diametrical inward/outward point load
`P=100`과 source tables를 제공한다. S16 §3.4/Table 5a는 closely related hemisphere의
`P/Pmax=0.05..1.00` dense A/B displacement table을 제공한다. local stored artifact/CSV는 없음.
- **Target quantities:** `P=40,60,100`에서 points A/B radial displacement, load–displacement path,
symmetry, reactions와 curved-shell mesh trend.
- **Cannot verify:** independent Abaqus verification—S9 자체가 NAFEMS published values가 Abaqus로
얻어졌다고 경고한다—또는 tangent/rollback/pure moment work.
- **Assumptions/limits:** symmetry shorthand, spherical geometry/directors, exact node identity와 radial
projection이 supported subset에 맞아야 한다. original MITC4의 membrane-locking 위험 때문에
MITC4+ 또는 higher-order 결과 수준을 기대해서는 안 된다. S16 dense values 역시 Abaqus S4R로
계산되었으므로 independent-source gap을 닫지 않는다.
- **Numerical Review questions:** R0029의 other-source 결과를 합법적으로 확인할 수 있는지;
exact public deck subset compatibility; regular/distorted/mesh sequence와 target rows; known-locking
limitation을 acceptance와 characterization 중 어디에 둘지.
### B-10 — Original-MITC4 locking/distortion characterization (`C`)
- **Exact candidate artifact:** S6 Fig. 14–16의 cylindrical shell bending geometry와
`a/R=1/100, 1/1000, 1/10000`, regular/distorted `12 x 12` meshes; Fig. 17–20의 hemispherical
shell, regular/distorted `8 x 8`, `12 x 12` meshes. 논문 PDF의 geometry/material/load 설명은 공개다.
- **Artifact gap:** machine-readable inputs/curves가 없고 fine MITC9 reference는 논문 graph뿐이다.
cylindrical case의 distributed edge moment는 현재 input scope와 맞지 않는다.
- **Target quantities:** thickness와 distortion에 따른 displacement-curve trend, rank/conditioning,
original MITC4와 reference curve의 qualitative separation.
- **Cannot verify:** exact blocking reference comparison, FESA MITC4+ behavior, current input-path acceptance.
- **Assumptions/limits:** characterization-only. S6는 original MITC4가 thin distorted cases와 일부
large-response meshes에서 membrane lock함을 보여 주므로 실패 경향을 숨기지 않는다.
- **Numerical Review questions:** point-load-compatible hemisphere만 optional study로 남길지; graph
digitization을 금지하고 qualitative known limitation으로만 쓸지; performance adequacy의 최소 범위.
### B-11 — Shell MMS / exact-solution expansion (`C`)
- **Exact public candidate artifact:** S13의 Figshare source-term notebook와 solid-mechanics examples.
- **Artifact gap:** FESA TL MITC4 shell kinematics에 대한 manufactured midsurface/director field,
compatible nodal CLOAD/BOUNDARY-only source, analytical resultants와 convergence data가 없다.
- **Target quantities:** 향후 shell-specific MMS를 만들 경우 spatial order, residual/source balance,
strain/stress/resultant error norms와 mesh refinement rate. 현재는 B-07M analytical circle을 MES
(method of exact solutions) 후보로 우선한다.
- **Cannot verify:** current feature를 그대로 실행할 수 없음; S13의 3-D body source와 material cases는
current input/material scope 밖이다.
- **Assumptions/limits:** shell MMS를 위해 distributed/body source 또는 새로운 BC meaning을 추가하면
approved scope change다. all-boundary prescribed manufactured state는 global nonlinear solve를 충분히
exercise하지 않는다.
- **Numerical Review questions:** current release에서 MMS를 nonblocking gap으로 둘지; nodal-load-only
admissible exact state를 유도할 수 있는지; spatial convergence study가 acceptance에 필요한지.
## 6. Verification Relevance
| evidence class | candidates | 검증하는 것 | 검증하지 못하는 것 |
| --- | --- | --- | --- |
| code verification | B-01, B-02, B-03, B-04, B-05, B-06 | linearization, coordinate map, objectivity/covariance, equilibrium/reaction, state lifecycle, deterministic order | 실제 구조물의 물리 validity 전부 |
| exact/MES comparison | B-07M | large-rotation kinematics, moment work, analytical response path | general curved shell, point force, drilling accuracy |
| solution verification / benchmark comparison | B-07F, B-08, B-09 | assembled nonlinear response, path, curvature, nodal dead load, mesh behavior | 내부 formulation equivalence, tangent consistency, rollback |
| known-limit characterization | B-10 | original MITC4 membrane-locking/distortion sensitivity를 드러냄 | blocking exact target 또는 MITC4+ 성능 |
| MMS method candidate | B-11 | 향후 equation/source implementation과 spatial order | current input scope에서 즉시 실행 가능한 gate |
| reference comparison | Stage-4에서 승인할 stored nonlinear input/CSV | stable source/component mapping과 `docs/TOLERANCE.md` gate | formulation identity, objectivity, state integrity |
| validation | 현재 exact candidate 없음 | — | experimental reality agreement. 이번 release gate를 verification과 validation으로 혼동하지 않음 |
한 benchmark의 nodal displacement 일치로 전체 기능을 승인해서는 안 된다. 최소 blocking portfolio는
B-01~B-06의 독립 invariant/software checks와, point-dead-load B-07F 또는 exact subset이 확인된
B-08/B-09 중 적어도 하나의 large-response problem을 조합하는 방향이 타당하다. O-MOM-01 해소
후 analytical B-07M을 추가하면 finite-moment work evidence가 강화된다. 이는
**research recommendation**이며 exact blocking set과 tolerance는 Numerical Review 소유다.
## 7. Applicability Limits
| axis | applicable | not established / excluded |
| --- | --- | --- |
| nonlinearity | fixed-reference Total Lagrangian geometric nonlinearity | Updated Lagrangian, corotational, material nonlinearity, finite-strain constitutive validation |
| element | four-node FESA-MITC4 mapping for source S4/S4R; Reissner–Mindlin-type director shell | MITC4+, MITC9, physical drilling/MITC4-D, continuum-shell 또는 Abaqus S4/S4R internal behavior |
| material/section | homogeneous isotropic materially linear shell; user-consistent units | composite, plasticity, hyperelasticity, thickness stretch/material history |
| kinematics | large displacement/finite rotation with small elastic strain applicability | singular/degenerate director interpolation, sharp folds/intersections/hinges without separate evidence |
| loads | proportional fixed-global nodal force and moment; prescribed global targets | follower pressure/force, distributed/body/edge load, non-proportional path, arc-length/control displacement |
| solver path | fixed increments, Full Newton, fresh tangent/solve, no correction modification | modified/quasi-Newton, line search, damping, adaptive growth/cutback/retry, limit-point traversal guarantee |
| integration | source-backed `2x2x2` candidate and existing FESA common S4/S4R convention | source-label-selected Abaqus integration, one-point reduction/hourglass or undocumented selective integration |
| locking | transverse-shear MITC mitigation | general locking-free claim; distorted curved original MITC4 has membrane-locking risk |
| outputs/reference | accepted committed states; exact stable source/component matching after Stage-4 contract | trial HDF5 history, vendor internal variables, inferred units/coordinates, artifact row averaging/normalization |
| verification | analytical/invariant/patch/benchmark/software-failure portfolio | one-value validation claim, automatic Abaqus/Midas equivalence, current linear artifacts as nonlinear reference |
## 8. Open Issues and Source Disagreements
| id | type | issue / conflict | downstream acceptance question |
| --- | --- | --- | --- |
| O-ROT-01 | formulation | multiplicative side/frame/retraction, accumulated chart/recentering과 first/second derivative 미정 | Formulation이 하나의 objective state/update convention을 완전 선형화할 수 있는가? |
| O-ROT-02 | formulation/numerical | nodal triad/director의 Gauss/tying interpolation과 normalization derivative 미정 | opposed/degenerate director validation 및 objectivity test가 무엇인가? |
| O-MAP-01 | formulation | nonlinear `24 global -> 20 physical + 4 drill` map과 map Hessian 미정 | complete global residual/tangent가 directional-derivative gate를 통과하는가? |
| O-DRILL-01 | formulation/numerical | objective drilling potential, scale/state dependence와 exact Hessian 미정 | six physical rigid modes를 보존하며 pure drill만 regularize하는가? |
| O-DRILL-02 | formulation/numerical | finite state에서 director-parallel applied moment의 판정과 physical moment/numerical drill 분리 미정 | drilling-direction load가 physical work나 stabilization에 섞이지 않고 결정적으로 거부되는가? |
| O-MOM-01 | formulation | fixed-spatial nodal moment의 multiplicative rotation work/conjugacy 미정 | no-follower 계약을 지키면서 residual/tangent와 B-07M을 정의할 수 있는가? |
| O-BC-01 | formulation/numerical | absolute prescribed finite rotation의 factor path와 constrained correction 좌표 미정 | factor endpoints, intermediate `Q`, reaction work와 rollback identity가 유일한가? |
| O-SYM-01 | numerical | complete tangent symmetry가 conservative internal/drill/moment 선택 후에야 판정 가능 | symmetry를 blocking invariant로 둘지, 어떤 scaled norm을 쓸지? |
| O-REF-01 | reference readiness | exact stored nonlinear `.inp`/CSV가 repository에 없음 | B-08 또는 B-09의 exact deck/rows를 합법적으로 저장·승인할지, 아니면 다른 artifact를 선택할지? |
| O-REF-02 | source access | NAFEMS R0029 full report는 paid/private; 공개 Abaqus 3DNLG-9 값은 독립 NAFEMS evidence가 아님 | independent target/provenance를 추가 확보할 수 있는가? 확보 못하면 claim을 어떻게 제한할지? |
| O-TOL-01 | numerical | tangent, objectivity, `Q` invariant, balance, symmetry, endpoint arithmetic tolerance 미정 | scale-aware case-specific gate를 Stage-4 전에 모두 고정할 수 있는가? |
| O-BENCH-01 | scope/numerical | B-07F는 exact deck 부재/vendor-result 경계, B-07M은 nodal moment work, B-09는 curved locking/subset, B-08은 moment output identity gap이 있음 | large-response blocking benchmark를 어떤 exact artifact/quantity로 선택할지? |
| O-STEP-01 | numerical | no-cutback Full Newton이 published benchmark load intervals에서 수렴한다는 evidence 없음 | fixed increment를 benchmark마다 어떻게 정하고, deterministic nonconvergence와 formulation failure를 구분할지? |
| O-MMS-01 | method | public MMS artifact는 3-D solid/body-source이고 shell/CLOAD subset과 불일치 | first release에서 nonblocking으로 남길지, scope-preserving exact nodal-load case가 가능한지? |
명시적 source disagreement/비교 경계는 다음과 같다.
1. S1/S6의 nonlinear shell은 node당 five physical DOFs를 쓰지만 P1은 six global DOFs와
numerical drill을 요구한다. 이 차이는 구현 detail이 아니라 O-MAP-01/O-DRILL-01의 정식화 gap이다.
2. S6의 MITC4+는 membrane assumed strain을 추가하고 original MITC4보다 distorted nonlinear
mesh에서 더 좋은 결과를 보인다. FESA는 original-style MITC4이므로 그 성능을 상속하지 않는다.
3. Abaqus S4와 S4R의 공개 결과/inputs는 benchmark evidence 후보지만 FESA source mapping과
Abaqus integration, stabilization, rotation 또는 output recovery의 동일성을 뜻하지 않는다.
4. S7의 Abaqus production algorithm에는 adaptive cutback 등 P1이 의도적으로 제외한 control이
있다. Newton의 일반 same-state Jacobian evidence만 사용하며 runtime-control 동등성을 주장하지 않는다.
## 9. Downstream Handoff
### 9.1 Formulation Agent에 전달할 evidence와 미결정
1. S1/S6을 출발점으로 fixed-initial-reference TL shell의 kinematic/virtual-work 계통을 다시
유도하되, materially linear law와 existing physical MITC shear/`2x2x2` boundary만 보존한다.
2. S2–S5를 근거로 committed/trial `Q`, director, chosen multiplicative retraction, interpolation,
first/second variation을 하나의 objective/path-defined convention으로 제시한다.
3. O-MAP-01의 exact global 24-DOF residual/tangent와 state-dependent map Hessian을 완성한다.
`docs/linear-static-mitc4-shell/formulation.md` §15는 gap inventory로만 사용한다.
4. O-DRILL-01/O-DRILL-02의 objective numerical drilling potential과 exact residual/Hessian,
physical recovery separation, rigid-mode preservation을 정의한다. physical drilling 모델로 scope를
바꾸지 않는다.
5. fixed-global force와 moment의 external virtual work, O-MOM-01 nodal-moment conjugacy/derivative,
O-BC-01 prescribed finite-rotation path와 constrained correction을 명시한다.
6. same-trial complete residual과 algorithmic tangent에 material/geometric/map/drill/load-work terms가
빠짐없이 대응함을 trace한다. 이 연구의 benchmark formula를 FESA governing equation으로 복사하지 않는다.
### 9.2 Numerical Review Agent에 전달할 benchmark/reference evidence
1. B-01~B-06을 각기 독립 blocking 후보로 검토하고, quantities, norms, scales, perturbation study,
invariant/balance/rollback tolerance를 `O-TOL-01` 해소와 함께 고정한다.
2. B-07F는 O-MOM-01과 독립인 point-dead-load large-rotation 후보로 먼저 검토하되 S16의
vendor S4R values를 independent/formulation-equivalent target으로 부르지 않는다. B-07M
pure-moment MES는 O-MOM-01이 해결된 뒤에만 blocking 여부를 정하고, analytical equation,
mesh/section/load distribution과 target projection을 별도로 재현·검토한다.
3. public exact filenames가 있는 B-08 `n3g1x33x_s4.inp`/`_s4r.inp`와 B-09
`n3g9xe4x.inp`/`n3g9xf4x.inp`의 keyword subset, stable identities, units/coordinates, target row
definitions와 provenance를 검사한다. 이 단계에서는 실행·생성·rename하지 않는다.
4. `reference/shell/`와 `reference/shellR/`는 `nlgeom=NO` linear artifacts다. B-01 baseline 이상의
nonlinear-readiness를 부여하지 말고 O-REF-01을 exact stored nonlinear artifact gap으로 유지한다.
5. B-10은 original MITC4 known-limit characterization으로 분류하고 MITC4+ curves를 FESA target으로
쓰지 않는다. B-11 MMS는 current scope compatibility가 입증되지 않으면 nonblocking gap이다.
6. selected external reference만 stable row identity와 `docs/TOLERANCE.md` family-scale policy로
비교한다. missing/extra/duplicate/nonfinite precheck와 blocking/warning family를 artifact별로 정한다.
7. fixed increment/no-cutback 조건에서 benchmark가 실제로 traversable한지 O-STEP-01을 먼저 판정한다.
convergence failure를 임의 tolerance 완화나 hidden retry로 숨기지 않는다.
### 9.3 Coordinator에 반환하는 gate 의미
- Research quality gate는 통과한다: approved gaps에 직접 대응하는 Tier 1/2 evidence, applicability
limits, exact public/local candidate identities, artifact gaps와 downstream acceptance questions가 있다.
- 이 `passed`는 formulation 또는 nonlinear reference readiness 통과를 뜻하지 않는다.
O-ROT/O-MAP/O-DRILL/O-MOM/O-BC는 Formulation gate, O-TOL/O-REF/O-BENCH/O-STEP은 Numerical
Review gate에서 해소해야 한다.
- requirements, code, tests, CMake, I/O, phase 또는 reference artifact는 이 stage에서 변경하지 않는다.
## 10. Self-Audit and Research Quality Gate
| audit item | result | evidence |
| --- | --- | --- |
| approved requirement trace | pass | RQ와 Sections 4–9가 NSNR-003/041/074/006/048/018/063/011/019/030/034를 직접 다룸 |
| key theory claim sourcing | pass | TL/MITC4 S1/S6, rotations S2–S5, Newton S7, V&V/MMS S11–S13, tabulated benchmark evidence S16 |
| fact/decision/inference/open separation | pass | Section 4의 각 claim label과 Section 8 gap IDs |
| benchmark exactness | pass | B-01~B-06, B-07F/B-07M, B-08~B-11마다 exact artifact 또는 explicit artifact gap, target, cannot-verify, limit, Numerical Review question 기재 |
| nonlinear artifact honesty | pass | P6/B-01에서 `reference/shell*`의 `nlgeom=NO`와 nonlinear gap을 명시 |
| compatibility restraint | pass | S4/S4R/MITC4+ 및 Abaqus/NAFEMS 경계를 Sections 3, 7, 8에 명시; internal equivalence claim 없음 |
| tolerance restraint | pass | source가 공개한 benchmark load/geometry만 후보로 기록; 새로운 reference/invariant tolerance를 만들지 않음 |
| source access/licensing limits | pass | NAFEMS/ASME paywall, publisher access, public author copy/CC BY와 graph-only limits 기록 |
| downstream sufficiency | pass | exact formulation and Numerical Review action lists와 owner별 open issue 제공 |
| ownership | pass | 이 artifact만 Research Agent 소유; external solver/reference 실행·변경 없음 |
검색했지만 확보하지 못한 핵심 evidence는 (1) 공개·독립·machine-readable NAFEMS R0029 target
source, (2) FESA subset에 이미 맞는 stored nonlinear S4/S4R input/CSV, (3) original FESA-MITC4의
objective 24-DOF drilling/finite nodal-moment 정식화다. 이 부재를 source compatibility 주장이나
새 numerical value로 메우지 않았다.
@@ -1,186 +0,0 @@
# Translation Displacement Comparison Report
## 1. Metadata and scope
- feature_id: `nonlinear-static-newton-raphson`
- report_id: `TRANSLATION-REPORT-001`
- date: `2026-08-26`
- owner_agent: `implementation-agent` (bounded diagnostic dispatch)
- dispatch coordination SHA-256: `D7CE6264EE3FD20FB6CD74CF1FC28E05EEEEFA67B25AF737D2DF989059A72D6F`
- status: `translation-diagnostic-pass-not-a-gate`
- tolerance source: `docs/TOLERANCE.md`
This focused report recomputes only global translational displacement components
`U1/U2/U3` for the existing coarse `reference/shellNL` case and the added fine
`reference/shellNL-meshfine` case. It is diagnostic evidence for the observed
mesh sensitivity; it does not create or replace the canonical Stage 6
`reference-comparison.md`. In particular, it is not Step 12 implementation
evidence and does not change any workflow gate.
The two meshes are compared separately to their own read-only Abaqus CSV
artifacts. No coarse-to-fine node interpolation, row pairing, averaging, or
direct FESA-to-FESA error was used.
## 2. Artifact inventory and accepted-frame identity
All paths below are relative to the feature worktree. SHA-256 and byte counts
were recomputed before comparison.
| mesh | artifact | path | bytes | SHA-256 |
| --- | --- | --- | ---: | --- |
| coarse | input | `reference/shellNL/shellNL.inp` | 4,778 | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| coarse | translation CSV | `reference/shellNL/shellNL displacements.csv` | 7,542 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| coarse | FESA HDF5 | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-441600152250700-0/shellNL_results.h5` | 934,602 | `9744814BEBF33486F526F821EDC7D96F072F34E988D70A00AC7AA063570FFA40` |
| fine | input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | 56,516 | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` |
| fine | translation CSV | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 111,184 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` |
| fine | FESA HDF5 | `.harness/build-ninja-msvc-debug/reference/meshfine-diagnostic/run-1787669003801/shellNL-meshfine_results.h5` | 10,547,651 | `81A3C431E2977D2482D212877C3C306FFBB19CD1F0C47FBF1C936AE06CC93ACA` |
For both HDF5 artifacts, `/steps/Step-1/accepted_frames` has ten accepted rows.
The unique row satisfying `is_factor_one=1` and `load_factor=1.0` is
`frame_index=9`, `increment_index=10`, and `iteration_count=2`. Translation
values were projected only from
`/steps/Step-1/frames/9/nodal/displacement`, columns `[UX, UY, UZ]`:
| mesh | HDF5 node rows | displacement shape | CSV wide rows | exact CSV Frame |
| --- | ---: | --- | ---: | --- |
| coarse | 49 | `[49, 6]` | 49 | `Increment 10: Step Time = 1.000` |
| fine | 729 | `[729, 6]` | 729 | `Increment 10: Step Time = 1.000` |
## 3. Source identity and prechecks
The comparison key is
```text
(accepted_state=factor-one, canonical_instance_name, source_node_label, component)
```
`canonical_instance_name` is matched case-insensitively; the CSV/HDF5 source
spelling itself is not rewritten. CSV columns were selected after trimming only
surrounding header whitespace. The `U-U1/U-U2/U-U3` columns map respectively to
HDF5 `UX/UY/UZ`. Row order is not part of the identity and was not used for
matching.
| mesh | component rows | duplicate CSV wide/component/HDF5 keys | nonfinite CSV/HDF5 values | missing HDF5 keys | extra HDF5 keys | precheck |
| --- | ---: | --- | --- | ---: | ---: | --- |
| coarse | 147 | `0 / 0 / 0` | `0 / 0` | 0 | 0 | pass |
| fine | 2,187 | `0 / 0 / 0` | `0 / 0` | 0 | 0 | pass |
Each CSV contains only the exact factor-one `Frame` value shown above. Thus the
row prechecks required before numerical tolerance evaluation pass for the
translation projection in each mesh.
## 4. Applied tolerance policy
`U1/U2/U3` remain one global-length, blocking translation family within each
case. The component rows in Section 6 are diagnostics only: they use the same
case-family scale and near-zero band below and do not introduce a component
scale, component-specific tolerance, or a new approved family.
For the reference values `r_i` and FESA values `f_i`, `docs/TOLERANCE.md` is
applied exactly:
\[
S=\max_i|r_i|,\qquad B=0.01S,\qquad e_i=|f_i-r_i|.
\]
- If `|r_i| <= B`, the row passes iff `e_i <= B`.
- Otherwise, the row passes iff `e_i / |r_i| <= 0.05`.
- The whole family also requires `RMS(e_i) / S <= 0.01`.
- There is no independent absolute-error gate, `max(1,S)` floor, zero clamp,
row omission, or averaging. A zero-scale family would require exact FESA
zero; neither translation family has zero reference scale.
## 5. Translation-family results
| mesh | rows | `S` | `B=0.01S` | near-zero / significant rows | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | relative RMS | verdict |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| coarse | 147 | `2.3740820300000001e-05` | `2.3740820300000003e-07` | 122 / 25 | 0 | `1.9037855439354404e-07` | `8.5711169439298945e-03` | `2.4530813178127803e-08` | `2.9742030342848264e-07` | `1.0332757195473908e-03` | pass |
| fine | 2,187 | `2.5795705400000001e-05` | `2.5795705400000002e-07` | 1,626 / 561 | 0 | `1.6193812501096337e-07` | `6.2777164841928829e-03` | `5.8615647876386634e-09` | `2.7411825664926473e-07` | `2.2723025777921402e-04` | pass |
Both sets have zero row failures and relative RMS values below the common
`0.01` threshold. This is a translation-only diagnostic pass; it is not a
full external-reference verdict for the nonlinear-static feature.
## 6. Component diagnostics under the unchanged family scale
The `near-zero/significant` counts and every row decision below use the Section 5
family band `B`, not a component-derived scale. A dash for maximum relative
error means all rows of that component were near-zero and were therefore judged
only by the approved absolute-band rule.
### 6.1 Coarse mesh
| component | rows | near-zero / significant | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | worst row `(node; fesa; reference; abs error)` |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| U1 | 49 | 49 / 0 | 0 | `5.9371608358817413e-12` | — | `1.7563955953584068e-12` | `1.2294769167508847e-11` | `12; -8.7994083858817417e-12; -2.8622475500000000e-12; 5.9371608358817413e-12` |
| U2 | 49 | 49 / 0 | 0 | `5.9379769034414602e-12` | — | `1.7566506185832881e-12` | `1.2296554330083018e-11` | `19; 8.7996068934414599e-12; 2.8616299900000001e-12; 5.9379769034414602e-12` |
| U3 | 49 | 24 / 25 | 0 | `1.9037855439354404e-07` | `8.5711169439298945e-03` | `4.2488614702881049e-08` | `2.9742030292016737e-07` | `2; -2.3550441745606457e-05; -2.3740820300000001e-05; 1.9037855439354404e-07` |
### 6.2 Fine mesh
| component | rows | near-zero / significant | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | worst row `(node; fesa; reference; abs error)` |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| U1 | 729 | 729 / 0 | 0 | `5.6550975712048108e-12` | — | `1.5513648050863109e-12` | `4.1886849737330394e-11` | `27; -1.1143569120481096e-13; 5.5436618799999999e-12; 5.6550975712048108e-12` |
| U2 | 729 | 729 / 0 | 0 | `5.6547834814404039e-12` | — | `1.5512360377367428e-12` | `4.1883373018892053e-11` | `16; -1.1132282144040392e-13; 5.5434606599999999e-12; 5.6547834814404039e-12` |
| U3 | 729 | 168 / 561 | 0 | `1.6193812501096337e-07` | `6.2777164841928829e-03` | `1.0152527787009038e-08` | `2.7411825024924402e-07` | `2; -2.5633767274989038e-05; -2.5795705400000001e-05; 1.6193812501096337e-07` |
## 7. Deterministically ordered largest absolute-error rows
Rows are listed by descending absolute error, then source node label and
component for a deterministic display. `part-1-1` below is the canonical
case-insensitive instance identity.
| mesh | rank | key `(instance, node, component)` | FESA | reference | absolute error | applied rule and metric |
| --- | ---: | --- | ---: | ---: | ---: | --- |
| coarse | 1 | `(part-1-1, 2, U3)` | `-2.3550441745606457e-05` | `-2.3740820300000001e-05` | `1.9037855439354404e-07` | relative; `8.0190386005130586e-03` |
| coarse | 2 | `(part-1-1, 35, U3)` | `-1.2104431681576916e-05` | `-1.2190867900000000e-05` | `8.6436218423083233e-08` | relative; `7.0902432158323394e-03` |
| coarse | 3 | `(part-1-1, 39, U3)` | `-1.2104431681576916e-05` | `-1.2190867900000000e-05` | `8.6436218423083233e-08` | relative; `7.0902432158323394e-03` |
| fine | 1 | `(part-1-1, 2, U3)` | `-2.5633767274989038e-05` | `-2.5795705400000001e-05` | `1.6193812501096337e-07` | relative; `6.2777164841928829e-03` |
| fine | 2 | `(part-1-1, 21, U3)` | `-2.3863834908375246e-05` | `-2.3782464300000001e-05` | `8.1370608375244783e-08` | relative; `3.4214540322150206e-03` |
| fine | 3 | `(part-1-1, 69, U3)` | `-2.3863834908375246e-05` | `-2.3782464300000001e-05` | `8.1370608375244783e-08` | relative; `3.4214540322150206e-03` |
## 8. Mesh trend interpretation
The fine-mesh translation relative RMS divided by the coarse-mesh translation
relative RMS is
\[
\frac{2.2723025777921402\times10^{-4}}
{1.0332757195473908\times10^{-3}}
=0.21991251074664606.
\]
This is a `78.008748925335397%` reduction in the separately measured
reference-normalized translation RMS. It is consistent with the hypothesis
that the coarse-case discrepancy is mesh-sensitive, and the fine case also
passes the same row/RMS policy.
It is not an observed order of convergence, a proof of monotonic convergence,
or a solution-accuracy claim outside these translation rows: the two models have
different meshes and distinct external-reference outputs, and no common-mesh
interpolation or mesh-size-rate study was performed.
## 9. Explicit exclusions and no-change assertion
This report deliberately excludes:
- all reaction quantities;
- `UR1/UR2/UR3` rotations;
- all stress quantities, including the user-noted `reference/shell` element-label
ordering change;
- Newton convergence lifecycle and iteration-log acceptance beyond identifying
the accepted factor-one HDF5 frame;
- `USER-DECISION-004` disposition;
- Step 11 and Step 12 status, Physics Evaluation, and Release readiness.
No source, test, CMake, comparator, tolerance policy, phase file, canonical
reference-comparison report, declared input, or reference artifact was modified
for this report. The report also does not create `implementation-report.md`,
`build-test.md`, or `reference-comparison.md`.
## 10. Handoff
Within this narrow scope there is no artifact, identity, finite-value, or
translation-tolerance blocker. The report is handed to the Coordinator as
translation-only diagnostic evidence; gate ownership and all excluded work remain
unchanged.
@@ -1,323 +0,0 @@
# MITC4 비선형 정적 해석 검증과 한계
본 문서는 당시 revision의 검증·판정 기록이다. 본문에 남긴 원본 보고서 이름과 SHA-256은
통합 전 자료의 식별자이며 정리된 현재 파일의 byte hash를 뜻하지 않는다. 원문은 Git
`858e87b`의 해당 기능 폴더에서 확인할 수 있다. 현재 진입점과 대응 기록은 [README](README.md)를 따른다.
아래 날짜·revision·명령·수치는 당시 실제 실행 기록이다. 문서 정리에서 solver를 다시 실행하지 않았다.
현재 계약은 [요구사항](requirements.md), [정식화](formulation.md), [I/O](io.md), [공통 tolerance](../TOLERANCE.md)를 따른다. [과거 release 판정](release.md)의 재검증 경계도 유지한다.
<a id="build-test"></a>
<a id="build-test--nonlinear-static-newton-raphson-build-and-test-report"></a>
## Nonlinear Static Newton-Raphson Build and Test Report
<a id="build-test--metadata"></a>
### Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| owner_agent | `implementation-agent` |
| working directory | `C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson` |
| configuration | `windows-msvc-ninja-debug`, x64 Debug |
| compiler | MSVC `cl.exe` from VS 18, toolset `14.51.36231` |
| generator | Ninja |
| dependency configuration | `FESA_GTEST_SOURCE_DIR=C:/git/googletest`; MKL `2026.1`; TBB `2023.1`; HDF5 `2.1.1` |
| final classification | none; all commands passed |
<a id="build-test--fresh-command-log"></a>
### Fresh command log
| stage | command | exit | duration | output tail |
| --- | --- | ---: | ---: | --- |
| configure | `cmake --preset windows-msvc-ninja-debug` | 0 | 1.066 s | `Configuring done`; `Generating done`; build files written to `.harness/build-ninja-msvc-debug` |
| build | `cmake --build --preset windows-msvc-ninja-debug` | 0 | 0.113 s | `ninja: no work to do.` |
| discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | 0 | 0.219 s | 302 tests discovered |
| focused control/log | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure` | 0 | 0.471 s | 14/14 passed |
| focused procedure/writer | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure` | 0 | 2.524 s | 7/7 passed |
| nonlinear reference | `ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure` | 0 | 905.404 s | 9/9 passed |
| extended reference | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure` | 0 | 930.617 s | 9/9 matched tests passed |
| full CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | 0 | 956.498 s | 302/302 passed; integration 16, unit 256, reference 30 |
The full CTest output reported no failed-test inventory. The build emitted no compiler/linker
output beyond `ninja: no work to do.`; the build tree audit found no new `warning C####` or
`: warning:` record. The only diagnostic setup issue was that standalone HDF5 inspection tools
need Intel `libmmd.dll` on `PATH`; this did not affect the staged test executables, CMake build, or
CTest and is not a product failure.
<a id="build-test--results-and-handoff"></a>
### Results and handoff
The selected `.harness/config.json` preset was used throughout. All commands were run from the
repository root in an x64 VsDevCmd environment. The final status is
`pass-for-physics-evaluation`; no Harness Python command was required because this Step did not
change Python, hooks, or agent configuration.
This Step changed documentation and its own phase status only. It did not modify C++ production,
tests, CMake, Harness configuration, tolerance, reference artifacts, or output data. The immutable
reference artifact audit before and after comparison was identical; see `reference-comparison.md`.
<a id="reference-comparison"></a>
<a id="reference-comparison--nonlinear-static-newton-raphson-reference-comparison"></a>
## Nonlinear Static Newton-Raphson Reference Comparison
<a id="reference-comparison--verdict"></a>
### Verdict
`blocking-pass-with-review-only-findings`. FESA HDF5 is the authoritative solver output. The
Abaqus CSV files are read-only external comparison evidence; the observed agreement does not imply
Abaqus S4 internal formulation, integration, stabilization, or recovery equivalence.
Overall handoff status: `pass-for-physics-evaluation`. This handoff classification records that
all blocking comparisons passed; the detailed verdict above remains
`blocking-pass-with-review-only-findings` because the six local RF/RM findings are review-only.
The literal execution order was `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`.
The `COMPARE` commands were
`ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure`
(exit 0, 905.404 s, 9/9 passed), followed by
`ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure`
(exit 0, 930.617 s, 9/9 matched tests passed). The fresh full CTest run then passed 302/302;
its command and output tail are recorded in `build-test.md`.
<a id="reference-comparison--artifact-check"></a>
### Artifact check
Every input, displacement CSV, reaction CSV, and stress-inventory CSV was readable, finite where
required, unique by declared source key, and identical before and after all copied-input executions.
| case / role | exact path | bytes | pre/post UTC mtime | SHA-256 |
| --- | --- | ---: | --- | --- |
| fine primary input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | 56,516 | `2026-08-25T13:53:49.1919675Z` | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` |
| fine U | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 111,184 | `2026-08-25T14:06:00.1262830Z` | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` |
| fine local reaction | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 108,951 | `2026-08-25T14:05:06.2950127Z` | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` |
| fine stress inventory | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | 1,036,869 | `2026-08-25T14:04:24.2027682Z` | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` |
| coarse companion input | `reference/shellNL/shellNL.inp` | 4,778 | `2026-08-23T16:36:23.9302881Z` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| coarse U | `reference/shellNL/shellNL displacements.csv` | 7,542 | `2026-08-23T16:36:23.9282815Z` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| coarse local reaction | `reference/shellNL/shellNL reactions.csv` | 7,443 | `2026-08-23T16:36:23.9292877Z` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| coarse stress inventory | `reference/shellNL/shellNL stresses.csv` | 54,720 | `2026-08-23T16:36:23.9302881Z` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| linear control input | `reference/shell/shell.inp` | 4,770 | `2026-08-23T16:36:23.9272805Z` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| linear U | `reference/shell/shell displacements.csv` | 5,592 | `2026-08-23T16:36:23.9262810Z` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| linear reaction inventory | `reference/shell/shell reactions.csv` | 5,524 | `2026-08-23T16:36:23.9262810Z` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` |
| linear stress inventory | `reference/shell/shell stresses.csv` | 43,502 | `2026-08-23T16:36:23.9272805Z` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` |
Fine and coarse required nonlinear CSV rows had exact `Frame=Increment 10: Step Time = 1.000`.
The HDF5 `/steps/Step-1/accepted_frames` table had exactly one factor-one row: frame 9, increment
10, load factor 1.0, two Newton iterations. Reference copies and generated artifacts were confined
to these build-local directories:
| case | copied input | generated results / log |
| --- | --- | --- |
| fine | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_results.h5`, SHA-256 `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_log.txt`, SHA-256 `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27` |
| coarse | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_results.h5`, SHA-256 `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_log.txt`, SHA-256 `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906` |
| linear | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_results.h5`, SHA-256 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_log.txt`, zero bytes, SHA-256 `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` |
<a id="reference-comparison--compare-and-classify"></a>
### Compare and classify
Rows were matched by `(case_id, accepted_state, canonical_instance_name, source_node_label,
component)`, never CSV order. Required HDF5 projections were factor-one
`/steps/Step-1/frames/9/nodal/displacement`, `generalized_internal_force`,
`generalized_external_force`, `generalized_residual`, `reaction`, `/model/nodal_constraint_mask`,
and `/global/equilibrium`; the linear control uses `/steps/Step-1/frames/0/nodal/displacement`.
All required source keys, components, uniqueness and finite checks passed before tolerance.
External families use `docs/TOLERANCE.md`: reference-only scale, near-zero band `0.01*S`, row
relative limit `0.05`, and family RMS limit `0.01`. `rows passed` is the deterministic per-row
decision count; U is blocking and UR is warning-only.
| family | disposition | rows passed | scale | max abs | max relative | relative RMS | result |
| --- | --- | ---: | ---: | ---: | ---: | ---: | --- |
| fine.translation | blocking | 2187/2187 | 2.57957054e-05 | 1.6193812501e-07 | 6.27771648e-03 | 2.27230258e-04 | pass |
| fine.rotation | warning-only | 2187/2187 | 6.58704994e-06 | 3.0109969916e-08 | 3.54510604e-02 | 4.68253850e-04 | pass |
| coarse.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037855439e-07 | 8.57111694e-03 | 1.03327572e-03 | pass |
| coarse.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828551252e-08 | 4.69071871e-02 | 2.97713732e-03 | pass |
| linear.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037853492e-07 | 8.57111604e-03 | 1.03327567e-03 | pass |
| linear.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828549627e-08 | 4.69071860e-02 | 2.97713730e-03 | pass |
Worst absolute rows were fine U `PART-1-1/node 2/U3`, fine UR
`PART-1-1/node 442/UR1`, coarse U `PART-1-1/node 2/U3`, coarse UR
`PART-1-1/node 37/UR1`, linear U `PART-1-1/node 2/U3`, and linear UR
`PART-1-1/node 44/UR1`. No warning-only family failed.
The eight blocking internal families are independent of Abaqus CSV tolerance.
| family | rows | numerator | scale | metric | gate | result |
| --- | ---: | ---: | ---: | ---: | --- | --- |
| fine.global_force_balance | 3 | 2.6775524023e-07 | 1.2773012379e+05 | 2.09625758e-12 | `<=1e-8` | pass |
| fine.global_moment_balance | 3 | 1.3258637157e-04 | 4.8292847478e+05 | 2.74546602e-10 | `<=1e-8` | pass |
| fine.accepted_free_force_residual | 1875 | 3.8659904671e-03 | 1.0000000000e+05 | 3.86599047e-08 | `<=1e-2` | pass |
| fine.accepted_free_moment_residual | 1875 | 1.3760745787e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass |
| coarse.global_force_balance | 3 | 8.2512269735e-07 | 1.0000000439e+05 | 8.25122661e-12 | `<=1e-8` | pass |
| coarse.global_moment_balance | 3 | 4.1788609354e-05 | 2.9558678960e+05 | 1.41375091e-10 | `<=1e-8` | pass |
| coarse.accepted_free_force_residual | 75 | 3.1462885132e-02 | 1.0000000000e+05 | 3.14628851e-07 | `<=1e-2` | pass |
| coarse.accepted_free_moment_residual | 75 | 3.3292052422e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass |
The constrained-reaction resultant remains a distinct review summary: fine force
`[1.2306822228e-12, -3.5943123478e-12, 1.0000000000e+05]`, moment
`[2.7057467378e-11, -5.6934368331e-10, -1.3258637157e-04]`; coarse force
`[7.9591888635e-12, 7.2906680693e-12, 1.0000000000e+05]`, moment
`[-1.7826096155e-10, -2.5829649530e-10, -4.1788609352e-05]`.
Local reaction RF/RM source-key/inventory/finite prechecks passed, but the following direct
row/RMS findings remain review-only and therefore do not change the blocking classification.
| review family | rows passed | relative RMS | worst absolute row | finding |
| --- | ---: | ---: | --- | --- |
| coarse in-plane RF | 4/48 | 1.1437709953e-01 | node 3/RF1, 5.3914239451e-01 | review-only failure |
| coarse RF3 | 4/24 | 4.8448360241e-02 | node 31/RF3, 7.1995422354e+02 | review-only failure |
| coarse physical RM1/RM2 | 32/48 | 2.7464126167e-02 | node 22/RM1, 1.0484921048e+03 | review-only failure |
| fine in-plane RF | 12/208 | 1.1971372918e-01 | node 1/RF2, 1.5298653299e-01 | review-only failure |
| fine RF3 | 92/104 | 5.3476362434e-03 | node 9/RF3, 4.6176964624e+01 | review-only row failure |
| fine physical RM1/RM2 | 112/208 | 3.3719303859e-03 | node 52/RM2, 3.1549617088e+01 | review-only row failure |
`RM3` and stress were not numerically compared. Artifact inventory, byte size, timestamp, and
SHA-256 equality before/after all runs prove that no reference artifact changed.
<a id="physics-evaluation"></a>
<a id="physics-evaluation--nonlinear-static-newton-raphson-physics-evaluation"></a>
## Nonlinear Static Newton-Raphson Physics Evaluation
<a id="physics-evaluation--1-metadata"></a>
### 1. Metadata
| key | value |
| --- | --- |
| feature_id | `nonlinear-static-newton-raphson` |
| source reference comparison report | `docs/nonlinear-static-newton-raphson/verification.md` |
| source reference comparison SHA-256 | `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` |
| source reference model | `docs/nonlinear-static-newton-raphson/reference-model.md` |
| source reference model SHA-256 | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` |
| status | `pass-for-release-agent` |
| owner_agent | `physics-evaluation-agent` |
| date | `2026-08-28` |
이 평가는 승인된 물리 acceptance scope와 이미 생성된 accepted-state evidence만 사용한다.
Abaqus 또는 다른 reference solver를 실행하지 않았고, 외부 solver의 내부 정식화·적분·안정화·
결과 복구 동등성을 주장하지 않는다.
<a id="physics-evaluation--2-input-evidence"></a>
### 2. Input Evidence
<a id="physics-evaluation--21-gate-entry-audit"></a>
#### 2.1 Gate-entry audit
- `implementation-report.md`와 `build-test.md`의 Stage 6 owner classification은
`pass-for-physics-evaluation`이며 full CTest `302/302`, nonlinear reference `9/9` 통과를
기록한다.
- Corrected required source `reference-comparison.md`는 overall handoff status를
`pass-for-physics-evaluation`로 명시한다. Detailed verdict
`blocking-pass-with-review-only-findings`는 모든 blocking numerical family가 통과하고 six
local RF/RM findings만 review-only라는 세부 분류로 함께 유지된다. 두 status는 서로
모순되지 않으며 `PHYS-STATUS-001`은 해소되었다.
- `requirements.md` metadata의 `status: draft`, `approved_by: pending user re-approval` 및
`FESA-REQ-NSNR-069`의 historical `draft` 표시는 내용상 physics blocker가 아니다.
당시 Authoritative `coordination.md` Stage 1 record는 당시 requirements SHA-256
`89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`가
`2026-08-27` 사용자에게 명시적으로 재승인되었고 Stage 1이 `passed`임을 기록한다.
따라서 이 stale metadata를 승인 부재로 재해석하지 않는다.
<a id="physics-evaluation--22-solver-outputs-and-logs"></a>
#### 2.2 Solver outputs and logs
| case | checked authoritative/generated evidence | SHA-256 / observed identity |
| --- | --- | --- |
| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_results.h5` | `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment |
| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_log.txt` | `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 |
| `shellnl-s4-final` | build-local `shellNL_results.h5` | `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment |
| `shellnl-s4-final` | build-local `shellNL_log.txt` | `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 |
| `shell-s4-linear-limit` | build-local `shell_results.h5`, `shell_log.txt` | HDF5 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; zero-byte log `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` |
HDF5는 `reference-comparison.md`에 적힌 build-local exact path에서 직접 읽었다. Optional FESA
debug CSV view는 선언되거나 필요하지 않아 사용하지 않았다. Factor-one
`nodal/displacement`, `global/equilibrium`, `global/energy`, direct shell stress와
`accepted_frames`를 확인했다.
<a id="physics-evaluation--23-read-only-reference-evidence"></a>
#### 2.3 Read-only reference evidence
Canonical reference bundle은 `reference-comparison.md`가 inventoried한 12개 exact file을 사용했다.
- `reference/shellNL-meshfine/`: input, displacement, reaction, stress inventory
- `reference/shellNL/`: input, displacement, reaction, stress inventory
- `reference/shell/`: linear input, displacement, reaction inventory, stress inventory
각 SHA-256은 `reference-model.md`와 `reference-comparison.md` inventory에 일치한다. 비교량은
fine/coarse/linear `U1/U2/U3` blocking, `UR1/UR2/UR3` warning-only, fine/coarse local
`RF1/RF2/RF3`와 physical spatial `RM1/RM2` review-only다. `RM3`와 stored element-corner
stress는 numerical comparison에서 제외되었다.
Reference model의 목적은 중앙 `DOF 3=-100000` fixed-global dead load를 받고 둘레의 all-six
DOF가 고정된 `10 x 10`, thickness `0.5` square plate의 coarse/fine nonlinear response와
linear-limit source identity를 검증하는 것이다. Nonlinear cases는 `0.1` 간격으로 factor one까지
진행한다.
<a id="physics-evaluation--3-physics-checks"></a>
### 3. Physics Checks
| physics check | result | evidence and interpretation |
| --- | --- | --- |
| global equilibrium | `pass` | Fine normalized force `2.09625758e-12`, moment `2.74546602e-10`; coarse force `8.25122661e-12`, moment `1.41375091e-10`. 네 값 모두 approved inclusive `<=1e-8`다. HDF5 `/global/equilibrium`은 `location=global-balance-error`, current arm, global origin `[0,0,0]`, spatial moment 의미를 가진다. |
| reaction consistency | `pass` | Applied `F3=-100000`에 대해 constrained-reaction resultant `F3`는 fine/coarse 모두 약 `+100000`이고 다른 force components는 roundoff 수준이다. Applied-plus-reaction force/moment와 accepted free force/moment residual이 각각 blocking gate를 통과했다. Local RF/RM six-family discrepancy는 승인 계약상 review-only nodal redistribution evidence이며 global reaction/resultant identity를 대체하지 않는다. |
| displacement direction | `pass` | Downward load에 대해 node 2 final `U3`는 fine `-2.56338e-5`, coarse `-2.35504e-5`; reference도 각각 `-2.57957054e-5`, `-2.37408203e-5`다. HDF5 path는 factor `0.1..1.0`에서 fine `-2.56338e-6 .. -2.56338e-5`, coarse `-2.35504e-6 .. -2.35504e-5`로 부호 반전·jump·rollback 없이 진행한다. |
| symmetry / expected zero | `pass` | Center node 2의 factor-one `U1/U2`와 rotations는 fine/coarse에서 약 `1e-17` 이하로, centered load와 symmetric all-edge constraint의 expected-zero response와 일치한다. Fresh physics-focused CTest에서 finite rigid objectivity, zero internal force, rigid translation nullspace와 no-moment tangent symmetry checks가 통과했다. |
| element force balance | `covered-by-approved-invariants` | 승인 HDF5에는 standalone element nodal-action balance dataset이 없고 external element-force comparison도 요구되지 않는다. 대신 complete element residual/tangent same-trial identity, patch recovery, stable assembly covariance tests와 accepted global/free equilibrium gate가 문서화된 expectation을 충족한다. 별도 element-force output을 invent하지 않았다. |
| stress/strain | `pass-sanity-evidence` | HDF5 direct fixed-reference Gauss stress는 finite다. Element 1/GP1의 `[S11,S22,S12]`는 fine bottom `[-264846,-77843.6,914.879]`, middle `[1.94695,0.530775,-0.0224511]`, top `[264850,77844.8,-914.925]`; coarse도 bottom/top sign이 반대이고 middle이 작아 centered plate bending sign/thickness pattern과 일치한다. Stored CSV는 corner/SPOS-SNEG identity로 위치가 달라 numerical stress comparison이 승인되지 않았으므로 이를 tolerance pass로 재분류하지 않는다. |
| rigid body mode | `pass` | 둘레 all-six-DOF support가 global rigid-body motion을 제거하고, accepted path에 비정상 large translation 또는 singular/nonfinite 증상이 없다. Fresh focused tests에서 proper triad/director, finite rigid objectivity, zero internal force, rigid nullspace와 invalid branch rejection을 확인했다. |
| energy/residual | `pass-sanity-evidence` | Factor-one physical strain energy는 fine `1.28169`, coarse `1.17752`로 finite positive이며 near-linear relation `0.5*100000*abs(U3_center)`와 일치한다. 이는 secondary sanity evidence이고 승인 energy convergence gate는 아니다. Fine/coarse accepted free force/moment residual은 NSNR-069 blocking gate를 통과했고 log에는 nonfinite/failed accepted state가 없다. |
| model coverage | `pass` | Fine 729-node/676-element primary, coarse 49-node/36-element companion, linear control과 internal linear-limit/tangent/objectivity/patch/rollback portfolio가 승인 NSNR-030 scope를 덮는다. Stored response는 weak geometric-nonlinear regime이고 original-style MITC4의 curved/distorted membrane-locking risk는 알려진 한계지만 Numerical Review가 이번 release의 additional benchmark/convergence gate로 승인하지 않았으므로 model-coverage gap을 새로 만들지 않는다. |
Fresh physics-focused verification command:
```powershell
ctest --preset windows-msvc-ninja-debug -R '^(NonlinearMitc4Shell|NonlinearMitc4Recovery|NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch|FiniteRotation|NonlinearStaticProcedure)\.' --output-on-failure
```
Result: `23/23` passed, exit `0`, total real time `5.12 s`.
<a id="physics-evaluation--4-failure-classification"></a>
### 4. Failure Classification
- blocking classification: 없음
- resolved finding: `PHYS-STATUS-001`; corrected `reference-comparison.md`가 required overall
`pass-for-physics-evaluation` handoff와 detailed
`blocking-pass-with-review-only-findings` verdict의 관계를 명시했다.
- observed failures: `equilibrium-failure`, `reaction-inconsistency`,
`displacement-direction-failure`, `symmetry-failure`, `stress-location-failure`,
`element-force-inconsistency`, `rigid-body-mode-suspected`, `nonfinite-result`,
`model-coverage-gap`, `upstream-contract`, `environment` 모두 없음.
<a id="physics-evaluation--5-evaluation-verdict"></a>
### 5. Evaluation Verdict
- verdict: `pass-for-release-agent`
- physics evidence disposition: documented equilibrium, reaction, displacement, symmetry/objectivity,
stress/strain sanity, rigid-body, residual/path and model-coverage checks show no physical failure.
- pass disposition: documented physical expectations passed and no physics/model-coverage/I/O/upstream
blocker remains.
- release meaning: this verdict authorizes Release Agent evaluation through Coordinator only. It is
not Release approval, publish/deploy/package/tag authorization, or external-solver equivalence.
<a id="physics-evaluation--6-handoff-recommendation"></a>
### 6. Handoff Recommendation
- handoff: `Release Agent`, always through `Coordinator Agent`
- recommendation: Release Agent는 current approved hashes, Stage 6
`pass-for-physics-evaluation`, 이 문서의 `pass-for-release-agent`, known limitations와
review-only findings를 사용해 release readiness만 audit한다.
- boundary: Physics Evaluation Agent는 release readiness, final release checklist, release notes,
publish/deploy/package/tag를 승인하지 않는다.
<a id="physics-evaluation--8-open-issues"></a>
### 8. Open Issues
| id | severity | issue | gate effect |
| --- | --- | --- | --- |
| `PHYS-META-001` | nonblocking | `requirements.md`의 draft/pending metadata가 authoritative Coordinator/user reapproval record와 stale함 | 현재 hash의 explicit approval로 physics authority는 해소됨; Release traceability audit에서 투명하게 유지 |
| `PHYS-LOCAL-001` | nonblocking | six local RF/RM families have review-only discrepancies | approved disposition 유지; global force/moment balance와 free residual을 blocking evidence로 사용 |
| `PHYS-STRESS-001` | nonblocking | stored corner/SPOS-SNEG stress와 FESA direct Gauss recovery 위치가 다르고 fine optional stress row 하나의 node label이 malformed | stress numerical comparison 제외 유지; artifact를 repair하지 않음 |
| `PHYS-LIMIT-001` | known limitation | stored cases are weak geometric-nonlinear plate responses; original MITC4 has known curved/distorted membrane-locking risk | approved current portfolio에서는 blocker 아님; broader claim 금지 |