106 lines
8.1 KiB
Markdown
106 lines
8.1 KiB
Markdown
# Hex8 계산 정밀도와 검증에서 확인한 점
|
|
|
|
현재 완료 여부는 [PRD](PRD.md)의 checklist가 소유한다. 아래 기록은
|
|
[정식화](formulation.md)와 [수치 기준](numeric-controls.md)을 바꾸지 않고
|
|
계산 정밀도를 개선한 근거다. 내부 검사 통과와 원본 동적 모델의 수렴은 구분한다.
|
|
|
|
## 작은 변형률에서 단위행렬을 빼지 않는다
|
|
|
|
`E=(F^T F-I)/2`를 그대로 계산하면 작은 변형률에서 유효 숫자를 잃는다.
|
|
`H=grad(u)`로부터 `E=sym(H)+H^T H/2`를 계산하면 같은 Green 변형률을
|
|
단위행렬 차감 없이 구한다. StVK 재료식, 에너지, Cauchy 응력과 접선은 유지한다.
|
|
|
|
탄성계수 `2.1e11`, Poisson 비 `0.3`인 직육면체의 signed affine stretch
|
|
`±1e-10`, `±1e-8`에서 독립 응력·에너지·면 traction 적분으로 기존 오류를
|
|
재현했다. 수정 `7d191036`은 요소 검사 27개와 독립 수치 검토를 통과했다.
|
|
비선형 동적 원본의 첫 증분 잔차 비율은 약 `1.42e-5`에서 `6.02e-10`으로
|
|
줄었지만, 승인된 `1e-10` 기준은 여전히 충족하지 못했다.
|
|
|
|
## 곱셈, 합산, 변위 차감의 오차를 각각 보존한다
|
|
|
|
강체 병진을 제거한 상대변위로 내력을 계산해도 큰 항들이 상쇄되는 행에서는
|
|
계산 순서의 영향이 남는다. 원본 선형 동적 사례의 두 요소 행에서 local 곱의
|
|
절댓값 합은 각각 약 `3.63e6`이었고, FMA 곱셈 잔여와 보상 합산으로 복구한
|
|
내력 차이의 합은 `8.20e-10`이었다. 당시 전체 잔차 `9.06e-10`과 같은 크기였다.
|
|
|
|
수정 `c50e68e`는 캐시된 K0를 그대로 두고 상대변위와의 곱셈·합산을 보상한다.
|
|
수정 `8153796`은 절점 변위 기울기 및 비선형 `sum(w*P*G)`에도 같은 보상을
|
|
적용한다. 각각 관련 검사 60개와 독립 수치 검토를 통과했으나 동적 원본은 실패했다.
|
|
기울기·내력·에너지·접선은 같은 trial의 물리식을 사용한다.
|
|
|
|
작은 절점 변위의 갱신은 입력 double에서 표현 가능해도, 더 큰 기준 절점 변위를
|
|
뺀 상대변위에서는 소실될 수 있다. 수정 `8ccd1b2`는 TwoDiff로 차감의 잔여를
|
|
보존하고, 상대변위의 두 부분을 내력·기울기·선형 에너지 계산에 함께 사용한다.
|
|
독립 정확 유리수 검산의 유한 차이 125,039쌍에서 불일치가 없었고, 관련 native
|
|
검사 60개와 독립 수치 검토도 통과했다. 이 검산은 native solver 검증을 대체하지
|
|
않으며, 입력 자체의 반올림으로 잃은 값을 복원한다는 의미도 아니다.
|
|
|
|
## 수렴 정체와 허용치 변경을 구분한다
|
|
|
|
위 수정 후 선형 동적 원본은 첫 증분을 5회 solve, 잔차 비율 `9.54e-11`로
|
|
수용했다. 두 번째 증분은 100회에서 `1.01993e-10`으로 실패했다. 실패 좌표의
|
|
직전 적용 보정량은 약 `-0.496 ULP`여서 저장된 변위를 바꾸지 못했다.
|
|
100회 종료 지점에서는 다음 solve를 하지 않으므로 이 값으로 다음 Newton 갱신을 추론하지 않는다.
|
|
비선형 원본도 첫 증분에서 약 `1.35e-10`으로 실패했다.
|
|
|
|
이는 전체 원본 검증 완료의 근거가 아니다. 물리 잔차의 component별 원래 Si,
|
|
correction, update 및 max100 기준을 유지하면서 표현 가능한 변위에서 추가
|
|
정제가 가능한지 확인해야 한다. 예측 잔차는 trial 선택에만 사용할 수 있고,
|
|
수용은 실제 rates·형상·내력·복구·모든 free 성분의 원래 판정으로 수행해야 한다.
|
|
원본·허용치를 보정하거나 실패한 candidate를 accepted history에 넣지 않는다.
|
|
|
|
## 잔차 점수만으로 Newton 갱신의 정체를 판단하지 않는다
|
|
|
|
각 trial의 `abs(r_i)/Si`는 최종 수렴 판정에 사용하지만, 그 최대값이 증가했다고
|
|
갱신이 정체된 것은 아니다. 작은 강체 운동 사례에서 한 성분의 잔차는 약
|
|
`9.88e-24`에서 `3.17e-25`로 줄었으나 Si가 더 빠르게 줄어 비율은 증가했다.
|
|
이 갱신을 한 좌표의 ULP 정제로 대체한 구현은 기존 축·하중 크기 회귀에서 실패했다.
|
|
현재 failing 성분의 Si를 고정한 별도 점수도 다른 축의 유효한 갱신을 가로막았다.
|
|
|
|
완전한 변위가 반복되더라도 다음 반복의 정제 대상 자유도가 바뀌면 계산은 더
|
|
진행될 수 있다. 따라서 정체의 근거에는 실제 변위와 정제 대상의 변화가 모두
|
|
필요하며, 잔차 점수의 왕복만으로 전체 상태의 반복을 추론하지 않는다.
|
|
최종 수용에서는 여전히 실제 모든 free 성분의 원래 Si와 수렴 기준을 검사한다.
|
|
변위와 직전 solve mask만 비교한 수정 `1063abc`는 관련74개 검사를 통과했지만
|
|
두 동적 원본은 세 번째 증분100회에서 실패했다. 선형 잔차 비율은 `2.10874e-8`,
|
|
비선형은 `9.99819e-8`이었다. 이 실패 행의 전체 내력 보상 합산 차이는0이고,
|
|
관성력 보상 차이는 약 `1e-17`이므로 해당 실패를 합산 오차만으로 설명하지 못한다.
|
|
|
|
동일 구현에 동작을 바꾸지 않는 계측을 추가하고 실제 반복 상태를 저장했다.
|
|
선형은 다음 반복14의 상태가 진입11과, 비선형은20이18과 정확히 같았다.
|
|
전체 변위1326개·진입 시 holding mask1275개·incoming correction metric4개의
|
|
유한 값이 모두 일치했고 그 구간의 실제 ULP 이동은0건이었다. 기존 두 상태
|
|
판별은 false였으며 prospective physical gate도 FAIL이었다. 독립 검토가 계측과
|
|
원시 배열을 대조했고, 독립 Python 검산은 exit0이었다. 진단 실행 두 건은 각각
|
|
native exit1로 자연 종료했으며 원본 solver PASS의 증거가 아니다.
|
|
|
|
고정 증분에서 이전 accepted state·M·하중·predictor가 고정되고 fresh solve와
|
|
탄성 local recovery가 결정적일 때, 재현되는 반복 상태는 전체 변위·reactivation 전
|
|
holding mask·incoming correction4개다. 다음 상태는 실제 fresh Newton 변위·freeze 후
|
|
mask·fresh correction4개로 비교해야 한다. History는 증분 시작과 실제 ULP 적용 후
|
|
초기화하고, physical FAIL 및 finite correction PASS 진입만 보관한다. Prospective
|
|
physical PASS는 정상 Newton 경로를 유지한다. 이 한정된 판별 수정 `b394ae7`은 관련75개
|
|
검사와 독립 코드 검토를 통과했다. 7개 판별 조건을 각각 제거한 behavior mutation도
|
|
native build0/CTest8로 실패를 검출했다. 기존 수렴 기준·100회 제한·최종 수용은 유지한다.
|
|
|
|
동일 immutable binary의 두 원본 실행은 여전히 세 번째 증분100회에서 native exit1로
|
|
실패했다. 선형은419.360초, 잔차 비율 `7.21125e-9`, 비선형은431.045초,
|
|
`1.27770e-8`이었다. 선형95번째 반복의 ULP 이동은 실제 점수를 `7.21125e-9`에서
|
|
`4.66385e-9`로 낮췄으나 뒤의 정상 Newton 갱신에서 다시 증가했다. 이는 각 정제의
|
|
국소 감소가 전체 갱신 과정의 진전을 보장하지 않는다는 증거이며, 전체 변위가 같은
|
|
상태로 복귀했다는 증거는 아니다. 비선형의 잔차 점수 왕복도 전체 상태 반복의 증거가 아니다.
|
|
|
|
Incoming correction4개의 실제 수치는 정상 Newton의 rates·tangent·rhs에 사용하지 않으며,
|
|
유한 값과 PASS 여부가 수용에 쓰인다. 숫자까지 같은 조건은 더 보수적이지만 이것이
|
|
이번 원본 실패의 원인이라고 확정하지 않는다. 동일 순수 Newton 구간의 실제 전체 변위·
|
|
mask 일치와 correction 숫자 차이, 또는 ULP를 포함한 전체 상태의 재현을 별도 계측으로
|
|
확인해야 한다. 새로운 점수 heuristic이나 허용치 변경으로 이 증거를 대신하지 않는다.
|
|
|
|
재현 가능한 원시 tuple 검산과 SHA256은 로컬 evidence
|
|
`.harness/hex8-evidence/t6-independent-tuple/check-v3.py` 및 `v3-check-result.json`에
|
|
보존했다. 원시 진단과 native 실패 로그는 별도 구현의
|
|
`.harness/build-ninja-msvc-debug/hex8-evidence/t6/tuple-trace3/`에 있다.
|
|
|
|
명령·native exit·실패 로그는 해당 source와 함께 보존한다. 최종 통합 및 외부 비교
|
|
결과는 이후 verification 기록에서 이 개발 중 실패와 구분한다.
|