640 lines
47 KiB
Markdown
640 lines
47 KiB
Markdown
# 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는 수행하지 않았다.
|