feat(hex8): preserve full high-low state in dynamic element responses

This commit is contained in:
KOKO\Mimi
2026-10-09 23:46:42 +09:00
parent d8d06ae8ae
commit 5435acdde3
21 changed files with 1152 additions and 16 deletions
+12
View File
@@ -57,3 +57,15 @@ warning/no-op으로 수용한다. Mixed1–6 range의1–3은 적용하고4–6
**영향:** 실제 DOF·constraint·state/output은3성분이다. 비영 회전 BC·모든 회전 CLOAD,
DOF범위 밖이나 의미 있는 미지원 BC 옵션은 계속 거부한다. 원본을 수정·preprocess하지 않는다.
Parser에서 경고·translational 적용·회전 equation 부재·거부 경계를 행동 테스트로 확인한다.
## HEX8-ADR-008 — High+low 내부 물리 상태와 Float64 observable
**승인:** 2026-10-09 사용자는 제한된 단일·두 좌표 및 보상 가산 관찰 실패 이후
A([내부 정밀도 변경안](precision-proposal.md))를 선택했다.
**선택:** Solid HHT 내부 상태·predictor·힘·rates·수지·gate에 normalized high+low를
일관되게 사용하고 accepted history/rollback도 전체 상태를 보존한다. 기존 Float64
backend와 HDF5 field/shape/dtype은 유지하되 공식 값은 전체 물리량의 반올림 observable이다.
**영향:** 기존 Si/exact-zero·strict gate·HHT 계수·기준 M·고정 h/schedule·100회와 외부
tolerance는 유지한다. Kernel/geometry에 low를 전달하지 않는 update carry와 구분한다.
작은 독립 산술/Hex8·시간수렴·상태 보존 검증과 긍정적 실제 실행 이후 필수 원본101개
endpoint·HDF5/외부 비교·전체 회귀를 진행한다. 승인과 수렴 완료를 혼동하지 않는다.
@@ -16,7 +16,8 @@ static/frequency/HHT 절차를 추가한다. 코드 존재와 기능 검증 완
| [reference model](reference-model.md) | read-only 원본 inventory·quantity/key/point/time mapping |
| [numerical review](numerical-review.md) | 작성자와 독립된 정식화/controls 검토의 결과 |
| [lessons](lessons.md) | 정밀도 손실·수렴 실패와 수정의 근거 및 재사용할 주의점 |
| [precision proposal](precision-proposal.md) | 미채택 내부 정밀도 변경안·결과 의미·승인 전 검증 범위 |
| [precision proposal](precision-proposal.md) | 승인된 내부 정밀도 변경안·결과 의미·구현 전 검증 범위 |
| [precision formulation](precision-formulation.md) | HHT 전체 high+low 상태·동일 gradient 미분·산술 범위·반올림 출력 계약 |
메인이 문서·공유 연결·완료 판단을 소유한다. Kernel owner는 Hex8 local 계산/복구 payload와
직접 consumer를, semantic owner는 Domain/parser/3성분 DOF/load/assembly를 소유한다.
+5
View File
@@ -424,6 +424,11 @@ Generalized sparse FEAST의 공개 진입점은
## 현재 checklist
2026-10-09 사용자 A 승인은 [내부 정밀도 변경안](precision-proposal.md)의 전체 high+low
물리 상태와 Float64 반올림 observable을 FEM-REQ-HEX8-015·017–020에 적용한다.
HHT 식·기준 consistent M·입력·고정 schedule·100회·Si/exact-zero·원래 strict gate 및
외부 tolerance는 유지한다. 아래 구현·검증 checklist는 이 승인만으로 완료되지 않는다.
- [x] 수식·입출력·numeric controls·원본 mapping 정리 및 독립 numerical review 완료
- [x] Hex8 K0/consistent M/비선형 f/Kmat/Kgeo/Kt·형상·복구 kernel 검증
- [x] Solid Domain/parser/3N DOF/ordered assembly/amplitude 검증
@@ -4,6 +4,9 @@
물리 선택은 [ADR](ADR.md)에 있다. 이 문서는 승인된 식의 구현용 유도이며
외부 결과에 맞추어 physics를 바꾸는 권한이 아니다. 수치 controls는
[별도 원본](numeric-controls.md), 출력 tensor/identity는 [I/O](io.md)를 따른다.
2026-10-09 승인된 Solid HHT 내부 정밀도 변경의 구현 계약은
[precision formulation](precision-formulation.md)이다. 동적 paired 경로의 상대변위 gradient,
전체 상태·계수 연산과 반올림 출력 의미는 해당 문서를 함께 적용한다.
## Shape·기준 geometry·적분
+7
View File
@@ -7,6 +7,13 @@ FEM-REQ-HEX8-008–011,016–020,022–023다. Public CLI·path/lease/exit는
## Source 입력과 실패 경계
Solid HHT의 [승인된 high+low 계산](precision-proposal.md)은 내부 전체 물리 상태를
accepted history와 다음 trial에 유지한다. 공식 HDF5의 기존 field·shape·Float64 dtype은
변경하지 않으며 값은 전체 물리량의 round-to-Float64 observable이다. Self-check는
직렬화가 그 반올림과 일치하는지 확인한다. 내부 gate PASS를 rounded 배열 자체의
동일 gate PASS로 해석하지 않는다. 로그에 내부 산술을 명시하고 직렬화 비유한 값·
overflow는 실패로 처리해 기존 final을 보존한다. Restart는 지원하지 않는다.
기존 single Part/identity Instance/set/target subset을 재사용하고 source spelling/location/
instance/label과 internal index를 구분한다. C3D8의8 distinct nodes와 SOLID SECTION의 elset/
material 연결, constant E/nu 및 procedure별 density capability를 검증한다. Blank section row는
+22 -3
View File
@@ -228,10 +228,29 @@ Production의 principal refinement·history·ULP 탐색은 이 비교에 포함
게이트를 검증한 것이다. TEMP source는 실행 전 복원하고 실제 object를 재컴파일했다.
이 결과는 production carry 도입이나 반복 횟수 확대를 뒷받침하지 않는다.
Low를 물리 변위로 사용하는 [내부 정밀도 변경안](precision-proposal.md)은 미채택이다.
단순 carry와 구분하여 전체 계산 상태 및 Float64 출력의 반올림 의미를 결정해야 한다.
현재 물리 기준이나 원본을 조용히 변경하지 않는다.
이 진단 종료 시점에는 low를 물리 변위로 사용하는 변경안을 채택하지 않았다.
이후 사용자가 2026-10-09 선택 A로 [내부 정밀도 변경안](precision-proposal.md)을 승인했다.
단순 carry와 구분해 전체 계산 상태를 high+low로 유지하고 Float64는 반올림 observable로
출력한다. 기존 실패 evidence는 새 방식의 통과 증거가 아니며 물리 기준·원본은 유지한다.
원시 capture·정확 산술·backsolve·이웃 예측·native replay의 재현 자료와 독립 raw 검산은
로컬 `.harness/hex8-evidence/t6-independent-frozen/`에 보존한다. 기능 checklist는
그대로 미완료다.
## 승인된 전체 high+low 요소의 첫 검증
2026-10-09 승인 A 후, low를 누락하는 대조 kernel에서 실제 요소 assertion3개가 실패했다.
전체 pair로 H/Green strain/응력/힘/에너지/접선을 계산한 kernel은 native build0/CTest0이다.
원래 요소27개와 새 검사15개의 최종 묶음42/42가 통과했고, quarter-turn 작은 전단의 힘
covariance와 독립 exact-dyadic primitive oracle을 포함한다. Native 산술6/6은 RN/FTZ/DAZ
실행 전제와 normal high에 최소 subnormal FMA error가 붙는 경계까지 확인했다.
동적 선형과 비선형은 같은 상대변위 gradient의 미분을 사용한다. 기존 rounded K0를 새 힘에
혼합하지 않는다. 기준 절점0의 signed 방향 차분은 접선·에너지 gradient와 일치했고,
두 brick의 공유 면 힘, linear/NL zero-state Hessian 및 low만 남은 현재 셀의 ±폭을 검사했다.
중앙 에너지 차분의 StVK cubic 오차는 step²로 감소한다. 이를 exact 미분값으로 간주해
과도한 test bound를 적용했던 실패를 구분하고 분석적 truncation bound를 적용했다.
독립 numerical reviewer는 실제 shared arithmetic·kernel·geometry의 한정된 범위를 PASS로
판정했다. 재현 로그는 `.harness/hex8-evidence/precision/`에 보존한다. 이 결과는 동적 전체
상태·시간수렴·원본 endpoint·공식 출력의 완료를 뜻하지 않는다. 현재 checklist는 미완료다.
@@ -7,7 +7,11 @@
## 계산·형상 인증
모든 input/파생 값/결과를 finite 검증하고 positive Jacobian·밀도·material capability를 확인한다.
Production 계산 precision은 Float64다. Whole-cell 인증은 outward interval coefficient bounds와
정적·고유치와 기존 계산은 Float64다. 사용자 승인 [정밀도 변경안](precision-proposal.md)에 따라
Solid HHT의 내부 물리 상태와 힘·rates·수지·gate 계산은 normalized high+low를 사용한다.
Float64 sparse backend와 반올림 출력은 유지하며, 전체 상태 gate를 rounded 출력만으로
재계산한 gate PASS로 표현하지 않는다. 구현 검증은 아직 진행 중이다.
Whole-cell 인증은 outward interval coefficient bounds와
subdivision이며 estimate-only positive 검사와 abs(det J)를 허용하지 않는다.
Depth default10, 처리한 cell budget default65536이며 uncertain 시 fail-closed다. 이 값은
resource/precision tuning이고 accepted geometry의 positive 조건을 완화하는 tolerance가 아니다.
@@ -40,11 +44,14 @@ h²·da/L, h²·dA/L를 모두 확인한다. Residual/correction limit1e-10, upd
max iteration100이 default다. Update scale은 동일 단위의 uncancelled formula term 합이며 scale0은
exact-zero다. 빈 free vector는 vacuous convergence이며 required prescribed/recovery validation은 유지한다.
### 표현 가능한 변위에서의 내부 정제
### 이전 Float64 구현의 내부 정제 기록
검토된 별도 동적 구현 `f661864`는 위 판정을 유지하며 다음 정제를 사용한다.
관련76개 검사와 독립 코드 검토는 통과했지만 두 동적 원본은 세 번째 증분에서 실패했다.
이전 구현 `b394ae7`의 원본 실패와 변경 근거는 [lessons](lessons.md)에 기록한다.
아래는 이전 경로의 검토 기록이며 새 paired 경로의 실행 지침이 아니다.
새 경로는 [precision formulation](precision-formulation.md)의 전체 상태 Newton을 적용하고,
모든 원래 free 성분을 푼다. 이전 holding/history/ULP 탐색을 자동으로 이식하지 않는다.
물리 잔차가 통과한 좌표에서 sub-ULP 갱신 소실이 발생하면, 물리 잔차와 각 좌표의
fresh correction4개가 모두 통과한 좌표를 hold한다. 다음 반복부터 원래 effective tangent의
@@ -6,6 +6,17 @@
필수 원본/입력 계약 충돌은2026-10-09 사용자 선택 A로 해소했다. 구현 전 문서 blocker0이며
실제 solver 수치 PASS가 아니다.
## 2026-10-09 — 승인된 high+low의 한정된 검토
`hex8_t5_numerical_spec` reviewer가 [precision formulation](precision-formulation.md)과
실제 shared arithmetic·paired kernel·geometry를 독립 검토했다. Canonical zero와 scalar
−0 lifting의 두 결함은 수정했고 native fixture로 검증했다. 동일 상대변위 gradient의 chain
rule, isotropic material Hessian·geometric 항·Cauchy 복구와 full X+high+low interval은
일관된다. 산술의 실제 graph bound와 exact-dyadic 기대값을 별도로 검토했으며 native6/6
산술 검사 로그를 확인했다. 해당 범위 bounded PASS이며 새 actionable finding은 없다.
일반 correctly-rounded106-bit 보장이나 T6 전체 state/시간수렴/원본 PASS가 아니다.
T6 consumer·backend·worker 경계와 rollback은 해당 구현이 고정된 후 별도 검토한다.
## HEX8-NR-001 — 영 회전 경계와 필수 원본 충돌
검토 당시 PRD008/I/O는 BC/CLOAD DOF4–6을 값0이어도 거부했다. 그러나 모든 필수 INP에
@@ -0,0 +1,280 @@
# Hex8 동해석 high+low 정식화
적용: 사용자가 2026-10-09 선택 A로 승인한 [정밀도 제안](precision-proposal.md).
기본 물리식·DOF·부호·적분점 순서는 [formulation](formulation.md), 판정 원본은
[numeric-controls](numeric-controls.md), 영속 출력은 [I/O](io.md)다. 본 문서는
승인된 정밀도 변경의 구현 계약이며 구현 완료나 독립 수치 승인이 아니다.
기존 선형/비선형 정적·고유치의 Float64 경로를 변경하는 계약이 아니다.
## 산술과 고정 계수
내부 scalar \(z=(z_h,z_l)\)의 물리값은 실수 합 \(\widehat z=z_h+z_l\)다.
두 성분은 finite IEEE binary64이며, RN은 round-to-nearest, ties-to-even이다.
정규화는 error-free `TwoSum` 계열의 재분해로 같은 합을 보존하고
\(z_h=\operatorname{RN}(\widehat z)\)를 만족시킨다. 영은 유일한 \((+0,+0)\)으로
정규화한다. Nonoverlap 조건은 이 RN 식으로 정의하며 binade 경계에서 임의의
대칭 ULP 간격을 가정하지 않는다. 입력 binary64 \(c\)는 \((c,0)\)으로 올린다.
아래 식의 덧셈·곱셈·나눗셈·축약은 별도 표시가 없으면 전체 pair 연산이다.
연산의 목표는 전체 피연산자의 실수 연산값이며 실제 결과에는 pair 산술 반올림이 있다.
덧셈은 high/low 네 항과 취소 오차, 곱셈은 hh/hl/lh/ll 네 곱과 product error를
포함하고 정규화한다. 나눗셈은 nonzero 전체 분모로 계산하며 high quotient만을
반환하지 않는다. Quotient refinement의 잔차 \(x-yq\)에도 양쪽 low와 product
error가 참여한다. `TwoSum`/FMA product-error 및 고정 순서의 residual refinement는
가능한 구현이며 구체적인 storage/backend/vendor 타입은 지정하지 않는다.
이 표현은 IEEE binary128도, 모든 연산의 correctly-rounded 106-bit 보장도 아니다.
EFT 전제가 성립하는 normal 범위에서 연산 graph의 오차는 same-unit uncancelled operand
scale에 대해 binary64 단일 연산의 1차 오차를 회수한 2차 수준이어야 한다. 취소 후 작은
결과값만을 relative error 분모로 삼지 않는다. 구현별 graph의 roundoff bound를 독립 exact
dyadic/rational oracle와 대조한다. 최종 잔차가 작다는 사실로 산술 오차 bound를 대신하지
않는다. Subnormal에는 gradual underflow를 적용하고 EFT의 exact-error 보장이 깨지는
항은 실제 binary64 반올림 오차로 따로 포함한다. Exponent 범위를 확장하지 않으며 최소
양의 quantum은 \(2^{-1074}\)다. Underflow로 이 quantum보다 작은 결과가 반올림되는
것과 임의의 low/잔차 clamp를 구별한다. FTZ/DAZ 또는 재결합이 전제를 깨는 실행은 지원
산술의 증거가 아니다. 입력·중간·결과의 NaN/Inf, overflow, zero divisor와 정상화 실패는
candidate 실패다. 유한한 최종 실수값만으로 overflow한 중간 연산을 통과시키지 않는다.
Underflow로 소실된 비영 항을 exact-zero 평형이나 양의 형상 인증의 근거로 쓰지 않는다.
특히 high product가 정상/비영이라는 검사만으로 hl/lh/ll product와 FMA residual의
underflow가 배제되지는 않는다. 구현한 graph가 해당 소실의 오차를 보수적으로 추적해
zero/부호/gate를 보증하지 못하는 입력은 지원 산술 범위 실패다. 모든 EFT intermediate를
지원한다는 가정 없이 실제 지원 범위와 실패 경계를 독립 검사에 남긴다.
Exact-zero, 부호, abs, max, 비교와 동일 상태 판별은 정규화한 전체 pair를 사용한다.
비영 low를 지닌 값을 high만 읽어 zero로 판정하지 않는다. Pair 합산 순서는 기존 source,
element, local component 및 CSR 순서로 결정적으로 고정한다.
### 실제 primitive graph의 오차와 지원 경계
구현은 `src/fesa/math/high_low_arithmetic.h`이며 원시 두 성분 입력을 조용히 정상화하지
않는다. F64 scalar lifting의 ±0만 canonical(+0,+0)로 만든다. Native 실행에서 RN 및
MXCSR의 FTZ/DAZ 비활성을 검사하고, 지원하지 않는 환경을 자동 변경하지 않는다.
Add의 head/tail/middle/join `TwoSum`이 EFT인 지원 범위에서 최종 exact 합과의 차이는
`j=joined.low, m=middle.low, t=tail.low`, `z1=RN(j+m)`, `z2=RN(z1+t)`의 두 반올림뿐이다.
따라서 absolute bound는 `Badd=|z1-(j+m)|+|z2-(z1+t)|`다. Normal 합에 대해서는
`u(|j+m|+|z1+t|)`, `u=2^-53`으로 상계한다. Subnormal 덧셈은 quantum-grid에서 exact인
지원 사례를 별도로 검사한다. 취소된 최종 결과만으로 bound를 나누지 않는다.
TwoProduct는 각 비영 입력의 실제 least dyadic bit exponent 합이 −1074 이상인 경우만
지원한다. FMA residual까지 표현될 수 있는 보수적 범위이며 high product만 검사하지 않는다.
지원된 hh/hl/lh/ll 네 product는 exact pair이고 Multiply의 absolute bound는 이어지는
세 Add의 `Badd` 합이다. Overflow 또는 지원되지 않는 exact tail은 invalid로 전파한다.
Divide는 첫 quotient 후 두 번 full residual refinement를 사용한다. 각 step에서 현재 stored
pair의 실수값을 n,d,q라 하고 `rtilde=Subtract(n,Multiply(d,q))=(rh,rl)`,
`Br=Bmultiply(d,q)+Bsubtract(n,p)`, `c=RN(rh/dh)`로 둔다. `Bq`는 `Add(q,c)`의 bound,
`Bc`는 scalar quotient RN bound이면 새 quotient의 absolute error는
`Bq+Bc+(|rh*dl|+|rl*dh|)/(|dh|*|d|)+Br/|d|` 이하이다.
분모는 exact pair의 양의 절댓값 또는 `|dh|-|dl|`의 보수적 양의 lower bound를 사용한다.
Normal quotient의 `Bc=u*|rh/dh|`, 지원 subnormal의 exact rational rounding cell bound를
구별한다. 두 번째 step도 새 full residual을 다시 계산한다. Quotient가 비영 residual을0으로
소실하거나 중간 연산이 지원 범위를 벗어나면 실패한다. 이 bound는 universal correctly-rounded
106-bit 보장이 아니다. 독립 exact rational fixtures와 binary scaling으로 실제 graph를 검증한다.
최소 계수 정밀도 선택은 다음과 같다. 기존 reference cache의 F64 \(N_a,G_a,w_g\),
Lamé 상수와 좌표, 기존 조립 F64 consistent \(M\), 기존 load assembler가 endpoint에서
평가한 F64 \(F_n\)를 exact dyadic 입력으로 올린다. 형상/재료/질량 적분을 새로 정의하거나
높은 차수 quadrature로 바꾸지 않는다. 단, 아래 상대변위의 미분에 필요한 \(\widehat G_0\)와
dynamic paired linear operator는 동일 pair 산술로 구성한다. 기존 rounded K0를 paired
힘에 혼합하지 않는다. 일정 F64 \(\alpha,\beta,\gamma,h\)는 기존 생성값을 올리며
\(c=1+\alpha\), \(b=\beta h^2\)와 모든 파생 계수는 공통 pair 산술로 계산한다.
\(b>0,c>0\) 및 finite를 요구한다. 기존 coefficient 생성·검증과
`time=double(n)*h`, `N*h==T` 및 endpoint 하중 평가 의미는 유지한다.
## 같은 상대변위에서의 energy·force·Hessian
절점 index \(a=0,\ldots,7\), 성분 \(i=1,2,3\), node-major 24 DOF를 사용한다.
\(u,v\)의 단위는 length, length/time이고 \(a,A\)는 length/time²다.
기존 8개 reference point 각각에서
\[
d_a=u_a-u_0,\quad H=\sum_{a=1}^7d_a\otimes G_a,
\qquad \widehat G_a=G_a\ (a>0),\quad
\widehat G_0=-\sum_{a=1}^7G_a.
\]
모든 차·곱·합은 pair다. \(\delta H=\sum_{a=0}^7\delta u_a\otimes\widehat G_a\)가
**실제로 평가한 상대변위 식의 미분**이다. Force/tangent에 기존 \(G_0\)를 따로 사용하면
이 미분이 아니다. F64 cache를 exact dyadic로 보면 기존 \(\sum_aG_a=0\)은 반올림 때문에
exact일 필요가 없다. \(\widehat G_0\) 선택은 기존 상대변위 weak form의 일관된 수치 평가이며
잔차 projection이나 사후 힘 보정이 아니다. Pair 자체의 유한 반올림 오차는 남는다.
\(\widehat G_0\) 생성은 local node1부터7까지 고정 순서의 paired sum과 negate다.
수식의 실수 합과 그 pair 근사 오차를 구별하고, 임의 reduction 순서에서 저장된
\(\sum_a\widehat G_a\)가 exact0이라고 주장하지 않는다. Node0의 미분 오차도 이 graph의
산술 bound에 포함한다.
선형 동해석에서는 \(\epsilon=\operatorname{sym}H\),
\(\sigma=\lambda\operatorname{tr}\epsilon I+2\mu\epsilon\)이고
\[
U_{lin}=\sum_g[\tfrac12\lambda(\operatorname{tr}\epsilon)^2+
\mu\epsilon:\epsilon]w_g,
\quad f_{ai}=\sum_g\sigma_{iJ}\widehat G_{aJ}w_g,
\quad K_{lin}=\sum_g\widehat B_g^TC\widehat B_gw_g.
\]
\(\widehat B\)는 위 \(\widehat G\)로 만든 기존 engineering-shear B다.
비선형 동해석은 \(F=I+H\)이며 tiny strain의 불필요한 I 취소를 피하는 동등식
\[
E_G=\operatorname{sym}H+\tfrac12H^TH,\quad
S=\lambda\operatorname{tr}(E_G)I+2\mu E_G,\quad P=FS,
\]
\[
U=\sum_g[\tfrac12\lambda(\operatorname{tr}E_G)^2+\mu E_G:E_G]w_g,
\qquad f_{ai}=\sum_gP_{iJ}\widehat G_{aJ}w_g.
\]
\(H,E_G,S,P,F,U,f\)와 8점 recovery는 low를 보존한다. H를 만든 직후 F64로 축소하는
경로는 이 계약을 충족하지 않는다. \(\mathbb C\)는 기본 정식화의 같은 StVK tensor이며
\[
(K_{geo})_{ai,bk}=\sum_g\delta_{ik}\widehat G_{aJ}S_{LJ}
\widehat G_{bL}w_g,
\]
\[
(K_{mat})_{ai,bk}=\sum_g\widehat G_{aJ}F_{iI}\mathbb C_{IJLN}
F_{kN}\widehat G_{bL}w_g,
\qquad K_t=K_{mat}+K_{geo}.
\]
각 식은 동일 trial·동일 계수·동일 2×2×2 적분을 사용한다. 에너지의 실수 polynomial
미분을 pair 산술로 평가한 tangent이며 유한 반올림 함수의 미분을 주장하지 않는다.
Zero state의 paired \(K_t=K_{lin}\)이고 geometric 항은0이다. Paired \(K_{lin}\)은 기존
cached F64 K0와 coefficient-roundoff 수준에서 다를 수 있다. Byte identity나 별도
rounded K0와의 exact equality를 요구하지 않는다. 차이는 실제 측정하고 기본 linear
weak form·energy gradient·tangent 불변량으로 독립 검토한다. 대칭 강제 평균이나
잔차 floor로 이 검토를 대신하지 않는다. Strained tangent가 SPD라고 가정하지 않는다.
## 형상·질량 action·복구
현재 절점은 실수값 \(x_a=X_a+u_{ah}+u_{al}\)이다. Whole-cell 인증의 outward-rounded
interval은 세 항 전체를 포함한다. F64 `X+RN(u)`를 먼저 만든 뒤 singleton interval로
바꾸지 않는다. Interval \(I(X)+I(u_h)+I(u_l)\) 또는 exact-sum expansion의 보수적
enclosure를 사용하며 이후 determinant, Bernstein 변환·subdivision도 outward rounding한다.
양의 lower bound를 인증하지 못하면 기존 depth10/cell budget65536에서 uncertain failure다.
Low를 누락한 형상을 인증하거나 small low를 무조건 안전한 것으로 간주하지 않는다.
Point \(\det F>0\)도 full tensor에서 확인하며 유한성/부호가 불확실하면 accept하지 않는다.
비선형 Cauchy \(\sigma=FSF^T/\det F\), Green strain, 선형 Cauchy/infinitesimal strain은
pair로 복구한다. 8점 global tensor의 실제 shear `[11,22,33,12,13,23]`를 유지한다.
\(M\)은 기준 형상·밀도에서 한 번 조립한 **기존 F64 matrix 그 자체**이고 변형/시간에 따라
변하지 않는다. 모든 action \((Mz)_i=\sum_j(M_{ij},0)z_j\)는 full z와 pair product/reduction이다.
F64 \(M\)으로 먼저 rounded high action을 계산하고 low를 별도 residual 보정으로 넣지 않는다.
\[
T=\tfrac12v^TMv,\quad p=\sum_a(Mv)_a,\quad
L_O=\sum_ax_a\times(Mv)_a,\quad \dot L_O=\sum_ax_a\times(Ma)_a.
\]
Current position·momentum·reaction·work·energy balance까지 pair로 계산한다.
\(W_{ext,n+1}=W_{ext,n}+\tfrac12(F_n+F_{n+1})^T(u_{n+1}-u_n)\),
balance error는 기존 \(T+U-T_0-U_0-W_{ext}\)다. HHT numerical dissipation을 지우지 않는다.
선형 current moment의 \(\sum u_a\times f_a=O(u^2)\) 해석과 TL 객관성/기준-arm identity는
기본 정식화를 유지한다. F64 coefficient 오차와 pair 산술 오차를 독립 검사의 scale에서
구별하고, finite-rotation 결과를 exact0으로 보정하지 않는다.
## HHT 전체 state와 Newton
Accepted \(u_n,v_n,a_n,A_n,f_n,F_n,r_n,W_{ext,n}\), predictor 및 candidate는
low를 포함한다. 초기 \(u_0=v_0=0\), \(A_0=a_0\),
\(M_{ff}a_{0f}=F_f(0+)-f_f(0)\)다. 초기 backend 해도 lift한 뒤 full endpoint로 검증한다.
Constrained \(u,v,a,A\)는 항상 canonical exact0이다.
\[
u_p=u_n+hv_n+h^2(\tfrac12-\beta)A_n,\qquad
v_p=v_n+h(1-\gamma)A_n,
\]
\[
A_{n+1}=(u_{n+1}-u_p)/b,\quad
v_{n+1}=v_p+\gamma hA_{n+1},\quad
a_{n+1}=(A_{n+1}+\alpha a_n)/c.
\]
Candidate의 rates·element response·mass actions·recovery는 이 동일 전체 상태에서 평가한다.
Physical residual은 \(r=Ma+f-F\), reaction은 constrained projection, free reaction은 exact0이다.
다음 두 weighted 표현을 별도로 계산한다.
\[
R=MA_{n+1}+c(f_{n+1}-F_{n+1})-\alpha(f_n-F_n),
\qquad R_{eq}=c r_{n+1}-\alpha r_n,
\]
\[
R-R_{eq}=M d_A,\quad d_A=A_{n+1}-c a_{n+1}+\alpha a_n,
\qquad K_{eff}=M/b+cK_t.
\]
마지막 식은 rates의 roundoff defect를 드러낸 항등식이다. Accepted old residual을0으로
대체하지 않는다. \(R_{eq}\)를 RHS로 쓰는 경우에도 원래 weighted 식과의 일치 gate를
통과해야 하고 tangent는 같은 weighted 표현의 \(K_{eff}\)다.
Endpoint residual만 사용하면 그 Jacobian은 \(K_{eff}/c\)이며 서로 혼용하지 않는다.
Backend에는 최종 조립한 paired \(K_{eff}\)와 RHS를 RN64로 전달하고 F64 보정량을 pair로
올려 \(u\leftarrow u+\delta u\)에 누적한다. High-only 상태에서 tangent를 재계산하지 않는다.
이 backend solve는 원래 tangent의 rounded approximation이며 full residual/physical gate를
대체하지 않는다. Directional tangent 검사는 paired analytic derivative와 rounded backend
matrix의 coefficient-rounding 차이를 따로 평가한다. Backend/nonfinite 실패는 rollback한다.
Physical criterion은 **모든 원래 free 성분**의
\(S_i=|(Ma)_i|+|f_i|+|F_i|\), \(\max_i|r_i|/S_i\le10^{-10}\)다.
\(S_i=0\)이면 \(r_i=0\)을 exact로 요구한다. Norm·분모·gate도 full pair다.
Weighted identity scale은 기존 uncancelled 정의를 그대로 pair로 평가한다.
즉 각 row의 \(\sum_j[|M_{ij}A_j|+c|M_{ij}a_j|+|\alpha M_{ij}a_{n,j}|+
|M_{ij}d_{A,j}|]\), \(c(|f_i|+|F_i|)+|\alpha|(|f_{n,i}|+|F_{n,i}|)\),
\(c|r_i|+|\alpha r_{n,i}|\)의 합이다. \(|R-R_{eq}|/scale\le10^{-12}\),
zero scale은 exact-zero branch이며 finite 검사를 먼저 수행한다.
Fresh correction의 네 channel은
\(\delta A=\delta u/b\), \(\delta v=\gamma h\delta A\),
\(\delta a=\delta A/c\)에서 각각
\(\|\delta u\|_\infty/L,h\|\delta v\|_\infty/L,
h^2\|\delta a\|_\infty/L,h^2\|\delta A\|_\infty/L\le10^{-10}\)다.
동일 full \(\delta u\)와 공통 계수를 쓰며 새 dummy channel은 없다.
Update gate는 위 u/v/A 등식의 좌변과 전개된 각 우변 항의 same-unit abs 합을 scale로
사용해 defect/scale \(\le10^{-12}\), scale0은 exact-zero다. Increment당100회 제한,
고정 h와 기존 schedule, 빈 free의 vacuous convergence를 유지한다.
이미 존재하는 hold/revisit 제어를 사용한다면 final gate는 모든 원래 free 성분을 검사하고
동일 상태 판별에 전체 u pair와 mask를 포함한다. Carry·holding으로 physics state의 low를
대체하지 않는다.
## Commit·observable·검증의 의미
Accepted/trial 복사는 모든 high/low와 이전 residual·누적 work를 보존한다. Geometry,
recovery, finite, update/weighted identity, physical/correction gate가 모두 통과한 candidate만
commit한다. 실패는 accepted state·predictor 원본·reference cache·기존 최종 파일을 보존한다.
다음 증분은 published F64 배열 대신 accepted 전체 pair를 사용한다. Restart는 지원하지 않는다.
각 공개 F64 값은 \(\operatorname{RN}(z_h+z_l)\)이며 high만 저장한다는 가정 대신 올바른
최종 반올림을 검증한다. Schema·shape·source identity는 기존 계약을 유지한다.
Recovery를 rounded u에서 재계산해 published full-recovery observable을 바꾸지 않는다.
내부 gate PASS는 published F64 u/v/a를 재입력해 같은 gate를 통과했다는 주장과 다르다.
Self-check는 schema/identity/finite 및 내부 물리량의 올바른 RN64 serialization을 확인한다.
로그는 내부 high+low 산술과 적용 gate를 명시한다. 출력 overflow/nonfinite는 실패다.
검증은 다음 반증 가능한 사례를 포함한다. 실행/통과 기록은 이 문서의 범위가 아니다.
- Exact dyadic/rational oracle: \(x=(1,2^{-60})\), \(y=(1,-2^{-60})\)에서
\(x-y=2^{-59}\), \(x\,2^{60}-2^{60}=1\), binary-power division·normalization,
cancellation·binade/tie·subnormal·overflow/zero-divisor를 검사한다. High collapse 대조는
앞 두 항등식에서 실패해야 한다. 일반 곱/비이진 나눗셈은 실제 graph 오차 bound로 검사한다.
- 작은 brick 및 coupled 두 Hex8: 공통 high 병진과 \(2^{-60}\) 규모의 비균일 low field로
nonzero H/E/f/U와 이웃 element/global row 전달을 확인한다. 에너지 차분·signed directional
tangent의 step sweep(기준 node0의 독립 perturbation 포함), paired linear–NL zero-state 일치,
rigid translation/rotation·covariance와
기존 잠김/warped quadrature 한계를 검사한다. High-only 대조가 같은 물리장을 만들지 못하는
유의한 force/energy scale을 선택한다.
- Coupled consistent M에 low velocity/acceleration을 주어 off-diagonal inertia·T·momentum 및
current moment를 검사한다. 비영 old \(r_n\)의 weighted 항등식·네 correction·세 update 식과
full-state oracle를 대조한다. \(-\alpha r_n\)를 생략하는 대조는 실패해야 한다.
- Exact oracle로 \(X+u_h+u_l\)의 interval 포함을 확인하고 low가 현재 면 간격을 만드는
작은 형상 사례를 포함한다. Positive/invalid/uncertain 구분 및 low 누락의 false certificate를
검사한다. 불확실한 형상을 interval 대신 estimate로 승인하지 않는다.
- Accepted low가 다음 predictor/rates에 참여하는 copy/commit 사례, 실패 trial의 rollback,
rounded output/readback 및 geometry/backend/output 실패 보존을 검사한다. 기존 시간수렴,
에너지·운동량·반력·외부 원본 기준도 유지한다.
미해결 evidence는 구현한 primitive graph의 normal/subnormal 오차 bound와 지원 범위의
독립 검토, paired coefficient 차이의 실제 측정, 위 불변량 및 원본 endpoint 검증이다.
추가 physics/acceptance 선택은 이 문서에서 만들지 않는다. 산술 bound나 작은 coupled 사례가
충족되지 않으면 tolerance를 바꾸거나 더 높은 정밀도를 자동 채택하지 않고 근거를 반환한다.
@@ -1,7 +1,8 @@
# Hex8 동해석 내부 정밀도 변경 제안 — 미채택
# Hex8 동해석 내부 정밀도 변경안 — 승인됨
이 문서는 사용자 검토용 제안이다. 현재 [PRD](PRD.md)·[정식화](formulation.md)·
[numeric controls](numeric-controls.md)의 승인 계약을 변경하거나 구현 완료를 뜻하지 않는다.
2026-10-09 사용자가 A를 선택해 내부 high+low 물리 상태와 Float64 출력의 반올림 의미를
승인했다. 이 문서는 [PRD](PRD.md)·[정식화](formulation.md)·
[numeric controls](numeric-controls.md)의 변경 근거이며, 구현 완료를 뜻하지 않는다.
실패 근거와 검증 범위는 [lessons](lessons.md)에 기록한다.
## 변경이 필요한 이유
@@ -13,7 +14,7 @@
갱신 중 사라진 덧셈을 다음 반복에 누적하는 carry와, 실제 변위를 high+low로 표현하는
물리 상태는 다르다. Carry 실험의 kernel·rates·형상은 rounded high만 사용한다.
아래 제안은 low도 물리 계산에 사용하는 별도 정밀도 계약이며, 원본 수렴을 보장하지 않는다.
아래 승인안은 low도 물리 계산에 사용하는 별도 정밀도 계약이며, 원본 수렴을 보장하지 않는다.
## 제안하는 계산과 결과의 의미
@@ -37,8 +38,8 @@
검증하고, 로그에 사용한 내부 산술을 명시한다. Restart는 계속 지원하지 않는다.
Float64 직렬화의 overflow·비유한 값은 실패로 처리하며 기존 최종 파일을 보존한다.
현재 accepted state와 published Float64 state를 동일 계산 입력으로 취급하는 의미가
달라지므로, 위 결과 의미와 내부 정밀도 변경을 함께 승인해야 한다.
승인한 변경에서는 accepted state가 high+low 전체 물리 상태이며, published Float64 state는
그 반올림 observable이다. 같은 계산 입력이라는 이전 의미를 적용하지 않는다.
## 구현 전에 고정할 검증