Integrate Hex8 mass verification and fixed-null-basis shell dynamics with numerical and physics handoff evidence. Preserve interrupted reference and full-validation status; full integration validation is deferred until after performance optimization.
14 KiB
실행·입력·결과의 외부 계약
호출과 파일 수명
fesa.exe <model.inp>
인자는 비어 있지 않은 입력 경로 하나다. 상대 경로는 호출 시 작업 디렉터리 기준으로
lexical normalization한다. 확장자 .inp는 대소문자를 구별하지 않는다. 옵션 형태 인자와
--output은 지원하지 않는다. Symlink·junction·short name을 resolve해 결과 위치를 바꾸지 않는다.
| 산출물 | 경로와 의미 |
|---|---|
| 공식 결과 | 입력의 lexical sibling <stem>_results.h5 |
| 실행 로그 | 같은 위치의 <stem>_log.txt; 실패 진단을 포함할 수 있음 |
| 쓰기 lease | 결과 경로에 .fesa.lock을 붙인 임시 소유권 파일; 정상 handle 종료 시 삭제 |
같은 output pair를 다른 실행이 점유하면 output-busy로 실패한다. Lease 생성 실패도
같은 output failure로 분류되므로 충돌 외에 OS 권한·디렉터리 상태도 확인해야 한다.
최종 HDF5는 완료 candidate의 기록·self-check·close 후 교체한다. 실패 시 이전 최종
HDF5를 보존하는 계약과 로그가 갱신될 수 있는 계약을 구별한다. 기존 파일의 존재가
새 실행 성공을 의미하지 않는다.
| CLI exit | 의미 |
|---|---|
| 0 | 선택된 해석과 최종 결과 저장 성공 |
| 2 | 잘못된 인자·입력 확장자 등 usage 오류 |
| 3 | 파일 읽기·문법·미지원 입력 오류 |
| 4 | 모델 의미·구성·유효성 오류 |
| 5 | 해법 실패 |
| 6 | Output lease·로그·HDF5 저장 실패 |
진단은 stderr에 결정적인 순서로 출력된다. 한 줄은 탭으로 구분된
severity=... code=... file=... line=... keyword=... entity_identity=... message=...
필드를 갖고 빈 source 필드도 유지한다. Backend 원래 오류 번호를 새 CLI exit로 그대로
반환하지 않는다. 경고가 있는 성공도 가능하며 성공 HDF5의 진단은 warning이다.
공통 입력 규칙
현재 입력은 하나의 physical .inp 파일이다. LF·CRLF, 빈 줄, ** comment와
keyword parameter continuation을 처리한다. Physical line은 종결자 제외 256 ASCII
bytes 이내이며 printable ASCII와 tab을 사용한다. Keyword·parameter·enum·이름 lookup은
ASCII case-insensitive이고 원문 표기와 줄 번호는 보존한다. 같은 값의 중복 parameter도
실패다. Comma의 빈 field를 없애거나 data continuation으로 연결하지 않는다.
모델은 part의 node·element·set·section, identity instance를 둔 assembly, named material,
모델 경계조건과 하나의 해석 step으로 구성한다. Instance transform, *INCLUDE, 일반
contact·MPC·비탄성·혼합 beam/shell model은 현재 공개 subset이 아니다.
| 입력 | 소비자가 지켜야 할 의미 |
|---|---|
*NODE |
Part 안의 label,x,y,z; label은 양의 정수, 좌표는 finite |
*ELEMENT, TYPE=..., ELSET=... |
구조 B33은 2개, S4/S4R은 4개 node label; 열전달 DS4는 4개. Source type과 내부 정식화 구별 |
*NSET·*ELSET |
허용 scope의 label 나열 또는 GENERATE; assembly set은 명시 instance에 결속 |
*INSTANCE, NAME=..., PART=... |
기존 part의 identity instance; transform data 미지원 |
*ELASTIC |
상수 등방 E,nu; E>0, -1<nu<0.5, finite |
*SHELL SECTION, ELSET=..., MATERIAL=... |
양의 finite thickness와 optional 양의 integration-point 정수; centered homogeneous section |
*BEAM GENERAL SECTION, ELSET=..., MATERIAL=..., SECTION=GENERAL |
첫 row A,I11,I12,I22,J, 둘째 row n1x,n1y,n1z; 현재 I12=0만 허용, 탄성은 연결 material에서 읽음 |
*SECTION POINTS |
바로 앞 beam section의 x1,x2 row 목록; 입력 순서의 stress recovery 위치, duplicate/nonfinite 거부 |
*BOUNDARY |
target,first,last[,value]; 구조 DOF 1~6, 열전달의 공개 지정온도는 DOF 11/15. 생략 value는 0. Procedure별 추가 제한 적용 |
*CLOAD |
target,dof,magnitude; 같은 resolved node/DOF는 source 순서로 합산. Procedure별 허용 DOF 적용 |
중복 label, 해소되지 않은 target, 모호한 set, 잘못된 section/material 조합과 nonfinite 값은 실패다. 이름이 같더라도 instance가 다르면 다른 entity다. 빈 optional field와 생략 field는 각 구문에서 허용한 경우에만 같으며 임의 default를 채우지 않는다. 한 procedure에서 허용하는 keyword가 다른 procedure에서도 허용된다는 뜻은 아니다.
Procedure와 하중
| 절차 | 입력·출력 및 제한 |
|---|---|
| 선형 정적 | 단일 *STATIC, 작은 변위, B33 또는 MITC4 shell. 지정 변위와 global nodal force/moment. Canonical 결과 frame 0 하나 |
| 비선형 정적 | MITC4 shell, NLGEOM=YES, full Newton. Static control data에 따른 accepted increment 이력, 유한회전과 해당 하중 의미 |
| 선형 frequency | MITC4 shell, 원형상 무응력, NLGEOM=NO, homogeneous BC, 활성 material의 양의 density. 요청 mode N개와 내부 검증 결과 |
| HHT dynamic | MITC4 shell, NLGEOM=YES, *DYNAMIC, DIRECT, 양의 density, 고정 h/T. 초기 frame 포함 전체 이력. 현재 시간수렴 미해결로 기능 검증 완료 상태는 아님 |
| 열전달 | 단일 uncoupled DS4, Q4×two-P2·5개 온도점, consistent C·Backward Euler. 구현·내부 검증 완료, 새 필수 reference 비교 대기 |
정적 *STATIC은 parameter 없이 initial_increment,time_period,minimum_increment,maximum_increment
한 row를 받으며 값은 finite positive여야 한다. Source increment 값이 물리 시간을 의미하는 것은 아니다. Linear와
nonlinear 절차의 결과 frame 의미를 구별한다. HHT의 시간 값을 static load factor로
읽지 않는다.
정적 shell 압력은 assembly-level *SURFACE, TYPE=ELEMENT, NAME=...에
instance.element,SPOS|SNEG 또는 instance-bound assembly ELSET과 side로 facet를
선언하고, step의 parameter 없는 *DSLOAD에 surface,P,value로 적용한다.
Part surface·다른 surface type·추가 parameter·*DLOAD·분포 함수는 지원하지 않는다.
양의 P는 선택한 surface normal의 반대 방향이며 음의 P는 방향을 반전한다. 선형 정적은
reference configuration, 비선형 정적은 current-configuration follower pressure와
그 external tangent를 사용한다. Global CLOAD와 같은 하중으로 치환하거나 이 압력
subset을 dynamic이나 미래 thermal에 암묵적으로 확장하지 않는다.
Frequency 입력은 *FREQUENCY의 요청 정수 N 뒤 최대 6개의 빈 field를 허용한다.
명시적인 범위·shift 등 나머지 숫자는 허용하지 않는다. EIGENSOLVER는 LANCZOS만 허용해
FEAST로 mapping하고 warning을 남긴다. NORMALIZATION은 MASS, SIM은 flag/YES,
ACOUSTIC COUPLING은 acoustic-free 모델의 ON만 허용한다. BC는 exact 0이며 하중을
modal response로 계산하지 않는다. Density는 rho 또는 rho,의 상수 양수 한 row다.
HHT는 h,T 또는 h,T, 한 row를 받는다. 양의 정수 N에 대해 double(N)*h == T,
N<=INC를 만족해야 하며 마지막 증분을 줄이거나 시간 tolerance로 맞추지 않는다.
STEP의 INC 기본값은 100이다. 계수는 alpha=-0.05,beta=0.275625,gamma=0.55,
Shell 질량 metadata는 nodal-lumped-kinetic이다. BC는 전체 시간에 exact 0, CLOAD는 DOF 1~3의 일정한
global force만 지원한다. 초기 q/v는 0이고 전체 STEP 하중이 0+부터 적용된다.
비영 초기조건, damping, amplitude, follower/distributed load와 공개 계수 변경은 현재 미지원이다.
열전달의 상수 *CONDUCTIVITY·*DENSITY·*SPECIFIC HEAT, 초기온도·일정한 지정온도·
절점 열률, 마지막 실제 delta 및 thermal HDF5는
STH 입력·결과 계약을 따른다. 구조의 물성·DOF·
displacement schema를 thermal에 적용하지 않는다. NT11/13/15는 bottom/mid/top이고
내부 station 지정 BC·edge 열입력·열-구조 연성은 현재 공개 subset이 아니다.
최초 raw 온도 frame에는 flux/반력 dataset이 없으며 완료 frame에서 각각 24개 trace와
constrained full residual을 저장한다. Flux와 반력 열률은 같은 observable이 아니다.
출력 요청의 no-op 허용은 procedure마다 다르다. 특히 HHT는 data 없는 PREPRINT의 네 NO flag, RESTART WRITE/FREQUENCY=0, OUTPUT FIELD 또는 HISTORY/VARIABLE=PRESELECT/ FREQUENCY=1 조합만 허용하며 OUTPUT의 FREQUENCY 생략은 1이다. Child NODE/ELEMENT OUTPUT은 HHT에서 미지원이다. No-op이 필수 FESA 결과의 선택·삭제·추가 권한을 주지 않는다.
HDF5 소비 규칙
Reader는 metadata의 feature identity와 version, 해당 형식에 정의된 procedure discriminator를
함께 확인한다. schema_version만 보고 static 결과로 가정하지 않는다. 기존 선형 static에는
analysis_procedure attribute가 없으므로 이를 새로 필수화하지 않는다. 알려지지 않은
형식이나 필수 dataset 누락은 명시적 오류이며 모르는 optional additive field만 무시할 수 있다.
| 결과 | 식별·주요 경로 |
|---|---|
| 선형 정적 | schema 0, feature_id=linear-static-3d-euler-beam 또는 linear-static-mitc4-shell, /steps/Step-1/frames/0/ 결과; analysis_procedure 없음 |
| 비선형 정적 | schema 1, feature_id=nonlinear-static-newton-raphson, analysis_procedure=nonlinear-static-full-newton, /steps/Step-1/accepted_frames와 /steps/Step-1/frames/<n>/ |
| Frequency | schema 0에 feature_id=mitc4-shell-feast-eigen2, analysis_procedure=linear-frequency, eigen_schema_version=1 추가 |
| HHT | feature_id=hht-implicit-dynamics, analysis_procedure=hht-implicit-dynamics, schema 1, 전체 accepted frame과 /steps/Step-1/frames/<n>/ |
| Shell 열전달 | 식별·thermal model·frame·temperature/flux/reaction의 별도 계약은 Feature PRD의 HDF5 정의를 따른다 |
Step-1은 storage slot이다. Frequency는 /steps/Step-1의 source_step_name, HHT와 열전달은
/metadata의 source_step_name에서 원래 이름을 읽는다. 기존 선형·비선형 static은
canonical step_name=Step-1만 저장하므로 원래 source 이름이 HDF5에 별도로 있다고
가정하지 않는다. Float64와 fixed-width integer는 little-endian,
문자열은 UTF-8다. Compound는 field name/type/extent로 읽고 C++ struct padding에 의존하지 않는다.
Source 입력 identity는 실제 읽은 byte의 identity를 포함한다.
/model/nodes와 /model/elements의 source instance/label과 internal ID를 사용해
결과 row를 연결한다. Internal row 번호를 원본 label로 취급하지 않는다. 구조해석의 nodal
displacement와 constraint mask의 6성분 순서는 [UX,UY,UZ,URX,URY,URZ]다. Reaction,
가속도 등 다른 dataset에는 각각의 component 이름이 있으므로 이 이름을 재사용하지 않고
단위·좌표·location·component attribute를 함께 읽는다. /model/nodal_constraint_mask의
free=0/constrained=1이 반력 해석의 기준이다.
Static nodal displacement는 [node_count,6]이다. Linear nodal reaction의 constrained
성분은 반력, free 성분은 잔차 evidence다. Shell 결과의 기본 location 축은 면내 4점,
응력의 section 축은 bottom/middle/top 3점이다. Section resultant의 8성분은
[N11,N22,N12,M11,M22,M12,Q13,Q23], 응력의 3성분은 [S11,S22,S12]다.
두 값의 단위와 위치를 서로 바꾸지 않는다. Beam 결과는 element endpoint와 단면 위치를
유지하며 node 평균 결과로 읽지 않는다.
Frequency의 /steps/Step-1/eigen/modes는 N개 mode_id,eigenvalue,classification,cluster_id
record이며 mode_id는 1부터다. frequencies는 raw eigenvalue가 비음수인 mode의
ID subset, vectors는 [N,node_count,6]의 mass-normalized mandatory projection이다.
이 벡터는 응답 변위가 아니다. 작은 음수 고유치를 abs/zero clamp하지 않으며 frequency
존재 여부를 eigenvalue와 구별한다. Static reaction·stress를 modal 결과에 요구하지 않는다.
HHT frame은 0부터 N까지이고 time=double(n)*h다. is_initial은 n=0에만 참이다.
Nodal acceleration과 algorithmic_acceleration, angular_acceleration,
generalized_reaction과 공간 reaction은 구별된 dataset이다. Accepted frame과 source
identity로 접근하고 failed trial이나 time 기반 nearest-neighbor matching을 사용하지 않는다.
열전달은 구조해석의 6성분 dataset을 재사용하지 않는다. 5개 section point 온도와 thermal constraint mask, heat flux의 좌표·위치, reaction heat rate의 부호·초기 frame 규칙은 열전달 결과 계약을 따른다. Flux 적분과 full-residual reaction을 같은 복구량으로 해석하지 않는다.
외부 비교
Comparison은 필요한 instance·entity·location·component·step/frame을 일대일 대응한다. Missing·extra·duplicate·nonfinite는 tolerance 전에 실패한다. 같은 case/step/frame/ quantity/단위/좌표/판정 영향의 값만 한 family에 넣는다.
Reference 값만으로 S=max(abs(r_i)), B=0.01*S를 정한다. abs(r_i)<=B이면
abs(f_i-r_i)<=B, 나머지는 상대오차 <=0.05를 요구한다. Family 전체의
sqrt(mean((f_i-r_i)^2))/S<=0.01도 만족해야 한다. S=0이면 모든 FESA 값도 exact 0이어야
하며 nonzero 오류는 zero-reference-scale-nonzero-error로 보고한다. 임의 floor는 없다.
MITC4 eigen 첫 구현의 named policy mitc4-eigen-first-implementation에 한해 mode별
singleton Value family의 상대오차와 RMS를 모두 5%로 판정한다. 다른 family의 RMS 1%나
내부 eigen 검증 기준을 바꾸지 않는다. MITC4 U는 blocking, UR는 warning-only이며 warning도
결정적 순서로 남긴다. 사전검사 실패는 warning-only family에서도 전체 실패다.
CSV view는 비교 보조 산출물이다. FESA 공식 output으로 대체하거나 reference 값을 보정하는 중간 형식으로 사용하지 않는다.