131 lines
9.9 KiB
Markdown
131 lines
9.9 KiB
Markdown
# Hex8 구조해석
|
||
|
||
## 범위와 현재 근거
|
||
|
||
8절점 육면체 C3D8의 요소당24 병진 DOF로 선형/비선형 정적, unstressed generalized
|
||
고유치와 선형/비선형 HHT 동해석을 제공한다. 2026-10-10 mean-volume 강성과 10-11 row-sum lumped 질량을 승인했다. **Mean-volume 강성·
|
||
reference row-sum lumped 질량**이 현재 정책이다. 현재 구현·원본5개 비교·검토·인계는
|
||
확보했으나 최신 전체 통합 완료(FEM-REQ-HEX8-024)는 보류다.
|
||
|
||
2026-10-13의 관련 Debug C++91/91·비교기 Python96개가 PASS였고, 현재 비교기로 보존된
|
||
정적2·고유치1·동적2 결과를 재대조해 모두 PASS였다. 새 장시간 원본 실행이나 전체 CTest는
|
||
수행하지 않았다. 정적/고유치 결과는 당시 Debug, 동적2는 Release 산출물이다. Hex8 직접
|
||
실행·질량·복구·출력 source 동일성은 확인했으나 전체 공용 binary 동일성이나 전체 green을
|
||
주장하지 않는다. Shell의 최신 C08b·원본·전체 Debug 사용자 중단은 [HHT 요약](../hht-implicit-dynamics/README.md)을 따른다.
|
||
|
||
## 채택 방법과 이유
|
||
|
||
[기본 정식화](formulation.md)와 [정밀도 정식화](precision-formulation.md)가 상세 수식을
|
||
보존한다. 강성·복구·reference mass 적분은 2×2×2다. 선형 infinitesimal strain 또는
|
||
TL–StVK Green strain에서 deviatoric energy를 점별 적분하고, 체적 energy는
|
||
`kappa*V*theta_bar^2/2`, `theta_bar=sum(w_g*tr(E_g))/V`로 계산한다. Pointwise bulk의
|
||
과도한 강성을 줄이는 채택이며 center/unweighted mean, Fbar, mean-J와 다르다.
|
||
Force와 Kmat/Kgeo/Kt는 같은 energy의 gradient/Hessian이다. 평균의 미분에는 서로 다른
|
||
GP 간 coupling도 포함하며 local StVK tangent로 대체하지 않는다.
|
||
|
||
Mass는 full reference consistent24×24 matrix의 **행합을 BC 축소 전에** 구한 대각 matrix다.
|
||
Warped 요소의 모든 node를 rho*V/8로 치환하지 않는다. Eigen normalization·HHT inertia·
|
||
reaction·kinetic energy·momentum은 같은 reference M을 사용한다. Current geometry에 따라
|
||
mass를 재계산하지 않는다. 이 질량 변경은 입력 선택 option을 추가하지 않는다.
|
||
|
||
Solid HHT는 normalized high+low로 전체 physical state와 이력을 유지한다. Element의
|
||
상대변위 `u_a-u_0`에서 strain/force를 만들고 `Ghat_0=-sum(a>0)G_a`를 실제 gradient와
|
||
미분에 함께 사용한다. Tiny Green strain은 sym(H)+H^T H/2로 계산한다. Predictor·rates·
|
||
full residual·recovery·work·energy·momentum·다음 accepted state에 low를 보존한다.
|
||
Backend에는 RN64 operator/RHS를 전달하지만 acceptance는 full pair에서 검사한다.
|
||
공식 F64 출력은 전체 값의 RN64 observable이며 low를 별도 영속 field로 내보내지 않는다.
|
||
Rounded 출력만 다시 넣어 엄격한 내부 gate의 같은 PASS를 기대하지 않는다. Restart는 없다.
|
||
|
||
Whole-cell positive Jacobian은 outward-rounded interval/Bernstein subdivision으로 인증한다.
|
||
현재 좌표는 X+u_high+u_low 전체를 포함한다. Depth10/cell budget65536에서 인증되지 않는
|
||
uncertain 형상도 실패하며 |detJ|·clamp·자동 다른 요소로 정상화하지 않는다.
|
||
|
||
## 입력·출력·reference mapping
|
||
|
||
Single Part/identity Instance의 Solid-only C3D8, SOLID SECTION, 상수 isotropic ELASTIC을
|
||
지원한다. Frequency/HHT는 양의 DENSITY가 필요하다. 실제 BC/CLOAD는 DOF1–3이다.
|
||
Exact-zero 회전 BC4–6만 source warning/no-op이며 비영 회전 BC와 값0을 포함한 모든
|
||
회전 CLOAD는 거부한다. 정적 비영 prescribed는 absolute target이고 비선형 factor가
|
||
force/target에 함께 적용된다. HHT는 zero BC/initial u,v와 fixed DYNAMIC,DIRECT schedule,
|
||
TABULAR step-time relative CLOAD amplitude의 linear interpolation/end hold를 지원한다.
|
||
Static/BC amplitude·TOTAL TIME·smoothing은 제외한다. Source FREQUENCY LANCZOS/SIM
|
||
표기와 내부 generalized MKL FEAST를 구분한다. [공통 solver 요약](../solver-core/README.md)에
|
||
CLI·lease·공통 수치 정책이 있다. CLI는 입력 sibling에 결과를 쓰며 --output은 지원하지 않는다.
|
||
|
||
Schema version1, feature_id=hex8-structural-analysis,
|
||
`mass_formulation=lumped-reference`, `component_order=node-major; UX,UY,UZ`다.
|
||
기존 consistent-reference 파일을 metadata만 바꿔 재사용하지 않는다. F64/U64/U8은 explicit
|
||
little-endian, 문자열은 UTF-8이고 모든 physical 값은 finite다.
|
||
|
||
| 결과 | Shape·의미 |
|
||
| --- | --- |
|
||
| frame nodal/displacement, reaction, residual | [N,3]; U, constrained projection RF, full R는 별도 |
|
||
| frame solid/stress, solid/strain | [E,8,6]; global Cauchy S11/S22/S33/S12/S13/S23, infinitesimal 또는 Green strain의 tensor shear |
|
||
| dynamic nodal/velocity, acceleration, algorithmic_acceleration | [N,3]; v, physical a, auxiliary A |
|
||
| dynamic energy/work/balance·linear/angular momentum | 같은 full pair의 RN64; balance=T+U-T0-U0-W, W는 endpoint force 사다리꼴 work |
|
||
| /steps/Step-1/eigen/modes, frequencies, vectors | eigenvalue와 cycles/time 구분; vectors [modes,N,3], phi^T M phi=1 |
|
||
| eigen/verification/pairs, eta_gram, max_eta_orth | 반환한 모든 pair의 residual·normalization·직교 검증량 |
|
||
|
||
Strain은 실제 point kinematics이며 평균 strain으로 바꾸지 않는다. Cauchy stress의
|
||
isotropic 항이 모든 점에서 같은 pressure라는 뜻도 아니다. Extrapolation/절점 평균은 없다.
|
||
|
||
Reference/hexa의5 INP·8 CSV와 hexa_freq.txt는 read-only다. 442nodes/300elements,
|
||
E=2.1e11,nu=.3,rho=7850, Step-1이다. Static DIRECT h=.1/T=1의 Increment10에서 U/RF/S를
|
||
각각 blocking family로 비교한다. U/RF 전체442 inventory 뒤 RF만 실제 constrained 성분으로
|
||
투영하며 free RF와 FESA free residual을 비교하지 않는다. Stress는300×8×6 전부다.
|
||
Dynamic h=.1/T=10의101 frames 각각442×3 U family이며 Amp-1=(0,0),(.1,1),(10,1)이다.
|
||
Frequency TXT의 Mode1..10 Value=lambda를 eigen/modes.eigenvalue와 직접 비교한다.
|
||
Freq를 lambda로 변환하거나 mode를 근접 재매칭하지 않는다.
|
||
|
||
Key는 case/step/increment/instance/source node 또는 element/IntPt/component다.
|
||
IntPt 순서는 `---,+--,-+-,++-,--+,+-+,-++,+++`이며 node 순서와3/4·7/8이 다르다.
|
||
Missing/extra/duplicate/nonfinite/schema/mass 오류는 tolerance 전에 실패한다. S=max|reference|,
|
||
near-zero band/error limit .01S, 일반 relative .05, family RMS/S .01, S=0 exact-zero이며
|
||
Shell eigen의5% RMS 예외는 적용하지 않는다. Coordinate는 reference 위치다.
|
||
|
||
## 실제 코드와 수명
|
||
|
||
[Hex8Element](../../include/fesa/elements/hex8_element.h)의 ComputeStiffness/ComputeMass,
|
||
EvaluateLinear/EvaluateNonlinear 및 high+low 대응 함수가 local response를 제공한다.
|
||
[기본 kernel](../../src/fesa/elements/hex8_element.cpp),
|
||
[paired kernel](../../src/fesa/elements/hex8_high_low.cpp),
|
||
[형상 인증](../../src/fesa/elements/hex8_geometry.cpp)은 immutable reference cache와 독립 trial을 사용한다.
|
||
[HighLow arithmetic](../../src/fesa/math/high_low_arithmetic.h)은 RN·FTZ/DAZ 환경과 지원 product
|
||
범위를 검사하고 unsupported underflow/overflow를 실패로 전파한다. Universal correctly-rounded
|
||
106-bit 보장은 아니다. Reduction 순서를 바꾸는 최적화도 수치 변경이다.
|
||
|
||
Domain이 정의를 소유하고 DofManager가3N numbering/scatter를 소유한다. Stable local contribution을
|
||
ordered assembly한 뒤 [Solid static](../../src/fesa/analysis/solid_static_procedure.cpp),
|
||
[frequency](../../src/fesa/analysis/solid_frequency_procedure.cpp),
|
||
[SolidHhtDynamicProcedureExecutor](../../src/fesa/analysis/solid_hht_dynamic_procedure.cpp)가 typed state를
|
||
만든다. [SolidDynamicAnalysisState](../../include/fesa/analysis/solid_dynamic_analysis_state.h)의
|
||
accepted full pairs가 다음 predictor의 원본이다. Domain은 view보다, 호출자 adapter는 Execute보다
|
||
오래 살아야 한다. [Solid writer](../../src/fesa/io/hdf5/solid_hdf5_results_writer.cpp)는 완결 결과를
|
||
write/close/reopen/self-check 후 atomic finalize하며 실패 candidate는 history와 기존 final을 보존한다.
|
||
|
||
## 수치 의미와 검증 한계
|
||
|
||
Solid HHT physical residual r=Ma+f-F는 모든 원래 free 성분에서
|
||
`|r_i|/(|Ma_i|+|f_i|+|F_i|)<=1e-10`, zero scale exact-zero다. Weighted 식과
|
||
`(1+alpha)r_new-alpha*r_old`의 identity·update는 uncancelled scale의1e-12이며 old residual을
|
||
0으로 치환하지 않는다. q/v/a/A fresh correction은 h와 reference length로 무차원화해1e-10,
|
||
증분당100 corrections를 유지한다. Geometry/recovery/finite/gate를 모두 통과한 trial만 commit한다.
|
||
|
||
과거 consistent mass의 modal7/10 FAIL·최대20.2513%와 Python collection5 오류는 당시 이력이다.
|
||
Lumped 변경본의 새 원본5개 PASS와 후속 재대조가 이를 대체하는 해당 범위 근거이며 과거 전체787의
|
||
784 PASS/2 FAIL/1 SKIP이나 전체789/802를 새 전체 green으로 합산하지 않는다.
|
||
|
||
Reduced/hybrid/incompatible/20절점, plasticity/contact, mixed shell-solid, pressure/body load,
|
||
시간변화 BC·비영 초기상태, adaptive/explicit/restart는 제외한다. Mean-volume의 conditioning·
|
||
warped stability·남은 bending shear locking, 임의 큰 변형/mesh/시간간격은 일반 보증 범위 밖이다.
|
||
원본 U 일치만으로 physical a·장시간 에너지·전체 시간수렴을 검증했다고 주장하지 않는다.
|
||
최적화 후 최종 source의 전체 MSVC Debug build/CTest·필수 원본·독립 물리 확인이 남는다.
|
||
|
||
## 통합된 local 경계
|
||
|
||
[SolidTrialElement/Hex8TrialAdapter](../../include/fesa/elements/element_capabilities.h)가 같은
|
||
stable-address immutable Hex8 kernel의 stiffness·reference mass·paired response를 빌린다.
|
||
Adapter에 equation·trial history를 옮기지 않으며 원래 paired 산술·실패 경계를 유지한다.
|
||
공통 procedure·typed pending과 결과 dispatch는 [모듈화 요약](../cpp-object-oriented-modular-refactoring/README.md)을 따른다.
|
||
Frequency 비교는 `reference/hexa/hexa_freq.txt`의 modal Value를 직접 사용한다.
|