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

47 KiB
Raw Blame History

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:

  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되어야 한다.

지원 예:

*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
  • *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 보존
*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하고 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에 보존한다:

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으로 나눠야 한다.

  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는 수행하지 않았다.