Files
FESADev/docs/ARCHITECTURE.md
2026-04-21 01:12:24 +09:00

8.5 KiB

아키텍처

목표

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을 포함한다.

디렉토리 구조

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

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 진행

성능 확장 방향

  • 행렬 조립은 element 단위 병렬화를 고려해 설계한다.
  • 전역 행렬은 대규모 모델을 위해 sparse matrix를 기본으로 한다.
  • MKL 기반 direct solver를 우선 지원하되, solver interface는 iterative solver를 추가할 수 있게 둔다.
  • TBB 병렬화는 요소 stiffness 계산, element force 계산, assembly precompute 등 독립 작업부터 적용한다.
  • 정확도 검증이 끝나기 전에는 MITC4 element formulation을 과도하게 최적화하지 않는다.