Files
FESADev/docs/abaqus-tolerance/local-kernel-experiment.md

9.3 KiB

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 수식·종료 조건은 직전 실험본 그대로이며 이번에는 테스트와 문서만 수정했다.