69 lines
4.6 KiB
Markdown
69 lines
4.6 KiB
Markdown
# 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를 주장하지 않는다.
|