Files
FESADev/docs/hex8-structural-analysis/PRD.md
T

33 KiB
Raw Blame History

Hex8 구조해석 제품 요구사항

Feature ID: hex8-structural-analysis. 작성일: 2026-10-08. 상태: 사용자 승인된 구현 계약; 검증 완료 대기. 기준 저장소: dev, 2382d3af7ef335bef216d963540f2e9bd2befd68.

목적과 선택 이유

개인 연구용 FESA에 8절점 육면체의 선형 강성, 기하비선형 내력·접선 강성, 일관 질량을 구현하고 입력부터 정적·고유치·동해석과 HDF5 결과까지 연결한다. 요소 행렬 계산만으로 완료하지 않는다. 기존 프로젝트를 유지하며 새 프로젝트 기준을 재작성하지 않는다.

첫 구현은 큰 회전·작은 탄성 변형률을 대상으로 한다. 전체 8점 적분과 Total Lagrangian St. Venant–Kirchhoff 식을 선택해 에너지·내력·접선의 일관성을 독립 검증한다. 일관 질량은 고유치와 동해석 모두에 사용한다. 집중 질량이나 안정화로 계산 결과를 맞추지 않는다. 일반 등매개 육면체를 지원하지만 full integration의 굽힘·체적 잠김 한계는 공개한다.

초기 합의의 일정 동하중에 더해, 제공된 reference의 ramp를 처리하도록 구간별 선형 집중력 amplitude를 포함한다. 지정 변위의 시간 변화나 비영 초기 변위·속도까지 확대하지 않는다.

상위 기준: 공통 요구, 구조, 외부 계약, 수치 정책, 기능 기록. 기존 상세 계약을 구현 편의로 덮어쓰지 않는다.

지역 지침과 문서 목록은 FEATURED_AGENTS, 결정은 ADR, 상세 유도는 formulation, 입력/내부 API는 io, 수치 controls는 numeric-controls, 원본 mapping은 reference-model을 따른다.

요구사항과 계산 계약

FEM-REQ-HEX8-001 — 지원 해석과 모델

육면체 단독 모델에서 선형 정적, 기하비선형 정적, 원형상·무응력 선형 frequency, 선형 및 기하비선형 HHT 동해석을 지원한다. 한 입력에 단일 step·단일 procedure이며 기존 Part/identity Instance·target/set subset을 재사용한다. 혼합 Beam/Shell/Solid 모델은 거부한다. 서로 다른 유효한 영역에 재료를 배정할 수 있지만 한 요소 내부의 재료는 균질하다.

FEM-REQ-HEX8-002 — 요소·형상·순서

Source C3D8을 FESA Hex8로 연결하고 source 표기·instance·element/node label을 보존한다. C3D8R, C3D8I, C3D8H, 20절점 요소를 alias로 수용하지 않는다. 요소는 서로 다른 8개 절점과 병진 [UX,UY,UZ]를 가지며 local 행렬은 node-major 24×24다.

자연 좌표 절점 순서는 다음과 같다.

절점 ξ η ζ
1 -1 -1 -1
2 +1 -1 -1
3 +1 +1 -1
4 -1 +1 -1
5 -1 -1 +1
6 +1 -1 +1
7 +1 +1 +1
8 -1 +1 +1

(N_a=(1+\xi_a\xi)(1+\eta_a\eta)(1+\zeta_a\zeta)/8), (X=\sum N_aX_a), (u=\sum N_au_a). J0의 column은 자연 좌표에 대한 X 미분이다. (G_a=\nabla_XN_a=J_0^{-T}\nabla_\xi N_a)를 사용한다. 뒤틀린 면·기울어진 모서리를 허용한다. 비유한·중복/퇴화 절점, 반전·접힌 형상은 거부한다. 유효성은 자연 cell의 양의 Jacobian을 확인하는 보수적 검증으로 정의하고, 적분점만 양수인 접힌 cell을 정상으로 선언하지 않는다. 양성을 판정하지 못한 형상은 명시적 진단으로 거부한다. 현재 형상의 반전도 trial 실패다. abs(det J)·절점 재배열·epsilon 보정은 금지한다.

FEM-REQ-HEX8-003 — 재료와 단위

상수 등방성 탄성 (E>0,-1<\nu<0.5)와 기준 밀도 (\rho_0>0)를 사용한다. 모든 값과 파생 Lamé 상수는 finite여야 한다. 밀도는 고유치·동해석에서 필수이며 정적 입력의 양의 density는 보존하되 강성에 사용하지 않는다. 입력 일관 단위를 유지한다. (\mu=E/[2(1+\nu)]), (\lambda=E\nu/[(1+\nu)(1-2\nu)])다. 거의 비압축성인 입력을 다른 재료식으로 바꾸지 않으며 잠김과 conditioning을 구분해 보고한다.

FEM-REQ-HEX8-004 — 적분 규칙

강성·내력·접선·질량·에너지에 동일한 2×2×2 Gauss 규칙을 사용한다. 각 축은 ±1/√3, weight=1이며 volume weight는 det J0다. 출력 point ID는 1:---, 2:+--, 3:-+-, 4:++-, 5:--+, 6:+-+, 7:-++, 8:+++ 순서다. 절점 순서와 적분점 순서를 혼동하지 않는다. 감소 적분·선택적 체적 적분·hourglass 항은 없다. 일반 뒤틀린 요소에서 8점 질량이나 비선형 적분이 연속체 적분과 항상 exact하다고 주장하지 않는다. 높은 차수 적분 oracle는 정확도·한계의 검사이며 production 규칙의 자동 변경이 아니다.

FEM-REQ-HEX8-005 — 선형 강성

미소변형률 (\epsilon=\operatorname{sym}\nabla_Xu), (\sigma=\lambda\operatorname{tr}\epsilon I+2\mu\epsilon). 공학 전단 벡터 순서는 [ε11,ε22,ε33,2ε12,2ε13,2ε23], 응력은 [S11,S22,S33,S12,S13,S23]다. 일의 짝이 되는 B0와 C를 사용해 (K_0=\sum_g B_{0g}^TCB_{0g}\det J_{0g}), (f_{int}=K_0u)를 계산한다. 대칭성·6개 강체 영모드·상수 변형률 patch·단위와 scale을 독립 검증한다.

FEM-REQ-HEX8-006 — 비선형 내력과 접선

기준 형상에서 (F=I+\sum_a u_a\otimes G_a), (E_G=(F^TF-I)/2), (W=\lambda(\operatorname{tr}E_G)^2/2+\mu E_G:E_G), (S=\lambda\operatorname{tr}E_GI+2\mu E_G), (P=FS)다. (f_{ai}=\sum_g P_{iJ}G_{aJ}\det J_{0g})와 같은 에너지의 일관 미분 (K_t=K_{mat}+K_{geo})를 반환한다.

[ A_{iJkL}=\delta_{ik}S_{LJ}+F_{iI}\mathbb C_{IJLN}F_{kN},\qquad (K_t){ai,bk}=\sum_gG{aJ}A_{iJkL}G_{bL}\det J_{0g}. ]

(\mathbb C_{IJLN}=\lambda\delta_{IJ}\delta_{LN}+\mu(\delta_{IL}\delta_{JN}+\delta_{IN}\delta_{JL})). 기하 항은 (\delta_{ik}G_a^TSG_b), 나머지는 재료항이다. Kgeo만으로 전체 비선형 강성을 대체하지 않는다. 내부 API는 두 항과 합, 내력·에너지·복구량을 구별한다. 같은 trial에서 계산하며 유한차분 접선을 production 계산으로 사용하지 않는다. 강체 유한회전의 zero strain/energy, 에너지 gradient·내력 tangent, 좌표 공변성, 선형극한을 검사한다.

FEM-REQ-HEX8-007 — 일관 질량

((M_e){ai,bj}=\delta{ij}\sum_g\rho_0N_aN_b\det J_{0g})를 사용한다. 기준 형상과 밀도로 정해져 변형·시간에 따라 바뀌지 않으며 회전 자유도·drilling 관성은 없다. 고유치와 동해석은 같은 전역 일관 M을 사용한다. Row-sum lumping·nodal block 치환은 금지한다. 대칭 양정성·각 병진 방향 총질량·좌표 회전·독립 적분을 검증한다. 전역 행렬은 sparse로 조립한다.

FEM-REQ-HEX8-008 — 경계와 집중력

실제 *BOUNDARY와 *CLOAD 성분은 DOF1–3이다. Solid-only 입력 호환 예외로 지원 displacement *BOUNDARY의 DOF4–6 exact-zero(생략된0 포함)만 source/location을 남기는 명시적 warning/no-op으로 수용한다. 범위1–6은1–3을 적용하고4–6만 경고한다. 회전 equation·constraint·state는 만들지 않는다. 비영 회전 BC, DOF4–6 CLOAD(값0 포함), DOF1–6 밖의 경계와 의미 있는 미지원 BC 옵션은 계속 거부한다. 정적은 영/비영 지정 변위를 지원하고, 선형은 (K_{ff}u_f=F_f-K_{fc}u_c)다. 비선형 정적에서는 지정 값과 외력을 같은 load factor로 증가시켜 이전 accepted 상태에서 Newton을 수행한다. 동해석은 고정 exact-zero 경계만 지원한다. 동일 resolved node/DOF의 집중력은 source 순서로 합산한다. 모든 자유도가 constrained인 유효한 모델은 empty free system으로 처리한다. 미구속 자유 강체의 정적 특이성은 질량·임의 고정점으로 보정하지 않는다.

FEM-REQ-HEX8-009 — 동하중 amplitude

육면체 dynamic에서 모델-level *AMPLITUDE, NAME=...의 TABULAR, STEP TIME, VALUE=RELATIVE만 지원한다. 각 선택자는 생략 시 이 값이며 명시된 동일 값도 허용한다. 유일한 이름과 한 개 이상 finite (t,A) pair, t>=0·strictly increasing 시간을 요구한다. 한 row의 여러 pair와 여러 data row를 허용한다. Knot은 원 값, 내부는 구간별 선형 보간, 범위 밖은 첫/마지막 값 유지다. Unresolved/duplicate 이름, 같은 시간, 역순·홀수 항목, nonfinite, 다른 정의·시간 기준·값 종류·smoothing 옵션은 명시적 실패다.

*CLOAD, AMPLITUDE=name의 (F(t)=A(t)F_{base})를 source 순서로 합산한다. 각 load block의 curve를 보존하며 서로 다른 curve를 미리 하나의 base force로 합치지 않는다. Amplitude 없는 CLOAD는 0+부터 일정 하중이다. 표의 첫 시간/값을 강제로 0으로 만들지 않는다. 현재 reference Amp-1은 (0,0),(0.1,1),(10,1)이다. 지정 변위 amplitude와 static amplitude, TOTAL TIME·SMOOTH STEP·주기 하중·물리적 damping은 이번 범위가 아니다.

FEM-REQ-HEX8-010 — 공개 입력과 CLI

기존 lexical/source identity를 재사용하고 *SOLID SECTION, ELSET=..., MATERIAL=...와 생략 또는 blank data row를 허용한다. Thickness/plane stress/axisymmetric 의미를 추가하지 않는다. *STATIC과 *STATIC, DIRECT의 고정 증분 subset을 지원한다. DIRECT의 h,T가 양수이며 N*h==T, N<=INC를 만족해야 한다. 일반 STATIC의 기존 load-factor subset도 유지한다. *FREQUENCY의 mode 수가 권위이며 Lanczos/SIM source 옵션은 실제 MKL FEAST와 구별한다. *DYNAMIC, DIRECT는 NLGEOM=NO 또는 YES, 고정 h/T와 INC를 지원한다. Static/frequency/dynamic 각각의 기존 무해한 출력 요청 subset 및 제공 원본의 PRESELECT 요청을 명시적으로 검증한다. Output no-op이 필수 결과의 삭제·선택 기능이 되지 않는다. 기존 CLI 입력·lexical sibling 결과/로그 경로·exit category를 유지한다.

FEM-REQ-HEX8-011 — 소유권과 전역 조립

Domain은 의미·재료/section·topology·amplitude를, DofManager는 3N full/free mapping과 scatter/pattern을, element는 local 계산을, analysis는 state/trial/commit을 소유한다. 공유 sparse 직접 쓰기 없이 source 순서의 결정적 누적을 유지한다. 6N Shell layout이나 회전 영공간에 Hex8을 끼워 넣지 않는다. 사용되지 않는 절점·잘못된 scatter는 fail-closed다.

내부 C++ API의 행동 계약은 다음과 같다. 구체적인 class/method 이름은 구현 계획의 영역이다.

연산 입력·출력과 불변량
요소 생성 검증된 source topology·기준 좌표·재료로 immutable 요소 생성; 실패는 기존 Result/Status
선형 평가 K0[24,24]·M[24,24], 주어진 u[24]의 f[24]·W·8점 복구량
비선형 trial 평가 u[24]에서 f[24], Kmat/Kgeo/Kt[24,24], W, 8점 Cauchy/Green tensor; 호출이 accepted state를 변경하지 않음
조립·절차 실행 Domain과 3N DOF mapping으로 sparse K/M 및 검증된 procedure별 결과; source 순서 유지
기록 완결된 accepted 결과만 받는 Solid writer; 검증 실패 시 기존 final 파일 보존

길이·성분 불일치와 nonfinite trial을 실패로 반환하며 vendor handle/type은 공개 API에 노출하지 않는다.

FEM-REQ-HEX8-012 — 선형 정적

Kff solve 후 prescribed 값을 정확히 복구하고 full residual K0u-F를 계산한다. Constrained 성분은 반력, free 성분은 평형 잔차이며 서로 별도 dataset으로 보존한다. 완료 load factor의 결과를 frame0으로 저장한다. 빈 free solve와 solver 실패를 구별한다.

FEM-REQ-HEX8-013 — 비선형 정적

Accepted 증분별 q·내외력·응력·에너지와 convergence evidence를 보존한다. Newton은 (f_{int}(u)-F)의 free residual과 일관 tangent를 사용한다. 불안정 tangent를 SPD라고 가정하지 않는다. Recovery까지 검증한 candidate만 accept하며 실패 증분은 공개하지 않는다. 현재 일반 Newton controls를 재사용할 때 물리 3성분·force/length 단위에 맞는 적용을 검토한다. 회전·모멘트의 dummy channel은 만들지 않는다. 초기 tuning default는 기존 정적 기준의 force residual/translation correction 상대 1e-2, scale0 absolute 1e-3의 해당 입력 force/length 단위, 증분당 최대100 iteration이다. 분모·분자·branch·단위·판정을 남긴다. 내부 solver tuning 조정은 독립 검토와 재검증을 기록하며 외부 acceptance를 바꾸지 않는다.

FEM-REQ-HEX8-014 — 일반화 고유치

실제 동차 경계 적용 후 (K_{ff}\phi=\omega^2M_{ff}\phi)의 최저 N 모드를 구한다. 반복 고유치를 제거하지 않고 실제 3N 공간으로 복구해 mass-normalize한다. 해석 출력에는 lambda, frequency, mode vector와 residual/Gram evidence를 구별한다. 음수값을 abs/clamp하지 않는다. 강체 모드·cluster 경계·모드 누락·empty free/과도한 N을 검증한다. (|K\phi-\lambda M\phi|/[(|K|+|\lambda||M|)|\phi|]), (|\phi^TM\phi-1|)와 mass Gram 오차는 1e-10 이하를 요구하며 zero denominator는 exact-zero 분기로 처리한다. 모든 backend 반환 pair를 검증한 뒤 공개 N을 선택한다. Shell 전용 nodal whitening을 일관 M에 적용하지 않는다. 실제 generalized-SPD sparse FEAST 또는 일관 문제를 정확히 보존하는 변환을 사용한다. Sparse pencil을 바꿔 수렴시키지 않는다.

FEM-REQ-HEX8-015 — HHT 동해석

초기 q/v=0, constrained q/v/a/A=0이다. (M_{ff}a_{0f}=F_f(0+)-f_{int,f}(0)), (A_0=a_0)로 초기화한다. Amplitude가 0이면 그 초기 힘을 그대로 사용한다. 공개 계수는 기존 HHT의 alpha=-0.05, beta=0.275625, gamma=0.55다. Predictor/Newmark 갱신은 auxiliary A를 사용하고 (A_{n+1}=(1+\alpha)a_{n+1}-\alpha a_n)로 physical a와 구별한다.

[ R=M A_{n+1}+(1+\alpha)(f_{n+1}-F(t_{n+1}))-\alpha(f_n-F(t_n)), \quad K_{eff}=M/(\beta h^2)+(1+\alpha)K_t. ]

이 weighted residual은 이전 physical endpoint 평형을 포함하며, 같은 관계로 환산한 endpoint 잔차를 쓰는 것도 동등성 검증을 전제로 허용한다. 서로 다른 표현의 tangent와 reaction을 혼용하지 않는다. Amplitude는 실제 각 endpoint에서 평가하고 한 step의 힘을 고정해두거나 잘못된 시간에서 한 번만 평가하지 않는다. 질량은 상수이므로 Shell의 회전 chart·moving-null·convective 관성은 이 절차에 없다. 선형은 K0, 비선형은 Kt를 사용한다. 물리 반력은 constrained (Ma+f_{int}-F(t)), free endpoint residual은 별도 evidence다. 초기부터 마지막까지 n=0..N, time=double(n)*h, exact schedule N*h==T를 유지한다. 마지막 증분 축소·adaptive time·restart는 지원하지 않는다. 동적 초기 tuning default는 기존 HHT의 normalized residual/correction 1e-10, Newmark update 일치 1e-12, 증분당 최대100 iteration이다. Force 잔차의 scale은 같은 endpoint의 uncancelled inertia/internal/external force로 만들며 scale0은 exact-zero다. Correction은 기준 형상의 양의 길이 L로 u를, L/h와 L/h²로 v와 physical/auxiliary a를 정규화해 각각 확인한다. 회전 channel을 복제하거나 잔차를 보정한 뒤 accept하지 않는다.

FEM-REQ-HEX8-016 — 응력·변형률 복구

8개 적분점에서 선형 global Cauchy stress·미소변형률, 비선형 (\sigma=FSF^T/\det F)와 기준 global Green–Lagrange strain을 복구한다. Tensor strain 성분은 [11,22,33,12,13,23]의 실제 shear이며 B 계산용 engineering shear와 구별한다. 적분점 평균·절점 외삽·nodal smoothing을 하지 않는다. Cauchy stress와 PK2를 같은 이름으로 저장하지 않는다. 기본 공식 응력은 Cauchy다. Frequency의 mode vector를 물리 응답 변위/응력으로 복구하지 않는다.

FEM-REQ-HEX8-017 — HDF5 계약

새 형식은 /metadata의 feature_id=hex8-structural-analysis, schema_version=1과 analysis_procedure로 식별한다. 값 집합은 linear-static, nonlinear-static-full-newton, linear-frequency, hht-linear-dynamics, hht-nonlinear-dynamics다. element_formulation=FESA-Hex8, integration_rule=gauss-2x2x2, mass_formulation=consistent-reference, source step 이름·입력 byte identity·단위 의미를 보존한다.

Model row의 source instance/label은 기존 model identity 의미를 유지하되 Solid topology/section 분기를 추가한다. Node row는 Domain 선언 순서다. /model/nodal_constraint_mask는 U8[N,3], free0/constrained1이다. 다음 mandatory compound field 순서와 dtype을 사용한다. U64/U8/F64는 각각 unsigned 64/8-bit integer와 Float64 little-endian이며 문자열은 UTF-8다.

model 경로 field 순서·dtype
/model/nodes internal_node_id:U64, instance_name:string, source_label:string, coordinates:F64[3]
/model/elements internal_element_id:U64, instance_name:string, source_label:string, source_element_type:string, internal_formulation:string, node_internal_ids:U64[8], solid_section_internal_id:U64, material_internal_id:U64
/model/solid/materials internal_material_id:U64, name:string, youngs_modulus:F64, poisson_ratio:F64, density_present:U8, density:F64
/model/solid/sections internal_section_id:U64, source_file:string, source_line:U64, source_elset:string, material_internal_id:U64
/model/solid_integration_points internal_element_id:U64, point_id:U8, natural_coordinates:F64[3], reference_coordinates:F64[3]

Internal ID는 각 inventory의 zero-based index이고 point ID는1–8이다. 요소는 Domain 선언 순서, integration-point row는 element-major/point-major다. density_present는0/1이고 부재 시 density=0은 저장 placeholder이며 해석 밀도로 사용하지 않는다. 필수 밀도 절차에서는 부재를 writer 이전에 거부한다. 원본 positive density가 있는 정적 모델은 이를 그대로 기록한다.

경로 또는 frame 상대 경로 shape / 의미
/steps/Step-1/accepted_frames 아래 정의한 비선형 정적/동적 compound table
/steps/Step-1/frames/<n>/nodal/displacement [N,3], U1/U2/U3
nodal/reaction / nodal/residual 각각 [N,3], 반력은 free exact0, residual은 full endpoint/static residual
solid/stress / solid/strain [E,8,6], point 순서·global frame·Cauchy 또는 Green/infinitesimal 의미 attribute
global/strain_energy scalar; accepted physical elastic energy
동적 nodal/velocity, acceleration, algorithmic_acceleration 각각 [N,3], V·physical a·auxiliary A
동적 global/kinetic_energy, external_work, energy_balance_error scalar; 서로 다른 양, 계산 정의 attribute
동적 global/linear_momentum, angular_momentum [3], global O=(0,0,0) 기준
/steps/Step-1/eigen/modes, frequencies, vectors 아래 정의한 mode records, frequency subset, F64[Nmode,Nnode,3] mass-normalized vector

위 Step-1은 기존 storage step key이고 source step 이름은 metadata에 별도 보존한다. 모든 물리 배열·scalar는 F64다. Accepted table은 아래 field를 정확히 이 순서로 가진다.

  • 비선형 정적: frame_index:U64, increment_index:U64, load_factor:F64, iteration_count:U64, is_factor_one:U8.
  • 동적: frame_index:U64, increment_index:U64, time:F64, iteration_count:U64, is_initial:U8.

Flag는0/1이다. Static linear에는 accepted table이 없다. 비선형 정적 frame0은 첫 accepted 증분이고 baseline factor0은 공개 frame이 아니다. Dynamic은 frame=increment=n, initial의 iteration_count=0이며 이후 값은 실제 accepted Newton/선형 solve 횟수다. Final-static flag는 마지막 factor1 frame에만1이다.

Eigen modes는 mode_id:U64, eigenvalue:F64, classification:U8, cluster_id:U64, frequencies는 mode_id:U64, frequency:F64다. Mode/cluster ID는1부터 증가하며 mode는 lambda 오름차순이다. Classification 집합은0=rigid-near-zero, 1=positive다. 검증된 near-zero 음수 lambda도 원 값으로 남기고 frequency row를 만들지 않으며 유의한 음수는 solver failure다. Nonnegative lambda에만 frequency=sqrt(lambda)/(2*pi)를 기록한다. 초기 tuning default는 lambda_scale=max_i(abs(Kff_ii)/Mff_ii)에서 abs(lambda/lambda_scale)<=1e-9를 near-zero, 인접 normalized gap >1e-8을 새 cluster로 분류한다. 양의 M diagonal과 finite positive lambda_scale을 확인한다. 이 scale은 FEAST interval의 스펙트럼 상한으로 주장하지 않는다. 기능 numeric-controls에 scale·설정·독립 검증을 기록하고 저장 lambda를 보정하지 않는다. /steps/Step-1/eigen/verification/pairs는 backend가 반환한 모든 검증 pair의 table이며 sorted_rank:U64, solver_column:U64, eigenvalue:F64, modal_mass:F64, rayleigh_quotient:F64, eta_r:F64, eta_norm:F64, eta_energy:F64다. Backend column은0-based, rank는1-based다. 같은 verification group의 eta_gram, max_eta_orth는 F64 scalar다. Backend 고유 trace는 기존 공개 의미로 추가 기록할 수 있으나 필수 original K/M 검증량을 다른 operator의 잔차로 대체하지 않는다.

Static frame0은 완료 결과, nonlinear static frame은 accepted 증분, dynamic frame0은 initial이다. Frequency에는 static/dynamic frame dataset을 요구하지 않는다. 각 결과에 component_names, unit dimensions, coordinate/location, step/frame/time 또는 load_factor 의미를 명시한다. Self-check는 위 dtype/field 순서·shape·identity·flag·finite·frame schedule와 accepted 값의 readback 일치를 검증한다. 기능 I/O 문서는 이 계약을 상세화하며 다른 field 집합으로 바꾸지 않는다. 기존 Beam/Shell/Thermal 파일의 required dataset이나 schema를 바꾸지 않는다. Full/element matrix dump는 공식 결과에 포함하지 않는다.

FEM-REQ-HEX8-018 — 물리 수지와 에너지

정적은 힘·모멘트 평형, 동적은 운동량 변화율과 applied/support 힘·모멘트를 검사한다. Consistent M으로 (T=v^TMv/2), (U=\sum W_g\det J_{0g})를 계산한다. 외력 일은 endpoint force와 displacement increment의 trapezoid 누적이며 초기0, energy_balance_error=T+U-T0-U0-Wext다. 현재 BC는 동적 exact0여서 support work=0이다. HHT의 알고리즘 소산과 quadrature에 따른 work 오차를 설명하며 각 frame exact conservation을 강제하지 않는다. Alpha0 내부 검사에서는 선형 무하중 보존을 독립 확인한다. Moment와 angular momentum은 현재 위치와 consistent interpolation의 kinetic 식으로 평가한다.

FEM-REQ-HEX8-019 — 실패와 진단

미지원 physics/옵션, geometry/trial 반전, 비유한 값, singular/invalid matrix, 수렴 실패, backend resource 실패를 source/entity와 함께 명시적으로 보고한다. Invalid model과 solver failure, output failure를 기존 category로 구분한다. 실패 candidate는 마지막 accepted state/history와 기존 final HDF5를 변경하지 않는다. Write·readback·close·atomic replace 실패를 검사한다. 로그 보존과 final 결과 보존은 서로 다른 계약이다.

FEM-REQ-HEX8-020 — 결정론

Serial/parallel local 계산에서 source identity·equation/scatter·ordered reduction·결과 row와 진단 순서를 재현한다. 같은 수치 설정에서 반복 실행 결과를 검증한다. Modal sign은 최대 절대 성분의 최초 source-order index를 양수로 고정한다. 반복 고유값의 벡터별 일치는 외부 비교하지 않으며 해당 공간의 mass Gram·residual·subspace 불변량으로 검증한다.

검증과 완료 조건

FEM-REQ-HEX8-021 — 독립 수치·물리 검증

정식화·numeric controls를 독립 검토한 뒤 의미 있는 local/integration 검사를 수행한다. 검사 oracle는 production 식·assembly를 단순 복제하지 않는다. 최소 사례는 다음과 같다.

  1. 정육면체의 독립 정확 적분 K/M, 다항 patch, 6 rigid modes, total mass·scale·좌표변환.
  2. 비대칭 왜곡·뒤틀린 요소의 Jacobian, folded/inverted/degenerate 및 비유한 입력.
  3. 유한 rigid rotation과 strained-then-rotated 상태, 에너지 gradient·tangent directional difference의 step sweep, Kmat/Kgeo 분리와 zero-state Kt=K0.
  4. 비영 BC·전체 구속·static singular 모델·성공/실패 state와 HDF5 보존.
  5. 실제 generalized K/M 고유쌍의 독립 dense 작은 모델 oracle, density scaling, clustered/rigid modes·최저 N·original-free residual/Gram.
  6. 선형 oscillator의 해석해 및 alpha0, amplitude knot 전/정확/후·초기 a·서로 다른 curve, 비선형 constant-mass 제조해의 전체 u/v/physical a 시간수렴.
  7. 실제 Hex8 mesh의 h/h2/h4 응답·가속도·힘/모멘트/에너지 수지, 큰 회전과 작은 strain, spatial mesh refinement·full-integration 잠김 한계, serial/parallel 결정론.

내부 zero/noise scale과 conditioning 기준은 수식·정밀도·oracle에 근거한 기능별 numeric controls로 정하고 독립 검토한다. 외부 5%/1%를 내부 정확성 기준으로 사용하지 않는다. 시간수렴은 변위만 맞는 사례로 대신하지 않으며 유의한 오차 구간과 미분량 차수를 함께 판정한다.

FEM-REQ-HEX8-022 — 필수 reference

2026-10-08 확인된 원본은 reference/hexa/다. 모두 read-only다.

case 입력 결과·필수 family
선형 정적 hexa_linearstatic.inp _U.csv, _RF.csv, _S.csv: 완료 frame의 U1–3, constrained RF1–3, Cauchy S 6성분
비선형 정적 hexa_nonlinearstatic.inp 동일 suffix: 완료 load-factor frame의 U·RF·적분점 Cauchy S
선형 동적 hexa_dynlinear.inp hexa_dynlinear_U.csv: initial 포함 101 frame U1–3 전체
비선형 동적 hexa_dynnonlinear.inp hexa_dynnonlinear_U.csv: initial 포함 101 frame U1–3 전체
Frequency hexa_freq.inp 원본 modal Value 결과 아직 없음. 사용자 준비 자료로 최저10 modes를 비교해야 함

현재 inventory는 442 nodes, 300 elements다. 정적 U/RF 각442행, 수정된 정적 S 각2400행의 IntPt=1..8, 동적 U 각각44642행이다. 기존 elemental-nodal 응력 CSV의 위치 계약을 사용하지 않는다. 동적 V/A·reaction/energy reference는 없으므로 독립 검증이 필수다. 필요한 고유치 원본이 없으면 그 비교는 미실행이고 전체 기능 완료도 대기다. 원본 추가 전이라도 독립 구현·검증 작업은 계속할 수 있다.

FEM-REQ-HEX8-023 — 비교 identity와 수치 정책

Nodal key는 case/source step/increment/instance/node/component, stress key는 case/source step/frame/instance/element/IntPt/component다. CSV header의 공백은 lexical 정규화하되 source row를 삭제·평균하거나 nonfinite를 보정하지 않는다. 좌표와 point convention은 원본 precision을 고려한 보조 검증이며 nearest-position matching으로 ID를 추정하지 않는다. Dynamic은 integer increment로 대응한 뒤 각 source decimal time과 binary64 n*h schedule을 검증한다. Static은 마지막 factor-one frame에 대응하고 storage frame 번호가 같다고 가정하지 않는다.

정적 U-global·RF-global·S-global은 서로 다른 blocking family, 동적 U-global은 frame별 blocking family다. RF는 원본 전체442행 inventory를 먼저 확인한 뒤 실제 constrained components를 투영한다. Free RF를 FESA free residual로 비교하지 않는다. S는 각 case/frame의 300×8×6을 포함한다. Modal Value는 mode별 singleton blocking family이며 외부 mode-shape 비교는 비목표다. Missing/extra/duplicate/identity/nonfinite 오류는 tolerance 이전 실패다. 공통 정책의 S=max|reference|, B=.01S, 일반 row relative≤.05, family RMS/S≤.01, S=0 exact-zero를 적용한다. MITC4 eigen의 RMS5% 예외는 육면체에 적용하지 않는다. Source C3D8의 입력 호환성과 Abaqus 내부 integration/constitutive/time-algorithm 동등성은 서로 다르다. 불일치 시 정식화·reference identity·절차를 조사하며 acceptance를 임의 완화하지 않는다.

FEM-REQ-HEX8-024 — 회귀·완료 판정

구현 완료 시 실제 설정의 MSVC x64 Debug 전체 build/CTest와 필수 reference 비교, 독립 수치·물리 검토가 필요하다. 최신 source revision·명령·native exit·metric·hash를 기록한다. 모든 신규/영향 검사 PASS, 모든 필수 reference PASS, 미해결 신규 physics 오류0이 완료 조건이다. 기존 HHT C08 두 FAIL·C04a SKIP의 과거 기록은 baseline으로 직접 재확인하고, 동일하다면 기존 미해결로 별도 보고한다. 전체 suite를 green이라 부르거나 제외 실행으로 대체하지 않는다. 기존 오류를 새 오류와 섞거나 현재 작업의 성공을 위해 Shell/Thermal 수식·policy를 변경하지 않는다. Reference·필수 실행이 대기라면 구현/내부 검증 완료와 기능 검증 완료를 분리한다.

범위 밖

20절점·tetra·wedge·hybrid/incompatible/reduced 요소, lumped 선택 API, 큰 strain용 다른 재료·소성·contact·물리 damping·압력·중력·체적력·시간변화 BC·비영 초기 q/v, mixed mesh·Shell–Solid 연결·prestressed modes·좌굴·다중 step/restart·adaptive/explicit dynamics, 열-구조 연성·matrix dump·외부 배포·release-readiness는 포함하지 않는다.

방법과 자료의 한계

StVK는 선택한 탄성 regime의 FESA 모델이며 Abaqus *ELASTIC, NLGEOM=YES와 내부 유한변형 재료 알고리즘이 동일하다고 주장하지 않는다. Full 8점은 Abaqus C3D8의 체적 처리까지 그대로 재현하겠다는 선택이 아니다. 제공 결과의 일치만으로 다른 regime을 보증하지 않는다.

Amplitude의 step-time·상대 값·선형 보간·끝 값 유지 의미는 Abaqus 공식 설명을 따른다. Generalized sparse FEAST의 공개 진입점은 Intel 공식 문서에서 확인했다. 이는 설치 runtime·빈 interval·workspace·정식화 검증 evidence를 대신하지 않는다.

현재 checklist

2026-10-09 사용자 A 승인은 내부 정밀도 변경안의 전체 high+low 물리 상태와 Float64 반올림 observable을 FEM-REQ-HEX8-015·017–020에 적용한다. HHT 식·기준 consistent M·입력·고정 schedule·100회·Si/exact-zero·원래 strict gate 및 외부 tolerance는 유지한다. 아래 구현·검증 checklist는 이 승인만으로 완료되지 않는다.

  • 수식·입출력·numeric controls·원본 mapping 정리 및 독립 numerical review 완료
  • Hex8 K0/consistent M/비선형 f/Kmat/Kgeo/Kt·형상·복구 kernel 검증
  • Solid Domain/parser/3N DOF/ordered assembly/amplitude 검증
  • 선형·비선형 정적 accepted state/반력/잔차 검증
  • Generalized consistent-mass frequency·최저 N·original-pencil 검증
  • 선형·비선형 HHT u/v/physical a·시간수렴·수지 내부 검증
  • 공식 HDF5/CLI/self-check/실패 final 보존 검증
  • 정적2·동적2 원본 필수 family 비교 PASS
  • 사용자 원본 최저10 modal Value 제공 및 필수 비교 PASS
  • 최신 전체 MSVC Debug build/CTest·기존 baseline 대조 완료
  • Independent numerical/physics blocker0·범위/한계/evidence 기록 완료

Local kernel과 입력·3N mapping은 독립 검토 및 연결 후 관련180개 검사를 통과했다. 정적 구현 a34466f의 관련98개와 고유치 구현 0e07b4d의 관련48개 검사가 각각 native CTest exit0이며 독립 수치 검토를 통과했다. 두 정적 원본과442절점 고유치 원본은 직접 API로 실행했지만 원본 결과값 비교를 수행한 것은 아니다. 연결 source 28be39f의 전체 MSVC Debug build는 exit0이며 이 build 자체를 전체 CTest 통과로 해석하지 않는다. 과거 단일 Float64 구현 f661864는 관련76개 검사와 독립 수치 검토를 통과했지만, 두 동적 원본의 세 번째 증분에서 strict gate를 만족하지 못했다. 이 실패는 lessons에 보존하며 현재 방식의 결과와 구분한다. 승인된 전체 high+low 구현 c49cae4는 소규모32/32 및 별도 성공한 LIN/TL·SDOF/MDOF 시간수렴 사례와 독립 numerical/physics 검토를 확보했다. Root 연결 후 관련49/49와 추가 직렬/TBB low 일치1/1 검사도 native build/CTest0/0이다. 두 원본의 초기 상태와 증분1–3은 unchanged schedule로 관측했고, 원래 모든 free 성분의 전체 pair 물리 gate를 독립 재계산했다. 이 관측은 네 번째 증분 전에 종료했으며 전체101 endpoint 완료가 아니다. 상세 범위와 한계는 수치 검토, 물리 검토에 있다. 공식 결과·외부 비교·최신 전체 회귀도 남아 있다. 원본 frequency 결과 부재는 구현 진행을 막지 않지만 기능 검증 완료를 막는다.