docs: define shell transient heat transfer requirements and plan

This commit is contained in:
KOKO\Mimi
2026-09-29 00:34:43 +09:00
parent d332d07eb7
commit 73db138566
6 changed files with 1215 additions and 0 deletions
+181
View File
@@ -0,0 +1,181 @@
# Shell Transient Heat Transfer 결정 기록
- Feature ID: `shell-transient-heat-transfer`
- 문서 owner: 메인 assistant
- 갱신일: 2026-09-28
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md),
[공통 ADR](../ADR.md#adr-028). 지역 지침은 [Feature 지침](FEATURED_AGENTS.md),
요구사항과 현재 checklist는 [Feature PRD](PRD.md)에 둔다.
각 결정의 owner는 메인 assistant다. 승인 근거는 2026-09-27~28 사용자 인터뷰의 명시 선택이다.
개별 범위 선택의 합의를 기록하며, 전체 requirement baseline과 구현 실행은 아직 승인되지 않았다.
사용자의 계획 기반 문서 작성 요청에 따라 수치 제안의 이유·대안·영향을 아래에 구체화한다.
`사용자 합의`는 명시 선택의 기록이고 `Proposed`는 검토할 우선안이다.
수식과 검산 원본은 [formulation](formulation.md), [numerical-review](numerical-review.md)를 따른다.
## 결정 목록
| ID | 주제 | 상태 | 요구사항·검토 연결 |
| --- | --- | --- | --- |
| STH-ADR-001 | Uncoupled 범위 | 사용자 합의 | 001 |
| STH-ADR-002 | 5개 두께 온도점 | 사용자 합의 | 002~004 |
| STH-ADR-003 | 물성·초기/경계·열입력 | 사용자 합의 | 005~012 |
| STH-ADR-004 | 시간 증분·전체 결과 저장 | 사용자 합의 | 013~015 |
| STH-ADR-005 | 외부 비교·독립 검증 | 사용자 합의 | 016~017 |
| STH-ADR-006 | 단일 step | 사용자 합의 | 018 |
| STH-ADR-007 | 수치 방법론 전체와 K/C | Proposed | 정식화 3~5절 |
| STH-ADR-008 | Geometry와 접속 이상화 | Proposed | NR-01 |
| STH-ADR-009 | Backward Euler·종료 시간 | Proposed | 013, 정식화 7절 |
| STH-ADR-010 | 초기 jump와 pre-step 경계 | Proposed | 008~009, NR-02 |
| STH-ADR-011 | Heat flux·reaction 복구 | Proposed | 014~015, NR-05 |
| STH-ADR-012 | Edge 입력 단위·외부 문법 | Proposed / syntax 미결정 | 011, NR-03 |
요구사항 번호는 `FEM-REQ-SHELL-THERMAL-` prefix를 생략했다. 수치 기준이 미정인 NR-04는
[PRD 미결정 계약](PRD.md#구현-전-미결정-계약)에서 관리하며 승인된 tolerance를 대신하지 않는다.
## STH-ADR-001: 현재 구현 목표를 uncoupled transient heat transfer로 한정
- 상태: 사용자 합의
- 결정: 현재 목표는 구조해석과 분리된 Shell 과도 열해석이다. 양방향 열–구조 연성은 장기 목표다.
- 근거: 사용자가 초기 연성 선택을 정정하며 “지금은 uncoupled heat transfer를 구현합니다”라고 명시했다.
- 영향: 이번 기능의 acceptance에 구조 변위·열응력·연성 반복이나 변형 피드백을 포함하지 않는다.
## STH-ADR-002: 두께 방향 균일 온도에서 5개 온도점 단면으로 범위 변경
- 상태: 사용자 합의; 앞선 두께 방향 균일 온도 선택을 대체
- 결정: 3차원 공간의 4절점 Shell에서 면내·두께 방향 열전달을 지원한다. 균질 단면이고
두께 방향 온도점은 모든 단면에서 5개로 고정한다.
- 이유: 사용자가 기존 DS4 reference의 두께 방향 의미를 확인한 뒤 이를 지원하는 방향을 선택했다.
- 근거: reference 유지/범위 확대 질문에서 B, 균질 단면 질문에서 A, 온도점 5개 고정 질문에서 A.
- 영향: 아랫면·중앙면·윗면 온도의 identity를 구분한다. 적층·가변 온도점 수는 제외한다.
Abaqus의 내부 정식화를 복제하거나 동일한 결과 생성 절차를 약속하는 결정은 아니다.
## STH-ADR-003: 상수 물성·일정 입력과 제한된 두께 방향 적용 범위
- 상태: 사용자 합의
- 결정: 상수 등방성 열전도율·밀도·비열, 요소 집합별 재료와 일정 두께를 지원한다.
초기 온도는 절점/집합별이되 같은 절점의 두께 전체에는 균일하다. 지정 온도와 집중
열입력은 아랫면·윗면에 각각 적용하고, edge 열입력은 두께 전체에 균일하게 분포한다.
지정 온도·열입력은 시간에 무관한 일정값이다.
- 이유: 인터뷰에서 사용자가 각 첫 구현 범위를 선택했다.
- 영향: 면적 분포 표면 열유속, 내부 온도점 직접 입력, 대류·복사·내부 발열,
온도 의존·이방성 물성, 적층과 시간 이력 입력을 제외한다.
## STH-ADR-004: 고정 시간 증분과 전체 증분 결과 저장
- 상태: 사용자 합의
- 결정: 전체 시간과 고정 시간 증분을 사용자가 지정한다. 온도·요소 열유속·반력 열률을
모든 시간 증분에 저장하며 초기 온도 분포도 보존한다. 공식 출력은 공통 HDF5 계약을 따른다.
- 근거: 시간 제어 A, 필수 결과 C, 저장 간격 A 선택.
- 영향: 자동 시간 증분을 제외한다. 시간 적분법·열용량 행렬·마지막 증분 처리·초기 결과의
schema를 이 결정만으로 정하지 않는다.
## STH-ADR-005: 현재 CSV의 NT11 비교와 독립 검증을 조합
- 상태: 사용자 합의
- 결정: 외부 필수 비교는 기존 `shell-thermal NodalTemperature.csv`의 `Step-1`, `t=37`,
`NT11`로 한정한다. 나머지 결과는 해석해·열에너지 수지·시간 및 공간 수렴성 등으로 검증한다.
- 근거: 추가 reference 결과 확보 여부 질문에서 사용자가 A를 선택했다.
- 이유: 현재 CSV는 한 시점의 아랫면 온도만 제공한다. 원본 evidence의 실제 coverage를 명시한다.
- 영향: 추가 Abaqus CSV 확보를 필수 조건으로 삼지 않지만, 내부 온도·열유속·반력 열률과
전체 과도응답의 correctness 검증은 유지한다. 공통 tolerance와 reference 원본은 변경하지 않는다.
## STH-ADR-006: 단일 transient step으로 제한
- 상태: 사용자 합의
- 결정: 초기 온도와 일정한 경계조건·열입력으로 하나의 transient step을 수행한다.
- 근거: 단일/다중 step 지원 범위 질문에서 사용자가 A를 선택했다.
- 영향: 여러 해석 step과 step 사이의 온도 상태 전달·경계조건 변경을 제외한다.
## STH-ADR-007: 상세 수치 방법론 제안
- 상태: **Proposed / 사용자 검토 대기**
- 제안: 면내 Q4 × 두께 2구간 P2의 20 DOF, midsurface metric의 thin-shell 근사,
consistent 열용량과 열전도행렬, 면내 3×3·두께 exact 적분, Backward Euler,
24개 trace 위치의 직접 Fourier flux 및 full residual 반력 열률을 사용한다.
- 근거: 사용자가 요구사항 목록을 보강하여 열전달행렬·heat flux 방법론을 포함한 상세 계획을 요청했다.
이 요청은 제안을 작성할 권한이며 위 수치 방법의 채택 승인은 아니다.
- 이유·대안: [설계 계획](design-plan.md)의 선택 표와 [정식화](formulation.md)의 상세 수식을 따른다.
- 영향: geometry·접속 이상화, 최초 온도 불일치, edge 입력 단위/syntax와 결과 위치를
검토해야 한다. 기존 reference 정확도와 positivity를 아직 보장하지 않는다.
- 검토: [독립 수치 검토](numerical-review.md)에서 명시 행렬·BE partition·에너지 수식의
일관성을 확인했다. 이는 사용자 채택 승인이나 solver 수치 검증을 대신하지 않는다.
- 행렬 선택 이유: `K=∫BᵀkB dV`, `C=∫ρcHᵀH dV`를 동일 보간에서 유도하여 전도·저장·
반력·수지를 연결한다. 두께 exact Z와 면내 3×3 적분은 독립 직접 적분으로 검산할 수 있다.
- 대안과 trade-off: 단일 4차 두께 보간, lumped C 또는 reduced integration도 별개 방법이지만
현재 우선안에 포함하지 않는다. Consistent C는 단조성·positivity를 보장하지 않으며,
일반 곡면에서 3×3은 exact가 아니다. 실패에 맞춰 방법을 조용히 바꾸지 않는다.
- 상세 선택: geometry, 시간 갱신, 초기 상태, recovery와 edge 입력은 008~012에서 분리한다.
## STH-ADR-008: Thin-shell geometry와 두께 station 접속
- 상태: **Proposed / 물리 범위 검토 대기**
- Owner: 메인 assistant; 전문 계약은 formulation·numerical review 담당.
- 제안: 실제 3차원 Q4 midsurface의 metric·법선을 각 평가점에서 계산한다. 두께 offset의
곡률 보정을 생략한 product-domain을 사용하며 인접 요소는 같은 normalized 두께 station을 공유한다.
- 이유: 면내·두께 전도를 유지하면서 승인된 4절점 mesh와 5개 온도점을 연결할 수 있다.
- 대안·trade-off: 실제 offset-volume metric 또는 별도 3D 접합부 해상은 더 많은 geometry
계약을 요구한다. 우선안은 두께 단차의 노출면·spreading resistance·유한 접합부 부피를 해상하지 않는다.
- 영향: 곡률·왜곡·orientation·퇴화 허용 범위와 fold/이두께 접속의 물리 이상화를 구현 전에
검토해야 한다. 적분 차수를 높여도 이 모델링 오차는 제거되지 않는다.
- 근거: [정식화 2절](formulation.md#2-geometry-방향과-접속의-의미), 독립 검토 NR-01.
계획 문서화는 요청되었지만 이 이상화의 사용자 채택 승인은 아직 없다.
## STH-ADR-009: Backward Euler와 고정 증분 factorization 재사용
- 상태: **Proposed / 시간 적분·종료 규칙 검토 대기**
- Owner: 메인 assistant; 전문 계약은 formulation·I/O 담당.
- 제안: `A=C/Δt+K`를 구성하고 지정 온도를 elimination으로 적용한다. 일정 계수·geometry·
구속 집합·Δt에서 factorization을 재사용한다. 전체 시간은 Δt의 정수 배로 제한하는 안을 제시한다.
- 이유: 상수 물성·일정 입력의 단일 step을 선형 solve로 구성하고 시간 1차 수렴을 검증할 수 있다.
- 대안·trade-off: 다른 시간 적분법은 별도 시간 오차·안정성 검토가 필요하다. 짧은 마지막
증분을 허용하면 factorization과 fixed-Δt 의미도 달라진다. 안정성만으로 정확도를 보장하지 않는다.
- 영향: 초기 constrained 온도 항을 포함한 RHS와 종료시간의 수치 판정을 확정한다.
무구속 transient 모델을 정적 K의 null mode만으로 singular 판정하지 않는다.
- 근거: [정식화 7절](formulation.md#7-backward-euler-지정-온도와-최초-증분), 독립 두 증분 검산.
사용자는 고정 Δt를 선택했으며 BE와 정수 배 제한은 아직 수치 제안이다.
## STH-ADR-010: 초기 온도 보존과 첫 증분 경계 jump
- 상태: **Proposed / 초기 상태·default 계약 검토 대기**
- Owner: 메인 assistant; 전문 계약은 I/O·formulation 담당.
- 제안: 입력 초기 온도를 raw `T^0`로 보존하고 첫 양의 시점부터 step 지정 온도를 적용한다.
첫 RHS에 `C_fc(T_c^0−g)/Δt`를 유지하며 `t=0` 반력은 미정의로 구별한다.
- 이유: 입력 상태를 조용히 덮어쓰지 않고 첫 증분의 열저장·반력·에너지 변화를 추적할 수 있다.
- 대안·trade-off: 즉시 projection은 초기 상태와 에너지를 바꾸므로 projection jump의 저장·보고
정책이 필요하다. 두 정책은 같은 수치 결과를 보장하지 않는다.
- 영향: Reference의 step 전 `Set-10,11,11`과 step 내부 `Set-10,11,11,1000.`을 model/history
데이터로 구분한다. 생략 초기 온도·boundary 값과 재정의 의미를 확인한 뒤 한 정책을 채택한다.
- 근거: [정식화 7절](formulation.md#7-backward-euler-지정-온도와-최초-증분), 독립 검토 NR-02.
초기 온도의 면내 지정·두께 균일성은 합의됐지만 jump 처리의 채택 승인은 아직 없다.
## STH-ADR-011: 위치별 Fourier flux와 residual 반력 열률
- 상태: **Proposed / recovery·영속 결과 계약 검토 대기**
- Owner: 메인 assistant; 전문 계약은 formulation·I/O·numerical review 담당.
- 제안: `q=−kBT_e`를 면내 4점 × 두께 6개 trace의 24개 위치에서 계산한다.
중앙면의 `0−/0+`를 구별한다. 반력 열률은 `CΔT/Δt+KT−Q`의 구속 성분이며 모델 안으로의 공급을 양으로 둔다.
- 이유: Gradient flux와 열저장을 포함한 반력은 서로 다른 물리량이다. 각 위치의 raw 값을
유지해야 부호·열에너지 수지·경계 근처 공간 오차를 별도로 검증할 수 있다.
- 대안·trade-off: 절점 외삽·요소 간 평균은 원자료를 바꾸고 불연속을 숨길 수 있어 필수 결과에
포함하지 않는다. Global/local 중 저장 좌표계와 frame·trace identity는 아직 I/O 선택이다.
- 영향: 직접 적분 54점과 recovery 24점을 혼동하지 않는다. `t=0` 초기 온도를 보존하되
반력을 계산된 0으로 표시하지 않는다. Dataset layout·version·validity를 구현 전에 확정한다.
- 근거: [정식화 8~9절](formulation.md#8-반력-열률-에너지와-안정성), 독립 검토 NR-05.
온도·flux·reaction 저장은 합의됐으며 위 세부 출력 계약은 Proposed다.
## STH-ADR-012: 두께 균일 edge 열입력과 공개 문법
- 상태: **Proposed / 단위·syntax 미결정**
- Owner: 메인 assistant; 전문 계약은 I/O 담당.
- 제안: 계산 kernel은 edge 옆면의 면적당 유입 열유속을 적분해 총률 `q_in hL`을 보존한다.
두 endpoint의 각 두께 가중치는 `(1,4,2,4,1)/24`다.
- 이유: 같은 shape function을 사용한 일관 하중으로 입력·열저장·반력을 연결한다.
- 대안·trade-off: 외부 입력이 길이당 열률이면 `q_in=λ/h`로 해석해야 하며 두께를 중복 곱하지 않는다.
현재 공개 근거만으로 DS4의 `*DFLUX, S1…S4`를 지원한다고 선언할 수 없다.
- 영향: 승인 가능한 keyword·대상 edge·단위·중복 application 의미를 확정해야 한다.
문법의 미결정을 이유로 합의된 edge 기능을 삭제하거나 표면 분포 열유속으로 대체하지 않는다.
- 근거: [계획안 5절](design-plan.md#5-열입력과-지정-온도),
[정식화 6절](formulation.md#6-가장자리절점-열입력), 독립 검토 NR-03.
두께 균일 edge 입력은 사용자 합의이며 외부 표현의 채택 승인은 아직 없다.
@@ -0,0 +1,61 @@
# Shell Transient Heat Transfer 지역 작업 지침
- Feature ID: `shell-transient-heat-transfer`
- 메인 owner: 메인 assistant
- 적용 범위: `docs/shell-transient-heat-transfer/`의 계약·계획·검토 문서.
이 파일은 `src/`, `include/`, `tests/`에 자동 적용되는 지침이 아니다.
- 현재 범위·상태·checklist 원본: [Feature PRD](PRD.md).
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md),
[공통 ADR](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md),
[Feature 문서 관리](../FEATURE_DOCUMENTATION.md).
이 파일은 자동 로드되는 `AGENTS.md`가 아니며, Feature 작업 시 명시적으로 참조한다.
## 계약과 작업 경계
- 인터뷰에서 합의한 지원 범위는 PRD, 채택 상태·이유·영향은 ADR에 기록한다.
`Proposed` 수치 방법과 독립 검토 결과를 사용자 채택 승인이나 구현 완료로 바꾸지 않는다.
- 수식 원본은 formulation, 구현 순서·코드 연결은 design-plan, 독립 지적과 검산 evidence는
numerical-review가 소유한다. 긴 유도·검토 내용을 PRD나 이 파일에 복제하지 않는다.
- 현재 checklist는 PRD 한 곳에 둔다. 문서 작성 요청만으로 solver 구현·외부 실행·커밋을 수행하지 않는다.
- 변경이 보간·물성·geometry 근사·초기 상태·적분·시간 갱신 의미를 바꾸면 관련 ADR과
정식화를 먼저 갱신하고 필요한 독립 numerical review를 받는다. Specialist는 할당 문서만 수정한다.
## 이 Feature에서 보존할 의미
- 현재 목표는 단일 step의 uncoupled 열해석이다. 초기의 두께 방향 등온 선택은 대체되었으며
현재 요구는 균질 단면의 온도점 5개와 면내·두께 방향 열전달이다.
- Source DOF 11/13/15는 각각 아랫면/중앙면/윗면이다. Source DOF, 내부 equation 번호,
온도점·적분점·flux recovery 위치를 구분한다.
- 제안의 54개 직접 적분 위치와 24개 flux trace 위치는 서로 다르다. 중앙면의 두께
미분 양쪽 값을 평균하거나 요소 경계를 넘어 flux를 합치지 않는다.
- 반력 열률은 열용량 항을 포함한 full residual로 정의하는 제안이다. Fourier flux와
반력 열률을 같은 observable로 대체하지 않는다.
- Thin-shell 곡률 근사, 다른 두께·fold의 접속, 초기 온도 jump, edge 입력과 결과 schema는
[PRD 미결정 계약](PRD.md#구현-전-미결정-계약)을 먼저 확인한다. 미지원 의미를 임의 default로 처리하지 않는다.
- Reference는 PRD가 지정한 기존 `.inp`와 CSV를 그대로 사용한다. 음수 reference는
roundoff로 단정하거나 clamp하지 않고 [TOLERANCE](../TOLERANCE.md)를 적용한다.
- All-constrained와 단면 전체 end 온도 지정은 검산용 algebra/assembly fixture다.
내부 온도점 경계조건을 공개 입력 기능으로 확대하는 근거로 사용하지 않는다.
## 문서 소유권과 인계
| 문서 | Owner | 책임 |
| --- | --- | --- |
| [FEATURED_AGENTS.md](FEATURED_AGENTS.md) | 메인 assistant | 지역 지침·소유권·문서 연결 |
| [PRD.md](PRD.md) | 메인 assistant | 요구사항·제외·acceptance·현재 checklist |
| [ADR.md](ADR.md) | 메인 assistant | 결정·제안 상태·근거와 미해결 선택 |
| [design-plan.md](design-plan.md) | 메인 assistant | 방법론 요약·코드 연결·구현 순서 |
| [formulation.md](formulation.md) | formulation-agent | 수식·geometry·보간·적분·시간 갱신·recovery |
| [numerical-review.md](numerical-review.md) | numerical-review-agent | 독립 검산·수치 위험·검증 설계 |
후속 I/O·구현·physics 작업의 owner는 실제 할당 시 기록한다. 필요한 PRD 항목과 관련
전문 문서의 절, 수정 파일, 검증 기준을 전달하고 결과·변경 경로·미해결 항목을 반환한다.
## 변경 확인
문서 변경은 요구사항 ID·결정 상태·수식의 위치/부호·상대 링크·diff 정합으로 확인한다.
문서만 바꾸면 build/test를 실행하지 않는다. 구현 시 검증 명령과 단계별 기준은
[계획안의 검증 실행](design-plan.md#11-검증-실행과-완료-판단) 및 프로젝트 지침을 따른다.
정확 산술 검산, solver build/CTest, 외부 reference 비교, 실제 결과의 physics 검토를
서로 다른 evidence로 기록하고 미실행 항목을 통과로 표시하지 않는다.
+219
View File
@@ -0,0 +1,219 @@
# Shell Transient Heat Transfer PRD
- Feature ID: `shell-transient-heat-transfer`
- Owner: 메인 assistant
- 상태: 상세 계획을 반영한 요구사항 초안. 인터뷰 합의와 수치 제안을 구분하며 baseline 최종 검토 전이다.
- 기록일: 2026-09-28
기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md),
[공통 ADR](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md),
[TOLERANCE](../TOLERANCE.md). 지역 지침은 [Feature 지침](FEATURED_AGENTS.md),
결정 근거는 [Feature ADR](ADR.md)을 따른다.
## 제품 목적과 문서 범위
3차원 공간에 배치된 4절점 Shell의 시간에 따른 온도장과 열전달을 계산한다.
양방향 열–구조 연성은 장기 목표이며, 이번 기능은 구조해석과 분리된 uncoupled transient
heat transfer다. 해석 사용자는 승인된 Abaqus 입력 subset으로 모델을 정의하고, 개발·검증
담당자는 온도·열유속·반력 열률과 열에너지 수지를 재현할 수 있어야 한다.
이 PRD는 [상세 설계·구현 계획안](design-plan.md), [정식화 제안](formulation.md),
[독립 수치 검토](numerical-review.md)를 연결하는 요구사항 원본이다. 현재 작업은 이 계획을
바탕으로 `FEATURED_AGENTS.md`, `PRD.md`, `ADR.md`를 구성하는 문서 작업이며 구현 실행은 포함하지 않는다.
초기의 두께 방향 균일 온도 선택은 reference 확인 후 사용자가 명시적으로 변경했다.
현재 범위는 균질 단면의 두께 방향 온도점 5개와 면내·두께 방향 열전달을 포함한다.
## 상태와 채택의 구분
| 구분 | 현재 상태 | 의미 |
| --- | --- | --- |
| 기능 범위 | 인터뷰 합의 | 아래 001~018의 지원·제외 범위를 사용자가 선택했다. |
| 수치 방법 | Proposed | 20 DOF 보간·K/C·적분·BE·flux recovery의 우선안을 작성했다. 문서 작성 요청을 방법별 채택 승인으로 확대하지 않는다. |
| 독립 수치 검토 | 문서 검토·정확 산술 검산 수행 | 명시 행렬과 두 증분의 일관성 evidence가 있으며 geometry·초기 상태·I/O 선택은 남아 있다. |
| 구현·제품 검증 | 미실행 | Solver code, build/CTest, FESA/reference 비교와 실제 결과의 physics 검증 완료를 주장하지 않는다. |
## 사용자와 합의한 요구사항
아래 acceptance는 확인해야 할 관찰 가능한 동작과 검증 의도다. 테스트가 실행되었거나
정식화·I/O 세부 계약이 승인되었다는 뜻은 아니다.
| ID | 요구사항 | Acceptance intent |
| --- | --- | --- |
| FEM-REQ-SHELL-THERMAL-001 | 구조 변위와 연성하지 않는 과도 열전달 해석을 제공한다. | 구조해석 없이 초기 온도에서 시간별 열해석 결과를 생성한다. |
| FEM-REQ-SHELL-THERMAL-002 | 3차원 공간의 4절점 사각형 Shell을 지원한다. | 평판·접힌 판·곡면 mesh의 열전달과 모델 회전에 대한 결과 변환을 검증한다. 허용 요소 왜곡은 후속 계약에서 정한다. |
| FEM-REQ-SHELL-THERMAL-003 | 모든 단면에 두께 방향 온도점 5개를 사용하고 면내·두께 방향 열전달을 계산한다. | 두께 방향으로 온도가 달라지는 독립 사례와 균일 온도 사례를 구분하여 확인한다. |
| FEM-REQ-SHELL-THERMAL-004 | 각 단면은 두께 전체에 동일한 재료를 사용하는 균질 단면이다. | 적층 단면은 지원 범위에 포함하지 않는다. |
| FEM-REQ-SHELL-THERMAL-005 | 열전도율·밀도·비열은 온도에 무관한 상수이며 열전도율은 등방성이다. | 상수 물성의 전도·열저장 응답을 검증하고 온도 의존·이방성 입력은 지원으로 해석하지 않는다. |
| FEM-REQ-SHELL-THERMAL-006 | 여러 재료를 정의하고 요소 집합별로 배정할 수 있다. | 재료 배정과 서로 다른 물성 영역 사이의 열전달을 확인한다. |
| FEM-REQ-SHELL-THERMAL-007 | 요소 집합별 두께를 지원하며 각 요소 내부의 두께는 일정하다. | 서로 다른 두께가 전도·열저장·가장자리 열입력에 반영되는지 검증한다. |
| FEM-REQ-SHELL-THERMAL-008 | 초기 온도는 절점 또는 절점 집합별로 지정할 수 있다. | 비균일 면내 초기 온도를 읽고 해당 절점의 5개 두께 방향 온도점에 같은 값을 적용한다. |
| FEM-REQ-SHELL-THERMAL-009 | 아랫면·윗면에 각각 독립적인 지정 온도를 적용한다. | 한쪽 면만 구속한 경우와 두 면에 서로 다른 온도를 구속한 경우를 확인한다. 내부 온도점 지정 온도는 제외한다. |
| FEM-REQ-SHELL-THERMAL-010 | 절점 집중 열입력은 아랫면·윗면 온도점에 각각 독립적으로 적용한다. | 선택한 면의 열입력이 조립·열에너지 수지에 반영되는지 확인한다. 내부 온도점 직접 입력은 제외한다. |
| FEM-REQ-SHELL-THERMAL-011 | Shell 가장자리에 두께 전체로 균일하게 분포하는 열입력을 적용한다. | 대상 edge, 두께 방향 분포와 총 열률의 일관성을 독립 적분값으로 확인한다. |
| FEM-REQ-SHELL-THERMAL-012 | 지정 온도와 열입력은 해석 중 일정하다. | 시간 이력 표·진폭 함수에 의한 변화 없이 초기 온도에서 과도응답을 계산한다. 시작 시점의 적용 의미는 후속 계약에서 명시한다. |
| FEM-REQ-SHELL-THERMAL-013 | 사용자가 전체 해석 시간과 고정 시간 증분을 지정한다. | 지정된 시간 격자와 종료 시점을 확인한다. 나누어떨어지지 않는 종료 시간의 처리는 후속 계약에서 명시한다. |
| FEM-REQ-SHELL-THERMAL-014 | 온도, 요소 열유속, 지정 온도 경계의 반력 열률을 필수 결과로 제공한다. | 온도점·열유속 위치와 성분·반력 열률의 물리적 의미를 확인한다. 두께 방향 범위 확대에 따른 열유속 성분은 후속 출력 계약에서 명시한다. |
| FEM-REQ-SHELL-THERMAL-015 | 모든 시간 증분의 결과를 HDF5로 저장하고 초기 온도 분포도 보존한다. | 입력의 lexical sibling인 `<stem>_results.h5`에서 초기 온도와 완료 증분별 결과·시간·source identity를 확인한다. |
| FEM-REQ-SHELL-THERMAL-016 | 기존 reference CSV의 `Step-1`, `t=37`, `NT11`을 외부 비교 대상으로 한다. | source node와 두께 위치·시점을 대응시킨 뒤 공통 tolerance 정책을 적용한다. |
| FEM-REQ-SHELL-THERMAL-017 | 외부 CSV에 없는 결과도 독립적으로 검증한다. | 해석해·열에너지 수지·시간 및 공간 수렴성으로 전체 온도 이력, 내부 온도, 열유속과 반력 열률을 검증한다. 추가 Abaqus CSV 확보를 필수 조건으로 삼지 않는다. |
| FEM-REQ-SHELL-THERMAL-018 | 하나의 transient step만 지원한다. | 초기 온도와 일정한 경계조건·열입력으로 지정 시간까지 계산하고, 여러 해석 step의 입력은 지원 범위 밖으로 진단한다. |
## 제외 범위
- 열–구조 순차 연계와 양방향 연성, 변형에 따른 열전달 변화
- 3절점 요소, 적층 단면, 이방성·온도 의존 열물성
- 대류·복사·내부 발열, Shell 윗면·아랫면에 직접 적용하는 분포 열유속
- 두께 방향 비균일 초기 온도, 내부 온도점의 지정 온도·집중 열입력
- 두께 방향 비균일 가장자리 열입력, 절점별 가변 두께
- 사용자 선택 두께 방향 온도점 수, 자동 시간 증분, 시간 변화 경계조건·열입력
- 여러 해석 step 및 step 사이의 온도 상태 전달·경계조건 변경
- Abaqus 내부 요소·적분·열용량 처리·결과 생성 절차의 동등성
면의 온도점에 적용하는 절점 집중 열입력은 지원하며, 면적에 걸쳐 적용하는 분포 표면
열유속은 제외한다. 두 입력을 혼동하지 않는다.
## Reference 정적 관찰
사용자가 지정한 논리적 경로는 `reference/shell-thermal`이다. 2026-09-28 확인 시
현재 `ThermalAnalysis` worktree에는 없고 동일 저장소의 `dev` checkout에서 다음 원본을
읽었다. 원본 복사·수정·solver 실행은 수행하지 않았다.
| Artifact | 확인한 내용 |
| --- | --- |
| `reference/shell-thermal/shell-thermal.inp` | `DS4` 676개, 절점 729개, instance `Part-1-1`, 단일 재료, `*Shell Section` 데이터 `0.5, 5` |
| 같은 `.inp`의 재료 | Conductivity `54`, Density `7850`, Specific Heat `460`. 입력 숫자만 기록하며 단위계를 추정하지 않는다. |
| 같은 `.inp`의 step | `*Heat Transfer, end=PERIOD`와 `1., 100., , ,`; `Set-10, 11, 11, 1000.` 지정 온도. 명시적인 초기 온도·집중 열입력·가장자리 열입력은 없다. |
| 같은 `.inp`의 step 전 경계 | `*Boundary`의 `Set-10, 11, 11`이 존재한다. 생략된 값과 step 내부 재지정의 의미를 I/O에서 확인하며 model-level 경계를 무시하지 않는다. |
| `reference/shell-thermal/shell-thermal NodalTemperature.csv` | `Step`, `Frame`, `Node Label`, `NT11`; `Step-1`, `Increment 37: Step Time = 37.00`의 729행. 다른 시간·열유속·반력 열률은 없다. |
CSV에는 instance 열이 없으므로 `.inp`의 단일 instance로 row identity를 복원할 수 있는지
I/O 단계에서 명시적으로 검증한다. 파일명·행 순서만으로 다중 instance를 추정하지 않는다.
이 사례 하나로 다중 재료·두께, 가장자리·집중 열입력 또는 전체 시간 이력의 coverage를 주장하지 않는다.
독립 검토의 CSV 정적 통계에서 729개 label이 고유하고 값이 유한했으며 NT11 범위는
`[-15.5742216, 1000]`이었다. 초기 경계 급변·공간 이산과 관련된 undershoot 가능성을
조사해야 하며 reference 음수를 단순 roundoff로 취급하지 않는다.
Abaqus의 공개 열전달 Shell 규약에서 자유도 11은 아랫면, 5개 온도점 단면의 13은 중앙면,
15는 윗면에 해당한다. 기하학적 절점 위치와 온도 자유도의 두께 위치는 구별한다.
[Abaqus 문서: Heat Transfer Shell Elements](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEELMRefMap/simaelm-c-shellelem.htm).
원본은 CAE 2024 생성 표시가 있으며 공개 의미 확인에는 접근 가능한 2025 문서를 사용했다.
## 제안하는 계산 방법과 상세 계획
아래는 사용자가 선택한 기능 범위를 구현할 수 있도록 작성한 수치 방법 제안이다.
인터뷰로 확정한 요구사항과 구분하며 최종 채택 승인을 받은 것으로 기록하지 않는다.
- 면내 Q4와 두께 두 구간의 C0 2차 보간으로 요소당 온도 자유도 20개를 구성한다.
- 실제 3차원 midsurface의 metric과 법선을 이용해 `∇T=B T_e`를 구성한다.
Thin-shell product-domain 근사와 접힌 판·다른 두께의 normalized-station 접속 의미를 명시한다.
- `K_e=∫BᵀkB dV`, `C_e=∫ρcHᵀH dV`를 사용한다. 두께의 명시 Z 행렬과
면내 3×3 Gauss 적분을 조합하고 직접 54점 적분으로 검산한다.
- Backward Euler의 `(C/Δt+K)T^(n+1)=Q+C T^n/Δt`를 free/constrained 공간으로
분할한다. 첫 증분의 이전 constrained 온도 항까지 보존하고 고정 계수 factorization을 재사용한다.
- `q=−kBT_e`로 면내·두께 방향 열유속을 직접 계산한다. 면내 4점과 두께 6개 trace의
총 24개 위치를 제안하며 중앙면의 양쪽 flux를 구별한다.
- 반력 열률은 `C(T^(n+1)−T^n)/Δt+K T^(n+1)−Q`의 구속 성분에서 계산한다.
[계획안](design-plan.md)은 각 선택의 이유, 단계별 수정 파일과 검증을,
[정식화](formulation.md)는 shape function·미분·행렬·적분·에너지 수식의 원본을 소유한다.
기존 `Element`/`DofManager`의 구조 자유도 전제를 확인했으며 별도 thermal kernel/state와
DOF layout 확장이 필요하다. 구체적인 수치 제안·I/O 의미·geometry 허용 범위를 검토한 뒤 구현한다.
## 입력·결과 계약의 범위
입력의 topology·material·section·load·boundary·step은 Domain에 보존하고, 실행 view와
mutable thermal state를 분리한다. `DS4`, `*SHELL SECTION`, 열물성과 `*HEAT TRANSFER`를
읽는 것만으로 기능 완료를 선언하지 않는다. Source label/instance는 방정식과 결과까지 보존한다.
| 물리량·입력 | 의미와 위치 | 단위 차원·확정 상태 |
| --- | --- | --- |
| 온도 | 절점마다 두께 위치 5개, initial 및 모든 완료 증분 | Temperature. 값의 단위계를 추정하지 않는다. |
| 열전도율·밀도·비열 | 요소 집합이 참조하는 상수 재료 | Power/(length·temperature), mass/volume, energy/(mass·temperature) |
| 절점 집중 열입력 | 아랫면 또는 윗면 온도점의 입력 | Power. 면적이나 두께를 중복 곱하지 않는 제안 |
| 가장자리 열입력 | 두께 전체에 균일한 edge 입력 | 외부 단위·syntax 미확정. 계산안의 면적당 flux는 power/area, 적분 후 총 열률은 power |
| Heat flux | 요소별·면내 위치·두께 trace·component·시점 | Power/area. 제안은 24개 trace 위치, global/local 저장 선택은 미확정 |
| 반력 열률 | 지정 온도 자유도·시점 | Power. 제안은 모델 안으로 공급되는 열을 양으로 정의 |
| 열에너지·free residual | 검증 evidence | Energy / power. 별도 필수 공개 dataset으로 추가 승인된 것은 아님 |
공식 출력은 입력 경로의 lexical sibling인 `<stem>_results.h5`다. Dataset layout·schema
version·초기 frame validity·좌표계는 I/O 계약에서 정한다. `t=0` 초기 온도 저장을
시간 차분이 없는 반력 열률의 계산 완료로 표시하지 않는다.
## 검증 기준과 후속 계약 경계
외부 `NT11` 비교는 [TOLERANCE](../TOLERANCE.md)의 공통 정책을 적용한다. Row identity,
필수 component·시간·두께 위치의 대응과 missing·extra·duplicate·nonfinite 사전검사를
tolerance 전에 수행한다. 음수 reference를 zero-clamp하거나 결과에 맞춰 보정하지 않는다.
독립 검증은 최소한 균일 온도 보존, 열입력·열저장·반력 열률의 에너지 수지, 면내 및
두께 방향의 해석 가능한 전도 사례, 열유속·반력의 부호, 시간 및 공간 수렴성을 다룬다.
구체적인 사례·mesh·시간 간격·판정 기준은 정식화와 독립 numerical review에서 확정한다.
외부 비교 tolerance를 내부 에너지 수지나 수렴성 기준으로 대신 사용하지 않는다.
정식화·계획안에서 제시한 방안은 아직 사용자 미승인이다. 다음 계약은 제안을 검토하여
확정할 필요가 있으며 기존 인터뷰 범위를 조용히 변경하지 않는다.
- 정식화: 곡면·왜곡 geometry의 허용 범위, 서로 다른 두께 단면의 접속 의미, 온도 보간,
면내·두께 적분, 열용량 행렬, 시간 적분법, 초기/지정 온도 적용 순서와 반력 열률 정의
- I/O: 승인 keyword subset, edge 열입력의 단위·부호·대상 표기, 생략된 초기 온도 등 default,
중복/상충 집합 진단, source identity, 열유속 위치·좌표계·성분, 초기 상태와 증분의 HDF5 schema
- Numerical Review: reference frame 대응과 comparison family, analytical/invariant 사례와
각 판정 기준, 고정 5개 온도점 조건에서의 공간 수렴성·두께 해상도 한계
- 구현 전 runtime 계약: 별도 thermal procedure/state, 실패 candidate와 기존 최종 HDF5 보존,
deterministic assembly·결과 순서, 기존 구조해석의 회귀 검증 범위
## 기능 완료 기준
| 검증 묶음 | 요구사항 연결 | 필요한 evidence |
| --- | --- | --- |
| 입력과 모델 의미 | 001~013, 018 | 양성 입력의 semantic mapping과 미지원·상충·불량 값 진단; pre-step boundary와 단일 transient step 구분 |
| Element·조립 | 002~007, 010~011 | Shape·K/C·edge 일관 하중 검산, source DOF scatter, 결정적인 조립·결과 순서 |
| 시간 적분과 물리 | 008~013, 017~018 | 초기 경계 불일치, 해석해·에너지 수지·시간/공간 수렴, 실패 candidate 보존 |
| 결과와 저장 | 014~015 | 모든 온도점·완료 증분, flux trace, reaction의 identity·단위·좌표계 및 HDF5 round trip·실패 보존 |
| 외부 비교 | 016 | 원본 NT11 t37 row 대응 사전검사와 공통 tolerance의 blocking 비교 |
| 통합 회귀 | 전체 | 구성된 MSVC x64 Debug build/CTest, 신규 warning 없음, 영향받는 구조해석 회귀와 독립 검토 결과 |
단일 kernel 통과, reference 한 시점의 일치 또는 문서의 정확 산술 검산만으로 위 묶음을
대체하지 않는다. 검증 상세는 [계획안 9~11절](design-plan.md#9-구현-순서와-각-단계의-완료-조건)과
[독립 검토 3절](numerical-review.md#3-구현-후-반증-가능한-검증-계획)을 따른다.
## 구현 전 미결정 계약
| 항목 | 우선 제안·남은 선택 | 결정·상세 계약 owner | 근거 |
| --- | --- | --- | --- |
| 보간·행렬·적분 | Q4×두 P2 구간, consistent C, 면내 3×3·두께 exact Z의 채택 | 메인/사용자, formulation·numerical review | STH-ADR-007 |
| Geometry·접속 | Thin-shell 곡률 근사와 normalized station 접속의 적용 범위·퇴화 기준 | 메인/사용자, formulation·numerical review | STH-ADR-008, NR-01 |
| 시간 제어 | Backward Euler 및 종료시간을 Δt 정수 배로 제한할지 | 메인/사용자, formulation·I/O | STH-ADR-009 |
| 초기 상태 | Raw 초기값의 첫 증분 사용, pre-step 경계·생략값·step 재정의 의미 | 메인/사용자, I/O·formulation | STH-ADR-010, NR-02 |
| 결과 계약 | 24개 trace, global/local 저장, 반력 부호, t=0 validity | 메인/사용자, I/O·numerical review | STH-ADR-011 |
| Edge 입력 | 면적당 또는 길이당 단위·공개 keyword·대상 및 중복 의미 | 메인/사용자, I/O | STH-ADR-012, NR-03 |
| 내부 수치 판정 | Geometry margin, 적분 오차, residual·수렴성 기준 | numerical review, 해당 계약 owner | NR-04; 외부 tolerance와 구분 |
Owner 역할은 후속 할당 책임이며 아직 수행하지 않은 I/O 작업이나 새 승인을 뜻하지 않는다.
NR 항목의 상세 근거는 [독립 수치 검토](numerical-review.md#1-영향이-큰-판단과-필요한-결정)에 있다.
## 사용자 검토 항목
개별 범위 선택 인터뷰를 마쳤다. 이 초안의 범위·제외·acceptance intent를 사용자에게
요약하여 제시하고 문서 전체의 requirement baseline을 확정한다. 구현 실행은 별도 요청 범위다.
후속 정식화·I/O에서 physics나 공개 의미의 추가 선택이 필요하면 근거와 함께 사용자에게
돌려보낸다. 위 전문 항목을 이미 결정되었거나 검증된 것으로 취급하지 않는다.
## 현재 checklist
- [x] 물리·요소·재료·두께·초기 온도·경계조건·열입력 범위 인터뷰
- [x] 고정 시간 증분·모든 증분 결과 저장·필수 결과 선택
- [x] 기존 reference 원본 정적 확인과 외부 비교 범위 합의
- [x] 핵심 문서 3개에 합의와 미결정 항목 기록
- [x] 단일 transient step으로 범위 확정
- [x] 열전도·열용량행렬, 열유속·반력, 시간 적분과 코드 연결을 포함한 상세 계획 제안
- [x] [독립 수치 검토](numerical-review.md)의 문서 지적 반영; 미결정 물리·I/O 계약은 별도로 유지
- [x] 상세 계획을 바탕으로 지역 FEATURED_AGENTS·PRD·ADR 구성
- [ ] 사용자 검토 후 requirement baseline 확정
- [ ] 사용자 검토 후 수치 방법·I/O 계약·geometry 허용 범위와 실행 계획 확정
Solver build/test, Abaqus 실행, FESA/reference 수치 비교와 실제 결과의 physics 검토는
수행하지 않았다. [독립 수치 검토](numerical-review.md)는 두께 Z 행렬, 평판 20 DOF 행렬과
두 증분 BE 에너지 수지를 정확 유리수로 검산하고 잔여 물리·I/O 결정을 기록했다.
@@ -0,0 +1,301 @@
# 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 일치를 각각 평가한다.
@@ -0,0 +1,332 @@
# Shell 과도 열전달 정식화 제안
- 상태: **Proposed / 사용자 미승인 / 독립 numerical review 별도 보고서 참조**. 구현 실행 지시가 아니다.
- 담당 범위: `FEM-REQ-SHELL-THERMAL-001`–`018`의 수식·물리 의미와 검증 함의.
- 기준: [Feature PRD](PRD.md), [Feature ADR](ADR.md), [프로젝트 지침](../../AGENTS.md),
[프로젝트 PRD](../PRD.md), [공통 ADR](../ADR.md#adr-028), [ARCHITECTURE](../ARCHITECTURE.md).
- 아래 수식은 FESA의 제안이다. Abaqus 내부 요소·적분·열용량·결과 생성과 동등하다는 주장이 아니다.
## 1. 적용 가정과 차원
고정된 3차원 midsurface의 4절점 Q4 요소에 두께 방향 온도점 5개를 둔다.
요소마다 두께 `h > 0`, 등방성 열전도율 `k > 0`, 밀도 `ρ > 0`, 비열 `c > 0`가
상수이며 단면 전체는 같은 재료다. 서로 다른 요소에는 다른 값을 배정할 수 있다.
변형·대류·복사·내부 발열·적층·면적 분포 표면 열유속은 [PRD 제외 범위](PRD.md#제외-범위)를 따른다.
일관된 입력 단위계를 사용한다. SI 예시는 `h [m]`, `T [K]`, `t [s]`,
`k [W/(m·K)]`, `ρ [kg/m³]`, `c [J/(kg·K)]`, 열유속 `q [W/m²]`이다.
상수 물성에서는 온도 차에 같은 척도를 쓰는 섭씨도 가능하다. 숫자로 단위계를 추정하지 않는다.
온도 기준 이동에 불변인 에너지 증분을 사용하며 절대 내부에너지의 영점을 추정하지 않는다.
기하학적으로 얇은 shell의 product-domain 근사로 면내·두께 전도를 모두 유지한다.
여기서 ‘얇음’은 **두께 방향 등온 가정이 아니다**. 정적인 geometry이므로 구조 회전 DOF,
기하 비선형 tangent, 재료 history update는 없다. 유일한 진화 state는 온도다.
## 2. Geometry, 방향과 접속의 의미
자연좌표 `(ξ,η) ∈ [-1,1]²`, 절점 순서 `(-1,-1),(1,-1),(1,1),(-1,1)`를 사용한다.
절점 좌표를 `x_i`, midsurface를 `r=Σ_i N_i x_i`로 두고 다음을 계산한다.
\[
a_1=r_{,\xi},\quad a_2=r_{,\eta},\quad
g_{\alpha\beta}=a_\alpha\cdot a_\beta,\quad
J_s=\|a_1\times a_2\|=\sqrt{\det g},\quad
n=(a_1\times a_2)/J_s,\quad
a^\alpha=\sum_\beta(g^{-1})_{\alpha\beta}a_\beta.
\]
`α,β=1,2`; `a^α`는 reciprocal tangent이다. 실제 평가점마다 metric을 계산하며 warped
Q4를 요소 중심의 평면에 투영하지 않는다. 출력 직교축은 `e1=a1/|a1|`, `e2=n×e1`, `e3=n`이다.
두께좌표 `ζ ∈ [-1,1]`, `z=hζ/2`; 음의 normal 쪽이 bottom, 양의 쪽이 top이다.
표시 위치는 `x=r+zn`으로 정의하되, 연산자는 아래 근사를 쓴다.
\[
\nabla_* T=a^1T_{,\xi}+a^2T_{,\eta}+n\frac{2}{h}T_{,\zeta},\qquad
dV_* = J_s\frac h2\,d\xi\,d\eta\,d\zeta.
\]
정확한 offset-volume의 접선 `aα+z n_,α`, 두께별 metric·면적 변화는 생략한다.
따라서 `h |κ1|`, `h |κ2|`가 작고 열장이 변하는 면내 길이에 비해 두께가 작은 영역을
대상으로 한다. 적분 차수 증가로 이 모델링 오차가 없어지지는 않는다. 곡률의 정량 허용치,
왜곡 허용치와 validation margin은 아직 미정이다. 구조 shell의 두께 비율 기준을 전용하지 않는다.
곡률을 반영하는 별도 shell 열모델이 있다는 점은 [COMSOL의 곡면 열전달 예제](https://www.comsol.com/model/heat-transfer-in-curved-layered-shells-104241)로 확인할 수 있다.
Geometry의 필수 조건은 유한 좌표, 서로 다른 4절점, `J_s>0`, 비특이 metric, 자기 교차 없는
유효 patch와 일관된 orientable connectivity이다. 적분점 검사만으로 전체 patch 유효성을
증명하지 않는다. 검사 위치·scale-aware degeneracy 기준·비다양체 허용 범위는 I/O와
numerical review가 확정해야 하며 작은 양수 Jacobian을 clamp하지 않는다.
**접속 제안:** 인접 요소는 같은 source node의 같은 `ζ` 온도 DOF를 공유한다.
매끈한 면에서 이는 온도 연속성과 약형 열률 평형을 준다. 접힌 판에서는 요소별 normal을
유지하고 공유 edge의 `ζ`별 온도만 같게 묶는 이상적 무저항·무용량 접합이다.
서로 다른 두께에서는 같은 normalized `ζ`를 연결하므로 실제 `z` 좌표가 같다는 뜻이 아니다.
실제 step 단차의 노출면, 유한 접합부 부피, 국소 spreading resistance는 해상하지 않는다.
이 모델은 사용자 결정이 필요한 물리 이상화다. 동의 없이 실제 3D 접속을 지원한다고 표시하지 않는다.
공유 edge의 요소 순서는 서로 반대여야 하고 bottom/top의 연속된 의미를 유지해야 한다.
온도는 scalar이므로 normal 사이의 회전행렬을 곱하지 않는다. 법선 반전은 해당 두께 station
`a ↔ 6-a`와 면 하중/경계조건을 함께 바꿔야 같은 물리 문제가 된다.
## 3. 20 DOF와 온도 보간
절점별 온도점은 `ζ_a=(-1,-1/2,0,1/2,1)`, `a=1,…,5`이다.
로컬 순서는 `p=5(i-1)+a`, 즉 node-major 20 DOF다. 외부 DOF는 `10+a`로 대응한다.
따라서 `11=bottom`, `13=midsurface`, `15=top`이다. 기하 절점 위치와 DOF11의 물리 위치를
혼동하지 않는다. 이 외부 위치 의미는 [Abaqus Heat Transfer Shell Elements](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEELMRefMap/simaelm-c-shellelem.htm)의 공개 규약을 따른다.
면내 shape와 미분은 각 절점의 부호 `(ξ_i,η_i)`를 사용한다.
\[
N_i=\tfrac14(1+\xi_i\xi)(1+\eta_i\eta),\quad
N_{i,\xi}=\tfrac14\xi_i(1+\eta_i\eta),\quad
N_{i,\eta}=\tfrac14\eta_i(1+\xi_i\xi).
\]
두께는 `I−=[-1,0]`, `I+=[0,1]`의 **두 C0 quadratic 구간**으로 제안한다.
단일 quartic보다 각 구간의 저차 보간·국소 미분을 명료하게 유지하며, 중간 온도 1개를 공유한다.
구간 좌표는 `s=2ζ+1` 또는 `s=2ζ−1`; 두 경우 `s∈[-1,1]`, `ds/dζ=2`이다.
\[
\ell_1(s)=\tfrac12s(s-1),\quad \ell_2(s)=1-s^2,\quad
\ell_3(s)=\tfrac12s(s+1),\qquad
\ell'_1=s-\tfrac12,\quad\ell'_2=-2s,\quad\ell'_3=s+\tfrac12.
\]
`I−`에서는 `(L1,L2,L3)=(ℓ1,ℓ2,ℓ3)`, `L4=L5=0`;
`I+`에서는 `(L3,L4,L5)=(ℓ1,ℓ2,ℓ3)`, `L1=L2=0`이다.
활성 함수의 `L_,ζ=2ℓ'`; `ζ=0`의 함수값은 유일하지만 미분은 좌·우로 구분한다.
\[
H_{ia}=N_iL_a,\qquad T_h=\sum_{i,a}H_{ia}T_{ia}=\mathbf H\mathbf T_e,\qquad
B_{ia}=L_a(a^1N_{i,\xi}+a^2N_{i,\eta})+n\frac2hN_iL_{a,\zeta}.
\]
`H`는 `1×20`, `B`는 global Cartesian `3×20`, `∇_*T_h=B T_e`다.
`ΣH=1`, `ΣB=0`; Kronecker interpolation과 내부 station 온도 연속성을 확인한다.
두 구간은 수치 보간 구간이며 물성 layer나 물리 계면이 아니다.
## 4. 지배식, 약형과 20×20 행렬
Fourier 법칙 `q=−k∇_*T`, 저장식 `ρc Tdot + div_* q=0`를 사용한다.
외향 열유속 `q·ν`와 반대인 `q_in=−q·ν`를 양의 입력으로 정의한다.
자유 test function `v`에 대해 product-domain 약형은 다음과 같다.
\[
\int_{V_*}\rho c\,v\dot T\,dV_*+
\int_{V_*}k\nabla_*v\cdot\nabla_*T\,dV_*
=\int_{\Gamma_{\rm edge,*}}v q_{\rm in}\,dA_*+\sum_j v_jP_j.
\]
지정 온도 외의 하중 없는 경계는 자연 단열이다. 집중 입력 `P_j`는 승인된 bottom/top
절점의 이산 heat rate이며 연속체 point-source 근방의 유한 heat flux를 보장하지 않는다.
\[
\mathbf C_e=\int\rho c\,\mathbf H^T\mathbf H\,J_s\frac h2\,d\xi d\eta d\zeta,
\qquad
\mathbf K_e=\int k\,\mathbf B^T\mathbf B\,J_s\frac h2\,d\xi d\eta d\zeta.
\]
`C_e [J/K]`는 consistent 열용량, `K_e [W/K]`는 열전도 행렬이다.
`C_e` 대칭 양정치, `K_e` 대칭 양반정치와 유일한 요소 상수온도 null mode를 기대한다.
Reduced integration, hourglass stiffness, capacity lumping은 이 제안에 넣지 않는다.
명시적인 component식과 분리 계산에 필요한 작은 행렬은 다음과 같다.
\[
M_{ij}=\int_{[-1,1]^2}N_iN_jJ_s\,d\xi d\eta,\quad
S_{ij}=\int_{[-1,1]^2}\sum_{\alpha\beta}N_{i,\alpha}g^{\alpha\beta}N_{j,\beta}J_s\,d\xi d\eta,
\quad Z^0_{ab}=\int_{-1}^1L_aL_b\,d\zeta,\quad Z^1_{ab}=\int_{-1}^1L_{a,\zeta}L_{b,\zeta}\,d\zeta,
\]
\[
(C_e)_{ia,jb}=\rho c\frac h2M_{ij}Z^0_{ab},\qquad
(K_e)_{ia,jb}=k\left(\frac h2S_{ij}Z^0_{ab}+\frac2hM_{ij}Z^1_{ab}\right).
\]
`a^α·n=0`이므로 면내/두께 교차항은 없다. 각 길이 1인 `ζ` 구간에서
다음 `3×3` 행렬을 `(1,2,3)`와 `(3,4,5)`에 각각 더하면 `Z^0,Z^1`을 얻는다.
\[
Z^0_{\rm seg}=\frac1{30}\begin{bmatrix}4&2&-1\\2&16&2\\-1&2&4\end{bmatrix},\qquad
Z^1_{\rm seg}=\frac1{3}\begin{bmatrix}7&-8&1\\-8&16&-8\\1&-8&7\end{bmatrix}.
\]
따라서 `C=ρc(h/2)(M⊗Z0)`, `K=k[(h/2)(S⊗Z0)+(2/h)(M⊗Z1)]`이다.
이는 해당 node-major 순서와 일정 두께·물성·product metric에서만 적용한다.
요소/DOF source identity와 stable scatter를 보존하여 full `C,K,F`를 조립한다.
## 5. 적분과 geometry 오차의 분리
Affine 평판(직사각형·평행사변형)의 일정 metric에서는 면내 `2×2` Gauss가 `M,S`에 정확하다.
두께 각 구간에서 `C`와 면내 전도는 4차 다항식이므로 **3점 Gauss**가 필요하다.
두께 전도는 2차이므로 2점으로 정확하지만 통일된 3점을 권장한다.
이에 따라 affine의 직접 적분은 `2×2×(2 segments×3)=24`점으로 정확하다.
일반적인 평면 왜곡 Q4의 `S`는 역 Jacobian 때문에 다항식이 아니므로 이 exactness는 적용되지 않는다.
제안 기본은 모든 요소의 면내 `3×3` Gauss와 위 exact `Z`의 분리 계산이다.
직접 계산하면 `3×3×2×3=54`점이며 같은 행렬이어야 한다. 3점 규칙은
`s=(-√(3/5),0,√(3/5))`, `w=(5/9,8/9,5/9)`이고 각 두께 구간에서 `dζ=ds/2`다.
표면의 warped/curved metric에는 유한 고정 차수의 exactness를 주장하지 않는다.
`3×3 → 5×5 → 7×7` 적분 수렴, mesh 수렴, thin-shell 모델 오차를 별도 확인한다.
지원 geometry 범위에서 기본 차수가 불충분하면 검토를 통해 차수/범위를 고정하고 구현한다.
실행마다 허용오차에 맞춰 임의 adaptive quadrature를 선택하는 계약은 아니다.
## 6. 가장자리·절점 열입력
Edge 순서는 `1:(1,2), 2:(2,3), 3:(3,4), 4:(4,1)`로 제안한다.
면내 자연좌표 edge curve를 `r_edge(u)`, `u∈[-1,1]`, `J_l=|dr_edge/du|`로 둔다.
두께 전체 균일 입력 `q_in [W/m²]`의 일관 하중은 다음과 같다.
\[
(F_e^{\rm edge})_{ia}=\int_{-1}^1\int_{-1}^1
N_i(\xi(u),\eta(u))L_a(\zeta)q_{\rm in}J_l\frac h2\,d\zeta du.
\]
Q4의 직선 edge, 일정 입력·두께에는 총 입력 `q_in h L_edge`가 정확히 보존된다.
각 endpoint의 5성분은 `q_in h L_edge (1,4,2,4,1)/24`이며 나머지 두 절점은 0이다.
이는 `∫L dζ=(1,4,2,4,1)/6`와 edge당 `∫N_i dl=L_edge/2`에서 나온다.
Edge 2점, 각 두께 구간 2점으로 이 하중은 정확하다. 내부 온도점에도 일관 하중이 생기는
것은 허용된 edge 입력의 결과이며, 내부 온도점 직접 집중 입력을 지원한다는 뜻은 아니다.
외부 syntax가 선열률 `λ [W/m]`를 쓰기로 결정되면 `q_in=λ/h`로 해석해야 한다.
두 단위를 혼용하지 않으며 외부 입력 단위·keyword는 I/O owner가 확정한다.
Bottom/top 집중 열입력 `P [W]`는 지정 source node의 `a=1/5`에 그대로 더한다.
`h`, 면적 또는 적분 weight를 추가하지 않는다. 지정 온도와 같은 DOF의 입력도 full `F`에
남겨 반력 계산에 반영한다. 중복 application의 가산/충돌 의미는 I/O 계약을 따른다.
## 7. Backward Euler, 지정 온도와 최초 증분
고정 `Δt>0`에서 backward Euler를 제안한다. `t_n=nΔt`, `A=C/Δt+K`이면
\[
C\frac{T^{n+1}-T^n}{\Delta t}+KT^{n+1}=F^{n+1}+R^{n+1},\qquad
A_{ff}T_f^{n+1}=F_f^{n+1}+\frac{C_{ff}}{\Delta t}T_f^n
+\frac{C_{fc}}{\Delta t}T_c^n-A_{fc}g^{n+1}.
\]
여기서 `f/c`는 free/constrained, `T_c^{n+1}=g^{n+1}`이다. 동등한 RHS 표현은
`F_f−K_fc g^{n+1}+(C_ff/Δt)T_f^n+(C_fc/Δt)(T_c^n−g^{n+1})`다.
**이전 constrained 온도 항은 첫 증분에서도 생략하지 않는다.** 이후 일정 `g`에서는
마지막 항이 사라진다. 잔차 tangent는 정확히 `A`; Newton 반복은 필요 없다.
Backward Euler의 mass/diffusion 행렬 구성은 [MFEM Example 16 원문](https://raw.githubusercontent.com/mfem/mfem/master/examples/ex16.cpp)에서도 확인할 수 있으며, 위 제약·초기화 정책은 별도의 FESA 제안이다.
`C>0`이므로 단열·무구속 모델도 transient `A_ff`는 양정치다. 정상 전도 `K`의 상수온도
null mode를 과도 해석의 singular error로 해석하지 않는다. 일반 partition 대수에서 모든
DOF가 constrained이면 `0×0` free solve를 건너뛰고 prescribed state와 full reaction을 계산한다.
이 경우는 generic partition fixture로만 검증한다. 이번 공개 입력은 bottom/top만 구속할 수
있으므로 내부 3개 station까지 모두 구속하는 열 CLI 모델은 허용되지 않는다.
고정 geometry·물성·DOF 집합·Δt에서는 `A_ff`를 최초 한 번 factorize할 수 있다.
전체 시간이 `Δt`의 정수 배가 아니면 입력을 거부하는 방안을 권장한다. 짧은 마지막 증분은
고정 `Δt`와 factorization 재사용 의미를 바꾸므로 자동 도입하지 않는다. 시간 비교의 수치
판정과 종료 규칙은 사용자 검토와 I/O 계약에서 확정한다.
**초기 불일치 제안:** 입력 초기 온도를 5점에 복제한 전체 `T^0_raw`를 보존하며,
시간 적분의 `T^0=T^0_raw`로 사용한다. `t=0`에는 지정 온도로 덮어쓰지 않는다.
지정 온도는 첫 완료 증분 `t_1`부터 정확히 적용한다. 입력 초기값과 `g`가 다른 경우
그 차이는 첫 증분에 들어가므로 `C_fc(T_c^0−g)/Δt`와 저장에너지가 모두 살아 있다.
이는 초기 불연속을 첫 유한 증분에서 처리하는 이산 정책으로, 실제 순간 impulse의
해상이나 `t=0+` 경계 만족을 주장하지 않는다. `t=0` 반력 열률은 시간 차분이 없어
미정의다. 0으로 만들어 ‘계산된 반력’으로 저장하지 않는다.
대안인 `t=0` 즉시 projection은 별도 에너지 jump `1ᵀC(T^0_projected−T^0_raw)`와
그 보존/보고 정책이 필요하다. 이 선택은 결과를 바꾸므로 사용자 결정 후 하나만 구현한다.
생략된 초기 온도의 값은 이 문서에서 결정하지 않는다. Reference는 이 default에 민감하다.
각 증분은 solve → full 온도 복구 → residual/flux/유한성·수지 확인 → candidate commit
순서로 처리한다. 실패 candidate가 이전 완료 state나 최종 HDF5를 대체하지 않는다.
## 8. 반력 열률, 에너지와 안정성
반력은 하중 제거 전 full residual에서 구한다.
\[
r^{n+1}=C(T^{n+1}-T^n)/\Delta t+KT^{n+1}-F^{n+1},\quad
R_c=r_c,\quad r_f\approx0,\qquad
U(T)=\mathbf1^TC(T-T_{\rm ref}\mathbf1).
\]
양의 `R_c [W]`는 지정 온도를 유지하려고 모델 **안으로** 공급하는 열률이다.
열원을 외부가 받는 부호는 반대다. 외부 reference의 부호는 별도 확인해야 한다.
`K1=0`과 대칭성에 의해 증분의 전역 수지는
\[
U^{n+1}-U^n=\Delta t\left(\mathbf1^TF^{n+1}+\mathbf1_c^TR_c^{n+1}
+\mathbf1_f^Tr_f^{n+1}\right)
\]
이다. Free residual을 버리지 않고 수지 defect와 함께 확인한다. 정상상태에서는 총 입력과
반력 합이 0이다. 단열·무입력·무구속에서는 `U`가 보존되고 다음 이산 소산식이 성립한다.
\[
\tfrac12\big(\|T^{n+1}\|_C^2-\|T^n\|_C^2+\|T^{n+1}-T^n\|_C^2\big)
+\Delta t\|T^{n+1}\|_K^2=0.
\]
이 식의 이차량은 안정성 척도이며 실제 열에너지 `U`와 다르다.
Backward Euler는 이 의미에서 안정하지만 온도 positivity·maximum principle을 보장하지 않는다.
Consistent `C`, Q2 shape의 음의 구간과 일반 mesh의 `K`는 초기에 overshoot/undershoot를
만들 수 있다. 작은 `Δt`만으로 공간 이산의 단조성이 보장되지 않는다. Clamp, 임의 lumping,
인공 확산 또는 reference tolerance 완화로 이를 숨기지 않는다.
## 9. Heat flux 계산과 recovery identity
완료된 온도 `T_e^{n+1}`로 각 지정 평가점에서 다음을 직접 계산한다.
\[
q^{\rm global}=-kBT_e,\qquad
q^{\rm local}=\begin{bmatrix}e_1^T\\e_2^T\\n^T\end{bmatrix}q^{\rm global},\qquad
q_3=-\frac{2k}{h}\sum_{ia}N_iL_{a,\zeta}T_{ia}.
\]
Global 성분은 Cartesian `qx,qy,qz`, local은 `q1,q2,q3`이며 모두 열유속 `[W/m²]`다.
두께 적분 열류 `[W/m]`, 절점 입력 `[W]`, 반력 `[W]`와 구분한다.
예를 들어 `T=T_bottom+(ζ+1)(T_top−T_bottom)/2`면
`q3=−k(T_top−T_bottom)/h`; top이 뜨거우면 `q3<0`이다.
Bottom 외향 normal은 `−n`, top은 `+n`이므로 외향 성분은 각각 `−q3`, `+q3`다.
결정적인 필수 recovery 위치 제안은 면내 4점
`(-g,-g),(g,-g),(g,g),(-g,g)`, `g=1/√3`와 두께 trace
`(-1,+),(-1/2,interior),(0,−),(0,+),(1/2,interior),(1,−)`의 곱인 **24점/요소**다.
두께 trace의 부호는 어느 구간 내부에서 접근하는지를 뜻한다. Integration 점과 recovery
점은 독립 계약이다. `ζ=0`의 온도는 같아도 `q3(0−),q3(0+)`는 서로 다를 수 있으며
이 둘을 평균하여 원자료를 잃지 않는다. 연속해의 재료 계면을 뜻하는 것도 아니다.
Row는 최소 `(instance, element label, in-plane point, thickness station, trace side, time)`와
component/좌표계로 구별해야 한다. Global/local 중 영속 저장 형식은 I/O owner가 결정한다.
요소 사이 edge의 flux도 요소별 한쪽 값을 유지한다. 서로 다른 `k`, normal, thickness에서
벡터를 무조건 같게 만들지 않는다. 접합부의 보존량은 약형으로 조립되는 열률이다.
`−kBT` raw flux의 경계 적분은 이산 반력과 일반적으로 정확히 같지 않으며 반력을 대신하지 않는다.
절점 외삽, nodal averaging, flux smoothing은 이 제안의 필수 recovery가 아니다.
## 10. 검증 함의와 미결정 사항
다음은 실행 결과가 아닌 검증 설계다. 수치 기준은 독립 reviewer가 정하며
외부 비교는 [공통 TOLERANCE](../TOLERANCE.md)를 그대로 따른다.
| 검증 | 관찰할 내용 |
| --- | --- |
| Shape/행렬 | Nodal interpolation, partition of unity, `ΣB=0`, explicit Z와 직접 적분 일치, `C` SPD, `K` PSD/rank 19, symmetry |
| 평판 patch·회전 | Constant/면내 선형/두께 선형 온도에서 gradient·flux, 회전 시 T 불변과 q 회전, 법선 반전+station 재매핑 |
| 열입력 | Edge 총률 `q_in hL`·5점 weight, bottom/top 집중 입력, prescribed DOF와 겹친 입력의 반력 |
| 과도·초기 | 단열 균일온도 보존, 초기 불일치 첫 RHS, 공개 입력의 no-constrained, 에너지 수지·BE 소산; all-constrained는 generic partition fixture만 사용 |
| 면내 해석해 | 단열 직사각판 `T=T0+A cos(πx/L)exp[-α(π/L)²t]`, `α=k/(ρc)`; 면내 초기값은 5점 동일 |
| 두께 해석해 | 균일 초기온도 slab의 두 표면 온도 step에 대한 1D Fourier-series 해와 비교; 초기 jump와 첫 step 분리 |
| 재료·접속 | 두 물성/두께 strip의 직렬 전도는 아래 kernel/assembly oracle 범위로 구분; folded 등온/열률 수지와 junction 이상화의 별도 3D 한계 |
| 수렴·특이점 | `Δt` 1차 수렴, 면내 mesh/적분 차수 수렴, 집중 입력 근방 flux의 mesh 의존성과 곡률 오차 |
| Reference | 기존 Step-1, `t=37`, NT11 bottom만 source identity로 비교; initial default·첫 증분·C 처리 차이 조사 |
두 물성/두께 strip의 `R_th=Σ_e L_e/(k_e h_e w_e)` 정확해 검증은 양 끝 단면의 모든
station에 온도를 지정하는 kernel/assembly oracle이다. 내부 station 구속이 필요한 이
fixture는 공개 CLI acceptance 사례로 쓰지 않는다. 공개 입력으로 bottom/top만 구속한
strip은 두께 경계층을 포함한 독립 해 또는 동등한 조건의 oracle로 별도 검증해야 한다.
고정 5개 두께 DOF에서는 면내 refinement만으로 임의의 두께 경계층이 수렴하지 않는다.
Slab 해석해에 대한 두께 오차와 초기 `sqrt(αt)` 열침투 깊이를 확인해야 한다. 더 미세한
두께 모델은 독립 검증용 oracle이며 제품 입력의 온도점 수 확대를 뜻하지 않는다.
Reference CSV 한 시점은 다른 4개 온도점, flux, reaction 또는 전체 이력의 evidence가 아니다.
Consistent C와 본 적분·초기화 선택이 reference 정확도에 미치는 영향은 아직 측정되지 않았다.
미결정 owner는 메인/사용자(물리·초기 정책), I/O owner(공개 의미), numerical reviewer(수치 허용 범위)다.
사용자 검토에는 thin-shell product geometry와 접속 이상화, C/BE, 최초 불일치·종료 시점,
24개 flux trace 제안을 포함한다. Geometry 판정 기준과 기본 적분의 지원 범위, 생략 초기값,
edge 외부 단위, t=0 결과의 validity 표현은 구현 전에 확정해야 한다.
현재 정식화 담당자의 확인은 문헌·요구사항 대조와 문서 정적 검토뿐이다. Solver build/test,
reference 수치 비교와 physics 검토는 미실행이다. 독립 numerical review의 결과는 별도
보고서를 참조하며 본 문서는 스스로 수치 타당성이나 결과 correctness를 승인하지 않는다.
@@ -0,0 +1,121 @@
# Shell 과도 열전달 독립 수치 검토
- 검토일: 2026-09-28. 상태: **Proposed 계획의 독립 검토 완료 / 구현 검증 미실행**.
- 판정: 제안된 약형·행렬·BE partition·반력·한쪽 heat flux는 수학적으로 일관된다.
아래 미결정 사항 때문에 구현 착수 계약이나 제품 정확도가 승인되었다는 뜻은 아니다.
- 범위: [PRD](PRD.md)의 FEM-REQ-SHELL-THERMAL-001–018,
[정식화](formulation.md) §§1–10, [상세 계획](design-plan.md) §§1–12.
- 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md),
[ARCHITECTURE](../ARCHITECTURE.md), [ADR-028](../ADR.md#adr-028),
[공통 TOLERANCE](../TOLERANCE.md). 상위 계약·소스·테스트·reference는 수정하지 않았다.
## 1. 영향이 큰 판단과 필요한 결정
| ID / 판정 | 근거·영향 | 필요한 조치 / owner |
| --- | --- | --- |
| NR-01 / 물리 결정 대기 | Midsurface metric을 두께 전체에 쓰는 product-domain은 실제 offset volume의 곡률 항을 생략한다. 같은 normalized ζ를 연결한 두께 단차·fold는 실제 3D 접합부가 아니다. | 메인/사용자: 이 이상화를 승인하고 지원 한계를 명시. Numerical/I/O: 곡률·왜곡·퇴화·orientation 판정과 허용 geometry 범위를 구현 전에 확정. 높은 적분 차수로 모델링 오차가 제거된다고 주장하지 않음. |
| NR-02 / 초기 상태 계약 대기 | Raw 초기 온도를 첫 BE 증분의 이전 상태로 쓰는 식은 맞지만 t=0 즉시 projection과 첫 RHS·에너지가 다르다. Reference 입력에는 step 전 `*Boundary / Set-10,11,11`과 step 안의 `Set-10,11,11,1000.`이 모두 있다. | 메인/사용자: 첫 증분 jump 의미 결정. I/O: 생략 초기값, 생략 boundary 값, pre-step boundary와 step 재정의의 의미를 명시. 단일 transient step 지원을 이유로 pre-step 데이터를 무시하지 않음. |
| NR-03 / 공개 입력 결정 대기 | Edge kernel의 면적당 입력과 `q_in hL`은 일관되지만 DS4 `*DFLUX, S1…S4` 대응은 확인되지 않았다. 기존 reference에는 edge 하중이 없다. | I/O/메인: 공개 syntax·단위·대상 edge·중복 입력 의미 확인. 입증되지 않은 keyword 지원을 선언하거나 line-rate에 h를 중복 곱하지 않음. |
| NR-04 / 구현 전 수치 계약 부족 | 3×3 표면 적분은 일반 warped Q4에서 exact가 아니다. Consistent C와 P2 두께 보간은 maximum principle을 보장하지 않는다. 고정 5점은 초기 두께 경계층을 임의로 해상할 수 없다. | Numerical owner: 아래 geometry·적분·수렴·내부 residual 판정을 고정하고 독립 사례로 검증. 실패 뒤 clamp/lumping/인공 확산 또는 tolerance 완화 금지. 방법 변경은 새 검토 대상. |
| NR-05 / 문서 정합 보완 반영 | 최초 계획의 24개 integration Gauss 위치와 정식화의 54점 직접 적분·24개 trace recovery가 달랐다. 최신 계획에서 구분됨. | 유지할 계약: production 3×3 surface×exact Z, 직접 검산 54점, affine 검산 24 Gauss점, 공식 recovery 24 trace점. 숫자 24가 같다는 이유로 위치를 대체하지 않음. |
| NR-06 / 검증 범위 보완 반영 | 직렬 strip 저항식은 단면 전체 end 온도 조건을 전제로 한다. 내부 station 지정 온도와 all-constrained는 현재 공개 입력 범위 밖이다. | 최신 계획처럼 exact strip 및 all-constrained를 assembly/algebra fixture로 분류. CLI bottom/top 지정 사례는 해당 경계층을 포함한 oracle로 검증. |
NR-01의 물리 지원 제한, NR-02의 시작 의미, 종료 시간이 Δt의 정수 배가 아니면 거부하는
제안은 사용자 요구에 영향을 주는 결정이다. Z 계수·scatter 순서·구간 Jacobian·동일
물리량의 검증 metric 고정은 합의된 물리를 구현하기 위한 상세 계약이다. 영속 flux
좌표계·trace identity·t=0 validity는 I/O 계약이며 이 보고서가 대신 승인하지 않는다.
## 2. 독립 수식·정확 산술 검산
Python 표준 라이브러리 `fractions.Fraction`을 명령 내 scratch로 사용했다. 별도 계산 파일,
production/test 변경 또는 solver 실행은 없었다. 아래 입력과 결과로 검산을 재현할 수 있다.
| 항목 | 검산과 결과 |
| --- | --- |
| DOF/shape | Node-major `p=5(i−1)+a`, a=1…5. 각 길이 1인 두께 구간의 좌표 u∈[0,1]에서 shape `[1−3u+2u², 4u−4u², −u+2u²]`를 곱하여 항별 정확 적분. |
| 두께 질량 | `Z0_seg=(1/30)[[4,2,−1],[2,16,2],[−1,2,4]]` 재현. 조립 뒤 `Z0·1=(1,4,2,4,1)/6`, 합 2. |
| 두께 전도 | 위 다항식을 u로 미분하여 적분하면 `Z1_seg=(1/3)[[7,−8,1],[−8,16,−8],[1,−8,7]]`. 조립 뒤 `Z1·1=0` 정확 성립. |
| 체적/계수 | `dz=(h/2)dζ`, `∂z=(2/h)∂ζ`이므로 `C=ρc(h/2)M⊗Z0`, `K=k[(h/2)S⊗Z0+(2/h)M⊗Z1]`. 접선과 normal의 직교성으로 교차항 0. C는 energy/temperature, K는 power/temperature. |
| 평판의 rank/에너지 | 단위 정사각형, `h=2`, `k=ρc=1`의 수치 단위 fixture. `M=(1/36)[[4,2,1,2],[2,4,2,1],[1,2,4,2],[2,1,2,4]]`, `S=(1/6)[[4,−1,−2,−1],[−1,4,−1,−2],[−2,−1,4,−1],[−1,−2,−1,4]]`. C의 정확 LDL pivot 20개 모두 양수, K의 leading 19×19 pivot 모두 양수, `K·1=0`, `1ᵀC1=2` 정확 성립. 즉 C SPD, K PSD/rank 19. |
| Edge weight | 한 endpoint당 `q_in hL(1,4,2,4,1)/24`; 두 endpoint의 합은 `q_in hL`. 두께 station에 1/5씩 나누면 잘못된 일관 하중이다. |
| 적분 차수 | Affine Q4 면내 M/S는 2×2 exact. 두께 mass·면내 전도는 4차여서 구간별 3점, 두께 전도는 2차. Production 3×3×2×3=54점은 exact Z 분리식과 같은 quadrature를 표현한다. 실제 54점 코드의 동등성은 미검증. |
유효 geometry와 양의 적분 weight에서는 `vᵀCv>0`, `vᵀKv≥0`의 에너지 형태가 유지된다.
전역 K의 상수 null mode는 **연결된 thermal component마다 하나**이며, 분리된 mesh를
항상 rank N−1로 검사하면 안 된다. 모든 활성 DOF가 양의 체적 요소에 연결되면
`A=C/Δt+K`는 구속 없이도 SPD다. 극단적인 h 또는 Δt는 conditioning을 악화시킬 수
있으므로 factorization 성공만으로 정확도를 판단하지 않는다.
첫 증분 partition의 독립 반례 fixture는 다음과 같다. 일관된 단위로
`C=[[2,1],[1,2]]`, `K=[[1,−1],[−1,1]]`, `Δt=1/2`, `F=0`,
`T_raw⁰=(0,0)`, 두 번째 DOF의 지정 온도 `g=1`을 둔다.
- 올바른 `A=[[5,1],[1,5]]`; `T_f¹=−1/5`, `T_f²=1/25`.
- `R_c¹=24/5`, `R_c²=36/25`; `E=1ᵀCT`에서 두 증분 모두 `ΔE=Δt R_c` 정확 성립.
- 최초 RHS를 일정 g의 이후 증분 식으로 바꾸면 `T_f¹=+1/5`가 되어 검출된다.
이 fixture는 signed 온도와 consistent C의 undershoot가 에너지 안정성과 모순되지
않음을 보이며 실제 20 DOF shell 해나 외부 reference 통과 증거는 아니다.
`r=CΔT/Δt+KT−F`의 constrained 성분은 모델에 공급되는 양의 반력 열률이다.
전역 수지는 `ΔE=Δt(1ᵀF+1_cᵀR_c+1_fᵀr_f)`이며, free residual을 포함한 대수적
동일성 확인과 free residual 자체가 작은지의 확인을 분리한다. `q=−kBT` 경계 적분은
일반적으로 이 반력과 같지 않다. 입력 없는 단열계의 열에너지 보존과 BE의 C-norm
소산도 서로 다른 검증이다. 초기 t=0 반력은 미정의이고 material history update는 없다.
## 3. 구현 후 반증 가능한 검증 계획
| 사례·수준 | 독립 oracle와 판정 의도 |
| --- | --- |
| Shape/행렬, kernel | 위 exact M/S/Z를 기대값으로 사용. Node-major Kronecker 순서, symmetry, 상수 null, SPD, 양의 에너지, 직접 54점/분리식 동등성 확인. h를 바꿔 C 및 면내 K의 h scaling과 두께 K의 1/h scaling을 각각 검사. |
| 온도 patch/방향, kernel | 평판에서 `T=A+b·r+c z`를 주고 `q=−k(b+c n)` 확인(b는 평판 접선). 임의 rigid rotation에서 T 불변, q 회전. Connectivity 반전 시 station a↔6−a와 면 조건도 함께 반전. |
| 한쪽 trace, recovery | 면내 상수, 두께 값 `(0,0,0,1,2)`의 임의 kernel state는 `q3(0−)=0`, `q3(0+)=−4k/h`. 24개 trace 중 0−/0+가 별도 identity로 저장되는지 확인. 이 임의 state는 공개 초기조건 fixture가 아님. |
| 열용량/하중/수지, CLI+assembly | 단열·균일 초기 온도는 불변. Edge만 주면 총 입력 q_in hL; 집중 입력은 P 그대로. Prescribed DOF의 P도 full F에 남아 reaction을 바꾸는지 확인. 반력 부호, free residual, ΔE와 BE 소산을 각각 확인. |
| BE, algebra | 위 두 증분 fixture, no-constrained 및 generic all-constrained. 이전 constrained state를 raw 초기값으로 유지하고 실패 candidate가 이전 state/output을 덮어쓰지 않는지 확인. |
| 면내 해석해, CLI | 단열 직사각판 `T=T0+A cos(πx/L)exp[−α(π/L)²t]`, `α=k/(ρc)`. 초기값은 station 전체 동일. 두께 균일해가 유지되는지와 면내 temperature/flux 오차 확인. |
| 시간 수렴, 독립 semi-discrete oracle | 같은 고정 mesh의 generalized eigenpair `Kv=λCv`로 `T(t)=exp(−λt)v`, BE 증폭률 `(1+λΔt)^−n` 대조. dt, dt/2, dt/4에서 1차 오차를 확인해 공간오차와 분리. Eigenvector 초기값은 algebra fixture로 한정. |
| 두께 slab, CLI | x=z+h/2, bottom Ts, top 단열, 초기 Ti. `θ=(T−Ts)/(Ti−Ts)=Σ[m≥0]4/[(2m+1)π] sin[(2m+1)πx/(2h)] exp[−α((2m+1)π/(2h))²t]`. 양의 시간에서 5 station T와 미분한 q, 전체 energy 및 reaction 비교. Series 절단 오차를 별도 제한. |
| Mesh/두께 해상도 | Smooth affine mesh에서 면내 temperature L2의 기대 2차, gradient L2의 기대 1차를 확인. Slab은 고정 5점이므로 dt→0의 두께 공간오차 plateau와 열침투 깊이 √(αt)를 보고. 면내 refinement로 두께 오차가 사라진다고 판정하지 않음. |
| 재료·fold·두께 접속 | 직렬 저항 ΣL/(khw)는 full-end prescribed assembly fixture. CLI에서는 bottom/top 조건의 실제 oracle을 별도로 사용. Fold 등온은 q=0; 비균일 경우 global q의 동일성을 강요하지 않고 공유 DOF에 조립되는 열률 수지를 검사. |
| Warped/왜곡 geometry | 허용될 geometry군에 대해 3×3→5×5→7×7에서 K/C 및 대표 T/q의 변화 확인. Geometry mesh 오차, quadrature 오차, offset-volume 생략 오차를 분리. Degenerate·자기 교차·orientation 불일치는 음성 사례. |
내부 roundoff 판정은 exact oracle를 기준으로 행렬 norm·연산 수·machine epsilon과
conditioning을 반영하여 구현 전에 고정한다. 예를 들어 free residual은
`||r_f||/(||A_ff|| ||T_f||+||b_f||)`, 수지 defect는 저장·입력·반력 항의 절댓값 합으로
정규화하되 분모 0은 별도 처리한다. Zero floor `max(1,scale)`는 추가하지 않는다.
Roundoff 한계, geometry margin, quadrature 변화 한계와 관찰 order의 허용 구간은 아직
확정되지 않았다. 위 기대 order 자체를 임의 5% 통과 기준으로 바꾸거나 공통 외부
tolerance를 이 검사들에 전용하지 않는다. 이 미결정 때문에 검증 실행 준비 완료 판정은 보류한다.
## 4. 기존 reference의 비교 계약과 관찰
Read-only 원본: `reference/shell-thermal/shell-thermal.inp`,
`reference/shell-thermal/shell-thermal NodalTemperature.csv`.
이번 검토에서 실제로 읽은 위치는 `C:/git/FESADev/reference/shell-thermal`이며
현 worktree로 복사하지 않았다. 별도 `reference-model.md` 없이 이 절에 필요한 계약을 둔다.
- 제안 family: `(shell-thermal, Step-1, t=37, bottom temperature, NT11, blocking)`.
온도 단위는 원본 입력의 일관된 단위이며 scalar이므로 좌표 회전과 무관하다.
- Row identity: `(instance=Part-1-1, source node label, source DOF=11)`와 step/time.
CSV에 instance 열이 없으므로 입력의 단일 instance와 source label 집합을 검증한 뒤 복원.
HDF5는 모든 station을 보존하되 비교 view는 bottom만 명시적으로 선택한다.
- Snapshot 정적 검사: 729행·729개 고유 node label, 모두 finite, 단일 Step-1/t37 frame.
min `−15.5742216`, max `1000`; `S=1000`, near-zero band `B=10`.
음수 전부가 near-zero는 아니다. `−15.5742216`은 상대오차 5% 대상이다.
- [공통 정책](../TOLERANCE.md): `|r|≤B`이면 `|f−r|≤B`, 나머지는 상대오차≤0.05,
모든 행의 relative RMS≤0.01을 함께 만족해야 한다. S=0은 exact-zero 규칙 적용.
Reference의 음수·미소값을 clamp하거나 단위/온도 영점을 이동하여 scale을 바꾸지 않는다.
- Missing/extra/duplicate/nonfinite, frame/instance/station mismatch를 tolerance 전에 거부.
현재 수행한 CSV 자체 검사는 FESA HDF5와의 일대일 대응 검증을 대신하지 않는다.
원본 NT11 한 frame은 내부 4 station, flux, reaction, edge load, 다중 재료/두께 또는
전체 시간 이력을 검증하지 못한다. 초기값·pre-step 경계·jump·consistent C·시간 적분
차이가 reference 비교에 미치는 영향은 아직 측정되지 않았다. 비교 실패는 이 차이들을
분리 조사할 근거이며 FESA가 Abaqus 내부 알고리즘과 같아야 한다는 요구가 아니다.
## 5. 수행 범위와 잔여 위험
수행: 관련 계약의 정적 대조, 위 exact 유리수 행렬/두 증분 검산, 원본 입력·CSV의
read-only 정적 확인, 문서 정합 확인. 미수행: solver 구현·build/CTest, FESA HDF5 생성,
외부 reference 수치 비교, 곡면/접합부/수렴 실험, 실제 결과의 physics evaluation.
초기·geometry·edge syntax·내부 수치 판정·영속 결과 계약을 확정하고 위 검증을 실행해야
한다. 본 보고서의 판정은 **정식화 초안의 독립 일관성 검토**로 한정한다.