47 KiB
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 |
*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를 변경하지 않음 |
*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다.
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:
*SURFACE는*ASSEMBLY와*END ASSEMBLY사이이며 어떤*INSTANCEblock 밖에 있어야 한다. Part-level 또는 instance-block-level*SURFACE는 이번 subset에서unsupported-surface-scope다.- Keyword parameter는
TYPE=ELEMENT와NAME=<name>각각 하나뿐이다. Parameter order는 위 두 순서 모두 허용하지만 duplicate, flag parameter와TRIM,COMBINE,PROPERTY,REGION TYPE등 추가 parameter는 거부한다. - 각 data line은 정확히 두 개의 nonempty field다. Side는
SPOS또는SNEG뿐이다. - Direct member는 정확히
<instance-name>.<positive-decimal-element-label>이다. Assembly scope의 bare element label,<part>.<label>,<instance>.<elset>, 두 개 이상의 dot과 quoted token은 지원하지 않는다. - ELSET member는 assembly scope에서 이미 선언되고
INSTANCE=<instance-name>으로 하나의 identity instance에 결속된 flatELSET이름이다. Surface가 여러 data line에서 서로 다른 instance-bound ELSET 또는 direct member를 사용해 여러 instance를 포함할 수 있다. Reference input에 있는INTERNALflag는 source provenance에 보존하되 membership 의미를 바꾸지 않는다. Mixed-instance set, nested/cyclic set, part-local set의 암묵적 승격은 지원하지 않는다. - Direct member와 ELSET expansion은 모두 최종 stable facet
(part, instance, element label, source type, side)로 변환된다. Element label은 instance 안에서 해석하며 다른 instance의 같은 numeric label과 합치지 않는다. - Surface name은 assembly namespace에서 case-insensitive unique다. Surface declaration은 하나 이상의 valid unique facet으로 resolve되어야 한다.
지원 예:
*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
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
*DSLOADkeyword 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의 finitedouble이다. NaN,Inf,Infinity, hexadecimal, locale comma와 FortranDexponent는 지원하지 않는다. 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 안에 여러*DSLOADkeyword를 허용한다. 각 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를 제외하고 최대
256ASCII 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 보존 |
*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 |
side |
exact canonical `SPOS |
member_file, member_line, member_ordinal |
최초 contributing surface data member source |
member_kind, elset_name_raw/canonical |
`direct |
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하고 stableduplicate-surface-member-normalizedwarning을 최초 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.txtprocedure log contract는 변경하지 않는다. - 기존 pressure 없는 input은 동일 schema, row order와 mandatory result를 유지한다.
/metadata/feature_id는 기존 writer identitylinear-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-endianuint64, mask는uint8, text는 variable-length UTF-8다. - Node row
r는/model/nodes.internal_node_id=r로 join한다. Source comparison은 그 row의instance_name와 numericsource_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
/model/nodes는 exactly729rows여야 한다.internal_node_id는 unique0..728이고 displacement first dimension과 일치해야 한다. 각 displacement row는 동일 internal ID의 model node에 join한다.- HDF5 source key는 raw
instance_name, numeric-parsed rawsource_label이다. Expected instance는Part-1-1, labels는1..729exactly once다. - 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다. - 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하나뿐이어야 한다. - Raw wide rows는 exactly
729이고 key(Frame, canonical instance, numeric node label)는 unique다. CSV file order를 HDF5 row order와 맞추지 않는다. - 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를 계산한다.
- exact required artifact path/readability와 case/input pairing;
- HDF5
/metadata@schema_version=1, source identity, exactStep-1, unique factor-one accepted frame와 matching frame attributes; - required dataset existence, dtype/rank/shape/attribute/component order;
- HDF5 node internal/source identity uniqueness와 exact instance/node inventory;
- CSV trimmed header set, exact factor-one Frame text, instance/node wide-row inventory;
- missing/extra/duplicate HDF5 or CSV source key/component와 cardinality
729/2,187/2,187; - 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하지 않는다.
- ASCII/line-length/keyword continuation, comma split, empty-field, cardinality와 finite numeric lexical validation;
- keyword parameter allowlist, wrapper/scope와 sole-step/static procedure placement;
- case-insensitive part/instance/set/surface name uniqueness와 visibility;
- direct target resolution, flat assembly ELSET expansion, missing/ambiguous/cyclic/cross-scope target rejection;
- source
S4|S4R, four-node connectivity,SPOS|SNEG와 unique/conflicting membership rules; - nonempty immutable surface candidate commit;
- step-level
DSLOADsurface reference,P, finite signed magnitude, record/source order와 approved linear/nonlinear procedure; - finite model units/configuration prerequisites와 full scatter/dimension identity;
- formulation/numerical-review의 reference/current geometry gate
tau_J=1.0e-12, finite force/tangent/local contribution; - stable full-space reduction finite check, free/constrained projection와 accepted state/result recovery;
- 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에 보존한다:
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 |
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으로 나눠야 한다.
- Exact line/ASCII/comma/continuation/name/numeric grammar와 valid reference-style assembly ELSET surface, direct qualified member, S4/S4R, SPOS/SNEG parser acceptance.
- Every table-declared unsupported keyword/parameter/scope/member/load/procedure와 malformed cardinality/numeric failure의 stable category/source diagnostic.
- Direct/ELSET/multi-instance expansion, same-side normalization warning, conflicting-side/name/ empty/missing/ambiguous/cyclic/cross-scope failure와 immutable deterministic facet order.
- Distinct additive pressure record/source order, exact-once factor, AnalysisModel non-owning lifetime와 element-local→full-space→projection order.
- Nonfinite/geometry/scatter/reduction failure, deterministic serial/parallel contribution and diagnostic order, failed-state/final-file atomicity.
- Existing schema
0/1writer regression: no pressure-only dataset/version change; exact paths, shapes, dtypes, attributes, source identity, frame/factor and mandatory finite quantities. - Exact schema-v1 HDF5→wide CSV projection, header/raw identity policy,
729/2,187inventories, all prechecks, family dispositions, boundary/zero-scale common tolerance tests. - 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
Pnonlinear 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는 수행하지 않았다.