Files
FESADev/docs/shell-surface-pressure-load/io.md
T
2026-09-01 02:34:04 +09:00

640 lines
47 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Shell Surface Pressure Load I/O Definition
## 1. Metadata
- feature_id: `shell-surface-pressure-load`
- source_requirement: `docs/shell-surface-pressure-load/requirements.md`
- source_research: `docs/shell-surface-pressure-load/research.md`
- source_formulation: `docs/shell-surface-pressure-load/formulation.md`
- source_numerical_review: `docs/shell-surface-pressure-load/numerical-review.md`
- source_reference_model: `docs/shell-surface-pressure-load/reference-model.md`
- status: `ready-for-implementation-planning`
- owner_agent: `io-definition-agent`
- date: `2026-08-31`
- authoritative_output: input lexical sibling `<stem>_results.h5`
- linear_schema_version: `0`
- nonlinear_schema_version: `1`
- external_tolerance_authority: `docs/TOLERANCE.md`
이 문서는 `S4`/`S4R` shell의 named element surface에 작용하는 uniform
surface-based pressure의 입력, semantic identity, validation, authoritative HDF5와
reference projection만 정의한다. Abaqus 2025 keyword/modeling documentation은
`*SURFACE`와 `*DSLOAD`의 외부 입력 의미 근거로만 사용한다. FESA가 Abaqus의 full input
compatibility, element 내부 알고리즘, 적분, stabilization, load linearization 또는 output
생성 절차와 동등하다는 주장은 하지 않는다.
## 2. Abaqus Input Scope
### 2.1 Compatibility boundary
승인된 추가 입력은 assembly-level
`*SURFACE, TYPE=ELEMENT, NAME=<surface-name>`와 step-level `*DSLOAD`의
`<surface-name>, P, <uniform-magnitude>`뿐이다. Surface member는 identity instance의
`S4` 또는 `S4R` element를 `SPOS` 또는 `SNEG`로 선택한다. Linear static은 reference
configuration, `*STEP, NLGEOM=YES` nonlinear static은 current-configuration follower
pressure와 external tangent를 사용한다.
이 문서가 명시하지 않은 `*SURFACE`, `*DSLOAD`, element, load, procedure 또는 scope
variant는 지원하지 않는다. Unknown model-affecting keyword도 fail-closed다. 기존 output
request allowlist만 결과를 바꿀 수 없다는 전제에서 warning 후 no-op이다.
### 2.2 Keyword support table
`supported`는 이 feature의 valid input에서 parse하고 semantic model에 반영한다.
`unsupported`는 명확한 non-success diagnostic으로 거부한다.
`ignored-with-warning`은 requested result를 바꿀 수 없는 기존 output-control syntax만
건너뛴다.
| keyword | policy | purpose / required subset | unsupported behavior |
| --- | --- | --- | --- |
| `*HEADING` | `supported` | 기존 heading block; 해석 의미 없음 | parameter 또는 잘못된 keyword line은 `input-syntax` |
| `*INCLUDE` | `unsupported` | 이 feature는 single physical input source만 허용 | 모든 parameter/data form을 `unsupported-keyword`로 거부; include를 열지 않음 |
| `*PART`, `*END PART` | `supported` | 기존 part topology/material/section wrapper | nested/mismatched wrapper 거부 |
| `*NODE` | `supported` | positive source label와 finite global `X,Y,Z` | duplicate/nonfinite/cardinality error 거부 |
| `*NSET` | `supported` | 기존 node-set subset 및 `GENERATE` | unresolved/duplicate-incompatible/cross-scope target 거부 |
| `*ELEMENT` | `supported` | 이 feature의 pressure target은 `TYPE=S4|S4R`, four-node connectivity | 다른 target type 또는 잘못된 connectivity 거부 |
| `*ELSET` | `supported` | 기존 element-set subset 및 `GENERATE`; assembly form은 explicit `INSTANCE=<name>`; CAE의 result-neutral `INTERNAL` flag 허용 | 그 밖의 parameter와 unresolved/cyclic/ambiguous/cross-scope membership 거부 |
| `*MATERIAL` | `supported` | 기존 named material | duplicate/empty name 거부 |
| `*ELASTIC` | `supported` | 기존 finite linear isotropic `E, nu` | unsupported material form/nonfinite data 거부 |
| `*SHELL SECTION` | `supported` | 기존 finite positive thickness, material와 `ELSET` mapping | missing/incompatible reference 거부 |
| `*ASSEMBLY`, `*END ASSEMBLY` | `supported` | identity-instance topology와 assembly surface scope | nested assembly 또는 malformed scope 거부 |
| `*INSTANCE`, `*END INSTANCE` | `supported` | existing identity instance only | transform data, nested instance 또는 unknown part 거부 |
| `*SURFACE` | `supported` | 아래 §2.3의 assembly-level element surface만 지원 | 다른 scope/type/parameter/member form은 fail-closed |
| `*BOUNDARY` | `supported` | 기존 essential DOF 1–6 constraint subset | unsupported target/DOF/data form 거부 |
| `*CLOAD` | `supported` | 기존 nodal generalized concentrated-load subset | 기존 allowlist 밖 form 거부; pressure alias로 사용하지 않음 |
| `*DLOAD` | `unsupported` | 이 feature의 `*DSLOAD P`와 다른 element-face load | 언제나 `unsupported-keyword`; `P n`을 `P`로 변환하지 않음 |
| `*DSLOAD` | `supported` | 아래 §2.4의 named-surface uniform `P` | parameter, 다른 load label/distribution/cardinality는 fail-closed |
| `*STEP`, `*END STEP` | `supported` | exactly one static step; `NLGEOM`은 §2.5만 | 두 번째 step, propagation/restart 의미 거부 |
| `*STATIC` | `supported` | 기존 linear 또는 approved full-Newton static control data | dynamics/contact/thermal/perturbation procedure 거부 |
| `*OUTPUT` | `ignored-with-warning` | 기존 `FIELD|HISTORY` allowlist; mandatory HDF5를 변경하지 않음 | allowlist 밖 model-affecting parameter는 거부 |
| `*NODE OUTPUT` | `ignored-with-warning` | variable data를 warning 후 no-op | mandatory nodal output을 제거/추가하지 않음 |
| `*ELEMENT OUTPUT` | `ignored-with-warning` | variable data를 warning 후 no-op | mandatory MITC4 recovery를 제거/추가하지 않음 |
| `*PREPRINT`, `*RESTART`, `*TRANSVERSE SHEAR STIFFNESS`, `*CONTACT OUTPUT` | `ignored-with-warning` | 기존, result-neutral allowlist만 | 해석 의미를 바꾸는 variant는 거부 |
### 2.3 Exact `*SURFACE` grammar
지원 keyword line의 EBNF는 다음과 같다. Token 비교는 ASCII case-insensitive다.
```text
surface_keyword := "*SURFACE" "," type_parameter "," name_parameter
| "*SURFACE" "," name_parameter "," type_parameter
type_parameter := "TYPE" "=" "ELEMENT"
name_parameter := "NAME" "=" surface_name
surface_name := name_token_without_dot
surface_member := direct_member "," side
| elset_member "," side
direct_member := instance_name "." positive_element_label
elset_member := assembly_elset_name
side := "SPOS" | "SNEG"
```
Normative restrictions:
1. `*SURFACE`는 `*ASSEMBLY`와 `*END ASSEMBLY` 사이이며 어떤 `*INSTANCE` block 밖에
있어야 한다. Part-level 또는 instance-block-level `*SURFACE`는 이번 subset에서
`unsupported-surface-scope`다.
2. Keyword parameter는 `TYPE=ELEMENT`와 `NAME=<name>` 각각 하나뿐이다. Parameter order는
위 두 순서 모두 허용하지만 duplicate, flag parameter와 `TRIM`, `COMBINE`,
`PROPERTY`, `REGION TYPE` 등 추가 parameter는 거부한다.
3. 각 data line은 정확히 두 개의 nonempty field다. Side는 `SPOS` 또는 `SNEG`뿐이다.
4. Direct member는 정확히 `<instance-name>.<positive-decimal-element-label>`이다. Assembly
scope의 bare element label, `<part>.<label>`, `<instance>.<elset>`, 두 개 이상의 dot과
quoted token은 지원하지 않는다.
5. ELSET member는 assembly scope에서 이미 선언되고 `INSTANCE=<instance-name>`으로 하나의
identity instance에 결속된 flat `ELSET` 이름이다. Surface가 여러 data line에서 서로
다른 instance-bound ELSET 또는 direct member를 사용해 여러 instance를 포함할 수 있다.
Reference input에 있는 `INTERNAL` flag는 source provenance에 보존하되 membership 의미를
바꾸지 않는다. Mixed-instance set, nested/cyclic set, part-local set의 암묵적 승격은
지원하지 않는다.
6. Direct member와 ELSET expansion은 모두 최종 stable facet
`(part, instance, element label, source type, side)`로 변환된다. Element label은 instance
안에서 해석하며 다른 instance의 같은 numeric label과 합치지 않는다.
7. Surface name은 assembly namespace에서 case-insensitive unique다. Surface declaration은
하나 이상의 valid unique facet으로 resolve되어야 한다.
지원 예:
```text
*ELSET, ELSET=_Surf-1_SPOS, INTERNAL, INSTANCE=Part-1-1, GENERATE
1, 676, 1
*SURFACE, TYPE=ELEMENT, NAME=Surf-1
_Surf-1_SPOS, SPOS
*SURFACE, NAME=Direct-Surface, TYPE=ELEMENT
Part-1-1.1, SNEG
```
### 2.4 Exact `*DSLOAD P` grammar
```text
dsload_keyword := "*DSLOAD"
dsload_row := surface_name "," "P" "," finite_pressure
finite_pressure := sign? decimal (exponent)?
sign := "+" | "-"
decimal := digits ("." digits?)? | "." digits
exponent := ("E" | "e") sign? digits
```
- `*DSLOAD` keyword line에는 parameter를 허용하지 않는다. `AMPLITUDE`, `FOLLOWER`, `OP`,
`REF NODE`와 unknown parameter는 모두 `unsupported-dsload-parameter`다.
- Data line은 정확히 세 개의 nonempty field다. 첫 field는 assembly-level named surface,
두 번째는 `P`, 세 번째는 C-locale decimal/scientific notation의 finite `double`이다.
- `NaN`, `Inf`, `Infinity`, hexadecimal, locale comma와 Fortran `D` exponent는 지원하지
않는다. Overflow/underflow parse failure도 거부한다. Positive, `+0`, `0`, `-0`, negative
finite 값은 허용한다. Signed zero의 raw token은 identity/diagnostic에 보존하지만 physical
magnitude는 exact zero이며 validation을 우회하지 않는다.
- Magnitude 단위는 model-consistent `force/length^2`다. FESA가 SI 또는 다른 단위계를
추론·변환하지 않는다.
- 한 `*DSLOAD` 아래 여러 data line을 허용하고, step 안에 여러 `*DSLOAD` keyword를
허용한다. 각 valid data line은 서로 distinct하며 동일한 surface/type/magnitude의 완전
duplicate도 deduplicate하지 않고 source order에서 additive하게 한 번씩 적용한다.
### 2.5 Procedure and configuration syntax
- 정확히 하나의 `*STEP`/`*END STEP`만 허용한다.
- `*STEP`에서 `NLGEOM` 생략 또는 `NLGEOM=NO`는 linear static reference-configuration
pressure다. `NLGEOM=YES`는 approved nonlinear full-Newton current-configuration follower
pressure다. 다른 `NLGEOM` 값과 다른 step parameter는 기존 승인 subset 밖이면 거부한다.
- `*STATIC`은 해당 step의 유일한 procedure keyword다. `*DSLOAD`는 이 static procedure의
history data이며 step 밖에서는 거부한다.
- Linear pressure의 external tangent는 zero다. Nonlinear pressure는 current `X+u`에서
force와 exact external tangent를 함께 만든다. Syntax가 이 physics를 override하지 못한다.
## 3. Syntax Policy
### 3.1 Lines, commas, comments and whitespace
- Keyword line은 첫 non-whitespace character가 `*`이고 comment line은 첫
non-whitespace characters가 `**`다. Blank line과 whole-line comment는 semantic order에
포함하지 않고 건너뛰되 source physical line number는 유지한다.
- Inline comment syntax는 지원하지 않는다. Data field 안의 `**`는 comment가 아니라
malformed data다.
- Keyword parameter와 data field는 comma-separated다. Field 바깥의 leading/trailing space와
horizontal tab은 trim한다. 이름/label 내부 공백, quote와 escape는 이번 subset에서
허용하지 않는다.
- Keyword, parameter name, enum, surface/set/part/instance name lookup은 ASCII
case-insensitive이고 canonical lookup key는 uppercase다. Raw trimmed spelling, source file,
physical line와 data ordinal은 그대로 보존한다. Numeric source label은 값과 raw digit
token을 모두 보존한다.
### 3.2 Continuation, line length and encoding
- 각 physical line은 CR/LF를 제외하고 최대 `256` ASCII byte다. Input subset은 printable
7-bit ASCII와 horizontal tab만 허용한다. NUL, non-ASCII byte와 invalid control character는
`invalid-input-character`다. HDF5에는 보존된 ASCII text를 valid UTF-8로 기록한다.
- Keyword parameter continuation만 지원한다. Physical keyword line의 마지막 non-whitespace
character가 comma일 때 바로 다음 non-comment/nonblank physical line을 같은 keyword의
parameter continuation으로 읽는다. Continuation 도중 새 `*` line, EOF, comment/blank
interruption 또는 empty continued parameter는 거부한다.
- Data-line continuation은 지원하지 않는다. `S4`/`S4R`, surface member와 DSLOAD row는 한
physical line 안에 완결되어야 한다.
- `*INCLUDE`는 지원하지 않으므로 recursive source stack, relative include path와 include
cycle은 이 feature contract에 없다. 발견 즉시 fail-closed한다.
### 3.3 Names, labels and empty fields
- `name_token_without_dot`은 정규식 `[A-Za-z_][A-Za-z0-9_-]{0,79}`를 만족한다.
Instance, part, ELSET와 surface name은 이 feature가 새로 소비하는 identity에서 이 bounded
form을 사용한다. Dot은 direct-member qualification separator 하나로만 사용한다.
- Element/node label은 positive base-10 integer이고 existing internal index/equation index와
별개다. Parse 범위 밖, zero, negative와 duplicate source label은 거부한다.
- Split 과정은 empty field를 잃지 않는다. 이 feature가 추가한 keyword parameter,
`surface_member`와 `dsload_row`에는 empty field가 하나라도 있으면 cardinality failure다.
Keyword-line terminal empty field는 §3.2 continuation marker로만 허용한다.
- 기존 keyword의 optional data field 의미는 기존 contract를 유지하며 이 feature가 새
empty-field default를 추가하지 않는다.
## 4. Model Data Mapping
### 4.1 Existing model data
| input | semantic mapping | validation / units |
| --- | --- | --- |
| `*NODE` | Domain-owned node; `(instance, source node label)`와 stable internal node index | finite global Cartesian coordinates `[L]`; duplicate source identity 금지 |
| `*ELEMENT, TYPE=S4|S4R` | Domain-owned four-node shell definition; part/instance, source label/type/connectivity 보존 | four existing nodes; source type preserved even though both select FESA-MITC4 |
| `*NSET`, `*ELSET` | scope-qualified ordered set membership | case-insensitive name, stable source membership, missing/cyclic/cross-scope failure |
| `*MATERIAL`, `*ELASTIC` | Domain-owned named linear isotropic elasticity | finite `E:[F/L^2]`, dimensionless `nu`; existing admissibility rules |
| `*SHELL SECTION` | Domain-owned shell section and material/ELSET references | finite positive thickness `[L]`; exact references required |
| part/assembly/instance wrappers | part definition과 identity-instance relation | instance transform/nested assembly는 unsupported |
### 4.2 Domain-owned element-surface contract
Successful mapping 뒤 Domain은 각 named surface를 ordered immutable semantic object로
소유한다. C++ type/API를 지정하지 않으며 필요한 semantic fields는 다음과 같다.
| field | meaning |
| --- | --- |
| `surface_name_raw`, `surface_name_canonical` | source spelling과 uppercase lookup key |
| `declaration_file`, `declaration_line`, `declaration_ordinal` | stable declaration identity |
| `scope` | exact value `assembly` |
| `facet_ordinal` | resolved unique inventory의 zero-based stable order |
| `part_name_raw/canonical`, `instance_name_raw/canonical` | identity instance가 참조하는 part와 source instance identity |
| `element_label`, `element_label_raw`, `source_element_type` | positive source label와 exact `S4|S4R`; internal index와 분리 |
| `side` | exact canonical `SPOS|SNEG`; side multiplier는 formulation의 `+1|-1` |
| `member_file`, `member_line`, `member_ordinal` | 최초 contributing surface data member source |
| `member_kind`, `elset_name_raw/canonical` | `direct|elset`와 expansion provenance |
Resolution은 모든 member target을 검증한 뒤 candidate inventory에 commit한다. Facet order는
`(instance declaration ordinal, numeric element label, SPOS before SNEG)`의 stable order다.
각 facet은 최초 contributing member identity를 보존하고, set/container/thread iteration
order는 facet order를 바꾸지 않는다.
Duplicate rule은 다음과 같다.
- 같은 surface에서 exact same `(instance, element label, side)`가 direct/ELSET overlap 또는
여러 member로 다시 나타나면 하나의 facet으로 normalize하고 stable
`duplicate-surface-member-normalized` warning을 최초 identity 뒤에 기록한다. Pressure를 두
번 적용하지 않는다.
- 같은 surface에서 같은 `(instance, element label)`가 `SPOS`와 `SNEG` 양쪽으로 나타나면
unsupported double-sided/conflicting membership이므로 fail-closed한다.
- Case-insensitive duplicate surface name declaration은 merge하지 않고 fail-closed한다.
- Empty surface, unsupported source type, missing/ambiguous instance/element/set와 cross-scope
target은 fail-closed한다.
Domain은 parse/map 성공 뒤 가능한 한 immutable하며 surface와 element의 stable source label을
internal collection index나 equation index로 대체하지 않는다.
## 5. History Data Mapping
### 5.1 Step, constraints and load records
`*STEP`, `*STATIC`, `*BOUNDARY`, `*CLOAD`, `*DSLOAD`는 history data다. Successful mapping 뒤
sole Step은 existing procedure/control/constraint/concentrated-load data와 함께 ordered
uniform pressure records를 소유한다.
각 pressure record의 최소 semantic fields는 다음과 같다.
| field | meaning |
| --- | --- |
| `step_name_raw/canonical` | sole source step identity; output path는 `Step-1` |
| `load_ordinal` | 전체 step load data의 stable source order에서 zero-based ordinal |
| `surface_name_raw/canonical` | assembly surface reference source spelling/lookup key |
| `load_type` | exact canonical `P` |
| `magnitude`, `magnitude_raw` | unscaled signed finite pressure `[F/L^2]`와 source token |
| `source_file`, `keyword_line`, `data_line`, `data_ordinal` | keyword/data provenance |
Multiple valid pressure records는 같아 보여도 distinct이고 `load_ordinal` 순서에서 additive다.
Surface facet과 load record의 Cartesian product가 각 active contribution identity를 만든다.
Analysis step load factor `lambda`는 source magnitude에 exactly once 적용한다. `lambda=0` 또는
`p=0`도 surface/model/current-geometry validation을 생략하지 않는다.
### 5.2 Output requests
`*OUTPUT`, `*NODE OUTPUT`, `*ELEMENT OUTPUT` allowlist는 warning 후 no-op이며 아래 mandatory
HDF5를 선택·제거하지 않는다. Pressure-only field request, pressure integration-point output,
history output과 CSV writer는 없다. Unknown output request가 해석 결과를 바꿀 가능성이
있으면 ignored-with-warning가 아니라 fail-closed다.
## 6. Internal Model Contract
이 절은 semantic relation만 정의하고 C++ class/API/file ownership을 정하지 않는다.
| semantic object | required meaning / ownership |
| --- | --- |
| node | Domain owns source `(part,instance,node label)`, coordinates, stable internal index |
| element | Domain owns source `(part,instance,element label,type)`, ordered four-node connectivity, material/section identities |
| node/element set | Domain owns scope-qualified case-insensitive name and deterministic expanded source membership |
| material/section | Domain owns named finite linear-elastic material and shell section/material/set linkage |
| element surface | Domain owns §4.2 immutable named surface and ordered unique facets |
| boundary condition | Step owns existing source target, DOF range/value and source order |
| concentrated load | Step owns existing nodal target/component/magnitude and source order |
| uniform pressure load | Step owns §5.1 surface reference, signed `P` magnitude and load ordinal |
| step/procedure | Domain/Step definition owns sole static procedure and linear/nonlinear configuration identity |
| output request | parsed warning/no-op record only; mandatory result set는 procedure가 결정 |
`AnalysisModel`은 current step에서 active elements, facets, pressure records, other loads,
constraints, properties/materials를 Domain/Step lifetime 안에서 참조하는 non-owning view다.
Domain 또는 surface inventory를 복사하거나 재정렬하지 않는다.
각 active `(load_ordinal, facet_ordinal)`은 formulation의 element-local `24x1` pressure force와,
nonlinear이면 `24x24` external tangent candidate를 만든다. Candidate의 finite/geometry/dimension
검증이 끝난 뒤
`(load_ordinal, facet_ordinal, instance declaration ordinal, element label, local row[,column])`
순서로 stable full-space external generalized load/tangent에 reduce한다. Parallel producer는
global storage를 직접 갱신하지 않는다. Full-space completion 뒤에만 free/constrained projection을
수행한다. `r=f_int-f_ext`, nonlinear `K=K_int-K_ext`이며 constrained residual은 reaction,
free residual은 accepted-equilibrium evidence다.
## 7. Authoritative HDF5 Schema
### 7.1 Version and filename decision
새 HDF5 dataset 또는 schema version은 추가하지 않는다. Pressure는 새로운 recovery quantity가
아니라 existing external load이며 기존 result chain에서 관측 가능하다.
- Linear static: current schema `0`, `<stem>_results.h5`.
- Nonlinear static: current schema `1`, `<stem>_results.h5`.
- CLI operand/output derivation과 `<stem>_log.txt` procedure log contract는 변경하지 않는다.
- 기존 pressure 없는 input은 동일 schema, row order와 mandatory result를 유지한다.
- `/metadata/feature_id`는 기존 writer identity
`linear-static-mitc4-shell` 또는 `nonlinear-static-newton-raphson`을 유지한다. Pressure
feature를 표시하려고 값을 바꾸거나 새 metadata를 만들지 않는다.
- `/metadata/source_input_identity`가 exact input content identity를, `/model/elements`가 source
instance/label/type을 보존한다. Surface/load-only model dataset은 추가하지 않는다.
Successful candidate만 same-directory temporary HDF5에 완성, flush, checked close/reopen/self-
check 후 final path에 atomic publish한다. 실패 candidate는 accepted state나 final HDF5로
commit하지 않으며 prior valid final을 보존하거나 prior final이 없으면 misleading final을
남기지 않는다.
### 7.2 Common dataset conventions
- Numeric value dtype는 little-endian IEEE `float64`; identity index는 little-endian
`uint64`, mask는 `uint8`, text는 variable-length UTF-8다.
- Node row `r`는 `/model/nodes.internal_node_id=r`로 join한다. Source comparison은 그 row의
`instance_name`와 numeric `source_label`을 사용하며 HDF5 row order만으로 외부 row를
맞추지 않는다.
- `N`은 node count, `E`는 shell element count, `F`는 committed accepted frame count다.
- Schema-v0 field numeric dataset의 common attributes는 `component_names`,
`component_unit_dimensions`, `coordinate_system`, `location`, `step_name=Step-1`,
`frame_index=0`이다. Schema version은 `/metadata@schema_version=0`이 authoritative다.
- Schema-v1 model/frame numeric dataset은 `schema_version=1`, `component_names`,
`component_unit_dimensions`, `coordinate_system`, `location`을 가진다. Frame dataset은
`step_name=Step-1`, `frame_index`, `increment_index`, `load_factor`, `is_factor_one`도 가진다.
### 7.3 Linear static schema `0`
Sole `/steps/Step-1/frames/0`은 completed linear final state이며 procedure load factor 의미는
`1.0`이다. Schema `0`은 별도 `load_factor` attribute/dataset을 저장하지 않으므로 이를
새로 발명하지 않는다.
| path | shape / dtype | components, units, coordinates, location | pressure meaning / requirement |
| --- | --- | --- | --- |
| `/metadata` | group | attrs: `schema_version=0`, `feature_id=linear-static-mitc4-shell`, `solver_version`, `source_input_identity`, `unit_system_label=user-consistent-unspecified`, `coordinate_convention`, `internal_formulation=FESA-MITC4`, `integration_rule`, `step_name=Step-1`, `frame_index=0` | source/procedure identity; mandatory |
| `/model/nodes` | `[N]` compound | `internal_node_id:uint64`, `instance_name:utf8`, `source_label:utf8`, `coordinates:float64[3]`; global Cartesian, length | nodal source identity join; mandatory |
| `/model/elements` | `[E]` compound | internal element ID, source instance/label/type, four internal node IDs, section/material IDs; formulation `FESA-MITC4` | S4/S4R source identity unchanged; mandatory |
| `/model/shell/materials` | `[M]` compound | material ID/name, `E:[F/L^2]`, `nu:[1]` | unchanged material identity |
| `/model/shell/sections` | `[S]` compound | section/source/material IDs, thickness `[L]`; centered single layer | unchanged section identity |
| `/model/shell/nodal_director` | `[N,3] float64` | `D1,D2,D3`; `1,1,1`; global Cartesian; initial director | unchanged |
| `/model/shell/nodal_frame` | `[N,3,3] float64` | `X,Y,Z`, axes `A,B,D`; dimensionless; global Cartesian | unchanged |
| `/model/nodal_constraint_mask` | `[N,6] uint8` | order `[UX,UY,UZ,URX,URY,URZ]`; `0=free,1=constrained` | full/free/constrained identity |
| `/model/prescribed_displacement` | `[N,6] float64` | `[UX,UY,UZ,URX,URY,URZ]`; `[L,L,L,1,1,1]`; global Cartesian | existing prescribed target |
| `/model/shell/midsurface_locations` | `[4,2] float64` | `XI,ETA`; shell-natural; midsurface location | fixed four Gauss rows |
| `/model/shell/section_positions` | `[3] float64` | `ZETA`, `BOTTOM,MIDDLE,TOP`; shell-natural | unchanged recovery positions |
| `/steps/Step-1/frames/0/nodal/displacement` | `[N,6] float64` | `UX,UY,UZ,URX,URY,URZ`; `[L,L,L,1,1,1]`; global Cartesian; nodal | pressure solution response; mandatory |
| `/steps/Step-1/frames/0/nodal/reaction` | `[N,6] float64` | `RF1,RF2,RF3,RM1,RM2,RM3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; nodal | full residual, constrained entries physical reaction; pressure included |
| `/steps/Step-1/frames/0/element/shell/local_frame` | `[E,4,3,3] float64` | `X,Y,Z`, axes `E1,E2,E3`; dimensionless; global Cartesian; shell-local-frame | unchanged MITC4 recovery identity |
| `/steps/Step-1/frames/0/element/shell/generalized_strain` | `[E,4,8] float64` | `E11,E22,G12,K11,K22,K12,G13,G23`; `[1,1,1,1/L,1/L,1/L,1,1]`; shell-local; midsurface | unchanged |
| `/steps/Step-1/frames/0/element/shell/section_resultant` | `[E,4,8] float64` | `N11,N22,N12,M11,M22,M12,Q13,Q23`; `[F/L,F/L,F/L,F,F,F,F/L,F/L]`; shell-local; midsurface | unchanged |
| `/steps/Step-1/frames/0/element/shell/stress` | `[E,4,3,3] float64` | `S11,S22,S12`; `[F/L^2,F/L^2,F/L^2]`; shell-local; section-position | unchanged; external stress comparison 없음 |
| `/steps/Step-1/frames/0/global/energy` | `[1] float64` | `PHYSICAL_STRAIN_ENERGY`; `F*L`; global/global | existing strain energy; pressure-only energy 없음 |
| `/steps/Step-1/frames/0/global/equilibrium` | `[6] float64` | `FORCE_1..3,MOMENT_1..3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; `global-origin` | applied pressure와 constrained reaction balance 포함 |
| `/steps/Step-1/frames/0/global/verification_metrics` | `[3] float64` | `FREE_RESIDUAL_NORMALIZED,FORCE_BALANCE_NORMALIZED,MOMENT_BALANCE_NORMALIZED`; dimensionless; global/verification | existing linear free residual/force/moment evidence |
| `/diagnostics` | `[D]` compound | `severity,code,file,line,keyword,entity_identity,message` | sorted successful warnings; mandatory even when empty |
Schema `0`은 `external_force`, `internal_force`, full free residual을 별도 nodal dataset으로
저장하지 않는다. Pressure를 위해 이를 추가하지 않는다. Full residual-derived reaction,
global equilibrium와 verification metrics가 existing authoritative projection이다.
### 7.4 Nonlinear static schema `1`
`/steps/Step-1/accepted_frames`의 committed row만 frame group을 가진다. Factor zero는
`/metadata@factor_zero_is_frame=0`, `factor_zero_load_factor=0.0`인 baseline metadata이고
accepted frame이 아니다. Successful final row는 unique `load_factor=1.0` 및
`is_factor_one=1`이다.
| path | shape / dtype | components, units, coordinates, location | pressure meaning / requirement |
| --- | --- | --- | --- |
| `/metadata` | group | attrs: `schema_version=1`, `feature_id=nonlinear-static-newton-raphson`, `solver_version`, `source_input_identity`, `unit_system_label=user-consistent-unspecified`, `coordinate_convention`, `analysis_procedure=nonlinear-static-full-newton`, `internal_formulation=FESA-MITC4-total-lagrangian`, `integration_rule`, `step_name=Step-1`, accepted-frame indexing, factor-zero attrs | source/procedure identity; mandatory |
| `/model/nodes` | `[N]` compound | `internal_node_id:uint64`, `instance_name:utf8`, `source_label:utf8`, `coordinates:float64[3]`; attrs schema `1`, `X,Y,Z`, length, global Cartesian, nodal-reference | reference identity join |
| `/model/elements` | `[E]` compound | internal ID, instance/source label/type/formulation, node IDs, section/material IDs; schema `1` | S4/S4R source identity unchanged |
| `/model/shell/materials` | `[M]` compound | material ID/name, `E`, `nu`; schema `1`; `[F/L^2,1]`; model-material | unchanged |
| `/model/shell/sections` | `[S]` compound | section/source/material IDs, thickness; schema `1`, length, model-shell-section, centered single layer | unchanged |
| `/model/shell/nodal_director` | `[N,3] float64` | `D1,D2,D3`; dimensionless; global Cartesian; nodal-initial-director | unchanged |
| `/model/shell/nodal_frame` | `[N,3,3] float64` | `X,Y,Z`, axes `A,B,D`; dimensionless; global Cartesian; nodal-initial-frame | unchanged |
| `/model/nodal_constraint_mask` | `[N,6] uint8` | semantic order `[UX,UY,UZ,URX,URY,URZ]`; schema `1`; dimensionless; global Cartesian; nodal-constraint | free/constrained projection identity |
| `/model/prescribed_displacement_start` | `[N,6] float64` | `UX..URZ`; `[L,L,L,1,1,1]`; global Cartesian; nodal-prescribed-start; `load_factor=0` | baseline constraint state |
| `/model/prescribed_displacement_target` | `[N,6] float64` | same; nodal-prescribed-target; `load_factor=1` | factor-one target |
| `/model/shell/midsurface_locations` | `[4,2] float64` | `XI,ETA`; dimensionless; shell-natural; midsurface-location | stable GP identity |
| `/model/shell/section_positions` | `[3] float64` | `ZETA`, `BOTTOM,MIDDLE,TOP`; shell-natural; section-position | stable section identity |
| `/steps/Step-1/accepted_frames` | `[F]` compound | `frame_index:uint64, increment_index:uint64, load_factor:float64, iteration_count:uint64, is_factor_one:uint8`; schema `1` | accepted frame selector |
| `/steps/Step-1/frames/<k>/nodal/displacement` | `[N,6] float64` | `UX,UY,UZ,URX,URY,URZ`; `[L,L,L,1,1,1]`; global Cartesian; nodal | pressure solution response and reference source |
| `/steps/Step-1/frames/<k>/nodal/triad` | `[N,3,3] float64` | `X,Y,Z`; dimensionless; global Cartesian; nodal-triad | accepted current orientation |
| `/steps/Step-1/frames/<k>/nodal/director` | `[N,3] float64` | `D1,D2,D3`; dimensionless; global Cartesian; nodal-director | accepted current director |
| `/steps/Step-1/frames/<k>/nodal/generalized_internal_force` | `[N,6] float64` | `FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; nodal | full-space `f_int` |
| `/steps/Step-1/frames/<k>/nodal/generalized_external_force` | `[N,6] float64` | `FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3`; same units; global Cartesian; nodal | full-space `f_ext`; pressure contribution의 rotational entries는 exact zero |
| `/steps/Step-1/frames/<k>/nodal/generalized_residual` | `[N,6] float64` | `RU1,RU2,RU3,RPHI1,RPHI2,RPHI3`; same units; global Cartesian; nodal | `r=f_int-f_ext`; mask와 함께 accepted free residual을 reconstruct |
| `/steps/Step-1/frames/<k>/nodal/reaction` | `[N,6] float64` | `RF1,RF2,RF3,RM1,RM2,RM3`; same units; global Cartesian; nodal | constrained residual; rotational values는 spatial physical moment projection |
| `/steps/Step-1/frames/<k>/element/shell/local_frame` | `[E,4,3,3] float64` | `X,Y,Z`, axes `E1,E2,E3`; dimensionless; global Cartesian; shell-local-frame | unchanged MITC4 recovery |
| `/steps/Step-1/frames/<k>/element/shell/generalized_strain` | `[E,4,8] float64` | `E11,E22,G12,K11,K22,K12,G13,G23`; `[1,1,1,1/L,1/L,1/L,1,1]`; shell-local; midsurface | unchanged |
| `/steps/Step-1/frames/<k>/element/shell/section_resultant` | `[E,4,8] float64` | `N11,N22,N12,M11,M22,M12,Q13,Q23`; `[F/L,F/L,F/L,F,F,F,F/L,F/L]`; shell-local; midsurface | unchanged |
| `/steps/Step-1/frames/<k>/element/shell/stress` | `[E,4,3,3] float64` | `S11,S22,S12`; `[F/L^2,F/L^2,F/L^2]`; shell-local; section-position | unchanged; external stress comparison excluded |
| `/steps/Step-1/frames/<k>/global/energy` | `[1] float64` | `PHYSICAL_STRAIN_ENERGY`; `F*L`; global/global | existing physical strain energy; pressure-only energy 없음 |
| `/steps/Step-1/frames/<k>/global/equilibrium` | `[6] float64` | `FORCE_1..3,MOMENT_1..3`; `[F,F,F,F*L,F*L,F*L]`; global Cartesian; `global-balance-error` | current `X+u` arm과 spatial moment의 applied-plus-constrained-reaction balance error |
| `/diagnostics` | `[D]` compound | `severity,code,file,line,keyword,entity_identity,message`; schema `1` | sorted successful warnings; mandatory even when empty |
모든 frame numeric dataset은 §7.2의 schema-v1 frame attributes를 가진다. Accepted free
residual은 새 summary dataset이 아니라 `generalized_residual`을
`nodal_constraint_mask==0`으로 project한 finite generalized force/moment channels다. Pressure
rotational generalized external contribution이 exact zero여도 reaction의 physical moment와
`global/equilibrium` moment는 nodal force arm 때문에 nonzero일 수 있다.
## 8. FESA HDF5 to Reference CSV Comparison Mapping
### 8.1 Immutable artifacts and accepted frame
| role | exact path | disposition |
| --- | --- | --- |
| input | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure.inp` | required read-only |
| displacement | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure displacements.csv` | required blocking/warning source |
| reaction | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure reactions.csv` | `review-only`; verdict family 없음 |
| stress | `reference/shellNL-meshfine-pressure/shellNL-meshfine-pressure stresses.csv` | `excluded`; comparator family 없음 |
Comparator는 schema `1` HDF5의 `/steps/Step-1/accepted_frames`에서
`load_factor==1.0 && is_factor_one==1`인 row가 정확히 하나인지 검사한다. 그 row의 exact
`frame_index=k`를 사용해
`/steps/Step-1/frames/<k>/nodal/displacement`를 읽는다. Step path는 exact `Step-1`이어야 하며
다른 accepted factor-one row, missing frame group 또는 frame attribute/table 불일치는 tolerance
전 실패다.
### 8.2 Deterministic node/component projection
1. `/model/nodes`는 exactly `729` rows여야 한다. `internal_node_id`는 unique `0..728`이고
displacement first dimension과 일치해야 한다. 각 displacement row는 동일 internal ID의
model node에 join한다.
2. HDF5 source key는 raw `instance_name`, numeric-parsed raw `source_label`이다. Expected
instance는 `Part-1-1`, labels는 `1..729` exactly once다.
3. CSV parser는 raw header와 raw text cell을 report에 보존한다. Header recognition에서만
leading/trailing ASCII whitespace를 trim하며 trimmed header set은 exact
`Frame`, `Part Instance Name`, `Node Label`, `U-U1`, `U-U2`, `U-U3`, `UR-UR1`,
`UR-UR2`, `UR-UR3`이어야 한다. Duplicate/unknown extra/missing header는 precheck failure다.
4. Text identity cell도 comparison key를 만들 때만 ASCII trim한다. Instance는 ASCII
case-insensitive하게 canonicalize하되 HDF5/CSV raw spelling을 모두 보존한다. Node Label은
positive decimal numeric source label로 parse한다. Frame은 trimmed exact observed text
`Increment 10: Step Time = 1.000` 하나뿐이어야 한다.
5. Raw wide rows는 exactly `729`이고 key
`(Frame, canonical instance, numeric node label)`는 unique다. CSV file order를 HDF5 row
order와 맞추지 않는다.
6. Wide row를 아래 logical component row로 deterministic하게 expand한다. Order는
`(numeric node label ascending, component table order)`이며 matching identity는
`(case_id, Step-1, factor-one frame, canonical instance, node label, logical component)`다.
| HDF5 column index/name | CSV column | logical component | units / coordinates | family / disposition |
| --- | --- | --- | --- | --- |
| `0 / UX` | `U-U1` | `U1` | length, global Cartesian | `pressure_nodal_translation_blocking` / `blocking` |
| `1 / UY` | `U-U2` | `U2` | length, global Cartesian | same / `blocking` |
| `2 / UZ` | `U-U3` | `U3` | length, global Cartesian | same / `blocking` |
| `3 / URX` | `UR-UR1` | `UR1` | dimensionless radian convention, global component | `pressure_nodal_rotation_warning` / `warning-only` |
| `4 / URY` | `UR-UR2` | `UR2` | same | same / `warning-only` |
| `5 / URZ` | `UR-UR3` | `UR3` | same | same / `warning-only` |
Expected translation logical rows are `729*3=2,187`; expected rotation logical rows are
`729*3=2,187`. 두 disposition은 같은 family로 합치지 않는다.
### 8.3 Prechecks and tolerance
다음 순서의 precheck가 모두 통과한 뒤에만 tolerance를 계산한다.
1. exact required artifact path/readability와 case/input pairing;
2. HDF5 `/metadata@schema_version=1`, source identity, exact `Step-1`, unique factor-one accepted
frame와 matching frame attributes;
3. required dataset existence, dtype/rank/shape/attribute/component order;
4. HDF5 node internal/source identity uniqueness와 exact instance/node inventory;
5. CSV trimmed header set, exact factor-one Frame text, instance/node wide-row inventory;
6. missing/extra/duplicate HDF5 or CSV source key/component와 cardinality `729/2,187/2,187`;
7. every HDF5/CSV required numeric value의 finite C-locale parse.
Wrong case, step, frame, factor, instance, node 또는 component는 row omission, averaging,
duplicate collapse, fallback index와 zero clamp로 보정하지 않는다. Shared identity/schema
precheck failure는 warning family만 관련되어도 comparison non-success다. Shared prechecks가
통과한 뒤 translation row/RMS failure는 blocking verdict를 실패시키고 rotation row/RMS
failure는 deterministic warning만 남긴다.
각 family는 변경 없이 `docs/TOLERANCE.md`를 사용한다. Reference-only
`S=max(abs(reference))`, `B=0.01*S`; `abs(reference)<=B` row는
`abs(fesa-reference)<=B`, 나머지는 relative error `<=0.05`; family
`RMS(error)/S<=0.01`을 모두 통과해야 한다. Boundary는 inclusive다. Independent absolute
gate, `max(1,S)`, floor, clamp와 calibration은 없다. `S=0`이면 FESA family도 exact zero만
통과한다.
Reaction CSV는 local distribution의 optional review-only inventory이며 HDF5
`nodal/reaction`과 numerical verdict family를 만들지 않는다. Stress CSV는 excluded이며
`element/shell/stress` comparator를 만들지 않는다. Internal reaction/free residual/global
equilibrium evidence는 각각 approved internal gate로 유지된다.
## 9. Validation and Deterministic Diagnostics
### 9.1 Ordered validation pipeline
Validation은 다음 순서를 고정한다. 앞 단계 실패 시 뒤 단계의 partial semantic state나
pressure contribution을 commit하지 않는다.
1. ASCII/line-length/keyword continuation, comma split, empty-field, cardinality와 finite numeric
lexical validation;
2. keyword parameter allowlist, wrapper/scope와 sole-step/static procedure placement;
3. case-insensitive part/instance/set/surface name uniqueness와 visibility;
4. direct target resolution, flat assembly ELSET expansion, missing/ambiguous/cyclic/cross-scope
target rejection;
5. source `S4|S4R`, four-node connectivity, `SPOS|SNEG`와 unique/conflicting membership rules;
6. nonempty immutable surface candidate commit;
7. step-level `DSLOAD` surface reference, `P`, finite signed magnitude, record/source order와
approved linear/nonlinear procedure;
8. finite model units/configuration prerequisites와 full scatter/dimension identity;
9. formulation/numerical-review의 reference/current geometry gate
`tau_J=1.0e-12`, finite force/tangent/local contribution;
10. stable full-space reduction finite check, free/constrained projection와 accepted state/result
recovery;
11. complete HDF5 candidate self-check와 atomic finalization.
### 9.2 Failure categories and stable diagnostic fields
| category / example code family | stage and disposition | CLI category |
| --- | --- | --- |
| `input-syntax`, `invalid-cardinality`, `invalid-number`, `invalid-input-character` | lexical/data failure | `3=input` |
| `unsupported-keyword`, `unsupported-parameter`, `unsupported-surface-scope`, `unsupported-load-type`, `unsupported-procedure` | approved subset 밖; fail-closed | `3=input` |
| `duplicate-name`, `missing-reference`, `ambiguous-reference`, `cyclic-elset`, `cross-scope-target`, `empty-surface` | semantic target failure | `4=model` |
| `unsupported-element-type`, `unsupported-surface-side`, `conflicting-surface-membership`, `invalid-connectivity` | facet/model failure | `4=model` |
| `nonfinite-model-value`, `invalid-reference-surface-geometry` | pre-analysis model validation | `4=model` |
| `invalid-current-surface-geometry`, `nonfinite-pressure-contribution`, `nonfinite-pressure-tangent`, `invalid-scatter`, `invalid-reduction` | trial/assembly failure; candidate 폐기 | `5=solver` |
| `hdf5-write-failure`, `hdf5-finalization-failure` | prior final preservation / no partial final | `6=HDF5` |
각 diagnostic은 existing external fields
`severity`, `code`, `file`, `line`, `keyword`, `entity_identity`, `message`를 가진다. Pressure
failure의 semantic identity는 가능한 항목을 omission 없이 deterministic field order로
`entity_identity`에 보존한다:
```text
surface_raw; surface_canonical; load_type; part_raw; instance_raw;
element_label; source_element_type; side; member_ordinal; load_ordinal
```
Lexical failure처럼 아직 알 수 없는 downstream field만 empty다. Keyword line과 data line이
다르면 `line`은 실제 failing data line이고 message가 keyword declaration line을 포함한다.
Raw spelling과 canonical lookup key를 모두 유지한다. Diagnostics는
`(file source order, line, member/load ordinal, code, entity identity)`의 stable order로
stderr와 successful-output `/diagnostics`에 기록한다.
Same-side surface duplicate normalization만 warning이며 unique facet 하나를 만든다. Identical
DSLOAD row는 warning/normalization 대상이 아니라 legal distinct additive record다. Conflicting
side duplicate, duplicate surface declaration 또는 ambiguous target은 error다. Unsupported
variant를 silently ignore하거나 `CLOAD`/`DLOAD`/다른 surface 의미로 변환하지 않는다.
## 10. Requirement Traceability and Downstream Handoff
### 10.1 Requirement-to-I/O trace
| requirement | I/O decision / verification owner |
| --- | --- |
| `FESA-REQ-SHELL-PRESSURE-001` | §§2.3–2.5 exact `SURFACE`/`DSLOAD P` grammar; Stage 6 parser/semantic tests |
| `FESA-REQ-SHELL-PRESSURE-002` | §2.4 signed finite scalar `[F/L^2]`; numeric boundary tests |
| `FESA-REQ-SHELL-PRESSURE-003` | §4.2 deterministic direct/ELSET facet identity/order; semantic tests |
| `FESA-REQ-SHELL-PRESSURE-004` | §§2.2, 4.2 only source `S4|S4R`, `SPOS|SNEG`; rejection tests |
| `FESA-REQ-SHELL-PRESSURE-005` | §§5–6 preserve signed `P`/side without abs/clamp; analytical sign tests |
| `FESA-REQ-SHELL-PRESSURE-006` | §4.2 source connectivity/type/side identity; formulation geometry tests |
| `FESA-REQ-SHELL-PRESSURE-007` | §2.5 linear reference configuration and schema `0`; linear patch tests |
| `FESA-REQ-SHELL-PRESSURE-008` | §2.5 nonlinear current configuration, schema `1`; objectivity tests |
| `FESA-REQ-SHELL-PRESSURE-009` | §6 force/tangent semantic path and nonlinear external tangent; FD tests |
| `FESA-REQ-SHELL-PRESSURE-010` | §5.1 exact-once load factor; factor `0,0.5,1` tests |
| `FESA-REQ-SHELL-PRESSURE-011` | §6 local candidate→stable full-space→projection; assembly tests |
| `FESA-REQ-SHELL-PRESSURE-012` | §§6–7 residual/reaction/free projection; reaction/equilibrium tests |
| `FESA-REQ-SHELL-PRESSURE-013` | §§4.2, 5.1, 6, 9 deterministic identity/reduction/result/diagnostic order tests |
| `FESA-REQ-SHELL-PRESSURE-014` | §2.2 allowlist and §§2.3–2.5 fail-closed matrix |
| `FESA-REQ-SHELL-PRESSURE-015` | §§4.2, 9 missing/ambiguous/empty/duplicate/scope rules; negative tests |
| `FESA-REQ-SHELL-PRESSURE-016` | §§2.5, 9 procedure/nonfinite/geometry failure; atomicity tests |
| `FESA-REQ-SHELL-PRESSURE-017` | §9 stable diagnostic fields/order and §7 atomic HDF5; failure tests |
| `FESA-REQ-SHELL-PRESSURE-018` | §7 no new dataset/version; schema-v0/v1 regression tests |
| `FESA-REQ-SHELL-PRESSURE-019` | §§7.3–7.4 existing nodal/residual/reaction/equilibrium/MITC4 paths |
| `FESA-REQ-SHELL-PRESSURE-020` | §7 linear observable projection plus approved analytical suite; Stage 6 analysis tests |
| `FESA-REQ-SHELL-PRESSURE-021` | §7.4 full nonlinear vectors/free residual/global balance; Stage 6 nonlinear tests |
| `FESA-REQ-SHELL-PRESSURE-022` | §8.1 exact immutable input/CSV paths and exact stored inventory prechecks |
| `FESA-REQ-SHELL-PRESSURE-023` | §§8.1–8.3 exact HDF5 frame/node/component projection, U blocking/UR warning |
| `FESA-REQ-SHELL-PRESSURE-024` | §8 reaction review-only, stress excluded, no comparator family |
Coverage: normative requirements `24`, traced requirements `24`, gaps `0`.
### 10.2 Implementation Planning handoff through Coordinator
Stage 6 plan은 API/file design 전에 다음 acceptance items를 자기완결적 TDD Step으로 나눠야
한다.
1. Exact line/ASCII/comma/continuation/name/numeric grammar와 valid reference-style assembly
ELSET surface, direct qualified member, S4/S4R, SPOS/SNEG parser acceptance.
2. Every table-declared unsupported keyword/parameter/scope/member/load/procedure와 malformed
cardinality/numeric failure의 stable category/source diagnostic.
3. Direct/ELSET/multi-instance expansion, same-side normalization warning, conflicting-side/name/
empty/missing/ambiguous/cyclic/cross-scope failure와 immutable deterministic facet order.
4. Distinct additive pressure record/source order, exact-once factor, AnalysisModel non-owning
lifetime와 element-local→full-space→projection order.
5. Nonfinite/geometry/scatter/reduction failure, deterministic serial/parallel contribution and
diagnostic order, failed-state/final-file atomicity.
6. Existing schema `0`/`1` writer regression: no pressure-only dataset/version change; exact paths,
shapes, dtypes, attributes, source identity, frame/factor and mandatory finite quantities.
7. Exact schema-v1 HDF5→wide CSV projection, header/raw identity policy, `729`/`2,187` inventories,
all prechecks, family dispositions, boundary/zero-scale common tolerance tests.
8. Reaction CSV review-only와 stress CSV excluded; neither creates a numerical verdict family.
Private data layout, exact diagnostic code spelling within the normative category families and test
file ownership are Stage 6 implementation-planning decisions. They may not change supported syntax,
public compatibility, physics/sign, source identity, ordering, HDF5 schema, failure category,
reference disposition 또는 tolerance.
### 10.3 Open issues and stop condition
- Critical user question: 없음.
- Blocking I/O gap: 없음.
- Accepted limitation: stored external case는 S4/SPOS/positive `P` nonlinear displacement만
검증한다. S4R, sign reversal, linear pressure, objectivity와 tangent는 approved blocking
internal tests가 담당하며 새로운 reference artifact를 만들지 않는다.
- This document stops at I/O definition. Parser/C++ API implementation, implementation plan,
reference execution/comparison, physics/release verdict는 수행하지 않았다.