133 lines
9.3 KiB
Markdown
133 lines
9.3 KiB
Markdown
# MITC4 local 근사 실험
|
|
|
|
2026-10-18 사용자 명시 지시에 따라 적용한 실험이다. Abaqus의 공식 tolerance나
|
|
외부 Newton 수렴 규칙을 구현한 변경이 아니다. 기준 revision은 `43867d0`이며
|
|
기존 문서와 reference 원본은 보존했다.
|
|
|
|
후속 사용자 지시로 테스트 오차 허용치도 `1e-3`으로 변경했다. 아래 1차 결과는 그 전의
|
|
엄격한 테스트 기준으로 실행한 이력이며, 최신 결과는 마지막 절을 따른다.
|
|
|
|
## 적용 범위
|
|
|
|
| 위치 | 변경 |
|
|
| --- | --- |
|
|
| nonlinear_mitc4_shell.cpp / PolarRotation | 고정 12회 → 고정 1회 |
|
|
| nonlinear_mitc4_inertia.cpp / ExpSkew, LeftJacobian | order 1..32 → 1..3; 항등항은 별도 유지 |
|
|
| 같은 파일 / CheckPhysicalMass | 대칭성·analytic null action·full Gram·Cholesky 복원 네 비교 1e-12 → 1e-3 |
|
|
|
|
회전 급수는 `E3=I+P+P²/2+P³/6`, Jacobian은
|
|
`J3=I+P/2+P²/6+P³/24`다. 자동미분은 이 다항식의 D1/D2/D3을 계산한다.
|
|
질량의 양의 Cholesky pivot, reciprocal condition `2^-32`, 초기 director 단위길이
|
|
검사는 그대로다. 외부 Newton·inner root·선형 solve·update·전역 평형과 시간수렴,
|
|
외부 reference 비교의 기존 허용치는 변경하지 않았다. Hex8도 변경하지 않았다.
|
|
공유 polar 변경은 비선형 정적 MITC4와 HHT에 모두 영향을 준다.
|
|
|
|
## 수치적 의미와 독립 검토
|
|
|
|
`F=RU`일 때 한 번의 polar 반복 결과는 `R(U+U^-1)/2`이므로 일반 변형에서
|
|
직교 회전행렬이 아니다. Drilling potential과 그 미분값이 바뀐다. 순수 강체회전은
|
|
별개이며 실제 관련 강체운동 검사는 통과했다.
|
|
|
|
Cubic exponential은 정확한 SO(3) 회전과 director/Jacobian 미분·null 항등식을
|
|
일반적으로 만족하지 않는다. D3 오차도 작은 회전에서 나타날 수 있다. 변경된 식의
|
|
AD/finite-difference 접선 일치가 원래 유한회전 물리의 정확도를 보장하지 않는다.
|
|
질량 검사 완화는 검사값을 통과시키는 범위를 10^9배 넓히며 행렬 오차를 교정하지 않는다.
|
|
독립 수치 검토에서도 요청과 production diff가 일치함을 확인했지만 정확도 통과로
|
|
판정하지 않았다.
|
|
|
|
## 1차 실행 증거 — 테스트 허용치 변경 전
|
|
|
|
실행 로그·XML·discovery는 ignored `.build/local-numerics-check/`에 있다.
|
|
MSVC x64 Debug 전체 build와 CMake/Ninja Debug 전체 build는 각각 exit 0이다.
|
|
동일 source의 unit 850·integration 72·reference 43, 총 965개가 두 경로에서 등록됐다.
|
|
CTest 표시 이름의 parameter pretty-print를 제외하고 실제 GoogleTest filter identity를
|
|
대조해 동일함을 확인했다. 등록과 실제 실행은 다르다.
|
|
|
|
| 실행 | 결과 | 로그 |
|
|
| --- | --- | --- |
|
|
| 변경 전 새 cubic 검사 | 1 FAIL: 기존 32차와 구분됨 | baseline-requested-test.log/.xml |
|
|
| 변경 전 관련 기존 검사 | 45 PASS, 0 FAIL | baseline-elements.log/.xml |
|
|
| 변경 후 같은 범위와 새 검사 | 46개 중 41 PASS, 5 FAIL | modified-elements.log/.xml |
|
|
| CTest 전체 선택·첫 실패 시 정지 | 43개 실행: 42 PASS, 1 FAIL; 나머지 922개 미실행, exit 8 | ctest.log/.xml |
|
|
|
|
실패한 기존 검사와 관측 예는 다음과 같다. 기존 assertion은 완화하거나 삭제하지 않았다.
|
|
|
|
| 검사 | 관측 |
|
|
| --- | --- |
|
|
| NonlinearMitc4Inertia.MatchesIndependentWarpedNodalMomentsEnergyAndPower | 질량 독립 oracle 상대오차 3.653585e-7, 기준 1e-12 |
|
|
| DynamicRotation.InverseIdentityAndCurrentAnalyticNullAtFiniteRotation | null 변환의 불필요 성분 9.165932e-4, 기준 1e-12 |
|
|
| DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep | D3 oracle 오차 예 1.250000e-6, 기준 1e-12 |
|
|
| DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors | D3 oracle 오차 예 1.250000e-6, 기준 1e-12 |
|
|
| NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian | constraint 차이 예 6.755203e-4, 기준 1e-11 |
|
|
|
|
새 cubic 동작 검사, 기존 접선 유한차분 검사와 강체운동 검사는 통과했다.
|
|
이 통과로 위 실패를 상쇄하지 않는다.
|
|
|
|
HHT 추가 선택 실행의 raw 기록은 `modified-hht.log`다. C08a 독립 volume-force/
|
|
power/momentum oracle 검사가 실패했으며 힘 상대오차 예는 9.105479e-7(기준 1e-12)다.
|
|
`HhtDynamicProcedure.LargeDirectStepStartsFromAcceptedGeometry`는 outer correction
|
|
100회 후 `HHT exhausted 100 corrections`로 실패했다. 이 추가 HHT 선택의 변경 전
|
|
동일 실행은 하지 않았으므로 새 회귀로 단정하는 비교 증거와 구분한다.
|
|
|
|
이 HHT 선택은 7개 중 6개 완료(4 PASS·2 FAIL) 후 물리 실패가 확인된 상태에서
|
|
마지막 `UniformTranslationHasNoShellStrainAndIsDeterministicAcrossPartitions` 실행을
|
|
agent가 중단했다(native exit -1). 마지막 1개는 미판정이다. 완결 XML은 없으며 raw 로그와
|
|
`hht-interruption.txt`를 남겼다. CTest도 전체 통과가 아니며 첫 실패 C08a에서 중단했다.
|
|
전체 Native unit/integration/reference 실행, 정식 외부 reference 비교는 수행하지 않았다.
|
|
물리 정확도 실패를 남긴 채 장시간 검증·공식 성능 측정으로 채택을 주장하지 않는다.
|
|
선택 범위·exit·source/executable hash 요약은 `verification-summary.json`에 있다.
|
|
|
|
Python suite는 현재 Python 환경의 `No module named pytest`로 실행되지 않았다.
|
|
자동 설치하지 않았다. 전체 검사와 정식 reference 비교·Release 성능·C08a/C08b
|
|
시간수렴 통과는 확보하지 않았다. 검사 실행시간 차이는 조건을 통제한 성능 측정이 아니므로
|
|
속도 향상률로 보고하지 않는다.
|
|
|
|
## 1차 판정과 다음 접근
|
|
|
|
요청한 수치 변경은 구현됐지만 기존 정확도 검증은 실패했다. 승인된 실험값과 기존
|
|
검증 기준을 그대로 남긴다. 정확도 손실을 수용한 solver 채택이나 성능 목표 달성을
|
|
뜻하지 않는다. 후속 원인 분리가 필요하면 polar, cubic, mass gate를 하나씩 바꾸는
|
|
동일 조건 비교로 각각의 영향을 측정한다. 실제 성능은 동일 local kernel을 사용한
|
|
strict/Abaqus 외부 정책 비교와 원래 kernel 대비 비교를 분리해 측정해야 한다.
|
|
|
|
## 후속 변경 — 테스트 오차 허용치 1e-3
|
|
|
|
사용자가 처음 제안한 `1e-4`를 최종 `1e-3`으로 대체했다. 다음 세 테스트 파일에
|
|
`kNumericalTolerance=1e-3`을 두고 기존 숫자 기준이 이보다 작은 직접 오차 비교 100개
|
|
(관성 50·접선 21·HHT 29)와 요소 유한차분 sweep의 오차 판정을 변경했다.
|
|
|
|
- tests/unit/elements/nonlinear_mitc4_inertia_test.cpp
|
|
- tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp
|
|
- tests/unit/analysis/hht_shell_physics_test.cpp
|
|
|
|
오차 계산식과 oracle·fixture·유한차분 간격은 그대로다. 절대오차/정규화오차 구분도
|
|
그대로이므로 모든 `1e-3`을 상대 0.1%로 해석할 수 없다. 일부 작은 회전질량의 절대
|
|
기대값 약 `6.67e-4`보다 허용치가 커서 해당 개별 비교는 회전질량 0도 허용한다.
|
|
정확한 equality, nonfinite/실패 검사, 누락항 negative control, 순수 산술 bookkeeping
|
|
두 검사, 시간수렴의 감소/차수 조건, 테스트 내부 해석 controller와 production 종료
|
|
조건은 유지했다. HHT 시간수렴의 finest 오차 assertion만 `1e-4`에서 `1e-3`으로 바뀌었다.
|
|
외부 Abaqus 결과 비교나 다른 요소의 테스트는 바꾸지 않았다.
|
|
|
|
최신 로그는 ignored `.build/test-tolerance-1e-3/`에 별도 보관했다. 두 Debug 전체 target
|
|
build는 exit 0이다. Native 및 CTest에서 같은 50개 identity를 선택해 모두 실행했으며
|
|
각각 **46 PASS·4 FAIL·0 SKIP**(exit 1/8)이다. 전체 965개 중 나머지 915개는 이번에
|
|
실행하지 않았다. 관련 요소 46개에 HHT 네 물리 검사를 추가한 선택이다.
|
|
|
|
| 남은 실패 | 새 기준에서도 실패한 이유/관측 예 |
|
|
| --- | --- |
|
|
| DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep | 독립 D3 oracle 절대오차 0.2276159 > 0.001 |
|
|
| DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors | 독립 D3 oracle 절대오차 0.2276159 > 0.001 |
|
|
| NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian | gradient 절대오차 0.00329135 > 0.001 |
|
|
| HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum | 정규화 hidden defect 예 0.00123371 > 0.001 및 실제 CompleteEquilibrium 실패 |
|
|
|
|
기존 실패 중 질량/운동량 독립 oracle와 inverse/null 검사는 완화된 기준에서 통과했다.
|
|
이는 계산값의 정확도가 개선됐다는 뜻이 아니다. D3·drilling·HHT 실패는 남겼으며
|
|
추가 완화나 production 변경으로 숨기지 않았다. 이전 큰 시간간격 수렴 실패와 중단된
|
|
HHT 실행은 이번에 재실행하지 않았고 이전 미판정 상태를 유지한다.
|
|
|
|
`native-selected.log/.xml`, `ctest-selected.log/.xml`, `changed-comparisons.json`과
|
|
`verification-summary.json`에 실행·변경 근거가 있다. 최초 CTest wrapper 호출의 shell
|
|
인용 오류(exit 255)는 `ctest-invocation-error.log`로 보존하고 CTest 직접 호출로 위
|
|
50개를 재실행했다. 독립 검토에서도 변경 범위와 보존 조건이 일치함을 확인했다.
|
|
Production 수식·종료 조건은 직전 실험본 그대로이며 이번에는 테스트와 문서만 수정했다.
|