Files
FESADev/docs/hex8-structural-analysis/lessons.md
T

25 KiB

Hex8 계산 정밀도와 검증에서 확인한 점

현재 완료 여부는 PRD의 checklist가 소유한다. 아래 기록은 정식화와 수치 기준을 바꾸지 않고 계산 정밀도를 개선한 근거다. 내부 검사 통과와 원본 동적 모델의 수렴은 구분한다.

작은 변형률에서 단위행렬을 빼지 않는다

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 여부가 수용에 쓰인다. 추가 계측에서 선형 진입20→다음23, 비선형72→80은 각각 같은 순수 Newton 구간의 전체1326개 변위·1275개 mask가 정확히 같았으나 correction 숫자4개는 달랐다. 모두 finite/PASS이고 prospective physical FAIL이었으며 기존 판별은 false였다. 선형 진입23→다음30은 실제 ULP 이동을 사이에 두고 변위·mask·correction 숫자까지 같았지만 history 초기화로 판별하지 못해 정상 Newton이 적용되는 경로였다. 독립 검토와 원시 배열 Python 검산 exit0으로 두 조건의 영향을 확인했다. 비선형에서 ULP를 사이에 둔 복귀는 입증하지 않았으며 전체 혼합 알고리즘의 주기 반복도 주장하지 않는다.

수정 f661864는 고정 증분 전체의 적격 실패 진입을 유지하고, 실제 변위·mask와 각각의 finite correction PASS로 동등성을 판별한다. Correction 숫자의 차이는 진단으로 유지한다. 관련76개 검사는 native build/CTest0이며 독립 검토를 통과했다. 실제 Hex8 사례의 history 초기화 재삽입은 두 번째 증분100회 실패를 만들었다. 숫자 일치 재삽입은 두 helper 검사의 assertion 실패를 만들었다. 올바른 원본을 복원하고 실제 object를 재컴파일한 뒤 최종 회귀를 수행했다. 이 재현은 질량이 지배적인 작은 문제의 제어흐름 검사이며 원본 conditioning 해결의 증거가 아니다. 원래 gates·100회 제한은 유지한다.

동일 immutable binary의 원본101개 endpoint 검사 두 건은 다시 세 번째 증분100회에서 native exit1로 자연 종료했다. 선형408.202초의 잔차 비율은 1.7773871030665027e-8, 비선형416.052초는 8.7357210799572219e-9다. 최신 실패 행의 전체 내력 보상 합산 차이는 0이고 관성력 차이는 약 1e-17이다. 최종 다섯 반복에서 전체 변위와 mask는 계속 바뀌므로 잔차 점수만으로 정확한 전체 상태 반복을 추론하지 않는다. 새 판별의 내부 검증과 실제 원본 수렴은 구분해야 하며, 원본 conditioning·local 계산 또는 결합 좌표의 표현 가능성을 더 분석해야 한다. 실패한 state를 통합 완료나 reference PASS로 표시하지 않는다.

추가 원시 proof와 검산은 로컬 .harness/hex8-evidence/t6-independent-semantic/에, 수정·mutation·최종 회귀 로그는 별도 구현의 .harness/build-ninja-msvc-debug/hex8-evidence/t6/에 보존한다. 선형 진단은 닫힌 proof 검토 후 명시적으로 중단했고 비선형 진단은 native exit1로 자연 종료했다. 둘 다 solver PASS가 아니다.

재현 가능한 원시 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 기록에서 이 개발 중 실패와 구분한다.

고정한 실패 상태에서 산술 오차와 갱신 소실을 구분한다

f661864의 terminal 상태를 관찰하는 별도 실행은 원래 계산식을 그대로 두고 각300개 reference cache·native response와 전체 state/M/Kt를 저장했다. 두 실행은 native exit1로 자연 종료했으며 원래 출력한 수치 trace와 일치했다. 계측은 byte 단위로 복원하고 재빌드했다. 원래 실행은 full terminal 변위를 저장하지 않았으므로 두 실행의 전체 변위 일치를 주장하지 않는다. 수집한 local 변위/scatter·전역 내력·Ma/MA·r/Si는 모두 정확히 재조립됐고, 독립 Fraction 검산 두 건은 Python exit0이며 다른 검토자가 원시 계수로 재계산했다.

이 검산은 관찰한 binary64 계수를 고정한 정확한 다항식 계산이다. 이상적인 geometry나 원본 solver 동등성, 표현 가능한 해의 존재/부재를 증명하지 않는다. 선형 cached K dot의 실행 오차는 +5.82e-13으로 해당 행의 허용 잔차 1.49e-11보다 작았다. Cached G로 operator를 다시 구성하면 내력이 -3.78e-10 달라지지만 잔차는 여전히 2.27e-9다. 비선형의 고정밀 내력은 +5.52e-11 달라져 잔차를 4.11e-10에서 4.66e-10으로 키웠다. H의 high/low collapse 오차는 존재하지만 이 실패를 산술 정밀도만으로 해결할 근거는 없다. Operator 형성 차이와 runtime dot 오차를 혼동해 force만 교체하지 않는다.

저장한 PRE holding mask를 현재 물리 기준으로 reactivate한 뒤, 같은 순서의 rounded Keff와 old residual을 포함한 weighted RHS를 별도 SuperLU로 풀었다. 정확한 방정식 잔차 비율은 두 건 모두 약 2e-16이다. 선형102개 active 보정은 모두 저장된 변위를 바꾸지 못했고, 비선형81개에서는9개 변위가 바뀌고 실패 좌표71개 보정이 소실됐다. 이는 독립 backsolve의 관측이며 production PARDISO의 현재 fresh 방향이나 actual trial PASS가 아니다. 직전 적용 보정량과 이번 fresh 방향을 구분해야 한다.

Weighted R=0의 physical target은 alpha*r_old/(1+alpha)다. 비선형 실패 행에서 이 값의 크기 2.60e-11은 현재 허용 잔차 4.70e-12보다 크다. 현재 최종 조건은 weighted R=0을 요구하지 않으므로 이것만으로 계약 충돌이나 수치적 불가능성을 선언하지 않는다. Old residual을 버리거나 물리 가속도를 다른 정의로 바꾸는 근거도 아니다. 다음 후보는 실제 native rates·geometry·모든 원래 Si·update·weighted identity로 검증해야 한다.

같은 고정 상태의 native replay는 실제 Hex8 kernel·rates·하중과 저장 CSR을 사용했다. 먼저17자리 십진 문자열로 저장한 값을 Float64로 복원하고, 재계산한 전체 변위·속도· 두 가속도 배열 및 predictor·하중·내력·관성력·r/Si·최대 점수가 저장 값과 정확히 일치하는지 확인했다. 저장 CSR의 재생이며 독립적인 M/Kt 재조립 검증은 아니다. RF는 저장되지 않았으므로 constrained residual/free0의 파생 identity만 확인했다. TEMP 검사는 원래 파일과 byte 단위로 복원하고 실제 object를 재컴파일했다.

Native PARDISO의 현재 fresh solve도 선형102개 보정이 모두 변위를 바꾸지 못했다. 비선형은81개 active 좌표에서9개 변위가 바뀌고71개 실패 좌표의 보정이 소실됐으며, 최대 잔차 비율은 8.73572e-9에서 1.27770e-8로 커졌다. 정확 산술로 예측한 상위8개 단일 ULP 후보를 각각 실제 계산한 최선 비율은 선형 4.75888e-9, 비선형 6.73857e-9다. 두 fresh Newton 및16개 ULP trial 모두 원래 physical limit 1e-10에 실패했다. 다른 update·weighted identity·correction·geometry 검사는 통과했다. Native exit0인 두 replay 검사는 관측 재현 검사의 성공이며 원본 수렴이나 accepted history의 성공이 아니다. 단일 이웃의 실패만으로 여러 좌표를 함께 움직이는 해의 부재를 추론하지 않는다.

기존에 실제 평가한 최선 단일 이웃에서 Newton/history 없이 단일 ULP 정제를 이어가는 별도 관찰은 최대100회 추가 이동으로 제한했다. 먼저4회·24회 관찰과 겹치는 전체 trial 배열을 정확히 재현했다. 선형은77회 개선 후 5.25815e-10에서 남은 예측 개선3개가 실제로는 모두 같은 최대값을 만들었다. 비선형은38회 개선 후 9.85274e-10에서 남은 예측 개선1개가 실제 최대값을 키워 거절됐다. 두 경우 모두 physical FAIL이며 다른 gates는 PASS다. 마지막 cursor에서 각각2547개·2549개 실제 단일 방향은 검사하지 않았으므로 모든 단일 이웃의 정체를 증명하지 않는다. 진단의100회 이동과 production의100회 Newton solve는 다른 수량이다. 이 관찰은 accepted frame·다음 fresh solve·전체101개 endpoint의 검증도 아니다.

최대 비율이 줄어도 실패한 행 수는 늘 수 있다. 마지막 실패 행 수는 선형162개, 비선형132개였다. 최대값의 엄격한 감소만으로 모든 행의 최종 평형을 보장하지 않는다. 두 정체 상태에서 모든 원래 free 좌표의 ±1 ULP를 정수 변수로 둔 별도 minimax 예측은 각20초 후 timeout이었다. 관찰 script의 Python exit0과 최적화 종료 상태를 구분한다. 반환 후보의 정확 산술 잔차 비율은 2.84e-8·5.62e-8로 현재 상태보다 컸다. 검증된 zero-change 후보가 주는 목적값 상한을 추가한 각각20초의 후속 예측도 timeout이며 정수 후보를 얻지 못했다. 상한은 기존 rounded surrogate 최적해를 보존하지만 solver에 초기 후보를 전달하는 warm start는 아니다. 이 결과를 native 후보 통과나 표현 가능한 해의 부재로 해석하지 않는다. 최적화 도구는 로컬 진단에서만 사용했고 production은 변경하지 않았다.

두 좌표를 함께 ±1 ULP 이동하는 별도 예측은 마지막 단일 정제 상태에서 시작했다. 최대 잔차 행의 M 또는 Kt 구조적 support에 적어도 한 좌표가 연결되는 조합을 검사했다. 선형313236개·비선형210588개의 Float64 affine 예측을 완료했고, 상위8개씩은 고정 계수의 정확 산술로 Ma·내력·새 Si를 다시 계산했다. 이 support 제한은 affine 예측에 대한 것이며 실제 비선형/반올림 계산의 모든 두 좌표 이웃을 포함한다는 뜻은 아니다. 최선 예측은 각각 5.23348e-10·9.75010e-10으로 현재 최대값보다 작지만 여전히 원래 기준 1e-10을 초과했다.

이16개 후보를 각각 같은 변경하지 않은 cursor에서 실제 kernel·rates로 평가했다. 선형8개는 최대값 5.25815e-10이 그대로였고, 비선형은 모두 현재 9.85274e-10보다 커졌다. 모든 후보의 실제 변위 변경은 서로 다른 원래 free 두 좌표의 한 ULP로 확인됐으며 physical FAIL, 다른 gates PASS였다. 전체 배열·r/Si·원시64개 artifact의 SHA를 별도 검산한 Python exit는0이다. 두 native 관측 검사의 exit0은 평가와 재현의 성공이며 후보 개선이나 원본 동해석 수렴의 성공이 아니다. Cursor는 이동하지 않았고 다음 fresh solve·accepted history는 실행하지 않았다. 예측 개선을 실제 개선으로 대체하거나 이16개 실패로 모든 표현 가능한 해의 부재를 주장하지 않는다.

Increment-local 보상 가산은 물리 상태를 단일 Float64 변위로 유지하면서 덧셈의 소실량만 다음 Newton 갱신에 누적하는 별도 관찰이었다. 같은 최선 cursor에서 plain/carry 각각 12회씩, 선형·비선형 총48회 fresh solve를 수행했다. 두 경로 모두 원래1275개 free 방정식 전체를 풀고 실제 current Kt를 재조립했으며 old residual과 모든 기존 gates를 유지했다. Production의 principal refinement·history·ULP 탐색은 이 비교에 포함하지 않았다.

첫 Kt/Keff/RHS·fresh 방향·전체 물리 배열은 두 경로에서 정확히 같았다. 이후 carry는 실제로 다른 변위 경로를 만들었지만 모든48개 physical 판정은 FAIL이었다. 최종 비율은 선형 plain/carry 3.14971e-8/3.14508e-8, 비선형 4.43049e-8/1.54565e-7로, 둘 다 시작 cursor보다 컸다. 다른 gates는 모두 통과했다. Native exit0의 두 관측 검사는 수렴 성공이 아니며, 독립 Python 검산 exit0은 원시201개 SHA·carry 산술·연산/경로·r/Si와 게이트를 검증한 것이다. TEMP source는 실행 전 복원하고 실제 object를 재컴파일했다. 이 결과는 production carry 도입이나 반복 횟수 확대를 뒷받침하지 않는다.

이 진단 종료 시점에는 low를 물리 변위로 사용하는 변경안을 채택하지 않았다. 이후 사용자가 2026-10-09 선택 A로 내부 정밀도 변경안을 승인했다. 단순 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개와 새 검사17개의 최종 묶음44/44가 통과했고, 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를 적용했다.

큰 반복 비용을 줄이기 위해 선형 Hessian은 같은 paired zero-state graph의 결과를 immutable cache로 보관한다. Cache 생성 실패는 기존 Float64 Create 지원을 거부하지 않는다. 변형·실패 trial 후에도 high/low Hessian은 같고 힘·에너지·복구와 비선형 접선은 같은 전체 trial에서 계산한다. 독립 reviewer가 이 캐시와 native44/44의 원시 로그도 확인했다.

독립 numerical reviewer는 실제 shared arithmetic·kernel·geometry의 한정된 범위를 PASS로 판정했다. 재현 로그는 .harness/hex8-evidence/precision/에 보존한다. 이 결과는 동적 전체 상태·시간수렴·원본 endpoint·공식 출력의 완료를 뜻하지 않는다. 현재 checklist는 미완료다.

전체 상태의 제한적 원본 관측과 연결

전체 high+low T6 c49cae4는 원래 시간 간격·INC를 바꾸지 않고 두 원본의 초기 상태와 증분1–3을 accept했다. Test-only typed stop으로 다음 증분 전에 종료해 prefix 상태를 관측했으며 native0·2/2를 전체 원본 완료로 보고하지 않는다. 메인이 전체 pair·full M/Mff, 모든1275 free r/Si·zero branch·HHT update·weighted old-r·실제 solve 보정을 exact Fraction으로 검산했다. 물리 비율 최대값은 선형3.12680e-20, 비선형1.3043731e-16이다.

Root 연결의 related49/49와 두 brick의 LIN/TL 전체 low 직렬/TBB 일치1/1은 native0이다. 최초 broad filter가 긴 전체 원본 smoke를 함께 선택한 실행은 의도적으로 중단했고 CTest exit−1로 보존했다. 완료하지 않은 실행을 수렴 실패로 해석하거나 현재 PASS에 합산하지 않는다. 공식 출력·101 endpoint·원본 비교·전체 회귀는 후속 검증이다.

점 수와 체적 정식화를 구분하기

실제 두 정적 원본은 CLI/schema 성공 뒤 U/RF/Gauss S가 모두 외부 기준에 실패했다. Source identity와 point mapping을 확인하고 독립 표준 full8 조립/solve·회복을 대조한 결과 현재 구현은 승인된 수식과 일치했다. 같은8점이라는 이유로 Abaqus C3D8의 체적 처리까지 같다고 가정하면 차이를 입력 오류나 rounding으로 잘못 분류할 수 있다. 전체 요소의 원본 변위·응력을 사용한 hydro/dev 분리와 reference-volume 평균의 별도 energy/Hessian 후보가 차이를 설명하는 근거다. Stress만 평균화하거나 tolerance를 늘리는 수정은 energy/force/tangent 계약을 깨거나 실제 모델 차이를 숨긴다. 후보의 선형 수치 관찰과 production·비선형·동적 PASS를 분리해야 한다. 실제 metric과 변경 근거는 verification·변경안에 있다. 사용자는 이후2026-10-10 B로 체적 평균 energy 도입과 전체 재검증을 승인했다. 이전 실패와 후보의 일치를 보존하며 변경본의 내력·접선·절차·원본 검증 결과와 구분한다.

비교 도구의 --references 변경은 원본 보호 기준을 좁히지 않아야 한다. Report와 source/result의 hardlink·symlink alias도 보호하고, 잘못된 HDF rank는 failed precheck로 기록해야 한다. Source path는 writer와 같은 lexical 정규화를 사용하며 물리적 symlink 대상으로 identity를 바꾸지 않는다. 이 세 문제는 안전한 behavior RED와 최종124개 검사로 확인했다.

체적 평균 energy의 독립 oracle와 실패 해석

첫 weighted warped fixture는 weighted/unweighted 평균의 차이가 거의 없어 판별력이 부족했다. 형상과 비균일 변위를 수정한 oracle는 이전 pointwise 구현에서7/7 실패하고 새 식에서 통과했다. 독립 검증 fixture 자체의 실패를 production 수식 오류로 단정하지 않고, 실제 weighted 평균과 cross-GP Hessian을 판별하는지 먼저 확인한다.

중앙 차분 step sweep에서는 가장 작은 step에서 오차가 계속 줄어드는 경우도 있다. 최솟값이 반드시 중간 step에 있어야 한다는 가정은 정확한 접선을 실패시킬 수 있다. Analytical energy 미분과 차분 오차·절단항을 함께 확인한다. 이전 실패 로그와 수정 후 150개 검사 및 시간수렴 기록은 verification에 구분해 보존했다.

고정 두께1요소의 길이 refinement는 mean-bulk discretization의 continuum bias를 없애지 않는다. 두 축 지정 굽힘장 energy의 수렴과 고정 두께/폭 cantilever tip 추세를 서로 다른 증거로 기록한다. 두 결과를 평형해의 동일 공간차수 증거로 합치지 않는다.