docs: align feature guidance with adopted Refactor structure
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# FESA Structural Solver
|
||||
|
||||
FESA는 개인 연구를 위해 개발하는 유한요소 구조해석 솔버이며 외부 사용자 배포를 장기
|
||||
목표로 한다. C++17 이상·Windows MSVC·CMake/CTest를 사용하고 승인된 Abaqus 입력
|
||||
목표로 한다. C++17 이상·Windows MSVC·직접 MSBuild와 CMake/CTest를 사용하고 승인된 Abaqus 입력
|
||||
subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존재와 기능 검증 완료는 다르다.
|
||||
|
||||
## 프로젝트 문서와 영역
|
||||
@@ -39,8 +39,12 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존
|
||||
│ └── hdf5/AGENTS.md → schema·readback·finalize
|
||||
├── tests/
|
||||
│ └── AGENTS.md → 계층별 검사·실패·비교 evidence
|
||||
└── cmake/
|
||||
└── AGENTS.md → dependency·runtime 연결
|
||||
├── cmake/
|
||||
│ └── AGENTS.md → dependency·runtime 연결
|
||||
├── msvc/
|
||||
│ └── AGENTS.md → 직접 MSBuild·source 등록·runtime 연결
|
||||
└── scripts/
|
||||
└── AGENTS.md → 읽기 전용 결과 비교 도구
|
||||
```
|
||||
|
||||
## 핵심 규칙
|
||||
@@ -87,3 +91,9 @@ Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확
|
||||
|
||||
문서만 변경하면 정적 검토를 하고 build/test를 실행하지 않는다. 동작 변경은 관련 검사부터,
|
||||
솔버 기능 완료 시에는 구성된 전체 MSVC x64 Debug build/CTest와 필수 reference 비교를 수행한다.
|
||||
|
||||
직접 MSBuild가 주 개발 빌드이며 CMake/Ninja는 같은 제품·검사 source를 사용하는 보조 경로다.
|
||||
실제 명령·환경·`.build/native/Debug` 및 `.build/cmake-debug` 출력은 solver-core를 따른다.
|
||||
두 경로의 세 검사 target 전체와 별도 Python suite·필수 reference 비교를 구분해 확인한다.
|
||||
과거 Refactor의 정적 선별 실행 제한은 현재 전체 검증을 줄이는 근거가 아니다.
|
||||
`reference/temp`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# FESA Structural Solver
|
||||
|
||||
FESA는 개인 연구를 위해 개발하는 유한요소 구조해석 솔버이며 외부 사용자 배포를 장기
|
||||
목표로 한다. C++17 이상·Windows MSVC·CMake/CTest를 사용하고 승인된 Abaqus 입력
|
||||
목표로 한다. C++17 이상·Windows MSVC·직접 MSBuild와 CMake/CTest를 사용하고 승인된 Abaqus 입력
|
||||
subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존재와 기능 검증 완료는 다르다.
|
||||
|
||||
## 프로젝트 문서와 영역
|
||||
@@ -39,8 +39,12 @@ subset에서 재현 가능한 해석과 HDF5 결과를 제공한다. 코드 존
|
||||
│ └── hdf5/AGENTS.md → schema·readback·finalize
|
||||
├── tests/
|
||||
│ └── AGENTS.md → 계층별 검사·실패·비교 evidence
|
||||
└── cmake/
|
||||
└── AGENTS.md → dependency·runtime 연결
|
||||
├── cmake/
|
||||
│ └── AGENTS.md → dependency·runtime 연결
|
||||
├── msvc/
|
||||
│ └── AGENTS.md → 직접 MSBuild·source 등록·runtime 연결
|
||||
└── scripts/
|
||||
└── AGENTS.md → 읽기 전용 결과 비교 도구
|
||||
```
|
||||
|
||||
## 핵심 규칙
|
||||
@@ -87,3 +91,9 @@ Public header 변경은 대응하는 src 영역의 책임과 consumer까지 확
|
||||
|
||||
문서만 변경하면 정적 검토를 하고 build/test를 실행하지 않는다. 동작 변경은 관련 검사부터,
|
||||
솔버 기능 완료 시에는 구성된 전체 MSVC x64 Debug build/CTest와 필수 reference 비교를 수행한다.
|
||||
|
||||
직접 MSBuild가 주 개발 빌드이며 CMake/Ninja는 같은 제품·검사 source를 사용하는 보조 경로다.
|
||||
실제 명령·환경·`.build/native/Debug` 및 `.build/cmake-debug` 출력은 solver-core를 따른다.
|
||||
두 경로의 세 검사 target 전체와 별도 Python suite·필수 reference 비교를 구분해 확인한다.
|
||||
과거 Refactor의 정적 선별 실행 제한은 현재 전체 검증을 줄이는 근거가 아니다.
|
||||
`reference/temp`는 검증에 사용하지 않는다. 정식 자료 누락은 미완료로 기록하고 통과로 바꾸지 않는다.
|
||||
|
||||
@@ -11,3 +11,7 @@
|
||||
우연한 dependency로 성공한 것을 독립 배포 검증으로 간주하지 않는다.
|
||||
- Target graph·preset을 바꾸면 configure·MSVC compiler·실제 CTest discovery와 runtime
|
||||
loading을 검증한다. Solution-only 성공으로 CMake 제품 검증을 대체하지 않는다.
|
||||
|
||||
- 직접 MSVC 프로젝트와 source·검사 identity·CRT·ISA·link·DLL을 대조한다.
|
||||
Preset tree는 `.build/cmake-debug`·`.build/cmake-release`이며 Native 출력과 섞지 않는다.
|
||||
선택적 fesa_docs target은 직접 MSBuild의 선행 단계가 아니다.
|
||||
|
||||
+1
-1
@@ -12,4 +12,4 @@
|
||||
- [Hex8 구조해석](hex8-structural-analysis/README.md)
|
||||
- [Shell 열전달](shell-transient-heat-transfer/README.md)
|
||||
- [계산 성능](calculation-performance/README.md)
|
||||
- [C++ 모듈화](cpp-object-oriented-modular-refactoring/README.md)
|
||||
- [C++ 모듈화·Refactor 병합 현황과 이관 근거](cpp-object-oriented-modular-refactoring/README.md)
|
||||
|
||||
@@ -35,3 +35,13 @@ Hex8 기하 packet 수정본의 관련 Debug/Release82개씩, 독립 snapshot9,8
|
||||
그 수정본의 단일 동적 개발 실행은 native0·117.7986225초로 완료됐으나100초 목표 초과다.101 U frame 비교는 blocking PASS, 최대 relative RMS 약2.155586e-6이었다. Outer wrapper는 종료 자식의 null StartTime 처리에서1로 끝났고 실제 FESA native0·후속 comparator0과 구분한다. 이전135.9302297초와의 차이는 서로 다른 source의 단일 개발 표본이며 반복 통계나 특정 함수 비용이 아니다.
|
||||
|
||||
Shell 명시 영 seed 이후 SW60 수집은 partial이며 collector native4·target 종료 미관측, increment1까지 진행했다. 함수 sample의 Jet 산술·할당·작은 MKL 호출·OpenMP spin은 비용 후보지만 sample 부재를 cache hit 보장으로 바꾸거나 nested inclusive CPU를 합산해 wall time을 만들지 않는다. 전체 shell100초·최종 전체 Debug·원본5개 재실행·최종 물리 평가는 미완료다. 보류 후보의 PASS를 복원 source나 최신 통합본에 승계하지 않는다.
|
||||
|
||||
## Refactor 채택 시 보존할 성능 한계
|
||||
|
||||
Refactor의 2026-10-16 `0b8de3a` 당시 기록은 ShellNL whole elapsed가 원본 대비
|
||||
Native+86.52%·CMake+120.91% 회귀했다고 보고한다. 이는 해당 source·환경의 과거 단일 기록이며
|
||||
변산·메모리·배경 부하와 원인은 미확정이다. 이후 객체 복사 제거 revision의 정적 검증을
|
||||
새 Release 성능 향상으로 승계하지 않는다. 원본 `.build` archive는 통합 작업 공간으로
|
||||
자동 전달되지 않았으며 이번 병합에서 해당 시간의 원시 근거를 새로 재현한 것은 아니다.
|
||||
이번 작업은 제품 bytes를 채택하고 검증하는 범위다. 지속 SpMV cache나 새 산술 최적화를
|
||||
도입하지 않으며 성능 회귀 원인 해결·새 benchmark는 별도 작업으로 남긴다.
|
||||
|
||||
@@ -24,3 +24,54 @@ CLI는 입력 `.inp` 하나, lexical sibling HDF5·log, warning/오류 진단과
|
||||
- 과거 실행 절차를 현재 실행 계획으로 복원하지 않는다. CTest와 별도 Python suite의 성공을 합치지 않는다.
|
||||
|
||||
이 문서 작업에서는 build/test를 실행하지 않았다. 당시 모듈화와 reference의 bounded 검증은 남기되 최신 전체 회귀·외부 배포 준비 완료를 선언하지 않는다. 현재 물리적 미해결 사항은 각 기능 README가 소유한다.
|
||||
|
||||
## Refactor 코드 채택 후 구조
|
||||
|
||||
2026-10-18 통합은 FESADev `7438c827` 이력에 Refactor `11f09eeb`의 제품 `.h/.cpp`
|
||||
274개와 직접 MSVC 빌드를 선별 도입한다. 옛 구현을 섞는 호환 계층이나 새 정식화는 추가하지 않는다.
|
||||
[파일 manifest](merge-manifest.json)는 원본 Git blob과 working bytes, 보존·도입 방침을 구분하고,
|
||||
[테스트 이관표](test-migration.tsv)는 양쪽 기존 identity·assertion·oracle와 최종 위치를 연결한다.
|
||||
|
||||
- [AnalysisProcedure](../../include/fesa/analysis/analysis_procedure.h)와
|
||||
[factory](../../src/fesa/analysis/prepared_analysis.cpp)는 shell linear/nonlinear static,
|
||||
eigen, HHT, thermal과 solid static/frequency/HHT를 선택한다. 실행 수명은 호출자 adapter보다 짧다.
|
||||
[PreparedAnalysisOutcome](../../include/fesa/analysis/prepared_analysis_outcome.h)은 family별
|
||||
typed completed payload를 유지하고, [결과 dispatch](../../src/fesa/results/prepared_results_writer.cpp)는
|
||||
검증된 payload를 해당 writer로 보낸다. 기존 schema·atomic finalize 의미는 유지한다.
|
||||
- [Element capabilities](../../include/fesa/elements/element_capabilities.h)는 ShellTrialElement,
|
||||
SolidTrialElement, ShellInertiaElement, ThermalElement, ShellReferenceElement를 분리한다.
|
||||
Adapter는 immutable kernel을 빌리므로 kernel의 수명과 주소가 안정적이어야 한다.
|
||||
Equation·accepted history는 요소에 두지 않는다. Local layout과 full response를 typed로 보존한다.
|
||||
- [EquilibriumAlgorithm/EquilibriumStep](../../src/fesa/analysis/equilibrium_algorithm.h)는
|
||||
iteration 순서와 procedure-local typed pending candidate를 분리한다. Algorithm은 candidate를
|
||||
소유하거나 type-erase하지 않는다. Static은1, mechanical HHT는0에서 시작하는 inclusive 순서를 유지하고,
|
||||
procedure의 검증·commit 경계가 accepted state를 바꾼다.
|
||||
- [ShellHhtIntegrator](../../src/fesa/analysis/hht_reduced_integrator.h)는 predictor·rate 계산·
|
||||
physical-rate 복원을 분리한다. Chart/root/solver와 callback은 동기 borrowed view이며
|
||||
rate 출력 buffer는 호출자 소유로 입력·서로와 alias하지 않는다. `RunReducedHhtStep`은
|
||||
predictor→pending endpoint→commit 순서만 조정하고 accepted history를 소유하지 않는다.
|
||||
- [PARDISO Session](../../src/fesa/solvers/linear/pardiso_session.h)은 private factor/solve/release
|
||||
수명을 공통화한다. 기존1×1 TLS 회피의 범위를 vendor 전체 해결로 확대하지 않는다.
|
||||
[SparsePattern](../../include/fesa/math/sparse_pattern.h)은 CSR 값 구조이며 지속 backend cache가 아니다.
|
||||
[SpMV](../../src/fesa/math/sparse_matrix.cpp)는 여전히 호출마다 변환 배열·값 복사·handle을 소유한다.
|
||||
|
||||
수식·적분·reduction 순서·cache 수명에 영향이 있는 도입 차이는 manifest에 따로 분류했다.
|
||||
출처 일치·compile·테스트 통과만으로 수치 동등성을 선언하지 않으며 독립 수치 검토와
|
||||
영향받은 analytical/invariant·물리·reference 검증을 별도로 수행한다.
|
||||
|
||||
## 이번 병합의 현재 검증 상태
|
||||
|
||||
직접 MSVC와 CMake/Ninja의 Debug solver/CLI 및 세 테스트 target build가 완료됐다.
|
||||
제품274개는 Refactor working bytes와 일치한다. 양쪽 실제 discovery는 unit849,
|
||||
integration72, reference43으로 총964개이며 canonical identity가 일치한다.
|
||||
최종 선별 실행은 CMake176개, Native15개, 합성 reference comparator28개,
|
||||
Python145개가 failure/error/skip 없이 통과했다. 이는 전체964개 실행·실제 모델 비교 완료가 아니다.
|
||||
근거는 작업 공간의 `.build/merge-verification/t2-20261018-01/`와
|
||||
`t3-20261018-01/`에 있다. 원래 dev와 Refactor 저장소 및 기준자료는 보존했다.
|
||||
|
||||
2026-10-18 사용자 지시로 `reference/temp`는 검증에 사용하지 않는다. 정식 경로에 없는
|
||||
`shellNL-meshfine`, `shellNL-meshfine_02`, `shellNL-meshfine-pressure` 자료는 복사·복원하지 않는다.
|
||||
해당 실제 비교는 자료 미확보로 미완료이며 테스트를 skip 처리하거나 통과로 바꾸지 않는다.
|
||||
전체 Debug 검증·독립 수치 검토·정식 자료의 필수 비교는 후속 실행 대상이다.
|
||||
정리 전 필수 검증을 충족하지 못하면 테스트 삭제와 최종 병합 완료 판정을 진행하지 않는다.
|
||||
문서 갱신 자체로 build/test를 추가 실행하지 않았다.
|
||||
|
||||
@@ -120,3 +120,11 @@ Reduced/hybrid/incompatible/20절점, plasticity/contact, mixed shell-solid, pre
|
||||
warped stability·남은 bending shear locking, 임의 큰 변형/mesh/시간간격은 일반 보증 범위 밖이다.
|
||||
원본 U 일치만으로 physical a·장시간 에너지·전체 시간수렴을 검증했다고 주장하지 않는다.
|
||||
최적화 후 최종 source의 전체 MSVC Debug build/CTest·필수 원본·독립 물리 확인이 남는다.
|
||||
|
||||
## 통합된 local 경계
|
||||
|
||||
[SolidTrialElement/Hex8TrialAdapter](../../include/fesa/elements/element_capabilities.h)가 같은
|
||||
stable-address immutable Hex8 kernel의 stiffness·reference mass·paired response를 빌린다.
|
||||
Adapter에 equation·trial history를 옮기지 않으며 원래 paired 산술·실패 경계를 유지한다.
|
||||
공통 procedure·typed pending과 결과 dispatch는 [모듈화 요약](../cpp-object-oriented-modular-refactoring/README.md)을 따른다.
|
||||
Frequency 비교는 `reference/hexa/hexa_freq.txt`의 modal Value를 직접 사용한다.
|
||||
|
||||
@@ -126,4 +126,13 @@ C08b finer-grid·최신 최적화 source의 원본 HDF5 비교·전체 회귀·
|
||||
| --- | --- |
|
||||
| [2026-10-04 본식](formulation-historical-docs-cleanup-20261004.md), [관성 원본](formulation-inertia-historical-docs-cleanup-20261004.md) | 당시 consistent 정책의 수식·검토 이력이다. 현재 lumped/reduced/fixed-null 정책이 우선한다. |
|
||||
| [C08b Newton 연구](formulation-c08b-newton-research-20261012.md), [DAE 연구](formulation-dae-research-20261012.md) | 원인·후보 조사이며 모든 Newton/DAE 후보의 채택을 뜻하지 않는다. |
|
||||
| [운동량 연구](formulation-momentum-research-20261012.md), [graph certificate 초안](formulation-graph-certificate-draft-20261012.md) | 불변량·controller/certificate 연구의 원본이다. 현재 acceptance나 엄밀한 전역 오차 보증을 자동 대체하지 않는다. |
|
||||
| [운동량 연구](formulation-momentum-research-20261012.md), [graph certificate 초안](formulation-graph-certificate-draft-20261012.md) | 불변량·controller/certificate 연구의 원본이다. 현재 acceptance나 엄밀한 전역 오차 보증을 자동 대체하지 않는다. |
|
||||
|
||||
## 통합된 실행 경계
|
||||
|
||||
공통 [AnalysisProcedure](../../include/fesa/analysis/analysis_procedure.h) 선택 뒤 reduced 절차를 실행한다.
|
||||
[ShellHhtIntegrator](../../src/fesa/analysis/hht_reduced_integrator.h)는 predictor/rate 복원을,
|
||||
[EquilibriumStep](../../src/fesa/analysis/equilibrium_algorithm.h)은0부터 시작하는 correction과
|
||||
typed pending을 분리한다. History는 procedure가 소유하고 동일 acceptance 뒤 commit한다.
|
||||
빌드·선별 검사 결과는 [통합 현황](../cpp-object-oriented-modular-refactoring/README.md)을 따르며,
|
||||
과거 interrupted run·finest binary64 noise의 미판정을 새 전체 통과로 바꾸지 않는다.
|
||||
|
||||
@@ -48,7 +48,10 @@ Fine optional stress의 malformed node label `ss`는 비차단 inventory 문제
|
||||
Family의 reference-only `S=max(abs(ref))`에 대해 near-zero `abs(ref)<=0.01*S`는
|
||||
error `<=0.01*S`, 나머지는 relative error `<=5%`, family RMS/S `<=1%`를 함께 검사한다.
|
||||
Zero-scale은 exact zero다. Blocking·warning·review의 수치와 판정 영향을 구분한다.
|
||||
내부 accepted free residual·force/moment 평형의 normalized 기준은 `1e-10`이다.
|
||||
Accepted free residual은 matching external scale이 nonzero이면 infinity-norm relative `<=1e-2`,
|
||||
exact-zero이면 typed absolute `<=1e-3` force 또는 force-length다. Factor-one 전역 force/moment
|
||||
balance는 각각 normalized `<=1e-8`이다. 이는 기존 comparator의 승인 계약이며 두 양을
|
||||
하나의 `1e-10` 기준으로 요약하지 않는다. Linear 정적·HHT·eigen의 별도 gate는 바꾸지 않는다.
|
||||
|
||||
## 구현과 상태 수명
|
||||
|
||||
@@ -70,3 +73,13 @@ Reaction은 단일 global 합만 맞춰 local reaction 정확성을 대체할
|
||||
큰 자세 변화와 원점 이동에서 spatial moment balance를 함께 확인해야 한다.
|
||||
외부 U 통과는 warning UR 또는 review RF/RM의 수치 일치를 뜻하지 않는다.
|
||||
현재 prescribed path와 단일재료 shell 사례가 arbitrary nonlinear 모델의 수렴을 보장하지 않는다.
|
||||
|
||||
## 통합 시 자료와 API 상태
|
||||
|
||||
Procedure는 공통 [AnalysisProcedure](../../include/fesa/analysis/analysis_procedure.h)로 선택되고
|
||||
local trial은 [ShellTrialElement](../../include/fesa/elements/element_capabilities.h)를 통해 계산한다.
|
||||
Kernel은 immutable·stable-address borrowed object이고 accepted candidate는 procedure 소유다.
|
||||
Full Newton의 typed pending·iteration 순서는 [모듈화 요약](../cpp-object-oriented-modular-refactoring/README.md)을 따른다.
|
||||
정식 `reference/shellNL-meshfine/`와 `reference/shellNL-meshfine_02/` 자료가 없어 해당 비교는 미완료다.
|
||||
2026-10-18 사용자 지시에 따라 `reference/temp`로 대체하지 않는다. 정식 자료가 확보되어야
|
||||
hash·source identity·comparator 지원을 확인하고 실제 비교를 재개할 수 있다.
|
||||
|
||||
@@ -53,7 +53,9 @@ CSV의 frame·instance·source node와 component를 HDF5 nodal row에 직접 대
|
||||
Shared row/schema/finite precheck는 tolerance 이전 조건이며 warning family에도 적용한다.
|
||||
Reference-only `S=max(abs(ref))`에 대해 `abs(ref)<=0.01*S`는 error `<=0.01*S`,
|
||||
나머지는 relative error `<=5%`, family RMS/S `<=1%`를 요구한다. `S=0`은 exact zero다.
|
||||
내부 free residual·전역 force/moment balance는 normalized `1e-10`을 사용한다.
|
||||
Nonlinear accepted free residual은 [비선형 정적 기준](../nonlinear-static-newton-raphson/README.md)을
|
||||
따르고, factor-one 전역 force/moment balance는 각각 normalized `<=1e-8`이다.
|
||||
이는 [기존 pressure 정식화](formulation.md)의 승인 범위이며 linear 정적 기준과 구분한다.
|
||||
|
||||
## 구현과 수명
|
||||
|
||||
@@ -75,3 +77,10 @@ DSLOAD와 DLOAD의 부호 규칙을 섞거나 reference area로 follower load를
|
||||
같은 trial의 force/tangent를 함께 써야 Newton 일관성을 유지한다.
|
||||
외부 displacement 일치만으로 압력 tangent나 local reaction 정확성을 추론하지 않는다.
|
||||
한 개의 지정 shell pressure bundle은 arbitrary closed surface·offset face·contact pressure 검증이 아니다.
|
||||
|
||||
## 통합 시 기준자료 상태
|
||||
|
||||
정식 `reference/shellNL-meshfine-pressure/` 자료가 없어 실제 pressure bundle 비교는 미완료다.
|
||||
2026-10-18 사용자 지시에 따라 `reference/temp`는 검증에 사용하지 않으며 임시 묶음을 승격하지 않는다.
|
||||
Kernel·synthetic comparator 검사가 실제 pressure reference 통과를 대신하지 않는다.
|
||||
정식 자료 확보 후 원본 hash·source/frame 대응을 확인하고 작업 복사본으로 재검증해야 한다.
|
||||
|
||||
@@ -131,3 +131,11 @@ hash-checked 입력의 유일 instance와 결합하며 node source identity로 b
|
||||
접합부는 검증 한계다. 단일 NT11 시점으로 다른 station·flux·반력·전체 시간 정확도를
|
||||
검증했다고 주장하지 않는다.
|
||||
Dev 통합 승인은 새 필수 reference 통과 승인이 아니다.
|
||||
|
||||
## 통합된 kernel 경계
|
||||
|
||||
[ThermalElement/Ds4ThermalAdapter](../../include/fesa/elements/element_capabilities.h)는 immutable
|
||||
DS4 kernel을 빌리고 DOF11–15 layout·K/C와 interval·복구를 typed로 제공한다.
|
||||
Kernel의 주소·수명은 adapter보다 안정적이어야 한다. Thermal state·잔차 인증·accepted history와
|
||||
writer 실패 경계는 그대로 procedure/state/writer에 남는다. 전체 검증 대상에 과도 열해석도 포함하며,
|
||||
새 필수 reference 미확보와 기존 NT11 diagnostic 불일치를 통과로 바꾸지 않는다.
|
||||
|
||||
+51
-18
@@ -1,6 +1,6 @@
|
||||
# 솔버 공통 구조와 계약
|
||||
|
||||
FESA는 C++17 이상·Windows MSVC x64 Debug·CMake/CTest를 기준으로 하는 개인 연구용 솔버다. 승인된 Abaqus 입력 subset을 독립 모델로 해석하고 HDF5를 쓴다. Source spelling의 수용은 Abaqus 내부 요소·적분·알고리즘과의 동등성을 뜻하지 않는다. 외부 배포 형태·지원 환경·dependency 재배포 조건은 아직 정해지지 않았다.
|
||||
FESA는 C++17 이상·Windows MSVC x64 Debug·직접 MSBuild와 CMake/CTest를 기준으로 하는 개인 연구용 솔버다. 승인된 Abaqus 입력 subset을 독립 모델로 해석하고 HDF5를 쓴다. Source spelling의 수용은 Abaqus 내부 요소·적분·알고리즘과의 동등성을 뜻하지 않는다. 외부 배포 형태·지원 환경·dependency 재배포 조건은 아직 정해지지 않았다.
|
||||
|
||||
## 책임과 수명
|
||||
|
||||
@@ -49,23 +49,56 @@ Configure/build/test의 compiler·구성·build tree를 함께 맞추고 discove
|
||||
|
||||
## 빌드와 직접 검사
|
||||
|
||||
MSVC x64 Developer PowerShell에서 저장소 root를 작업 디렉터리로 사용한다. CMake3.25 이상,
|
||||
Ninja, 로컬 GoogleTest source checkout과 MKL·TBB·HDF5 개발 package가 필요하다.
|
||||
`FESA_GTEST_SOURCE_DIR`은 GoogleTest의 CMakeLists.txt가 있는 source root이고,
|
||||
`MKL_DIR`·`TBB_DIR`·`HDF5_DIR`은 각각 package config 파일이 있는 디렉터리다.
|
||||
환경 변수에 로컬 경로를 지정한 뒤 [CMake presets](../../CMakePresets.json)의 직접 명령을 사용한다.
|
||||
직접 관리하는 [FESA.sln](../../FESA.sln)과 [msvc 지침](../../msvc/AGENTS.md)이 주 개발 빌드다.
|
||||
VS x64 개발 환경에서 저장소 root를 작업 디렉터리로 사용한다. v145 toolset과 로컬
|
||||
GoogleTest source checkout, MKL ILP64/dynamic/Intel threading·TBB·HDF5·OpenMP가 필요하다.
|
||||
`FESA_GTEST_SOURCE_DIR`, `FESA_MKL_ROOT`, `FESA_TBB_ROOT`, `FESA_HDF5_ROOT`,
|
||||
`FESA_OMP_ROOT`에 설치 root를 지정하거나 ignored `msvc/Fesa.Local.props`로 주입한다.
|
||||
개인 설치 경로를 추적 파일에 고정하거나 dependency를 자동 다운로드하지 않는다.
|
||||
|
||||
```powershell
|
||||
cmake --preset windows-msvc-ninja-debug
|
||||
cmake --build --preset windows-msvc-ninja-debug
|
||||
ctest --preset windows-msvc-ninja-debug --show-only=json-v1
|
||||
ctest --preset windows-msvc-ninja-debug --output-on-failure
|
||||
```bat
|
||||
MSBuild FESA.sln /m:2 /p:Configuration=Debug /p:Platform=x64
|
||||
.build\native\Debug\tests\fesa_unit_tests.exe
|
||||
.build\native\Debug\tests\fesa_integration_tests.exe
|
||||
.build\native\Debug\tests\fesa_reference_tests.exe
|
||||
```
|
||||
|
||||
Debug build tree는 `build/windows-msvc-ninja-debug`, 별도 Release는
|
||||
`build/windows-msvc-ninja-release`이며 configure/build preset 이름도 각각 대응한다.
|
||||
Debug와 Release의 binary·test inventory·evidence를 섞지 않는다. CTest discovery와 실제
|
||||
종료 코드를 함께 확인한다. Python 검사가 필요하면 해당 suite를 별도로 실행하며 CTest에
|
||||
포함됐다고 추론하지 않는다. [CMake](../../CMakeLists.txt)의 `fesa_docs` target은 Doxygen을
|
||||
찾았을 때만 생성되므로 선택적 API 문서 산출물이다. CLI executable은 각 build tree의
|
||||
`src/fesa/fesa.exe`이며 dependency runtime DLL을 함께 준비한다.
|
||||
Native CLI는 `.build/native/Debug/src/fesa/fesa.exe`이며 테스트 executable은
|
||||
`.build/native/Debug/tests/`에 있다. Release는 같은 구조의 `Release` 디렉터리다.
|
||||
직접 MSBuild에 CMake·Ninja·Doxygen을 선행 조건으로 추가하지 않는다.
|
||||
|
||||
보조 경로는 CMake3.25 이상·Ninja·동일 MSVC 환경을 사용한다. `MKL_DIR`·`TBB_DIR`·
|
||||
`HDF5_DIR`은 각각 config package 디렉터리다. 한국어 MSVC의 include 추적을 위해
|
||||
configure/build 모두 code page 65001을 사용한다.
|
||||
|
||||
```bat
|
||||
chcp 65001
|
||||
cmake --preset windows-msvc-ninja-debug
|
||||
cmake --build --preset windows-msvc-ninja-debug --parallel 2
|
||||
ctest --preset windows-msvc-ninja-debug --show-only=json-v1
|
||||
ctest --preset windows-msvc-ninja-debug --output-on-failure -j 1
|
||||
python -m pytest tests -q
|
||||
```
|
||||
|
||||
[Presets](../../CMakePresets.json)의 Debug tree는 `.build/cmake-debug`, Release는
|
||||
`.build/cmake-release`다. CMake CLI도 각 tree의 `src/fesa/fesa.exe`에 있다.
|
||||
Debug/Release의 binary·DLL·검사 목록·실행 근거를 섞지 않는다. AVX2는 전용 Hex8
|
||||
source에만 적용하며 CRT·정밀도·source·link·runtime DLL과 검사 identity를 두 경로에서 대조한다.
|
||||
`fesa_docs`는 Doxygen을 찾았을 때만 생기는 선택적 target이다.
|
||||
|
||||
현재 통합 검증은 세 C++ executable의 전체 등록 검사와 별도 Python suite를 대상으로 한다.
|
||||
과거 Refactor의 정적 선별 실행을 이번 전체 실행으로 승계하지 않는다. Native/CTest는
|
||||
서로 다른 실행 전용 TMP/TEMP와 raw 출력 경로를 사용해 직렬 실행한다. 상속된 필터·sharding을
|
||||
제거하고 실제 identity·수·exit·XML/log를 discovery와 대조한다. Skip·0건·자료 누락은 PASS가 아니다.
|
||||
모델은 hash가 확인된 새 작업 복사본에서만 실행한다. `reference/temp`는 검증에 사용하지 않는다.
|
||||
현재 진행 결과와 미완료 비교는 [병합 현황](../cpp-object-oriented-modular-refactoring/README.md)에 기록한다.
|
||||
|
||||
## 공통 procedure와 결과 경계
|
||||
|
||||
[PrepareAnalysisInput/CreateAnalysisProcedure](../../include/fesa/analysis/prepared_analysis.h)는
|
||||
한 번 mapping한 Domain에서 한 family를 선택한다. `AnalysisProcedure::Execute`는
|
||||
[typed outcome](../../include/fesa/analysis/prepared_analysis_outcome.h)을 반환하며 파일을 열지 않는다.
|
||||
Domain과 주입된 solver·parallel·log adapter는 실행 동안 살아 있고 이동하지 않아야 한다.
|
||||
App이 로그 close 성공을 확인한 뒤 `FinalizePreparedAnalysisResult`가
|
||||
[WritePreparedAnalysisResult](../../include/fesa/results/prepared_results_writer.h)로 연결한다.
|
||||
필요한 writer 부재는 output failure이며 다른 결과 family로 위장하지 않는다.
|
||||
|
||||
@@ -13,3 +13,9 @@
|
||||
optional state·virtual method를 공통 base에 추가하지 않는다.
|
||||
- Interface 변경은 consumer compile, 소유권·수명, invalid combination과 현재 결과의
|
||||
보존을 검증한다. 선언만 추가하고 parser나 CLI 지원까지 완료됐다고 보고하지 않는다.
|
||||
|
||||
- AnalysisProcedure는 파일을 열지 않고 typed completed outcome을 반환한다. Factory에 빌려준
|
||||
Domain·solver·parallel·log adapter는 실행 동안 이동하지 않는다. Element capability adapter가
|
||||
빌린 immutable kernel도 adapter보다 오래 살고 같은 주소를 유지해야 한다.
|
||||
- Prepared 결과 dispatch의 writer 부재는 output failure다. 잘못된 family로 변환하거나
|
||||
로그 close 이전에 최종 HDF5를 공개하지 않는다.
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
이 영역은 fesa_solver와 fesa_cli의 production 구현을 소유한다. Public interface와 vendor
|
||||
resource 사이의 구현 책임을 유지하며 테스트 실행기나 문서 workflow를 solver에 연결하지 않는다.
|
||||
|
||||
- CMake target에 새 source와 필요한 private dependency를 명시한다. Link 성공뿐 아니라
|
||||
- 직접 MSVC 프로젝트와 대응 CMake target에 같은 source와 필요한 private dependency를 명시한다. Link 성공뿐 아니라
|
||||
Windows runtime staging의 영향을 확인한다.
|
||||
- Public consumer가 implementation header를 include하도록 경로를 공개하지 않는다.
|
||||
MKL·TBB·HDF5·Win32는 private adapter 뒤에 둔다.
|
||||
|
||||
@@ -14,3 +14,9 @@ Analysis는 준비된 Domain을 procedure별로 실행하고 equation·backend·
|
||||
- Frequency reduction은 null/finite 공간과 공개 mode 수·내부 검증 수를 구분한다.
|
||||
- 초기화, nonzero BC, all-constrained, 증분·반복 종료 경계, 실패 보존, temporal convergence,
|
||||
반복 결정론과 backend failure를 검증한다. 한 reference의 U 일치로 모든 physics를 통과시키지 않는다.
|
||||
|
||||
- 공통 AnalysisProcedure 선택과 family별 typed outcome을 유지한다. EquilibriumAlgorithm은
|
||||
iteration만 조정하고 typed candidate는 procedure-local EquilibriumStep이 소유한다.
|
||||
Static1/HHT0 시작·inclusive endpoint와 실패 보존을 유지한다.
|
||||
- ShellHhtIntegrator는 predictor/rate 복원만 담당한다. Chart/root/solver/callback은 borrowed
|
||||
call view이며 출력 rate buffer는 입력·서로와 alias하지 않는다. Accepted history는 소유하지 않는다.
|
||||
|
||||
@@ -14,3 +14,7 @@ Global equation 번호, 공유 sparse write와 파일 저장은 소유하지 않
|
||||
변경에 맞게 검증한다.
|
||||
- End action·단면력·응력의 location과 부호가 다르면 같은 recovery 함수로 강제하지 않는다.
|
||||
Local kernel 완료를 Abaqus 입력이나 CLI 노출 완료로 확대하지 않는다.
|
||||
|
||||
- ShellTrial/SolidTrial/ShellInertia/Thermal/ShellReference capability는 local 계약이다.
|
||||
Adapter는 stable-address immutable kernel을 빌리며 equation·accepted history를 소유하지 않는다.
|
||||
Shell·solid·thermal layout이나 response를 하나의 무타입 buffer로 합치지 않는다.
|
||||
|
||||
@@ -12,3 +12,7 @@ HDF5 layout이나 reference 데이터를 맞추기 위한 보정은 하지 않
|
||||
- 전체 recovery candidate의 finite·identity·balance 검증 뒤 state에 반영한다.
|
||||
- Analytical recovery, thickness scaling, 원점·좌표변환, force/moment balance, failure
|
||||
preservation와 row ordering을 검증한다. Displacement 일치만으로 recovery를 승인하지 않는다.
|
||||
|
||||
- WritePreparedAnalysisResult는 completed typed outcome을 해당 authoritative writer로 보낸다.
|
||||
호출자는 로그 close 성공을 먼저 확인하며 선택 family의 필수 adapter 부재는 output failure다.
|
||||
Dispatch가 schema·수치 gate·candidate finalize를 우회하지 않게 한다.
|
||||
|
||||
@@ -11,3 +11,6 @@ Model 수정, constraint 추가와 물성 변경은 solver 실패의 대안이
|
||||
남기지 않는다. Empty free 처리의 caller/backend 계약을 유지한다.
|
||||
- 알려진 해, residual, 잘못된 matrix, failure/reuse, size 변환과 resource 정리를 검증한다.
|
||||
해가 finite인 것만으로 FEM 평형을 통과했다고 보고하지 않는다.
|
||||
|
||||
- 공통 private Pardiso Session의 factor/solve/release 소유권과 failure cleanup을 유지한다.
|
||||
기존1×1 local-thread/TLS 회피의 범위를 모든 matrix/vendor heap 문제의 해결로 확대하지 않는다.
|
||||
|
||||
@@ -14,3 +14,10 @@ Tests는 solver 동작·수학적 일관성·외부 비교와 C++ 개발 규약
|
||||
- Reference의 경로·값·naming·metadata를 임의 수정하지 않는다. 검증용 algebra fixture의
|
||||
입력 자유도를 공개 CLI 지원으로 승격하지 않는다.
|
||||
- 미실행·skip·제외·실패를 PASS로 계산하거나 폐기된 workflow를 복원하지 않는다.
|
||||
|
||||
- 직접 MSVC와 CMake의 세 executable 전체 등록 identity를 대조하고 직렬 실행한다.
|
||||
두 실행의 TMP/TEMP·XML·raw 경로를 분리하고 inherited filter/sharding을 제거한다.
|
||||
HHT·eigen·thermal을 과거 정적 선별 범위 밖이라는 이유로 제외하거나 삭제하지 않는다.
|
||||
- `reference/temp`는 검증에 사용하지 않는다. 정식 reference 부재는 자료 누락으로 기록한다.
|
||||
통합 검증 전에는 중복·폐기 내부구조 검사도 최종 삭제하지 않는다. 삭제 시 이관표에
|
||||
동등한 대체 identity·실패 경계·수치 조건 또는 폐기 구조를 연결한다.
|
||||
|
||||
Reference in New Issue
Block a user