276 lines
10 KiB
Markdown
276 lines
10 KiB
Markdown
# 아키텍처
|
|
|
|
## 목표
|
|
FESA는 MITC4 Shell 요소 기반 구조해석에서 시작해 비선형 정적해석, 비선형 동적해석, 열전달 및 thermal-stress coupling, 1D/3D 요소까지 확장하는 유한요소 솔버이다.
|
|
|
|
초기 구현은 정확도와 테스트 가능성을 우선한다. 단, 대규모 모델을 목표로 하므로 자유도 관리, 희소 행렬 조립, 선형 솔버, 병렬 실행 계층은 초기부터 성능 확장이 가능하도록 분리한다.
|
|
|
|
## 설계 원칙
|
|
- Domain 객체는 입력 모델의 의미를 보존하고 가능한 한 불변에 가깝게 유지한다.
|
|
- 해석 중 변하는 물리량과 반복 상태는 AnalysisState에 명시적으로 분리한다.
|
|
- 요소, 재료, 하중, 경계조건, 해석 알고리즘은 런타임 다형성 기반으로 확장한다.
|
|
- MITC4 구현은 Phase 1에서 정확도와 테스트 가능성을 우선하며, assembly와 solver 계층은 대규모 모델 최적화가 가능하도록 경계를 둔다.
|
|
- 결과는 step/frame/field/history 개념으로 저장하여 정적, 비선형, 동적, 열전달 해석을 같은 결과 모델로 다룬다.
|
|
- 외부 라이브러리(MKL, TBB, HDF5)는 adapter 계층 뒤에 둔다.
|
|
- Abaqus input 호환성은 파서와 factory/registry 계층에서 관리한다. Phase 1의 입력 범위에는 `*Node`, `*Element`, `*Nset`, `*Elset`, `*Material`, `*Elastic`, `*Shell Section`, `*Boundary`, `*Cload`, `*Step`을 포함한다.
|
|
- 수치 규약은 `docs/NUMERICAL_CONVENTIONS.md`를 따른다. Phase 1 shell node는 6자유도이고, 단위계는 강제하지 않으며, 결과 부호는 Abaqus 규약을 따른다.
|
|
- 경계조건은 constrained DOF 제거 방식으로 적용하고, reaction은 full vector 기준 `K_full * U_full - F_full`로 계산한다.
|
|
- 기본 실수 precision은 `double`이고, 대규모 모델을 위해 id/index/equation numbering은 int64 기반으로 설계한다.
|
|
- Mesh quality 진단은 Phase 1 범위에서 제외한다. 대신 singular system 진단은 필수로 제공한다.
|
|
|
|
## 디렉토리 구조
|
|
```
|
|
src/
|
|
├── Analysis/ # Static, nonlinear static, dynamic, heat transfer analysis
|
|
├── Assembly/ # 전역 행렬/벡터 조립, sparse pattern 생성
|
|
├── Boundary/ # Fix, RBE2, RBE3 등 경계조건
|
|
├── Core/ # Domain, AnalysisModel, AnalysisState, DofManager
|
|
├── Element/ # Node, Element, MITC4 등 요소 구현
|
|
├── IO/ # Abaqus input parser, HDF5 results writer
|
|
├── Load/ # NodalLoad, PressureLoad, BodyForce 등 하중
|
|
├── Math/ # Vector, Matrix, SparseMatrix, MKL adapter
|
|
├── Material/ # LinearElastic 등 재료 모델
|
|
├── Property/ # ShellProperty, 1D/2D/3D property
|
|
├── Results/ # Step, Frame, FieldOutput, HistoryOutput
|
|
└── Util/ # 공통 유틸리티, 로깅, 검증 보조 함수
|
|
```
|
|
|
|
## 핵심 클래스 구조
|
|
```
|
|
Domain
|
|
├── Node
|
|
├── Element
|
|
├── Material
|
|
├── Property
|
|
├── NodeSet
|
|
├── ElementSet
|
|
├── BoundaryCondition
|
|
├── Load
|
|
└── StepDefinition
|
|
|
|
AnalysisModel
|
|
├── active elements
|
|
├── active loads
|
|
├── active boundary conditions
|
|
├── active properties/materials
|
|
└── equation system view
|
|
|
|
AnalysisState
|
|
├── displacement U
|
|
├── velocity V
|
|
├── acceleration A
|
|
├── temperature T
|
|
├── external force Fext
|
|
├── internal force Fint
|
|
├── residual R
|
|
├── current time / increment / iteration
|
|
└── element state / integration point state
|
|
|
|
DofManager
|
|
├── node dof definitions
|
|
├── constrained/free dof mapping
|
|
├── equation numbering
|
|
├── sparse matrix pattern ownership
|
|
└── full/reduced vector reconstruction
|
|
|
|
Analysis
|
|
├── LinearStaticAnalysis
|
|
├── NonlinearStaticAnalysis
|
|
├── DynamicAnalysis
|
|
├── FrequencyAnalysis
|
|
└── HeatTransferAnalysis
|
|
|
|
Element
|
|
├── 1DElement
|
|
│ ├── Truss
|
|
│ └── Beam
|
|
├── 2DElement
|
|
│ ├── MITC3
|
|
│ └── MITC4
|
|
└── 3DElement
|
|
├── Hexahedral
|
|
├── Tetrahedral
|
|
├── Wedge
|
|
└── Pyramid
|
|
|
|
BoundaryCondition
|
|
├── Fix
|
|
├── RBE2
|
|
└── RBE3
|
|
|
|
Load
|
|
├── NodalLoad
|
|
├── PressureLoad
|
|
└── BodyForce
|
|
|
|
Results
|
|
├── ResultStep
|
|
├── ResultFrame
|
|
├── FieldOutput
|
|
└── HistoryOutput
|
|
|
|
InputParser
|
|
ResultsWriter
|
|
Assembler
|
|
LinearSolver
|
|
Vector
|
|
Matrix
|
|
SparseMatrix
|
|
```
|
|
|
|
## 디자인 패턴
|
|
|
|
### Strategy Pattern
|
|
해석 알고리즘과 수치 알고리즘을 교체 가능하게 구성한다.
|
|
|
|
적용 대상:
|
|
- `Analysis`: `LinearStaticAnalysis`, `NonlinearStaticAnalysis`, `DynamicAnalysis`, `HeatTransferAnalysis`
|
|
- `LinearSolver`: `MKLPardisoSolver`, 향후 iterative solver
|
|
- `TimeIntegrator`: `HHTIntegrator`, 향후 Newmark 등
|
|
- `ConvergenceCriteria`: residual norm, displacement norm, energy norm
|
|
|
|
### Template Method Pattern
|
|
해석 실행의 큰 흐름은 `Analysis::run()`에서 고정하고, 세부 단계는 해석 종류별로 재정의한다.
|
|
|
|
기본 흐름:
|
|
```
|
|
initialize
|
|
buildAnalysisModel
|
|
buildDofMap
|
|
buildSparsePattern
|
|
assemble
|
|
applyBoundaryConditions
|
|
solve
|
|
updateState
|
|
writeResults
|
|
```
|
|
|
|
비선형 정적해석은 위 흐름을 Newton-Raphson 반복 루프 안에서 사용하고, 동적해석은 time step/frame 루프 안에서 사용한다.
|
|
|
|
### Factory + Registry Pattern
|
|
Abaqus input keyword와 내부 객체 생성을 분리한다.
|
|
|
|
예:
|
|
- `*Element, type=S4` -> `MITC4ElementFactory`
|
|
- `*Material`, `*Elastic` -> `LinearElasticMaterialFactory`
|
|
- `*Boundary` -> `FixBoundaryFactory`
|
|
- `*Cload` -> `NodalLoadFactory`
|
|
- `*Nset`, `*Elset` -> set registry
|
|
|
|
요소, 재료, 하중, 경계조건 타입 추가 시 parser 본체의 변경을 최소화한다.
|
|
|
|
### Adapter Pattern
|
|
MKL, TBB, HDF5 API는 solver core에 직접 노출하지 않는다.
|
|
|
|
적용 대상:
|
|
- `SparseMatrix`, `Vector`, `Matrix`
|
|
- `LinearSolver`
|
|
- `ParallelFor`
|
|
- `ResultsWriter`
|
|
|
|
외부 라이브러리 교체 또는 테스트 double 사용이 가능하도록 adapter 계층에서 의존성을 제한한다.
|
|
|
|
### Runtime Polymorphism
|
|
요소, 재료, 하중, 경계조건은 base interface를 통해 다룬다. Phase 1에서는 명확성과 테스트 가능성을 우선하고, 대규모 모델 성능 최적화가 필요할 경우 assembly 내부에서 타입별 batch 처리 또는 kernel 분리를 추가한다.
|
|
|
|
## 상태 관리
|
|
|
|
### Domain
|
|
`Domain`은 입력 파일에서 만들어진 전체 모델 정의를 소유한다. 파싱 이후에는 가능한 한 불변으로 취급한다.
|
|
|
|
포함 대상:
|
|
- nodes, elements
|
|
- materials, properties
|
|
- node sets, element sets
|
|
- loads, boundary conditions
|
|
- analysis step definitions
|
|
|
|
### AnalysisModel
|
|
`AnalysisModel`은 현재 step에서 활성화되는 해석 객체들의 실행 view이다. `Domain`을 복사하지 않고 참조 또는 id 기반 view로 구성한다.
|
|
|
|
포함 대상:
|
|
- active elements
|
|
- active loads
|
|
- active boundary conditions
|
|
- active property/material references
|
|
- current equation system view
|
|
|
|
### DofManager
|
|
`DofManager`는 자유도와 방정식 번호를 전담한다. Node 또는 Element 내부에 equation id를 분산 저장하지 않는다.
|
|
|
|
책임:
|
|
- node별 활성 자유도 정의
|
|
- constrained/free dof mapping
|
|
- equation numbering
|
|
- sparse matrix pattern 생성에 필요한 connectivity 제공
|
|
- 경계조건 적용 전후의 dof view 관리
|
|
|
|
### AnalysisState
|
|
`AnalysisState`는 해석 중 변하는 물리량과 반복 상태를 소유한다.
|
|
|
|
포함 대상:
|
|
- displacement, velocity, acceleration
|
|
- temperature
|
|
- external force, internal force, residual
|
|
- current time, increment, Newton iteration
|
|
- element state, integration point state
|
|
|
|
Phase 1에서는 displacement 중심으로 최소 구현하되, 기하비선형과 thermal-stress coupling을 위해 element/internal state 확장 지점을 유지한다.
|
|
|
|
### Results State
|
|
결과는 `ResultStep` -> `ResultFrame` -> `FieldOutput`/`HistoryOutput` 구조로 관리한다.
|
|
|
|
- `ResultStep`: 해석 step 단위 결과
|
|
- `ResultFrame`: 정적해석의 load increment 또는 동적해석의 time frame
|
|
- `FieldOutput`: node/element field 결과
|
|
- `HistoryOutput`: 특정 node, element, set, reaction, energy 등의 이력 결과
|
|
|
|
## 데이터 흐름
|
|
```
|
|
Abaqus input file
|
|
-> InputParser
|
|
-> Domain 생성
|
|
-> StepDefinition 루프
|
|
-> AnalysisModel 생성
|
|
-> DofManager로 자유도/방정식 번호 생성
|
|
-> sparse pattern 생성
|
|
-> Analysis 실행
|
|
-> Assembler로 전역 행렬/벡터 조립
|
|
-> BoundaryCondition 적용
|
|
-> LinearSolver 또는 nonlinear/time integration loop
|
|
-> AnalysisState 갱신
|
|
-> ResultsWriter로 step/frame/history 저장
|
|
-> 다음 step 진행
|
|
```
|
|
|
|
## Phase 1 구현 범위
|
|
- MITC4 Shell 요소
|
|
- 선형 탄성 재료
|
|
- 절점하중
|
|
- 고정 경계조건
|
|
- Abaqus input subset: `*Node`, `*Element`, `*Nset`, `*Elset`, `*Material`, `*Elastic`, `*Shell Section`, `*Boundary`, `*Cload`, `*Step`
|
|
- `S4`를 `MITC4`로 매핑하고 `S4R`은 추후 지원
|
|
- 6자유도 shell node와 drilling 자유도 인공 강성
|
|
- constrained DOF 제거 방식
|
|
- full vector 기반 reaction recovery
|
|
- 선형 정적 해석
|
|
- step/frame 기반 결과 저장의 최소 구조
|
|
- double precision과 int64 indexing
|
|
- singular system 진단
|
|
- reference 모델 결과 비교 테스트
|
|
|
|
## 성능 확장 방향
|
|
- 행렬 조립은 element 단위 병렬화를 고려해 설계한다.
|
|
- 전역 행렬은 대규모 모델을 위해 sparse matrix를 기본으로 한다.
|
|
- MKL 기반 direct solver를 우선 지원하되, solver interface는 iterative solver를 추가할 수 있게 둔다.
|
|
- 대규모 sparse solve를 위해 MKL `pardiso_64`를 사용할 수 있도록 64-bit sparse index 경계를 유지한다.
|
|
- TBB 병렬화는 요소 stiffness 계산, element force 계산, assembly precompute 등 독립 작업부터 적용한다.
|
|
- 정확도 검증이 끝나기 전에는 MITC4 element formulation을 과도하게 최적화하지 않는다.
|
|
|
|
## 상세 설계 문서
|
|
- `docs/NUMERICAL_CONVENTIONS.md`: DOF, 좌표계, 단위, 부호, precision, reaction recovery, singular diagnostics
|
|
- `docs/ABAQUS_INPUT_SUBSET.md`: Phase 1 Abaqus input keyword subset과 unsupported feature
|
|
- `docs/VERIFICATION_PLAN.md`: reference 폴더 구조, benchmark matrix, tolerance 정책
|
|
- `docs/RESULTS_SCHEMA.md`: HDF5 step/frame/field/history schema
|
|
- `docs/MITC4_FORMULATION.md`: MITC4 baseline formulation 계약과 open decisions
|