286 lines
13 KiB
Markdown
286 lines
13 KiB
Markdown
# Structural FEM Solver Architecture
|
|
|
|
## 1. 범위와 현재 상태
|
|
|
|
이 문서는 범용 구조해석 FEM solver의 목표 C++ 아키텍처와 이를 개발하는 control plane을
|
|
정의한다. 현재 repository에는 agent/skill, 문서와 Harness가 있으며 solver source와 build
|
|
metadata는 아직 없다. 아래 `include/`와 `src/` 구조는 feature 구현 시 지켜야 할 목표
|
|
경계이지 현재 구현 완료 목록이 아니다.
|
|
|
|
## 2. 아키텍처 원칙
|
|
|
|
- Physics와 numerical meaning을 file format 및 vendor backend보다 안쪽에 둔다.
|
|
- Model definition, mutable analysis state와 recovered result를 별도 lifetime으로 관리한다.
|
|
- Local element 계산과 global topology/assembly/solve 책임을 분리한다.
|
|
- 모든 경계에서 identity, units, coordinates, ordering과 failure를 명시한다.
|
|
- Candidate를 완전히 검증한 뒤 authoritative state로 commit한다.
|
|
- 지원하지 않는 semantic input은 fail closed 처리한다.
|
|
- 재현 가능한 ordering과 reduction을 correctness contract로 취급한다.
|
|
- 확장점은 실제 두 번째 구현이 필요할 때 최소 interface로 도입한다.
|
|
|
|
## 3. Context 구조
|
|
|
|
```text
|
|
Development control plane
|
|
user -> Coordinator -> specialist agents -> evidence -> Harness/tests
|
|
|
|
|
v
|
|
repository changes
|
|
|
|
Solver data plane
|
|
input adapter -> semantic model -> analysis procedure -> results model
|
|
| |
|
|
v v
|
|
element/material assembly/constraints
|
|
\ /
|
|
numerical backend
|
|
|
|
|
output adapters
|
|
```
|
|
|
|
Control plane은 source와 evidence를 만들고 검증하지만 solver runtime API의 일부가 아니다.
|
|
Solver data plane은 agent, prompt, phase 파일 또는 Harness에 의존하지 않는다.
|
|
|
|
## 4. 목표 디렉터리
|
|
|
|
```text
|
|
include/fem/
|
|
core/ public identity, units, diagnostics와 value types
|
|
model/ immutable semantic model API
|
|
element/ element formulation contracts
|
|
material/ constitutive contracts
|
|
analysis/ analysis procedure contracts
|
|
results/ backend-neutral result identity와 query API
|
|
|
|
src/
|
|
core/
|
|
model/
|
|
element/
|
|
material/
|
|
dof/
|
|
assembly/
|
|
constraints/
|
|
analysis/
|
|
numerics/
|
|
results/
|
|
io/
|
|
abaqus/ 선택적으로 지원하는 Abaqus interchange subset adapter
|
|
storage/ 선택된 result serialization adapter
|
|
|
|
tests/
|
|
unit/
|
|
integration/
|
|
verification/
|
|
harness/
|
|
|
|
reference/ 승인된 read-only model 및 expected-result artifact
|
|
docs/features/ feature별 requirement부터 release까지의 evidence
|
|
```
|
|
|
|
첫 feature는 필요한 경로만 추가한다. 빈 framework class나 미래용 계층을 미리 만들지 않는다.
|
|
|
|
## 5. 모듈 책임
|
|
|
|
| 모듈 | 소유 책임 | 소유하지 않는 책임 |
|
|
| --- | --- | --- |
|
|
| `core` | typed identity, units/coordinate metadata, status/diagnostic | mesh, solver, file syntax |
|
|
| `model` | node/connectivity/set/load/constraint/step의 검증된 semantic definition | equation numbering, mutable state |
|
|
| `element` | kinematics, quadrature, local residual/tangent, recovery | global matrix와 source parsing |
|
|
| `material` | constitutive response, trial/commit/revert state | element interpolation과 analysis loop |
|
|
| `dof` | active DOF와 deterministic equation numbering | constraint enforcement와 solve |
|
|
| `assembly` | sparsity, scatter, stable local-to-global reduction | element physics와 linear solve |
|
|
| `constraints` | prescribed/MPC 등 feature가 지원하는 equation policy | parser syntax와 result storage |
|
|
| `analysis` | procedure lifecycle, iteration, convergence, state commit | concrete file adapter와 vendor API 노출 |
|
|
| `numerics` | vector/matrix abstraction과 private backend adapter | physical entity 및 source label 의미 |
|
|
| `results` | quantity/location/component/frame/provenance identity와 recovery records | storage file layout |
|
|
| `io` | external syntax와 semantic model 간 mapping | solver physics 변경 |
|
|
| `storage` | versioned serialization과 atomic publication | authoritative physical meaning 정의 |
|
|
|
|
## 6. 의존성 규칙
|
|
|
|
```text
|
|
io adapters ------> model/core <------ output/storage adapters
|
|
^
|
|
|
|
|
element/material --> analysis <-- constraints/assembly
|
|
| |
|
|
+------------> numerics
|
|
|
|
public API -> core/model/element/material/analysis/results abstractions only
|
|
```
|
|
|
|
- Adapter가 core contract에 의존하며 core가 adapter에 의존하지 않는다.
|
|
- `element`와 `material`은 서로의 concrete type을 소유하지 않는다. 명시적 evaluation
|
|
context/response contract로 통신한다.
|
|
- `analysis`는 backend-neutral numerical interface만 본다.
|
|
- Vendor header, handle과 exception은 `src/numerics` 또는 `src/storage` 내부에서 끝난다.
|
|
- `io`가 model object를 부분적으로 publish하지 않는다. Builder/candidate를 검증한 뒤
|
|
immutable model을 생성한다.
|
|
|
|
CI에서는 public-header self-containment와 금지 dependency 검사를 추가할 수 있다. 그런
|
|
검사가 아직 없으면 architecture review가 동일 경계를 확인한다.
|
|
|
|
## 7. 핵심 데이터 계약
|
|
|
|
### 7.1 Identity
|
|
|
|
다음 identity는 교환할 수 없다.
|
|
|
|
- `SourceLabel`: input/output에서 사용자가 보는 label
|
|
- `EntityId`: 검증된 model 내부 identity
|
|
- `DofId`: physical component가 포함된 자유도 identity
|
|
- `EquationId`: 특정 analysis state의 active equation 번호
|
|
- `ResultKey`: entity, quantity, location, component, step/frame와 coordinate metadata 조합
|
|
|
|
Dense array index를 source label로 암묵적으로 사용하지 않는다. 외부 artifact 매칭은 row
|
|
순서가 아니라 명시적 identity를 사용한다.
|
|
|
|
### 7.2 Units와 coordinates
|
|
|
|
Solver는 입력 값의 일관 단위계를 임의로 추론하지 않는다. Feature contract가 필요한
|
|
dimension을 정의하고 adapter가 단위 metadata를 보존하거나 명시적으로 변환한다. Vector,
|
|
tensor, rotation과 result component는 local/global/material coordinate system과 ordering을
|
|
기록한다.
|
|
|
|
### 7.3 Model, state, results
|
|
|
|
- `Model`: analysis 동안 변하지 않는 topology와 semantic definition
|
|
- `AnalysisState`: DOF values, committed/trial material state, iteration/convergence metadata
|
|
- `Results`: 성공적으로 publish된 step/frame별 physical output
|
|
|
|
Trial update 실패 시 committed state를 보존한다. 실패 frame은 정상 frame과 같은
|
|
authoritative status로 노출하지 않는다.
|
|
|
|
## 8. 해석 생명주기
|
|
|
|
```text
|
|
PARSE/BUILD
|
|
-> SEMANTIC VALIDATION
|
|
-> MODEL FREEZE
|
|
-> PROCEDURE INITIALIZATION
|
|
-> DOF/CONSTRAINT SETUP
|
|
-> SPARSITY SETUP
|
|
-> {ASSEMBLE -> SOLVE -> UPDATE -> CONVERGENCE CHECK}*
|
|
-> COMMIT
|
|
-> RECOVER
|
|
-> PUBLISH RESULTS
|
|
```
|
|
|
|
Linear procedure도 같은 owner 경계를 사용하며 반복 구간이 한 번일 수 있다. Nonlinear,
|
|
dynamic, eigen과 contact 기능은 이 lifecycle 위에 필요한 state와 gate를 추가하지만 다른
|
|
analysis family의 의미를 공통 API에 억지로 넣지 않는다.
|
|
|
|
Residual과 tangent의 부호, essential constraint 적용 시점, reaction recovery와 state
|
|
commit 시점은 formulation/analysis contract에 포함한다.
|
|
|
|
## 9. Element 및 material kernel
|
|
|
|
Element evaluation input은 최소한 geometry, DOF/state view, material evaluation capability,
|
|
step/iteration context와 requested outputs를 포함한다. Output은 local ordering이 명시된
|
|
residual/tangent 및 recovery data다.
|
|
|
|
Element kernel은 다음을 수행하지 않는다.
|
|
|
|
- global equation 번호 생성
|
|
- global sparse matrix에 직접 write
|
|
- source file lookup
|
|
- global convergence 판정
|
|
- result storage write
|
|
|
|
Material update는 trial response를 반환하고 analysis owner가 전체 increment 성공 후 commit을
|
|
요청한다. Numerical integration point와 state-variable ordering은 feature contract에
|
|
versioned되어야 한다.
|
|
|
|
## 10. Assembly, constraints와 numerics
|
|
|
|
- Sparsity는 validated connectivity와 DOF policy에서 deterministic하게 생성한다.
|
|
- Parallel worker는 소유가 정해진 buffer에만 기록하고 reduction 순서를 고정한다.
|
|
- Constraint 방식은 elimination, transformation, penalty 등 선택된 feature contract에
|
|
명시한다. 서로 다른 방식의 reaction 의미를 동일하다고 가정하지 않는다.
|
|
- Numerical backend는 matrix/storage/solver capability를 제공하지만 physical model을 알지
|
|
않는다.
|
|
- Backend status는 structured solver diagnostic으로 변환하며 exception이나 error code를
|
|
public API로 그대로 흘리지 않는다.
|
|
|
|
## 11. I/O와 Abaqus reference convention
|
|
|
|
Abaqus input/output의 공개 정의는 호환 feature를 설계할 때 우선 reference로 사용한다.
|
|
Adapter는 지원 keyword/option, model data와 history data, default, set/instance scope,
|
|
orientation, step과 output 위치를 명시적으로 mapping한다.
|
|
|
|
다음 원칙을 지킨다.
|
|
|
|
- 선택된 subset만 지원한다고 선언한다.
|
|
- 결과에 영향을 줄 수 있는 unknown/unsupported semantic keyword는 오류다.
|
|
- 무시해도 semantic 차이가 없다고 계약된 formatting 또는 metadata만 warning이 될 수 있다.
|
|
- 공개 문서로 확인할 수 없는 내부 동작을 추측하지 않는다.
|
|
- Adapter의 interchange 호환성과 solver formulation 검증을 별개의 evidence로 관리한다.
|
|
|
|
다른 입력 형식도 동일한 semantic model builder를 사용한다.
|
|
|
|
기본 공개 reference set은 다음과 같다. Feature evidence에는 실제 사용한 product version과
|
|
세부 page를 고정해 기록한다.
|
|
|
|
- [Input file model/history organization](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEMODRefMap/simamod-c-ov.htm)
|
|
- [Element selection and formulation overview](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEELMRefMap/simaelm-c-analysistype.htm)
|
|
- [Nonlinear equation solution controls](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-nonlineareqns.htm)
|
|
- [Output concepts and identifiers](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEOUTRefMap/simaout-c-ov.htm)
|
|
- [Verification Guide](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEVERRefMap/simaver-c-ov.htm)
|
|
|
|
이 목록은 출발점이지 모든 feature의 충분한 근거가 아니다. Governing theory와 feature별
|
|
공식 문서를 함께 사용하고, 문서 version 간 차이는 contract에 명시한다.
|
|
|
|
## 12. 결과와 persistence
|
|
|
|
Results model은 저장 형식과 독립적이며 다음을 식별한다.
|
|
|
|
- analysis/step/frame와 success status
|
|
- entity와 source identity
|
|
- quantity, location, component와 coordinate system
|
|
- units/dimension와 precision
|
|
- formulation, mesh와 solver provenance
|
|
|
|
Storage adapter는 schema version을 기록하고 임시 candidate에 쓴 뒤 validation 성공 시
|
|
atomic publish한다. CSV, HDF5 또는 다른 형식은 선택된 project/feature contract이며 core
|
|
기본값이 아니다.
|
|
|
|
## 13. 오류 모델
|
|
|
|
오류는 적어도 다음 category를 구분한다.
|
|
|
|
`input`, `model`, `formulation`, `assembly`, `constraint`, `linear-solver`, `convergence`,
|
|
`recovery`, `storage`, `environment`, `internal`
|
|
|
|
Diagnostic에는 category, stable code, message, 관련 entity/source location과 원인 chain을
|
|
포함할 수 있다. 예상 가능한 사용자/model 오류는 process crash나 assertion으로 처리하지
|
|
않는다. Assertion은 내부 invariant 위반에 사용한다.
|
|
|
|
## 14. Determinism과 병렬성
|
|
|
|
- Entity와 equation ordering은 stable input identity와 명시적 policy에서 결정한다.
|
|
- Hash iteration order를 authoritative output order로 사용하지 않는다.
|
|
- Floating-point reduction tree를 고정하거나 비결정성 범위를 계약·검증한다.
|
|
- 병렬 최적화는 serial reference test와 동일한 identity 및 허용된 numerical envelope를
|
|
만족해야 한다.
|
|
- Randomized test는 seed와 재현 정보를 기록한다.
|
|
|
|
## 15. 개발 control plane
|
|
|
|
Coordinator와 specialist agent는 `docs/SOLVER_AGENT_DESIGN.md`의 state machine을 따른다.
|
|
Skill은 역할별 절차를 제공하고 Harness는 계획된 repository-local 변경의 TDD와 build/test를
|
|
강제한다.
|
|
|
|
Control plane의 안전 경계는 다음과 같다.
|
|
|
|
- Agent 보고서와 runtime output을 product result로 취급하지 않는다.
|
|
- Hook은 방어 계층이지 완전한 sandbox가 아니다.
|
|
- Project config와 build preset은 실행 가능한 신뢰 경계다.
|
|
- Harness는 관련 없는 working-tree 변경을 stage/commit하지 않는다.
|
|
- External solver와 원격 repository 변경은 별도 권한이 필요하다.
|
|
|
|
## 16. Architecture 변경
|
|
|
|
Public dependency 방향, identity, state ownership, result schema 의미 또는 analysis lifecycle을
|
|
바꾸는 변경은 `docs/ADR.md`에 새 decision을 추가한다. 기존 ADR을 조용히 다시 쓰지 않고
|
|
superseding ADR로 이력을 남긴다.
|