# 3D Euler–Bernoulli beam 선형 정적 해석 ## 목적과 경계 직선 2절점 `B33`의 축변형·비틀림·두 방향 굽힘을 해석한다. Prismatic general section, 등방 선형탄성, 작은 변형·회전이 대상이다. `B31` 전단변형 beam, `I12!=0` 결합 단면, 소성·좌굴·동적 beam은 포함하지 않는다. `LocalEquivalentLoad`는 정식화 검산용이며 공개 beam `DLOAD` 지원을 뜻하지 않는다. 공통 실행·소유권·수치 비교 규칙은 [solver-core](../solver-core/README.md), 수식·부호·좌표·복구 위치 원문은 [정식화](formulation.md)를 따른다. ## 채택한 수식과 이유 각 절점은 global `[UX,UY,UZ,URX,URY,URZ]`를 가지며 요소는 12 DOF다. Connectivity가 local x를, 입력 guide의 x 직교 투영이 local y를 정하고 z는 외적이다. 퇴화 길이·평행 guide를 임의 축으로 대체하지 않는다. `G=E/(2(1+nu))`, `Iy=I11`, `Iz=I22`이며 양의 `A,Iy,Iz,J`를 요구한다. 축·비틀림과 Hermite 굽힘의 local stiffness를 두 점 Gauss 순서로 계산하고 global로 변환한다. Endpoint outward action과 단면력은 같은 이름의 값이 아니므로 부호를 별도로 복구한다. 단면 응력은 입력 section point의 local 위치에서 `S11`로 복구한다. Section point 생략 시 centroid는 `fesa-default` identity를 가진다. ## 입력과 결과 대응 `*ELEMENT,TYPE=B33`, `*BEAM GENERAL SECTION,SECTION=GENERAL,ELSET=...,MATERIAL=...`를 사용한다. 단면 첫 행은 `A,I11,I12,I22,J`, 둘째 행은 guide vector다. `*SECTION POINTS`의 `x1,x2`는 local y,z 좌표이며 입력 순서를 보존한다. Part·set·identity instance, `*ELASTIC`, DOF 1–6 `*BOUNDARY`와 step `*CLOAD`를 지원한다. 선형 `*STATIC`의 네 양수 field는 호환성 값이며 증분 loop를 만들지 않는다. 단일 step 결과의 storage identity는 `Step-1`, frame `0`이다. Instance transform, include와 미지원 model keyword는 실패하며 output 요청 allowlist만 warning no-op이다. HDF5 `/steps/Step-1/frames/0` 아래 nodal displacement/reaction과 `element/section_resultant`, `end_force_local`, `generalized_strain`, `generalized_resultant`, `stress_s11`을 서로 다른 위치 identity로 저장한다. | 원본 `reference/cantilever beam/` | 비교 의미 | | --- | --- | | `cantilever beam.inp`, `cantilever beam displacements.csv` | 11 nodes의 U1–3→UX–UZ, UR1–3→URX–URZ | | `cantilever beam reactions.csv` | RF1–3와 RM1–3의 global nodal reaction | | `cantilever beam elemental forces.csv` | 10 elements×2 endpoint; SF1→N, SM1→My, SM2→Mz, SM3→T | Key는 frame·instance·source node이며 endpoint는 source element도 포함한다. 공유 절점의 여러 endpoint를 평균하지 않는다. Abaqus stress equality gate는 없다. 각 family는 reference-only `S=max(abs(reference))`를 쓴다. `abs(reference)<=0.01*S`는 absolute error `<=0.01*S`, 그 밖은 relative error `<=5%`이며 모든 row와 `RMS(error)/S<=1%`를 함께 요구한다. `S=0`이면 FESA도 exact zero다. Free residual·force/moment balance의 내부 정규화 한계는 `1e-10`이다. ## 구현과 수명 [EulerBeam3D](../../include/fesa/elements/euler_beam_3d.h)의 `Create`, `LocalStiffness`, `RecoverBeam`이 local 계산을 소유한다. [구현](../../src/fesa/elements/euler_beam_3d.cpp)을 대조한다. Domain의 semantic definition은 equation을 저장하지 않으며 AnalysisModel은 non-owning view다. DofManager의 stable mapping→local contribution→ordered global assembly 순서로 진행한다. [LinearStaticProcedureExecutor](../../include/fesa/analysis/linear_static_procedure.h)는 `Kff` factorization 뒤 `Ff-Kfc*dc`를 풀고 full residual `K*d-F`로 반력과 평형을 복구한다. [BeamResultRecovery](../../src/fesa/results/beam_result_recovery.h)는 typed recovery candidate를 채운다. Writer는 검증된 candidate만 직렬화하며 실패한 결과가 기존 최종 HDF5를 덮지 않게 한다. ## 검증 의미와 교훈 기존 beam reference 비교와 analytical·rigid-mode·endpoint 부호 검산의 통과 기록이 있다. 이 문서 정리는 현재 revision의 새 실행이나 외부 solver 재실행을 뜻하지 않는다. Dense matrix 크기 곱 overflow를 할당 전에 검사하게 된 결함 이력을 기억한다. 빌드 실패 후 `No tests were found`는 통과가 아니며 discovery와 실행을 함께 확인한다. 변위 일치만으로 단면 응력·반력·end action 정확도를 추론하지 않는다. 외부 검증은 지정된 하나의 cantilever bundle이며 일반 단면·곡선 beam coverage를 주장하지 않는다.