86b740eebf
사용자 후속 결정에 따라 이번 실험을 변위 검증 통과와 실패10개 보류로 수용한다. 기존 전체 검사 FAIL/SKIP과 수치 기준을 보존한다. 전체101프레임 q/v/a/A/energy 차이와 관측 시간·outer 횟수를 추가한다. 공식 성능 조건·전체 비용·시간 정확도 미확보는 후속 과제로 남긴다. 문서만 변경: source450/reference34 hash 불변, 로컬 링크87개와 정적 검사 통과.
100 lines
7.9 KiB
Markdown
100 lines
7.9 KiB
Markdown
# 실패 검사 10개의 상대오차 전환 검토
|
|
|
|
검토일: 2026-10-19. 대상 제품 source는 변위 비교 당시 `626f7da`와 동일하다.
|
|
**검사 오차만 상대오차로 바꿔 통과를 확인할 수 있는 항목은 없다.**
|
|
D3 두 검사와 drilling 한 검사는 상대 기준에서도 실패하고, C08a pointwise 한 검사는
|
|
이미 정규화 오차에서 실패한다. 나머지 6개는 수치 비교 assertion에 도달하기 전에 실패한다.
|
|
테스트·production·reference 기준을 변경하지 않았다.
|
|
이후 사용자는 [변위 기준으로 이번 실험을 수용하고10개 실패를 보류](../tracking/decisions/0011-tolerance-experiment-acceptance.md)했다.
|
|
아래 상대오차 계산과 실패 사실은 보존한다.
|
|
|
|
## 검토한 상대오차 정의
|
|
|
|
사용자가 승인한 검사 tolerance `1e-3`을 상대오차에도 적용한다고 가정했다.
|
|
이는 **0.1%**이며, 외부 Abaqus 변위 비교의 family RMS 1%와 다른 기준이다.
|
|
|
|
```text
|
|
reference 상대오차 = ||actual - oracle|| / ||oracle||
|
|
대칭 정규화 오차 = ||actual - oracle|| / (||actual|| + ||oracle||)
|
|
검토 상한 = 0.001
|
|
```
|
|
|
|
벡터는 Euclidean norm, 텐서는 Frobenius norm을 사용했다. 분모 0은 별도 exact-zero
|
|
사례로 다루며 `max(1, norm)` 같은 floor로 오차를 줄이지 않았다.
|
|
Drilling gradient는 병진 좌표 미분과 회전 좌표 미분의 차원을 맞추기 위해 병진 열에
|
|
특성길이 2, 회전 열에 1을 곱했다. 이는 기존 같은 테스트의 Hessian 비교에 쓰는 scaling이다.
|
|
이 검토 정의는 기존 검사에 채택한 새 정책이 아니다.
|
|
|
|
## 10개 검사별 결론
|
|
|
|
| 기존 실패 identity | 현재 실패 위치 | 상대오차 전환 검토 |
|
|
| --- | --- | --- |
|
|
| `DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep` | 독립 D3 oracle와의 norm 차이 | 여전히 FAIL. 유한회전 상태의 전체 D3 텐서 상대오차 31.7922%. |
|
|
| `DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors` | 독립 고정밀 D3 anchor 3개 | 여전히 FAIL. 해당 방향의 상대오차 23.2126%, 100%, 31.2134%. |
|
|
| `NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian` | drilling gradient 성분 차이 | 여전히 FAIL. 전체 gradient 상대오차 평면 93.7766%, warped 93.8607%. |
|
|
| `HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum` | hidden defect와 `CompleteEquilibrium` | 이미 `abs(defect)/scale` 검사. 최대 0.123371% > 0.1%. 별도 내부 평형 실패도 남는다. |
|
|
| `HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit` | h=1/64, increment 1, strict Newton 100회 소진 | 비교값을 얻기 전 예외. 사후 상대오차 assertion 전환으로 해결되지 않는다. |
|
|
| `HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence` | h=1/16, increment 1, strict Newton 100회 소진 | 동일. 시간수렴의 오차·차수 판정에 도달하지 못한다. |
|
|
| `HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid` | h=1/256, increment 1, strict Newton 100회 소진 | 동일. |
|
|
| `HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants` | h=1/64, increment 1, strict Newton 100회 소진 | 동일. |
|
|
| `HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry` | 후보 field 통과 뒤 mass/null acceptance, 결과 없음 | 내부 mass 검사는 이미 norm으로 정규화된 `1e-12`. 테스트의 `HasValue()`를 상대오차로 바꿀 수 없다. |
|
|
| `HhtDynamicProcedure.UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions` | finite-rotation increment 2, triad/회전좌표 불일치, 결과 없음 | 내부 무차원 triad 성분 차이 `1e-12`에서 실패. 사후 테스트 비교의 전환 대상이 아니다. |
|
|
|
|
마지막 두 검사의 gate 자체를 바꾸는 것은 production acceptance 변경이다. 이번 검토는
|
|
그 변경의 통과 여부를 측정하지 않았으며, 저장된 실패 상태에 numerator가 없는 항목의
|
|
새 상대오차나 통과를 추정하지 않았다. C08 네 controller도 이미 길이·시간 scale로
|
|
정규화한 보정과 잔차에 `1e-10`을 사용한다. 이를 `1e-3`으로 바꾸는 것은 반복 종료
|
|
규칙의 변경이며, 절대오차 비교를 상대오차로 재표현하는 작업과 구분해야 한다.
|
|
|
|
## D3의 실제 분자와 분모
|
|
|
|
기존 두 D3 검사의 유한회전 상태 `phi=(0.2,-0.3,0.4)`에서 재계산했다.
|
|
`e1,e2,e3`는 단위 좌표 방향, `m=(1,2,-1)/sqrt(6)`이다.
|
|
|
|
| 방향 | 절대 norm 차이 | oracle norm | reference 상대오차 | 대칭 정규화 오차 |
|
|
| --- | ---: | ---: | ---: | ---: |
|
|
| e1,e1,e1 | 0.227615922140 | 0.980571766913 | 23.2126% | 11.4924% |
|
|
| e1,e2,e3 | 0.030126523605 | 0.030126523605 | 100% | 100% |
|
|
| m,m,m | 0.270116450986 | 0.865384981666 | 31.2134% | 15.1900% |
|
|
| 전체 D3 텐서, 좌표 27방향 | 0.575746413774 | 1.810965975332 | 31.7922% | 15.8315% |
|
|
|
|
e1,e2,e3 방향의 cubic D3는 0이지만 독립 oracle는 0이 아니므로 상대오차는 100%다.
|
|
전체 텐서 norm으로 묶어도 0.1%를 넘는다. 따라서 작은 성분 한 개를 나눈 결과만으로
|
|
실패한다고 결론 낸 것이 아니다. 위 anchor 절대오차는 보존 T7 XML의 실제 실패값과 일치했다.
|
|
|
|
기존 5상태×4×4×4방향의 중복 없는 320개 D3 비교에서도 절대 `1e-3` 실패는 64개,
|
|
순수 상대 `1e-3` 실패는 103개였다. 이는 기존 finite-difference 간격 7회의 반복 assertion을
|
|
제외한 진단 개수다. 작지만 0이 아닌 oracle 값에서 순수 상대오차는 오히려 더 엄격해진다.
|
|
기존 테스트의 모든 절대 검사를 일괄 상대 검사로 바꾸는 근거가 되지 않는다.
|
|
|
|
## Drilling의 실제 분자와 분모
|
|
|
|
기존 테스트와 같은 flat/warped fixture에서 4절점×24열 전체 gradient를 계산했다.
|
|
|
|
| fixture | scaled 차이 norm | scaled oracle norm | reference 상대오차 | 대칭 정규화 오차 |
|
|
| --- | ---: | ---: | ---: | ---: |
|
|
| flat | 0.030299801962 | 0.032310614847 | 93.7766% | 77.8392% |
|
|
| warped | 0.030708542429 | 0.032717144436 | 93.8607% | 78.0369% |
|
|
|
|
대표 성분은 actual=-0.000323196746, oracle=-0.003614547359,
|
|
차이=0.003291350613으로 성분 상대오차도 91.0584%다. 전체 norm과 대칭 분모로
|
|
계산해도 실패한다. 절대값의 단위·크기 때문에 실패한 것으로 해석할 수 없다.
|
|
|
|
## 근거와 실행 범위
|
|
|
|
- 기존 10개 실패는 [T7 unit XML](../../.build/tolerance-experiment/go-20261018/T7/fesa_unit_tests.xml)과 현재 테스트 본문에서 확인했다.
|
|
- 독립 작업 폴더의 진단 C++는 기존 두 요소 테스트 파일의 fixture/oracle를 include하고
|
|
실제 `EvaluateDynamicRotation` 및 `EvaluateInternalResidualAndTangent`를 호출했다.
|
|
기존 MSVC Debug solver/gtest library에 연결했으며 production library를 다시 빌드하거나 수정하지 않았다.
|
|
- 실행 filter는 `RelativeReview.*`의 진단 2개뿐이다. Exit 0은 진단값 수집의 성공이며
|
|
기존 실패 테스트 10개의 통과를 의미하지 않는다. 10개 전체·전체 회귀·reference 해석을 재실행하지 않았다.
|
|
- Source/build/test/script 450개와 solver/gtest library hash 불변을 확인했다.
|
|
- Raw/수치: [진단 로그](../../.build/relative-review/run-20261019-134221/diagnostic.raw.txt),
|
|
[계산값·검증 JSON](../../.build/relative-review/run-20261019-134221/numeric-review.json),
|
|
[진단 XML](../../.build/relative-review/run-20261019-134221/diagnostic.xml).
|
|
첫 standalone link의 main 누락 실패와 main 추가 후 build 성공도 같은 폴더에 보존했다.
|
|
|
|
상대오차는 단위·규모가 다른 값을 비교할 때 유용하지만 이번 세 미분 검사의 오차를
|
|
0.1% 이내로 만들지는 못한다. 상대 정책을 도입한다면 물리량별 차원·norm·near-zero
|
|
처리를 먼저 정하고, 근사식과 독립 oracle의 불일치 및 실행 실패를 별도로 해결해야 한다.
|