docs: consolidate solver knowledge and preserve formulation originals
This commit is contained in:
@@ -1,21 +1,26 @@
|
||||
# C++ 모듈화와 공개 API 정리
|
||||
|
||||
## 목적과 개발 결과
|
||||
기존 B33/MITC4 솔버의 모델·local 계산·assembly·procedure·backend·I/O 책임을 분리하고 공개 header의 vendor 의존을 격리한 리팩터링이다. 새 물리·입력·해법·결과 schema 또는 tolerance를 도입하는 기능이 아니다. 현재 재사용할 구조·CLI·I/O·수치 비교 계약은 [solver-core](../solver-core/README.md)에 모았다.
|
||||
|
||||
모델·요소·assembly·procedure·backend·I/O 책임을 분리하고 공개 header의 vendor 의존을
|
||||
격리했다. Naming/format/header guard·Doxygen 계약과 HDF5/reference 동작의 보존을 확인했다.
|
||||
당시 revision·명령·수치 결과와 환경 실패는 [검증 기록](verification.md)에 남긴다.
|
||||
## 설계와 실제 데이터 흐름
|
||||
|
||||
## 재사용 Handoff
|
||||
[Domain](../../include/fesa/model/domain.h)은 의미 모델을 소유하고 [AnalysisModel](../../include/fesa/analysis/analysis_model.h)은 더 짧게 사는 non-owning view다. [DofManager](../../include/fesa/fem/dof_manager.h)는 equation·partition·pattern을 소유한다. [Element](../../include/fesa/elements/element.h)의 typed local contribution은 [SparseAssembler](../../src/fesa/assembly/sparse_assembler.cpp)에서 결정적 순서로 조립된다. [LinearStaticProcedureExecutor](../../include/fesa/analysis/linear_static_procedure.h)는 caller-owned 실행/선형해법 adapter를 참조하고 실행에 필요한 state만 만든다. [ResultRecovery](../../include/fesa/results/result_recovery.h)는 위치·단위·부호를 가진 결과를 복구하고 [HDF5 writer](../../src/fesa/io/hdf5/hdf5_results_writer.cpp)는 직렬화한다.
|
||||
|
||||
현재 architecture·수명은 [ARCHITECTURE](../ARCHITECTURE.md), C++ 규약은
|
||||
[CODINGSTYLE](../CODINGSTYLE.md), 실행은 [operations](../operations.md)를 따른다.
|
||||
실제 공개 header와 대응 src consumer를 함께 읽으며 `.hpp` 시절의 API명·임시 Step 명령을
|
||||
다시 도입하지 않는다. 원본 reference와 물리·tolerance를 리팩터링 편의로 바꾸지 않는다.
|
||||
[FesaApplication](../../src/fesa/app/fesa_application.cpp)이 객체·lexical output path·lease·실행 수명을 조합한다. 공개 API는 `include/fesa/`, 구현은 대응 `src/fesa/`에 두며 vendor handle과 오류 번호는 private 수치/I/O adapter 뒤에 둔다. 공개 API 이름을 예전 `.hpp` 시절 표기로 복원하거나 parser에서 concrete numerical storage를 직접 소유하지 않는다. Polymorphic base의 public virtual destructor, 단독 소유의 unique_ptr·RAII, self-contained include guard와 source identity를 유지한다.
|
||||
|
||||
## 실패와 교훈
|
||||
이 경계는 현재 eigen·dynamic·thermal·solid가 확장한 구조의 기반이다. 당시 static 리팩터링 성공을 나중에 추가된 모든 절차의 재검증으로 해석하지 않는다. 특히 trial/commit과 파일 final replacement는 다른 실패 경계다. 내부 accepted frame이 있어도 전체 해석이 실패하면 미완성 정상 final을 공개하지 않는다.
|
||||
|
||||
상속된 `FESA_HARNESS_CODEX_SANDBOX`로 Python default 계약 검사가 실패했던 사례는 환경
|
||||
오분류를 피하는 근거다. Clang-format의 변경 유무와 exit를 분리하고 link 성공만으로
|
||||
MSVC runtime·dependency 설정이 완성됐다고 판단하지 않는다. 그때의 pass는 현재 codebase
|
||||
전체의 재검증 결과가 아니다.
|
||||
## 보존한 입력·출력과 비교 의미
|
||||
|
||||
CLI는 입력 `.inp` 하나, lexical sibling HDF5·log, warning/오류 진단과 exit 의미를 유지했다. B33는 node·element endpoint·section point를, MITC4는 instance/node·element/point identity를 보존한다. 같은 node에 모인 endpoint action을 평균하거나 physical shell strain에 numerical drilling 값을 섞지 않는다. 정적 schema0·canonical frame0의 mandatory dataset·dtype·shape는 리팩터링 편의를 위해 바꾸지 않는다.
|
||||
|
||||
현재 수치 비교는 common family의 row5%·RMS1% 및 identity/finite 사전검사를 따른다. 과거 리팩터링 보고서에는 B33 `absolute_floor+1e-6*reference_scale`와 S4 fixed absolute1e-5로 수행한 당시 비교가 있다. B33176/176행, S4294/294행 통과 기록은 그 옛 기준·revision의 evidence이며 현재 common policy로 다시 판정한 결과가 아니다. Beam stress는 당시 Abaqus 외부 비교 N/A였고 analytical/unit·HDF5 schema evidence와 구분한다.
|
||||
|
||||
## 교훈과 검증 한계
|
||||
|
||||
- Naming·format·header guard·Doxygen와 dependency 경계를 정리해도 displacement만으로 stress/reaction·수명·실패 보존이 증명되지는 않는다. Header 변경은 대응 src consumer까지 함께 확인한다.
|
||||
- Dense 크기 곱 overflow는 할당 전에 확인한다. Public API의 Status/Result와 backend exception 변환은 원래 실패 의미를 보존해야 한다.
|
||||
- 상속된 환경 변수가 검사 실패의 원인이었던 사례가 있다. 환경 오류와 solver 결함을 구분한다. Formatter의 변경 유무와 native exit, link 성공과 runtime DLL 준비를 따로 판단한다.
|
||||
- 과거 실행 절차를 현재 실행 계획으로 복원하지 않는다. CTest와 별도 Python suite의 성공을 합치지 않는다.
|
||||
|
||||
이 문서 작업에서는 build/test를 실행하지 않았다. 당시 모듈화와 reference의 bounded 검증은 남기되 최신 전체 회귀·외부 배포 준비 완료를 선언하지 않는다. 현재 물리적 미해결 사항은 각 기능 README가 소유한다.
|
||||
|
||||
Reference in New Issue
Block a user