435 lines
31 KiB
Markdown
435 lines
31 KiB
Markdown
# Shell 과도 열전달 구현·검증 기록
|
||
|
||
- Feature ID: `shell-transient-heat-transfer`
|
||
- Owner: 메인 assistant
|
||
- 상태: 기존 전체 baseline 확보; 열해석 구현·검증 진행 중. 제품 검증 완료가 아니다.
|
||
- 기준: [PRD](PRD.md), [ADR](ADR.md), [정식화](formulation.md),
|
||
[독립 수치 검토](numerical-review.md), [공통 tolerance](../TOLERANCE.md).
|
||
|
||
## Production 변경 전 baseline
|
||
|
||
검사 대상 source revision은 `a3502c9b974bc17698d57438274408f29317ced4`다.
|
||
검사 도중 reference 두 파일만 `e6fd9e9`에 추가했으며 production source와 테스트는 변경하지 않았다.
|
||
정식화·계약 문서 편집은 별도 task checkout에서 수행했다.
|
||
|
||
Windows MSVC x64 Debug, CMake/Ninja와 기존 설치된 의존성을 사용했다.
|
||
MSVC toolset 14.51.36231, oneAPI MKL 2026.1, TBB 2023.1, HDF5 2.1.1 및
|
||
승인 local GoogleTest checkout을 사용했다. 머신별 절대 경로는 개인 실행 환경에만 둔다.
|
||
저장소에 `.harness/config.json`이 없어 직접 preset을 실행했다.
|
||
|
||
| 실행 | Captured exit | 관찰 |
|
||
| --- | --- | --- |
|
||
| `cmake --preset windows-msvc-ninja-debug -DCMAKE_PROJECT_FESA_INCLUDE=` | 0 | Configure 완료; 추가 task source overlay 없음 |
|
||
| `cmake --build --preset windows-msvc-ninja-debug --parallel 4` | 0 | 전체 baseline build 완료; compiler warning 검색 결과 없음 |
|
||
| `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | 0 | 478개 검사 발견 |
|
||
| `ctest --preset windows-msvc-ninja-debug --output-on-failure` | 8 | 478개: 475 PASS, 2 FAIL, 1 SKIP. 3480.67초; 전체 검사 제외 없음 |
|
||
|
||
실제 로그·argv·revision·exit·완료 시각은 로컬 `.dryforge/evidence/baseline-*.log`와
|
||
각 `.log.json`에 보존한다. 전체 CTest 로그도 `.dryforge/evidence/baseline-LastTest.log`에
|
||
복사해 후속 실행으로 덮어쓰이지 않도록 보존했다. Native CTest exit은 8이고 외부
|
||
PowerShell 실행 도구는 실패 exit 1을 반환했다. 아래 표는 실제 로그의 값을 요약한다.
|
||
|
||
### 기존 HHT 실패
|
||
|
||
`HhtShellPhysics.C08aRigidManufacturedOrbitFullCoordinateTimeConvergence`는
|
||
828.34초 실행 후 실패했다. 여섯 channel의 정의와 원래 판정은
|
||
`tests/unit/analysis/hht_shell_physics_test.cpp`의 해당 검사 그대로다.
|
||
|
||
| 실패 metric | 실제 값 | 기존 기준 |
|
||
| --- | --- | --- |
|
||
| Channel 3 최종 refinement error / noise floor | `1.178006582488537e-6` / `1.664587376115457e-6` | error > noise floor |
|
||
| Channel 5 마지막 시간격자의 최대 error | `5.675659240050177e-4` | <= `1e-4` |
|
||
| Channel 5 두 refinement order | `1.0286686694389584`, `1.0289692381730642` | 각각 >= `1.8` |
|
||
| Channel 5 error / noise floor | `5.675659240050177e-4` / `8.1556816896757325e-4` | error > noise floor |
|
||
|
||
`HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants`는
|
||
2382.81초 실행 후 실패했다. 마지막 공통시간 차이는 다음과 같다.
|
||
|
||
| Channel | 마지막 self-difference | 기존 기준 |
|
||
| --- | --- | --- |
|
||
| q_u | `5.5474274071377627e-6` | <= `1e-4` (이 항목은 통과) |
|
||
| q_phi | `1.3870090193204238e-4` | <= `1e-4` |
|
||
| v_u | `1.7761250930811503e-4` | <= `1e-4` |
|
||
| v_phi | `1.15434079805253e-2` | <= `1e-4` |
|
||
| a_u | `1.1979645042237048e-2` | <= `1e-4` |
|
||
| a_phi | `8.6893881162834119e-1` | <= `1e-4` |
|
||
|
||
q_phi/v_phi/a_u/a_phi의 마지막 두 관측 차수는 각각
|
||
`(-.1538334889569796,.17869938751647654)`,
|
||
`(-.084636748464689021,.057860368459572473)`,
|
||
`(.4062904963410236,.20093674620022031)`,
|
||
`(-.15578672026532631,.17674898422982255)`로 기존 `>=1.8`에 미달했다.
|
||
v_u의 마지막 차수도 `.85658192310858094`로 미달했다.
|
||
Linear momentum drift의 마지막 세 값은
|
||
`3.8504721819452428e-14`, `4.8249991985258491e-14`, `2.004031863681472e-13`으로,
|
||
원래 strict decrease와 마지막 비율 `<=.6` 검사도 실패했다. 작은 값이라는 이유로 면제하지 않는다.
|
||
최종 energy/L drift는 `9.5590394502167011e-7` / `4.2974921804532845e-7`이었다.
|
||
이 실패 양상은 [기존 HHT physics 검토](../hht-implicit-dynamics/physics-evaluation.md)의
|
||
미해결 C08 범위와 일치하며 열해석 변경 이전에 재현했다.
|
||
|
||
### 기존 HHT N7 inconclusive
|
||
|
||
`HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved`는
|
||
기존 테스트의 명시 `GTEST_SKIP()` 분기로 SKIP이었다. Full/reduced acceleration defect
|
||
`3.0790209097630861e-10`이 기존 비교 기준 `1e-10`보다 크지만 arithmetic/solve resolution
|
||
`6.2961354117696263e-10` 이하인 경우를 N7 INCONCLUSIVE로 표시하는 원래 검사다.
|
||
원인과 범위를 `tests/unit/analysis/hht_temporal_verification_test.cpp:478` 및 실제 출력으로
|
||
대조했다. 환경 누락이나 열 기능의 미실행이 아니며, 이 항목을 PASS로 세지 않는다.
|
||
최종 전체 검사에서도 이 분류와 metric을 대조하고 새 skip으로 검증을 회피하지 않는다.
|
||
|
||
승인된 예외는 재현된 무관한 기존 HHT 실패의 별도 보존뿐이다. 마지막 전체 검사에서
|
||
동일 metric을 대조하여 새 실패·악화 여부를 확인한다. 기존 실패를 PASS/SKIP으로 바꾸거나
|
||
전체 CTest green으로 보고하지 않는다. 예상하지 못한 실패와 열해석 필수 실패는 자동 면제하지 않는다.
|
||
|
||
## Reference 복사와 원본 보존
|
||
|
||
`git worktree list --porcelain`으로 확인한 동일 저장소 `dev` checkout의
|
||
`reference/shell-thermal/`에서 다음 두 파일을 같은 상대 경로로 byte 그대로 복사했다.
|
||
원본과 복사본의 SHA256이 각각 일치했고, 복사본을 `e6fd9e9`에 기록했다.
|
||
|
||
| 파일 | 원본과 복사본의 SHA256 |
|
||
| --- | --- |
|
||
| `shell-thermal.inp` | `955C8BEEC35CE53DA5F5DD48785CF8C12FCE726EBFDE7EAE40CF69DBF00D6EA4` |
|
||
| `shell-thermal NodalTemperature.csv` | `765B0D0F64C24CDE6D033D6EF80E0267275A496C97E28D932466EB877810D3E5` |
|
||
|
||
Abaqus 실행·reference 재생성·이름 변경·내용 보정은 수행하지 않았다.
|
||
이 hash 확인은 FESA/reference 수치 비교 통과 evidence가 아니다.
|
||
|
||
## 구현 및 최종 검증
|
||
|
||
### 구현 전 수치 계약
|
||
|
||
정식화와 승인 범위의 정합, 전체 patch certificate, source 접속, 시간격자·오차·수렴·slab
|
||
검증 기준을 작성하고 독립 수치 검토를 마쳤다. 검토 대상 정식화의 마지막 수식 변경은
|
||
`dd409b5`, 독립 보고서의 최종 보완은 `6df5a17`이다. 설계상 blocking 지적은 해결했다.
|
||
소스 구현의 정확도 통과 판정은 아니다.
|
||
|
||
- 전역 T-edge 좌표 검사를 source endpoint를 공유하는 후보로 제한하여 disconnected 접촉을 구별했다.
|
||
- 입력 rounding-cell을 놓치는 시간격자 반례를 발견하고 정확한 cell overlap으로 보완했다.
|
||
Production은 최대 122비트의 고정 폭 연산이며 새 임의정밀도 의존성을 요구하지 않는다.
|
||
- 공간수렴 검증은 8/16/32/64 정사각 mesh, `T=.001`, 32증분으로 고정했다.
|
||
기존 관찰 차수 기준을 유지하고 시간오차/공간오차 비율의 최대값 `.006864`를 확인했다.
|
||
가장 큰 mesh의 온도·flux 원시 이력은 약 77.3MiB다.
|
||
- 고정5점의 초기 slab 오차·warped 3×3 적분 오차는 별도로 정량화했다.
|
||
|
||
통합된 문서의 [독립 oracle 부록](numerical-oracle-scratch.md)의 Python block 5개를
|
||
메인이 다시 추출 실행했다. Captured Python exit 0,
|
||
`ALL SCRATCH BLOCKS COMPLETED`를 확인했고 출력은
|
||
`.dryforge/evidence/t1-oracle-replay.log`에 보존했다.
|
||
기능 문서의 링크·anchor·요구사항 ID 및 `git diff --check`도 통과했다.
|
||
문서 변경을 이유로 solver build/CTest를 반복하지 않았다.
|
||
|
||
### Thermal semantic model
|
||
|
||
열물성·Domain·AnalysisModel semantic 구현을 `254247e`, `283628e`로 작성하고,
|
||
독립 코드 검토에서 해당 범위의 잔여 차단 항목이 없음을 확인했다.
|
||
BC/CFLUX는 source DOF 11·15만 허용한다. 열 재료·단면의 local index와 전체 Domain
|
||
material index를 구분하며, 구조 step 접근을 열 모델에 잘못 호출하면 명시적으로 실패한다.
|
||
두 단계 BC는 원본 수준별 정의를 보존하며 최종 상속·override는 후속 입력/실행 연결의 책임이다.
|
||
|
||
Endpoint 제한의 행동 재현 검사에서 기존 구현이 12·13·14를 수용하여 CTest exit 8을
|
||
확인했고 수정 후 통과했다. 이전 API 누락에 의한 compile 실패는 행동 재현 evidence로
|
||
계산하지 않는다. 잘못된 물성·두께, 비활성 target, 초기값·BC 충돌, constrained CFlux
|
||
중복·순서 보존, 이동 후 소유 데이터 접근과 다중 재료 인덱스를 검사했다.
|
||
|
||
작업 checkout의 clean MSVC x64 Debug build와 최종 fixture 추가 후 incremental build는
|
||
각각 exit 0이다. 최종 관련 CTest는 **21/21 PASS**, exit 0이며 compiler warning은
|
||
검색되지 않았다. 실제 evidence는 `t2-correction-clean-build-build.log`,
|
||
`t2-correction-final-build-build.log`, `t2-correction-final-regression-test.log` 및 각
|
||
명령·cwd·native exit JSON에 보존했다. 실행 당시 HEAD는 commit 전 `254247e`이고,
|
||
최종 검사 09:47:06 UTC 후 동일 수정분을 `283628e`로 기록했다.
|
||
|
||
검증 중 한국어 MSVC `/showIncludes` prefix가 CMake에서 잘못 decode되어 Ninja가
|
||
header dependency를 0개로 기록하는 환경 문제를 발견했다. Header 변경 후 이전 객체를
|
||
재사용하여 AnalysisModel 접근 오류가 발생했다. 개인 검증 환경에서 실제 UTF-8 prefix를
|
||
지정하고 clean build한 뒤 같은 객체의 dependency가 47개이며 관련 header를 포함함을
|
||
확인했다. 잘못된 추적 상태의 중간 incremental 결과는 최종 evidence로 사용하지 않는다.
|
||
Production 변경 전 baseline은 175개 build action을 처음부터 실행한 결과로 유지한다.
|
||
|
||
공통 CMake source/test 등록 후 통합 checkout에서도 clean build exit 0, CTest inventory
|
||
**487개**, 관련 semantic·기존 structural DOF 검사를 포함한 **29/29 PASS**를 확인했다.
|
||
Evidence는 `.dryforge/evidence/semantic-integrated-{configure,build,test}.log`와
|
||
`semantic-integrated-serial-inventory.log`다. 최초 inventory와 test를 동시에 시작했을 때
|
||
GoogleTest discovery의 공용 JSON 생성이 경합하여 inventory exit 8이 발생했다.
|
||
직렬 inventory 재실행은 exit 0이며, 이후 같은 build tree의 discovery/test는 직렬 실행한다.
|
||
|
||
### Thermal DOF 매핑
|
||
|
||
`e71f3ad`, `17a2355`의 열 5성분 profile, 활성 절점 번호, 20-entry scatter, partition과
|
||
CSR 매핑을 독립 검토했다. Canonical 11..15 순서, 비연속 반복 절점, 잘못된 enum 범위,
|
||
구조/열 profile 오용을 거부한다. 미사용 절점이 중간에 있는 경우와 공유 edge·분리 영역,
|
||
BC 상속·override, 실패 후 전체 mapping 보존을 확인했다.
|
||
|
||
`t4-final3-build.log`는 native exit 0, `t4-final3-test.log`는 **13/13 PASS**, exit 0이다.
|
||
이 중 기존 structural DofManager 검사는 8개다. `t4-final2-inventory.log`의 491개는
|
||
discovery 수이며 전체 실행 수가 아니다. 검사 후 마지막 수정은 줄바꿈·들여쓰기뿐임을
|
||
독립 reviewer가 확인했고, 범위 내 잔여 차단 항목 없이 `7b9a36c`로 통합했다.
|
||
요소 kernel과 결합한 통합 검사는 kernel 완료 후 수행한다.
|
||
|
||
PATH 밖의 설치된 clang-format을 확인한 뒤 새 semantic 파일의 서식을 적용했다.
|
||
`8ba4d18`은 세 신규 파일의 서식 수정이며 관련 신규 header/source/test의 dry-run 검사는
|
||
exit 0이다. 앞선 수동 서식 확인을 formatter 실행으로 대신 주장하지 않는다.
|
||
|
||
### 시간격자 독립 실행 확인
|
||
|
||
요소 kernel과 분리된 시간격자 checkpoint `e33ee6a`를 독립 검토자가 별도 실행기로
|
||
컴파일했다. Production의 binary64 입력 cell 판정을 exact Fraction oracle의
|
||
**11,043개 사례**에 대조했고, 유효 11,030개와 입력·INC 거부 13개에서 불일치가 없었다.
|
||
**66,023개 Frame 표본**의 저장 시각·실제 delta가 비트 단위로 일치했다.
|
||
기본 INC=100, 범위 밖 Frame 거부와 진단도 확인했다.
|
||
|
||
MSVC `/Od /W4 /WX /fp:precise` standalone build, runner 및 비교기는 각각 native exit 0이다.
|
||
원래 subnormal 간격, open/closed midpoint, 최대 finite, 실제 shortened 마지막 증분과
|
||
거대한 count의 O(1) 사전검사를 포함한다. Evidence는 작업 checkout의
|
||
`.dryforge/review/time_grid_e33ee6a/`에 committed source manifest, 실제 출력,
|
||
`comparison.json` 및 실행 명령으로 보존했다. 이는 시간격자에 한정한 evidence이며
|
||
kernel·procedure·physics의 최종 판정을 대신하지 않는다.
|
||
|
||
### 요소 kernel과 형상 검증
|
||
|
||
요소 구현 checkpoint `32f0c16`의 독립 행동 계약 검토에서 잔여 차단 항목이 없었다.
|
||
Domain의 node/section 범위 검사 뒤 전체 patch와 source 접속을 검사하며, 분리 영역의
|
||
좌표 접촉을 자동 연결하지 않는다. Recovery는 4×6 위치, 중립면의 별도 두 trace와
|
||
열벡터 `e1/e2/n`을 유지한다. 생성·복구 실패는 기존 kernel을 변경하지 않는다.
|
||
|
||
작업 checkout의 `t3-ready-build.log`, `t3-ready-test.log`는 native exit 0이며
|
||
**32/32 PASS**다: kernel 10, geometry 9, time 7, semantic 6개다.
|
||
`t3-ready-inventory.log`의 513개는 discovery 수이며 전체 실행 수가 아니다.
|
||
실행 metadata의 HEAD는 commit 전 `e33ee6a`이고, 검사한 수정분을 이후 `32f0c16`에
|
||
기록했다. Build warning은 검색되지 않았고 formatter와 `git diff --check`도 통과했다.
|
||
`32f0c16`의 독립 수치 검토도 잔여 차단 항목 없이 통과했다. Commit에서 추출한 실제
|
||
kernel/geometry를 MSVC로 별도 컴파일하여 고정밀 oracle와 대조했다.
|
||
|
||
- 유효 fixture 22개의 C/K 계수 17,600개와 평가점 198개의 면적·gradient enclosure
|
||
2,574개에서 production 반올림 오차 경계 위반이 없었다.
|
||
- 직접 54점 적분과 절댓값 contribution 기준, C 양정치·K rank 19·상수 모드,
|
||
두께 변화·별도 중립면 trace·source topology 14개 사례를 확인했다.
|
||
- 고정 affine/distorted/saddle 사례의 3/5/7 적분 진단과 production C/K를 이용한
|
||
독립 BE 대수 응답, 실제 `Recover`의 온도 응답 5개를 확인했다. 전역 procedure를
|
||
실행한 결과는 아니다.
|
||
|
||
실제 명령·native exit와 계산 결과는 작업 checkout의
|
||
`.dryforge/review/kernel_32f0c16/`에 보존했다. 최종 compile/runner/checker는 모두 exit 0이다.
|
||
최초 surface oracle는 이동된 평판의 정확한 영 성분에 남은 고정밀 cancellation 폭으로
|
||
exit 1이었다. 입력 좌표 차를 exact Fraction으로 계산하여 oracle의 translation을
|
||
제거한 뒤 같은 포함 검사가 통과했다. Production 변경이나 tolerance 완화는 없었다.
|
||
공통 CMake 등록 commit `85b5daa`에서 MSVC x64 Debug clean build exit 0,
|
||
inventory **517개**, 열·기존 Domain·자유도 관련 **89/89 PASS**, exit 0을 확인했다.
|
||
Evidence는 `.dryforge/evidence/thermal-kernel-final-{configure,build,inventory,test}.log`와
|
||
각 native exit JSON이다. 전체 CTest 실행은 아니며 최종 회귀는 별도로 남는다.
|
||
|
||
최초 통합 build는 exit 0이었지만 Windows PowerShell 5가 UTF-8 BOM 없는 개인 helper의
|
||
한국어 prefix를 잘못 읽어 header 의존성 추적이 손상됐다. Helper에 BOM을 추가하고
|
||
`pwsh`로 configure 및 clean build를 다시 수행했다. 최종 Ninja prefix와 실제 header
|
||
dependency를 확인했으며, 중간 `thermal-kernel-integrated-build.log`는 최종 근거를
|
||
대신하지 않는다. 이 보완은 개인 검증 환경에 한정하며 제품 소스 변경은 없다.
|
||
|
||
### 결정적 조립과 accepted state
|
||
|
||
`54154bee`의 full K/C/Q 조립과 결과 state를 독립 검토하여 잔여 차단 항목이 없음을
|
||
확인했다. Local kernel 오차와 순서가 고정된 합산 오차를 포함한 경계를 제공하며,
|
||
constrained Q도 보존한다. State는 생성 뒤 Domain 수명에 의존하지 않고 raw 초기
|
||
프레임, immutable row mapping, 정확한 schedule 및 완료 프레임을 소유한다.
|
||
|
||
작업 checkout의 `t6-final-{build,inventory,test}.log`는 각각 native exit 0이다.
|
||
Inventory 528개 중 관련 **11/11 PASS**이며 24종류의 candidate 손상에 대한 전체
|
||
이력 보존과 UINT32_MAX schedule의 선할당 방지도 검사했다. 실행 당시 HEAD는
|
||
commit 전 `85b5daa`였고, 같은 수정분을 `54154bee`에 기록했다.
|
||
|
||
독립 실행기는 committed assembler/state를 별도 컴파일하여 4요소·9활성절점의
|
||
서로 다른 물성·두께 및 global material offset 모델을 검산했다. Exact Fraction
|
||
oracle의 C/K **4,050항**과 **40개 하중 사례**를 대조했고, 유효 39개와 overflow
|
||
거부 1개가 기대와 일치했다. Serial/actual TBB의 값·오차 경계·flux는 비트 단위로
|
||
일치했다. State의 초기값·완료 여부·잘못된 uint64 frame 거부·복사 독립성도 확인했다.
|
||
|
||
Evidence는 작업 checkout의 `.dryforge/review/t6_54154bee/`에 보존했다.
|
||
최초 reviewer runner의 정수 narrowing compile 실패를 구별해 기록했으며,
|
||
수정 후 compile/runner/Fraction checker/source audit는 모두 실제 exit 0이다.
|
||
입력 파서와 합친 통합 검사 결과는 아래에 기록한다.
|
||
|
||
### Thermal 입력 subset과 진단
|
||
|
||
입력 구현 `203d068`을 독립 검토하여 T5 범위의 잔여 차단 항목이 없음을 확인했다.
|
||
DS4 inline ELSET, 상수 물성·5점 단면, raw 초기값, model/step 경계조건,
|
||
source 순서 CFLUX와 정확한 시간격자를 연결한다. 부가 keyword는 승인된 형식만
|
||
허용하며 source warning을 남긴다. 미사용 surface도 target을 검증하고 보존한다.
|
||
|
||
검토에서 strict output/restart, surface resolution, source 진단 및 mixed procedure
|
||
문제를 보완했다. 마지막 DS4 inline ELSET 거부와 beam section 무시 문제는 실제
|
||
반례 4개의 실패(native exit 8)를 확인한 뒤 수정했다. 같은 집합 내부의 member는
|
||
STH-C01에 따라 한 번 전개하고, 별도 CFLUX source row는 가산 대상으로 유지한다.
|
||
|
||
작업 checkout의 `t5-inline-green-{build,test,inventory}.log`와 JSON에서 각각
|
||
native exit 0을 확인했다. 관련 **82/82 PASS**는 thermal 입력 32개와 기존 structural
|
||
입력 50개이며 inventory **549개**는 전체 실행 수가 아니다. 검사 당시 HEAD는
|
||
수정 전 `360f8df`였고, `t5-inline-manifest.json`의 소스·테스트 hash가 최종 commit과
|
||
일치함을 독립 확인했다. 원본 reference 두 파일의 hash는 변경되지 않았다.
|
||
공통 CMake 등록 commit `983e2fe`에서 configure/build/inventory/test가 각각
|
||
native exit 0이었다. 실제 inventory는 **560개**, 열·기존 입력·Domain·자유도 관련
|
||
**152/152 PASS**다. 새 compiler warning이 없고 Ninja의 실제 header dependency도
|
||
정상임을 확인했다. Evidence는
|
||
`.dryforge/evidence/thermal-input-state-integrated-{configure,build,inventory,test}.log`
|
||
및 native exit JSON이다. 전체 회귀 검사는 아니며 시간 적분·HDF5·CLI 이후에 수행한다.
|
||
|
||
### 시간 적분 구현 전 residual 해석 확인
|
||
|
||
정식화의 reduced 분모 `D_f=||A_ff||∞||T_f||∞+||b_f||∞`를 reduced 및
|
||
full-free residual certificate 모두에 유지한다. Reduced 검사는 승인된 식 그대로 수행한다.
|
||
Full residual은 직접 평가 interval과 reduced residual에 독립적인 signed construction
|
||
interval을 더한 interval의 교집합으로 인증할 수 있다. 두 interval은 같은 stored-data
|
||
정확 잔차를 포함해야 하며 빈 교집합은 실패다. 이는 허용치를 늘리지 않고 포함 구간을
|
||
좁히는 방법이다. 방정식 구성 오차를 residual 허용치나 에너지 bound에 더하지 않는다.
|
||
|
||
독립 Fraction 반례에서 2-DOF fixture의 큰 constrained 온도에 의해 계산된 우변이
|
||
0으로 소실되지만 정확 우변은 4인 경우를 확인했다. Full BE scale로 정규화하면
|
||
이 오류가 통과할 수 있으므로 이를 blocking 분모로 대체하지 않는다.
|
||
`.dryforge/review/t7_residual_normalization/`의 script·실제 출력·실행 JSON은
|
||
native exit 0이며, 이는 승인 계약 해석의 evidence다. 최초 검토에서 direct-full의
|
||
느슨한 상계를 그대로 별도 gate로 요구한 해석은 필수 첫 jump에서 `29.4u > 20u`로
|
||
충돌하여 정정했다. `refinement-interpretation.txt`와 실제 Fraction 검산은 교집합
|
||
인증에서 같은 사례가 약 `4u`로 통과하고, 앞의 우변 소실 반례는 여전히 실패함을
|
||
보인다. `D_f=0`은 물리 잔차의 exact zero 증명이 필요하며 단순히 interval이 0을
|
||
포함한다고 통과시키지 않는다. Procedure 구현의 실제 interval 검증은 별도로 남는다.
|
||
|
||
### Backward Euler procedure와 candidate 검증
|
||
|
||
`ef8ec473`의 시간 적분 구현은 독립 행동 계약 검토와 별도 exact 산술 검산에서
|
||
잔여 차단 항목이 없었다. Raw 초기값, 첫 증분의 old constrained 용량 항,
|
||
실제 delta가 같을 때의 factorization 재사용, full 반력·flux 복구와 실패 전 commit
|
||
방지를 구현했다. 공개 API는 `Result<ThermalExecutionResult>`이며 내부 검산용
|
||
partition이나 recovery 주입을 공개 경계조건 기능으로 노출하지 않는다.
|
||
|
||
작업 checkout의 `t7-final-{build,inventory,test}.log` 및 native exit JSON은 모두 0이다.
|
||
Inventory **570개**, 관련 **91/91 PASS**이며 새 10개 tests는 두 증분 exact fixture,
|
||
all-constrained, 상쇄와 잘못된 solve 거부, 실제 시간격자·factorization 횟수,
|
||
실제 MKL affine mode/flux, 이력 보존, signed power·분리 영역, subnormal 경계,
|
||
잘못된 입력과 Serial/TBB 이력 일치를 검사한다. `t7-tested-source-hashes.json`은
|
||
실행한 6개 소스·테스트가 최종 commit과 동일함을 식별한다.
|
||
|
||
메인의 독립 실행기는 committed algebra와 bounds를 별도 MSVC target으로 호출하고
|
||
Python Fraction oracle와 비교했다. **31,668개 산술 enclosure**, 인증된 **502개 증분**의
|
||
**737개 free residual**, **502개 열수지**, **108개 단열 소산**에서 경계 위반이 없었다.
|
||
추가 무작위 algebra 사례 1개는 full-free 인증 불가로 거부됐으며 통과 수에 포함하지
|
||
않았다. 허용치나 production을 결과에 맞춰 변경하지 않았다. Evidence와 적용 한계는
|
||
작업 checkout의 `.dryforge/review/t7_ef8ec473/review.md`, `comparison.json`, 실제
|
||
runner/checker 출력·native exit 기록에 보존했다. 최종 독립 build/runner/checker는 exit 0이다.
|
||
HDF5 구현과 합친 통합 검사는 writer의 독립 검토 후 수행한다.
|
||
|
||
### Thermal HDF5 저장과 publication
|
||
|
||
`7f11d533`의 writer와 self-check를 STH-C05/C06에 대조한 독립 검토에서 차단 항목이
|
||
없었다. 모든 필수 metadata·model·mapping·frame·diagnostic의 field/type/extent/value를
|
||
검사하며, compound의 순서·padding에 의존하지 않고 fixed/variable UTF-8을 허용한다.
|
||
Global material ID, 정규화한 section provenance, raw initial, 실제 delta와 회전된 R 및
|
||
global flux의 trace/component 순서를 직접 읽어 검증했다.
|
||
|
||
Candidate close 이후 파일을 다시 열어 검사하고 reader close 성공 뒤에만 최종 파일을
|
||
교체한다. 쓰기·candidate close·self-check·reader close·finalize의 다섯 실패 경계에서
|
||
기존 결과 byte 보존과 candidate 정리를 확인했다. Domain과 이력의 활성 identity,
|
||
시간격자, raw 초기값, constraint mask와 완료된 prescribed 온도도 대조한다.
|
||
|
||
작업 checkout의 `t8-final-{build,inventory,test}.log` 및 native exit JSON은 모두 0이다.
|
||
Inventory **573개**, 관련 **31/31 PASS**이며 이 중 thermal writer 검사는 **13개**다.
|
||
실행 당시 HEAD는 commit 전 `983e2fe`였고 `t8-tested-source-hashes.json`의 8개 파일 hash가
|
||
최종 commit과 정확히 일치함을 독립 확인했다. 이 결과는 writer 범위이며 CLI·물리·외부
|
||
reference 검증을 대신하지 않는다.
|
||
|
||
시간 적분과 writer를 실제 CMake에 등록한 `1b82707`에서 configure/build/inventory/test는
|
||
모두 native exit 0이다. Inventory **583개** 중 `Thermal|TransientHeat|Hdf5`에 해당하는
|
||
**134/134 PASS**, 새 compiler warning 없음이다. Evidence는 메인 checkout의
|
||
`.dryforge/evidence/thermal-procedure-output-integrated-{configure,build,inventory,test}.log`
|
||
및 exit JSON에 보존했다. 이는 관련 통합 검사이며 전체 회귀는 아니다.
|
||
|
||
### Application과 실제 CLI
|
||
|
||
`7cccfcd`의 독립 검토에서 application 연결 범위의 차단 항목이 없었다. Thermal step을
|
||
구조 step 개수 검사보다 먼저 선택하며, typed outcome과 thermal writer를 연결했다.
|
||
기존 호출의 optional adapter, output lease·log close 순서와 오류 분류를 보존한다.
|
||
실제 executable을 사용하는 통합 테스트의 CMake 의존성도 명시했다.
|
||
|
||
작업 checkout의 `t9-verified-{build,test}.log`, `t9-complete-inventory.log`와 exit JSON은
|
||
native exit 0이다. Inventory **592개**, application 관련 **28/28 PASS**이며 새 thermal
|
||
검사 9개와 기존 static/nonlinear/eigen, 실제 HHT 경로를 포함한다. 최초 정상 thermal
|
||
입력이 `invalid-analysis-step-count`로 거부된 실패(native test exit 8)를 기록한 후 수정했다.
|
||
실행 시점 HEAD는 `14160dd`이고 `t9-tested-source-sha256.json`의 4개 파일은 최종 commit과
|
||
일치한다. Lease 경합, solver overflow와 실제 Windows final-file 교체 거부에서도 기존
|
||
결과가 보존되고 candidate가 정리됐다.
|
||
|
||
메인의 독립 probe는 실제 `fesa.exe`와 별도 `h5dump`를 subprocess로 실행했다.
|
||
**29개 명령**에서 기대 exit가 일치했고, raw 초기 온도·양면 지정 온도·모든 frame의
|
||
시간/실제 delta·source step·반력/flux shape·finite 값·초기 recovery 부재를 확인했다.
|
||
미지원 source DOF12와 usage 오류 이후에도 기존 최종 파일 SHA256이 유지됐다.
|
||
`.dryforge/review/t9_cli/t9-7cccfcd/`에 stdout/stderr, `execution.json`, `result.json`과
|
||
script/binary hash를 포함한 `review-execution.json`을 보존했다. Probe 자체도 native exit 0이다.
|
||
이는 실행 경로와 저장 계약 검증이며 실제 열해의 정확도 판단은 다음 물리 검증에 속한다.
|
||
|
||
### 원본 reference 비교의 실패와 진단 전환
|
||
|
||
NT11 외부 비교를 실제 실행했으나 **실패**했다. 원본 Step-1/time37/DOF11의 729행 중
|
||
87행이 기준을 벗어났고 RMS/S=0.04967408461567323으로 승인 0.01을 초과한다.
|
||
별도 C++ 공통 정책 비교도 같은 실패를 재현했다. 승인 식을 FESA 코드 없이 조립·계산한
|
||
독립 oracle는 FESA와 최대 7.673861546209082e-12 차이로 같은 reference 불일치를 보였다.
|
||
수치·원본 hash·재현 명령·의사결정 범위는 [충돌 보고서](reference-comparison-conflict.md)에
|
||
기록했다. 사용자 선택 A에 따라 승인 정식화와 공통 tolerance를 유지하고 원본 비교를
|
||
진단으로 분류했다([STH-ADR-015](ADR.md#sth-adr-015-원본-reference-진단-전환과-새-모델-비교)).
|
||
실패 행과 family metric은 변경하지 않는다. 새 reference 모델·CSV는 아직 제공되지 않아
|
||
그 필수 비교를 실행하거나 기능 완료로 표시하지 않는다.
|
||
|
||
결정 전 T10 comparator checkpoint `95ba2c5`는 별도 작업 branch에 보존하고 필수 검사가 실패한
|
||
상태로 구현 branch에 병합하지 않았다. Configure/build/inventory는 native 0,
|
||
inventory 599개이며, 최종 schema/identity 음성검사 **6/6 PASS**(native 0)다.
|
||
원본 application/reference 실행의 CTest는 native 8이고, 최종 comparator 소스로 같은
|
||
생성 HDF5를 다시 비교한 standalone 실행은 native 1로 같은 실패를 확인했다.
|
||
`.dryforge/evidence/t10-checkpoint-{source,artifact}-sha256.json`과 실제 실행/row 보고서를
|
||
보존했고, 4개 tested-source hash와 clean checkpoint의 일치를 메인이 확인했다.
|
||
이 checkpoint에는 물리·수렴성 검사 구현이나 production 변경이 없다.
|
||
|
||
### T10 해석해·수지·수렴성과 원본 진단 비교
|
||
|
||
T10 고정 소스 `9e8afb9`의 8개 파일은
|
||
`T2/.dryforge/evidence/t10-final-eigen-source-sha256.json`의 SHA256과 모두 일치한다.
|
||
실행 JSON의 revision은 commit 전 `95ba2c5`지만 실행한 작업트리의 8개 파일 hash가
|
||
최종 `9e8afb9`와 일치한다. 메인 checkout은 Git의 CRLF checkout 변환으로 raw byte hash가
|
||
일부 다르며, 8개 파일의 LF 정규화 내용이 모두 일치함을 별도로 확인했다.
|
||
작업 checkout의 MSVC Debug build·inventory는 native exit 0, inventory **617개**다.
|
||
`t10-final-focused-test.log`와 즉시 보존한 `t10-final-focused-LastTest.log`에서
|
||
**26/26 PASS**, native exit 0, 실제 2901.03초를 확인했다. 146개 수치 기록은
|
||
`t10-final-metrics.json`에 있다. Test 코드의 slab 에너지/반력 인덱스 오류는 최초
|
||
실패 로그를 보존한 뒤 수정했고, 위 최종 검사는 수정된 소스 전체를 다시 실행한 결과다.
|
||
|
||
단열 균일장, signed·중첩·구속점 열입력의 component별 수지, full-end 검산 fixture의
|
||
재료/두께 단차와 90° fold 저항, 회전·법선 반전·중립면 양쪽 flux trace를 확인했다.
|
||
Full-end fixture는 공개 입력의 내부 station BC 지원을 뜻하지 않는다. 독립 rational
|
||
Q1×P2 조립에서 8×8 고유모드 `K v−λ_h C v`의 405행과 C-노름을 검산했다.
|
||
실제 시간 수렴차수는 **0.981712, 0.990734, 0.995336, 0.997660**으로 승인 구간에 있다.
|
||
전체 이력을 저장한 8/16/32/64의 2D 공간 수렴은 온도 차수
|
||
**1.996702, 2.000769, 2.006577**, gradient 차수
|
||
**0.997220, 0.999305, 0.999826**이다. 64 mesh의 시간/공간 오차 비는
|
||
**0.00686327**이고 온도·flux payload는 **81,074,472 byte**였다.
|
||
|
||
Slab는 `t=.001,.01,.05,.1,.5,1`에서 N=4096/8192, 각 1×1/2×2 mesh의
|
||
**24개 실제 해석·147,456증분**을 실행했다. 모든 완료 프레임의 온도·flux와
|
||
에너지·반력을 독립 two-P2/Fourier interval 및 실제 residual 기반 오차 경계로
|
||
판정했다. 최대 `(solver+oracle bound)/(D_space/1000)`은 **0.163432**다.
|
||
초기 시점의 두께 오차 plateau는 관측됐으나 후기 `.5/1`의 T/E/R은 도달하지
|
||
않은 것으로 분리해 보고한다. 이는 고정 5점의 두께 해상도 한계다.
|
||
Warped patch의 production 3점 대 독립 3점 K/C·BE 온도/flux 검산과 3/5/7점
|
||
진단은 기존 고정 [kernel 검토](#요소-kernel과-형상-검증)의 실제 evidence를 재사용했다.
|
||
7점을 exact해로 취급하지 않으며 이 검토만으로 전역 warped procedure 전체를
|
||
검증했다고 주장하지 않는다.
|
||
|
||
독립 수치 검토자는 Gauss header 112개 값과 slab header 654개 값을 generator로
|
||
재생성하여 일치함을 확인했다. 수정된 에너지/반력 index, 고유모드 405행,
|
||
C-노름 및 승인 오차 예산에서도 차단 finding이 없었다. 별도 비교기 검토는 원본
|
||
진단 분류에도 row identity/schema·공통 tolerance 실패가 그대로 드러남을 확인했다.
|
||
원본 CLI/reference 검사는 **테스트로는 PASS**지만 실제 비교는 **87/729행 FAIL**,
|
||
RMS/S=**0.049674084615673214**, max abs=**245.26294650091936**,
|
||
`blocking=false`다. 원본 INP/CSV SHA256은 실행 전후 승인 값과 같다.
|
||
새 필수 reference는 별도 경로의 모델·CSV를 아직 받지 못하여 미실행이다.
|
||
|
||
메인 통합 commit `9f7fb2e`에서 CMake 등록 뒤 configure/build/inventory는 native 0,
|
||
inventory **617개**, 새 compiler warning 없음이다. 짧은 물리·비교기 통합 검사
|
||
**10/10 PASS**도 native 0이다. 관련 로그는 메인의
|
||
`.dryforge/evidence/t10-integrated-*`와 작업 checkout의 위 `t10-final-*`에 보존한다.
|
||
전체 회귀와 독립 physics 완료 평가는 아직 진행 중이며 이 범위 검사로 대신하지 않는다.
|