docs: record unresolved thermal reference acceptance conflict

This commit is contained in:
KOKO\Mimi
2026-09-29 22:39:02 +09:00
parent 59e9498530
commit 37e61ed8e4
3 changed files with 118 additions and 1 deletions
@@ -436,6 +436,7 @@ Missing/extra/duplicate/nonfinite/identity 오류는 tolerance 전에 실패다.
- [x] Thermal semantic model·DOF·geometry·K/C·flux 구현 및 [독립·통합 검증](implementation-verification.md#요소-kernel과-형상-검증)
- [x] Thermal 입력 subset·진단·결정적 조립·시간 적분 구현 및 [범위별 검증](implementation-verification.md#backward-euler-procedure와-candidate-검증)
- [x] HDF5·CLI·candidate와 기존 결과 보존 [검증](implementation-verification.md#application과-실제-cli)
- [ ] 승인 정식화와 필수 reference 통과 조건의 [실측 충돌](reference-comparison-conflict.md)에 대한 사용자 결정
- [ ] 해석해·수지·수렴성과 필수 NT11 외부 비교 통과
- [ ] 전체 MSVC Debug build/CTest 및 기존 실패 대비 확인
- [ ] 독립 physics 검토와 완료 evidence 기록
@@ -363,4 +363,13 @@ native exit 0이다. Inventory **592개**, application 관련 **28/28 PASS**이
script/binary hash를 포함한 `review-execution.json`을 보존했다. Probe 자체도 native exit 0이다.
이는 실행 경로와 저장 계약 검증이며 실제 열해의 정확도 판단은 다음 물리 검증에 속한다.
전체 thermal 검사, NT11 외부 수치 비교와 실제 결과의 독립 physics 평가는 아직 수행하지 않았다.
### 필수 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)에
기록했다. 정식화나 tolerance를 변경하지 않았으며 기능 완료로 표시하지 않는다.
남은 전체 thermal 물리 검사, 전체 회귀와 실제 결과의 독립 physics 완료 평가는 아직 수행하지 않았다.
@@ -0,0 +1,107 @@
# 승인 정식화와 필수 NT11 reference 비교의 충돌
상태: **미해결 — 사용자 결정 필요**. 작성일: 2026-09-29.
이 문서는 실패 evidence와 선택지를 기록한다. 정식화·초기화·허용치·blocking 분류를 변경하지 않는다.
기준은 [PRD STH-C03/C04/C08](PRD.md), [formulation](formulation.md),
[numerical review](numerical-review.md), [공통 tolerance](../TOLERANCE.md)다.
## 1. 실제 실행과 비교
구현 `7cccfcd`의 실제 CLI로 원본 `reference/shell-thermal/shell-thermal.inp`를 실행했다.
100개 증분과 초기 프레임을 저장하고 exit 0으로 종료했다(153.5초).
원본 INP와 CSV의 SHA256은 실행 전후 PRD의 승인 값과 일치했다.
FESA가 생성한 HDF5는 입력의 lexical sibling이다.
별도 `h5dump`로 source step, 정확한 time=37/increment=37, DOF11,
`Part-1-1`/node label과 thermal row mapping을 확인했다. 729행 모두 중복·누락 없이
대응했고 값은 finite였다. Source DOF13이나 nearest frame으로 대체하지 않았다.
| 판정량 | 실제 결과 | 승인 기준 |
| --- | ---: | ---: |
| 비교 행 | 729 | 모든 source 행의 일대일 대응 |
| Reference scale S / near-zero B | 1000 / 10 | 공통 정책 |
| 행별 실패 수 | 87 | 0 |
| RMS/S | 0.04967408461567323 | ≤0.01 |
| 최대 절대 차이 | 245.26294650091884 | 해당 행 기준으로 판정 |
| FESA 최솟값 / 최댓값 | -258.91081180091885 / 1000 | clamp 금지 |
대표 source node 22에서 reference=-13.6478653, FESA=-258.91081180091885이며,
행별 5% 기준은 0.682393265다. 근소한 반올림 차이가 아니다.
별도 C++ comparator도 기존 `ReferenceTolerancePolicy::Evaluate`를 그대로 사용하여
동일 실패를 확인했다. `ThermalReference.OriginalAbaqusNt11AtExactTime37`의 실제 결과는
729행, 87개 실패, RMS/S=0.049674084615673214, max_abs=245.26294650091862다.
해당 CTest 실행은 native exit 8이며 필수 비교를 통과로 표시하지 않았다.
## 2. FESA 코드를 사용하지 않은 독립 계산
독립 Python/SciPy 실행기는 원본 텍스트에서 729개 좌표, 676개 사각형 connectivity,
Set-10의 196개 node를 읽었다. 모든 요소가 평면 직사각형임을 확인한 뒤,
직사각형 Q1의 닫힌형 M/S와 두 P2 구간의 정확한 Z0/Z1을 조립했다.
FESA parser·kernel·assembler·시간 적분 코드는 호출하지 않았다.
입력 물성 k=54, rho=7850, c=460, h=0.5를 사용하고 승인된 식
`C=rho*c*(h/2)*M⊗Z0`, `K=k*((h/2)*S⊗Z0+(2/h)*M⊗Z1)`을 적용했다.
전체 raw T0=0, Set-10의 source DOF11만 g=1000, dt=1인 BE를 37회 계산했다.
3449 free / 196 constrained DOF를 별도 SciPy sparse LU로 풀었다.
| 독립 계산량 | 결과 |
| --- | ---: |
| FESA NT11과 최대 절대 차이 | 7.673861546209082e-12 |
| 최대 정규화 선형 잔차 | 3.599964225668404e-16 |
| Reference 행별 실패 수 | 87 |
| Reference RMS/S | 0.04967408461567341 |
| 독립 NT11 최솟값 | -258.9108118009203 |
이 수치는 새 tolerance가 아니다. 승인 식의 독립 계산도 같은 큰 reference 차이를
재현한다는 관측이다. 이 사례의 차이를 단순한 source mapping이나 production 행렬
계산 버그로 설명할 근거는 발견하지 못했다. 전체 물리 검증의 통과를 뜻하지는 않는다.
별도 read-only 검토자는 원본 hash·수치 상수·경계조건, oracle의 tensor 식/BE 우변,
HDF/CSV identity join과 공통 tolerance 계산을 대조하여 이 충돌 evidence의 차단 오류를
발견하지 못했다. Oracle는 범용 입력기가 아니며 물성·두께·시간·g는 이 사례의 확인된
상수를 사용한다. 다른 입력에 대한 정확도나 Abaqus의 내부 동작을 입증하는 검사는 아니다.
## 3. 공개 문서 확인과 해석 한계
공개 [Choosing a Shell Element](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEELMRefMap/simaelm-c-shellelem.htm)의
Heat Transfer Shell Elements 절은 다중 온도점을 갖는 shell의 DOF11을 아랫면 온도로
설명한다. [Uncoupled Heat Transfer Analysis](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-heattransfer.htm)의
Initial Conditions 절은 생략된 초기 온도의 기본값을 0으로 설명한다.
이 관측 가능한 의미는 현재 reference mapping을 DOF13으로 바꿀 근거를 주지 않는다.
확인 가능한 문서는 2025판이며 2024 URL은 접근 거부였다. 공개 문서와 한 시점의 CSV만으로
reference 생성기의 내부 행렬·적분·초기 처리 방식이나 그 동등성을 단정하지 않는다.
다른 방법의 수치 결과가 비슷하다는 이유만으로 FESA의 승인 방법을 교체하지 않는다.
## 4. 결정이 필요한 범위
현재 두 조건을 동시에 충족하지 못한다.
1. 승인된 consistent C, Q4×P2 두 구간, exact thickness 적분과 raw 초기값 BE를 유지한다.
2. 이 원본 NT11 비교를 현재 공통 tolerance의 필수 blocking 검사로 통과한다.
검토 가능한 선택지는 다음과 같다. 어느 것도 아직 승인되지 않았다.
- **정식화 유지:** 이 reference family의 역할을 진단 비교로 재정의할지 결정한다.
공통 숫자 tolerance와 실패 metric은 그대로 남기며, 독립 해석해·수지·수렴성 검증을
완료 조건으로 유지한다. Feature acceptance/ADR의 명시적 변경이 필요하다.
- **필수 reference 통과 유지:** 현재 방법 선택을 다시 검토한다. 먼저 필요한 수치 방법의
장단점과 새로운 정식화·검증 계획을 제시하고 승인받아야 하며, 임의 lumping·초기 투영·
clamp 또는 reference 맞춤 수정으로 바로 넘어가지 않는다.
T1–T9 구현·검증은 유지한다. T10은 실패를 숨기지 않은 comparator checkpoint까지이며,
남은 slab/수렴성 검증과 T11 전체 회귀·독립 physics 완료 판정은 수행 전이다.
## 5. 보존 evidence
- 메인 `.dryforge/review/t10_reference/`: `run.py`, `execution.json`, stdout/stderr,
생성 log, `compare.py`, 실제 dump/exit 기록, `comparison.json`, `comparison-rows.json`.
- 같은 경로의 `independent.py`, `independent-execution.json`,
`independent-comparison.json`, `independent-rows.json`: native exit 0,
NumPy 2.4.6 / SciPy 1.17.1, 사용 script hash 포함.
- 작업 checkout T2 `.dryforge/evidence/t10-reference-test.log` 및 native exit JSON:
공통 정책을 사용한 C++ 비교의 실제 실패. Checkpoint 최종 hash와 보충 음성검사는
[구현 검증 보고서](implementation-verification.md)에 기록한다.
- 원본 reference INP/CSV는 변경하지 않았다. 생성 HDF5와 CSV row view는 외부 reference
artifact를 교체하는 자료가 아니다.