302 lines
22 KiB
Markdown
302 lines
22 KiB
Markdown
# Shell Transient Heat Transfer 상세 설계·구현 계획안
|
||
|
||
- 상태: 사용자 검토용 제안. 요구사항 인터뷰를 바탕으로 수치 방법론을 구체화했으며 구현은 시작하지 않았다.
|
||
- Owner: 메인 assistant
|
||
- 기준: [Feature PRD](PRD.md), [프로젝트 지침](../../AGENTS.md), [ARCHITECTURE](../ARCHITECTURE.md),
|
||
[CODINGSTYLE](../CODINGSTYLE.md), [TOLERANCE](../TOLERANCE.md)
|
||
- 수식의 상세 원본: [정식화 제안](formulation.md). 현재 checklist는 [PRD](PRD.md#현재-checklist)에만 둔다.
|
||
- 독립 검토: [numerical-review.md](numerical-review.md). 수식의 일관성 검토이며 구현·정확도 통과 판정은 아니다.
|
||
|
||
## 1. 구현할 해석과 제안 방법
|
||
|
||
입력의 4절점 Shell mesh에서 온도만 풀며, 한 절점에 두께 방향 온도 5개를 둔다.
|
||
요소당 20개 온도 자유도로 면내·두께 방향 전도와 열저장을 함께 계산한다.
|
||
기존 MITC4의 변위·회전 강성행렬을 열행렬로 전용하지 않는다.
|
||
|
||
| 결정할 항목 | 우선 제안 | 선택 이유와 대안 |
|
||
| --- | --- | --- |
|
||
| 면내 보간 | Bilinear Q4 | 승인된 4절점 topology와 연결되며 상수 온도·평판 선형 온도장을 재현 |
|
||
| 두께 보간 | 2개 구간의 C0 2차 Lagrange 보간 | 5개 온도점을 사용하고 중앙 온도점을 공유. 전체 두께 단일 4차 보간보다 구간별 gradient와 적분을 분리하기 쉬움 |
|
||
| geometry | 실제 3차원 midsurface의 metric과 법선을 이용하는 thin-shell product-domain | 접힌 판·곡면을 같은 scalar 열전도 문제로 구성. 두께 offset에 따른 곡률 보정은 생략하는 모델임을 명시 |
|
||
| 열용량 | Consistent heat-capacity matrix | Galerkin 약형에서 직접 유도하고 열저장·반력·에너지 계산에 같은 행렬 사용. Lumped 대안은 초기 급변의 진동 및 reference 불일치 조사 대상으로만 남김 |
|
||
| 적분 | 면내 3×3 Gauss, 두께의 두 P2 구간은 정확 적분한 Z 행렬 사용 | 직접 54점 적분과 대조. Affine 평판은 2×2 면내 적분도 정확하며 곡면·왜곡은 고차 적분 대조로 오차 확인 |
|
||
| 시간 적분 | Backward Euler, 고정 Δt | 일정 계수 선형 문제에서 factorization을 재사용할 수 있고 첫 구현의 시간 수렴 검증이 명확 |
|
||
| 열유속 | 보간 온도의 기울기에서 직접 복구 | 요소별·위치별 Fourier 열유속과 전체 residual 반력을 구별하여 검증 |
|
||
|
||
이 표는 FESA가 채택할 제안이며 Abaqus 내부 알고리즘 동등성의 약속이 아니다.
|
||
특히 consistent C가 현재 reference의 과도응답을 공통 tolerance 안에서 재현하는지는
|
||
아직 검증하지 않았다. 시간 적분의 안정성이 양의 온도 보존이나 정확도를 보장하지도 않는다.
|
||
|
||
## 2. 온도 자유도와 보간
|
||
|
||
온도점의 무차원 두께 좌표는 `ζ = [-1, -1/2, 0, 1/2, 1]`, 실제 좌표는 `z=hζ/2`다.
|
||
요소 vector는 node-major 순서로 정의한다.
|
||
|
||
\[
|
||
\mathbf T_e=[T_{1,1},\ldots,T_{1,5},T_{2,1},\ldots,T_{4,5}]^T.
|
||
\]
|
||
|
||
Source 자유도 11~15와 위 온도점 1~5를 명시적으로 대응시킨다. 내부 equation 번호와
|
||
source 자유도를 같은 정수로 취급하지 않는다. 현재 reference의 NT11은 아랫면 값이다.
|
||
|
||
\[
|
||
T_h(\xi,\eta,\zeta)=\sum_{a=1}^4\sum_{s=1}^5
|
||
N_a(\xi,\eta)L_s(\zeta)T_{a,s}=\mathbf H\mathbf T_e.
|
||
\]
|
||
|
||
Q4의 `N_a`와 두께의 `L_s` 및 도함수는 [정식화](formulation.md)에 명시한다.
|
||
5개의 서로 독립적인 2D 판을 만드는 것이 아니라, 두께 도함수 항으로 온도점 사이를 결합한다.
|
||
|
||
## 3. 3차원 geometry와 열전도행렬 K
|
||
|
||
Midsurface를 `r(ξ,η)=Σ N_a x_a`로 나타낸다. 접선 행렬 `A=[r_,ξ r_,η]`, metric
|
||
`G=AᵀA`, 면적 Jacobian `J_s=|r_,ξ×r_,η|`, 단위 법선 `n`을 계산한다.
|
||
면내 gradient와 전체 gradient의 각 열은 다음과 같다.
|
||
|
||
\[
|
||
\nabla_sN_a=A G^{-1}\begin{bmatrix}N_{a,\xi}\\N_{a,\eta}\end{bmatrix},
|
||
\qquad
|
||
\mathbf B_{a,s}=L_s\nabla_sN_a+
|
||
\mathbf n N_a\frac{2}{h}L'_s.
|
||
\]
|
||
|
||
`B`는 3×20이며 `∇T=B T_e`다. 등방성 전도율 `k>0`에 대해
|
||
|
||
\[
|
||
\boxed{\mathbf K_e=\frac h2\int_{-1}^1\!\int_{-1}^1\!\int_{-1}^1
|
||
\mathbf B^T(k\mathbf I)\mathbf B\,J_s\,d\zeta\,d\eta\,d\xi}
|
||
\]
|
||
|
||
를 20×20 행렬로 계산한다. `L_s L_t ∇_sN_a·∇_sN_b`는 면내 전도,
|
||
`N_aN_b(2/h)^2 L'_sL'_t`는 두께 전도다. 법선과 면내 접선의 직교성 때문에 이
|
||
product-domain 모델의 교차항은 0이다. 평판에서 각각 대략 `kh`, `k/h`의 두께 scaling을 갖는다.
|
||
|
||
`G`의 퇴화, 뒤집히거나 자기 교차하는 요소, 불일치하는 surface side는 입력 geometry
|
||
진단으로 처리한다. `|det J|`로 invalid 요소를 정상화하거나 임의의 최소 두께를 대입하지 않는다.
|
||
중앙면 접속은 같은 normalized thickness station을 공유하는 이상화로 제안한다.
|
||
두께가 다른 요소의 단차·급한 fold의 실제 3D 접합부 열장은 이 모델의 해상 범위 밖이다.
|
||
이 접속 의미와 얇은 Shell 곡률 근사는 사용자 검토가 필요한 물리 선택이다.
|
||
|
||
## 4. 열용량행렬 C와 적분 절차
|
||
|
||
밀도 `ρ>0`, 비열 `c>0`에 대해
|
||
|
||
\[
|
||
\boxed{\mathbf C_e=\frac h2\int\rho c\,\mathbf H^T\mathbf H\,J_s
|
||
\,d\zeta\,d\eta\,d\xi}
|
||
\]
|
||
|
||
를 계산한다. K의 단위는 `power/temperature`, C는 `energy/temperature`다.
|
||
사용자가 일관된 단위계를 제공하며 코드가 입력 숫자를 보고 SI 단위로 추정하지 않는다.
|
||
|
||
계산 순서는 다음과 같다.
|
||
|
||
1. 면내 9개 Gauss 위치에서 `N`, 도함수, `J_s`, `G`, 법선을 계산한다.
|
||
2. `M_ij=∫N_iN_j dA`, `S_ij=∫∇_sN_i·∇_sN_j dA`의 4×4 행렬을 누적한다.
|
||
3. 정확히 적분한 `Z0_ab=∫L_aL_b dζ`, `Z1_ab=∫L'_aL'_b dζ`의 5×5 행렬을 사용한다.
|
||
4. Node-major 순서에서 `C=ρc(h/2)(M⊗Z0)`, `K=k[(h/2)(S⊗Z0)+(2/h)(M⊗Z1)]`를 구성한다.
|
||
5. finite·대칭성·차원과 상수 온도 null mode를 확인한 element candidate를 반환한다.
|
||
|
||
Z의 명시 행렬은 [정식화](formulation.md)에 있다. 별도의 직접 적분 검산은 면내 9점 ×
|
||
두께 2구간 × 구간당 3점, 총 54개 위치에서 H/B를 구성해 같은 K/C를 얻는지 확인한다.
|
||
Affine 평판은 면내 2×2 × 두께 6점, 총 24점으로도 정확하다. 5개 온도점, 6개 두께 적분
|
||
위치, 아래의 flux trace 위치는 서로 다른 개념이다. 곡면은 면내 3×3→5×5→7×7 대조로
|
||
적분 오차를 평가하며 reduced integration이나 hourglass 안정화항을 추가하지 않는다.
|
||
|
||
## 5. 열입력과 지정 온도
|
||
|
||
열입력의 양의 부호는 모델 안으로 유입되는 방향으로 제안한다.
|
||
|
||
- **절점 집중 열입력** `P`는 단위 시간당 에너지다. 선택한 node의 아랫면 또는 윗면 자유도에
|
||
직접 더하며 면적·두께를 다시 곱하지 않는다.
|
||
- **가장자리 열입력**은 외곽 edge의 옆면에 작용하는 면적당 열유속 `q_in`으로 제안한다.
|
||
`Q_e=∫edge∫[-h/2,h/2] Hᵀ q_in dz ds`로 조립한다. 직선 edge 길이가 `ℓ`이면
|
||
전체 열률은 `q_in hℓ`다. 두께 방향으로 균일해도 5개 온도점에 단순 1/5씩 배분하지 않는다.
|
||
- **지정 온도**는 elimination으로 적용한다. 구속 온도점도 C·K·외력 full-space에서 유지하여
|
||
반력 열률과 전체 에너지 수지를 복구한다.
|
||
- 열입력이나 지정 온도가 없는 외부 경계에는 자연 경계조건인 단열 조건을 적용한다.
|
||
|
||
실제 source 문법은 지원 의미를 검증한 뒤 고정한다. 특히 DS4의 가장자리 열유속을
|
||
`*DFLUX, S1...S4`로 받을 수 있다고 가정하지 않는다. 확인한 공개 shell library의
|
||
element-based flux 목록은 BF·SNEG·SPOS이며, 가장자리 입력을 위한 공개 문법 대응은
|
||
아직 확정하지 못했다. 이 항목은 계산 kernel과 별개의 I/O 결정이다.
|
||
[공개 shell load 정의](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEELMRefMap/simaelm-r-shellgeneral.htm).
|
||
|
||
## 6. Transient equation과 해법
|
||
|
||
\[
|
||
\mathbf C\dot{\mathbf T}+\mathbf K\mathbf T=\mathbf Q+\mathbf R.
|
||
\]
|
||
|
||
Backward Euler로 다음을 구성한다.
|
||
|
||
\[
|
||
\mathbf A=\mathbf C/\Delta t+\mathbf K,\qquad
|
||
\mathbf b^{n+1}=\mathbf Q^{n+1}+\mathbf C\mathbf T^n/\Delta t.
|
||
\]
|
||
|
||
free/constrained partition에서
|
||
|
||
\[
|
||
\boxed{\mathbf A_{ff}\mathbf T_f^{n+1}=
|
||
\mathbf Q_f^{n+1}+\mathbf C_{ff}\mathbf T_f^n/\Delta t+
|
||
\mathbf C_{fc}\mathbf T_c^n/\Delta t-\mathbf A_{fc}\mathbf g^{n+1}}
|
||
\]
|
||
|
||
를 푼다. 초기 구속점 온도와 step 지정 온도가 다르면 첫 증분의
|
||
`C_fc(T_c^0−g)/Δt` 항을 빠뜨리면 안 된다. 제안은 입력 초기 상태를 `t=0`에 보존하고
|
||
첫 양의 시점부터 step 지정 온도를 부과하는 것이다. 초기 값을 덮어쓴 다른 해석과
|
||
에너지·reference 결과가 달라질 수 있으므로 이 시작 의미를 명시적으로 검토한다.
|
||
|
||
고정 물성·geometry·구속 집합·Δt에서는 A_ff를 한 번 factorize하고 매 증분 RHS만 갱신한다.
|
||
전체 시간이 Δt로 나누어떨어지는 입력을 우선 지원하는 것으로 제안한다. 마지막 증분을
|
||
조용히 줄이지 않는다. 시간은 누적 덧셈보다 increment index와 Δt에서 결정적으로 생성한다.
|
||
|
||
절연체의 K는 상수 온도 null mode를 가지지만 양의 C 때문에 A는 양정정일 수 있다.
|
||
정적 solver처럼 “온도 구속이 없으므로 singular”로 판정하지 않는다. 일반 partition 연산은
|
||
전체 구속 시 0×0 free solve를 건너뛰도록 검산한다. 다만 이번 공개 입력은 bottom/top만
|
||
구속하므로 내부 3개 온도점까지 모두 구속한 사례는 CLI 지원 모델이 아닌 algebra fixture다.
|
||
|
||
## 7. Heat flux와 reaction heat rate 복구
|
||
|
||
각 완료 증분에 element scatter로 `T_e`를 모아, 동일한 B로
|
||
|
||
\[
|
||
\boxed{\mathbf q^{global}=-k\mathbf B\mathbf T_e}
|
||
\]
|
||
|
||
를 계산한다. 단위는 `power/area`이며 고온에서 저온 방향이 양의 흐름이다.
|
||
local 직교 frame `R=[e_1,e_2,n]`이면 `q_local=Rᵀq_global`이고,
|
||
앞 두 성분은 면내, 세 번째는 두께 방향 열유속이다.
|
||
|
||
- 기본 authoritative flux는 면내 2×2 Gauss 위치와 두께 trace
|
||
`[-1+, -1/2, 0−, 0+, 1/2, 1−]`의 곱인 24개 위치에서 복구한다. 두께 trace는 구간
|
||
안쪽에서 평가하는 위치/접근 방향이다. Global 성분과 local frame 또는 local 성분의
|
||
저장 선택을 I/O에서 고정하여 좌표 의미를 보존한다.
|
||
- 위 trace 위치에서 B를 직접 평가한다. C0 보간의 중앙면에서 두께 도함수는 한쪽 극한
|
||
두 개일 수 있으므로 `0−`와 `0+`를 평균으로 합치지 않는다. 행렬의 적분 위치와 복구 위치는 독립이다.
|
||
- 재료 경계와 요소 경계를 넘어 nodal averaging한 값을 공식 heat flux로 사용하지 않는다.
|
||
- 부호를 비교할 때 아랫면의 외향 법선은 `−n`, 윗면은 `+n`임을 구별한다.
|
||
|
||
반력 열률은 gradient flux를 절점으로 평균하여 만들지 않고 full residual에서 계산한다.
|
||
|
||
\[
|
||
\boxed{\mathbf r^{n+1}=\mathbf C(\mathbf T^{n+1}-\mathbf T^n)/\Delta t
|
||
+\mathbf K\mathbf T^{n+1}-\mathbf Q^{n+1}}
|
||
\]
|
||
|
||
free 성분은 평형 잔차, constrained 성분은 지정 온도 유지에 필요한 반력 열률이다.
|
||
양의 반력은 모델에 추가로 공급한 열이다. transient 반력에는 열저장 항이 포함되어야 한다.
|
||
초기 온도는 저장하지만 유한 차분 시간구간이 없는 `t=0` 반력에 계산된 값처럼 0을 쓰지 않는다.
|
||
|
||
## 8. 기존 코드와 연결할 책임·파일
|
||
|
||
현재 `Element::Recover`는 displacement를 소비하고 `DofManager`는 `kDofsPerNode=6`을
|
||
전제로 한다. 따라서 parser에 DS4만 추가해서 완료할 수 없다. 다음은 실제 저장소 경로와
|
||
새 파일의 제안 배치다. 세부 C++ signature는 승인된 I/O·정식화 계약을 기준으로 구현 계획에서 고정한다.
|
||
|
||
| 작업 경계 | 기존 수정 대상 | 신규 파일 제안과 책임 |
|
||
| --- | --- | --- |
|
||
| Semantic model | `include/fesa/model/domain.h`, `src/fesa/model/domain.cpp`, `include/fesa/model/model_types.h`, `include/fesa/materials/material.h` | `include/fesa/materials/isotropic_thermal_material.h`, `src/fesa/materials/isotropic_thermal_material.cpp`: 양의 k·ρ·c와 source identity |
|
||
| Thermal element | `include/fesa/elements/element_definition.h`, `src/fesa/elements/element_factory.cpp`의 definition/runtime 생성 경계 | `include/fesa/elements/thermal_shell.h`, `src/fesa/elements/thermal_shell.cpp`: 20×20 K/C와 직접 flux 복구. 열 kernel을 구조 Element의 displacement 계약에 억지로 넣지 않음 |
|
||
| Geometry | 기존 `model/shell_geometry`의 MITC4 definition/director 의존성 확인 | `src/fesa/elements/thermal_shell_geometry.h`, `.cpp`: Q4 metric·법선·geometry 검증. 구조 shear tying·drilling 정보 불필요 |
|
||
| DOF | `include/fesa/elements/element.h`, `include/fesa/fem/dof_manager.h`, `src/fesa/fem/dof_manager.cpp` | Explicit layout/constraint 입력 경계를 추가하여 DofManager 안에서 구조 6개·열 5개 profile을 구별. 기존 구조 numbering/scatter 계약 보존 |
|
||
| Thermal assembly | `SparseMatrix::FromCoo`, `ParallelFor` 재사용 | `include/fesa/assembly/thermal_assembler.h`, `src/fesa/assembly/thermal_assembler.cpp`: 동일 scatter의 K/C, stable COO reduction과 source-ordered Q |
|
||
| Procedure/state | `analysis_model.h/.cpp`, `prepared_analysis.h/.cpp`, `src/fesa/app/fesa_application.cpp` | `include/fesa/analysis/transient_heat_procedure.h`, `src/fesa/analysis/transient_heat_procedure.cpp`, `include/fesa/analysis/thermal_analysis_state.h`: factorize/step/recover/candidate commit |
|
||
| Abaqus mapping | `src/fesa/io/abaqus/domain_mapping_context.cpp`, `domain_builder.cpp`, `topology_mapper.cpp`, `material_property_mapper.cpp`, `step_definition_mapper.cpp` | 책임별 thermal block mapping 추가. 기존 structural validation의 제한을 온도에 그대로 적용하지 않음 |
|
||
| Results | 기존 HDF5 atomic file·primitives와 prepared outcome dispatch | `include/fesa/results/thermal_results_writer.h`, `include/fesa/io/hdf5/thermal_hdf5_results_writer.h`, `src/fesa/io/hdf5/thermal_hdf5_results_writer.cpp`: 온도/flux/reaction/history identity와 atomic finalize |
|
||
|
||
Domain이 정의를 소유하고 AnalysisModel이 non-owning view를 제공하는 기존 책임을 유지한다.
|
||
새 thermal state만 temperature/history를 소유한다. Node/Element에 equation 번호를 저장하지 않는다.
|
||
열용량 C를 structural mass field에 저장하지 않으며 vendor API는 기존 backend 경계에 둔다.
|
||
|
||
## 9. 구현 순서와 각 단계의 완료 조건
|
||
|
||
아래 순서는 향후 구현 작업을 위한 계획이다. 현재 실행하거나 완료한 목록이 아니다.
|
||
|
||
| 순서 | 작업·연결 요구사항 | 추가/변경할 검증과 단계 완료 조건 |
|
||
| --- | --- | --- |
|
||
| 1 | 물리·I/O 선택 확정 — 001~018 | Thin-shell 접속·초기 jump·edge syntax·flux identity의 결정을 문서화. 독립 수치 검토 지적 해결 |
|
||
| 2 | Thermal semantic model과 input — 001~013, 018 | `tests/unit/io/abaqus/thermal_domain_test.cpp`: DS4·물성·5점 단면·initial/boundary/CFLUX·single step mapping, 잘못된 DOF·불량 물성·상충 집합·미지원 옵션 진단 |
|
||
| 3 | Element kernel — 002~007, 014 | `tests/unit/elements/thermal_shell_test.cpp`: H partition of unity, gradient sum zero, K/C 대칭성·rank, exact flat matrices, plane/thickness linear field와 flux, rotation covariance |
|
||
| 4 | DOF·assembly·load — 006~011 | `tests/unit/fem/dof_manager_test.cpp`, `tests/unit/assembly/thermal_assembler_test.cpp`: 20 DOF scatter, 인접 node station 공유, edge 총 열률, source 순서, 병렬/직렬 동등성과 structural 회귀 |
|
||
| 5 | Transient procedure — 008~013, 018 | `tests/unit/analysis/transient_heat_procedure_test.cpp`: 두 증분 직접 계산, C_fc 초기 항, no-Dirichlet, generic all-constrained algebra fixture, factorization 재사용, 후보 실패 보존 |
|
||
| 6 | Recovery·HDF5·CLI — 014~015 | `tests/unit/io/hdf5/thermal_hdf5_results_writer_test.cpp`, `tests/integration/app/thermal_application_test.cpp`: 모든 온도점·증분·flux 위치·reaction의 round trip, 초기 반력 미정의, 파일 finalize 실패 시 이전 결과 보존 |
|
||
| 7 | Physics·reference — 016~017 | `tests/integration/analysis/thermal_physics_test.cpp`, `tests/reference/thermal_reference_comparison_test.cpp`, `tests/reference/thermal_reference_cases_test.cpp`: 아래 사례와 기존 CSV 비교·identity 음성 검사 |
|
||
| 8 | 통합 확인 | `src/fesa/CMakeLists.txt`, `tests/CMakeLists.txt` 등록 후 MSVC x64 Debug 전체 build/CTest와 필수 reference 비교. 신규 warning 없음 |
|
||
|
||
각 행동 변경은 먼저 기대 결과를 고정하는 검사를 작성하고 실패를 확인한 뒤 구현한다.
|
||
기존 coverage가 충분한 지원 코드 정리에는 구현 구조만 따라 하는 테스트를 추가하지 않는다.
|
||
독립 수치 검토와 실제 결과의 물리 검토를 구현 담당자의 자기 승인으로 대체하지 않는다.
|
||
|
||
## 10. 방법론을 반증할 검증 사례
|
||
|
||
| 사례 | 기대되는 관찰과 오류 검출 목적 |
|
||
| --- | --- |
|
||
| 완전 단열·균일 초기 온도 | 모든 온도점이 시간에 따라 불변, flux=0, 열에너지 불변. K의 상수 null mode 검증 |
|
||
| 평판의 면내 선형 온도 | Kernel에서 `q=−k∇T`를 정확히 재현. Global 회전 시 scalar T 불변·vector q 회전 |
|
||
| 두께 방향 선형 온도 | 하·상면 온도차의 정상 한계에서 `q_n=−k(T_top−T_bottom)/h`, 두 면 반력 합 0 |
|
||
| 두께 전체 단열의 면내 Fourier mode | 초기 온도가 두께 방향 균일한 허용 입력으로 analytical decay와 비교. BE 시간 1차 수렴과 면내 mesh 수렴 분리 |
|
||
| 한쪽 면 온도 step, 반대 면 단열 slab | 허용된 초기 조건에서 1D transient analytical series와 비교. 5점 두께 근사의 한계와 초기 jump 처리 검증 |
|
||
| 두 재료·두 두께 strip | 단면 전체 end 온도를 구속한 assembly fixture에서 총 열저항 `Σ L/(k h w)` 확인. 내부 station 구속은 검산 전용이며 CLI 기능이 아님. 공개 bottom/top 경계 사례는 경계층을 포함한 별도 oracle과 비교 |
|
||
| Edge flux와 집중 열입력 | 입력한 총 열률과 `Δ(1ᵀCT)/Δt` 및 reaction 합의 일치. 단위와 면적/두께 중복 곱 검출 |
|
||
| 작은 열망의 직접 해 | `A_ff`, RHS, 첫 두 증분, full residual을 독립 hand calculation과 비교. 전체 구속 특수 조건은 generic partition fixture로 한정 |
|
||
| 실제 reference | 원본 `.inp`와 t37의 NT11 729행 비교. 누락/추가/중복/nonfinite·instance ambiguity를 tolerance 전에 거부 |
|
||
|
||
전체 열에너지는 `E=1ᵀCT`로 두고 기준 온도의 상수 차이가 에너지 변화에 영향을 주지 않음을
|
||
확인한다. 검증할 discrete balance는
|
||
`E_(n+1)−E_n = Δt[1ᵀQ + Σ constrained reaction]`이며 free residual의 영향도 보고한다.
|
||
점별 Fourier flux와 FE 반력은 다른 observable이므로 각각의 검증을 수행한다.
|
||
|
||
시간 수렴은 공간 오차를 충분히 낮추고 Δt를 줄이며, 면내 수렴은 충분히 작은 Δt에서 mesh를
|
||
세분화한다. 제품의 두께 온도점 5개가 고정되므로 면내 mesh를 줄이는 것만으로 두께 오차까지
|
||
0으로 간다고 주장하지 않는다. 세부 norm·기대 order·내부 판정 기준은 독립 검토가 정한다.
|
||
|
||
## 11. 검증 실행과 완료 판단
|
||
|
||
구현 시 MSVC x64 developer 환경과 GoogleTest/MKL/TBB/HDF5 경로를 준비하고 다음을 실행한다.
|
||
|
||
```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
|
||
```
|
||
|
||
선택된 `.harness/config.json`이 동일 실행을 구성하면 `python scripts/execute.py`를 사용할 수 있다.
|
||
현재 계획 작성에서는 이 개인 설정 파일을 확인하지 못했으므로 runner의 preset 선택을 가정하지 않는다.
|
||
Python Harness를 수정하지 않는 이 기능에 Harness Python suite를 형식적으로 추가 실행하지 않는다.
|
||
|
||
Reference 원본은 현재 별도 dev checkout에서 읽었으며 현 worktree에는 없다. 실행 단계에서
|
||
read-only reference 위치와 결과 output 경로를 명시적으로 연결한다. 파일을 찾지 못하면
|
||
comparison을 통과나 coverage 완료로 기록하지 않는다. reference 재생성·이름 변경·보정은 포함하지 않는다.
|
||
|
||
완료는 solver 실행 성공뿐 아니라 모든 필수 결과·증분 저장, 에너지 수지·해석해·수렴,
|
||
기존 구조해석 회귀, 공통 tolerance의 NT11 비교와 필요한 독립 검토 evidence가 있어야 한다.
|
||
|
||
현재 문서 검토에서는 독립 reviewer가 Z 계수, 평판 20 DOF의 C 양정치/K rank 19,
|
||
첫 두 증분의 C_fc 항·반력·에너지 수지를 정확 유리수 연산으로 확인했다.
|
||
구현 코드·FESA 결과의 정확도나 곡면·접합부 지원 한계가 검증된 것은 아니다.
|
||
|
||
## 12. 구현 전에 검토할 제안과 한계
|
||
|
||
1. Q4×두 구간 P2, consistent C, 면내 3×3/두께 exact 적분, Backward Euler의 선택
|
||
2. Thin-shell product-domain과 normalized thickness station 접속; 실제 접합부/곡률 두께 효과 한계
|
||
3. 입력 초기 상태를 보존하는 첫 증분 경계 jump와 t=0 반력 미정의
|
||
4. 가장자리 열입력의 면적당 단위와 승인 가능한 외부 입력 문법
|
||
5. 모든 온도점 온도·3성분 flux·반력의 위치/좌표계와 HDF5 저장 계약
|
||
6. 고정 Δt로 나누어떨어지는 종료 시간만 우선 지원하는 제한
|
||
|
||
이 항목은 사용자 인터뷰에서 이미 승인한 범위와 새 수치·I/O 제안을 구별하기 위한 것이다.
|
||
현재 문서는 상세 방법론을 검토할 수 있는 계획안이며, 모든 구현 계약이 확정되었다는 선언이 아니다.
|
||
|
||
Reference에는 step 전 `*Boundary / Set-10, 11, 11`과 step 내부
|
||
`Set-10, 11, 11, 1000.`이 함께 있다. Step 전 경계를 지우거나 무시하지 않고 model/history
|
||
정의로 구분하여 읽는다. 생략 초기 온도·생략 boundary 값의 default, step에서 같은 대상에
|
||
새 값을 적용하는 의미를 원문과 대조해야 최초 C_fc 항과 reference 비교를 확정할 수 있다.
|
||
|
||
CSV 정적 통계의 NT11 최솟값은 `−15.5742216`, 최댓값은 `1000`이다. 공통 scale `S=1000`,
|
||
near-zero band `B=10`에서 위 음수는 near-zero 밖이므로 상대오차 검사 대상이다.
|
||
이를 0으로 보정하거나 단순 roundoff로 설명하지 않는다. 초기 조건과 열용량·보간 선택에
|
||
따른 undershoot의 원인을 조사하고 analytical accuracy와 reference 일치를 각각 평가한다.
|