docs: consolidate solver knowledge and preserve formulation originals

This commit is contained in:
KOKO\Mimi
2026-10-17 22:34:12 +09:00
parent 149e7e2de8
commit d76602a0f1
19 changed files with 1740 additions and 380 deletions
+57 -31
View File
@@ -1,42 +1,68 @@
# 3D Euler–Bernoulli Beam
# 3D Euler–Bernoulli beam 선형 정적 해석
## 목적과 현재 범위
## 목적과 경계
B33 선형 정적 해석, 지정 변위·절점 하중과 endpoint 복구. 등분포 등가하중은 local 검산이며 공개 DLOAD 지원이 아니다를 구현한 기능이다. 역사적 기능 검증과 현재 통합 회귀의 범위를 구분한다.
최근 dev 통합 회귀는 [전체 현황](../tracking/status.md)에 연결하며, 과거 release 판정은
[release.md](release.md)에 남긴다. 문서 정리는 새 기능 검증이나 재승인을 뜻하지 않는다.
직선 2절점 `B33`의 축변형·비틀림·두 방향 굽힘을 해석한다.
Prismatic general section, 등방 선형탄성, 작은 변형·회전이 대상이다.
`B31` 전단변형 beam, `I12!=0` 결합 단면, 소성·좌굴·동적 beam은 포함하지 않는다.
`LocalEquivalentLoad`는 정식화 검산용이며 공개 beam `DLOAD` 지원을 뜻하지 않는다.
공통 실행·소유권·수치 비교 규칙은 [solver-core](../solver-core/README.md),
수식·부호·좌표·복구 위치 원문은 [정식화](formulation.md)를 따른다.
## 계약과 재사용 Handoff
## 채택한 수식과 이유
- [요구사항·acceptance](requirements.md): 지원·제외와 기존 요구사항 ID.
- [정식화](formulation.md): 수식·가정·부호·좌표계·복구 위치.
- [I/O](io.md): 입력 subset·진단·source identity·결과 schema.
- [Reference 모델](reference-model.md): 원본과 비교량·행 identity·적용 범위.
- [독립 수치 검토](numerical-review.md): 검산·위험·반례와 수정 확인.
- [검증·물리 결과](verification.md): 실제 실행한 명령·수치·실패·미실행·한계.
- [연구 근거](research.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를 가진다.
공통 소유권은 [ARCHITECTURE](../ARCHITECTURE.md)를 따른다. Element는 local 계산,
Assembly는 결정적 reduction, Procedure는 trial/commit, Recovery는 물리 의미,
Writer는 직렬화를 담당한다. 새 기능에서 기존 stage/phase 실행 계획을 재사용하지 않는다.
현재 공개 API는 `include/fesa/`, 실제 구현은 `src/fesa/`와 대응 검사를 확인한다.
## 입력과 결과 대응
## 사용법
`*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이다.
환경 준비·build·CTest·CLI 기본 사용은 [operations](../operations.md), 입력과 결과의
공통 계약은 [contracts](../contracts.md)를 따른다. 이 기능의 keyword·option 허용 범위는
위 I/O 계약을 확인한다. 과거 보고서의 machine 경로·임시 command를 현재 기본값으로 쓰지 않는다.
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 |
기존 단계별 계획·coordination은 완료된 실행 운영 기록이어서 제거했다. 승인된 요구사항·
수식·검토·실제 검증 결과는 위 문서에 보존한다. Git `858e87b`의 이전 경로는 당시 원문을
조회하는 용도로만 사용하며 현행 작업 지침이 아니다.
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`이다.
- Dense Matrix 저장 크기 곱의 overflow가 실제 음성 검사에서 드러났다. 크기를 할당 전에 검사하도록 수정했다.
- 빌드 실패 뒤 `No tests were found`가 나온 실행은 통과 evidence가 아니다. discovery inventory와 실제 실행을 함께 확인한다.
- 여러 instance의 같은 source label과 공유 절점의 서로 다른 element endpoint를 합치지 않는다.
- Beam endpoint action 부호와 회전·local/global 좌표를 검산하며 displacement 일치로 stress/reaction 정확성을 추론하지 않는다.
- 초기 단계의 header 누락 RED는 예상 TDD 실패이고 위 overflow는 실제 결함이었다. 두 종류를 구분한다.
## 구현과 수명
실제 numerical·parser·solver·reaction·CLI 수정의 세부 evidence는 [수정 기록](lessons.md)에 남긴다.
[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를 주장하지 않는다.