feat(nonlinear-static-newton-raphson): step 11 - equilibrium-projection-and-reference-gate

This commit is contained in:
KOKO\Mimi
2026-08-28 09:22:33 +09:00
parent 65b56b1755
commit 6dbf1b2bcf
30 changed files with 13122 additions and 728 deletions
@@ -4,234 +4,294 @@
- 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-23`
- date: `2026-08-28`
- artifact_policy: `read-only-existing-files`
- tolerance_policy: `docs/TOLERANCE.md`
- external_tolerance_policy: `docs/TOLERANCE.md`
이 문서는 logical reference quantity, source identity, component matching, row precheck와
blocking/warning 분류만 정의한다. 최종 HDF5 dataset projection은 I/O Definition Agent 소유다.
이 문서는 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
Required scope는 두 stored case다.
세 stored case를 사용한다.
- `shellnl-s4-final`: `nlgeom=YES` nonlinear static S4 final accepted state를 비교하는
primary external reference case.
- `shell-s4-linear-limit`: 같은 S4 mesh의 `nlgeom=NO` read-only linear-limit/reference-identity
regression case. 이 case는 nonlinear response evidence가 아니며, 현재 stress CSV의 element-label
ordering을 row-order matching으로 사용하지 않는다.
- `shellnl-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`은 final-state reference comparison에는 충분하지만 weak nonlinear response다. Dominant
`U3`/stress 값이 linear case와 거의 같으므로 finite-rotation objectivity, consistent tangent,
commit/rollback과 convergence lifecycle은 `numerical-review.md`의 blocking internal tests로 검증한다.
모든 selected case에서 displacement `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는
warning-only다. Coarse/fine 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에서 제외한다.
## 3. Reference Case Inventory with exact input and required CSV paths
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를 의미하지 않는다.
| case id | artifact role | required comparison artifact | exact path | observed status |
## 3. Reference Case Inventory
### 3.1 Exact input and CSV paths
| case id | purpose | exact path | required disposition | observed status |
| --- | --- | --- | --- | --- |
| `shellnl-s4-final` | nonlinear input | yes | `reference/shellNL/shellNL.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=YES` |
| `shellnl-s4-final` | displacement reference | yes | `reference/shellNL/shellNL displacements.csv` | 49 finite unique node rows; one factor-one Frame |
| `shellnl-s4-final` | reaction reference | yes | `reference/shellNL/shellNL reactions.csv` | 49 finite unique node rows; one factor-one Frame |
| `shellnl-s4-final` | stress review evidence | no | `reference/shellNL/shellNL stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks |
| `shell-s4-linear-limit` | linear control input | yes | `reference/shell/shell.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=NO` |
| `shell-s4-linear-limit` | displacement reference | yes | `reference/shell/shell displacements.csv` | 49 finite unique node rows; no `Frame` column |
| `shell-s4-linear-limit` | reaction review evidence | no | `reference/shell/shell reactions.csv` | 49 finite unique node rows |
| `shell-s4-linear-limit` | stress review evidence | no | `reference/shell/shell stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks |
| `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` |
`required comparison artifact=no`인 파일도 이번 review에서 읽기 가능성, row identity,
finite values와 current ordering을 확인했다. 그러나 해당 파일은 missing-required-artifact
판정이나 tolerance family를 만들지 않는다.
`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하지 않는다.
두 `.inp`는 같은 node/element/connectivity, material/section, instance, boundary와 center-node
`CLOAD`를 사용한다. Text 차이는 heading identity, `NLGEOM=NO -> YES`, 그리고 `*STATIC`
data `1.,1.,1e-05,1. -> 0.1,1.,0.001,0.1`이다. 따라서 `shellNL`은 실제 nonlinear
selector와 승인된 fixed increment `0.1`을 갖지만, 두 deck 차이를 오직 `NLGEOM` 하나의
isolated effect라고 표현하지 않는다.
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다.
Read-only SHA-256 observations:
### 3.2 Read-only artifact hashes
| path | SHA-256 |
| exact path | SHA-256 |
| --- | --- |
| `reference/shellNL/shellNL.inp` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` |
| `reference/shellNL/shellNL displacements.csv` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` |
| `reference/shellNL/shellNL reactions.csv` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` |
| `reference/shellNL/shellNL stresses.csv` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` |
| `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` |
| `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` |
| `reference/shell/shell reactions.csv` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` |
| `reference/shell/shell stresses.csv` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` |
| `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` |
## 4. Source Identity and Component Contract
### 4.1 Accepted-state identity
### 4.1 Case and accepted-state identity
- Abaqus identifiers are case-insensitive semantic identities. Input spelling
`Part-1-1` and CSV spelling `PART-1-1` match as one instance while original text is
retained in artifacts and reports; no file or row is rewritten.
- `shellnl-s4-final` rows require exact CSV `Frame` value
`Increment 10: Step Time = 1.000`, mapped logically to the accepted factor-one state.
- `shell-s4-linear-limit` rows have no `Frame` column and map to the single final static state.
- Row order is never a matching identity. It may only be used for deterministic reporting after
source keys are matched.
- 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 contract
### 4.2 Nodal displacement and rotation
Required mapping is `U-U1/U-U2/U-U3 -> U1/U2/U3` and
`UR-UR1/UR-UR2/UR-UR3 -> UR1/UR2/UR3`. U is global length; UR is the
dimensionless fixed-initial global rotation-vector output. Logical key is
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)
```
Both cases require source node labels `1..49` exactly once. U components form one
blocking translation family and UR components form one warning-only rotation family,
preserving the project MITC4 classification.
이다. Coarse/linear은 labels `1..49`, fine은 `1..729`를 각각 정확히 한 번 요구한다.
U는 global length/blocking, UR은 fixed-initial global rotation-vector/warning-only다.
### 4.3 Nonlinear reaction contract
### 4.3 Local reaction review contract
Reaction comparison applies only to `shellnl-s4-final` and only to the input boundary
`Set-2` nodes:
Reaction source rows는 input `Set-2` constraint mask로 선택한다.
```text
1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33
```
- 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.
All six global components are constrained at these 24 nodes. Other CSV node rows remain
part of file/schema/finite inventory but are not numerical reaction rows: FESA free entries
are equilibrium residual evidence, not Abaqus free-node zero reactions.
다른 CSV node rows는 file/schema/finite inventory지만 local reaction numerical rows가 아니다.
Free FESA entries는 reaction이 아니라 accepted free residual evidence다.
| CSV components | logical quantity | FESA meaning | disposition |
| CSV components | logical quantity | matching FESA meaning | disposition |
| --- | --- | --- | --- |
| `RF-RF1`, `RF-RF2` | fixed-initial shell-plane reaction force | constrained translational full residual, global force | blocking family |
| `RF-RF3` | fixed-initial transverse reaction force | constrained translational full residual, global force | blocking family |
| `RM-RM1`, `RM-RM2` | tangent-plane spatial reaction moment | `J_l(phi)^(-T)` conversion of the constrained generalized reaction, global force-length | blocking family |
| `RM-RM3` | director/drilling-axis reaction review value | stabilization-dependent; no physical external equivalence target | excluded |
| `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` |
In-plane and transverse force are distinct model-fixed logical projections and therefore
use distinct families. Raw generalized rotation-coordinate residual is not matched directly
to the CSV `RM` value.
Raw generalized rotational residual을 CSV RM에 직접 match하지 않는다. Review-only는 row omission을
허용한다는 뜻이 아니다. Exact row precheck와 common-policy error/RMS를 모두 보고하되 그 결과가
blocking verdict를 변경하지 않는다는 뜻이다.
### 4.4 Stress review identity and comparison exclusion
### 4.4 Distinct factor-one equilibrium quantities
Stress rows have read-only identity
각 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)
```
Every current element has its four connectivity nodes and one `SPOS` plus one `SNEG`
row per node. The files are ordered in contiguous ascending element-label blocks `1..36`;
this exact artifact order is retained and no node/surface secondary reorder is applied.
이다. 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에 포함하지 않는다.
The identity is nevertheless not the approved FESA recovery location: FESA emits direct
`[S11,S22,S12]` at four midsurface Gauss locations and bottom/middle/top positions, without
nodal extrapolation or averaging, and does not emit `S33`. Consequently no stress column
forms a blocking or warning-only comparison family. Stress files remain optional read-only
review evidence only.
### 4.6 External comparison families
### 4.5 Comparison families
| family id | components and source set | row count | units / coordinates | disposition |
| family id | components / source rows | rows | units / coordinates | disposition |
| --- | --- | ---: | --- | --- |
| `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking regression |
| `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking |
| `nonlinear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only |
| `nonlinear.reaction_inplane_force` | `RF1,RF2`, 24 constrained nodes | 48 | force / fixed-initial global plane | blocking |
| `nonlinear.reaction_transverse_force` | `RF3`, 24 constrained nodes | 24 | force / fixed-initial global transverse | blocking |
| `nonlinear.reaction_physical_moment` | `RM1,RM2`, 24 constrained nodes | 48 | force-length / global spatial | blocking |
| `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` |
### 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` |
이 internal families에는 Abaqus CSV value 또는 `docs/TOLERANCE.md`를 적용하지 않는다.
Approved analytical/invariant gates이며 exact definitions는 `numerical-review.md` §6.2다.
## 5. Row Prechecks
Before tolerance, the comparator shall fail the affected comparison if any required condition
below is false.
Tolerance 또는 internal metric 전에 다음을 검사한다.
1. Exact declared input path and every `required comparison artifact=yes` CSV path for the
case exist and are readable.
2. Required headers are present after trimming surrounding whitespace from header names.
3. `shellnl-s4-final` contains only the exact required `Frame` value for required rows.
4. Wide CSV rows expand to component rows using the component contract in Section 4.
5. Required source row keys are unique. Duplicate wide keys or duplicate expanded component keys fail.
6. Displacement projection requires all 49 source nodes and declared components. Nonlinear
reaction projection derives the exact 24-node/component set from the input constraint mask;
it does not infer reaction identity from CSV zero values.
7. FESA and reference required projected row-key sets are exactly equal: missing and extra rows
both fail.
8. Every required numeric value is finite. Nonfinite required FESA or CSV value fails before tolerance.
9. Optional stress inventory uses `(instance, element label, node label, section point)` and verifies
the current ascending element-label blocks, connectivity nodes and SPOS/SNEG pair. This inspection
does not create a stress equality gate.
10. Required rows are not omitted, synthesized, normalized, averaged, sorted into a different identity,
zero-clamped, or repaired.
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 inventory used for this contract:
Observed read-only nodal CSV audit:
| CSV | observed wide key columns | duplicate wide keys | nonfinite observed values | observed element labels |
| --- | --- | ---: | ---: | --- |
| `reference/shellNL/shellNL displacements.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shellNL/shellNL reactions.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shellNL/shellNL stresses.csv` | `Frame`, `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` |
| `reference/shell/shell displacements.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shell/shell reactions.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A |
| `reference/shell/shell stresses.csv` | `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` |
| 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 |
## 6. Tolerance and Blocking/Warning Policy
Use exactly `docs/TOLERANCE.md` for every external reference family. This report does not invent
or calibrate tolerance values.
### 6.1 External families
For each comparison family:
Section 4.6의 모든 external blocking, warning-only와 review-only error report는
`docs/TOLERANCE.md`를 그대로 사용한다.
- `S = max(abs(reference_value_i))`, using reference values only.
- near-zero band is `0.01*S`.
- if `abs(reference_value_i) <= 0.01*S`, row passes iff `abs(fesa-reference) <= 0.01*S`.
- otherwise row passes iff relative error `<= 0.05`.
- family relative RMS is `RMS(error)/S <= 0.01`.
- no independent absolute-error floor, `max(1, S)` clamp, row omission, averaging, or zero clamp is allowed.
- if `S = 0`, the family passes only when all FESA values are exactly zero; otherwise report
`zero-reference-scale-nonzero-error`.
- 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한다.
Families are separated by the exact case/logical quantities in Section 4.5. Current
reference-only scales provide a reproducible reader/comparator audit:
Observed reference-only scales는 reader/family audit evidence이며 calibration 값이 아니다.
| family | `S` | `B=0.01*S` |
| --- | ---: | ---: |
| `linear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `linear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.translation` | `2.37408203e-5` | `2.37408203e-7` |
| `nonlinear.rotation` | `7.60725743e-6` | `7.60725743e-8` |
| `nonlinear.reaction_inplane_force` | `1.91663182` | `1.91663182e-2` |
| `nonlinear.reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` |
| `nonlinear.reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` |
| 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` |
Any `blocking` family row or RMS failure fails the reference comparison for the feature.
`warning-only` failures produce deterministic warning evidence but do not change the blocking
verdict. `RM3` and stress artifacts create neither a blocking nor warning-only tolerance family.
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: 없음.
I/O Definition Agent handoff:
I/O Definition Agent handoff through Coordinator:
- Project only the comparison quantities in Sections 4.2, 4.3 and 4.5 to authoritative FESA
result datasets without changing source identity or final comparison disposition.
- Preserve `Frame` handling for `shellnl-s4-final` as accepted factor-one state identity; do not expose
trial Newton history as reference rows.
- Derive constrained reaction identity from the input mask. Compare `RM1/RM2` with the global
spatial physical reaction moment, not the raw generalized rotation-coordinate covector.
- Preserve approved Gauss direct stress recovery. Do not create element-corner stress,
extrapolation, averaging or a stress CSV projection for the current optional SPOS/SNEG artifacts.
- Keep `RM3`, `S-S33`, `S-S11`, `S-S22` and `S-S12` out of current comparison families.
- Use the common tolerance policy exactly as written above and in `docs/TOLERANCE.md`.
- Fine primary와 coarse companion nonlinear case의 accepted factor-one identity를 보존한다.
- 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: complete for I/O Definition. No declared required input or required
comparison CSV is missing or unreadable. Optional stress CSVs are present and readable as inventory
evidence only. No reference artifact was generated, renamed, repaired, normalized, or modified.
Reference 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 또는 수정하지 않았다.